Bläddra i källkod

新增多层字典界面

zhulu 1 år sedan
förälder
incheckning
57ad8bf6d4
2 ändrade filer med 675 tillägg och 0 borttagningar
  1. 52 0
      src/api/system/multilayerdict.js
  2. 623 0
      src/views/system/multilayerdict/index.vue

+ 52 - 0
src/api/system/multilayerdict.js

@@ -0,0 +1,52 @@
+import request from "@/utils/request";
+
+// 查询角色列表
+export function treeList() {
+  return request({
+    url: "/system/dictionary/tree/list",
+    method: "get",
+  });
+}
+
+// 查询列表
+export function tableListData(id) {
+    return request({
+      url: "/system/dictionary/getDictTreeByParentId?parentId="+id,
+      method: "get",
+    });
+  }
+
+
+// 新增字典数据
+export function addData(data) {
+    return request({
+      url: '/system/dictionary',
+      method: 'post',
+      data: data
+    })
+  }
+  
+  // 修改字典数据
+  export function updateData(data) {
+    return request({
+      url: '/system/dictionary',
+      method: 'put',
+      data: data
+    })
+  }
+  
+  // 删除字典数据
+  export function delData(dictCode) {
+    return request({
+      url: '/system/dictionary/' + dictCode,
+      method: 'delete'
+    })
+  }
+
+  // 查询字典数据详细
+export function getData(id) {
+    return request({
+      url: '/system/dictionary/' + id,
+      method: 'get'
+    })
+  }

+ 623 - 0
src/views/system/multilayerdict/index.vue

@@ -0,0 +1,623 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10">
+      <!--多层级字典数-->
+       <el-col :span="6" :xs="24">
+     <!--   <org-tree
+          v-model="queryParams.orgId"
+          @defaultKey="getDefaultKey"
+          @checkChange="checkChange"
+          @click="clickTreeNode"
+          :customRequest="getTree"
+          :defaultProps="defaultProps"
+        >
+        </org-tree> -->
+        <div class="dic-tree">
+        <el-tree
+            :data="dictTreeData"
+            node-key="id"
+            default-expand-all
+            class="el-tree-ex"
+            @node-click="clickTreeNode"
+            :props="defaultProps"
+            :expand-on-click-node="false">
+            <span class="custom-tree-node" slot-scope="{ node, data }">
+              <span>{{ node.label }}</span>
+              <span>
+                <el-button
+                  type="text"
+                  size="mini"
+                  @click="() => handleAdd(data)">
+                  新增
+                </el-button>
+                <el-button v-if="data.id !=null"
+                  type="text"
+                  size="mini"
+                  @click="() => handleUpdate(data)">
+                  编辑
+                </el-button>
+                <el-button v-if="data.id !=null && data.children.length==0"
+                  type="text"
+                  size="mini"
+                  @click="() => handleDelete(data)">
+                  删除
+                </el-button>
+              </span>
+            </span>
+          </el-tree>
+        </div>
+      </el-col>
+      <!--用户数据-->
+      <el-col :span="18" :xs="24" v-if="1">
+        <div class="main-search-box">
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+        >
+          <!-- <el-form-item label="字典名称" prop="dictType">
+            <el-select v-model="queryParams.dictType">
+              <el-option
+                v-for="item in typeOptions"
+                :key="item.dictId"
+                :label="item.dictName"
+                :value="item.dictType"
+              />
+            </el-select>
+          </el-form-item> -->
+          <el-form-item label="字典标签" prop="name">
+            <el-input
+              v-model="queryParams.name"
+              placeholder="请输入字典标签"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="状态" prop="status">
+            <el-select
+              v-model="queryParams.status"
+              placeholder="数据状态"
+              clearable
+            >
+              <el-option
+                v-for="dict in dict.type.sys_normal_disable"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" >
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery">搜索</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-col>
+          <!-- <el-col :span="1.5">
+            <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:dict:add']"
+            >新增</el-button
+            >
+          </el-col> -->
+          <!-- <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit-outline"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:dict:edit']"
+            >修改</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:dict:remove']"
+            >删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="warning"
+              plain
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:dict:export']"
+            >导出</el-button>
+          </el-col> -->
+          <!-- <el-col :span="1.5">
+            <el-button
+              type="primary"
+              icon="el-icon-close"
+              size="small"
+              @click="handleClose"
+            >关闭</el-button
+            >
+          </el-col> -->
+          <right-toolbar
+            :showSearch.sync="showSearch"
+            @queryTable="getList"
+          ></right-toolbar>
+        </el-row>
+      </div>
+      <el-table
+        border
+        height="646"
+        size="small"
+        v-loading="loading"
+        :data="dataList"
+        @selection-change="handleSelectionChange"
+      >
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="字典编码" align="center" prop="parentId" />
+        <el-table-column label="字典标签" align="center" prop="name"  :show-overflow-tooltip="true" width="340">
+          <template slot-scope="scope">
+          <span
+            v-if="scope.row.listClass == '' || scope.row.listClass == 'default'"
+          >{{ scope.row.name }}</span
+          >
+            <el-tag
+              v-else
+              :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass"
+            >{{ scope.row.name }}</el-tag
+            >
+          </template>
+        </el-table-column>
+        <el-table-column label="字典键值" align="center" prop="code"  width="140"/>
+        <el-table-column label="字典排序" align="center" prop="sort" width="140"/>
+        <el-table-column label="状态" align="center" prop="status" width="140">
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.sys_normal_disable"
+              :value="scope.row.status"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="备注"
+          align="center"
+          prop="remark"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+
+        <el-table-column
+          label="创建时间"
+          align="center"
+          prop="createTime"
+          width="180"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="操作"
+          align="center"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit-outline"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:dict:edit']"
+            >编辑</el-button
+            >
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['system:dict:remove']"
+            >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+      
+      </el-col>
+    </el-row>
+       <!-- 添加或修改参数配置对话框 -->
+       <DialogCom :title="title" :visible.sync="open" width="700px" append-to-body>
+        <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="父级字典">
+                <el-input v-model="form.parentName" :disabled="true" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="字典标签" prop="name">
+                <el-input v-model="form.name" placeholder="请输入字典标签" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="字典键值" prop="code">
+                <el-input v-model="form.code" placeholder="请输入字典键值" />
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="12">
+              <el-form-item label="样式属性" prop="cssClass">
+                <el-input v-model="form.cssClass" placeholder="请输入样式属性" />
+              </el-form-item>
+            </el-col> -->
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="字典排序" prop="sort">
+                <el-input-number
+                  style="width: 100%"
+                  v-model="form.sort"
+                  controls-position="right"
+                  :min="0"
+                />
+              </el-form-item>
+            </el-col>
+            <!-- <el-col :span="12">
+              <el-form-item label="回显样式" prop="listClass">
+                <el-select style="width: 100%" v-model="form.listClass">
+                  <el-option
+                    v-for="item in listClassOptions"
+                    :key="item.value"
+                    :label="item.label + '(' + item.value + ')'"
+                    :value="item.value"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col> -->
+          </el-row>
+
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="状态" prop="status">
+                <el-radio-group v-model="form.status">
+                  <el-radio
+                    v-for="dict in dict.type.sys_normal_disable"
+                    :key="dict.value"
+                    :label="dict.value"
+                  >{{ dict.label }}</el-radio
+                  >
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="备注" prop="remark">
+            <el-input
+              v-model="form.remark"
+              type="textarea"
+              placeholder="请输入内容"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </DialogCom>
+  </div>
+</template>
+
+<script>
+import OrgTree from "@/components/orgTree";
+import {
+  
+  
+} from "@/api/system/dict/data";
+import {
+  optionselect as getDictOptionselect,
+  getType,
+} from "@/api/system/dict/type";
+import {treeList,delData,
+  addData,
+  updateData,
+  getData,tableListData,} from "@/api/system/multilayerdict";
+
+export default {
+  dicts: [
+    "sys_normal_disable",
+    "sys_user_sex",
+    "sys_user_is_lock",
+    "sys_yes_no",
+  ],
+
+  name: "User",
+  mixins: [],
+  components: {OrgTree},
+
+  data() {
+    return {
+      defaultProps: {
+        children: "children",
+        label: "name",
+      },      
+      dictTreeData:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个停用
+      single: true,
+      // 非多个停用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 字典表格数据
+      dataList: [],
+      // 默认字典类型
+      defaultDictType: "",
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      
+      // 类型数据字典
+      typeOptions: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dictName: undefined,
+        dictType: undefined,
+        status: undefined,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [
+          { required: true, message: "字典标签不能为空", trigger: "blur" },
+        ],
+        code: [
+          { required: true, message: "字典键值不能为空", trigger: "blur" },
+        ],
+        sort: [
+          { required: true, message: "字典排序不能为空", trigger: "blur" },
+        ],
+      },
+    };
+  },
+
+  watch: {
+   
+  },
+
+  created() {
+    // const dictId = this.$route.params && this.$route.params.dictId;
+    // this.getType(dictId);
+    // this.getTypeList();
+  },
+
+  mounted() {
+    this.getDictTreeData();
+  },
+
+  methods: {   
+    getTree() {
+      return treeList();
+    }, 
+    getDictTreeData()
+    {
+      treeList()
+        .then((response) => {
+         this.dictTreeData =response.data;
+        })
+        .catch((err) => {
+        
+        });
+    },
+    /** 查询字典类型详细 */
+    getType(dictId) {
+      getType(dictId).then((response) => {
+        this.queryParams.dictType = response.data.dictType;
+        this.defaultDictType = response.data.dictType;
+        this.getList();
+      });
+    },
+    /** 查询字典类型列表 */
+    getTypeList() {
+      getDictOptionselect().then((response) => {
+        this.typeOptions = response.data;
+      });
+    },
+    clickTreeNode(data)
+    {
+      this.queryParams.parentId = data.id?data.id:-1;
+      this.handleQuery();
+    },
+    /** 查询字典数据列表 */
+    getList() {
+      this.loading = true;
+      tableListData(this.queryParams.parentId).then((response) => {
+        this.dataList = response.data;
+        this.total = response.data.length;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id:null,
+        parentId:null,
+        parentName: undefined,
+        name: undefined,
+        code: undefined,
+        sort: 0,
+        status: "0",
+        remark: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 返回按钮操作 */
+    handleClose() {
+      const obj = { path: "/system/dict" };
+      this.$tab.closeOpenPage(obj);
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.dictType = this.defaultDictType;
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(parent) {
+      this.reset();
+      this.open = true;
+      this.title = "新增";
+      //
+      if(parent.id)
+      {
+        this.form.parentName = parent.name;
+        this.form.parentId =parent.id;
+      }
+      else{
+        this.form.type=parent.code;
+        this.form.typeName=parent.name;
+        this.form.parentName = parent.name;
+        this.form.parentId =-1;
+      }
+     
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.parentId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 修改按钮操作 */
+    handleUpdate(data) {
+      this.reset();
+      getData(data.id).then((response) => {
+        this.form = response.data;
+        this.form.parentName = response.data.typeName;
+        this.open = true;
+        this.title = "编辑";
+      });
+    },
+    /** 提交按钮 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateData(this.form).then((response) => {
+              // this.$store.dispatch(
+              //   "dict/removeDict",
+              //   this.queryParams.dictType
+              // );
+              this.$modal.msgSuccess("处理成功");
+              this.open = false;
+              this.getList();
+              this.getDictTreeData();
+            });
+          } else {
+            addData(this.form).then((response) => {
+              // this.$store.dispatch(
+              //   "dict/removeDict",
+              //   this.queryParams.dictType
+              // );
+              this.$modal.msgSuccess("处理成功");
+              this.open = false;
+              this.getList();
+              this.getDictTreeData();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(data) {      
+      this.$modal
+        .confirm('是否确认删除字典编"' + data.name + '"的数据项?')
+        .then(function () {
+          return delData(data.id);
+        })
+        .then(() => {
+          this.getList();
+          this.getDictTreeData();
+          this.$modal.msgSuccess("删除成功");
+       
+        })
+        .catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        "system/dict/data/export",
+        {
+          ...this.queryParams,
+        },
+        `data_${new Date().getTime()}.xlsx`
+      );
+    },
+  }
+};
+</script>
+
+<style lang="scss"></style>
+<style lang="scss" scoped>
+ .custom-tree-node {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 14px;
+    padding-right: 8px;
+  }
+  .dic-tree{
+  background-color: #fff;
+  padding: 10px;
+  box-shadow: 0 2px 8px #ccc;
+  -min-height: calc(100vh - 107px);
+  overflow: auto;
+}
+.el-tree-ex {
+  ::v-deep .is-current > .el-tree-node__content {
+    background-color: #d1e0f1 !important;
+    display:inline-flex;
+    min-width:100%;
+  }
+}
+</style>