role.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. <template>
  2. <div class="container">
  3. <div class="content">
  4. <div class="left">
  5. <div class="title">
  6. 角色管理
  7. </div>
  8. <div class="main">
  9. <my-tree
  10. :data="treeData"
  11. :formConfig="treeformConfig"
  12. :ruleValidate="treeRuleValidate"
  13. :showCheckbox="false"
  14. @handleEvent="treeHandle"
  15. @check="treeCheck"></my-tree>
  16. </div>
  17. </div>
  18. <div class="right" style="margin-right: 15px">
  19. <div class="title">
  20. 仓储web权限
  21. </div>
  22. <div class="main" v-if="roleKey">
  23. <div style="text-align: right">
  24. <Button type="primary" @click="savaRoleMenu">保存权限</Button>
  25. </div>
  26. <div style="height: calc(100% - 32px)">
  27. <my-tree
  28. :data="menuData"
  29. :show-edit="false"
  30. :multiple="true"
  31. :selected="true"
  32. @check="menuTreeCheck"></my-tree>
  33. </div>
  34. </div>
  35. </div>
  36. <!-- <div class="right">
  37. <div class="title">
  38. 仓储APP权限
  39. </div>
  40. <div class="main" v-if="roleKey">
  41. <div style="text-align: right">
  42. <Button type="primary" @click="savaRoleMenu">保存权限</Button>
  43. </div>
  44. <div style="height: calc(100% - 32px)">
  45. <my-tree
  46. :data="menuData2"
  47. :show-edit="false"
  48. :multiple="true"
  49. @check="menuTreeCheck2"></my-tree>
  50. </div>
  51. </div>
  52. </div> -->
  53. </div>
  54. </div>
  55. </template>
  56. <script>
  57. import MyTable from '_c/my-table/my-table'
  58. import MyTree from '_c/my-tree/my-tree'
  59. import MyModalForm from '_c/my-modal-form/my-modal-form'
  60. export default {
  61. name: 'role_manage',
  62. components: {
  63. MyTree,
  64. MyTable,
  65. MyModalForm
  66. },
  67. data () {
  68. return {
  69. show: false,
  70. roleKey: '',
  71. menuIds: [],
  72. menuIds2: [],
  73. // 树相关数据
  74. treeRuleValidate: {
  75. name: [
  76. { required: true, message: '角色名称不能为空', trigger: 'blur' }
  77. ],
  78. key: [
  79. { required: true, message: '角色编码不能为空', trigger: 'blur' }
  80. ]
  81. },
  82. treeformConfig: [
  83. {
  84. type: 'input',
  85. label: '角色名',
  86. key: 'roleName',
  87. placeholder: '请输入分类名称'
  88. },
  89. // {
  90. // type: 'input',
  91. // label: '角色编码',
  92. // key: 'key',
  93. // placeholder: '请输入角色编码'
  94. // },
  95. // {
  96. // type: 'select',
  97. // label: '角色类型',
  98. // key: 'isDefault',
  99. // list: [
  100. // { label: '默认用户', value: 1 },
  101. // { label: '普通用户', value: 0 }
  102. // ],
  103. // placeholder: '请选择角色类型'
  104. // }
  105. ],
  106. ruleValidate: {
  107. name: [
  108. { required: true, message: '物料名称不能为空', trigger: 'blur' }
  109. ],
  110. code: [
  111. { required: true, message: '物料编码不能为空', trigger: 'blur' }
  112. ],
  113. spec: [
  114. { required: true, message: '规格不能为空', trigger: 'blur' }
  115. ],
  116. unitWeight: [
  117. { required: true, message: '克重不能为空', trigger: 'blur' }
  118. ]
  119. },
  120. formType: '',
  121. formData: {},
  122. formConfig: [
  123. {
  124. type: 'input',
  125. label: '物料编码',
  126. key: 'code',
  127. placeholder: '请输入物料编码'
  128. },
  129. {
  130. type: 'input',
  131. label: '物料名称',
  132. key: 'name',
  133. placeholder: '请输入物料名称'
  134. },
  135. {
  136. type: 'input',
  137. label: '规格',
  138. key: 'spec',
  139. placeholder: '请输入规格'
  140. },
  141. {
  142. type: 'input',
  143. comType: 'number',
  144. label: '单位',
  145. key: 'unit',
  146. placeholder: '请输入单位/米'
  147. },
  148. {
  149. type: 'input',
  150. comType: 'number',
  151. label: '克重',
  152. key: 'unitWeight',
  153. placeholder: '请输入克重'
  154. },
  155. {
  156. type: 'input',
  157. comType: 'number',
  158. label: '门幅',
  159. key: 'width',
  160. placeholder: '请输入门幅'
  161. },
  162. {
  163. type: 'input',
  164. comType: 'number',
  165. label: '安全库存',
  166. key: 'safetyStock',
  167. placeholder: '请输入安全库存'
  168. },
  169. {
  170. type: 'input',
  171. comType: 'number',
  172. label: '采购周期',
  173. key: 'safetyWarnDay',
  174. placeholder: '请输入采购周期'
  175. },
  176. {
  177. type: 'input',
  178. comType: 'number',
  179. label: '抽检比例',
  180. key: 'checkRate',
  181. placeholder: '请输入抽检比例'
  182. },
  183. {
  184. type: 'input',
  185. comType: 'textarea',
  186. label: '备注',
  187. key: 'remark',
  188. placeholder: '请输入仓库说明'
  189. }
  190. ],
  191. columns: [
  192. {
  193. title: '序号',
  194. type: 'index',
  195. width: 60,
  196. align: 'center'
  197. },
  198. {
  199. title: '物料编码',
  200. key: 'code',
  201. minWidth: 150
  202. },
  203. {
  204. title: '物料名称',
  205. key: 'name',
  206. minWidth: 150
  207. },
  208. {
  209. title: '克重',
  210. key: 'unitWeight',
  211. minWidth: 100
  212. },
  213. {
  214. title: '门幅',
  215. key: 'width',
  216. minWidth: 100
  217. }, {
  218. title: '安全库存',
  219. key: 'safetyStock',
  220. minWidth: 100
  221. },
  222. {
  223. title: '采购周期',
  224. key: 'safetyWarnDay',
  225. minWidth: 100
  226. },
  227. {
  228. title: '操作',
  229. key: 'action',
  230. align: 'center',
  231. width: '200px',
  232. render: (h, params) => {
  233. return h('div', [
  234. h(
  235. 'Button',
  236. {
  237. props: {
  238. type: 'success',
  239. size: 'small'
  240. },
  241. style: {
  242. marginRight: '.5vw'
  243. },
  244. on: {
  245. click: () => {
  246. for (const key in params.row) {
  247. this.formData[key] = params.row[key]
  248. }
  249. this.formType = 'edit'
  250. this.show = true
  251. }
  252. }
  253. },
  254. '修改'
  255. ),
  256. h(
  257. 'Button',
  258. {
  259. props: {
  260. type: 'error',
  261. size: 'small'
  262. },
  263. style: {
  264. },
  265. on: {
  266. click: () => {
  267. this.$MyModal.show({ text: '是否删除?' }).$on('confirm', () => {
  268. MaterialDelete({
  269. id: params.row.id
  270. }).then(res => {
  271. if (res.code === 0) {
  272. this.$Message.info(res.msg)
  273. this.getList()
  274. }
  275. })
  276. })
  277. }
  278. }
  279. },
  280. '删除'
  281. )
  282. ])
  283. }
  284. }
  285. ],
  286. tableFilter: [
  287. {
  288. name: 'Input',
  289. value: 'key',
  290. placeholder: '请输入关键字'
  291. },
  292. {
  293. name: 'Button',
  294. type: 'primary',
  295. text: '查询',
  296. e: 'search'
  297. },
  298. {
  299. name: 'Button',
  300. type: 'primary',
  301. text: '添加',
  302. align: 'right',
  303. e: 'add'
  304. }
  305. ],
  306. params: {
  307. pageIndex: 1,
  308. pageSize: 20,
  309. total: 0
  310. },
  311. menuData: [],
  312. menuData2: [],
  313. treeData: []
  314. }
  315. },
  316. methods: {
  317. cfm (type, data) {
  318. if (type === 'add') {
  319. MaterialAdd({
  320. ...data,
  321. categoryCode: this.categoryCode
  322. }).then(res => {
  323. if (res.code === 0) {
  324. this.$Message.info(res.msg)
  325. this.getList()
  326. }
  327. })
  328. } else if (type === 'edit') {
  329. MaterialUpdate(data).then(res => {
  330. if (res.code === 0) {
  331. this.$Message.info(res.msg)
  332. this.getList()
  333. }
  334. })
  335. }
  336. },
  337. treeInit(data){
  338. for (let i = 0; i < data.length; i++) {
  339. const element = data[i];
  340. element.name = element.roleName = element.title
  341. if(element.children && element.children.length > 0) this.treeInit(element.children)
  342. }
  343. },
  344. getTree () {
  345. const v = this
  346. v.$get('/api/blade-system/role/tree').then(res=>{
  347. v.treeInit(res.data)
  348. this.treeData = res.data
  349. console.log(res)
  350. })
  351. },
  352. // list 项目路由 menus 系统定义的路由
  353. iniTree2 (list, menus) {
  354. list.forEach(item => {
  355. menus.forEach(menu => {
  356. console.log(item,menu)
  357. item.expand = true
  358. if (item.value === menu) {
  359. item.checked = true
  360. }
  361. if (item.children) {
  362. this.iniTree(item.children, menus)
  363. }
  364. })
  365. })
  366. return list
  367. },
  368. getHandleMenuIds (data, type) {
  369. data.forEach(item => {
  370. if (item.checked) {
  371. if (type === 1) {
  372. this.menuIds.push(item.value)
  373. } else if (type === 2) {n
  374. this.menuIds2.push(item.value)
  375. }
  376. }
  377. if (item.children) {
  378. this.getHandleMenuIds(item.children, type)
  379. }
  380. })
  381. },
  382. initTree(menuList,menuVal){
  383. for (let i = 0; i < menuList.length; i++) {
  384. const element = menuList[i];
  385. for (let j = 0; j < menuVal.length; j++) {
  386. const jelement = menuVal[j];
  387. if(element.value === jelement){
  388. element.checked = true
  389. break
  390. }
  391. }
  392. if(element.children && element.children.length > 0){
  393. this.initTree(element.children,menuVal)
  394. }
  395. }
  396. return menuList
  397. },
  398. // 获取已勾选的菜单
  399. getList () {
  400. const v = this
  401. v.$get('/api/blade-system/menu/grant-tree',{}).then(res1=>{
  402. v.treeInit(res1.data.menu)
  403. v.$get('/api/blade-system/menu/role-tree-keys?roleIds=' + this.roleKey,{}).then(res2=>{
  404. this.initTree(res1.data.menu, res2.data.menu)
  405. this.menuData = res1.data.menu
  406. console.log(this.menuData)
  407. })
  408. })
  409. },
  410. getList2 () {
  411. const v = this
  412. v.$get('/api/blade-system/appMenu/tree',{}).then(res1=>{
  413. v.treeInit(res1.data.menu)
  414. v.$get('/api/blade-system/appMenu/bindRole',{
  415. }).then(res2=>{
  416. this.initTree(res1.data.menu, res2.data.menu)
  417. this.menuData = res1.data.menu
  418. console.log(this.menuData)
  419. })
  420. })
  421. // GetMenuZTreeChildren({
  422. // deviceType: 3
  423. // }).then(res => {
  424. // if (res.code === 0) {
  425. // GetMenuOperateList({ roleKey: this.roleKey }).then((menu) => {
  426. // if (menu.code === 0) {
  427. // this.menuData2 = this.iniTree(res.result, menu.result.menuIds)
  428. // this.menuIds2 = []
  429. // this.getHandleMenuIds(this.menuData2, 2)
  430. // }
  431. // })
  432. // }
  433. // })
  434. },
  435. savaRoleMenu () {
  436. console.log(this.menuIds)
  437. const v = this
  438. v.$post("/api/blade-system/role/grant",{
  439. apiScopeIds:[],
  440. dataScopeIds:[],
  441. menuIds:this.menuIds,
  442. roleIds:[this.roleKey]
  443. }).then(res=>{
  444. this.$Message.info('保存成功!')
  445. this.getList()
  446. })
  447. },
  448. menuTreeCheck (data) {
  449. this.menuIds = []
  450. data.forEach(item => {
  451. this.menuIds.push(item.value)
  452. })
  453. },
  454. menuTreeCheck2 (data) {
  455. this.menuIds2 = []
  456. data.forEach(item => {
  457. this.menuIds2.push(item.value)
  458. })
  459. },
  460. // 选择物料分类 显示物料列表
  461. treeCheck (data) {
  462. console.log(data)
  463. if (data.name !== '默认角色' && data.name !== '普通角色') {
  464. this.roleKey = data.key
  465. this.menuIds = []
  466. this.getList(data.id)
  467. //this.getList2(data.id)
  468. }
  469. },
  470. // 提交树操作
  471. treeHandle (type, data, target) {
  472. if (type === 'add') {
  473. this.$post('/api/blade-system/role/submit',{
  474. parentId:0,
  475. roleAlias:data.roleName,
  476. roleName:data.roleName,
  477. sort:1,
  478. tenantId:'000000'
  479. }).then(res=>{
  480. this.getTree()
  481. this.$Message.info(res.msg)
  482. })
  483. } else if (type === 'edit') {
  484. console.log(data,target)
  485. this.$post('/api/blade-system/role/submit',{
  486. parentId:data.parentId,
  487. roleAlias:data.roleName,
  488. roleName:data.roleName,
  489. sort:1,
  490. tenantId:'000000',
  491. id:data.id
  492. }).then(res=>{
  493. this.getTree()
  494. this.$Message.info(res.msg)
  495. })
  496. } else if (type === 'del') {
  497. this.$post('/api/blade-system/role/remove?ids=' + target.id + '',{
  498. }).then(res=>{
  499. this.getTree()
  500. this.$Message.info(res.msg)
  501. })
  502. }
  503. }
  504. },
  505. mounted () {
  506. this.getTree()
  507. }
  508. }
  509. </script>
  510. <style lang="less" scoped>
  511. .container {
  512. height: 100%;
  513. overflow: hidden;
  514. .content {
  515. padding: 10px;
  516. display: flex;
  517. justify-content: space-between;
  518. height: 100%;
  519. .left, .right {
  520. height: 100%;
  521. overflow: auto;
  522. box-shadow: 3px 3px 5px rgb(127, 127, 127, .35);
  523. background-color: #FFFFFF;
  524. .title {
  525. padding: 5px 0;
  526. background-color: #539DFA;
  527. font-size: 18px;
  528. font-weight: bold;
  529. text-align: center;
  530. color: #FFFFFF;
  531. }
  532. .main {
  533. box-sizing: border-box;
  534. padding: 10px;
  535. height: ~"calc(100% - 48px)";
  536. }
  537. }
  538. .left {
  539. margin-right: 15px;
  540. flex: 1;
  541. min-width: 320px;
  542. }
  543. .right {
  544. flex: 3;
  545. min-width: 200px;
  546. }
  547. }
  548. }
  549. </style>