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.

1590 lines
53 KiB

4 weeks ago
1 month ago
4 weeks ago
4 weeks ago
1 month ago
1 month ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
4 weeks ago
4 weeks ago
4 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. role.value.name = ''
  189. get()
  190. getRoleList()
  191. }
  192. const getArea = async function () {
  193. try {
  194. const result = await request({
  195. url: '/permission/getmarket',
  196. data: {}
  197. })
  198. market.value = result.data
  199. } catch (error) {
  200. console.log('请求失败', error)
  201. }
  202. }
  203. // 获取部门
  204. const getStore = async function () {
  205. try {
  206. const result = await request({
  207. url: '/permission/getposition',
  208. data: {}
  209. })
  210. postiton.value = result.data
  211. } catch (error) {
  212. console.log('请求失败', error)
  213. }
  214. }
  215. // 打开新增用户权限弹窗
  216. const openUserAddVisible = function () {
  217. getRoles()
  218. userAddVisible.value = true
  219. addAdmin.value = {
  220. account: '',
  221. name: '',
  222. market: '',
  223. permission: '',
  224. postiton: '',
  225. machineId: '',
  226. machineIds: [''],
  227. remark: ''
  228. };
  229. }
  230. // 新增角色弹窗
  231. const openPermissionAddVisible = function () {
  232. permissionAddVisible.value = true
  233. getRoles()
  234. getLists()
  235. }
  236. // 关闭新增用户权限弹窗,并刷新表单
  237. const closeUserAddVisible = function () {
  238. addAdmin.value = {
  239. account: '',
  240. name: '',
  241. market: '',
  242. permission: '',
  243. postiton: '',
  244. machineId: '',
  245. machineIds: [''],
  246. remark: ''
  247. };
  248. userAddVisible.value = false;
  249. // 清除表单验证状态
  250. Ref.value.resetFields();
  251. }
  252. const closePermissionAddVisible = function () {
  253. addRole.value = {
  254. roleName: '',
  255. parentId: null,
  256. checkedKeys: [],
  257. grade: '',
  258. market: ''
  259. }
  260. permissionAddVisible.value = false
  261. Ref.value.resetFields();
  262. getRoleList()
  263. }
  264. // 新增用户权限初始化
  265. const userAddInit = function () {
  266. userAddObj.value = {}
  267. openUserAddVisible()
  268. }
  269. // 新增角色初始化
  270. const permissionAddInit = function () {
  271. const addRole = ref({
  272. roleName: '',
  273. parentId: null,
  274. checkedKeys: [],
  275. grade: '',
  276. market: ''
  277. })
  278. openPermissionAddVisible()
  279. }
  280. //新增用户
  281. const permissionAdd = async function () {
  282. try {
  283. await new Promise((resolve, reject) => {
  284. Ref.value.validate((valid) => {
  285. if (valid) {
  286. resolve(); // 验证通过,继续执行后续代码
  287. } else {
  288. reject(new Error('请检查并完善表单信息')); // 验证失败,抛出错误
  289. }
  290. });
  291. });
  292. addAdmin.value.adminFlag = 1
  293. addAdmin.value.status1 = 1
  294. if (addAdmin.value.postiton == '管理员') {
  295. addAdmin.value.postiton == 1
  296. }
  297. const params = {
  298. "account": addAdmin.value.account,//OA号
  299. "adminName": addAdmin.value.name,//姓名
  300. "market": addAdmin.value.market,//地区
  301. "roleId": addAdmin.value.permission,//权限ID
  302. "postiton": addAdmin.value.postiton,//职位
  303. "machineId": addAdmin.value.machineIds[0],//机器码
  304. "remark": addAdmin.value.remark//备注
  305. }
  306. const result = await request({
  307. url: '/permission/addPermission',
  308. data: params
  309. })
  310. console.log(addAdmin.value)
  311. if (result.code == 200) {
  312. ElMessage.success('添加成功')
  313. } else {
  314. ElMessage.error(result.msg)
  315. }
  316. addAdmin.value = {}
  317. get()
  318. closeUserAddVisible()
  319. } catch (error) {
  320. console.log('新增用户权限失败', error)
  321. ElMessage.error('新增用户权限失败')
  322. }
  323. }
  324. const addUserRules = {
  325. account: [
  326. { required: true, message: '请输入OA号', trigger: 'blur' },
  327. { pattern: /^\d+$/, message: 'OA号必须为数字', trigger: 'blur' },
  328. { max: 20, message: '长度不能超过20位', trigger: 'blur' }
  329. ],
  330. name: [
  331. { required: true, message: '请输入用户名', trigger: 'blur' },
  332. { max: 20, message: '长度不能超过20位', trigger: 'blur' }
  333. ],
  334. market: [
  335. { required: true, message: '请选择所属地区', trigger: 'change' }
  336. ],
  337. permission: [
  338. { required: true, message: '请选择角色名称', trigger: 'change' }
  339. ],
  340. postiton: [
  341. { required: true, message: '请输入职位', trigger: 'blur' },
  342. { max: 20, message: '长度不能超过20位', trigger: 'blur' }
  343. ],
  344. machineIds: [
  345. {
  346. required: true,
  347. message: '请至少输入一个机器码',
  348. trigger: 'change',
  349. validator: (rule, value, callback) => {
  350. // 检查是否有非空的机器码
  351. const hasValid = value.some(item => item.trim() !== '');
  352. if (!hasValid) {
  353. callback(new Error('请至少输入一个机器码'));
  354. } else {
  355. callback();
  356. }
  357. }
  358. }
  359. ]
  360. };
  361. // 表单验证ref
  362. const Ref = ref(null)
  363. // 使用 _.throttle 并设置 trailing 为 false 实现严格节流,只执行一次
  364. const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
  365. trailing: false
  366. })
  367. // 权限类别
  368. const permissionList = ref([])
  369. const getRoles = async function () {
  370. try {
  371. const res = await API({ url: '/role/selectAll' })
  372. permissionList.value = res.data.map(item => ({
  373. label: item.roleName,
  374. value: item.id
  375. }))
  376. console.log('权限列表:', permissionList.value)
  377. } catch (error) {
  378. console.error('获取权限列表失败:', error)
  379. }
  380. }
  381. // 打开编辑用户权限弹窗
  382. const openUserEditVisible = function () {
  383. userEditVisible.value = true
  384. }
  385. // 关闭编辑用户权限弹窗
  386. const closeUserEditVisible = function () {
  387. userEditVisible.value = false
  388. data.value = []
  389. }
  390. // 编辑用户权限初始化
  391. const permissionEditInit = async function (row) {
  392. getRoles()
  393. console.log('row', row)
  394. permissionEditObj.value = {}
  395. permissionEditObj.value.id = row.id
  396. permissionEditObj.value.account = row.account
  397. permissionEditObj.value.adminName = row.name
  398. permissionEditObj.value.remark = row.remark
  399. permissionEditObj.value.market = row.market
  400. permissionEditObj.value.password = ''
  401. // 将字符串形式的 market 转换为数组
  402. if (typeof row.market === 'string' && row.market) {
  403. permissionEditObj.value.market = row.market.split(',');
  404. } else {
  405. // 处理空值或非字符串情况
  406. permissionEditObj.value.market = [];
  407. }
  408. permissionEditObj.value.postiton = row.postiton
  409. permissionEditObj.value.roleId = row.roleId
  410. const result = await request({
  411. url: '/role/selectFather',
  412. data: {
  413. id: row.roleId
  414. }
  415. })
  416. console.log('初始查上级权限', result)
  417. permissionEditObj.value.parentId = result.data?.fatherId
  418. permissionEditObj.value.parentName = result.data?.fatherName
  419. console.log('get前', permissionEditObj.value.roleId);
  420. permissionEditObj.value.roleName = row.roleName
  421. if (permissionEditObj.value.roleId == 0) {
  422. permissionEditObj.value.roleId = ''
  423. }
  424. getUserLists(row.roleId)
  425. let machineIdsRef = await request({
  426. url: '/permission/getPermission',
  427. data: {
  428. "pageNum": 1,//页码数
  429. "pageSize": 1,//页条数
  430. "permission": {
  431. account: row.account,//OA号
  432. }
  433. }
  434. })
  435. if (machineIdsRef.data.list[0].machineIds == null || machineIdsRef.data.list[0].machineIds.length == 0) {
  436. permissionEditObj.value.machineIds = ['']
  437. } else {
  438. permissionEditObj.value.machineIds = machineIdsRef.data.list[0].machineIds
  439. }
  440. permissionEditObj.value.machineId = permissionEditObj.value.machineIds[0]
  441. //permissionEditObj.value.permission = row.permission
  442. console.log('编辑用户权限', permissionEditObj.value)
  443. console.log('11111111111111', permissionEditObj.value.machineId)
  444. openUserEditVisible()
  445. }
  446. const collectIds = (tree) => {
  447. let ids = [];
  448. tree.forEach((node) => {
  449. ids.push(node.id);
  450. if (node.children && node.children.length > 0) {
  451. ids = ids.concat(collectIds(node.children));
  452. }
  453. });
  454. return ids;
  455. };
  456. // 定义上级角色提示变量
  457. const parentRoleTip = ref('');
  458. //给data数据加上disabled属性,控制是否禁用
  459. function processTreeData(data) {
  460. return data.map(item => ({
  461. ...item,
  462. disabled: item.id != null || item.menuName.includes("敏感权限"), //控制权限显示的条件
  463. children: item.children ? processTreeData(item.children) : []
  464. }));
  465. }
  466. //根据上级角色控制权限列表,选择角色调整上级角色
  467. const getUserLists = async function (selectedRoleId) {
  468. try {
  469. console.log('permissionEditObj.value.roleId:', permissionEditObj.value.roleId)
  470. console.log('selectedRoleId', selectedRoleId);
  471. permissionEditObj.value.parentId = null;
  472. permissionEditObj.value.parentName = '';
  473. permissionEditObj.value.checkedKeys = [];
  474. parentRoleTip.value = '';
  475. const parentRes = await request({
  476. url: '/role/selectFather',
  477. data: { id: selectedRoleId } // 用选中的角色ID请求
  478. });
  479. const parentId = parentRes.data.fatherId;
  480. const parentName = parentRes.data.parentName;
  481. permissionEditObj.value.parentId = parentId;
  482. permissionEditObj.value.parentName = parentName;
  483. if (parentId == null) {
  484. // 无上级角色:显示提示
  485. parentRoleTip.value = '该角色无上级角色';
  486. }
  487. let roleId = permissionEditObj.value.roleId
  488. if (permissionEditObj.value.parentId === null || permissionEditObj.value.parentId === undefined) {
  489. roleId = 2
  490. }
  491. const res = await API({
  492. url: '/menu/tree',
  493. data: { id: roleId }
  494. })
  495. data.value = processTreeData(res.data)
  496. permissionEditObj.value.checkedKeys = collectIds(res.data) || [];
  497. console.log('看看data', data.value)
  498. console.log('看checkedKeys', permissionEditObj.value.checkedKeys)
  499. console.log('parentID:', permissionEditObj.value.parentId, 'roleId:', roleId)
  500. console.log('permissionEditObj.value.roleId:', permissionEditObj.value.roleId)
  501. } catch (error) {
  502. console.log('请求失败', error)
  503. }
  504. }
  505. //编辑用户表单校验
  506. const editAdminRules = {
  507. market: [
  508. { required: true, message: '请选择所属地区', trigger: 'change' }
  509. ],
  510. postiton: [
  511. { required: true, message: '请输入职位', trigger: 'blur' },
  512. { max: 20, message: '长度不能超过20位', trigger: 'blur' }
  513. ],
  514. machineIds: [
  515. {
  516. required: true,
  517. message: '请至少输入一个机器码',
  518. trigger: 'change',
  519. validator: (rule, value, callback) => {
  520. // 检查是否有非空的机器码
  521. const hasValid = value.some(item => item.trim() !== '');
  522. if (!hasValid) {
  523. callback(new Error('请至少输入一个机器码'));
  524. } else {
  525. callback();
  526. }
  527. }
  528. }
  529. ]
  530. };
  531. // 编辑用户权限提交
  532. const permissionEdit = async function () {
  533. let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value;
  534. console.log('oldRole', oldRole);
  535. if (oldRole == null) {
  536. oldRole = '未分配权限'
  537. }
  538. const newRole = permissionList.value.find(item => item.value === newRoleId)?.label || '未知角色';
  539. try {
  540. await new Promise((resolve, reject) => {
  541. Ref.value.validate((valid) => {
  542. if (valid) {
  543. resolve(); // 验证通过,继续执行后续代码
  544. } else {
  545. reject(new Error('请检查并完善表单信息')); // 验证失败,抛出错误
  546. }
  547. });
  548. });
  549. await ElMessageBox.confirm(
  550. `确认修改权限角色?<br>您正在将【${userName}】的权限角色从【${oldRole}】修改为【${newRole}】<br>变更后,该用户的可操作权限将同步更新为新角色配置,涉及数据访问、功能操作等权限变化,请谨慎确认。`,
  551. '警告',
  552. {
  553. confirmButtonText: '确认',
  554. cancelButtonText: '取消',
  555. type: "warning",
  556. lockScroll: false,
  557. dangerouslyUseHTMLString: true //允许解析 HTML 标签
  558. }
  559. );
  560. closeUserEditVisible();
  561. const result = await request({
  562. url: '/permission/updateAdmin',
  563. data: {
  564. account: permissionEditObj.value.account,//OA号
  565. adminName: permissionEditObj.value.adminName,//姓名
  566. market: permissionEditObj.value.market,//地区
  567. postiton: permissionEditObj.value.postiton,//职位
  568. roleId: permissionEditObj.value.roleId,//角色id
  569. machineId: permissionEditObj.value.machineIds[0],//机器码
  570. machineIds: permissionEditObj.value.machineIds[1],//机器码
  571. password: permissionEditObj.value.password,//
  572. remark: permissionEditObj.value.remark//备注
  573. }
  574. });
  575. console.log('编辑最后提交数据', permissionEditObj.value);
  576. if (result.code == 200) {
  577. await ElMessageBox.alert(
  578. `用户${userName}的权限角色已更改为【${newRole}`,
  579. '成功',
  580. {
  581. confirmButtonText: '确定',
  582. type: 'success' // 设置为 success 类型
  583. }
  584. );
  585. get();
  586. closeUserEditVisible()
  587. } else {
  588. ElMessage.error(result.msg)
  589. }
  590. } catch (error) {
  591. console.log('编辑用户权限失败', error)
  592. ElMessage.error('编辑用户权限失败')
  593. }
  594. }
  595. const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
  596. trailing: false
  597. })
  598. // 删除初始化
  599. const del = function (row) {
  600. delObj.value = {}
  601. console.log(row, '删除初始化')
  602. delObj.value.account = row.account
  603. delObj.value.id = row.id
  604. }
  605. // 删除权限
  606. const delConfirm = async function () {
  607. try {
  608. const result = await request({
  609. url: '/permission/deleteAdmin',
  610. data: delObj.value
  611. })
  612. console.log('看看删除对象', delObj.value)
  613. console.log('请求成功1', result)
  614. ElMessage.success('删除权限成功')
  615. delObj.value = {}
  616. get()
  617. } catch (error) {
  618. console.log('删除权限失败', error)
  619. ElMessage.error('删除权限失败')
  620. }
  621. }
  622. // // 删除角色初始化
  623. // const delRole = function (row) {
  624. // delRoleObj.value = {}
  625. // console.log(row, '删除初始化')
  626. // delRoleObj.value.id = row.id
  627. // }
  628. // // 删除角色
  629. // const delRoleConfirm = async function () {
  630. // try {
  631. // const result = await request({
  632. // url: '/role/delete',
  633. // data: delRoleObj.value
  634. // })
  635. // console.log('看看删除角色对象', delRoleObj.value)
  636. // console.log('请求成功2', result)
  637. // ElMessage.success('删除权限成功')
  638. // delRoleObj.value = {}
  639. // getRoleList()
  640. // } catch (error) {
  641. // console.log('删除权限失败', error)
  642. // ElMessage.error('删除权限失败')
  643. // }
  644. // }
  645. const handleAddRole = async function () {
  646. try {
  647. await new Promise((resolve, reject) => {
  648. Ref.value.validate((valid) => {
  649. if (valid) {
  650. resolve(); // 验证通过,继续执行后续代码
  651. } else {
  652. reject(new Error('请检查并完善表单信息')); // 验证失败,抛出错误
  653. }
  654. });
  655. });
  656. const res = await API({
  657. url: '/role/add',
  658. data: {
  659. "roleName": addRole.value.roleName,
  660. "menuIds": addRole.value.checkedKeys,
  661. "priority": addRole.value.grade,
  662. "fatherId": addRole.value.parentId,
  663. "market": addRole.value.market
  664. }
  665. })
  666. if (res.code == 200) {
  667. ElMessage.success('角色' + addRole.value.roleName + '添加成功')
  668. console.log('成功了,看看addRole', addRole.value)
  669. closePermissionAddVisible()
  670. } else {
  671. ElMessage.error(res.msg)
  672. }
  673. } catch (error) {
  674. console.log('请求失败', error)
  675. console.log('失败,看看addRole', addRole.value);
  676. }
  677. }
  678. // 禁用启用用户权限
  679. const editStatus = async function (row) {
  680. try {
  681. console.log(row)
  682. permissionEditObj.value = {}
  683. permissionEditObj.value.id = row.id
  684. permissionEditObj.value.account = row.account
  685. permissionEditObj.value.adminStatus = row.adminStatus
  686. console.log('修改用户权限状态', permissionEditObj.value)
  687. const result = await request({
  688. url: '/permission/upadatePermission',
  689. data: permissionEditObj.value
  690. })
  691. console.log('请求成功2', result)
  692. ElMessage.success(
  693. permissionEditObj.value.adminStatus == 1 ? '启用成功' : '禁用成功'
  694. )
  695. permissionEditObj.value = {}
  696. get()
  697. } catch (error) {
  698. console.log('修改用户权限失败', error)
  699. }
  700. }
  701. const handlePageSizeChange = function (val) {
  702. getObj.value.pageSize = val
  703. get()
  704. }
  705. const handleCurrentChange = function (val) {
  706. getObj.value.pageNum = val
  707. get()
  708. }
  709. const handleRolePageSizeChange = (val) => {
  710. getRoleObj.value.pageSize = val
  711. getRoleList() // 调用角色管理的查询
  712. }
  713. // 角色管理分页 - 当前页变化
  714. const handleRoleCurrentChange = (val) => {
  715. getRoleObj.value.pageNum = val
  716. getRoleList() // 调用角色管理的查询
  717. }
  718. const data = ref([])
  719. const getLists = async function () {
  720. try {
  721. let roleId = addRole.value.parentId
  722. if (addRole.value.parentId === null || addRole.value.parentId === undefined) {
  723. roleId = 2
  724. }
  725. const res = await API({
  726. url: '/menu/tree',
  727. data: { id: roleId }
  728. })
  729. data.value = res.data
  730. if (addRole.value.parentId != 2) {
  731. data.value = data.value.filter(item => item.id !== 9);
  732. }
  733. console.log('看看data', data.value)
  734. console.log('parentID:', addRole.value.parentId, 'roleId:', roleId)
  735. if (addRole.value.parentId) {
  736. const result = await API({
  737. url: '/general/roleMarket',
  738. data: { id: addRole.value.parentId }
  739. })
  740. if (result.code == 200) {
  741. if (typeof result.data === 'string' && result.data) {
  742. addRoleMarket.value = result.data.split(',');
  743. } else if (Array.isArray(result.data)) {
  744. addRoleMarket.value = result.data
  745. }
  746. else {
  747. addRoleMarket.value = [];
  748. }
  749. } else {
  750. ElMessage.error('该上级角色无所属地区')
  751. console.log('该上级角色无所属地区');
  752. }
  753. console.log('addRoleMarket.value', addRoleMarket.value);
  754. } else {
  755. if (typeof adminData.value.markets === 'string' && adminData.value.markets) {
  756. addRoleMarket.value = adminData.value.markets.split(',');
  757. } else if (Array.isArray(adminData.value.markets)) {
  758. addRoleMarket.value = adminData.value.markets
  759. }
  760. else {
  761. addRoleMarket.value = [];
  762. }
  763. }
  764. } catch (error) {
  765. console.log('请求失败', error)
  766. }
  767. }
  768. const handleMarketChange = (values) => {
  769. console.log('values的类型:', typeof values);
  770. console.log('values的值:', values);
  771. //判断是否选择了总部
  772. const hasHeadquarters = values.includes('总部');
  773. if (hasHeadquarters) {
  774. // 如果选择了总部,只保留总部
  775. addAdmin.value.market = ['总部'];
  776. }
  777. console.log('看看现在的地区', addAdmin.value.market);
  778. };
  779. const includeHq = computed(() => {
  780. const i = addAdmin.value.market.includes('总部')
  781. return (item) => i && item != '总部'
  782. })
  783. const EditincludeHq = computed(() => {
  784. const i = permissionEditObj.value.market.includes('总部')
  785. return (item) => i && item != '总部'
  786. })
  787. const EdithandleMarketChange = (values) => {
  788. //判断是否选择了总部
  789. const hasHeadquarters = values.includes('总部');
  790. if (hasHeadquarters) {
  791. // 如果选择了总部,只保留总部
  792. permissionEditObj.value.market = ['总部'];
  793. }
  794. console.log('看看现在的地区', permissionEditObj.value.market);
  795. };
  796. // 处理编辑角色权限时的勾选事件
  797. const handleEditRolePermissionCheck = (checkedNodes, { checkedKeys }) => {
  798. permissionEditRoleObj.value.checkedKeys = checkedKeys;
  799. };
  800. const handleCheckChange = async (checkedNodes, checkedInfo) => {
  801. const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo;
  802. // 判断是否有选中的节点(避免空数组报错)
  803. if (allCheckedNodes.length === 0) return;
  804. // 取第一个选中的节点
  805. const node = allCheckedNodes[0];
  806. // 选中状态
  807. const checked = checkedKeys.includes(node.id);
  808. console.log('checkedInfo', checkedInfo);
  809. console.log('node', node);
  810. console.log('checked', checked);
  811. if (checked) {
  812. const newCheckedKeys = [...checkedInfo.checkedKeys];
  813. console.log('初始选中项:', newCheckedKeys);
  814. // 执行递归前先清空可能的重复父级(可选优化)
  815. const uniqueKeys = [...new Set(newCheckedKeys)];
  816. selectParentNodes(data.value, node.id, uniqueKeys);
  817. console.log('包含父级的选中项:', uniqueKeys);
  818. addRole.value.checkedKeys = uniqueKeys;
  819. } else {
  820. addRole.value.checkedKeys = checkedInfo.checkedKeys;
  821. console.log('else');
  822. }
  823. };
  824. const selectParentNodes = (treeData, nodeId, checkedKeys) => {
  825. if (!Array.isArray(treeData)) return false;
  826. for (const item of treeData) {
  827. if (item.children && Array.isArray(item.children) && item.children.length > 0) {
  828. const found = selectParentNodes(item.children, nodeId, checkedKeys);
  829. if (found) {
  830. // 避免重复添加父级
  831. if (!checkedKeys.includes(item.id)) {
  832. checkedKeys.push(item.id);
  833. }
  834. return true;
  835. }
  836. }
  837. if (item.id === nodeId) {
  838. return true;
  839. }
  840. }
  841. return false;
  842. };
  843. //点击角色权限菜单树点击展示逻辑
  844. const menuTreeVisible = ref(false);
  845. const currentRoleMenuTree = ref([]);
  846. const currentRoleName = ref('');
  847. const Rolecheckedkeys = ref([])
  848. const showMenuTree = (treeData, roleName) => {
  849. currentRoleMenuTree.value = processTreeData(treeData) || [];
  850. console.log('currentRoleMenuTree.value', currentRoleMenuTree.value);
  851. Rolecheckedkeys.value = collectIds(treeData)
  852. console.log('Rolecheckedkeys', Rolecheckedkeys.value);
  853. currentRoleName.value = roleName || '权限详情';
  854. menuTreeVisible.value = true;
  855. };
  856. // 重置密码弹窗状态
  857. const resetConfirmVisible = ref(false)
  858. // 当前选中的行数据
  859. const currentRow = ref(null)
  860. // 重置密码
  861. const resetPassword = function (row) {
  862. // 显示确认弹窗
  863. currentRow.value = row
  864. resetConfirmVisible.value = true
  865. }
  866. // 确认重置密码
  867. const confirmResetPassword = async function () {
  868. console.log('重置密码markets1', adminData.value.markets)
  869. // 处理markets数据
  870. if (typeof adminData.value.markets === 'string' && adminData.value.markets) {
  871. adminData.value.markets = adminData.value.markets.split(',');
  872. } else if (Array.isArray(adminData.value.markets)) {
  873. // 不处理
  874. }
  875. else {
  876. adminData.value.markets = [];
  877. }
  878. console.log('重置密码markets2', adminData.value.markets)
  879. // 权限检查
  880. if (adminData.value.markets.includes(currentRow.value.market) || adminData.value.markets[0] === '总部') {
  881. console.log('符合条件,可以操作', adminData.value.markets.includes(currentRow.value.market) || adminData.value.markets[0] === '总部');
  882. const params = {
  883. account: currentRow.value.account,
  884. }
  885. console.log(params);
  886. // 发送请求
  887. try {
  888. const result = await request({
  889. url: '/admin/reset',
  890. method: 'post',
  891. data: params // 直接传递params对象
  892. });
  893. if (result.code === 200) { // 使用严格相等运算符
  894. ElMessage.success('重置密码成功');
  895. resetConfirmVisible.value = false; // 关闭弹窗
  896. } else {
  897. ElMessage.error(result.message || '重置密码失败');
  898. }
  899. } catch (error) {
  900. ElMessage.error('重置密码失败');
  901. console.error('请求错误:', error);
  902. }
  903. } else {
  904. // console.log("为什么不能重置",adminData.value.markets)
  905. ElMessage.error('您没有修改' + currentRow.value.market + '地区的用户密码的权限');
  906. resetConfirmVisible.value = false; // 关闭弹窗
  907. }
  908. }
  909. // 取消重置密码
  910. const cancelResetPassword = function () {
  911. resetConfirmVisible.value = false
  912. }
  913. // 编辑角色对象
  914. const permissionEditRoleObj = ref({
  915. id: null,
  916. roleName: '',
  917. market: '',
  918. parentId: null,
  919. parentName: '',
  920. checkedKeys: [],
  921. grade: '',
  922. });
  923. // 编辑角色弹窗
  924. const permissionEditRoleVisible = ref(false);
  925. // 编辑角色初始化
  926. const permissionEditRoleInit = async function (row) {
  927. console.log('row', row);
  928. permissionEditRoleObj.value = {};
  929. permissionEditRoleObj.value.id = row.id;
  930. permissionEditRoleObj.value.roleName = row.roleName;
  931. permissionEditRoleObj.value.market = row.market;
  932. permissionEditRoleObj.value.parentId = row.fatherId;
  933. permissionEditRoleObj.value.parentName = row.fatherName;
  934. permissionEditRoleObj.value.grade = row.priority;
  935. // // 直接使用当前行的权限树数据
  936. // if (row.tree && row.tree.length > 0) {
  937. // // 收集当前行权限树的所有 id
  938. // permissionEditRoleObj.value.checkedKeys = collectIds(row.tree);
  939. // // 以当前行的权限树数据作为 el-tree 的数据源
  940. // data.value = row.tree;
  941. // } else {
  942. // permissionEditRoleObj.value.checkedKeys = [];
  943. // data.value = [];
  944. // }
  945. try {
  946. let roleId = permissionEditRoleObj.value.parentId;
  947. // 如果没有上级角色,可根据实际情况设置默认值,这里假设为 2
  948. if (permissionEditRoleObj.value.parentId === null || permissionEditRoleObj.value.parentId === undefined) {
  949. roleId = 2;
  950. }
  951. // 调用 /tree 接口,使用上级角色 ID 获取权限列表
  952. const res = await API({
  953. url: '/menu/tree',
  954. data: { id: roleId }
  955. });
  956. data.value = res.data;
  957. // 收集当前行权限树的所有 id
  958. if (row.tree && row.tree.length > 0) {
  959. permissionEditRoleObj.value.checkedKeys = collectIds(row.tree);
  960. } else {
  961. permissionEditRoleObj.value.checkedKeys = [];
  962. }
  963. } catch (error) {
  964. console.log('根据上级角色获取权限列表失败', error);
  965. data.value = [];
  966. permissionEditRoleObj.value.checkedKeys = [];
  967. }
  968. console.log('编辑角色', permissionEditRoleObj.value);
  969. permissionEditRoleVisible.value = true;
  970. };
  971. // 编辑角色提交
  972. const permissionEditRole = async function () {
  973. try {
  974. await new Promise((resolve, reject) => {
  975. Ref.value.validate((valid) => {
  976. if (valid) {
  977. resolve();
  978. } else {
  979. reject(new Error('请检查并完善表单信息'));
  980. }
  981. });
  982. });
  983. const res = await API({
  984. url: '/menu/update',
  985. data: {
  986. "id": permissionEditRoleObj.value.id,
  987. "roleName": permissionEditRoleObj.value.roleName,
  988. "menuIds": permissionEditRoleObj.value.checkedKeys,
  989. "priority": permissionEditRoleObj.value.grade,
  990. "fatherId": permissionEditRoleObj.value.parentId,
  991. "market": permissionEditRoleObj.value.market
  992. }
  993. });
  994. console.log('编辑角色成功', permissionEditRoleObj.value);
  995. permissionEditRoleVisible.value = false;
  996. getRoleList();
  997. } catch (error) {
  998. console.log('编辑角色失败', error);
  999. console.log('失败,看看permissionEditRoleObj', permissionEditRoleObj.value);
  1000. }
  1001. };
  1002. // // 挂载 怎么有俩挂载,注掉一个
  1003. // onMounted(async function () {
  1004. // await get()
  1005. // await getArea()
  1006. // await getStore()
  1007. // await getRoleList()
  1008. // await getAdminData()
  1009. // })
  1010. const Rolerules = reactive({
  1011. roleName: [
  1012. { required: true, message: '请输入角色名称', trigger: 'blur' },
  1013. { min: 2, max: 20, message: '角色名称长度应在2-20个字符之间', trigger: 'blur' }
  1014. ],
  1015. market: [
  1016. { required: true, message: '请选择所属地区', trigger: 'change' }
  1017. ],
  1018. grade: [
  1019. { required: true, message: '请输入优先级', trigger: 'blur' },
  1020. { pattern: /^[1-9]\d{0,2}$/, message: '优先级应为1-999的数字', trigger: 'blur' }
  1021. ],
  1022. checkedKeys: [
  1023. {
  1024. required: true,
  1025. message: '请选择权限列表',
  1026. trigger: 'change', // 选框变化或提交时触发,可根据实际调整
  1027. validator: (rule, value, callback) => {
  1028. if (value && value.length > 0) {
  1029. callback(); // 有选中项,校验通过
  1030. } else {
  1031. callback(new Error('请选择权限列表')); // 未选中,抛出错误提示
  1032. }
  1033. }
  1034. }
  1035. ]
  1036. });
  1037. // 挂载
  1038. onMounted(async function () {
  1039. await getAdminData()
  1040. await get()
  1041. await getArea()
  1042. await getStore()
  1043. await getRoleList()
  1044. })
  1045. </script>
  1046. <template>
  1047. <div style="margin-bottom:20px">
  1048. <el-button-group>
  1049. <el-button :type="checkTab === 'admin' ? 'primary' : 'default'" @click="checkTab = 'admin'">
  1050. 用户管理
  1051. </el-button>
  1052. <el-button :type="checkTab === 'role' ? 'primary' : 'default'" @click="checkTab = 'role'">
  1053. 角色管理
  1054. </el-button>
  1055. </el-button-group>
  1056. </div>
  1057. <div v-show="checkTab === 'admin'">
  1058. <!-- 用户搜索和展示 -->
  1059. <el-row>
  1060. <el-col>
  1061. <el-card style="margin-bottom: 20px">
  1062. <div class="head-card">
  1063. <div class="head-card-element">
  1064. <el-text class="mx-1" size="large">OA号</el-text>
  1065. <el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable />
  1066. </div>
  1067. <div class="head-card-element" style="margin-left: 50px">
  1068. <el-text class="mx-1" size="large">所属地区</el-text>
  1069. <el-select v-model="admin.market" placeholder="请选择所属地区" style="width: 240px" clearable>
  1070. <el-option v-for="item in market" :key="item" :label="item" :value="item" />
  1071. </el-select>
  1072. </div>
  1073. <div class="head-card-element" style="margin-left: 50px">
  1074. <el-text class="mx-1" size="large">职位名称</el-text>
  1075. <el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable>
  1076. <el-option v-for="item in postiton" :key="item" :label="item" :value="item" />
  1077. </el-select>
  1078. </div>
  1079. <div class="head-card-btn">
  1080. <el-button type="success" @click="reset()">重置</el-button>
  1081. <el-button type="primary" @click="search()">查询</el-button>
  1082. </div>
  1083. </div>
  1084. </el-card>
  1085. </el-col>
  1086. </el-row>
  1087. <el-row>
  1088. <el-col>
  1089. <el-card>
  1090. <!-- 展示表单 -->
  1091. <div class="add-item">
  1092. <el-button style="color: #048efb; border: 1px solid #048efb" @click="userAddInit()">新增用户</el-button>
  1093. </div>
  1094. <div>
  1095. <el-table :data="tableData" style="width: 100%" show-overflow-tooltip>
  1096. <el-table-column type="index" label="序号" width="100px" fixed="left">
  1097. <template #default="scope">
  1098. <span>{{
  1099. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  1100. }}</span>
  1101. </template>
  1102. </el-table-column>
  1103. <el-table-column prop="account" label="OA号" />
  1104. <el-table-column prop="name" label="姓名" />
  1105. <el-table-column prop="market" label="所属地区" />
  1106. <el-table-column prop="postiton" label="职位" />
  1107. <el-table-column prop="roleName" label="部门权限">
  1108. </el-table-column>
  1109. <el-table-column prop="remark" label="备注" />
  1110. <el-table-column prop="operation" label="操作" width="280px">
  1111. <template #default="scope">
  1112. <el-button type="warning" text @click="resetPassword(scope.row)">
  1113. 重置密码
  1114. </el-button>
  1115. <el-button type="primary" text @click="permissionEditInit(scope.row)"
  1116. :disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
  1117. 修改权限
  1118. </el-button>
  1119. <el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
  1120. <template #reference>
  1121. <el-button type="danger" text @click="del(scope.row)"
  1122. :disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
  1123. 删除
  1124. </el-button>
  1125. </template>
  1126. <template #actions="{ confirm, cancel }">
  1127. <el-button size="small" @click="cancel">取消</el-button>
  1128. <el-button type="primary" size="small" @click="confirm">
  1129. 确定
  1130. </el-button>
  1131. </template>
  1132. </el-popconfirm>
  1133. </template>
  1134. </el-table-column>
  1135. <el-table-column prop="adminStatus" label="状态">
  1136. <template #default="scope">
  1137. <el-switch v-model="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
  1138. :disabled="scope.row.account === adminData.account" @change="editStatus(scope.row)" style="
  1139. --el-switch-on-color: #13ce66;
  1140. --el-switch-off-color: #ff4949;
  1141. " active-text="启用" inactive-text="禁用" inline-prompt />
  1142. </template>
  1143. </el-table-column>
  1144. </el-table>
  1145. </div>
  1146. <!-- 分页 -->
  1147. <div class="pagination" style="margin-top: 20px">
  1148. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  1149. layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
  1150. @current-change="handleCurrentChange"></el-pagination>
  1151. </div>
  1152. </el-card>
  1153. </el-col>
  1154. </el-row>
  1155. </div>
  1156. <div v-show="checkTab === 'role'">
  1157. <!-- 角色搜索 -->
  1158. <el-card style="margin-bottom: 20px">
  1159. <div class="head-card">
  1160. <el-text class="mx-1" size="large">角色名称</el-text>
  1161. <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
  1162. <div class="head-card-btn">
  1163. <el-button type="success" @click="reset()">重置</el-button>
  1164. <el-button type="primary" @click="searchRole()">查询</el-button>
  1165. </div>
  1166. </div>
  1167. </el-card>
  1168. <!-- 展示表单 -->
  1169. <el-card>
  1170. <div class="add-item">
  1171. <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增角色</el-button>
  1172. </div>
  1173. <div>
  1174. <el-table :data="roleData" style="width: 100%" show-overflow-tooltip>
  1175. <el-table-column type="index" label="序号" width="100px" fixed="left">
  1176. <template #default="scope">
  1177. <span>{{
  1178. scope.$index + 1 + (getRoleObj.pageNum - 1) * getRoleObj.pageSize
  1179. }}</span>
  1180. </template>
  1181. </el-table-column>
  1182. <el-table-column prop="roleName" label="角色名称" />
  1183. <el-table-column prop="fatherName" label="上级角色" />
  1184. <el-table-column prop="priority" label="优先级" />
  1185. <el-table-column label="权限范围" show-overflow-tooltip>
  1186. <template #default="scope">
  1187. <div class="permission-cell" @click="showMenuTree(scope.row.tree, scope.row.roleName)">
  1188. {{ formatPermissions(scope.row.tree) }}
  1189. </div>
  1190. </template>
  1191. </el-table-column>
  1192. <!-- <el-table-column prop="operation" label="操作" width="200px">
  1193. <template #default="scope">
  1194. <el-popconfirm title="确定将此角色删除吗?" @confirm="delRoleConfirm">
  1195. <template #reference>
  1196. <el-button type="danger" text @click="delRole(scope.row)"
  1197. :disabled="scope.row.id === 1 || scope.row.id === 2">
  1198. 删除
  1199. </el-button>
  1200. </template>
  1201. <template #actions="{ confirm, cancel }">
  1202. <el-button size="small" @click="cancel">取消</el-button>
  1203. <el-button type="primary" size="small" @click="confirm">
  1204. 确定
  1205. </el-button>
  1206. </template>
  1207. </el-popconfirm>
  1208. </template>
  1209. </el-table-column> -->
  1210. <el-table-column prop="operation" label="操作" width="200px">
  1211. <template #default="scope">
  1212. <el-button type="warning" text @click="permissionEditRoleInit(scope.row)">
  1213. 编辑
  1214. </el-button>
  1215. </template>
  1216. </el-table-column>
  1217. </el-table>
  1218. </div>
  1219. <!-- 分页 -->
  1220. <div class="pagination" style="margin-top: 20px">
  1221. <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
  1222. layout="total, sizes, prev, pager, next, jumper" :total="roleTotal" @size-change="handleRolePageSizeChange"
  1223. @current-change="handleRoleCurrentChange"></el-pagination>
  1224. </div>
  1225. </el-card>
  1226. </div>
  1227. <!-- 角色菜单树展示 -->
  1228. <el-dialog v-model="menuTreeVisible" :title='`权限详情:${currentRoleName}`' width="600px">
  1229. <el-tree :data="currentRoleMenuTree" node-key="id" :props="{ label: 'menuName', children: 'children' }"
  1230. show-checkbox check-strictly :expand-on-click-node="false"
  1231. :default-expanded-keys="currentRoleMenuTree.map(item => item.id)" :default-checked-keys="Rolecheckedkeys" />
  1232. <template #footer>
  1233. <el-button @click="menuTreeVisible = false" type="primary">关闭</el-button>
  1234. </template>
  1235. </el-dialog>
  1236. <!-- 新增用户权限 -->
  1237. <el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
  1238. <template #footer>
  1239. <!-- 居中显示 -->
  1240. <el-form ref="Ref" :rules="addUserRules" :model="addAdmin" label-width="auto"
  1241. style="max-width: 600px; align-items: center">
  1242. <el-form-item prop="account" label="OA号:" required clearable>
  1243. <el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px" />
  1244. </el-form-item>
  1245. <el-form-item prop="name" label="用户名:" required clearable>
  1246. <el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px" />
  1247. </el-form-item>
  1248. <el-form-item prop="market" label="所属地区:" required clearable>
  1249. <el-select multiple v-model="addAdmin.market" placeholder="请选择所属地区" style="width: 440px" clearable
  1250. @change="handleMarketChange">
  1251. <el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="includeHq(item)" />
  1252. </el-select>
  1253. </el-form-item>
  1254. <el-form-item prop="permission" label="角色名称:" required>
  1255. <el-select v-model="addAdmin.permission" placeholder="请选择角色名称" style="width: 220px" clearable>
  1256. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1257. :value="item.value"></el-option>
  1258. </el-select>
  1259. </el-form-item>
  1260. <el-form-item prop="postiton" label="职位:" required>
  1261. <el-input v-model="addAdmin.postiton" placeholder="请输入职位" style="width: 220px" clearable />
  1262. </el-form-item>
  1263. <el-form-item prop="machineIds" label="机器码:" required>
  1264. <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
  1265. <!-- 动态添加的机器码输入框 -->
  1266. <div v-for="(item, index) in addAdmin.machineIds" :key="index" style="margin-left: 10px;">
  1267. <el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
  1268. style="width: 180px; margin-right: 10px;" />
  1269. </div>
  1270. <el-button type="primary" @click="addMachineIdInput">添加</el-button>
  1271. </div>
  1272. </el-form-item>
  1273. <el-form-item prop="remark" label="备注">
  1274. <el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
  1275. type="textarea" />
  1276. </el-form-item>
  1277. </el-form>
  1278. <div>
  1279. <el-button @click="closeUserAddVisible()">取消</el-button>
  1280. <el-button type="primary" @click="throttledPermissionAdd()">
  1281. 提交
  1282. </el-button>
  1283. </div>
  1284. </template>
  1285. </el-dialog>
  1286. <!-- 这是编辑用户权限弹窗 -->
  1287. <el-dialog v-model="userEditVisible" title="编辑用户权限" width="800px" :close-on-click-modal="false">
  1288. <el-form ref="Ref" :rules="editAdminRules" :model="permissionEditObj" label-width="auto"
  1289. style="max-width: 600px; align-items: center">
  1290. <el-form-item prop="account" label="用户账号:" clearable>
  1291. <el-input v-model="permissionEditObj.account" placeholder="请输入OA号" style="width: 220px" disabled />
  1292. </el-form-item>
  1293. <el-form-item prop="name" label="用户名称:">
  1294. <el-input v-model="permissionEditObj.adminName" placeholder="请输入用户名" style="width: 220px" disabled />
  1295. </el-form-item>
  1296. <el-form-item prop="market" label="所属地区:" clearable>
  1297. <el-select multiple v-model="permissionEditObj.market" placeholder="请选择所属地区" style="width: 440px" clearable
  1298. @change="EdithandleMarketChange">
  1299. <el-option v-for="item in market" :key="item" :label="item" :value="item" :disabled="EditincludeHq(item)" />
  1300. </el-select>
  1301. </el-form-item>
  1302. <el-form-item prop="postiton" label="职位:">
  1303. <el-input v-model="permissionEditObj.postiton" placeholder="请输入职位" style="width: 220px" clearable />
  1304. </el-form-item>
  1305. <el-form-item prop="roleName" label="角色名称:">
  1306. <el-select v-model="permissionEditObj.roleId" placeholder="请选择角色" style="width: 220px" @change="getUserLists">
  1307. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1308. :value="item.value"></el-option>
  1309. </el-select>
  1310. </el-form-item>
  1311. <el-form-item prop="parentName" label="上级角色:">
  1312. <el-select v-model="permissionEditObj.parentId" :placeholder="permissionEditObj.parentName || '无上级角色'"
  1313. :disabled="!!parentRoleTip" style="width: 220px">
  1314. <el-option v-if="parentRoleTip" :key="0" :label="parentRoleTip" :value="null" disabled />
  1315. <el-option v-else v-for="item in permissionList" :key="item.value" :label="item.label" disabled
  1316. :value="item.value"></el-option>
  1317. </el-select>
  1318. </el-form-item>
  1319. <el-form-item prop="permissionSelect" label="权限列表:">
  1320. <el-tree v-if="data.length > 0" :data="data" :disabled="true" show-checkbox node-key="id"
  1321. :props="{ label: 'menuName', children: 'children' }" :default-checked-keys="permissionEditObj.checkedKeys">
  1322. </el-tree>
  1323. <div v-else style="display: flex; align-items: center; gap: 8px;">
  1324. <span style="color: #999;">暂未分配权限</span>
  1325. </div>
  1326. </el-form-item>
  1327. <el-form-item prop="machineIds" label="机器码:">
  1328. <div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
  1329. <!-- 动态添加的机器码输入框 -->
  1330. <div v-for="(item, index) in permissionEditObj.machineIds" :key="index" style="margin-left: 10px;">
  1331. <el-input v-model="permissionEditObj.machineIds[index]" placeholder=""
  1332. style="width: 180px; margin-right: 10px;" />
  1333. </div>
  1334. <el-button type="primary" @click="UseraddMachineIdInput">添加</el-button>
  1335. </div>
  1336. </el-form-item>
  1337. </el-form>
  1338. <div>
  1339. </div>
  1340. <template #footer>
  1341. <div>
  1342. <el-button @click="closeUserEditVisible()">取消</el-button>
  1343. <el-button type="primary" @click="throttledPermissionEdit">
  1344. 提交
  1345. </el-button>
  1346. </div>
  1347. </template>
  1348. </el-dialog>
  1349. <!-- 新增角色 -->
  1350. <el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false">
  1351. <template #footer>
  1352. <el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto"
  1353. style="max-width: 600px; align-items: center">
  1354. <el-form-item prop="roleName" label="角色名称:" required>
  1355. <el-input v-model="addRole.roleName" placeholder="请输入用户名" style="width: 220px" />
  1356. </el-form-item>
  1357. <el-form-item prop="parentName" label="上级角色:">
  1358. <el-select v-model="addRole.parentId" placeholder="请选择上级角色" style="width: 220px" @change="getLists" clearable>
  1359. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1360. :value="item.value"></el-option>
  1361. </el-select>
  1362. </el-form-item>
  1363. <el-form-item prop="market" label="所属地区:" required>
  1364. <el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 240px" clearable>
  1365. <el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item" />
  1366. </el-select>
  1367. </el-form-item>
  1368. <el-form-item prop="checkedKeys" label="权限列表:" required>
  1369. <el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id"
  1370. :props="{ label: 'menuName', children: 'children' }" :checked-keys="addRole.checkedKeys"
  1371. @check="handleCheckChange">
  1372. <template #default="{ node, data }">
  1373. <span>{{ node.label }}</span>
  1374. </template>
  1375. </el-tree>
  1376. <div v-else style="display: flex; align-items: center; gap: 8px;">
  1377. <span style="color: #999;">暂无数据</span>
  1378. </div>
  1379. </el-form-item>
  1380. <el-form-item prop="grade" label="优先级:" required>
  1381. <el-input v-model="addRole.grade" placeholder="数字1~999" style="width: 220px" />
  1382. </el-form-item>
  1383. </el-form>
  1384. <div>
  1385. <el-button @click="closePermissionAddVisible()">取消</el-button>
  1386. <el-button type="primary" @click="handleAddRole">
  1387. 提交
  1388. </el-button>
  1389. </div>
  1390. </template>
  1391. </el-dialog>
  1392. <!-- 重置密码确认弹窗 -->
  1393. <el-dialog v-model="resetConfirmVisible" width="500px" :close-on-click-modal="false"
  1394. :before-close="cancelResetPassword">
  1395. <el-row>
  1396. <el-col :span="4" style="margin-top: 20px">
  1397. <el-icon class="dialog-icon" color="#10AEFF" size="50">
  1398. <InfoFilled />
  1399. </el-icon>
  1400. </el-col>
  1401. <el-col :span="20">
  1402. <h3>提示</h3>
  1403. <p class="dialog-title">确认重置该账号密码</p>
  1404. <p class="dialog-desc">重置后密码为: 123456请通知用户及时修改</p>
  1405. </el-col>
  1406. </el-row>
  1407. <template #footer>
  1408. <div style="display: flex; justify-content: center; gap: 30px">
  1409. <el-button @click="cancelResetPassword">取消</el-button>
  1410. <el-button type="primary" @click="confirmResetPassword">确定</el-button>
  1411. </div>
  1412. </template>
  1413. </el-dialog>
  1414. <!-- 編輯角色彈窗 -->
  1415. <el-dialog v-model="permissionEditRoleVisible" title="编辑角色" width="800px" :close-on-click-modal="false">
  1416. <template #footer>
  1417. <el-form ref="Ref" :rules="Rolerules" :model="permissionEditRoleObj" label-width="auto"
  1418. style="max-width: 600px; align-items: center">
  1419. <el-form-item prop="roleName" label="角色名称:" required>
  1420. <el-input v-model="permissionEditRoleObj.roleName" placeholder="请输入角色名称" style="width: 220px" />
  1421. </el-form-item>
  1422. <el-form-item prop="parentName" label="上级角色:">
  1423. <el-input v-model="permissionEditRoleObj.parentName" placeholder="无上级角色" disabled style="width: 220px">
  1424. <el-option v-for="item in permissionList" :key="item.value" :label="item.label"
  1425. :value="item.value"></el-option>
  1426. </el-input>
  1427. </el-form-item>
  1428. <el-form-item prop="market" label="地区" required>
  1429. <el-input v-model="permissionEditRoleObj.market" placeholder="请输入所属地区" style="width: 220px" disabled />
  1430. </el-form-item>
  1431. <el-form-item prop="checkedKeys" label="权限列表:" required>
  1432. <el-tree v-if="data.length > 0" :data="data" show-checkbox node-key="id"
  1433. :props="{ label: 'menuName', children: 'children' }"
  1434. :default-checked-keys="permissionEditRoleObj.checkedKeys" @check="handleEditRolePermissionCheck">
  1435. <template #default="{ node, data }">
  1436. <span>{{ node.label }}</span>
  1437. </template>
  1438. </el-tree>
  1439. <div v-else style="display: flex; align-items: center; gap: 8px;">
  1440. <span style="color: #999;">暂无数据</span>
  1441. </div>
  1442. </el-form-item>
  1443. <!-- <el-form-item prop="grade" label="优先级:" required>
  1444. <el-input v-model="permissionEditRoleObj.grade" placeholder="数字1~999" style="width: 220px" />
  1445. </el-form-item> -->
  1446. </el-form>
  1447. <div>
  1448. <el-button @click="permissionEditRoleVisible = false">取消</el-button>
  1449. <el-button type="primary" @click="permissionEditRole">
  1450. 提交
  1451. </el-button>
  1452. </div>
  1453. </template>
  1454. </el-dialog>
  1455. </template>
  1456. <style scoped>
  1457. .pagination {
  1458. display: flex;
  1459. }
  1460. .status {
  1461. display: flex;
  1462. }
  1463. .head-card {
  1464. display: flex;
  1465. }
  1466. .head-card-element {
  1467. margin-right: 20px;
  1468. }
  1469. .head-card-btn {
  1470. margin-left: auto;
  1471. }
  1472. /* 新增样式让弹窗内容居中 */
  1473. .el-dialog__body {
  1474. display: flex;
  1475. flex-direction: column;
  1476. align-items: center;
  1477. }
  1478. .el-dialog__footer {
  1479. display: flex;
  1480. flex-direction: column;
  1481. align-items: center;
  1482. }
  1483. .permission-cell {
  1484. cursor: pointer;
  1485. color: #409eff;
  1486. /* 蓝色文字,提示可点击 */
  1487. }
  1488. </style>