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.

1630 lines
54 KiB

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