Browse Source

fix: 用户菜单

double 5 years ago
parent
commit
ede393f9e5
3 changed files with 275 additions and 6 deletions
  1. 1 0
      src/icons/svg/org.svg
  2. 0 6
      src/layout/components/Navbar.vue
  3. 274 0
      src/views/org/index.vue

+ 1 - 0
src/icons/svg/org.svg

@@ -0,0 +1 @@
+<svg t="1588305902223" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3944" width="200" height="200"><path d="M415.459556 392.533333c-19.712 0-35.640889-15.928889-35.640889-35.612444V192.085333A35.555556 35.555556 0 0 1 415.288889 156.444444h193.251555c19.712 0 35.640889 15.928889 35.640889 35.640889v164.835556c0 19.683556-15.928889 35.612444-35.640889 35.612444H547.555556v86.613334h273.066666c19.683556 0 35.640889 15.928889 35.640889 35.640889v147.541333h60.984889c19.712 0 35.640889 15.928889 35.640889 35.640889v164.835555c0 19.683556-15.928889 35.612444-35.640889 35.612445h-193.251556c-19.712 0-35.640889-15.928889-35.640888-35.612445v-164.835555c0-19.712 15.928889-35.640889 35.640888-35.640889h60.984889v-112.071111H547.555556v112.071111h60.984888c19.712 0 35.640889 15.928889 35.640889 35.640889v164.835555c0 19.683556-15.928889 35.612444-35.640889 35.612445H415.288889c-19.712 0-35.640889-15.928889-35.640889-35.612445v-164.835555c0-19.712 15.928889-35.640889 35.640889-35.640889h60.984889v-112.071111H238.848v112.071111h61.155556c19.712 0 35.640889 15.928889 35.640888 35.640889v164.835555c0 19.683556-15.928889 35.612444-35.612444 35.612445H106.752c-19.712 0-35.640889-15.928889-35.640889-35.612445v-164.835555c0-19.712 15.928889-35.640889 35.640889-35.640889h60.984889v-147.541333c0-19.683556 15.928889-35.640889 35.640889-35.640889h273.066666V392.533333h-60.984888z" p-id="3945"></path></svg>

+ 0 - 6
src/layout/components/Navbar.vue

@@ -30,12 +30,6 @@
           <router-link to="/">
             <el-dropdown-item>Dashboard</el-dropdown-item>
           </router-link>
-          <a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">
-            <el-dropdown-item>Github</el-dropdown-item>
-          </a>
-          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
-            <el-dropdown-item>Docs</el-dropdown-item>
-          </a>
           <el-dropdown-item divided @click.native="logout">
             <span style="display:block;">Log Out</span>
           </el-dropdown-item>

+ 274 - 0
src/views/org/index.vue

@@ -0,0 +1,274 @@
+<template>
+  <el-container>
+    <el-main class="page-main">
+      <el-card>
+        <el-container>
+          <el-aside :width="treeWidth">
+            <tree :fetch="this.$api.sysOrg.tree" :query="nodeQuery" :call-back="getTreeDataCallBack" :click="nodeClick" />
+          </el-aside>
+          <el-container>
+            <el-header height="120">
+              <el-form ref="searchForm" :size="size" label-position="left" label-width="80px">
+                <el-row :gutter="20">
+                  <el-col :span="6">
+                    <el-form-item label="Name:" class="notice-input" label-width="60px">
+                      <el-input
+                        v-model="dataQuery.name"
+                        placeholder="Please input name"
+                        clearable
+                        @keyup.enter.native="search"
+                      />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="6">
+                    <el-form-item label="Code:" class="notice-input" label-width="60px">
+                      <el-input
+                        v-model="dataQuery.code"
+                        placeholder="Please input code"
+                        clearable
+                        @keyup.enter.native="search"
+                      />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12" style="text-align: right">
+                    <el-form-item>
+                      <el-button
+                        type="primary"
+                        icon="el-icon-search"
+                        :size="size"
+                        @click="search"
+                      >Search</el-button>
+                      <el-button icon="el-icon-refresh" :size="size" @click="resetFields">Reset</el-button>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row>
+                  <el-button type="primary" icon="el-icon-plus" :size="size" @click="create">New</el-button>
+                  <el-button :size="size" @click="deleteBatch">BatchDelete</el-button>
+                </el-row>
+              </el-form>
+            </el-header>
+            <el-main class="table-main">
+              <sheet
+                ref="qtable"
+                :api="this.$api.sysOrg.page"
+                :columns="tableColumns"
+                :data-query="dataQuery"
+                :operates="operates"
+                :float-type="'right'"
+                :select-type="'selection'"
+              />
+            </el-main>
+          </el-container>
+        </el-container>
+      </el-card>
+    </el-main>
+    <el-dialog :title="dialogStatus==='create'?'Create':'Edit'" :visible.sync="dialogVisible" width="40%" @close="dialogClose">
+      <el-form ref="dataForm" :size="size" :rules="rules" :model="temp" label-width="85px">
+        <el-form-item label="Name:" prop="name">
+          <el-input v-model="temp.name" placeholder="Please input name" />
+        </el-form-item>
+        <el-form-item label="Code:" prop="code">
+          <el-input v-model="temp.code" placeholder="Please input code" />
+        </el-form-item>
+        <el-form-item label="Url:" prop="url">
+          <el-input v-model="temp.url" placeholder="Please input url" />
+        </el-form-item>
+        <el-form-item label="Com:" prop="component">
+          <el-input v-model="temp.component" placeholder="Please input component" />
+        </el-form-item>
+        <el-form-item label="Order:" prop="order_num">
+          <el-input v-model.number="temp.order_num" placeholder="Please input order" />
+        </el-form-item>
+        <el-form-item label="Icon:" prop="icon">
+          <el-input v-model="temp.icon" placeholder="Please input icon" />
+        </el-form-item>
+        <el-form-item label="Perms:" prop="perms">
+          <el-input v-model="temp.perms" placeholder="Please input perms" />
+        </el-form-item>
+        <el-form-item label="Type:" prop="type">
+          <el-select v-model="temp.type" placeholder="Please input type" style="width: 100%;">
+            <el-option v-for="item in menuTypes" :key="item.id" :label="item.name" :value="item.id" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="Parent:" prop="parent">
+          <cascader
+            :api="this.$api.sysOrg.tree"
+            :data-query="nodeQuery"
+            :value.sync="temp.parent"
+          />
+        </el-form-item>
+        <el-form-item label="Hidden:" prop="hidden">
+          <el-radio v-model="temp.hidden" :label="1">是</el-radio>
+          <el-radio v-model="temp.hidden" :label="0">否</el-radio>
+        </el-form-item>
+      </el-form>
+      <footer slot="footer" class="dialog-footer">
+        <el-button :size="size" @click="dialogVisible = false">取 消</el-button>
+        <el-button :size="size" type="primary" @click="dialogStatus==='create'?createData():updateData()">确 定
+        </el-button>
+      </footer>
+    </el-dialog>
+
+  </el-container>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import Tree from '@/components/Tree'
+import Sheet from '@/components/Sheet'
+import Cascader from '@/components/Cascader'
+
+export default {
+  name: 'Org',
+  components: { Tree, Sheet, Cascader },
+  data() {
+    return {
+      tableColumns: [
+        {
+          prop: 'name',
+          label: 'Name',
+          align: 'center',
+          minWidth: 150,
+          maxWidth: 220
+        },
+        {
+          prop: 'url',
+          label: 'Url',
+          align: 'center',
+          minWidth: 150,
+          maxWidth: 220
+        },
+        {
+          prop: 'component',
+          label: 'Component',
+          align: 'center',
+          minWidth: 180,
+          maxWidth: 220
+        },
+        {
+          prop: 'code',
+          label: 'Code',
+          align: 'center',
+          minWidth: 150,
+          maxWidth: 180
+        },
+        {
+          prop: 'order_num',
+          label: 'Order',
+          align: 'center',
+          minWidth: 150,
+          maxWidth: 180
+        }
+      ],
+      operates: {
+        list: [
+          {
+            label: 'Edit',
+            show: true,
+            type: 'primary',
+            method: row => {
+              this.edit(row)
+            }
+          },
+          {
+            label: 'Delete',
+            show: true,
+            type: 'danger',
+            method: row => {
+              this.deleteData(row)
+            }
+          }
+        ],
+        width: 160,
+        fixed: 'right'
+      },
+      dataQuery: {
+        page: 1,
+        rows: 10,
+        name: '',
+        code: '',
+        cn_id: '',
+        type: '0'
+      },
+      nodeQuery: {
+      },
+      temp: {
+        id: undefined,
+        name: '',
+        code: '',
+        url: '',
+        component: '',
+        parent: this.parent,
+        inheritance: '',
+        icon: '',
+        order_num: 0,
+        perms: '',
+        type: '',
+        hidden: 0
+      },
+      rules: {
+        code: [{ required: true, message: 'Please input code', trigger: 'blur' }],
+        name: [{ required: true, message: 'Please input menu name', trigger: 'blur' }],
+        url: [{ required: true, message: 'Please input url', trigger: 'blur' }]
+      },
+      cascaderData: [],
+      defaultProps: {
+        children: 'nodes',
+        label: 'text',
+        value: 'id'
+      },
+      dataLoading: false,
+      dialogStatus: '',
+      dialogVisible: false,
+      menuTypes: [
+        { id: 0, name: 'Dir' },
+        { id: 1, name: 'Menu' },
+        { id: 2, name: 'Button' }
+      ]
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'size',
+      'minMainHeight',
+      'treeWidth'
+    ])
+  },
+  mounted() {
+    var height = this.$refs.searchForm.$el.offsetHeight
+    this.$store.dispatch('app/pageTableHeaderHeight', { height: height })
+  },
+  destroyed() {
+    this.$store.dispatch('app/pageTableHeaderHeight', { height: 0 })
+  },
+  created() {},
+  methods: {
+    nodeClick(node) {
+      this.dataQuery.cn_id = node.id
+      this.$refs.qtable.getData()
+    },
+    getTreeDataCallBack(tree) {},
+    handleChange(value) {},
+    createData() {},
+    updateData() {},
+    search() {},
+    resetFields() {},
+    deleteData(row) {},
+    deleteBatch() {},
+    dialogClose() {},
+    create() {},
+    edit(row) {
+      this.dialogStatus = 'update'
+      this.dialogVisible = true
+      this.$nextTick(() => {
+        this.$refs['dataForm'].clearValidate()
+        this.temp = Object.assign({}, row)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+</style>