From bf415ca86e70b05e76861f27253838f2ab9457c1 Mon Sep 17 00:00:00 2001 From: sk1551 <15175617877@163.com> Date: Tue, 21 Apr 2020 09:55:48 +0800 Subject: [PATCH] =?UTF-8?q?20200421-lc-1=20=E4=BF=AE=E6=94=B9=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=A7=92=E8=89=B2=E4=BE=9D=E7=84=B6=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9A=84bug=20=E7=82=B9=E5=87=BB=E4=BF=AE=E6=94=B9=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-ui/src/views/system/user/index.vue | 1347 ++++++++--------- .../service/impl/SysRoleServiceImpl.java | 656 ++++---- .../mybatis/system/SysRoleMapper.xml | 321 ++-- 3 files changed, 1162 insertions(+), 1162 deletions(-) diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index 2d5910364..68d477e10 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -1,675 +1,674 @@ -<template> - <div class="app-container"> - <el-row :gutter="20"> - <!--部门数据--> - <el-col :span="4" :xs="24"> - <div class="head-container"> - <el-input - v-model="deptName" - placeholder="请输入部门名称" - clearable - size="small" - prefix-icon="el-icon-search" - style="margin-bottom: 20px" - /> - </div> - <div class="head-container"> - <el-tree - :data="deptOptions" - :props="defaultProps" - :expand-on-click-node="false" - :filter-node-method="filterNode" - ref="tree" - default-expand-all - @node-click="handleNodeClick" - /> - </div> - </el-col> - <!--用户数据--> - <el-col :span="20" :xs="24"> - <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> - <el-form-item label="用户名称" prop="userName"> - <el-input - v-model="queryParams.userName" - placeholder="请输入用户名称" - clearable - size="small" - style="width: 240px" - @keyup.enter.native="handleQuery" - /> - </el-form-item> - <el-form-item label="状态" prop="status"> - <el-select - v-model="queryParams.status" - placeholder="用户状态" - clearable - size="small" - style="width: 240px" - > - <el-option - v-for="dict in statusOptions" - :key="dict.dictValue" - :label="dict.dictLabel" - :value="dict.dictValue" - /> - </el-select> - </el-form-item> - <el-form-item label="创建时间"> - <el-date-picker - v-model="dateRange" - size="small" - style="width: 240px" - value-format="yyyy-MM-dd" - type="daterange" - range-separator="-" - start-placeholder="开始日期" - end-placeholder="结束日期" - ></el-date-picker> - </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" - icon="el-icon-plus" - size="mini" - @click="handleAdd" - v-hasPermi="['system:user:add']" - >新增</el-button> - </el-col> - <el-col :span="1.5"> - <el-button - type="success" - icon="el-icon-edit" - size="mini" - :disabled="single" - @click="handleUpdate" - v-hasPermi="['system:user:edit']" - >修改</el-button> - </el-col> - <el-col :span="1.5"> - <el-button - type="danger" - icon="el-icon-delete" - size="mini" - :disabled="multiple" - @click="handleDelete" - v-hasPermi="['system:user:remove']" - >删除</el-button> - </el-col> - <el-col :span="1.5"> - <el-button - type="info" - icon="el-icon-upload2" - size="mini" - @click="handleImport" - v-hasPermi="['system:user:import']" - >导入</el-button> - </el-col> - <el-col :span="1.5"> - <el-button - type="warning" - icon="el-icon-download" - size="mini" - @click="handleExport" - v-hasPermi="['system:user:export']" - >导出</el-button> - </el-col> - </el-row> - - <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> - <el-table-column type="selection" width="40" align="center" /> - <el-table-column label="用户编号" align="center" prop="userId" /> - <el-table-column - label="登录账号" - align="center" - prop="userName" - :show-overflow-tooltip="true" - /> - <el-table-column - label="用户姓名" - align="center" - prop="nickName" - :show-overflow-tooltip="true" - /> - <el-table-column - label="部门" - align="center" - prop="dept.deptName" - :show-overflow-tooltip="true" - /> - <el-table-column label="状态" align="center"> - <template slot-scope="scope"> - <el-switch - v-model="scope.row.status" - active-value="0" - inactive-value="1" - @change="handleStatusChange(scope.row)" - ></el-switch> - </template> - </el-table-column> - <el-table-column label="创建时间" align="center" prop="createTime" width="160"> - <template slot-scope="scope"> - <span>{{ parseTime(scope.row.createTime) }}</span> - </template> - </el-table-column> - <el-table-column - label="操作" - align="center" - width="180" - class-name="small-padding fixed-width" - > - <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" - @click="handleUpdate(scope.row)" - v-hasPermi="['system:user:edit']" - >修改</el-button> - <el-button - v-if="scope.row.userId !== 1" - size="mini" - type="text" - icon="el-icon-delete" - @click="handleDelete(scope.row)" - v-hasPermi="['system:user:remove']" - >删除</el-button> - <el-button - size="mini" - type="text" - icon="el-icon-key" - @click="handleResetPwd(scope.row)" - v-hasPermi="['system:user:resetPwd']" - >重置</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" - /> - </el-col> - </el-row> - - <!-- 添加或修改参数配置对话框 --> - <el-dialog :title="title" :visible.sync="open" width="600px"> - <el-form ref="form" :model="form" :rules="rules" label-width="80px"> - <el-row> - <el-col :span="12"> - <el-form-item label="用户姓名" prop="nickName"> - <el-input v-model="form.nickName" placeholder="请输入用户姓名" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="归属部门" prop="deptId"> - <treeselect v-model="form.deptId" :options="deptOptions" placeholder="请选择归属部门" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="登录账号" prop="userName"> - <el-input v-model="form.userName" placeholder="请输入手机号码" maxlength="11" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password"> - <el-input v-model="form.password" placeholder="请输入用户密码" type="password" /> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="用户性别"> - <el-select v-model="form.sex" placeholder="请选择"> - <el-option - v-for="dict in sexOptions" - :key="dict.dictValue" - :label="dict.dictLabel" - :value="dict.dictValue" - ></el-option> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="状态"> - <el-radio-group v-model="form.status"> - <el-radio - v-for="dict in statusOptions" - :key="dict.dictValue" - :label="dict.dictValue" - >{{dict.dictLabel}}</el-radio> - </el-radio-group> - </el-form-item> - </el-col> - - <el-col :span="12"> - <el-form-item label="岗位"> - <el-select v-model="form.postIds" multiple placeholder="请选择"> - <el-option - v-for="item in postOptions" - :key="item.postId" - :label="item.postName" - :value="item.postId" - :disabled="item.status == 1" - ></el-option> - </el-select> - </el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="角色"> - <el-select v-model="form.roleIds" multiple placeholder="请选择"> - <el-option - v-for="item in roleOptions" - :key="item.roleId" - :label="item.roleName" - :value="item.roleId" - :disabled="item.status == 1" - ></el-option> - </el-select> - </el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="备注"> - <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> - </el-form-item> - </el-col> - </el-row> - </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="upload.title" :visible.sync="upload.open" width="400px"> - <el-upload - ref="upload" - :limit="1" - accept=".xlsx, .xls" - :headers="upload.headers" - :action="upload.url + '?updateSupport=' + upload.updateSupport" - :disabled="upload.isUploading" - :on-progress="handleFileUploadProgress" - :on-success="handleFileSuccess" - :auto-upload="false" - drag - > - <i class="el-icon-upload"></i> - <div class="el-upload__text"> - 将文件拖到此处,或 - <em>点击上传</em> - </div> - <div class="el-upload__tip" slot="tip"> - <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据 - <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link> - </div> - <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div> - </el-upload> - <div slot="footer" class="dialog-footer"> - <el-button type="primary" @click="submitFileForm">确 定</el-button> - <el-button @click="upload.open = false">取 消</el-button> - </div> - </el-dialog> - </div> -</template> - -<script> -import { - listUser, - getUser, - delUser, - addUser, - updateUser, - exportUser, - resetUserPwd, - changeUserStatus, - importTemplate -} from "@/api/system/user"; -import { getToken } from "@/utils/auth"; -import { treeselect } from "@/api/system/dept"; -import Treeselect from "@riophae/vue-treeselect"; -import "@riophae/vue-treeselect/dist/vue-treeselect.css"; - -export default { - name: "User", - components: { Treeselect }, - data() { - return { - // 遮罩层 - loading: true, - // 选中数组 - ids: [], - // 非单个禁用 - single: true, - // 非多个禁用 - multiple: true, - // 总条数 - total: 0, - // 用户表格数据 - userList: null, - // 弹出层标题 - title: "", - // 部门树选项 - deptOptions: undefined, - // 是否显示弹出层 - open: false, - // 部门名称 - deptName: undefined, - // 默认密码 - initPassword: undefined, - // 日期范围 - dateRange: [], - // 状态数据字典 - statusOptions: [], - // 性别状态字典 - sexOptions: [], - // 岗位选项 - postOptions: [], - // 角色选项 - roleOptions: [], - // 表单参数 - form: {}, - defaultProps: { - children: "children", - label: "label" - }, - // 用户导入参数 - upload: { - // 是否显示弹出层(用户导入) - open: false, - // 弹出层标题(用户导入) - title: "", - // 是否禁用上传 - isUploading: false, - // 是否更新已经存在的用户数据 - updateSupport: 0, - // 设置上传的请求头部 - headers: { Authorization: "Bearer " + getToken() }, - // 上传的地址 - url: process.env.VUE_APP_BASE_API + "/system/user/importData" - }, - // 查询参数 - queryParams: { - pageNum: 1, - pageSize: 10, - userName: undefined, - status: undefined, - deptId: undefined - }, - // 表单校验 - rules: { - userName: [ - { - required: true, - pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, - message: "请输入正确的手机号码", - trigger: "blur" - } - ], - nickName: [ - { required: true, message: "用户昵称不能为空", trigger: "blur" } - ], - deptId: [ - { required: true, message: "归属部门不能为空", trigger: "blur" } - ], - password: [ - { required: true, message: "用户密码不能为空", trigger: "blur" } - ] - } - }; - }, - watch: { - // 根据名称筛选部门树 - deptName(val) { - this.$refs.tree.filter(val); - } - }, - created() { - this.getList(); - this.getTreeselect(); - this.getDicts("sys_normal_disable").then(response => { - this.statusOptions = response.data; - }); - this.getDicts("sys_user_sex").then(response => { - this.sexOptions = response.data; - }); - this.getConfigKey("sys.user.initPassword").then(response => { - this.initPassword = response.msg; - }); - }, - methods: { - /** 查询用户列表 */ - getList() { - this.loading = true; - listUser(this.addDateRange(this.queryParams, this.dateRange)).then( - response => { - this.userList = response.rows; - this.total = response.total; - this.loading = false; - } - ); - }, - /** 查询部门下拉树结构 */ - getTreeselect() { - treeselect().then(response => { - this.deptOptions = response.data; - }); - }, - // 筛选节点 - filterNode(value, data) { - if (!value) return true; - return data.label.indexOf(value) !== -1; - }, - // 节点单击事件 - handleNodeClick(data) { - this.queryParams.deptId = data.id; - this.getList(); - }, - // 用户状态修改 - handleStatusChange(row) { - let text = row.status === "0" ? "启用" : "停用"; - this.$confirm( - '确认要"' + text + '""' + row.userName + '"用户吗?', - "警告", - { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - } - ) - .then(function() { - return changeUserStatus(row.userId, row.status); - }) - .then(() => { - this.msgSuccess(text + "成功"); - }) - .catch(function() { - row.status = row.status === "0" ? "1" : "0"; - }); - }, - // 取消按钮 - cancel() { - this.open = false; - this.reset(); - }, - // 表单重置 - reset() { - this.form = { - userId: undefined, - deptId: undefined, - userName: undefined, - nickName: undefined, - password: undefined, - sex: undefined, - status: "0", - remark: undefined, - postIds: [], - roleIds: [] - }; - this.resetForm("form"); - }, - /** 搜索按钮操作 */ - handleQuery() { - this.queryParams.page = 1; - this.getList(); - }, - /** 重置按钮操作 */ - resetQuery() { - this.dateRange = []; - this.resetForm("queryForm"); - this.handleQuery(); - }, - // 多选框选中数据 - handleSelectionChange(selection) { - this.ids = selection.map(item => item.userId); - this.single = selection.length != 1; - this.multiple = !selection.length; - }, - /** 新增按钮操作 */ - handleAdd() { - this.reset(); - this.getTreeselect(); - getUser().then(response => { - this.postOptions = response.posts; - this.roleOptions = response.roles; - this.open = true; - this.title = "添加用户"; - this.form.password = this.initPassword; - }); - }, - /** 修改按钮操作 */ - handleUpdate(row) { - this.reset(); - this.getTreeselect(); - const userId = row.userId || this.ids; - getUser(userId).then(response => { - this.form = response.data; - this.postOptions = response.posts; - this.roleOptions = response.roles; - this.form.postIds = response.postIds; - this.form.roleIds = response.roleIds; - this.open = true; - this.title = "修改用户"; - this.form.password = ""; - }); - }, - /** 重置密码按钮操作 */ - handleResetPwd(row) { - this.$prompt('请输入"' + row.userName + '"的新密码', "提示", { - confirmButtonText: "确定", - cancelButtonText: "取消" - }) - .then(({ value }) => { - resetUserPwd(row.userId, value).then(response => { - if (response.code === 200) { - this.msgSuccess("修改成功,新密码是:" + value); - } else { - this.msgError(response.msg); - } - }); - }) - .catch(() => {}); - }, - /** 提交按钮 */ - submitForm: function() { - this.$refs["form"].validate(valid => { - if (valid) { - if (this.form.userId != undefined) { - updateUser(this.form).then(response => { - if (response.code === 200) { - this.msgSuccess("修改成功"); - this.open = false; - this.getList(); - } else { - this.msgError(response.msg); - } - }); - } else { - addUser(this.form).then(response => { - if (response.code === 200) { - this.msgSuccess("新增成功"); - this.open = false; - this.getList(); - } else { - this.msgError(response.msg); - } - }); - } - } - }); - }, - /** 删除按钮操作 */ - handleDelete(row) { - const userIds = row.userId || this.ids; - this.$confirm( - '是否确认删除用户编号为"' + userIds + '"的数据项?', - "警告", - { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - } - ) - .then(function() { - return delUser(userIds); - }) - .then(() => { - this.getList(); - this.msgSuccess("删除成功"); - }) - .catch(function() {}); - }, - /** 导出按钮操作 */ - handleExport() { - const queryParams = this.queryParams; - this.$confirm("是否确认导出所有用户数据项?", "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }) - .then(function() { - return exportUser(queryParams); - }) - .then(response => { - this.download(response.msg); - }) - .catch(function() {}); - }, - /** 导入按钮操作 */ - handleImport() { - this.upload.title = "用户导入"; - this.upload.open = true; - }, - /** 下载模板操作 */ - importTemplate() { - importTemplate().then(response => { - this.download(response.msg); - }); - }, - // 文件上传中处理 - handleFileUploadProgress(event, file, fileList) { - this.upload.isUploading = true; - }, - // 文件上传成功处理 - handleFileSuccess(response, file, fileList) { - this.upload.open = false; - this.upload.isUploading = false; - this.$refs.upload.clearFiles(); - this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true }); - this.getList(); - }, - // 提交上传文件 - submitFileForm() { - this.$refs.upload.submit(); - } - } -}; +<template> + <div class="app-container"> + <el-row :gutter="20"> + <!--部门数据--> + <el-col :span="4" :xs="24"> + <div class="head-container"> + <el-input + v-model="deptName" + placeholder="请输入部门名称" + clearable + size="small" + prefix-icon="el-icon-search" + style="margin-bottom: 20px" + /> + </div> + <div class="head-container"> + <el-tree + :data="deptOptions" + :props="defaultProps" + :expand-on-click-node="false" + :filter-node-method="filterNode" + ref="tree" + default-expand-all + @node-click="handleNodeClick" + /> + </div> + </el-col> + <!--用户数据--> + <el-col :span="20" :xs="24"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="用户名称" prop="userName"> + <el-input + v-model="queryParams.userName" + placeholder="请输入用户名称" + clearable + size="small" + style="width: 240px" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="状态" prop="status"> + <el-select + v-model="queryParams.status" + placeholder="用户状态" + clearable + size="small" + style="width: 240px" + > + <el-option + v-for="dict in statusOptions" + :key="dict.dictValue" + :label="dict.dictLabel" + :value="dict.dictValue" + /> + </el-select> + </el-form-item> + <el-form-item label="创建时间"> + <el-date-picker + v-model="dateRange" + size="small" + style="width: 240px" + value-format="yyyy-MM-dd" + type="daterange" + range-separator="-" + start-placeholder="开始日期" + end-placeholder="结束日期" + ></el-date-picker> + </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" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:user:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:user:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:user:remove']" + >删除</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="info" + icon="el-icon-upload2" + size="mini" + @click="handleImport" + v-hasPermi="['system:user:import']" + >导入</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:user:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="40" align="center" /> + <el-table-column label="用户编号" align="center" prop="userId" /> + <el-table-column + label="登录账号" + align="center" + prop="userName" + :show-overflow-tooltip="true" + /> + <el-table-column + label="用户姓名" + align="center" + prop="nickName" + :show-overflow-tooltip="true" + /> + <el-table-column + label="部门" + align="center" + prop="dept.deptName" + :show-overflow-tooltip="true" + /> + <el-table-column label="状态" align="center"> + <template slot-scope="scope"> + <el-switch + v-model="scope.row.status" + active-value="0" + inactive-value="1" + @change="handleStatusChange(scope.row)" + ></el-switch> + </template> + </el-table-column> + <el-table-column label="创建时间" align="center" prop="createTime" width="160"> + <template slot-scope="scope"> + <span>{{ parseTime(scope.row.createTime) }}</span> + </template> + </el-table-column> + <el-table-column + label="操作" + align="center" + width="180" + class-name="small-padding fixed-width" + > + <template slot-scope="scope"> + <el-button + size="mini" + type="text" + icon="el-icon-edit" + @click="handleUpdate(scope.row)" + v-hasPermi="['system:user:edit']" + >修改</el-button> + <el-button + v-if="scope.row.userId !== 1" + size="mini" + type="text" + icon="el-icon-delete" + @click="handleDelete(scope.row)" + v-hasPermi="['system:user:remove']" + >删除</el-button> + <el-button + size="mini" + type="text" + icon="el-icon-key" + @click="handleResetPwd(scope.row)" + v-hasPermi="['system:user:resetPwd']" + >重置</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" + /> + </el-col> + </el-row> + + <!-- 添加或修改参数配置对话框 --> + <el-dialog :title="title" :visible.sync="open" width="600px"> + <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-row> + <el-col :span="12"> + <el-form-item label="用户姓名" prop="nickName"> + <el-input v-model="form.nickName" placeholder="请输入用户姓名" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="归属部门" prop="deptId"> + <treeselect v-model="form.deptId" :options="deptOptions" placeholder="请选择归属部门" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="登录账号" prop="userName"> + <el-input v-model="form.userName" placeholder="请输入手机号码" maxlength="11" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password"> + <el-input v-model="form.password" placeholder="请输入用户密码" type="password" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="用户性别"> + <el-select v-model="form.sex" placeholder="请选择"> + <el-option + v-for="dict in sexOptions" + :key="dict.dictValue" + :label="dict.dictLabel" + :value="dict.dictValue" + ></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="状态"> + <el-radio-group v-model="form.status"> + <el-radio + v-for="dict in statusOptions" + :key="dict.dictValue" + :label="dict.dictValue" + >{{dict.dictLabel}}</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="岗位"> + <el-select v-model="form.postIds" multiple placeholder="请选择"> + <el-option + v-for="item in postOptions" + :key="item.postId" + :label="item.postName" + :value="item.postId" + :disabled="item.status == 1" + ></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="角色"> + <el-select v-model="form.roleIds" multiple placeholder="请选择"> + <el-option + v-for="item in roleOptions" + :key="item.roleId" + :label="item.roleName" + :value="item.roleId" + :disabled="item.status == 1" + ></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="备注"> + <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> + </el-form-item> + </el-col> + </el-row> + </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="upload.title" :visible.sync="upload.open" width="400px"> + <el-upload + ref="upload" + :limit="1" + accept=".xlsx, .xls" + :headers="upload.headers" + :action="upload.url + '?updateSupport=' + upload.updateSupport" + :disabled="upload.isUploading" + :on-progress="handleFileUploadProgress" + :on-success="handleFileSuccess" + :auto-upload="false" + drag + > + <i class="el-icon-upload"></i> + <div class="el-upload__text"> + 将文件拖到此处,或 + <em>点击上传</em> + </div> + <div class="el-upload__tip" slot="tip"> + <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据 + <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link> + </div> + <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div> + </el-upload> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitFileForm">确 定</el-button> + <el-button @click="upload.open = false">取 消</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { + listUser, + getUser, + delUser, + addUser, + updateUser, + exportUser, + resetUserPwd, + changeUserStatus, + importTemplate +} from "@/api/system/user"; +import { getToken } from "@/utils/auth"; +import { treeselect } from "@/api/system/dept"; +import Treeselect from "@riophae/vue-treeselect"; +import "@riophae/vue-treeselect/dist/vue-treeselect.css"; + +export default { + name: "User", + components: { Treeselect }, + data() { + return { + // 遮罩层 + loading: true, + // 选中数组 + ids: [], + // 非单个禁用 + single: true, + // 非多个禁用 + multiple: true, + // 总条数 + total: 0, + // 用户表格数据 + userList: null, + // 弹出层标题 + title: "", + // 部门树选项 + deptOptions: undefined, + // 是否显示弹出层 + open: false, + // 部门名称 + deptName: undefined, + // 默认密码 + initPassword: undefined, + // 日期范围 + dateRange: [], + // 状态数据字典 + statusOptions: [], + // 性别状态字典 + sexOptions: [], + // 岗位选项 + postOptions: [], + // 角色选项 + roleOptions: [], + // 表单参数 + form: {}, + defaultProps: { + children: "children", + label: "label" + }, + // 用户导入参数 + upload: { + // 是否显示弹出层(用户导入) + open: false, + // 弹出层标题(用户导入) + title: "", + // 是否禁用上传 + isUploading: false, + // 是否更新已经存在的用户数据 + updateSupport: 0, + // 设置上传的请求头部 + headers: { Authorization: "Bearer " + getToken() }, + // 上传的地址 + url: process.env.VUE_APP_BASE_API + "/system/user/importData" + }, + // 查询参数 + queryParams: { + pageNum: 1, + pageSize: 10, + userName: undefined, + status: undefined, + deptId: undefined + }, + // 表单校验 + rules: { + userName: [ + { + required: true, + pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, + message: "请输入正确的手机号码", + trigger: "blur" + } + ], + nickName: [ + { required: true, message: "用户昵称不能为空", trigger: "blur" } + ], + deptId: [ + { required: true, message: "归属部门不能为空", trigger: "blur" } + ], + password: [ + { required: true, message: "用户密码不能为空", trigger: "blur" } + ] + } + }; + }, + watch: { + // 根据名称筛选部门树 + deptName(val) { + this.$refs.tree.filter(val); + } + }, + created() { + this.getList(); + this.getTreeselect(); + this.getDicts("sys_normal_disable").then(response => { + this.statusOptions = response.data; + }); + this.getDicts("sys_user_sex").then(response => { + this.sexOptions = response.data; + }); + this.getConfigKey("sys.user.initPassword").then(response => { + this.initPassword = response.msg; + }); + }, + methods: { + /** 查询用户列表 */ + getList() { + this.loading = true; + listUser(this.addDateRange(this.queryParams, this.dateRange)).then( + response => { + this.userList = response.rows; + this.total = response.total; + this.loading = false; + } + ); + }, + /** 查询部门下拉树结构 */ + getTreeselect() { + treeselect().then(response => { + this.deptOptions = response.data; + }); + }, + // 筛选节点 + filterNode(value, data) { + if (!value) return true; + return data.label.indexOf(value) !== -1; + }, + // 节点单击事件 + handleNodeClick(data) { + this.queryParams.deptId = data.id; + this.getList(); + }, + // 用户状态修改 + handleStatusChange(row) { + let text = row.status === "0" ? "启用" : "停用"; + this.$confirm( + '确认要"' + text + '""' + row.userName + '"用户吗?', + "警告", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + } + ) + .then(function() { + return changeUserStatus(row.userId, row.status); + }) + .then(() => { + this.msgSuccess(text + "成功"); + }) + .catch(function() { + row.status = row.status === "0" ? "1" : "0"; + }); + }, + // 取消按钮 + cancel() { + this.open = false; + this.reset(); + }, + // 表单重置 + reset() { + this.form = { + userId: undefined, + deptId: undefined, + userName: undefined, + nickName: undefined, + password: undefined, + sex: undefined, + status: "0", + remark: undefined, + postIds: [], + roleIds: [] + }; + this.resetForm("form"); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.page = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + // 多选框选中数据 + handleSelectionChange(selection) { + this.ids = selection.map(item => item.userId); + this.single = selection.length != 1; + this.multiple = !selection.length; + }, + /** 新增按钮操作 */ + handleAdd() { + this.reset(); + this.getTreeselect(); + getUser().then(response => { + this.postOptions = response.posts; + this.roleOptions = response.roles; + this.open = true; + this.title = "添加用户"; + this.form.password = this.initPassword; + }); + }, + /** 修改按钮操作 */ + handleUpdate(row) { + this.reset(); + this.getTreeselect(); + const userId = row.userId || this.ids; + getUser(userId).then(response => { + this.form = response.data; + this.postOptions = response.posts; + this.roleOptions = response.roles; + this.form.postIds = response.postIds; + this.form.roleIds = response.roleIds; + this.open = true; + this.title = "修改用户"; + this.form.password = ""; + }); + }, + /** 重置密码按钮操作 */ + handleResetPwd(row) { + this.$prompt('请输入"' + row.userName + '"的新密码', "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消" + }) + .then(({ value }) => { + resetUserPwd(row.userId, value).then(response => { + if (response.code === 200) { + this.msgSuccess("修改成功,新密码是:" + value); + } else { + this.msgError(response.msg); + } + }); + }) + .catch(() => {}); + }, + /** 提交按钮 */ + submitForm: function() { + this.$refs["form"].validate(valid => { + if (valid) { + if (this.form.userId != undefined) { + updateUser(this.form).then(response => { + if (response.code === 200) { + this.msgSuccess("修改成功"); + this.open = false; + this.getList(); + } else { + this.msgError(response.msg); + } + }); + } else { + addUser(this.form).then(response => { + if (response.code === 200) { + this.msgSuccess("新增成功"); + this.open = false; + this.getList(); + } else { + this.msgError(response.msg); + } + }); + } + } + }); + }, + /** 删除按钮操作 */ + handleDelete(row) { + const userIds = row.userId || this.ids; + this.$confirm( + '是否确认删除用户编号为"' + userIds + '"的数据项?', + "警告", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + } + ) + .then(function() { + return delUser(userIds); + }) + .then(() => { + this.getList(); + this.msgSuccess("删除成功"); + }) + .catch(function() {}); + }, + /** 导出按钮操作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm("是否确认导出所有用户数据项?", "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + .then(function() { + return exportUser(queryParams); + }) + .then(response => { + this.download(response.msg); + }) + .catch(function() {}); + }, + /** 导入按钮操作 */ + handleImport() { + this.upload.title = "用户导入"; + this.upload.open = true; + }, + /** 下载模板操作 */ + importTemplate() { + importTemplate().then(response => { + this.download(response.msg); + }); + }, + // 文件上传中处理 + handleFileUploadProgress(event, file, fileList) { + this.upload.isUploading = true; + }, + // 文件上传成功处理 + handleFileSuccess(response, file, fileList) { + this.upload.open = false; + this.upload.isUploading = false; + this.$refs.upload.clearFiles(); + this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true }); + this.getList(); + }, + // 提交上传文件 + submitFileForm() { + this.$refs.upload.submit(); + } + } +}; </script> \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java index 7e988b174..c403e39b7 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java @@ -1,328 +1,328 @@ -package com.ruoyi.project.system.service.impl; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.exception.CustomException; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.framework.aspectj.lang.annotation.DataScope; -import com.ruoyi.project.system.domain.SysRole; -import com.ruoyi.project.system.domain.SysRoleDept; -import com.ruoyi.project.system.domain.SysRoleMenu; -import com.ruoyi.project.system.mapper.SysRoleDeptMapper; -import com.ruoyi.project.system.mapper.SysRoleMapper; -import com.ruoyi.project.system.mapper.SysRoleMenuMapper; -import com.ruoyi.project.system.mapper.SysUserRoleMapper; -import com.ruoyi.project.system.service.ISysRoleService; - -/** - * 角色 业务层处理 - * - * @author ruoyi - */ -@Service -public class SysRoleServiceImpl implements ISysRoleService -{ - @Autowired - private SysRoleMapper roleMapper; - - @Autowired - private SysRoleMenuMapper roleMenuMapper; - - @Autowired - private SysUserRoleMapper userRoleMapper; - - @Autowired - private SysRoleDeptMapper roleDeptMapper; - - /** - * 根据条件分页查询角色数据 - * - * @param role 角色信息 - * @return 角色数据集合信息 - */ - @Override - @DataScope(deptAlias = "d") - public List<SysRole> selectRoleList(SysRole role) - { - return roleMapper.selectRoleList(role); - } - - /** - * 根据用户ID查询权限 - * - * @param userId 用户ID - * @return 权限列表 - */ - @Override - public Set<String> selectRolePermissionByUserId(Long userId) - { - List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId); - Set<String> permsSet = new HashSet<>(); - for (SysRole perm : perms) - { - if (StringUtils.isNotNull(perm)) - { - permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); - } - } - return permsSet; - } - - /** - * 查询所有角色 - * - * @return 角色列表 - */ - public List<SysRole> selectRoleAll() - { - return roleMapper.selectRoleAll(); - } - - /** - * 查询所有幼儿园角色 - * - * @return 角色列表 - */ - public List<SysRole> selectYeyRoleAll() - { - return roleMapper.selectYeyRoleAll(); - } - - /** - * 根据用户ID获取角色选择框列表 - * - * @param userId 用户ID - * @return 选中角色ID列表 - */ - public List<Integer> selectRoleListByUserId(Long userId) - { - return roleMapper.selectRoleListByUserId(userId); - } - - //根据用户id获取幼儿园角色 - @Override - public List<Integer> selectYeyRoleListByUserId(Long userId) - { - return selectYeyRoleListByUserId(userId); - } - - /** - * 通过角色ID查询角色 - * - * @param roleId 角色ID - * @return 角色对象信息 - */ - public SysRole selectRoleById(Long roleId) - { - return roleMapper.selectRoleById(roleId); - } - - /** - * 校验角色名称是否唯一 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - public String checkRoleNameUnique(SysRole role) - { - Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); - SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); - if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) - { - return UserConstants.NOT_UNIQUE; - } - return UserConstants.UNIQUE; - } - - /** - * 校验角色权限是否唯一 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - public String checkRoleKeyUnique(SysRole role) - { - Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); - SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); - if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) - { - return UserConstants.NOT_UNIQUE; - } - return UserConstants.UNIQUE; - } - - /** - * 校验角色是否允许操作 - * - * @param role 角色信息 - */ - public void checkRoleAllowed(SysRole role) - { - if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) - { - throw new CustomException("不允许操作超级管理员角色"); - } - } - - /** - * 通过角色ID查询角色使用数量 - * - * @param roleId 角色ID - * @return 结果 - */ - @Override - public int countUserRoleByRoleId(Long roleId) - { - return userRoleMapper.countUserRoleByRoleId(roleId); - } - - /** - * 新增保存角色信息 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - @Transactional - public int insertRole(SysRole role) - { - // 新增角色信息 - roleMapper.insertRole(role); - return insertRoleMenu(role); - } - - /** - * 修改保存角色信息 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - @Transactional - public int updateRole(SysRole role) - { - // 修改角色信息 - roleMapper.updateRole(role); - // 删除角色与菜单关联 - roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); - return insertRoleMenu(role); - } - - /** - * 修改角色状态 - * - * @param role 角色信息 - * @return 结果 - */ - public int updateRoleStatus(SysRole role) - { - return roleMapper.updateRole(role); - } - - /** - * 修改数据权限信息 - * - * @param role 角色信息 - * @return 结果 - */ - @Override - @Transactional - public int authDataScope(SysRole role) - { - // 修改角色信息 - roleMapper.updateRole(role); - // 删除角色与部门关联 - roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); - // 新增角色和部门信息(数据权限) - return insertRoleDept(role); - } - - /** - * 新增角色菜单信息 - * - * @param role 角色对象 - */ - public int insertRoleMenu(SysRole role) - { - int rows = 1; - // 新增用户与角色管理 - List<SysRoleMenu> list = new ArrayList<SysRoleMenu>(); - for (Long menuId : role.getMenuIds()) - { - SysRoleMenu rm = new SysRoleMenu(); - rm.setRoleId(role.getRoleId()); - rm.setMenuId(menuId); - list.add(rm); - } - if (list.size() > 0) - { - rows = roleMenuMapper.batchRoleMenu(list); - } - return rows; - } - - /** - * 新增角色部门信息(数据权限) - * - * @param role 角色对象 - */ - public int insertRoleDept(SysRole role) - { - int rows = 1; - // 新增角色与部门(数据权限)管理 - List<SysRoleDept> list = new ArrayList<SysRoleDept>(); - for (Long deptId : role.getDeptIds()) - { - SysRoleDept rd = new SysRoleDept(); - rd.setRoleId(role.getRoleId()); - rd.setDeptId(deptId); - list.add(rd); - } - if (list.size() > 0) - { - rows = roleDeptMapper.batchRoleDept(list); - } - return rows; - } - - /** - * 通过角色ID删除角色 - * - * @param roleId 角色ID - * @return 结果 - */ - @Override - public int deleteRoleById(Long roleId) - { - return roleMapper.deleteRoleById(roleId); - } - - /** - * 批量删除角色信息 - * - * @param roleIds 需要删除的角色ID - * @return 结果 - */ - public int deleteRoleByIds(Long[] roleIds) - { - for (Long roleId : roleIds) - { - checkRoleAllowed(new SysRole(roleId)); - SysRole role = selectRoleById(roleId); - if (countUserRoleByRoleId(roleId) > 0) - { - throw new CustomException(String.format("%1$s已分配,不能删除", role.getRoleName())); - } - } - return roleMapper.deleteRoleByIds(roleIds); - } -} +package com.ruoyi.project.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.framework.aspectj.lang.annotation.DataScope; +import com.ruoyi.project.system.domain.SysRole; +import com.ruoyi.project.system.domain.SysRoleDept; +import com.ruoyi.project.system.domain.SysRoleMenu; +import com.ruoyi.project.system.mapper.SysRoleDeptMapper; +import com.ruoyi.project.system.mapper.SysRoleMapper; +import com.ruoyi.project.system.mapper.SysRoleMenuMapper; +import com.ruoyi.project.system.mapper.SysUserRoleMapper; +import com.ruoyi.project.system.service.ISysRoleService; + +/** + * 角色 业务层处理 + * + * @author ruoyi + */ +@Service +public class SysRoleServiceImpl implements ISysRoleService +{ + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + @DataScope(deptAlias = "d") + public List<SysRole> selectRoleList(SysRole role) + { + return roleMapper.selectRoleList(role); + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set<String> selectRolePermissionByUserId(Long userId) + { + List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId); + Set<String> permsSet = new HashSet<>(); + for (SysRole perm : perms) + { + if (StringUtils.isNotNull(perm)) + { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List<SysRole> selectRoleAll() + { + return roleMapper.selectRoleAll(); + } + + /** + * 查询所有幼儿园角色 + * + * @return 角色列表 + */ + public List<SysRole> selectYeyRoleAll() + { + return roleMapper.selectYeyRoleAll(); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List<Integer> selectRoleListByUserId(Long userId) + { + return roleMapper.selectRoleListByUserId(userId); + } + + //根据用户id获取幼儿园角色 + @Override + public List<Integer> selectYeyRoleListByUserId(Long userId) + { + return roleMapper.selectYeyRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId) + { + return roleMapper.selectRoleById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleNameUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleKeyUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + public void checkRoleAllowed(SysRole role) + { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) + { + throw new CustomException("不允许操作超级管理员角色"); + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) + { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int insertRole(SysRole role) + { + // 新增角色信息 + roleMapper.insertRole(role); + return insertRoleMenu(role); + } + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int updateRole(SysRole role) + { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + return insertRoleMenu(role); + } + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRoleStatus(SysRole role) + { + return roleMapper.updateRole(role); + } + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int authDataScope(SysRole role) + { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); + // 新增角色和部门信息(数据权限) + return insertRoleDept(role); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + public int insertRoleMenu(SysRole role) + { + int rows = 1; + // 新增用户与角色管理 + List<SysRoleMenu> list = new ArrayList<SysRoleMenu>(); + for (Long menuId : role.getMenuIds()) + { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) + { + rows = roleMenuMapper.batchRoleMenu(list); + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + public int insertRoleDept(SysRole role) + { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List<SysRoleDept> list = new ArrayList<SysRoleDept>(); + for (Long deptId : role.getDeptIds()) + { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) + { + rows = roleDeptMapper.batchRoleDept(list); + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int deleteRoleById(Long roleId) + { + return roleMapper.deleteRoleById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds) + { + for (Long roleId : roleIds) + { + checkRoleAllowed(new SysRole(roleId)); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) + { + throw new CustomException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + return roleMapper.deleteRoleByIds(roleIds); + } +} diff --git a/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml index 42e779d45..2f0e74100 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml @@ -1,161 +1,162 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE mapper -PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" -"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="com.ruoyi.project.system.mapper.SysRoleMapper"> - - <resultMap type="SysRole" id="SysRoleResult"> - <id property="roleId" column="role_id" /> - <result property="roleName" column="role_name" /> - <result property="roleKey" column="role_key" /> - <result property="roleSort" column="role_sort" /> - <result property="dataScope" column="data_scope" /> - <result property="status" column="status" /> - <result property="delFlag" column="del_flag" /> - <result property="createBy" column="create_by" /> - <result property="createTime" column="create_time" /> - <result property="updateBy" column="update_by" /> - <result property="updateTime" column="update_time" /> - <result property="remark" column="remark" /> - <result property="purpose" column="purpose" /> - </resultMap> - - <sql id="selectRoleVo"> - select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, - r.status, r.del_flag, r.create_time, r.remark, r.purpose - from sys_role r - left join sys_user_role ur on ur.role_id = r.role_id - left join sys_user u on u.user_id = ur.user_id - left join sys_dept d on u.dept_id = d.dept_id - </sql> - - <select id="selectRoleList" parameterType="SysRole" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - where r.del_flag = '0' - <if test="roleName != null and roleName != ''"> - AND r.role_name like concat('%', #{roleName}, '%') - </if> - <if test="status != null and status != ''"> - AND r.status = #{status} - </if> - <if test="roleKey != null and roleKey != ''"> - AND r.role_key like concat('%', #{roleKey}, '%') - </if> - <if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 --> - and date_format(r.create_time,'%y%m%d') >= date_format(#{beginTime},'%y%m%d') - </if> - <if test="endTime != null and endTime != ''"><!-- 结束时间检索 --> - and date_format(r.create_time,'%y%m%d') <= date_format(#{endTime},'%y%m%d') - </if> - <!-- 数据范围过滤 --> - ${dataScope} - </select> - - <select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - WHERE r.del_flag = '0' and ur.user_id = #{userId} - </select> - - <select id="selectRoleAll" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - </select> - - <select id="selectYeyRoleAll" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - where r.purpose = '1' - </select> - - <select id="selectRoleListByUserId" parameterType="Long" resultType="Integer"> - select r.role_id - from sys_role r - left join sys_user_role ur on ur.role_id = r.role_id - left join sys_user u on u.user_id = ur.user_id - where u.user_id = #{userId} - </select> - - <select id="selectYeyRoleListByUserId" parameterType="Long" resultType="Integer"> - select r.role_id - from sys_role r - left join sys_user_role ur on ur.role_id = r.role_id - left join sys_user u on u.user_id = ur.user_id - where r.purpose = '1' and u.user_id = #{userId} - </select> - - <select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - where r.role_id = #{roleId} - </select> - - <select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - WHERE r.del_flag = '0' and u.user_name = #{userName} - </select> - - <select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - where r.role_name=#{roleName} - </select> - - <select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult"> - <include refid="selectRoleVo"/> - where r.role_key=#{roleKey} - </select> - - <insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId"> - insert into sys_role( - <if test="roleId != null and roleId != 0">role_id,</if> - <if test="roleName != null and roleName != ''">role_name,</if> - <if test="roleKey != null and roleKey != ''">role_key,</if> - <if test="roleSort != null and roleSort != ''">role_sort,</if> - <if test="dataScope != null and dataScope != ''">data_scope,</if> - <if test="status != null and status != ''">status,</if> - <if test="remark != null and remark != ''">remark,</if> - <if test="purpose != null and purpose != ''">purpose,</if> - <if test="createBy != null and createBy != ''">create_by,</if> - create_time - )values( - <if test="roleId != null and roleId != 0">#{roleId},</if> - <if test="roleName != null and roleName != ''">#{roleName},</if> - <if test="roleKey != null and roleKey != ''">#{roleKey},</if> - <if test="roleSort != null and roleSort != ''">#{roleSort},</if> - <if test="dataScope != null and dataScope != ''">#{dataScope},</if> - <if test="status != null and status != ''">#{status},</if> - <if test="remark != null and remark != ''">#{remark},</if> - <if test="purpose != null and purpose != ''">#{purpose},</if> - <if test="createBy != null and createBy != ''">#{createBy},</if> - sysdate() - ) - </insert> - - <update id="updateRole" parameterType="SysRole"> - update sys_role - <set> - <if test="roleName != null and roleName != ''">role_name = #{roleName},</if> - <if test="roleKey != null and roleKey != ''">role_key = #{roleKey},</if> - <if test="roleSort != null and roleSort != ''">role_sort = #{roleSort},</if> - <if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if> - <if test="status != null and status != ''">status = #{status},</if> - <if test="purpose != null and purpose != ''">purpose = #{purpose},</if> - <if test="remark != null">remark = #{remark},</if> - <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> - update_time = sysdate() - </set> - where role_id = #{roleId} - </update> - - <update id="updateRoleStatus" parameterType="SysRole"> - update sys_user set status = #{status} where user_id = #{userId} - </update> - - <delete id="deleteRoleById" parameterType="Long"> - delete from sys_role where role_id = #{roleId} - </delete> - - <delete id="deleteRoleByIds" parameterType="Long"> - update sys_role set del_flag = '2' where role_id in - <foreach collection="array" item="roleId" open="(" separator="," close=")"> - #{roleId} - </foreach> - </delete> - +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper +PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.project.system.mapper.SysRoleMapper"> + + <resultMap type="SysRole" id="SysRoleResult"> + <id property="roleId" column="role_id" /> + <result property="roleName" column="role_name" /> + <result property="roleKey" column="role_key" /> + <result property="roleSort" column="role_sort" /> + <result property="dataScope" column="data_scope" /> + <result property="status" column="status" /> + <result property="delFlag" column="del_flag" /> + <result property="createBy" column="create_by" /> + <result property="createTime" column="create_time" /> + <result property="updateBy" column="update_by" /> + <result property="updateTime" column="update_time" /> + <result property="remark" column="remark" /> + <result property="purpose" column="purpose" /> + </resultMap> + + <sql id="selectRoleVo"> + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, + r.status, r.del_flag, r.create_time, r.remark, r.purpose + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + </sql> + + <select id="selectRoleList" parameterType="SysRole" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + where r.del_flag = '0' + <if test="roleName != null and roleName != ''"> + AND r.role_name like concat('%', #{roleName}, '%') + </if> + <if test="status != null and status != ''"> + AND r.status = #{status} + </if> + <if test="roleKey != null and roleKey != ''"> + AND r.role_key like concat('%', #{roleKey}, '%') + </if> + <if test="beginTime != null and beginTime != ''"><!-- 开始时间检索 --> + and date_format(r.create_time,'%y%m%d') >= date_format(#{beginTime},'%y%m%d') + </if> + <if test="endTime != null and endTime != ''"><!-- 结束时间检索 --> + and date_format(r.create_time,'%y%m%d') <= date_format(#{endTime},'%y%m%d') + </if> + <!-- 数据范围过滤 --> + ${dataScope} + </select> + + <select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + WHERE r.del_flag = '0' and ur.user_id = #{userId} + </select> + + <select id="selectRoleAll" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + WHERE r.del_flag = '0' + </select> + + <select id="selectYeyRoleAll" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + where r.purpose = '1' and r.del_flag = '0' + </select> + + <select id="selectRoleListByUserId" parameterType="Long" resultType="Integer"> + select r.role_id + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + where u.user_id = #{userId} and r.del_flag = '0' + </select> + + <select id="selectYeyRoleListByUserId" parameterType="Long" resultType="Integer"> + select r.role_id + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + where r.purpose = '1' and u.user_id = #{userId} and r.del_flag = '0' + </select> + + <select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + where r.role_id = #{roleId} + </select> + + <select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + WHERE r.del_flag = '0' and u.user_name = #{userName} + </select> + + <select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + where r.role_name=#{roleName} + </select> + + <select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult"> + <include refid="selectRoleVo"/> + where r.role_key=#{roleKey} + </select> + + <insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId"> + insert into sys_role( + <if test="roleId != null and roleId != 0">role_id,</if> + <if test="roleName != null and roleName != ''">role_name,</if> + <if test="roleKey != null and roleKey != ''">role_key,</if> + <if test="roleSort != null and roleSort != ''">role_sort,</if> + <if test="dataScope != null and dataScope != ''">data_scope,</if> + <if test="status != null and status != ''">status,</if> + <if test="remark != null and remark != ''">remark,</if> + <if test="purpose != null and purpose != ''">purpose,</if> + <if test="createBy != null and createBy != ''">create_by,</if> + create_time + )values( + <if test="roleId != null and roleId != 0">#{roleId},</if> + <if test="roleName != null and roleName != ''">#{roleName},</if> + <if test="roleKey != null and roleKey != ''">#{roleKey},</if> + <if test="roleSort != null and roleSort != ''">#{roleSort},</if> + <if test="dataScope != null and dataScope != ''">#{dataScope},</if> + <if test="status != null and status != ''">#{status},</if> + <if test="remark != null and remark != ''">#{remark},</if> + <if test="purpose != null and purpose != ''">#{purpose},</if> + <if test="createBy != null and createBy != ''">#{createBy},</if> + sysdate() + ) + </insert> + + <update id="updateRole" parameterType="SysRole"> + update sys_role + <set> + <if test="roleName != null and roleName != ''">role_name = #{roleName},</if> + <if test="roleKey != null and roleKey != ''">role_key = #{roleKey},</if> + <if test="roleSort != null and roleSort != ''">role_sort = #{roleSort},</if> + <if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if> + <if test="status != null and status != ''">status = #{status},</if> + <if test="purpose != null and purpose != ''">purpose = #{purpose},</if> + <if test="remark != null">remark = #{remark},</if> + <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> + update_time = sysdate() + </set> + where role_id = #{roleId} + </update> + + <update id="updateRoleStatus" parameterType="SysRole"> + update sys_user set status = #{status} where user_id = #{userId} + </update> + + <delete id="deleteRoleById" parameterType="Long"> + delete from sys_role where role_id = #{roleId} + </delete> + + <delete id="deleteRoleByIds" parameterType="Long"> + update sys_role set del_flag = '2' where role_id in + <foreach collection="array" item="roleId" open="(" separator="," close=")"> + #{roleId} + </foreach> + </delete> + </mapper> \ No newline at end of file