se-ui/.env.development | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/layout/components/Navbar.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/permission.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/router/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/utils/request.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/views/login.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/views/register.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/views/system/menu/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/views/system/permissions/authUser.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/views/system/permissions/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/src/views/system/permissions/selectUser.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
se-ui/vue.config.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
se-ui/.env.development
@@ -3,7 +3,7 @@ # å¼åç¯å¢é ç½® ENV = 'development' port = 8080 # 管çç³»ç»/å¼åç¯å¢ VUE_APP_BASE_API = '/prod-api' @@ -11,4 +11,4 @@ VUE_CLI_BABEL_TRANSPILE_MODULES = true #项ç®åè·¯å¾ VUE_APP_ITEM_PATH = '/sys' VUE_APP_ITEM_PATH = '' se-ui/src/layout/components/Navbar.vue
@@ -103,9 +103,9 @@ }) .then(() => { this.$store.dispatch("LogOut").then(() => { if ((process.env.ENV = "development")) { if ((process.env.ENV == "development")) { window.location.href = "http://localhost:8080/login"; } else if ((process.env.ENV = "production")) { } else if ((process.env.ENV == "production")) { window.location.href = window.location.origin + "/sso/login"; } }); se-ui/src/permission.js
@@ -16,9 +16,9 @@ to.meta.title && store.dispatch('settings/setTitle', to.meta.title) /* has token*/ if (to.path === '/login') { if (process.env.ENV = 'development') { if (process.env.ENV == 'development') { window.location.href = 'http://localhost:8080/login' } else if (process.env.ENV = 'production') { } else if (process.env.ENV == 'production') { window.location.href = window.location.origin + '/sso/login' } // next({ path: '/' }) @@ -39,9 +39,9 @@ }).catch(err => { store.dispatch('LogOut').then(() => { Message.error(err) if (process.env.ENV = 'development') { if (process.env.ENV == 'development') { window.location.href = 'http://localhost:8080/login' } else if (process.env.ENV = 'production') { } else if (process.env.ENV == 'production') { window.location.href = window.location.origin + '/sso/login' } // next({ path: '/' }) @@ -57,9 +57,9 @@ // å¨å ç»å½ç½ååï¼ç´æ¥è¿å ¥ next() } else { if (process.env.ENV = 'development') { if (process.env.ENV == 'development') { window.location.href = 'http://localhost:8080/login' } else if (process.env.ENV = 'production') { } else if (process.env.ENV == 'production') { window.location.href = window.location.origin + '/sso/login' } NProgress.done() se-ui/src/router/index.js
@@ -41,11 +41,11 @@ } ] }, // { // path: '/login', // component: () => import('@/views/login'), // hidden: true // }, { path: '/login', component: () => import('@/views/login'), hidden: true }, { path: '/register', component: () => import('@/views/register'), @@ -64,7 +64,8 @@ { path: '', component: Layout, redirect: 'system/user', redirect: '/login', // redirect: 'system/user', // children: [ // { // path: 'index', se-ui/src/utils/request.js
@@ -88,9 +88,9 @@ MessageBox.confirm('ç»å½ç¶æå·²è¿æï¼æ¨å¯ä»¥ç»§ç»çå¨è¯¥é¡µé¢ï¼æè éæ°ç»å½', 'ç³»ç»æç¤º', { confirmButtonText: 'éæ°ç»å½', cancelButtonText: 'åæ¶', type: 'warning' }).then(() => { isRelogin.show = false; store.dispatch('LogOut').then(() => { if ((process.env.ENV = "development")) { if ((process.env.ENV == "development")) { window.location.href = "http://localhost:8080/login"; } else if ((process.env.ENV = "production")) { } else if ((process.env.ENV == "production")) { window.location.href = window.location.origin + "/sso/login"; } }) se-ui/src/views/login.vue
@@ -89,7 +89,7 @@ } }, created() { this.getCode(); // this.getCode(); this.getCookie(); }, methods: { se-ui/src/views/register.vue
@@ -109,17 +109,17 @@ }; }, created() { this.getCode(); // this.getCode(); }, methods: { getCode() { getCodeImg().then(res => { this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled; if (this.captchaEnabled) { this.codeUrl = "data:image/gif;base64," + res.img; this.registerForm.uuid = res.uuid; } }); // getCodeImg().then(res => { // this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled; // if (this.captchaEnabled) { // this.codeUrl = "data:image/gif;base64," + res.img; // this.registerForm.uuid = res.uuid; // } // }); }, handleRegister() { this.$refs.registerForm.validate(valid => { @@ -136,7 +136,7 @@ }).catch(() => { this.loading = false; if (this.captchaEnabled) { this.getCode(); // this.getCode(); } }) } se-ui/src/views/system/menu/index.vue
@@ -37,13 +37,7 @@ >æ°å¢</el-button> </el-col> <el-col :span="1.5"> <el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll" >å±å¼/æå </el-button> <el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandAll">å±å¼/æå </el-button> </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row> @@ -67,7 +61,7 @@ <el-table-column prop="component" label="ç»ä»¶è·¯å¾" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="status" label="ç¶æ" width="80"> <template slot-scope="scope"> <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/> <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status" /> </template> </el-table-column> <el-table-column label="å建æ¶é´" align="center" prop="createTime"> @@ -117,13 +111,18 @@ /> </el-form-item> </el-col> <el-col :span="24"> <el-col :span="12"> <el-form-item label="èåç±»å" prop="menuType"> <el-radio-group v-model="form.menuType"> <el-radio label="M">ç®å½</el-radio> <el-radio label="C">èå</el-radio> <el-radio label="F">æé®</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="èåæ è¯" prop="mark"> <el-input v-model="form.mark" placeholder="请è¾å ¥èåæ è¯" /> </el-form-item> </el-col> <el-col :span="24" v-if="form.menuType != 'F'"> @@ -161,9 +160,8 @@ <el-form-item prop="isFrame"> <span slot="label"> <el-tooltip content="éæ©æ¯å¤é¾åè·¯ç±å°åéè¦ä»¥`http(s)://`å¼å¤´" placement="top"> <i class="el-icon-question"></i> </el-tooltip> æ¯å¦å¤é¾ <i class="el-icon-question"></i> </el-tooltip>æ¯å¦å¤é¾ </span> <el-radio-group v-model="form.isFrame"> <el-radio label="0">æ¯</el-radio> @@ -175,9 +173,8 @@ <el-form-item prop="path"> <span slot="label"> <el-tooltip content="访é®çè·¯ç±å°åï¼å¦ï¼`user`ï¼å¦å¤ç½å°åéå é¾è®¿é®å以`http(s)://`å¼å¤´" placement="top"> <i class="el-icon-question"></i> </el-tooltip> è·¯ç±å°å <i class="el-icon-question"></i> </el-tooltip>è·¯ç±å°å </span> <el-input v-model="form.path" placeholder="请è¾å ¥è·¯ç±å°å" /> </el-form-item> @@ -186,9 +183,8 @@ <el-form-item prop="component"> <span slot="label"> <el-tooltip content="访é®çç»ä»¶è·¯å¾ï¼å¦ï¼`system/user/index`ï¼é»è®¤å¨`views`ç®å½ä¸" placement="top"> <i class="el-icon-question"></i> </el-tooltip> ç»ä»¶è·¯å¾ <i class="el-icon-question"></i> </el-tooltip>ç»ä»¶è·¯å¾ </span> <el-input v-model="form.component" placeholder="请è¾å ¥ç»ä»¶è·¯å¾" /> </el-form-item> @@ -197,10 +193,12 @@ <el-form-item prop="perms"> <el-input v-model="form.perms" placeholder="请è¾å ¥æéæ è¯" maxlength="100" /> <span slot="label"> <el-tooltip content="æ§å¶å¨ä¸å®ä¹çæéå符ï¼å¦ï¼@PreAuthorize(`@ss.hasPermi('system:user:list')`)" placement="top"> <i class="el-icon-question"></i> </el-tooltip> æéå符 <el-tooltip content="æ§å¶å¨ä¸å®ä¹çæéå符ï¼å¦ï¼@PreAuthorize(`@ss.hasPermi('system:user:list')`)" placement="top" > <i class="el-icon-question"></i> </el-tooltip>æéå符 </span> </el-form-item> </el-col> @@ -208,10 +206,9 @@ <el-form-item prop="query"> <el-input v-model="form.query" placeholder="请è¾å ¥è·¯ç±åæ°" maxlength="255" /> <span slot="label"> <el-tooltip content='访é®è·¯ç±çé»è®¤ä¼ éåæ°ï¼å¦ï¼`{"id": 1, "name": "ry"}`' placement="top"> <i class="el-icon-question"></i> </el-tooltip> è·¯ç±åæ° <el-tooltip content="访é®è·¯ç±çé»è®¤ä¼ éåæ°ï¼å¦ï¼`{id: 1, name: ry}`" placement="top"> <i class="el-icon-question"></i> </el-tooltip>è·¯ç±åæ° </span> </el-form-item> </el-col> @@ -219,9 +216,8 @@ <el-form-item prop="isCache"> <span slot="label"> <el-tooltip content="éæ©æ¯åä¼è¢«`keep-alive`ç¼åï¼éè¦å¹é ç»ä»¶ç`name`åå°åä¿æä¸è´" placement="top"> <i class="el-icon-question"></i> </el-tooltip> æ¯å¦ç¼å <i class="el-icon-question"></i> </el-tooltip>æ¯å¦ç¼å </span> <el-radio-group v-model="form.isCache"> <el-radio label="0">ç¼å</el-radio> @@ -233,9 +229,8 @@ <el-form-item prop="visible"> <span slot="label"> <el-tooltip content="éæ©éèåè·¯ç±å°ä¸ä¼åºç°å¨ä¾§è¾¹æ ï¼ä½ä»ç¶å¯ä»¥è®¿é®" placement="top"> <i class="el-icon-question"></i> </el-tooltip> æ¾ç¤ºç¶æ <i class="el-icon-question"></i> </el-tooltip>æ¾ç¤ºç¶æ </span> <el-radio-group v-model="form.visible"> <el-radio @@ -250,9 +245,8 @@ <el-form-item prop="status"> <span slot="label"> <el-tooltip content="éæ©åç¨åè·¯ç±å°ä¸ä¼åºç°å¨ä¾§è¾¹æ ï¼ä¹ä¸è½è¢«è®¿é®" placement="top"> <i class="el-icon-question"></i> </el-tooltip> èåç¶æ <i class="el-icon-question"></i> </el-tooltip>èåç¶æ </span> <el-radio-group v-model="form.status"> <el-radio @@ -274,14 +268,20 @@ </template> <script> import { listMenu, getMenu, delMenu, addMenu, updateMenu } from "@/api/system/menu"; import { listMenu, getMenu, delMenu, addMenu, updateMenu } from "@/api/system/menu"; import Treeselect from "@riophae/vue-treeselect"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import IconSelect from "@/components/IconSelect"; export default { name: "Menu", dicts: ['sys_show_hide', 'sys_normal_disable'], dicts: ["sys_show_hide", "sys_normal_disable"], components: { Treeselect, IconSelect }, data() { return { @@ -316,9 +316,7 @@ orderNum: [ { required: true, message: "èå顺åºä¸è½ä¸ºç©º", trigger: "blur" } ], path: [ { required: true, message: "è·¯ç±å°åä¸è½ä¸ºç©º", trigger: "blur" } ] path: [{ required: true, message: "è·¯ç±å°åä¸è½ä¸ºç©º", trigger: "blur" }] } }; }, @@ -353,7 +351,7 @@ getTreeselect() { listMenu().then(response => { this.menuOptions = []; const menu = { menuId: 0, menuName: '主类ç®', children: [] }; const menu = { menuId: 0, menuName: "主类ç®", children: [] }; menu.children = this.handleTree(response.data, "menuId"); this.menuOptions.push(menu); }); @@ -371,6 +369,7 @@ menuName: undefined, icon: undefined, menuType: "M", mark: "", orderNum: undefined, isFrame: "1", isCache: "0", @@ -394,6 +393,7 @@ this.getTreeselect(); if (row != null && row.menuId) { this.form.parentId = row.menuId; this.form.mark = row.mark; } else { this.form.parentId = 0; } @@ -440,12 +440,16 @@ }, /** å é¤æé®æä½ */ handleDelete(row) { this.$modal.confirm('æ¯å¦ç¡®è®¤å é¤å称为"' + row.menuName + '"çæ°æ®é¡¹ï¼').then(function() { return delMenu(row.menuId); }).then(() => { this.getList(); this.$modal.msgSuccess("å 餿å"); }).catch(() => {}); this.$modal .confirm('æ¯å¦ç¡®è®¤å é¤å称为"' + row.menuName + '"çæ°æ®é¡¹ï¼') .then(function() { return delMenu(row.menuId); }) .then(() => { this.getList(); this.$modal.msgSuccess("å 餿å"); }) .catch(() => {}); } } }; se-ui/src/views/system/permissions/authUser.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,199 @@ <template> <div class="app-container"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"> <el-form-item label="ç¨æ·åç§°" prop="userName"> <el-input v-model="queryParams.userName" placeholder="请è¾å ¥ç¨æ·åç§°" clearable style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="ææºå·ç " prop="phonenumber"> <el-input v-model="queryParams.phonenumber" placeholder="请è¾å ¥ææºå·ç " clearable style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æç´¢</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="openSelectUser" v-hasPermi="['system:role:add']" >æ·»å ç¨æ·</el-button> </el-col> <el-col :span="1.5"> <el-button type="danger" plain icon="el-icon-circle-close" size="mini" :disabled="multiple" @click="cancelAuthUserAll" v-hasPermi="['system:role:remove']" >æ¹éåæ¶ææ</el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="el-icon-close" size="mini" @click="handleClose" >å ³é</el-button> </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="ç¨æ·åç§°" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="ç¨æ·æµç§°" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column label="é®ç®±" prop="email" :show-overflow-tooltip="true" /> <el-table-column label="ææº" prop="phonenumber" :show-overflow-tooltip="true" /> <el-table-column label="ç¶æ" align="center" prop="status"> <template slot-scope="scope"> <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/> </template> </el-table-column> <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.createTime) }}</span> </template> </el-table-column> <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-circle-close" @click="cancelAuthUser(scope.row)" v-hasPermi="['system:role:remove']" >åæ¶ææ</el-button> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> <select-user ref="select" :roleId="queryParams.roleId" @ok="handleQuery" /> </div> </template> <script> import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role"; import selectUser from "./selectUser"; export default { name: "AuthUser", dicts: ['sys_normal_disable'], components: { selectUser }, data() { return { // é®ç½©å± loading: true, // éä¸ç¨æ·ç» userIds: [], // éå¤ä¸ªç¦ç¨ multiple: true, // æ¾ç¤ºæç´¢æ¡ä»¶ showSearch: true, // æ»æ¡æ° total: 0, // ç¨æ·è¡¨æ ¼æ°æ® userList: [], // æ¥è¯¢åæ° queryParams: { pageNum: 1, pageSize: 10, roleId: undefined, userName: undefined, phonenumber: undefined } }; }, created() { const roleId = this.$route.params && this.$route.params.roleId; if (roleId) { this.queryParams.roleId = roleId; this.getList(); } }, methods: { /** æ¥è¯¢ææç¨æ·å表 */ getList() { this.loading = true; allocatedUserList(this.queryParams).then(response => { this.userList = response.rows; this.total = response.total; this.loading = false; } ); }, // è¿åæé® handleClose() { const obj = { path: "/system/role" }; this.$tab.closeOpenPage(obj); }, /** æç´¢æé®æä½ */ handleQuery() { this.queryParams.pageNum = 1; this.getList(); }, /** éç½®æé®æä½ */ resetQuery() { this.resetForm("queryForm"); this.handleQuery(); }, // å¤éæ¡é䏿°æ® handleSelectionChange(selection) { this.userIds = selection.map(item => item.userId) this.multiple = !selection.length }, /** æå¼ææç¨æ·è¡¨å¼¹çª */ openSelectUser() { this.$refs.select.show(); }, /** åæ¶æææé®æä½ */ cancelAuthUser(row) { const roleId = this.queryParams.roleId; this.$modal.confirm('确认è¦åæ¶è¯¥ç¨æ·"' + row.userName + '"è§è²åï¼').then(function() { return authUserCancel({ userId: row.userId, roleId: roleId }); }).then(() => { this.getList(); this.$modal.msgSuccess("åæ¶æææå"); }).catch(() => {}); }, /** æ¹éåæ¶æææé®æä½ */ cancelAuthUserAll(row) { const roleId = this.queryParams.roleId; const userIds = this.userIds.join(","); this.$modal.confirm('æ¯å¦åæ¶éä¸ç¨æ·æææ°æ®é¡¹ï¼').then(function() { return authUserCancelAll({ roleId: roleId, userIds: userIds }); }).then(() => { this.getList(); this.$modal.msgSuccess("åæ¶æææå"); }).catch(() => {}); } } }; </script> se-ui/src/views/system/permissions/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,598 @@ <template> <div class="app-container"> <el-row :gutter="20"> <el-col :span="5" :xs="24"> <el-card class="box-card"> <div slot="header" class="clearfix"> <span>è§è²å表</span> </div> </el-card> <el-table v-loading="loading" width="100%" border :data="roleList" @row-click="handleUpdate" highlight-current-row :show-header="true" :header-cell-style="{'text-align':'center'}" > <el-table-column label="è§è²åç§°" prop="roleName" align="center" :show-overflow-tooltip="true" /> </el-table> </el-col> <el-col :span="8" :xs="24"> <el-card class="box-card2"> <div slot="header" class="clearfix"> <span>æé设置</span> </div> <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form-item label="è§è²åç§°" prop="roleName"> <el-input v-model="form.roleName" placeholder="请è¾å ¥è§è²åç§°" disabled /> </el-form-item> <el-form-item label="èåæé"> <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')" >å±å¼/æå </el-checkbox> <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')" >å ¨é/å ¨ä¸é</el-checkbox> <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')" >ç¶åèå¨</el-checkbox> </el-form-item> <el-form-item size="large"> <el-tree style="max-height:500px;overflow:auto;" default-expand-all class="tree-border" :data="menuOptions" show-checkbox ref="menu" node-key="id" :check-strictly="!form.menuCheckStrictly" empty-text="å è½½ä¸ï¼è¯·ç¨å" :props="defaultProps" ></el-tree> </el-form-item> <el-form-item size="large"> <el-button type="primary" @click="submitForm">ç¡® å®</el-button> <el-button @click="cancel">å æ¶</el-button> </el-form-item> </el-form> </el-card> </el-col> </el-row> <!-- <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form-item label="è§è²åç§°" prop="roleName"> <el-input v-model="form.roleName" placeholder="请è¾å ¥è§è²åç§°" /> </el-form-item> <el-form-item prop="roleKey"> <span slot="label"> <el-tooltip content="æ§å¶å¨ä¸å®ä¹çæéå符ï¼å¦ï¼@PreAuthorize(`@ss.hasRole('admin')`)" placement="top"> <i class="el-icon-question"></i> </el-tooltip> æéå符 </span> <el-input v-model="form.roleKey" placeholder="请è¾å ¥æéå符" /> </el-form-item> <el-form-item label="è§è²é¡ºåº" prop="roleSort"> <el-input-number v-model="form.roleSort" controls-position="right" :min="0" /> </el-form-item> <el-form-item label="ç¶æ"> <el-radio-group v-model="form.status"> <el-radio v-for="dict in dict.type.sys_normal_disable" :key="dict.value" :label="dict.value" >{{dict.label}}</el-radio> </el-radio-group> </el-form-item> <el-form-item label="èåæé"> <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">å±å¼/æå </el-checkbox> <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">å ¨é/å ¨ä¸é</el-checkbox> <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">ç¶åèå¨</el-checkbox> <el-tree class="tree-border" :data="menuOptions" show-checkbox ref="menu" node-key="id" :check-strictly="!form.menuCheckStrictly" empty-text="å è½½ä¸ï¼è¯·ç¨å" :props="defaultProps" ></el-tree> </el-form-item> <el-form-item label="夿³¨"> <el-input v-model="form.remark" type="textarea" placeholder="请è¾å ¥å 容"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">ç¡® å®</el-button> <el-button @click="cancel">å æ¶</el-button> </div> </el-dialog>--> <!-- åé è§è²æ°æ®æéå¯¹è¯æ¡ --> <!-- <el-dialog :title="title" :visible.sync="openDataScope" width="500px" append-to-body> <el-form :model="form" label-width="80px"> <el-form-item label="è§è²åç§°"> <el-input v-model="form.roleName" :disabled="true" /> </el-form-item> <el-form-item label="æéå符"> <el-input v-model="form.roleKey" :disabled="true" /> </el-form-item> <el-form-item label="æéèå´"> <el-select v-model="form.dataScope" @change="dataScopeSelectChange"> <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </el-form-item> <el-form-item label="æ°æ®æé" v-show="form.dataScope == 2"> <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">å±å¼/æå </el-checkbox> <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')" >å ¨é/å ¨ä¸é</el-checkbox> <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')" >ç¶åèå¨</el-checkbox> <el-tree class="tree-border" :data="deptOptions" show-checkbox default-expand-all ref="dept" node-key="id" :check-strictly="!form.deptCheckStrictly" empty-text="å è½½ä¸ï¼è¯·ç¨å" :props="defaultProps" ></el-tree> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitDataScope">ç¡® å®</el-button> <el-button @click="cancelDataScope">å æ¶</el-button> </div> </el-dialog>--> </div> </template> <style scoped> .demo-drawer__footer { width: 100%; position: absolute; bottom: 0; left: 0; border-top: 1px solid #e8e8e8; padding: 10px 16px; text-align: right; background-color: bfa; } </style> <script> import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect } from "@/api/system/role"; import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu"; export default { name: "Role", dicts: ["sys_normal_disable"], data() { return { // é®ç½©å± loading: true, // é䏿°ç» ids: [], // éå个ç¦ç¨ single: true, // éå¤ä¸ªç¦ç¨ multiple: true, // æ¾ç¤ºæç´¢æ¡ä»¶ showSearch: true, // æ»æ¡æ° total: 0, // è§è²è¡¨æ ¼æ°æ® roleList: [], // å¼¹åºå±æ é¢ title: "", // æ¯å¦æ¾ç¤ºå¼¹åºå± open: false, // æ¯å¦æ¾ç¤ºå¼¹åºå±ï¼æ°æ®æéï¼ openDataScope: false, menuExpand: false, menuNodeAll: false, deptExpand: true, deptNodeAll: false, // æ¥æèå´ dateRange: [], // æ°æ®èå´é项 dataScopeOptions: [ { value: "1", label: "å ¨é¨æ°æ®æé" }, { value: "2", label: "èªå®æ°æ®æé" }, { value: "3", label: "æ¬é¨é¨æ°æ®æé" }, { value: "4", label: "æ¬é¨é¨å以䏿°æ®æé" }, { value: "5", label: "ä» æ¬äººæ°æ®æé" } ], // èåå表 menuOptions: [], // é¨é¨å表 deptOptions: [], // æ¥è¯¢åæ° queryParams: { pageNum: 1, pageSize: 10, roleName: undefined, roleKey: undefined, status: undefined }, // 表ååæ° form: {}, defaultProps: { children: "children", label: "label" }, // è¡¨åæ ¡éª rules: { roleName: [ { required: true, message: "è§è²åç§°ä¸è½ä¸ºç©º", trigger: "blur" } ], roleKey: [ { required: true, message: "æéå符ä¸è½ä¸ºç©º", trigger: "blur" } ], roleSort: [ { required: true, message: "è§è²é¡ºåºä¸è½ä¸ºç©º", trigger: "blur" } ] }, refreshTable: true, timer: null }; }, created() { this.getList(); }, methods: { /** æ¥è¯¢è§è²å表 */ getList() { this.loading = true; listRole(this.addDateRange(this.queryParams, this.dateRange)).then( response => { this.roleList = response.rows; this.total = response.total; this.loading = false; } ); }, /** æ¥è¯¢èåæ ç»æ */ getMenuTreeselect() { menuTreeselect().then(response => { this.menuOptions = response.data; }); }, // ææèåèç¹æ°æ® getMenuAllCheckedKeys() { // ç®å被éä¸çèåèç¹ let checkedKeys = this.$refs.menu.getCheckedKeys(); // åéä¸çèåèç¹ let halfCheckedKeys = this.$refs.menu.getHalfCheckedKeys(); checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); return checkedKeys; }, // ææé¨é¨èç¹æ°æ® getDeptAllCheckedKeys() { // ç®å被éä¸çé¨é¨èç¹ let checkedKeys = this.$refs.dept.getCheckedKeys(); // åéä¸çé¨é¨èç¹ let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys(); checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); return checkedKeys; }, /** æ ¹æ®è§è²IDæ¥è¯¢èåæ ç»æ */ getRoleMenuTreeselect(roleId) { return roleMenuTreeselect(roleId).then(response => { this.menuOptions = response.menus; return response; }); }, /** æ ¹æ®è§è²IDæ¥è¯¢é¨é¨æ ç»æ */ getDeptTree(roleId) { return deptTreeSelect(roleId).then(response => { this.deptOptions = response.depts; return response; }); }, // è§è²ç¶æä¿®æ¹ handleStatusChange(row) { let text = row.status === "0" ? "å¯ç¨" : "åç¨"; this.$modal .confirm('确认è¦"' + text + '""' + row.roleName + '"è§è²åï¼') .then(function() { return changeRoleStatus(row.roleId, row.status); }) .then(() => { this.$modal.msgSuccess(text + "æå"); }) .catch(function() { row.status = row.status === "0" ? "1" : "0"; }); }, // åæ¶æé® cancel() { this.open = false; this.reset(); }, // åæ¶æé®ï¼æ°æ®æéï¼ cancelDataScope() { this.openDataScope = false; this.reset(); }, // 表åéç½® reset() { if (this.$refs.menu != undefined) { this.$refs.menu.setCheckedKeys([]); } (this.menuExpand = false), (this.menuNodeAll = false), (this.deptExpand = true), (this.deptNodeAll = false), (this.form = { roleId: undefined, roleName: undefined, roleKey: undefined, roleSort: 0, status: "0", menuIds: [], deptIds: [], menuCheckStrictly: true, deptCheckStrictly: true, remark: undefined }); this.resetForm("form"); }, /** æç´¢æé®æä½ */ handleQuery() { this.queryParams.pageNum = 1; this.getList(); }, /** éç½®æé®æä½ */ resetQuery() { this.dateRange = []; this.resetForm("queryForm"); this.handleQuery(); }, // å¤éæ¡é䏿°æ® handleSelectionChange(selection) { this.ids = selection.map(item => item.roleId); this.single = selection.length != 1; this.multiple = !selection.length; }, // æ´å¤æä½è§¦å handleCommand(command, row) { switch (command) { case "handleDataScope": this.handleDataScope(row); break; case "handleAuthUser": this.handleAuthUser(row); break; default: break; } }, // æ æéï¼å±å¼/æå ï¼ handleCheckedTreeExpand(value, type) { console.log(value); if (type == "menu") { let treeList = this.menuOptions; for (let i = 0; i < treeList.length; i++) { this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value; // if (this.$refs.menu.store.nodesMap[treeList[i].id].childNodes) { // let children = this.$refs.menu.store.nodesMap[treeList[i].id] // .childNodes; // for (let i = 0; i < children.length; i++) { // children[i].expanded = value; // } // } } } else if (type == "dept") { let treeList = this.deptOptions; for (let i = 0; i < treeList.length; i++) { this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value; } } }, // æ æéï¼å ¨é/å ¨ä¸éï¼ handleCheckedTreeNodeAll(value, type) { if (type == "menu") { this.$refs.menu.setCheckedNodes(value ? this.menuOptions : []); } else if (type == "dept") { this.$refs.dept.setCheckedNodes(value ? this.deptOptions : []); } }, // æ æéï¼ç¶åèå¨ï¼ handleCheckedTreeConnect(value, type) { if (type == "menu") { this.form.menuCheckStrictly = value ? true : false; } else if (type == "dept") { this.form.deptCheckStrictly = value ? true : false; } }, /** æ°å¢æé®æä½ */ handleAdd() { this.reset(); this.getMenuTreeselect(); this.open = true; this.title = "æ·»å è§è²"; }, /** ä¿®æ¹æé®æä½ */ handleUpdate(row) { this.reset(); const roleId = row.roleId || this.ids; const roleMenu = this.getRoleMenuTreeselect(roleId); getRole(roleId).then(response => { this.form = response.data; this.open = true; this.$nextTick(() => { roleMenu.then(res => { let checkedKeys = res.checkedKeys; checkedKeys.forEach(v => { this.$nextTick(() => { this.$refs.menu.setChecked(v, true, false); }); }); }); }); this.title = "ä¿®æ¹è§è²"; }); }, /** éæ©è§è²æéèå´è§¦å */ dataScopeSelectChange(value) { if (value !== "2") { this.$refs.dept.setCheckedKeys([]); } }, /** åé æ°æ®æéæä½ */ handleDataScope(row) { this.reset(); const deptTreeSelect = this.getDeptTree(row.roleId); getRole(row.roleId).then(response => { this.form = response.data; this.openDataScope = true; this.$nextTick(() => { deptTreeSelect.then(res => { this.$refs.dept.setCheckedKeys(res.checkedKeys); }); }); this.title = "åé æ°æ®æé"; }); }, /** åé ç¨æ·æä½ */ handleAuthUser: function(row) { const roleId = row.roleId; this.$router.push("/system/role-auth/user/" + roleId); }, /** æäº¤æé® */ submitForm: function() { this.$refs["form"].validate(valid => { if (valid) { if (this.form.roleId != undefined) { this.form.menuIds = this.getMenuAllCheckedKeys(); updateRole(this.form).then(response => { this.$modal.msgSuccess("ä¿®æ¹æå"); this.open = false; this.getList(); }); } else { this.form.menuIds = this.getMenuAllCheckedKeys(); addRole(this.form).then(response => { this.$modal.msgSuccess("æ°å¢æå"); this.open = false; this.getList(); }); } } }); }, /** æäº¤æé®ï¼æ°æ®æéï¼ */ submitDataScope: function() { if (this.form.roleId != undefined) { this.form.deptIds = this.getDeptAllCheckedKeys(); dataScope(this.form).then(response => { this.$modal.msgSuccess("ä¿®æ¹æå"); this.openDataScope = false; this.getList(); }); } }, /** å é¤æé®æä½ */ handleDelete(row) { const roleIds = row.roleId || this.ids; this.$modal .confirm('æ¯å¦ç¡®è®¤å é¤è§è²ç¼å·ä¸º"' + roleIds + '"çæ°æ®é¡¹ï¼') .then(function() { return delRole(roleIds); }) .then(() => { this.getList(); this.$modal.msgSuccess("å 餿å"); }) .catch(() => {}); }, /** å¯¼åºæé®æä½ */ handleExport() { this.download( "system/role/export", { ...this.queryParams }, `role_${new Date().getTime()}.xlsx` ); }, handleClose(done) { if (this.loading) { return; } this.$confirm("ç¡®å®è¦æäº¤è¡¨ååï¼") .then(_ => { this.loading = true; this.timer = setTimeout(() => { done(); // å¨ç»å ³ééè¦ä¸å®çæ¶é´ setTimeout(() => { this.loading = false; }, 400); }, 2000); }) .catch(_ => {}); }, cancelForm() { this.loading = false; clearTimeout(this.timer); } } }; </script> se-ui/src/views/system/permissions/selectUser.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,136 @@ <template> <!-- ææç¨æ· --> <el-dialog title="éæ©ç¨æ·" :visible.sync="visible" width="800px" top="5vh" append-to-body> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true"> <el-form-item label="ç¨æ·åç§°" prop="userName"> <el-input v-model="queryParams.userName" placeholder="请è¾å ¥ç¨æ·åç§°" clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="ææºå·ç " prop="phonenumber"> <el-input v-model="queryParams.phonenumber" placeholder="请è¾å ¥ææºå·ç " clearable @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æç´¢</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">éç½®</el-button> </el-form-item> </el-form> <el-row> <el-table @row-click="clickRow" ref="table" :data="userList" @selection-change="handleSelectionChange" height="260px"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column label="ç¨æ·åç§°" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="ç¨æ·æµç§°" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column label="é®ç®±" prop="email" :show-overflow-tooltip="true" /> <el-table-column label="ææº" prop="phonenumber" :show-overflow-tooltip="true" /> <el-table-column label="ç¶æ" align="center" prop="status"> <template slot-scope="scope"> <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/> </template> </el-table-column> <el-table-column label="å建æ¶é´" align="center" prop="createTime" width="180"> <template slot-scope="scope"> <span>{{ parseTime(scope.row.createTime) }}</span> </template> </el-table-column> </el-table> <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> </el-row> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="handleSelectUser">ç¡® å®</el-button> <el-button @click="visible = false">å æ¶</el-button> </div> </el-dialog> </template> <script> import { unallocatedUserList, authUserSelectAll } from "@/api/system/role"; export default { dicts: ['sys_normal_disable'], props: { // è§è²ç¼å· roleId: { type: [Number, String] } }, data() { return { // é®ç½©å± visible: false, // é䏿°ç»å¼ userIds: [], // æ»æ¡æ° total: 0, // æªææç¨æ·æ°æ® userList: [], // æ¥è¯¢åæ° queryParams: { pageNum: 1, pageSize: 10, roleId: undefined, userName: undefined, phonenumber: undefined } }; }, methods: { // æ¾ç¤ºå¼¹æ¡ show() { this.queryParams.roleId = this.roleId; this.getList(); this.visible = true; }, clickRow(row) { this.$refs.table.toggleRowSelection(row); }, // å¤éæ¡é䏿°æ® handleSelectionChange(selection) { this.userIds = selection.map(item => item.userId); }, // æ¥è¯¢è¡¨æ°æ® getList() { unallocatedUserList(this.queryParams).then(res => { this.userList = res.rows; this.total = res.total; }); }, /** æç´¢æé®æä½ */ handleQuery() { this.queryParams.pageNum = 1; this.getList(); }, /** éç½®æé®æä½ */ resetQuery() { this.resetForm("queryForm"); this.handleQuery(); }, /** éæ©ææç¨æ·æä½ */ handleSelectUser() { const roleId = this.queryParams.roleId; const userIds = this.userIds.join(","); if (userIds == "") { this.$modal.msgError("è¯·éæ©è¦åé çç¨æ·"); return; } authUserSelectAll({ roleId: roleId, userIds: userIds }).then(res => { this.$modal.msgSuccess(res.msg); this.visible = false; this.$emit("ok"); }); } } }; </script> se-ui/vue.config.js
@@ -34,8 +34,8 @@ proxy: { // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { target: `http://localhost:8080`, //target: `http://192.168.11.203:8090`, // target: `http://localhost:8080`, target: `http://192.168.11.203:8090`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: process.env.VUE_APP_BASE_API