home.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <div class="menushome">
  3. <el-card class="box-card-left">
  4. <div slot="header">
  5. <span>菜单列表</span>
  6. </div>
  7. <deepTree @nodeClick="treeClick" class="deepTree" :data="treeList"></deepTree>
  8. </el-card>
  9. <el-card class="box-card box-card-right">
  10. <div slot="header" class="clearfix">
  11. <span>菜单管理</span>
  12. <el-button style="float: right; padding: 3px 0" type="text" @click="addmenus" icon="el-icon-plus">添加菜单</el-button>
  13. </div>
  14. <div class="main">
  15. <filterList ref="filterList" :tableData="menusList" :filed="filed" @edit="filtereEdit" @delete="filterDelete" @query="filterQuery" :total="Total"></filterList>
  16. </div>
  17. </el-card>
  18. <dialogAndDrawer :width="'35%'" :title="title" :visibleSync="visibleSync" v-if="visibleSync" @close="visibleSync = false">
  19. <template v-slot:windowMain>
  20. <formData ref="formData" :filed="formfiled" :data="formdata" :rules="formrules" @save="formSave">
  21. <template v-slot:formItem="{ item, formdata }">
  22. <el-select v-model="formdata[item.name]" placeholder="请选择上级菜单" v-if="item.name == 'parentCode'">
  23. <el-option label="无" value="null"></el-option>
  24. <el-option v-for="item in menusall" :key="item.code" :label="item.name" :value="item.code"></el-option>
  25. </el-select>
  26. <!-- 显示开关 -->
  27. <el-switch v-if="item.name == 'isshow'" v-model="formdata[item.name]" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
  28. </template>
  29. <template v-slot:ext="{ formdata }">
  30. <!-- 地址 -->
  31. <el-form-item prop="url" v-if="formdata && formdata.type == '0'" label="地址">
  32. <el-input v-model="formdata['url']" placeholder="请输入地址"></el-input>
  33. </el-form-item>
  34. </template>
  35. </formData>
  36. </template>
  37. </dialogAndDrawer>
  38. </div>
  39. </template>
  40. <script>
  41. import filterList from '@components/filterList/index.vue';
  42. import dialogAndDrawer from '@components/dialogAndDrawer.vue';
  43. import formData from '@components/formData/index.vue';
  44. import deepTree from '@components/deepTree.vue';
  45. import { mapState, mapActions } from 'vuex';
  46. export default {
  47. components: {
  48. filterList,
  49. dialogAndDrawer,
  50. formData,
  51. deepTree
  52. },
  53. data() {
  54. return {
  55. types: null,
  56. title: '',
  57. visibleSync: false,
  58. filed: [
  59. { name: 'name', label: '名称', filter: true },
  60. { name: 'code', label: '编码', filter: true }
  61. ],
  62. formdata: {},
  63. formfiled: [
  64. { name: 'name', label: '名称' },
  65. { name: 'code', label: '编码' },
  66. { name: 'parentCode', label: '上级菜单', formater: 'slot' },
  67. { name: 'isshow', label: '是否显示', formater: 'slot' },
  68. { name: 'date', label: '时间', formater: 'date:datetime' },
  69. { name: 'type', label: '类型', formater: 'dict:imgNewsType' }
  70. ],
  71. formrules: {
  72. name: [
  73. { required: true, message: '请输入名称', trigger: 'blur' }
  74. ],
  75. code: [
  76. { required: true, message: '请输入编码', trigger: 'blur' }
  77. ],
  78. date: [
  79. { required: true, message: '请输入时间', trigger: 'blur' }
  80. ],
  81. type: [
  82. { required: true, message: '请输入类型', trigger: 'blur' }
  83. ],
  84. url: [
  85. { required: true, message: '请输入类型', trigger: 'blur' }
  86. ],
  87. parentCode: [
  88. { required: true, message: '请选择类型', trigger: 'chage' }
  89. ]
  90. }
  91. };
  92. },
  93. computed: {
  94. ...mapState(['menusList', 'Total', 'typeList', 'columnList', 'pagesList', 'menusall']),
  95. treeList() {
  96. return this.$tree(this.menusall);
  97. }
  98. },
  99. async mounted() {
  100. await this.filterQuery();
  101. await this.codeQuery();
  102. await this.pagesQuery();
  103. await this.menusQueryAll();
  104. },
  105. methods: {
  106. ...mapActions(['menusQuery', 'menusCreate', 'menusUpdate', 'menusDelete', 'menusQuery', 'codeQuery', 'pagesQuery', 'menusQueryAll']),
  107. // 添加
  108. addmenus () {
  109. this.formdata = { isshow: true };
  110. this.title = '添加菜单';
  111. this.visibleSync = true;
  112. if (this.types !== null) this.$set(this.formdata, 'parentCode', this.types);
  113. },
  114. // 修改
  115. async filtereEdit (e) {
  116. this.formdata = e;
  117. this.title = '修改菜单';
  118. this.visibleSync = true;
  119. },
  120. // 删除
  121. async filterDelete (e) {
  122. const res = await this.menusDelete({ id: e?._id });
  123. this.$resChange(res, '删除成功');
  124. this.filterQuery();
  125. },
  126. // 查询
  127. async filterQuery ({ filter = {}, paging = { page: 0, size: 10 } } = {}) {
  128. if (this.types) filter.parentCode = this.types;
  129. await this.menusQuery({ filter, paging });
  130. },
  131. // 表单保存
  132. async formSave (e) {
  133. if (e.isRevise && e?.isRevise == false) {
  134. this.$message.warning('未作修改');
  135. return;
  136. }
  137. this.$delete(e, 'isRevise');
  138. let res, msg;
  139. // 修改
  140. if (e._id) {
  141. res = await this.menusUpdate(e);
  142. msg = '菜单修改成功';
  143. } else {
  144. res = await this.menusCreate(e);
  145. msg = '菜单添加成功';
  146. }
  147. const filter = { parentCode: this.types };
  148. await this.filterQuery({ filter });
  149. await this.menusQueryAll();
  150. this.$resChange(res, msg);
  151. this.visibleSync = false;
  152. this.$refs.filterList.resetPage(-1);
  153. },
  154. async treeClick({ data, node }) {
  155. this.types = data.code;
  156. const filter = { parentCode: data.code };
  157. await this.filterQuery({ filter });
  158. this.$refs.filterList.resetPage(-1);
  159. }
  160. }
  161. };
  162. </script>
  163. <style lang="scss" scoped>
  164. .menushome {
  165. width: 100%;
  166. height: 100%;
  167. display: flex;
  168. .box-card {
  169. width: 80%;
  170. height: 100%;
  171. .el-card__body {
  172. height: 100%;
  173. }
  174. }
  175. .box-card-left {
  176. width: 20%;
  177. height: 100%;
  178. ::v-deep .el-card__body {
  179. height: 88%;
  180. .deepTree {
  181. width: 100%;
  182. height: 100%;
  183. overflow-y: auto;
  184. }
  185. .deepTree::-webkit-scrollbar {/*滚动条整体样式*/
  186. width: 0px; /*高宽分别对应横竖滚动条的尺寸*/
  187. height: 0px;
  188. }
  189. }
  190. }
  191. }
  192. </style>