You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1364 lines
45 KiB

3 weeks ago
1 month ago
3 weeks ago
3 weeks ago
4 weeks ago
1 month ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
2 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
2 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
  1. <script setup>
  2. import { ref, onMounted, reactive, computed, watch } from 'vue'
  3. import ElementPlus from 'element-plus'
  4. import { ElMessage, ElMessageBox } from 'element-plus'
  5. import axios from 'axios'
  6. import moment from 'moment'
  7. import { InfoFilled, UserFilled } from '@element-plus/icons-vue'
  8. import _ from 'lodash'
  9. import request from '@/util/http'
  10. import API from '@/util/http'
  11. import { } from 'vue';
  12. // 客户明细表格 什么表格???????
  13. const tableData = ref([])
  14. const roleData = ref([])
  15. const total = ref(100)
  16. const roleTotal = ref(100)//角色分页
  17. const checkTab = ref('admin')
  18. // 搜索admin
  19. const admin = ref({
  20. account: '',
  21. market: '',
  22. postiton: ''
  23. })
  24. // 角色搜索
  25. const role = ref({
  26. name: ''
  27. })
  28. // 搜索对象
  29. const getObj = ref({
  30. pageNum: 1,
  31. pageSize: 10
  32. })
  33. // 角色搜索对象
  34. const getRoleObj = ref({
  35. pageNum: 1,
  36. pageSize: 10
  37. })
  38. // 新增用户权限弹窗
  39. const userAddVisible = ref(false)
  40. // 编辑用户权限弹窗
  41. const userEditVisible = ref(false)
  42. //选地区
  43. const market = ref([])
  44. // 选部门
  45. const postiton = ref([])
  46. // 新增用户对象
  47. const userAddObj = ref({})
  48. // 新增角色弹窗
  49. const permissionAddVisible = ref(false)
  50. // 新增用户权限对象,机器码要实现存储多个,addMachineIdInput方法实现
  51. const addAdmin = ref({
  52. account: '',
  53. name: '',
  54. market: [],
  55. permission: '',
  56. postiton: '',
  57. machineIds: [''], // 动态添加的机器码输入框
  58. machineId: '',
  59. remark: ''
  60. })
  61. // 新增角色对象
  62. const addRole = ref({
  63. roleName: '',
  64. parentId: null,
  65. checkedKeys: [],
  66. grade: '',
  67. market: ''
  68. })
  69. const addRoleMarket = ref([])
  70. // 新增角色的权限列表
  71. const permissionSelect = ref()
  72. //这是获取用户信息的接口
  73. const adminData = ref({})
  74. const getAdminData = async function () {
  75. try {
  76. const result = await API({ url: '/admin/userinfo', data: {} })
  77. adminData.value = result
  78. // console.log('请求成功', result)
  79. console.log('管理员用户信息', adminData.value)
  80. } catch (error) {
  81. console.log('请求失败', error)
  82. }
  83. }
  84. // 编辑用户权限对象
  85. const permissionEditObj = ref({
  86. checkedKeys: [],
  87. machineIds: [''],
  88. machineId: '',
  89. password: '',
  90. })
  91. const addMachineIdInput = function () {
  92. if (addAdmin.value.machineIds.length >= 2) {
  93. ElMessage.warning('设备数量已达上限')
  94. return
  95. }
  96. addAdmin.value.machineIds.push('')
  97. }
  98. const UseraddMachineIdInput = function () {
  99. if (permissionEditObj.value.machineIds.length >= 2) {
  100. ElMessage.warning('设备数量已达上限')
  101. return
  102. }
  103. permissionEditObj.value.machineIds.push('')
  104. }
  105. // 删除权限对象
  106. const delObj = ref({})
  107. // 删除角色对象
  108. const delRoleObj = ref({})
  109. const get = async function (val) {
  110. try {
  111. if (typeof val === 'number') {
  112. getObj.value.pageNum = val
  113. }
  114. console.log('搜索参数', getObj.value, admin.value)
  115. const result = await request({
  116. url: '/permission/getPermission',
  117. data: {
  118. ...getObj.value,
  119. permission: {
  120. ...admin.value
  121. }
  122. }
  123. })
  124. tableData.value = result.data.list
  125. console.log('tableData', tableData.value)
  126. total.value = result.data.total
  127. } catch (error) {
  128. console.log('请求失败', error)
  129. }
  130. }
  131. const getRoleList = async function (val) {
  132. try {
  133. if (typeof val === 'number') {
  134. getObj.value.pageNum = val
  135. }
  136. console.log('搜索参数', getObj.value, role.value)
  137. const result = await request({
  138. url: '/role/selectBy',
  139. data: {
  140. ...getRoleObj.value,
  141. roleVo: {
  142. roleName: role.value.name
  143. }
  144. }
  145. })
  146. roleData.value = result.data.list
  147. console.log('roleData', roleData.value)
  148. roleTotal.value = result.data.total
  149. } catch (error) {
  150. console.log('请求失败', error)
  151. }
  152. }
  153. // 试试D老师的方法
  154. const formatPermissions = (tree) => {
  155. if (!tree || tree.length === 0) return '';
  156. return tree.map(menu => {
  157. const mainMenu = menu.menuName;
  158. const subMenus = menu.children?.map(child => child.menuName) || [];
  159. // 如果有子菜单,显示前2个子菜单名称
  160. if (subMenus.length > 0) {
  161. const maxSub = Math.min(2, subMenus.length);
  162. const subText = subMenus.slice(0, maxSub).join('、');
  163. const moreText = subMenus.length > maxSub ? '...' : '';
  164. return `${mainMenu}+${subText}${moreText}`;
  165. }
  166. // 没有子菜单时只显示主菜单
  167. return mainMenu;
  168. }).join('+');
  169. };
  170. const trimJwCode = () => {
  171. if (admin.value.account) {
  172. admin.value.account = admin.value.account.replace(/\s/g, '');
  173. }
  174. }
  175. const search = function () {
  176. trimJwCode();
  177. getObj.value.pageNum = 1
  178. get()
  179. }
  180. const searchRole = function () {
  181. trimJwCode();
  182. getObj.value.pageNum = 1
  183. getRoleList()
  184. }
  185. // 重置
  186. const reset = function () {
  187. admin.value = {}
  188. }
  189. const getArea = async function () {
  190. try {
  191. const result = await request({
  192. url: '/permission/getmarket',
  193. data: {}
  194. })
  195. market.value = result.data
  196. } catch (error) {
  197. console.log('请求失败', error)
  198. }
  199. }
  200. // 获取部门
  201. const getStore = async function () {
  202. try {
  203. const result = await request({
  204. url: '/permission/getposition',
  205. data: {}
  206. })
  207. postiton.value = result.data
  208. } catch (error) {
  209. console.log('请求失败', error)
  210. }
  211. }
  212. // 打开新增用户权限弹窗
  213. const openUserAddVisible = function () {
  214. getRoles()
  215. userAddVisible.value = true
  216. addAdmin.value = {
  217. account: '',
  218. name: '',
  219. market: '',
  220. permission: '',
  221. postiton: '',
  222. machineId: '',
  223. machineIds: [''],
  224. remark: ''
  225. };
  226. }
  227. // 新增角色弹窗
  228. const openPermissionAddVisible = function () {
  229. permissionAddVisible.value = true
  230. getRoles()
  231. getLists()
  232. }
  233. // 关闭新增用户权限弹窗,并刷新表单
  234. const closeUserAddVisible = function () {
  235. addAdmin.value = {
  236. account: '',
  237. name: '',
  238. market: '',
  239. permission: '',
  240. postiton: '',
  241. machineId: '',
  242. machineIds: [''],
  243. remark: ''
  244. };
  245. userAddVisible.value = false;
  246. // 清除表单验证状态
  247. Ref.value.resetFields();
  248. }
  249. const closePermissionAddVisible = function () {
  250. addRole.value = {
  251. roleName: '',
  252. parentId: null,
  253. checkedKeys: [],
  254. grade: '',
  255. market: ''
  256. }
  257. permissionAddVisible.value = false
  258. Ref.value.resetFields();
  259. getRoleList()
  260. }
  261. // 新增用户权限初始化
  262. const userAddInit = function () {
  263. userAddObj.value = {}
  264. openUserAddVisible()
  265. }
  266. // 新增角色初始化
  267. const permissionAddInit = function () {
  268. const addRole = ref({
  269. roleName: '',
  270. parentId: null,
  271. checkedKeys: [],
  272. grade: '',
  273. market: ''
  274. })
  275. openPermissionAddVisible()
  276. }
  277. //新增用户
  278. const permissionAdd = async function () {
  279. try {
  280. await new Promise((resolve, reject) => {
  281. Ref.value.validate((valid) => {
  282. if (valid) {
  283. resolve(); // 验证通过,继续执行后续代码
  284. } else {
  285. reject(new Error('请检查并完善表单信息')); // 验证失败,抛出错误
  286. }
  287. });
  288. });
  289. addAdmin.value.adminFlag = 1
  290. addAdmin.value.status1 = 1
  291. if (addAdmin.value.postiton == '管理员') {
  292. addAdmin.value.postiton == 1
  293. }
  294. const params = {
  295. "account": addAdmin.value.account,//OA号
  296. "adminName": addAdmin.value.name,//姓名
  297. "market": addAdmin.value.market,//地区
  298. "roleId": addAdmin.value.permission,//权限ID
  299. "postiton": addAdmin.value.postiton,//职位
  300. "machineId": addAdmin.value.machineIds[0],//机器码
  301. "remark": addAdmin.value.remark//备注
  302. }
  303. const result = await request({
  304. url: '/permission/addPermission',
  305. data: params
  306. })
  307. console.log(addAdmin.value)
  308. if (result.code == 200) {
  309. ElMessage.success('添加成功')
  310. } else {
  311. ElMessage.error(result.msg)
  312. }
  313. addAdmin.value = {}
  314. get()
  315. closeUserAddVisible()
  316. } catch (error) {
  317. console.log('新增用户权限失败', error)
  318. ElMessage.error('新增用户权限失败')
  319. }
  320. }
  321. const addUserRules = {
  322. account: [
  323. { required: true, message: '请输入OA号', trigger: 'blur' }
  324. ],
  325. name: [
  326. { required: true, message: '请输入用户名', trigger: 'blur' }
  327. ],
  328. market: [
  329. { required: true, message: '请选择所属地区', trigger: 'change' }
  330. ],
  331. permission: [
  332. { required: true, message: '请选择角色名称', trigger: 'change' }
  333. ],
  334. postiton: [
  335. { required: true, message: '请输入职位', trigger: 'blur' }
  336. ],
  337. machineIds: [
  338. {
  339. required: true,
  340. message: '请至少输入一个机器码',
  341. trigger: 'change',
  342. validator: (rule, value, callback) => {
  343. // 检查是否有非空的机器码
  344. const hasValid = value.some(item => item.trim() !== '');
  345. if (!hasValid) {
  346. callback(new Error('请至少输入一个机器码'));
  347. } else {
  348. callback();
  349. }
  350. }
  351. }
  352. ]
  353. };
  354. // 表单验证ref
  355. const Ref = ref(null)
  356. // 使用 _.throttle 并设置 trailing 为 false 实现严格节流,只执行一次
  357. const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
  358. trailing: false
  359. })
  360. // 权限类别
  361. const permissionList = ref([])
  362. const getRoles = async function () {
  363. try {
  364. const res = await API({ url: '/role/selectAll' })
  365. permissionList.value = res.data.map(item => ({
  366. label: item.roleName,
  367. value: item.id
  368. }))
  369. console.log('权限列表:', permissionList.value)
  370. } catch (error) {
  371. console.error('获取权限列表失败:', error)
  372. }
  373. }
  374. // 打开编辑用户权限弹窗
  375. const openUserEditVisible = function () {
  376. getRoles()
  377. userEditVisible.value = true
  378. }
  379. // 关闭编辑用户权限弹窗
  380. const closeUserEditVisible = function () {
  381. userEditVisible.value = false
  382. }
  383. // 编辑用户权限初始化
  384. const permissionEditInit = async function (row) {
  385. console.log('row', row)
  386. permissionEditObj.value = {}
  387. permissionEditObj.value.id = row.id
  388. permissionEditObj.value.account = row.account
  389. permissionEditObj.value.adminName = row.name
  390. permissionEditObj.value.remark = row.remark
  391. permissionEditObj.value.market = row.market
  392. permissionEditObj.value.password = ''
  393. // 将字符串形式的 market 转换为数组
  394. if (typeof row.market === 'string' && row.market) {
  395. permissionEditObj.value.market = row.market.split(',');
  396. } else {
  397. // 处理空值或非字符串情况
  398. permissionEditObj.value.market = [];
  399. }
  400. permissionEditObj.value.postiton = row.postiton
  401. permissionEditObj.value.roleId = row.roleId
  402. const result = await request({
  403. url: '/role/selectFather',
  404. data: {
  405. id: row.roleId
  406. }
  407. })
  408. console.log('初始查上级权限', result)
  409. permissionEditObj.value.parentId = result.data?.fatherId
  410. permissionEditObj.value.parentName = result.data?.fatherName
  411. console.log('get前', permissionEditObj.value.roleId);
  412. getUserLists(row.roleId)
  413. let machineIdsRef = await request({
  414. url: '/permission/getPermission',
  415. data: {
  416. "pageNum": 1,//页码数
  417. "pageSize": 1,//页条数
  418. "permission": {
  419. account: row.account,//OA号
  420. }
  421. }
  422. })
  423. if (machineIdsRef.data.list[0].machineIds == null || machineIdsRef.data.list[0].machineIds.length == 0) {
  424. permissionEditObj.value.machineIds = ['']
  425. } else {
  426. permissionEditObj.value.machineIds = machineIdsRef.data.list[0].machineIds
  427. }
  428. permissionEditObj.value.machineId = permissionEditObj.value.machineIds[0]
  429. //permissionEditObj.value.permission = row.permission
  430. permissionEditObj.value.roleName = row.roleName
  431. console.log('编辑用户权限', permissionEditObj.value)
  432. console.log('11111111111111', permissionEditObj.value.machineId)
  433. openUserEditVisible()
  434. }
  435. const collectIds = (tree) => {
  436. let ids = [];
  437. tree.forEach((node) => {
  438. ids.push(node.id);
  439. if (node.children && node.children.length > 0) {
  440. ids = ids.concat(collectIds(node.children));
  441. }
  442. });
  443. return ids;
  444. };
  445. // 定义上级角色提示变量
  446. const parentRoleTip = ref('');
  447. //给data数据加上disabled属性,控制是否禁用
  448. function processTreeData(data) {
  449. return data.map(item => ({
  450. ...item,
  451. disabled: item.id != null || item.menuName.includes("敏感权限"), //控制权限显示的条件
  452. children: item.children ? processTreeData(item.children) : []
  453. }));
  454. }
  455. //根据上级角色控制权限列表,选择角色调整上级角色
  456. const getUserLists = async function (selectedRoleId) {
  457. try {
  458. console.log('permissionEditObj.value.roleId:', permissionEditObj.value.roleId)
  459. console.log('selectedRoleId', selectedRoleId);
  460. permissionEditObj.value.parentId = null;
  461. permissionEditObj.value.parentName = '';
  462. permissionEditObj.value.checkedKeys = [];
  463. parentRoleTip.value = '';
  464. const parentRes = await request({
  465. url: '/role/selectFather',
  466. data: { id: selectedRoleId } // 用选中的角色ID请求
  467. });
  468. const parentId = parentRes.data.fatherId;
  469. const parentName = parentRes.data.parentName;
  470. permissionEditObj.value.parentId = parentId;
  471. permissionEditObj.value.parentName = parentName;
  472. if (parentId == null) {
  473. // 无上级角色:显示提示
  474. parentRoleTip.value = '该角色无上级角色';
  475. }
  476. let roleId = permissionEditObj.value.roleId
  477. if (permissionEditObj.value.parentId === null || permissionEditObj.value.parentId === undefined) {
  478. roleId = 2
  479. }
  480. const res = await API({
  481. url: '/menu/tree',
  482. data: { id: roleId }
  483. })
  484. data.value = processTreeData(res.data)
  485. permissionEditObj.value.checkedKeys = collectIds(res.data) || [];
  486. console.log('看看data', data.value)
  487. console.log('看checkedKeys', permissionEditObj.value.checkedKeys)
  488. console.log('parentID:', permissionEditObj.value.parentId, 'roleId:', roleId)
  489. console.log('permissionEditObj.value.roleId:', permissionEditObj.value.roleId)
  490. } catch (error) {
  491. console.log('请求失败', error)
  492. }
  493. }
  494. // 编辑用户权限提交
  495. const permissionEdit = async function () {
  496. const { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value;
  497. const newRole = permissionList.value.find(item => item.value === newRoleId)?.label || '未知角色';
  498. try {
  499. await ElMessageBox.confirm(
  500. `确认修改权限角色?\n您正在将【${userName}】的权限角色从【${oldRole}】修改为【${newRole}\n变更后,该用户的可操作权限将同步更新为新角色配置,涉及数据访问、功能操作等权限变化,请谨慎确认。`,
  501. '警告',
  502. {
  503. confirmButtonText: '确认',
  504. cancelButtonText: '取消',
  505. type: "warning",
  506. lockScroll: false
  507. }
  508. );
  509. closeUserEditVisible();
  510. const result = await request({
  511. url: '/permission/updateAdmin',
  512. data: {
  513. account: permissionEditObj.value.account,//OA号
  514. adminName: permissionEditObj.value.adminName,//姓名
  515. market: permissionEditObj.value.market,//地区
  516. postiton: permissionEditObj.value.postiton,//职位
  517. roleId: permissionEditObj.value.roleId,//角色id
  518. machineId: permissionEditObj.value.machineIds[0],//机器码
  519. machineIds: permissionEditObj.value.machineIds[1],//机器码
  520. password: permissionEditObj.value.password,//
  521. remark: permissionEditObj.value.remark//备注
  522. }
  523. });
  524. console.log('编辑最后提交数据', permissionEditObj.value);
  525. if (result.code == 200) {
  526. await ElMessageBox.alert(
  527. `用户${userName}的权限角色已更改为【${newRole}`,
  528. '成功',
  529. {
  530. confirmButtonText: '确定',
  531. type: 'success' // 设置为 success 类型
  532. }
  533. );
  534. get();
  535. } else {
  536. ElMessage.error(result.msg)
  537. }
  538. } catch (error) {
  539. console.log('编辑用户权限失败', error)
  540. ElMessage.error('编辑用户权限失败')
  541. closeUserEditVisible()
  542. }
  543. }
  544. const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
  545. trailing: false
  546. })
  547. // 删除初始化
  548. const del = function (row) {
  549. delObj.value = {}
  550. console.log(row, '删除初始化')
  551. delObj.value.account = row.account
  552. delObj.value.id = row.id
  553. }
  554. // 删除权限
  555. const delConfirm = async function () {
  556. try {
  557. const result = await request({
  558. url: '/permission/deleteAdmin',
  559. data: delObj.value
  560. })
  561. console.log('看看删除对象', delObj.value)
  562. console.log('请求成功1', result)
  563. ElMessage.success('删除权限成功')
  564. delObj.value = {}
  565. get()
  566. } catch (error) {
  567. console.log('删除权限失败', error)
  568. ElMessage.error('删除权限失败')
  569. }
  570. }
  571. // 删除角色初始化
  572. const delRole = function (row) {
  573. delRoleObj.value = {}
  574. console.log(row, '删除初始化')
  575. delRoleObj.value.id = row.id
  576. }
  577. // 删除角色
  578. const delRoleConfirm = async function () {
  579. try {
  580. const result = await request({
  581. url: '/role/delete',
  582. data: delRoleObj.value
  583. })
  584. console.log('看看删除角色对象', delRoleObj.value)
  585. console.log('请求成功2', result)
  586. ElMessage.success('删除权限成功')
  587. delRoleObj.value = {}
  588. getRoleList()
  589. } catch (error) {
  590. console.log('删除权限失败', error)
  591. ElMessage.error('删除权限失败')
  592. }
  593. }
  594. const handleAddRole = async function () {
  595. try {
  596. await new Promise((resolve, reject) => {
  597. Ref.value.validate((valid) => {
  598. if (valid) {
  599. resolve(); // 验证通过,继续执行后续代码
  600. } else {
  601. reject(new Error('请检查并完善表单信息')); // 验证失败,抛出错误
  602. }
  603. });
  604. });
  605. const res = await API({
  606. url: '/role/add',
  607. data: {
  608. "roleName": addRole.value.roleName,
  609. "menuIds": addRole.value.checkedKeys,
  610. "priority": addRole.value.grade,
  611. "fatherId": addRole.value.parentId,
  612. "market": addRole.value.market
  613. }
  614. })
  615. if (res.code == 200) {
  616. ElMessage.success('角色' + addRole.value.roleName + '添加成功')
  617. console.log('成功了,看看addRole', addRole.value)
  618. closePermissionAddVisible()
  619. } else {
  620. ElMessage.error(res.msg)
  621. }
  622. } catch (error) {
  623. console.log('请求失败', error)
  624. console.log('失败,看看addRole', addRole.value);
  625. }
  626. }
  627. // 禁用启用用户权限
  628. const editStatus = async function (row) {
  629. try {
  630. console.log(row)
  631. permissionEditObj.value = {}
  632. permissionEditObj.value.id = row.id
  633. permissionEditObj.value.account = row.account
  634. permissionEditObj.value.adminStatus = row.adminStatus
  635. console.log('修改用户权限状态', permissionEditObj.value)
  636. const result = await request({
  637. url: '/permission/upadatePermission',
  638. data: permissionEditObj.value
  639. })
  640. console.log('请求成功2', result)
  641. ElMessage.success(
  642. permissionEditObj.value.adminStatus == 1 ? '启用成功' : '禁用成功'
  643. )
  644. permissionEditObj.value = {}
  645. get()
  646. } catch (error) {
  647. console.log('修改用户权限失败', error)
  648. }
  649. }
  650. const handlePageSizeChange = function (val) {
  651. getObj.value.pageSize = val
  652. get()
  653. }
  654. const handleCurrentChange = function (val) {
  655. getObj.value.pageNum = val
  656. get()
  657. }
  658. const handleRolePageSizeChange = (val) => {
  659. getRoleObj.value.pageSize = val
  660. getRoleList() // 调用角色管理的查询
  661. }
  662. // 角色管理分页 - 当前页变化
  663. const handleRoleCurrentChange = (val) => {
  664. getRoleObj.value.pageNum = val
  665. getRoleList() // 调用角色管理的查询
  666. }
  667. const data = ref([])
  668. const getLists = async function () {
  669. try {
  670. let roleId = addRole.value.parentId
  671. if (addRole.value.parentId === null || addRole.value.parentId === undefined) {
  672. roleId = 2
  673. }
  674. const res = await API({
  675. url: '/menu/tree',
  676. data: { id: roleId }
  677. })
  678. data.value = res.data
  679. if (addRole.value.parentId != 2) {
  680. data.value = data.value.filter(item => item.id !== 9);
  681. }
  682. console.log('看看data', data.value)
  683. console.log('parentID:', addRole.value.parentId, 'roleId:', roleId)
  684. if (addRole.value.parentId) {
  685. const result = await API({
  686. url: '/general/roleMarket',
  687. data: { id: addRole.value.parentId }
  688. })
  689. if (result.code == 200) {
  690. if (typeof result.data === 'string' && result.data) {
  691. addRoleMarket.value = result.data.split(',');
  692. } else if (Array.isArray(result.data)) {
  693. addRoleMarket.value = result.data
  694. }
  695. else {
  696. addRoleMarket.value = [];
  697. }
  698. } else {
  699. ElMessage.error('该上级角色无所属地区')
  700. console.log('该上级角色无所属地区');
  701. }
  702. console.log('addRoleMarket.value', addRoleMarket.value);
  703. } else {
  704. if (typeof adminData.value.markets === 'string' && adminData.value.markets) {
  705. addRoleMarket.value = adminData.value.markets.split(',');
  706. } else if (Array.isArray(adminData.value.markets)) {
  707. addRoleMarket.value = adminData.value.markets
  708. }
  709. else {
  710. addRoleMarket.value = [];
  711. }
  712. }
  713. } catch (error) {
  714. console.log('请求失败', error)
  715. }
  716. }
  717. const handleMarketChange = (values) => {
  718. console.log('values的类型:', typeof values);
  719. console.log('values的值:', values);
  720. //判断是否选择了总部
  721. const hasHeadquarters = values.includes('总部');
  722. if (hasHeadquarters) {
  723. // 如果选择了总部,只保留总部
  724. addAdmin.value.market = ['总部'];
  725. }
  726. console.log('看看现在的地区', addAdmin.value.market);
  727. };
  728. const includeHq = computed(() => {
  729. const i = addAdmin.value.market.includes('总部')
  730. return (item) => i && item != '总部'
  731. })
  732. const EditincludeHq = computed(() => {
  733. const i = permissionEditObj.value.market.includes('总部')
  734. return (item) => i && item != '总部'
  735. })
  736. const EdithandleMarketChange = (values) => {
  737. //判断是否选择了总部
  738. const hasHeadquarters = values.includes('总部');
  739. if (hasHeadquarters) {
  740. // 如果选择了总部,只保留总部
  741. permissionEditObj.value.market = ['总部'];
  742. }
  743. console.log('看看现在的地区', permissionEditObj.value.market);
  744. };
  745. const handleCheckChange = async (checkedNodes, checkedInfo) => {
  746. const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo;
  747. // 判断是否有选中的节点(避免空数组报错)
  748. if (allCheckedNodes.length === 0) return;
  749. // 取第一个选中的节点
  750. const node = allCheckedNodes[0];
  751. // 选中状态
  752. const checked = checkedKeys.includes(node.id);
  753. console.log('checkedInfo', checkedInfo);
  754. console.log('node', node);
  755. console.log('checked', checked);
  756. if (checked) {
  757. const newCheckedKeys = [...checkedInfo.checkedKeys];
  758. console.log('初始选中项:', newCheckedKeys);
  759. // 执行递归前先清空可能的重复父级(可选优化)
  760. const uniqueKeys = [...new Set(newCheckedKeys)];
  761. selectParentNodes(data.value, node.id, uniqueKeys);
  762. console.log('包含父级的选中项:', uniqueKeys);
  763. addRole.value.checkedKeys = uniqueKeys;
  764. } else {
  765. addRole.value.checkedKeys = checkedInfo.checkedKeys;
  766. console.log('else');
  767. }
  768. };
  769. const selectParentNodes = (treeData, nodeId, checkedKeys) => {
  770. if (!Array.isArray(treeData)) return false;
  771. for (const item of treeData) {
  772. if (item.children && Array.isArray(item.children) && item.children.length > 0) {
  773. const found = selectParentNodes(item.children, nodeId, checkedKeys);
  774. if (found) {
  775. // 避免重复添加父级
  776. if (!checkedKeys.includes(item.id)) {
  777. checkedKeys.push(item.id);
  778. }
  779. return true;
  780. }
  781. }
  782. if (item.id === nodeId) {
  783. return true;
  784. }
  785. }
  786. return false;
  787. };
  788. //点击角色权限菜单树点击展示逻辑
  789. const menuTreeVisible = ref(false);
  790. const currentRoleMenuTree = ref([]);
  791. const currentRoleName = ref('');
  792. const Rolecheckedkeys = ref([])
  793. const showMenuTree = (treeData, roleName) => {
  794. currentRoleMenuTree.value = processTreeData(treeData) || [];
  795. console.log('currentRoleMenuTree.value', currentRoleMenuTree.value);
  796. Rolecheckedkeys.value = collectIds(treeData)
  797. console.log('Rolecheckedkeys', Rolecheckedkeys.value);
  798. currentRoleName.value = roleName || '权限详情';
  799. menuTreeVisible.value = true;
  800. };
  801. // 重置密码弹窗状态
  802. const resetConfirmVisible = ref(false)
  803. // 当前选中的行数据
  804. const currentRow = ref(null)
  805. // 重置密码
  806. const resetPassword = function (row) {
  807. // 显示确认弹窗
  808. currentRow.value = row
  809. resetConfirmVisible.value = true
  810. }
  811. // 确认重置密码
  812. const confirmResetPassword = async function () {
  813. console.log('重置密码markets1', adminData.value.markets)
  814. // 处理markets数据
  815. if (typeof adminData.value.markets === 'string' && adminData.value.markets) {
  816. adminData.value.markets = adminData.value.markets.split(',');
  817. } else if (Array.isArray(adminData.value.markets)) {
  818. // 不处理
  819. }
  820. else {
  821. adminData.value.markets = [];
  822. }
  823. console.log('重置密码markets2', adminData.value.markets)
  824. // 权限检查
  825. if (adminData.value.markets.includes(currentRow.value.market) || adminData.value.markets[0] === '总部') {
  826. console.log('符合条件,可以操作', adminData.value.markets.includes(currentRow.value.market) || adminData.value.markets[0] === '总部');
  827. const params = {
  828. account: currentRow.value.account,
  829. }
  830. console.log(params);
  831. // 发送请求
  832. try {
  833. const result = await request({
  834. url: '/admin/reset',
  835. method: 'post',
  836. data: params // 直接传递params对象
  837. });
  838. if (result.code === 200) { // 使用严格相等运算符
  839. ElMessage.success('重置密码成功');
  840. resetConfirmVisible.value = false; // 关闭弹窗
  841. } else {
  842. ElMessage.error(result.message || '重置密码失败');
  843. }
  844. } catch (error) {
  845. ElMessage.error('重置密码失败');
  846. console.error('请求错误:', error);
  847. }
  848. } else {
  849. // console.log("为什么不能重置",adminData.value.markets)
  850. ElMessage.error('您没有修改' + currentRow.value.market + '地区的用户密码的权限');
  851. resetConfirmVisible.value = false; // 关闭弹窗
  852. }
  853. }
  854. // 取消重置密码
  855. const cancelResetPassword = function () {
  856. resetConfirmVisible.value = false
  857. }
  858. const Rolerules = reactive({
  859. roleName: [
  860. { required: true, message: '请输入角色名称', trigger: 'blur' },
  861. { min: 2, max: 20, message: '角色名称长度应在2-20个字符之间', trigger: 'blur' }
  862. ],
  863. market: [
  864. { required: true, message: '请选择所属地区', trigger: 'change' }
  865. ],
  866. grade: [
  867. { required: true, message: '请输入优先级', trigger: 'blur' },
  868. { pattern: /^[1-9]\d{0,2}$/, message: '优先级应为1-999的数字', trigger: 'blur' }
  869. ],
  870. checkedKeys: [
  871. {
  872. required: true,
  873. message: '请选择权限列表',
  874. trigger: 'change', // 选框变化或提交时触发,可根据实际调整
  875. validator: (rule, value, callback) => {
  876. if (value && value.length > 0) {
  877. callback(); // 有选中项,校验通过
  878. } else {
  879. callback(new Error('请选择权限列表')); // 未选中,抛出错误提示
  880. }
  881. }
  882. }
  883. ]
  884. });
  885. // 挂载
  886. onMounted(async function () {
  887. await getAdminData()
  888. await get()
  889. await getArea()
  890. await getStore()
  891. await getRoleList()
  892. })
  893. </script>
  894. <template>
  895. <div style="margin-bottom:20px">
  896. <el-button-group>
  897. <el-button :type="checkTab === 'admin' ? 'primary' : 'default'" @click="checkTab = 'admin'">
  898. 用户管理
  899. </el-button>
  900. <el-button :type="checkTab === 'role' ? 'primary' : 'default'" @click="checkTab = 'role'">
  901. 角色管理
  902. </el-button>
  903. </el-button-group>
  904. </div>
  905. <div v-show="checkTab === 'admin'">
  906. <!-- 用户搜索和展示 -->
  907. <el-row>
  908. <el-col>
  909. <el-card style="margin-bottom: 20px">
  910. <div class="head-card">
  911. <div class="head-card-element">
  912. <el-text class="mx-1" size="large">OA号</el-text>
  913. <el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable />
  914. </div>
  915. <div class="head-card-element" style="margin-left: 50px">
  916. <el-text class="mx-1" size="large">所属地区</el-text>
  917. <el-select v-model="admin.market" placeholder="请选择所属地区" style="width: 240px" clearable>
  918. <el-option v-for="item in market" :key="item" :label="item" :value="item" />
  919. </el-select>
  920. </div>
  921. <div class="head-card-element" style="margin-left: 50px">
  922. <el-text class="mx-1" size="large">职位名称</el-text>
  923. <el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable>
  924. <el-option v-for="item in postiton" :key="item" :label="item" :value="item" />
  925. </el-select>
  926. </div>
  927. <div class="head-card-btn">
  928. <el-button type="success" @click="reset()">重置</el-button>
  929. <el-button type="primary" @click="search()">查询</el-button>
  930. </div>
  931. </div>
  932. </el-card>
  933. </el-col>
  934. </el-row>
  935. <el-row>
  936. <el-col>
  937. <el-card>
  938. <!-- 展示表单 -->
  939. <div class="add-item">
  940. <el-button style="color: #048efb; border: 1px solid #048efb" @click="userAddInit()">新增用户</el-button>
  941. </div>
  942. <div>
  943. <el-table :data="tableData" style="width: 100%" show-overflow-tooltip>
  944. <el-table-column type="index" label="序号" width="100px" fixed="left">
  945. <template #default="scope">
  946. <span>{{
  947. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  948. }}</span>
  949. </template>
  950. </el-table-column>
  951. <el-table-column prop="account" label="OA号" />
  952. <el-table-column prop="name" label="姓名" />
  953. <el-table-column prop="market" label="所属地区" />
  954. <el-table-column prop="postiton" label="职位" />
  955. <el-table-column prop="roleName" label="部门权限">
  956. </el-table-column>
  957. <el-table-column prop="remark" label="备注" />
  958. <el-table-column prop="operation" label="操作" width="280px">
  959. <template #default="scope">
  960. <el-button type="warning" text @click="resetPassword(scope.row)">
  961. 重置密码
  962. </el-button>
  963. <el-button type="primary" text @click="permissionEditInit(scope.row)"
  964. :disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
  965. 修改权限
  966. </el-button>
  967. <el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
  968. <template #reference>
  969. <el-button type="danger" text @click="del(scope.row)"
  970. :disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
  971. 删除
  972. </el-button>
  973. </template>
  974. <template #actions="{ confirm, cancel }">
  975. <el-button size="small" @click="cancel">取消</el-button>
  976. <el-button type="primary" size="small" @click="confirm">
  977. 确定
  978. </el-button>
  979. </template>
  980. </el-popconfirm>
  981. </template>
  982. </el-table-column>
  983. <el-table-column prop="adminStatus" label="状态">
  984. <template #default="scope">
  985. <el-switch v-model="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
  986. :disabled="scope.row.account === adminData.account" @change="editStatus(scope.row)" style="
  987. --el-switch-on-color: #13ce66;
  988. --el-switch-off-color: #ff4949;
  989. " active-text="启用" inactive-text="禁用" inline-prompt />
  990. </template>
  991. </el-table-column>
  992. </el-table>
  993. </div>
  994. <!-- 分页 -->
  995. <div class="pagination" style="margin-top: 20px">
  996. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  997. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  998. @current-change="handleCurrentChange"></el-pagination>
  999. </div>
  1000. </el-card>
  1001. </el-col>
  1002. </el-row>
  1003. </div>
  1004. <div v-show="checkTab === 'role'">
  1005. <!-- 角色搜索 -->
  1006. <el-card style="margin-bottom: 20px">
  1007. <div class="head-card">
  1008. <el-text class="mx-1" size="large">角色名称</el-text>
  1009. <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
  1010. <div class="head-card-btn">
  1011. <el-button type="success" @click="reset()">重置</el-button>
  1012. <el-button type="primary" @click="searchRole()">查询</el-button>
  1013. </div>
  1014. </div>
  1015. </el-card>
  1016. <!-- 展示表单 -->
  1017. <el-card>
  1018. <div class="add-item">
  1019. <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增角色</el-button>
  1020. </div>
  1021. <div>
  1022. <el-table :data="roleData" style="width: 100%" show-overflow-tooltip>
  1023. <el-table-column type="index" label="序号" width="100px" fixed="left">
  1024. <template #default="scope">
  1025. <span>{{
  1026. scope.$index + 1 + (getRoleObj.pageNum - 1) * getRoleObj.pageSize
  1027. }}</span>
  1028. </template>
  1029. </el-table-column>
  1030. <el-table-column prop="roleName" label="角色名称" />
  1031. <el-table-column prop="fatherName" label="上级角色" />
  1032. <el-table-column prop="priority" label="优先级" />
  1033. <el-table-column label="权限范围" show-overflow-tooltip>
  1034. <template #default="scope">
  1035. <div class="permission-cell" @click="showMenuTree(scope.row.tree, scope.row.roleName)">
  1036. {{ formatPermissions(scope.row.tree) }}
  1037. </div>
  1038. </template>
  1039. </el-table-column>
  1040. <el-table-column prop="operation" label="操作" width="200px">
  1041. <template #default="scope">
  1042. <el-popconfirm title="确定将此角色删除吗?" @confirm="delRoleConfirm">
  1043. <template #reference>
  1044. <el-button type="danger" text @click="delRole(scope.row)"
  1045. :disabled="scope.row.id === 1 || scope.row.id === 2">
  1046. 删除
  1047. </el-button>
  1048. </template>
  1049. <template #actions="{ confirm, cancel }">
  1050. <el-button size="small" @click="cancel">取消</el-button>
  1051. <el-button type="primary" size="small" @click="confirm">
  1052. 确定
  1053. </el-button>
  1054. </template>
  1055. </el-popconfirm>
  1056. </template>
  1057. </el-table-column>
  1058. </el-table>
  1059. </div>
  1060. <!-- 分页 -->
  1061. <div class="pagination" style="margin-top: 20px">
  1062. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  1063. layout="total, sizes, prev, pager, next, jumper" :total="roleTotal" @size-change="handleRolePageSizeChange"
  1064. @current-change="handleRoleCurrentChange"></el-pagination>
  1065. </div>
  1066. </el-card>
  1067. </div>
  1068. <!-- 角色菜单树展示 -->
  1069. <el-dialog v-model="menuTreeVisible" :title='`权限详情:${currentRoleName}`' width="600px">
  1070. <el-tree :data="currentRoleMenuTree" node-key="id" :props="{ label: 'menuName', children: 'children' }"
  1071. show-checkbox check-strictly :expand-on-click-node="false"
  1072. :default-expanded-keys="currentRoleMenuTree.map(item => item.id)" :default-checked-keys="Rolecheckedkeys" />
  1073. <template #footer>
  1074. <el-button @click="menuTreeVisible = false" type="primary">关闭</el-button>
  1075. </template>
  1076. </el-dialog>
  1077. <!-- 新增用户权限 -->
  1078. <el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
  1079. <template #footer>
  1080. <!-- 居中显示 -->
  1081. <el-form ref="Ref" :rules="addUserRules" :model="addAdmin" label-width="auto"
  1082. style="max-width: 600px; align-items: center">
  1083. <el-form-item prop="account" label="OA号:" required clearable>
  1084. <el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px" />
  1085. </el-form-item>
  1086. <el-form-item prop="name" label="用户名:" required clearable>
  1087. <el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px" />
  1088. </el-form-item>
  1089. <el-form-item prop="market" label="所属地区:" required clearable>
  1090. <el-select multiple v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 440px" clearable
  1091. @change="handleMarketChange">
  1092. <el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="includeHq(item)" />
  1093. </el-select>
  1094. </el-form-item>
  1095. <el-form-item prop="permission" label="角色名称:" required>
  1096. <el-select v-model="addAdmin.permission" placeholder="请选择角色名称" style="width: 220px" clearable>
  1097. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1098. :value="item.value"></el-option>
  1099. </el-select>
  1100. </el-form-item>
  1101. <el-form-item prop="postiton" label="职位:" required>
  1102. <el-input v-model="addAdmin.postiton" placeholder="请输入职位" style="width: 220px" clearable />
  1103. </el-form-item>
  1104. <el-form-item prop="machineIds" label="机器码:" required>
  1105. <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
  1106. <!-- 动态添加的机器码输入框 -->
  1107. <div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;">
  1108. <el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
  1109. style="width: 180px; margin-right: 10px;" />
  1110. </div>
  1111. <el-button type="primary" @click="addMachineIdInput">添加</el-button>
  1112. </div>
  1113. </el-form-item>
  1114. <el-form-item prop="remark" label="备注">
  1115. <el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
  1116. type="textarea" />
  1117. </el-form-item>
  1118. </el-form>
  1119. <div>
  1120. <el-button @click="closeUserAddVisible()">取消</el-button>
  1121. <el-button type="primary" @click="throttledPermissionAdd()">
  1122. 提交
  1123. </el-button>
  1124. </div>
  1125. </template>
  1126. </el-dialog>
  1127. <!-- 这是编辑用户权限弹窗 -->
  1128. <el-dialog v-model="userEditVisible" title="编辑用户权限" width="800px" :close-on-click-modal="false">
  1129. <el-form ref="Ref" :model="permissionEditObj" label-width="auto" style="max-width: 600px; align-items: center">
  1130. <el-form-item prop="account" label="用户账号:" clearable>
  1131. <el-input v-model="permissionEditObj.account" placeholder="请输入OA号" style="width: 220px" disabled />
  1132. </el-form-item>
  1133. <el-form-item prop="name" label="用户名称:">
  1134. <el-input v-model="permissionEditObj.adminName" placeholder="请输入用户名" style="width: 220px" disabled />
  1135. </el-form-item>
  1136. <el-form-item prop="market" label="所属地区:" clearable>
  1137. <el-select multiple v-model="permissionEditObj.market" placeholder="请选择所属地区" style="width: 440px" clearable
  1138. @change="EdithandleMarketChange">
  1139. <el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="EditincludeHq(item)" />
  1140. </el-select>
  1141. </el-form-item>
  1142. <el-form-item prop="postiton" label="职位:">
  1143. <el-input v-model="permissionEditObj.postiton" placeholder="请输入职位" style="width: 220px" clearable />
  1144. </el-form-item>
  1145. <el-form-item prop="roleName" label="角色名称:">
  1146. <el-select v-model="permissionEditObj.roleId" placeholder="请选择角色" style="width: 220px" @change="getUserLists">
  1147. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1148. :value="item.value"></el-option>
  1149. </el-select>
  1150. </el-form-item>
  1151. <el-form-item prop="parentName" label="上级角色:">
  1152. <el-select v-model="permissionEditObj.parentId" placeholder="无上级角色" :disabled="!!parentRoleTip"
  1153. style="width: 220px">
  1154. <el-option v-if="parentRoleTip" :key="0" :label="parentRoleTip" :value="null" disabled />
  1155. <el-option v-else v-for="item in permissionList" :key="item.value" :label="item.label" disabled
  1156. :value="item.value"></el-option>
  1157. </el-select>
  1158. </el-form-item>
  1159. <el-form-item prop="permissionSelect" label="权限列表:">
  1160. <el-tree :data="data" :disabled="true" show-checkbox node-key="id"
  1161. :props="{ label: 'menuName', children: 'children' }" :default-checked-keys="permissionEditObj.checkedKeys">
  1162. </el-tree>
  1163. </el-form-item>
  1164. <el-form-item prop="machineIds" label="机器码:">
  1165. <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
  1166. <!-- 动态添加的机器码输入框 -->
  1167. <div v-for="(item, index) in permissionEditObj.machineIds" :key="index" style="margin-left: 10px;">
  1168. <el-input v-model="permissionEditObj.machineIds[index]" placeholder=""
  1169. style="width: 180px; margin-right: 10px;" />
  1170. </div>
  1171. <el-button type="primary" @click="UseraddMachineIdInput">添加</el-button>
  1172. </div>
  1173. </el-form-item>
  1174. </el-form>
  1175. <div>
  1176. </div>
  1177. <template #footer>
  1178. <div>
  1179. <el-button @click="closeUserEditVisible()">取消</el-button>
  1180. <el-button type="primary" @click="throttledPermissionEdit">
  1181. 提交
  1182. </el-button>
  1183. </div>
  1184. </template>
  1185. </el-dialog>
  1186. <!-- 新增角色 -->
  1187. <el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false">
  1188. <template #footer>
  1189. <el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto"
  1190. style="max-width: 600px; align-items: center">
  1191. <el-form-item prop="roleName" label="角色名称:" required>
  1192. <el-input v-model="addRole.roleName" placeholder="请输入用户名" style="width: 220px" />
  1193. </el-form-item>
  1194. <el-form-item prop="market" label="所属地区:" required>
  1195. <el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 240px" clearable>
  1196. <el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item" />
  1197. </el-select>
  1198. </el-form-item>
  1199. <el-form-item prop="parentName" label="上级角色:">
  1200. <el-select v-model="addRole.parentId" placeholder="请选择上级角色" style="width: 220px" @change="getLists" clearable>
  1201. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1202. :value="item.value"></el-option>
  1203. </el-select>
  1204. </el-form-item>
  1205. <el-form-item prop="checkedKeys" label="权限列表:" required>
  1206. <el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id"
  1207. :props="{ label: 'menuName', children: 'children' }" :checked-keys="addRole.checkedKeys"
  1208. @check="handleCheckChange">
  1209. <template #default="{ node, data }">
  1210. <span>{{ node.label }}</span>
  1211. </template>
  1212. </el-tree>
  1213. <div v-else style="display: flex; align-items: center; gap: 8px;">
  1214. <span style="color: #999;">暂无数据</span>
  1215. </div>
  1216. </el-form-item>
  1217. <el-form-item prop="grade" label="优先级:" required>
  1218. <el-input v-model="addRole.grade" placeholder="数字1~999" style="width: 220px" />
  1219. </el-form-item>
  1220. </el-form>
  1221. <div>
  1222. <el-button @click="closePermissionAddVisible()">取消</el-button>
  1223. <el-button type="primary" @click="handleAddRole">
  1224. 提交
  1225. </el-button>
  1226. </div>
  1227. </template>
  1228. </el-dialog>
  1229. <!-- 重置密码确认弹窗 -->
  1230. <el-dialog v-model="resetConfirmVisible" width="500px" :close-on-click-modal="false"
  1231. :before-close="cancelResetPassword">
  1232. <el-row>
  1233. <el-col :span="4" style="margin-top: 20px">
  1234. <el-icon class="dialog-icon" color="#10AEFF" size="50">
  1235. <InfoFilled />
  1236. </el-icon>
  1237. </el-col>
  1238. <el-col :span="20">
  1239. <h3>提示</h3>
  1240. <p class="dialog-title">确认重置该账号密码</p>
  1241. <p class="dialog-desc">重置后密码为: 123456请通知用户及时修改</p>
  1242. </el-col>
  1243. </el-row>
  1244. <template #footer>
  1245. <div style="display: flex; justify-content: center; gap: 30px">
  1246. <el-button @click="cancelResetPassword">取消</el-button>
  1247. <el-button type="primary" @click="confirmResetPassword">确定</el-button>
  1248. </div>
  1249. </template>
  1250. </el-dialog>
  1251. </template>
  1252. <style scoped>
  1253. .pagination {
  1254. display: flex;
  1255. }
  1256. .status {
  1257. display: flex;
  1258. }
  1259. .head-card {
  1260. display: flex;
  1261. }
  1262. .head-card-element {
  1263. margin-right: 20px;
  1264. }
  1265. .head-card-btn {
  1266. margin-left: auto;
  1267. }
  1268. /* 新增样式让弹窗内容居中 */
  1269. .el-dialog__body {
  1270. display: flex;
  1271. flex-direction: column;
  1272. align-items: center;
  1273. }
  1274. .el-dialog__footer {
  1275. display: flex;
  1276. flex-direction: column;
  1277. align-items: center;
  1278. }
  1279. .permission-cell {
  1280. cursor: pointer;
  1281. color: #409eff;
  1282. /* 蓝色文字,提示可点击 */
  1283. }
  1284. </style>