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.

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