index.vue 21 KB

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