zory 2 ヶ月 前
コミット
d3b867dbe4

+ 40 - 0
src/api/model/dic.js

@@ -0,0 +1,40 @@
+import config from "@/config"
+import http from "@/utils/request"
+
+export default {
+    list: {
+        url: `${config.API_URL}/dic/list`,
+        name: "-",
+        get: async function(data={}){
+            return await http.get(this.url, data);
+        }
+    },
+    save: {
+        url: `${config.API_URL}/dic/save`,
+        name: "-",
+        post: async function(data={}){
+            return await http.post(this.url, data);
+        }
+    },
+    subSave: {
+        url: `${config.API_URL}/dic/sub`,
+        name: "-",
+        post: async function(data={}){
+            return await http.post(this.url, data);
+        }
+    },
+    del: {
+        url: `${config.API_URL}/dic/del`,
+        name: "-",
+        post: async function(data={}){
+            return await http.post(this.url, data);
+        }
+    },
+    subDel: {
+        url: `${config.API_URL}/dic/sub_del`,
+        name: "-",
+        post: async function(data={}){
+            return await http.post(this.url, data);
+        }
+    }
+}

+ 69 - 0
src/views/manage/setting/dic/components/category.vue

@@ -0,0 +1,69 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')" :close-on-click-modal="false" :close-on-press-escape="false">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="120px" label-position="top">
+            <el-form-item label="分类名称" prop="name">
+                <el-input v-model="formData.name" placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="字段名称" prop="code">
+                <el-input v-model="formData.code" placeholder="请输入"></el-input>
+                <div class="el-form-item-msg">只支持英文字母、数字,不支持中文</div>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+			<el-button @click="visible=false" >取 消</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">保存</el-button>
+		</template>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            loading: false,
+            mode:"add",
+            visible: false,
+            isSaveing: false,
+            titleMap:{
+                add:"新增字典分类",
+                edit:"编辑字典分类"
+            },
+            rules:{
+                name: [
+                    {required: true, message: '请输入'}
+                ],
+                code: [
+                    {required: true, message: '请输入'}
+                ],
+            },
+            formData:{}
+        }
+    },
+    methods: {
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            var resp = await this.$API.dic.save.post(this.formData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 69 - 0
src/views/manage/setting/dic/components/form.vue

@@ -0,0 +1,69 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')" :close-on-click-modal="false" :close-on-press-escape="false">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="120px" label-position="top">
+            <el-form-item label="数据名称" prop="name">
+                <el-input v-model="formData.name" placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="数据字段" prop="code">
+                <el-input v-model="formData.code" placeholder="请输入"></el-input>
+                <div class="el-form-item-msg">只支持英文字母、数字,不支持中文</div>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+			<el-button @click="visible=false" >取 消</el-button>
+			<el-button type="primary" :loading="isSaveing" @click="submit()">保存</el-button>
+		</template>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            loading: false,
+            mode:"add",
+            visible: false,
+            isSaveing: false,
+            titleMap:{
+                add:"新增数据集",
+                edit:"编辑数据集"
+            },
+            rules:{
+                name: [
+                    {required: true, message: '请输入'}
+                ],
+                code: [
+                    {required: true, message: '请输入'}
+                ],
+            },
+            formData:{}
+        }
+    },
+    methods: {
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            var resp = await this.$API.dic.subSave.post(this.formData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 133 - 0
src/views/manage/setting/dic/index.vue

@@ -0,0 +1,133 @@
+<template>
+    <el-container>
+		<el-aside width="300px" v-loading="menuloading">
+            <el-container>
+				<el-header>
+					<el-input placeholder="输入关键字进行过滤" v-model="menuFilterText" clearable></el-input>
+				</el-header>
+                <el-main class="nopadding">
+                    <el-tree ref="menu" class="menu" node-key="id" :data="menuList" :props="menuProps" draggable highlight-current :expand-on-click-node="false" check-strictly :filter-node-method="menuFilterNode" @node-click="menuClick" @node-drop="nodeDrop">
+						<template #default="{node, data}">
+							<span class="custom-tree-node">
+								<span class="label">
+									{{ node.label }}
+								</span>
+								<span class="code">{{ data.code }}</span>
+								<span class="do">
+									<el-button-group>
+										<el-button icon="el-icon-edit" size="small" @click.stop="dicEdit(data)"></el-button>
+										<el-button icon="el-icon-delete" size="small" @click.stop="dicDel(data)"></el-button>
+									</el-button-group>
+								</span>
+							</span>
+						</template>
+					</el-tree>
+                </el-main>
+				<el-footer style="height:51px;">
+					<el-button type="primary" size="small" icon="el-icon-plus" @click="addCate()">添加分类</el-button>
+				</el-footer>
+            </el-container>
+        </el-aside>
+		<el-container v-if="subState">
+			<el-header>
+				<div class="left-panel">
+					<el-button type="primary" icon="el-icon-plus" @click="addInfo"></el-button>
+				</div>
+			</el-header>
+			<el-main class="nopadding" style="padding:20px;" ref="main">
+				<subList ref="save" @success="getMenu" :dataList="subDataList" :parent="checkData"></subList>
+			</el-main>
+		</el-container>
+    </el-container>
+    <categoryForm ref="categoryForm" @success="hanldeSuccess()"></categoryForm>
+    <subForm ref="subForm" @success="hanldeSuccess()"></subForm>
+</template>
+
+<script>
+import categoryForm from './components/category'
+import subForm from './components/form'
+import subList from './sub'
+export default {
+    components: {
+        categoryForm,subList,subForm
+    },
+    data() {
+        return {
+            menuloading: false,
+            subState:false,
+            menuList: [],
+            subDataList:[],
+            selection:[],
+            menuProps: {
+                label: (data)=>{
+                    return data.name
+                }
+            },
+            menuFilterText: "",
+            checkData:null
+        }
+    },
+    mounted() {
+        this.getMenu();
+    },
+    methods: {
+        async dicDel(row){
+            var reqData = {id: row.id}
+            var resp = await this.$API.dic.del.post(reqData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.getMenu();
+        },
+        addInfo(){
+            this.$nextTick(() => {
+                this.$refs.subForm.open("add").setData({id:this.checkData.id})
+            })
+        },
+        async menuClick(data){
+            this.checkData = data;
+            this.subState = true
+            var res = await this.$API.dic.list.get({dicId:data.id});
+            if(res.code == 1)
+            {
+                this.subDataList = res.data.content;
+            }
+        },
+        dicEdit(data){
+            this.$nextTick(() => {
+                this.$refs.categoryForm.open("edit").setData(data)
+            })
+        },
+        addCate(){
+            this.$nextTick(() => {
+                this.$refs.categoryForm.open()
+            })
+        },
+        hanldeSuccess(){
+            this.getMenu();
+        },
+        //加载树数据
+        async getMenu(){
+            this.menuloading = true
+            var res = await this.$API.dic.list.get();
+            this.menuloading = false
+            if(res.code == 1)
+            {
+                this.menuList = res.data;
+                if (this.checkData) {
+                    this.menuClick(this.checkData)
+                }
+            }
+        },
+    }
+}
+</script>
+
+<style scoped>
+	.custom-tree-node {display: flex;flex: 1;align-items: center;justify-content: space-between;font-size: 14px;padding-right: 24px;height:100%;}
+	.custom-tree-node .code {font-size: 12px;color: #999;}
+	.custom-tree-node .do {display: none;}
+	.custom-tree-node:hover .code {display: none;}
+	.custom-tree-node:hover .do {display: inline-block;}
+</style>

+ 39 - 0
src/views/manage/setting/dic/sub.vue

@@ -0,0 +1,39 @@
+<template>
+    <scTable ref="table" :data="dataList" row-key="id" @selection-change="selectionChange" stripe :paginationLayout="'prev, pager, next'">
+        <el-table-column type="selection" width="50"></el-table-column>
+        <el-table-column label="名称" prop="name" width="150"></el-table-column>
+        <el-table-column label="键值" prop="code" width="150"></el-table-column>
+        <el-table-column label="操作" fixed="right" align="right" width="120">
+            <template #default="scope">
+                <el-button-group>
+                    <el-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
+                        <template #reference>
+                            <el-button text type="primary" size="small">删除</el-button>
+                        </template>
+                    </el-popconfirm>
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        dataList: { type: Object, default: () => [] },
+        parent: { type: Object, default: () => {} }
+    },
+    methods: {
+        //删除明细
+        async table_del(row, index){
+            var reqData = {id: this.parent.id,key:index}
+            var resp = await this.$API.dic.subDel.post(reqData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+    }
+}
+</script>

+ 13 - 0
src/views/manage/setting/page/index.vue

@@ -0,0 +1,13 @@
+<template>
+    
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    }
+}
+</script>