index.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <template>
  2. <div id="index">
  3. <el-row>
  4. <el-col :span="24" class="index">
  5. <el-col :span="24" class="top">
  6. <topInfo :topTitle="pageTitle"></topInfo>
  7. <el-col :span="24" class="topAdd">
  8. <el-button type="primary" size="mini" @click="toAdd()"><i class="el-icon-plus"></i>添加菜单</el-button>
  9. </el-col>
  10. </el-col>
  11. <el-col :span="24" class="main">
  12. <data-table :fields="fields" @delete="toDelete" :data="list" :opera="opera" @edit="toEdit" :usePage="false"></data-table>
  13. </el-col>
  14. </el-col>
  15. </el-row>
  16. <el-drawer title="菜单" :visible.sync="drawer" direction="rtl" @closed="handleClose" :destroy-on-close="true">
  17. <el-form :model="form" size="mini" label-width="120px" style="padding:10px">
  18. <el-form-item label="名称" prop="role_name">
  19. <el-input v-model="form.role_name"></el-input>
  20. </el-form-item>
  21. <el-form-item label="菜单分级" prop="type">
  22. <el-select v-model="form.type" @change="clearCode">
  23. <el-option value="1" label="一级菜单"></el-option>
  24. <el-option value="2" label="二级菜单"></el-option>
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="名称" prop="code" v-if="form.type == 2">
  28. <el-select v-model="form.code" @change="updateView">
  29. <el-option v-for="(i, index) in list" :key="index" :label="i.role_name" :value="i.id"></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="路由" prop="url">
  33. <el-input v-model="form.url"></el-input>
  34. </el-form-item>
  35. <el-form-item>
  36. <el-button type="primary" @click="drawerSave">保存</el-button>
  37. </el-form-item>
  38. </el-form>
  39. </el-drawer>
  40. </div>
  41. </template>
  42. <script>
  43. import topInfo from '@/layout/public/top.vue';
  44. import dataTable from '@/components/data-table.vue';
  45. import { mapState, createNamespacedHelpers } from 'vuex';
  46. const { mapActions } = createNamespacedHelpers('role');
  47. export default {
  48. name: 'index',
  49. props: {},
  50. components: {
  51. topInfo,
  52. dataTable,
  53. },
  54. data: () => ({
  55. drawer: false,
  56. form: {},
  57. drawerIsNew: true,
  58. opera: [
  59. {
  60. label: '编辑',
  61. icon: 'el-icon-edit',
  62. method: 'edit',
  63. },
  64. {
  65. label: '删除',
  66. icon: 'el-icon-delete',
  67. method: 'delete',
  68. confirm: true,
  69. },
  70. ],
  71. fields: [
  72. { label: '名称', prop: 'role_name', model: 'role_name' },
  73. { label: '路由', prop: 'url', model: 'url' },
  74. ],
  75. list: [],
  76. total: 0,
  77. }),
  78. created() {
  79. this.search();
  80. },
  81. methods: {
  82. ...mapActions(['query', 'create', 'update', 'delete']),
  83. // 查询列表
  84. async search({ skip = 0, limit = 10, ...info } = {}) {
  85. const res = await this.query({ ...info, category: this.category });
  86. if (this.$checkRes(res)) {
  87. this.$set(this, `list`, res.data.reverse());
  88. this.$set(this, `total`, res.total);
  89. }
  90. },
  91. // 添加
  92. toAdd() {
  93. this.drawer = true;
  94. },
  95. // 创建
  96. async drawerSave({ data = this.form, isNew = this.drawerIsNew }) {
  97. let res;
  98. let msg;
  99. if (isNew) {
  100. res = await this.create(data);
  101. msg = '创建成功';
  102. } else {
  103. res = await this.update(data);
  104. msg = '修改成功';
  105. }
  106. if (this.$checkRes(res, msg, res.errmsg)) {
  107. this.handleClose();
  108. this.search();
  109. }
  110. },
  111. // 修改
  112. toEdit({ data }) {
  113. if (data.code) data.type = '2';
  114. this.$set(this, 'form', data);
  115. this.drawer = true;
  116. this.drawerIsNew = false;
  117. },
  118. // 删除
  119. async toDelete({ data }) {
  120. const res = await this.delete(data.id);
  121. if (this.$checkRes(res, '删除成功', res.errmsg || '删除失败')) this.search();
  122. },
  123. handleClose() {
  124. this.drawer = false;
  125. this.form = {};
  126. this.drawerIsNew = true;
  127. },
  128. clearCode(data) {
  129. if (data == '1') this.form.code = undefined;
  130. },
  131. updateView() {
  132. this.$forceUpdate();
  133. },
  134. },
  135. computed: {
  136. pageTitle() {
  137. return `${this.$route.meta.title}`;
  138. },
  139. },
  140. metaInfo() {
  141. return { title: this.$route.meta.title };
  142. },
  143. };
  144. </script>
  145. <style lang="less" scoped>
  146. .topAdd {
  147. padding: 10px 20px;
  148. text-align: right;
  149. }
  150. .main {
  151. padding: 0 20px;
  152. }
  153. </style>