index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. <template>
  2. <div class="app-container">
  3. <el-row :gutter="20">
  4. <splitpanes :horizontal="appStore.device === 'mobile'" class="default-theme">
  5. <!--部门数据-->
  6. <pane size="16">
  7. <el-col>
  8. <div class="head-container">
  9. <el-input v-model="deptName" placeholder="请输入组织名称" clearable prefix-icon="Search"
  10. style="margin-bottom: 20px"/>
  11. </div>
  12. <div class="head-container">
  13. <el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }"
  14. :expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id"
  15. highlight-current default-expand-all @node-click="handleNodeClick"/>
  16. </div>
  17. </el-col>
  18. </pane>
  19. <!--用户数据-->
  20. <pane size="84">
  21. <el-col>
  22. <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
  23. <el-form-item label="用户帐号" prop="userName">
  24. <el-input v-model="queryParams.userName" placeholder="请输入用户帐号" clearable style="width: 240px"
  25. @keyup.enter="handleQuery"/>
  26. </el-form-item>
  27. <el-form-item label="用户昵称" prop="nickName">
  28. <el-input v-model="queryParams.nickName" placeholder="请输入用户昵称" clearable style="width: 240px"
  29. @keyup.enter="handleQuery"/>
  30. </el-form-item>
  31. <el-form-item label="状态" prop="status">
  32. <el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
  33. <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
  34. :value="dict.value"/>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="创建时间" style="width: 308px">
  38. <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
  39. start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
  40. </el-form-item>
  41. <el-form-item>
  42. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  43. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  44. </el-form-item>
  45. </el-form>
  46. <el-row :gutter="10" class="mb8">
  47. <el-col :span="1.5">
  48. <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:user:add']">新增
  49. </el-button>
  50. </el-col>
  51. <el-col :span="1.5">
  52. <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
  53. v-hasPermi="['system:user:edit']">修改
  54. </el-button>
  55. </el-col>
  56. <el-col :span="1.5">
  57. <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
  58. v-hasPermi="['system:user:remove']">删除
  59. </el-button>
  60. </el-col>
  61. <el-col :span="1.5">
  62. <el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['system:user:add']">导入
  63. </el-button>
  64. </el-col>
  65. <!-- <el-col :span="1.5">-->
  66. <!-- <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:user:export']">导出</el-button>-->
  67. <!-- </el-col>-->
  68. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
  69. </el-row>
  70. <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
  71. <el-table-column type="selection" width="50" align="center"/>
  72. <el-table-column label="用户编号" align="center" key="userId" prop="userId"
  73. v-if="columns.userId.visible"/>
  74. <el-table-column label="用户帐号" align="center" key="userName" prop="userName"
  75. v-if="columns.userName.visible" :show-overflow-tooltip="true"/>
  76. <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName"
  77. v-if="columns.nickName.visible" :show-overflow-tooltip="true"/>
  78. <el-table-column label="组织" align="center" key="deptName" prop="dept.deptName"
  79. v-if="columns.deptName.visible" :show-overflow-tooltip="true"/>
  80. <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" width="120"/>
  81. <!-- <el-table-column label="邮箱" align="center" key="email" prop="email" width="120"/>-->
  82. <el-table-column label="状态" align="center" key="status" v-if="columns.status.visible">
  83. <template #default="scope">
  84. <el-switch
  85. v-model="scope.row.status"
  86. active-value="0"
  87. inactive-value="1"
  88. @change="handleStatusChange(scope.row)"
  89. ></el-switch>
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible"
  93. width="160">
  94. <template #default="scope">
  95. <span>{{ parseTime(scope.row.createTime) }}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
  99. <template #default="scope">
  100. <el-tooltip content="修改" placement="top" v-if="scope.row.userId !== 1">
  101. <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
  102. v-hasPermi="['system:user:edit']"></el-button>
  103. </el-tooltip>
  104. <el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
  105. <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
  106. v-hasPermi="['system:user:remove']"></el-button>
  107. </el-tooltip>
  108. <el-tooltip content="重置密码" placement="top" v-if="scope.row.userId !== 1">
  109. <el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)"
  110. v-hasPermi="['system:user:resetPwd']"></el-button>
  111. </el-tooltip>
  112. <el-tooltip content="分配角色" placement="top" v-if="scope.row.userId !== 1">
  113. <el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"
  114. v-hasPermi="['system:user:edit']"></el-button>
  115. </el-tooltip>
  116. </template>
  117. </el-table-column>
  118. </el-table>
  119. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  120. v-model:limit="queryParams.pageSize" @pagination="getList"/>
  121. </el-col>
  122. </pane>
  123. </splitpanes>
  124. </el-row>
  125. <!-- 添加或修改用户配置对话框 -->
  126. <el-dialog :title="title" v-model="open" width="600px" append-to-body>
  127. <el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
  128. <el-row>
  129. <el-col :span="12">
  130. <el-form-item label="用户昵称" prop="nickName">
  131. <el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30"/>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="12">
  135. <el-form-item label="归属组织" prop="deptId">
  136. <el-tree-select v-model="form.deptId" :data="enabledDeptOptions"
  137. :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id"
  138. placeholder="请选择归属组织" clearable check-strictly/>
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. <el-row>
  143. <el-col :span="12">
  144. <el-form-item v-if="form.userId == undefined" label="用户账号" prop="userName">
  145. <el-input v-model="form.userName" placeholder="请输入用户账号" maxlength="30"/>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="12">
  149. <el-form-item label="手机号码" prop="phonenumber">
  150. <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11"/>
  151. </el-form-item>
  152. </el-col>
  153. </el-row>
  154. <!-- <el-row>-->
  155. <!-- <el-col :span="12">-->
  156. <!-- <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">-->
  157. <!-- <el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20"-->
  158. <!-- show-password/>-->
  159. <!-- </el-form-item>-->
  160. <!-- </el-col>-->
  161. <!-- <el-col :span="12">-->
  162. <!-- <el-form-item label="邮箱" prop="email">-->
  163. <!-- <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50"/>-->
  164. <!-- </el-form-item>-->
  165. <!-- </el-col>-->
  166. <!-- </el-row>-->
  167. <el-row>
  168. <el-col :span="12">
  169. <el-form-item label="用户性别">
  170. <el-select v-model="form.sex" placeholder="请选择">
  171. <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
  172. :value="dict.value"></el-option>
  173. </el-select>
  174. </el-form-item>
  175. </el-col>
  176. <el-col :span="12">
  177. <el-form-item label="状态">
  178. <el-radio-group v-model="form.status">
  179. <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{
  180. dict.label
  181. }}
  182. </el-radio>
  183. </el-radio-group>
  184. </el-form-item>
  185. </el-col>
  186. </el-row>
  187. <el-row>
  188. <el-col :span="12">
  189. <el-form-item label="岗位">
  190. <el-select v-model="form.postIds" multiple placeholder="请选择">
  191. <el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId"
  192. :disabled="item.status == 1"></el-option>
  193. </el-select>
  194. </el-form-item>
  195. </el-col>
  196. <el-col :span="12">
  197. <el-form-item label="角色">
  198. <el-select v-model="form.roleIds" multiple placeholder="请选择">
  199. <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId"
  200. :disabled="item.status == 1"></el-option>
  201. </el-select>
  202. </el-form-item>
  203. </el-col>
  204. </el-row>
  205. <el-row>
  206. <el-col :span="24">
  207. <el-form-item label="备注">
  208. <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
  209. </el-form-item>
  210. </el-col>
  211. </el-row>
  212. </el-form>
  213. <template #footer>
  214. <div class="dialog-footer">
  215. <el-button type="primary" @click="submitForm">确 定</el-button>
  216. <el-button @click="cancel">取 消</el-button>
  217. </div>
  218. </template>
  219. </el-dialog>
  220. <!-- 用户导入对话框 -->
  221. <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
  222. <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
  223. :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
  224. :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :on-change="handleFileChange"
  225. :on-remove="handleFileRemove" :auto-upload="false" drag>
  226. <el-icon class="el-icon--upload">
  227. <upload-filled/>
  228. </el-icon>
  229. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  230. <template #tip>
  231. <div class="el-upload__tip text-center">
  232. <!-- <div class="el-upload__tip">-->
  233. <!-- <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据-->
  234. <!-- </div>-->
  235. <span>仅允许导入xls、xlsx格式文件。</span>
  236. <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
  237. @click="importTemplate">下载模板
  238. </el-link>
  239. </div>
  240. </template>
  241. </el-upload>
  242. <template #footer>
  243. <div class="dialog-footer">
  244. <el-button type="primary" @click="submitFileForm">确 定</el-button>
  245. <el-button @click="upload.open = false">取 消</el-button>
  246. </div>
  247. </template>
  248. </el-dialog>
  249. </div>
  250. </template>
  251. <script setup name="User">
  252. import {getToken} from "@/utils/auth"
  253. import useAppStore from '@/store/modules/app'
  254. import {
  255. changeUserStatus,
  256. listUser,
  257. resetUserPwd,
  258. delUser,
  259. getUser,
  260. updateUser,
  261. addUser,
  262. deptTreeSelect
  263. } from "@/api/system/user"
  264. import {Splitpanes, Pane} from "splitpanes"
  265. import "splitpanes/dist/splitpanes.css"
  266. import {download} from "@/utils/request.js";
  267. const router = useRouter()
  268. const appStore = useAppStore()
  269. const {proxy} = getCurrentInstance()
  270. const {sys_normal_disable, sys_user_sex} = proxy.useDict("sys_normal_disable", "sys_user_sex")
  271. const userList = ref([])
  272. const open = ref(false)
  273. const loading = ref(true)
  274. const showSearch = ref(true)
  275. const ids = ref([])
  276. const single = ref(true)
  277. const multiple = ref(true)
  278. const total = ref(0)
  279. const title = ref("")
  280. const dateRange = ref([])
  281. const deptName = ref("")
  282. const deptOptions = ref(undefined)
  283. const enabledDeptOptions = ref(undefined)
  284. const initPassword = ref(undefined)
  285. const postOptions = ref([])
  286. const roleOptions = ref([])
  287. /*** 用户导入参数 */
  288. const upload = reactive({
  289. // 是否显示弹出层(用户导入)
  290. open: false,
  291. // 弹出层标题(用户导入)
  292. title: "",
  293. // 是否禁用上传
  294. isUploading: false,
  295. // 是否更新已经存在的用户数据
  296. updateSupport: 0,
  297. // 设置上传的请求头部
  298. headers: {Authorization: "Bearer " + getToken()},
  299. // 上传的地址
  300. url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
  301. })
  302. // 列显隐信息
  303. const columns = ref({
  304. userId: {label: '用户编号', visible: true},
  305. userName: {label: '用户账号', visible: true},
  306. nickName: {label: '用户昵称', visible: true},
  307. deptName: {label: '组织', visible: true},
  308. status: {label: '状态', visible: true},
  309. createTime: {label: '创建时间', visible: true}
  310. })
  311. const data = reactive({
  312. form: {},
  313. queryParams: {
  314. pageNum: 1,
  315. pageSize: 10,
  316. userName: undefined,
  317. nickName: undefined,
  318. status: undefined,
  319. deptId: undefined
  320. },
  321. rules: {
  322. userName: [{required: true, message: "用户帐号不能为空", trigger: "blur"}, {
  323. min: 2,
  324. max: 20,
  325. message: "用户帐号长度必须介于 2 和 20 之间",
  326. trigger: "blur"
  327. }],
  328. nickName: [{required: true, message: "用户昵称不能为空", trigger: "blur"}],
  329. password: [{required: true, message: "用户密码不能为空", trigger: "blur"}, {
  330. min: 5,
  331. max: 20,
  332. message: "用户密码长度必须介于 5 和 20 之间",
  333. trigger: "blur"
  334. }, {pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur"}],
  335. email: [{type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"]}],
  336. phonenumber: [
  337. {required: true, message: "请填写手机号码", trigger: "blur"},
  338. {pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}]
  339. }
  340. })
  341. const {queryParams, form, rules} = toRefs(data)
  342. /** 通过条件过滤节点 */
  343. const filterNode = (value, data) => {
  344. if (!value) return true
  345. return data.label.indexOf(value) !== -1
  346. }
  347. /** 根据名称筛选部门树 */
  348. watch(deptName, val => {
  349. proxy.$refs["deptTreeRef"].filter(val)
  350. })
  351. /** 查询用户列表 */
  352. function getList() {
  353. loading.value = true
  354. listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
  355. loading.value = false
  356. userList.value = res.rows
  357. total.value = res.total
  358. })
  359. }
  360. /** 查询部门下拉树结构 */
  361. function getDeptTree() {
  362. deptTreeSelect().then(response => {
  363. deptOptions.value = response.data
  364. enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(response.data)))
  365. })
  366. }
  367. /** 过滤禁用的部门 */
  368. function filterDisabledDept(deptList) {
  369. return deptList.filter(dept => {
  370. if (dept.disabled) {
  371. return false
  372. }
  373. if (dept.children && dept.children.length) {
  374. dept.children = filterDisabledDept(dept.children)
  375. }
  376. return true
  377. })
  378. }
  379. /** 节点单击事件 */
  380. function handleNodeClick(data) {
  381. queryParams.value.deptId = data.id
  382. handleQuery()
  383. }
  384. /** 搜索按钮操作 */
  385. function handleQuery() {
  386. queryParams.value.pageNum = 1
  387. getList()
  388. }
  389. /** 重置按钮操作 */
  390. function resetQuery() {
  391. dateRange.value = []
  392. proxy.resetForm("queryRef")
  393. queryParams.value.deptId = undefined
  394. proxy.$refs.deptTreeRef.setCurrentKey(null)
  395. handleQuery()
  396. }
  397. /** 删除按钮操作 */
  398. function handleDelete(row) {
  399. const userIds = row.userId || ids.value
  400. proxy.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function () {
  401. return delUser(userIds)
  402. }).then(() => {
  403. getList()
  404. proxy.$modal.msgSuccess("删除成功")
  405. }).catch(() => {
  406. })
  407. }
  408. /** 导出按钮操作 */
  409. function handleExport() {
  410. proxy.download("system/user/export", {
  411. ...queryParams.value,
  412. }, `user_${new Date().getTime()}.xlsx`)
  413. }
  414. /** 用户状态修改 */
  415. function handleStatusChange(row) {
  416. let text = row.status === "0" ? "启用" : "停用"
  417. proxy.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
  418. return changeUserStatus(row.userId, row.status)
  419. }).then(() => {
  420. proxy.$modal.msgSuccess(text + "成功")
  421. }).catch(function () {
  422. row.status = row.status === "0" ? "1" : "0"
  423. })
  424. }
  425. /** 更多操作 */
  426. function handleCommand(command, row) {
  427. switch (command) {
  428. case "handleResetPwd":
  429. handleResetPwd(row)
  430. break
  431. case "handleAuthRole":
  432. handleAuthRole(row)
  433. break
  434. default:
  435. break
  436. }
  437. }
  438. /** 跳转角色分配 */
  439. function handleAuthRole(row) {
  440. const userId = row.userId
  441. router.push("/system/user-auth/role/" + userId)
  442. }
  443. /** 重置密码按钮操作 */
  444. function handleResetPwd(row) {
  445. proxy.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
  446. confirmButtonText: "确定",
  447. cancelButtonText: "取消",
  448. closeOnClickModal: false,
  449. inputPattern: /^.{5,20}$/,
  450. inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
  451. inputValidator: (value) => {
  452. if (/<|>|"|'|\||\\/.test(value)) {
  453. return "不能包含非法字符:< > \" ' \\\ |"
  454. }
  455. },
  456. }).then(({value}) => {
  457. resetUserPwd(row.userId, value).then(response => {
  458. proxy.$modal.msgSuccess("修改成功,新密码是:" + value)
  459. })
  460. }).catch(() => {
  461. })
  462. }
  463. /** 选择条数 */
  464. function handleSelectionChange(selection) {
  465. ids.value = selection.map(item => item.userId)
  466. single.value = selection.length != 1
  467. multiple.value = !selection.length
  468. }
  469. // 下载模板
  470. const handleDownloadTemplate = () => {
  471. // 直接调用 download 方法,传入 URL 和文件名(可选)
  472. download('/system/user/importTemplate', {}, '用户模板.xlsx')
  473. }
  474. /** 导入按钮操作 */
  475. function handleImport() {
  476. upload.title = "用户导入"
  477. upload.open = true
  478. upload.selectedFile = null
  479. }
  480. /** 下载模板操作 */
  481. function importTemplate() {
  482. proxy.download("system/user/importTemplate", {}, `user_template_${new Date().getTime()}.xlsx`)
  483. }
  484. /**文件上传中处理 */
  485. const handleFileUploadProgress = (event, file, fileList) => {
  486. upload.isUploading = true
  487. }
  488. /** 文件选择处理 */
  489. const handleFileChange = (file, fileList) => {
  490. upload.selectedFile = file
  491. }
  492. /** 文件删除处理 */
  493. const handleFileRemove = (file, fileList) => {
  494. upload.selectedFile = null
  495. }
  496. /** 文件上传成功处理 */
  497. const handleFileSuccess = (response, file, fileList) => {
  498. upload.open = false
  499. upload.isUploading = false
  500. proxy.$refs["uploadRef"].handleRemove(file)
  501. proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true})
  502. getList()
  503. }
  504. /** 提交上传文件 */
  505. function submitFileForm() {
  506. const file = upload.selectedFile
  507. if (!file || file.length === 0 || !file.name.toLowerCase().endsWith('.xls') && !file.name.toLowerCase().endsWith('.xlsx')) {
  508. proxy.$modal.msgError("请选择后缀为 “xls”或“xlsx”的文件。")
  509. return
  510. }
  511. proxy.$refs["uploadRef"].submit()
  512. }
  513. /** 重置操作表单 */
  514. function reset() {
  515. form.value = {
  516. userId: undefined,
  517. deptId: undefined,
  518. userName: undefined,
  519. nickName: undefined,
  520. password: undefined,
  521. phonenumber: undefined,
  522. email: undefined,
  523. sex: undefined,
  524. status: "0",
  525. remark: undefined,
  526. postIds: [],
  527. roleIds: []
  528. }
  529. proxy.resetForm("userRef")
  530. }
  531. /** 取消按钮 */
  532. function cancel() {
  533. open.value = false
  534. reset()
  535. }
  536. /** 新增按钮操作 */
  537. function handleAdd() {
  538. reset()
  539. getUser().then(response => {
  540. postOptions.value = response.posts
  541. roleOptions.value = response.roles
  542. open.value = true
  543. title.value = "添加用户"
  544. form.value.password = initPassword.value
  545. })
  546. }
  547. /** 修改按钮操作 */
  548. function handleUpdate(row) {
  549. reset()
  550. const userId = row.userId || ids.value
  551. getUser(userId).then(response => {
  552. form.value = response.data
  553. postOptions.value = response.posts
  554. roleOptions.value = response.roles
  555. form.value.postIds = response.postIds
  556. form.value.roleIds = response.roleIds
  557. open.value = true
  558. title.value = "修改用户"
  559. form.password = ""
  560. })
  561. }
  562. /** 提交按钮 */
  563. function submitForm() {
  564. proxy.$refs["userRef"].validate(valid => {
  565. if (valid) {
  566. if (form.value.userId != undefined) {
  567. updateUser(form.value).then(response => {
  568. proxy.$modal.msgSuccess("修改成功")
  569. open.value = false
  570. getList()
  571. })
  572. } else {
  573. addUser(form.value).then(response => {
  574. proxy.$modal.msgSuccess("新增成功")
  575. open.value = false
  576. getList()
  577. })
  578. }
  579. }
  580. })
  581. }
  582. onMounted(() => {
  583. getDeptTree()
  584. getList()
  585. proxy.getConfigKey("sys.user.initPassword").then(response => {
  586. initPassword.value = response.msg
  587. })
  588. })
  589. </script>