| | |
| | | The MIT License (MIT) |
| | | |
| | | Copyright (c) 2018 RuoYi |
| | | Copyright (c) 2019 RuoYi-Vue-Plus |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy of |
| | | this software and associated documentation files (the "Software"), to deal in |
| | |
| | | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
| | | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
| | | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
| | | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| | | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| | |
| | | ## å¹³å°ç®ä» |
| | | [](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) |
| | | [](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) |
| | | [](https://www.jetbrains.com/?from=RuoYi-Vue-Plus) |
| | | |
| | | åºäº RuoYi-Vue éæ Mybatis-Plus Lombok Hutool ç便æ·å¼åå·¥å
· éé
éåç¸å
³ä¸å¡ 便äºå¼å å®æä¸ RuoYi-Vue 忥 |
| | | * å端å¼åæ¡æ¶ VueãElement UI |
| | |
| | | |
| | | ### ä¾èµæ¹å¨ |
| | | |
| | | * ORMæ¡æ¶ ä½¿ç¨ Mybatis-Plus 3.4.2 ç®åCRUD (䏿¯æä¸»å表) |
| | | * ORMæ¡æ¶ ä½¿ç¨ Mybatis-Plus ç®åCRUD (䏿¯æä¸»å表) |
| | | * Beanç®å ä½¿ç¨ Lombok ç®å get set toString çç |
| | | * 容卿¹å¨ Tomcat æ¹ä¸º å¹¶åæ§è½æ´å¥½ç undertow |
| | | * åé¡µç§»é¤ pagehelper æ¹ä¸º Mybatis-Plus å页 |
| | |
| | | |
| | | ## å
³æ³¨ä½è
(æ«ç è¯·å¤æ³¨: "å 群") |
| | | |
| | |  |
| | |  |
| | | |
| | | ## æç®ä½è
|
| | | ä½è
为å
¼èå弿º,å¹³æ¶è¿éè¦å·¥ä½,妿叮å°äºæ¨å¯ä»¥è¯·ä½è
å个çé¥ |
| | |
| | | # åèç¹é
ç½® |
| | | singleServerConfig: |
| | | # 客æ·ç«¯åç§° |
| | | clientName: ${ruoyi-vue-plus.name} |
| | | clientName: ${ruoyi.name} |
| | | # æå°ç©ºé²è¿æ¥æ° |
| | | connectionMinimumIdleSize: 32 |
| | | # è¿æ¥æ± å¤§å° |
| | |
| | | # åèç¹é
ç½® |
| | | singleServerConfig: |
| | | # 客æ·ç«¯åç§° |
| | | clientName: ${ruoyi-vue-plus.name} |
| | | clientName: ${ruoyi.name} |
| | | # æå°ç©ºé²è¿æ¥æ° |
| | | connectionMinimumIdleSize: 32 |
| | | # è¿æ¥æ± å¤§å° |
| | |
| | | |
| | | /** |
| | | * webå±éç¨æ°æ®å¤ç |
| | | * |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | public class BaseController |
| | |
| | | |
| | | /** |
| | | * ååºè¿åç»æ |
| | | * |
| | | * |
| | | * @param rows å½±åè¡æ° |
| | | * @return æä½ç»æ |
| | | */ |
| | |
| | | * @param collection å¤ä¸ªå¯¹è±¡ |
| | | * @return |
| | | */ |
| | | public long deleteObject(final Collection collection) { |
| | | return redissonClient.getKeys().delete(Arrays.toString(collection.toArray())); |
| | | public void deleteObject(final Collection collection) { |
| | | RBatch batch = redissonClient.createBatch(); |
| | | collection.forEach(t->{ |
| | | batch.getBucket(t.toString()).deleteAsync(); |
| | | }); |
| | | batch.execute(); |
| | | } |
| | | |
| | | /** |
| | |
| | | }
|
| | | finally
|
| | | {
|
| | | IOUtils.closeQuietly(in);
|
| | | IOUtils.closeQuietly(baos);
|
| | | }
|
| | | }
|
| | |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.core.domain.model.LoginUser; |
| | | import com.ruoyi.common.utils.ServletUtils; |
| | | import com.ruoyi.common.utils.reflect.ReflectUtils; |
| | | import com.ruoyi.common.utils.spring.SpringUtils; |
| | | import com.ruoyi.framework.web.service.TokenService; |
| | | import org.aspectj.lang.JoinPoint; |
| | |
| | | } |
| | | } |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | private static void putDataScope(JoinPoint joinPoint, String sql) { |
| | | Object params = joinPoint.getArgs()[0]; |
| | | if (Validator.isNotNull(params)) { |
| | |
| | | BaseEntity baseEntity = (BaseEntity) params; |
| | | baseEntity.getParams().put(DATA_SCOPE, sql); |
| | | } else { |
| | | try { |
| | | Method getParams = params.getClass().getDeclaredMethod("getParams"); |
| | | Map<String, Object> invoke = (Map<String, Object>) getParams.invoke(params); |
| | | invoke.put(DATA_SCOPE, sql); |
| | | } catch (Exception e) { |
| | | // æ¹æ³æªæ¾å° ä¸å¤ç |
| | | } |
| | | Map<String, Object> invoke = ReflectUtils.invokeGetter(params, "params"); |
| | | invoke.put(DATA_SCOPE, sql); |
| | | } |
| | | } |
| | | } |
| | |
| | | #end
|
| | | </el-form>
|
| | | <div slot="footer" class="dialog-footer">
|
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button>
|
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button>
|
| | | <el-button @click="cancel">å æ¶</el-button>
|
| | | </div>
|
| | | </el-dialog>
|
| | |
| | | },
|
| | | data() {
|
| | | return {
|
| | | //æé®loading
|
| | | buttonLoading: false,
|
| | | // é®ç½©å±
|
| | | loading: true,
|
| | | // æ¾ç¤ºæç´¢æ¡ä»¶
|
| | |
| | | },
|
| | | /** ä¿®æ¹æé®æä½ */
|
| | | handleUpdate(row) {
|
| | | this.loading = true;
|
| | | this.reset();
|
| | | this.getTreeselect();
|
| | | if (row != null) {
|
| | | this.form.${treeParentCode} = row.${treeCode};
|
| | | }
|
| | | get${BusinessName}(row.${pkColumn.javaField}).then(response => {
|
| | | this.loading = false;
|
| | | this.form = response.data;
|
| | | #foreach ($column in $columns)
|
| | | #if($column.htmlType == "checkbox")
|
| | |
| | | submitForm() {
|
| | | this.#[[$]]#refs["form"].validate(valid => {
|
| | | if (valid) {
|
| | | this.buttonLoading = true;
|
| | | #foreach ($column in $columns)
|
| | | #if($column.htmlType == "checkbox")
|
| | | this.form.$column.javaField = this.form.${column.javaField}.join(",");
|
| | |
| | | #end
|
| | | if (this.form.${pkColumn.javaField} != null) {
|
| | | update${BusinessName}(this.form).then(response => {
|
| | | this.buttonLoading = false;
|
| | | this.msgSuccess("ä¿®æ¹æå");
|
| | | this.open = false;
|
| | | this.getList();
|
| | | });
|
| | | } else {
|
| | | add${BusinessName}(this.form).then(response => {
|
| | | this.buttonLoading = false;
|
| | | this.msgSuccess("æ°å¢æå");
|
| | | this.open = false;
|
| | | this.getList();
|
| | |
| | | confirmButtonText: "ç¡®å®",
|
| | | cancelButtonText: "åæ¶",
|
| | | type: "warning"
|
| | | }).then(function() {
|
| | | }).then(() => {
|
| | | this.loading = true;
|
| | | return del${BusinessName}(row.${pkColumn.javaField});
|
| | | }).then(() => {
|
| | | this.loading = false;
|
| | | this.getList();
|
| | | this.msgSuccess("å 餿å");
|
| | | })
|
| | |
| | | #end |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | //æé®loading |
| | | buttonLoading: false, |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // 导åºé®ç½©å± |
| | |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | | this.loading = true; |
| | | this.reset(); |
| | | const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids |
| | | get${BusinessName}(${pkColumn.javaField}).then(response => { |
| | | this.loading = false; |
| | | this.form = response.data; |
| | | #foreach ($column in $columns) |
| | | #if($column.htmlType == "checkbox") |
| | |
| | | submitForm() { |
| | | this.#[[$]]#refs["form"].validate(valid => { |
| | | if (valid) { |
| | | this.buttonLoading = true; |
| | | #foreach ($column in $columns) |
| | | #if($column.htmlType == "checkbox") |
| | | this.form.$column.javaField = this.form.${column.javaField}.join(","); |
| | |
| | | #end |
| | | if (this.form.${pkColumn.javaField} != null) { |
| | | update${BusinessName}(this.form).then(response => { |
| | | this.buttonLoading = false; |
| | | this.msgSuccess("ä¿®æ¹æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | add${BusinessName}(this.form).then(response => { |
| | | this.buttonLoading = false; |
| | | this.msgSuccess("æ°å¢æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(function() { |
| | | }).then(() => { |
| | | this.loading = true; |
| | | return del${BusinessName}(${pkColumn.javaField}s); |
| | | }).then(() => { |
| | | this.loading = false; |
| | | this.getList(); |
| | | this.msgSuccess("å 餿å"); |
| | | }) |
| | |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | //æé®loading |
| | | buttonLoading: false, |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // 导åºé®ç½©å± |
| | |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | | this.loading = true; |
| | | this.reset(); |
| | | const id = row.id || this.ids |
| | | getDemo(id).then(response => { |
| | | this.loading = false; |
| | | this.form = response.data; |
| | | this.open = true; |
| | | this.title = "ä¿®æ¹æµè¯å表"; |
| | |
| | | submitForm() { |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | this.buttonLoading = true; |
| | | if (this.form.id != null) { |
| | | updateDemo(this.form).then(response => { |
| | | this.buttonLoading = false; |
| | | this.msgSuccess("ä¿®æ¹æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | addDemo(this.form).then(response => { |
| | | this.buttonLoading = false; |
| | | this.msgSuccess("æ°å¢æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(function() { |
| | | }).then(() => { |
| | | this.loading = true; |
| | | return delDemo(ids); |
| | | }).then(() => { |
| | | this.loading = false; |
| | | this.getList(); |
| | | this.msgSuccess("å 餿å"); |
| | | }) |
| | |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button :loading="buttonLoading" type="primary" @click="submitForm">ç¡® å®</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | //æé®loading |
| | | buttonLoading: false, |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | | this.loading = true; |
| | | this.reset(); |
| | | this.getTreeselect(); |
| | | if (row != null) { |
| | | this.form.parentId = row.id; |
| | | } |
| | | getTree(row.id).then(response => { |
| | | this.loading = false; |
| | | this.form = response.data; |
| | | this.open = true; |
| | | this.title = "ä¿®æ¹æµè¯æ 表"; |
| | |
| | | submitForm() { |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | this.buttonLoading = true; |
| | | if (this.form.id != null) { |
| | | updateTree(this.form).then(response => { |
| | | this.buttonLoading = false; |
| | | this.msgSuccess("ä¿®æ¹æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | addTree(this.form).then(response => { |
| | | this.buttonLoading = false; |
| | | this.msgSuccess("æ°å¢æå"); |
| | | this.open = false; |
| | | this.getList(); |
| | |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning" |
| | | }).then(function() { |
| | | }).then(() => { |
| | | this.loading = true; |
| | | return delTree(row.id); |
| | | }).then(() => { |
| | | this.loading = false; |
| | | this.getList(); |
| | | this.msgSuccess("å 餿å"); |
| | | }) |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="form.menuType != 'M'" label="æéæ è¯"> |
| | | <el-input v-model="form.perms" placeholder="请æéæ è¯" maxlength="50" /> |
| | | <el-input v-model="form.perms" placeholder="请æéæ è¯" maxlength="100" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | |
|
| | | <script>
|
| | | import { isArray } from 'util'
|
| | | import draggable from 'vuedraggable'
|
| | | import TreeNodeDialog from './TreeNodeDialog'
|
| | | import { isNumberStr } from '@/utils/index'
|
| | | import IconsDialog from './IconsDialog'
|
| | |
| | |
|
| | | export default {
|
| | | components: {
|
| | | draggable,
|
| | | TreeNodeDialog,
|
| | | IconsDialog
|
| | | },
|
| | |
| | | create_by varchar(64) NULL DEFAULT NULL COMMENT 'å建人', |
| | | update_time datetime(0) NULL DEFAULT NULL COMMENT 'æ´æ°æ¶é´', |
| | | update_by varchar(64) NULL DEFAULT NULL COMMENT 'æ´æ°äºº', |
| | | del_flag int(0) NULL DEFAULT NULL COMMENT 'å 餿 å¿', |
| | | del_flag int(0) NULL DEFAULT 0 COMMENT 'å 餿 å¿', |
| | | PRIMARY KEY (id) USING BTREE |
| | | ) ENGINE = InnoDB COMMENT = 'æµè¯å表'; |
| | | |
| | |
| | | create_by varchar(64) NULL DEFAULT NULL COMMENT 'å建人', |
| | | update_time datetime(0) NULL DEFAULT NULL COMMENT 'æ´æ°æ¶é´', |
| | | update_by varchar(64) NULL DEFAULT NULL COMMENT 'æ´æ°äºº', |
| | | del_flag int(0) NULL DEFAULT NULL COMMENT 'å 餿 å¿', |
| | | del_flag int(0) NULL DEFAULT 0 COMMENT 'å 餿 å¿', |
| | | PRIMARY KEY (id) USING BTREE |
| | | ) ENGINE = InnoDB COMMENT = 'æµè¯æ 表'; |
| | | |