guhongwei 5 年 前
コミット
93593b2b0f

+ 3 - 0
src/store/index.js

@@ -11,6 +11,8 @@ import liveTechnicalNews from './liveTechnicalNews';
 import codeitem from './codeitem';
 import codeCategory from './codeCategory';
 import exportuser from './exportuser';
+//菜单分配权限
+import role from './user/role';
 // 个人&企业
 import users from './user';
 // 对接会
@@ -36,6 +38,7 @@ export default new Vuex.Store({
     live, //对接会
     place, //地址
     apply, //对接会
+    role, //菜单分配权限
   },
   state: { ...ustate },
   mutations: { ...umutations },

+ 44 - 0
src/store/user/auth-user.js

@@ -0,0 +1,44 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+//用户的菜单选项增删改查
+Vue.use(Vuex);
+const api = {
+  interface: `/api/auth/user`,
+  getMenu: `/api/auth/user/menus`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit = undefined, ...info } = {}) {
+    const res = await this.$axios.$get(api.interface, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.interface}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    //特殊变化,查用户菜单
+    const res = await this.$axios.$get(`${api.getMenu}`, payload);
+    return res;
+  },
+  async update({ commit }, { id, ...info } = {}) {
+    const res = await this.$axios.$post(`${api.interface}/update/${id}`, {
+      ...info,
+    });
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.interface}/${payload}`);
+    return res;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 33 - 0
src/store/user/mutations.js

@@ -0,0 +1,33 @@
+export const setUser = (state, payload) => {
+  state.user = payload;
+  // let res = true;
+  // //登陆时
+  // if (payload) {
+  //   state.token = payload;
+  // } else {
+  //   //已经登陆,切换路由时取出用户信息放在总store中
+  //   let token = localStorage.getItem('token');
+  //   if (token && token !== 'guest') {
+  //     state.user = jwt.decode(token);
+  //   } else if (token && token == 'guest') {
+  //     let user = localStorage.getItem('user');
+  //     state.user = JSON.parse(user);
+  //   } else {
+  //     let timestamp = new Date().getTime();
+  //     let user = {
+  //       // id: `guest${timestamp}`,
+  //       name: `游客${timestamp}`,
+  //     };
+  //     state.user = user;
+  //     localStorage.setItem('token', 'guest');
+  //     localStorage.setItem('user', JSON.stringify(user));
+  //     console.warn('游客身份');
+  //   }
+  // }
+  // return res;
+};
+
+export const deleteUser = (state, payload) => {
+  state.user = {};
+  localStorage.removeItem('token');
+};

+ 40 - 0
src/store/user/role.js

@@ -0,0 +1,40 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+//用户的菜单选项增删改查
+Vue.use(Vuex);
+const api = {
+  interface: `/api/auth/role`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit = undefined, ...info } = {}) {
+    const res = await this.$axios.$get(api.interface, { skip, limit, ...info });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.interface}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.interface}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...info } = {}) {
+    const res = await this.$axios.$post(`${api.interface}/update/${id}`, { ...info });
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.interface}/${payload}`);
+    return res;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 2 - 0
src/store/user/state.js

@@ -0,0 +1,2 @@
+export const user = {};
+export const menuList = [];

+ 0 - 1
src/views/enterpriseTrans/detail.vue

@@ -15,7 +15,6 @@
 import topInfo from '@/layout/public/top.vue';
 import detail from '@/layout/enterpriseTrans/detail.vue';
 import { createNamespacedHelpers, mapState } from 'vuex';
-
 const { mapActions: tranaudit } = createNamespacedHelpers('tranaudit');
 const { mapActions: transaction } = createNamespacedHelpers('transaction');
 

+ 123 - 6
src/views/menu/index.vue

@@ -4,25 +4,134 @@
       <el-col :span="24" class="index">
         <el-col :span="24" class="top">
           <topInfo :topTitle="pageTitle"></topInfo>
+          <el-col :span="24" class="topAdd">
+            <el-button type="primary" size="mini" @click="toAdd()"><i class="el-icon-plus"></i>添加菜单</el-button>
+          </el-col>
         </el-col>
-        <el-col :span="24" class="info">
-          主体
+        <el-col :span="24" class="main">
+          <data-table :fields="fields" @delete="toDelete" :data="list" :opera="opera" @edit="toEdit" :usePage="false"></data-table>
         </el-col>
       </el-col>
     </el-row>
+    <el-drawer title="菜单" :visible.sync="drawer" direction="rtl" @closed="handleClose" :destroy-on-close="true">
+      <el-form :model="form" size="mini" label-width="120px" style="padding:10px">
+        <el-form-item label="名称" prop="role_name">
+          <el-input v-model="form.role_name"></el-input>
+        </el-form-item>
+        <el-form-item label="菜单分级" prop="type">
+          <el-select v-model="form.type" @change="clearCode">
+            <el-option value="1" label="一级菜单"></el-option>
+            <el-option value="2" label="二级菜单"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="名称" prop="code" v-if="form.type == 2">
+          <el-select v-model="form.code" @change="updateView">
+            <el-option v-for="(i, index) in list" :key="index" :label="i.role_name" :value="i.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="路由" prop="url">
+          <el-input v-model="form.url"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="drawerSave">保存</el-button>
+        </el-form-item>
+      </el-form>
+    </el-drawer>
   </div>
 </template>
 <script>
 import topInfo from '@/layout/public/top.vue';
+import dataTable from '@/components/data-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('role');
 export default {
   name: 'index',
   props: {},
   components: {
     topInfo,
+    dataTable,
+  },
+  data: () => ({
+    drawer: false,
+    form: {},
+    drawerIsNew: true,
+    opera: [
+      {
+        label: '编辑',
+        icon: 'el-icon-edit',
+        method: 'edit',
+      },
+      {
+        label: '删除',
+        icon: 'el-icon-delete',
+        method: 'delete',
+        confirm: true,
+      },
+    ],
+    fields: [
+      { label: '名称', prop: 'role_name', model: 'role_name' },
+      { label: '路由', prop: 'url', model: 'url' },
+    ],
+    list: [],
+    total: 0,
+  }),
+  created() {
+    this.search();
+  },
+  methods: {
+    ...mapActions(['query', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ ...info, category: this.category });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 添加
+    toAdd() {
+      this.drawer = true;
+    },
+    // 创建
+    async drawerSave({ data = this.form, isNew = this.drawerIsNew }) {
+      let res;
+      let msg;
+      if (isNew) {
+        res = await this.create(data);
+        msg = '创建成功';
+      } else {
+        res = await this.update(data);
+        msg = '修改成功';
+      }
+      if (this.$checkRes(res, msg, res.errmsg)) {
+        this.handleClose();
+        this.search();
+      }
+    },
+    // 修改
+    toEdit({ data }) {
+      if (data.code) data.type = '2';
+      this.$set(this, 'form', data);
+      this.drawer = true;
+      this.drawerIsNew = false;
+    },
+    // 删除
+    async toDelete({ data }) {
+      const res = await this.delete(data.id);
+      if (this.$checkRes(res, '删除成功', res.errmsg || '删除失败')) this.search();
+    },
+    handleClose() {
+      this.drawer = false;
+      this.form = {};
+      this.drawerIsNew = true;
+    },
+    clearCode(data) {
+      if (data == '1') this.form.code = undefined;
+    },
+    updateView() {
+      this.$forceUpdate();
+    },
   },
-  data: () => ({}),
-  created() {},
-  methods: {},
   computed: {
     pageTitle() {
       return `${this.$route.meta.title}`;
@@ -33,4 +142,12 @@ export default {
   },
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.topAdd {
+  padding: 10px 20px;
+  text-align: right;
+}
+.main {
+  padding: 0 20px;
+}
+</style>