From 8e93a889280064483b901959e3b42f966d0ad371 Mon Sep 17 00:00:00 2001 From: wangting <wangting@vci-tech.com> Date: 星期二, 24 十二月 2024 14:30:13 +0800 Subject: [PATCH] 图标管理,图标选择组件,图标显示组件 --- Source/plt-web/plt-web-ui/src/components/PLT-basic-component/iconShow.vue | 41 +++++ Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue | 236 +++++++++++++++++++++++---------- Source/plt-web/plt-web-ui/src/components/PLT-basic-component/input-icon.vue | 72 ++++++--- Source/plt-web/plt-web-ui/src/main.js | 3 Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue | 7 Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/statusPool/index.vue | 9 6 files changed, 259 insertions(+), 109 deletions(-) diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/iconShow.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/iconShow.vue new file mode 100644 index 0000000..f40d2b9 --- /dev/null +++ b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/iconShow.vue @@ -0,0 +1,41 @@ +<template> + <div :style="'width:'+fontSize+';height:'+fontSize+';font-size: '+fontSize+';'+style" v-html="svgHtml"></div> +</template> + +<script> +import func from "@/util/func"; +export default { +name: "iconShow", + props: { + name: { + type: String, + default: '' + }, + fontSize: { + type: String, + default:'20px' + }, + style:{ + type: String, + default:'' + } + }, + computed:{ + svgHtml() { + return func.getSVGByName(this.name); + }, + }, + methods:{ + } +} +</script> + +<style lang="scss" scoped> +::v-deep { + svg{ + font-size: inherit; + height: 100%; + width:auto; + } +} +</style> diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/input-icon.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/input-icon.vue index 156d397..6c25d75 100644 --- a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/input-icon.vue +++ b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/input-icon.vue @@ -2,7 +2,7 @@ <div> <el-input :width="width" :class="inputClass" :style="inputStyle" :clearable="true" :value="value" :disabled="disabled" :placeholder="placeholder" type="text" :size="size" @clear="clearValue" @focus="handleFocus"> - <span slot="append" v-html="svgHtml"></span> + <span slot="append" v-html="svgHtml" style="font-size: 18px;height:18px;display: block"></span> </el-input> <el-dialog v-dialogDrag v-dialog-resize @@ -17,10 +17,10 @@ <span class="tag-group__title">鍒嗙被</span> <el-tag v-for="item in types" - :key="item.value" - :type="checkedTypes.includes(item.value)?'success':'info'" size="small" - effect="plain" @click="changeType(item.value)"> - {{ item.label }} + :key="item.key" + :type="checkedTypes.includes(item.key)?'success':'info'" size="small" + effect="plain" @click="changeType(item.key)"> + {{ item.value }} </el-tag> </div> <avue-input v-model="searchText" @change="handleSearch" placeholder="鏌ヨ" size="mini" prefixIcon="el-icon-search" style="width: 300px;max-width: 30%"></avue-input> @@ -30,8 +30,8 @@ <el-tab-pane v-for="item in iconList" :label="item.lable" :name="item.lable" style="height: calc(60vh - 80px);;overflow: auto "> <div class="iconList"> <div class="iconItem" v-for="svg in item.list" :data-value="svg.name" @click="checkSvg(svg,item.lable)"> - <div v-html="svg.content"></div> - <!--<span>{{svg.name.split(':')[1]}}</span>--> + <div class="svgContent" v-html="svg.content"></div> + <span>{{svg.name.split(':')[1]}}</span> </div> </div> </el-tab-pane> @@ -47,6 +47,7 @@ import func from "@/util/func"; import store from "@/store"; import {getIcons} from "@/api/UI/Icons"; +import {getDicts} from "@/api/system/dict"; export default { name: "input-icon", @@ -79,16 +80,7 @@ data(){ return { visible: false, - types: [{ - label:'鎸夐挳', - value:0 - },{ - label:'鏍囩浜�', - value:1 - },{ - label:'鏍囩涓�', - value:2 - }], + types: [], checkedTypes:[], searchText:'', activeName:'', @@ -105,6 +97,7 @@ } }, created(){ + this.getGroups(); if (!validatenull(this.$store.state.icons)) { this.iconList = this.$store.state.icons; } else { @@ -115,16 +108,31 @@ this.activeName=this.iconList[0].lable; }else { getIcons().then(res => { - this.iconList=res.data.data; - this.allIconList=this.iconList; - store.dispatch("setIcons", this.iconList); - if(this.iconList&&this.iconList.length>0) { - this.activeName=this.iconList[0].lable; + if (res.data.success) { + this.iconList = res.data.data; + this.allIconList = this.iconList; + store.dispatch("setIcons", this.iconList); + if (this.iconList.length > 0) { + this.activeName = this.iconList[0].lable; + } + } else { + this.$message.error(res.data.msg); } }) } + + this.svgHtml=func.getSVGByName(this.value); }, methods:{ + getGroups() { + getDicts('EnumIconGroups').then(res => { + if (res.data.success) { + this.types = res.data.obj; + } else { + this.$message.error(res.data.msg); + } + }) + }, dialogClose() { this.visible = false; }, @@ -148,9 +156,16 @@ this.iconList=this.allIconList }else{ const checkedTypes=JSON.stringify(this.checkedTypes); - this.iconList=this.allIconList.filter(item=> { - return checkedTypes.indexOf(JSON.stringify(item.groups))!=-1; + const iconList=[]; + this.allIconList.forEach(item=>{ + iconList.push({ + lable:item.lable, + list:item.list.filter(iconitem=> { + return checkedTypes.indexOf(iconitem.groups)!=-1; + }) + }) }) + this.iconList=iconList; } this.activeName=this.iconList[0].lable; }, @@ -197,11 +212,14 @@ flex-wrap: wrap; } .iconList .iconItem{ - width: 65px; - margin: 6px; + width: 85px; + margin: 6px 5px 10px 5px; text-align: center; } -.iconList .iconItem div:hover{ +.iconList .iconItem .svgContent{ + font-size: 24px; +} +.iconList .iconItem .svgContent:hover{ transform: scale(1.5); } .iconList .iconItem span{ diff --git a/Source/plt-web/plt-web-ui/src/main.js b/Source/plt-web/plt-web-ui/src/main.js index 1b720c9..b301bd9 100644 --- a/Source/plt-web/plt-web-ui/src/main.js +++ b/Source/plt-web/plt-web-ui/src/main.js @@ -46,6 +46,8 @@ import transfer from "@/components/PLT-basic-component/transfer"; //鍥炬爣閫夋嫨鍣ㄧ粍浠� import inputIcon from "@/components/PLT-basic-component/input-icon"; +//鍥炬爣鏄剧ず缁勪欢 +import iconShow from "@/components/PLT-basic-component/iconShow"; // 娉ㄥ唽鍏ㄥ眬瀹瑰櫒 Vue.component('basicContainer', basicContainer); Vue.component('basicBlock', basicBlock); @@ -63,6 +65,7 @@ Vue.component('Divider', Divider); Vue.component('transfer', transfer); Vue.component('inputIcon', inputIcon); +Vue.component('iconShow', iconShow); import ECharts from 'vue-echarts' Vue.component('v-chart', ECharts) diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue index 0eb440a..edef882 100644 --- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue +++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/businessType/index.vue @@ -55,8 +55,8 @@ <template slot="label"> 鍥炬爣 </template> - <span class="avue-icon avue-icon--small" style="display: block"> - <span v-html="svgHtml(nodeRow.imageName )"></span> + <span class="avue-icon"> + <icon-show :name="nodeRow.imageName"></icon-show> </span> </el-descriptions-item> <el-descriptions-item :span="12" :contentStyle="descriptionOption.contentStyle" @@ -829,9 +829,6 @@ } }, methods: { - svgHtml(svgName){ - return func.getSVGByName(svgName); - }, //鏍戣〃鏌ヨ getTreeList() { this.treeLoading = true; diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/statusPool/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/statusPool/index.vue index 93f1e2b..5552afc 100644 --- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/statusPool/index.vue +++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/statusPool/index.vue @@ -33,7 +33,9 @@ </template> <template #icon="{ row }"> - <span v-html="svgHtml(row.imagePath )"></span> + <span class="avue-icon"> + <icon-show :name="row.imagePath"></icon-show> + </span> </template> </avue-crud> @@ -108,14 +110,12 @@ import {gridStatus, addSave, editSave, deleteStatus, exportStatus, listUsed} from "@/api/modeling/statusPool/api"; import func from "@/util/func"; import basicOption from "@/util/basic-option"; -import iconList from "@/config/iconList"; import {mapGetters} from "vuex"; export default { name: "index", data() { return { - iconList: iconList, loading: false, data: [], option: { @@ -219,9 +219,6 @@ this.getList(); }, methods: { - svgHtml(svgName){ - return func.getSVGByName(svgName); - }, getList() { gridStatus(this.page.currentPage, this.page.pageSize).then(res => { const data = res.data.data; diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue index 228d56c..0f4c415 100644 --- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue +++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/Icons/index.vue @@ -4,20 +4,21 @@ <basic-container> <div style="display: flex;justify-content: space-between;flex-wrap: wrap"> <div class="tag-group"> - <span class="tag-group__title">鍒嗙被</span> + <span class="tag-group__title">鍒嗙粍</span> <el-tag v-for="item in types" - :key="item.value" - :type="checkedTypes.includes(item.value)?'success':'info'" size="small" - effect="plain" @click="changeType(item.value)"> - {{ item.label }} + :key="item.key" + :type="checkedTypes.includes(item.key)?'success':'info'" size="small" + effect="plain" @click="changeType(item.key)"> + {{ item.value }} </el-tag> </div> <avue-input v-model="searchText" @change="handleSearch" placeholder="鏌ヨ" size="mini" prefixIcon="el-icon-search" style="width: 300px;max-width: 30%"></avue-input> </div> <div style="height: calc(100vh - 190px)"> <div> - <el-button icon="el-icon-plus" type="primary" size="mini" @click="uploadHandler">娣诲姞</el-button> + <el-button icon="el-icon-plus" type="primary" size="mini" @click="addHandler">娣诲姞</el-button> + <el-button icon="el-icon-upload" type="primary" size="mini" @click="uploadHandler">涓婁紶</el-button> </div> <el-tabs v-model="activeName" @tab-click="handleClick"> @@ -25,8 +26,8 @@ <div class="iconList"> <div class="iconItem" v-for="svg in item.list" :data-value="svg.name" v-right-click="{action:checkSvg,data:svg}"> - <div v-html="svg.content"></div> - <!--<span>{{svg.name.split(':')[1]}}</span>--> + <div class="svgContent" v-html="svg.content"></div> + <span>{{svg.name.split(':')[1]}}</span> </div> </div> <div v-if="menuVisible" class="el-cascader-panel is-bordered iconList__menu" :style="menuPosition"> @@ -39,19 +40,31 @@ <!-- 涓婁紶 --> <el-dialog v-dialogDrag - title="娣诲姞鍥炬爣" + title="涓婁紶鍥炬爣" :visible.sync="visible" append-to-body="true" class="avue-dialog" - width="500px" + width="600px" @close="visibleCloseHandler" > - <avue-form ref="form" :option="option" v-model="form" :upload-after="uploadAfter"> </avue-form> + <avue-form ref="form" :option="option" v-model="form" :upload-after="uploadAfter" style="margin-bottom: 0;height:90px;overflow: hidden"> </avue-form> + <pre style="font-size: 12px;color: #b3b3b3;margin-top: 0;padding:5px;background-color: #f5f5f5">涓婁紶鏂囦欢涓簀son鏂囦欢锛岀ず渚嬪涓� +[ + { + "name": "iconoir:accessibility", + "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\"><path d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10M7 9l5 1m5-1l-5 1m0 0v3m0 0l-2 5m2-5l2 5\"/><path fill=\"currentColor\" d=\"M12 7a.5.5 0 1 1 0-1a.5.5 0 0 1 0 1\"/></g></svg>" + }, + { + "name": "iconoir:accessibility-sign", + "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\"><path d=\"m11.5 12.5l7-.5l-1.5 6.5m-5.5-6l4.5-5L12.5 5L10 7.5m8.5-1a2 2 0 1 1 0-4a2 2 0 0 1 0 4\"/><path d=\"M5.5 12.5a5 5 0 0 1 7.584 6M3.729 15A5 5 0 0 0 11 20.831\"/></g></svg>" + } + ] + 鏂囦欢鍐呭椤讳弗鏍兼寜鐓хず渚嬫牸寮忥紝name涓哄浘鏍囧簱鍚�+鍥炬爣鍚嶇О锛屼互鈥�:鈥濆垎闅旓紝svg涓哄浘鏍噃tml浠g爜</pre> </el-dialog> - <!-- 淇敼 --> + <!-- 娣诲姞銆佷慨鏀� --> <el-dialog v-dialogDrag - title="淇敼鍥炬爣" + :title="editType=='add'?'娣诲姞鍥炬爣':'淇敼鍥炬爣'" :visible.sync="editVisible" append-to-body="true" class="avue-dialog" @@ -71,6 +84,7 @@ <script> import {getIcons,addIcon,updateIcon,deleteIcon} from "@/api/UI/Icons"; +import {getDicts} from "@/api/system/dict"; import {validatenull} from "@/util/validate"; import {getStore} from "@/util/store"; import store from "@/store"; @@ -91,16 +105,7 @@ }, data() { return { - types: [{ - label:'鎸夐挳', - value:0 - },{ - label:'鏍囩浜�', - value:1 - },{ - label:'鏍囩涓�', - value:2 - }], + types: [], checkedTypes:[], searchText:'', activeName:'', @@ -113,12 +118,16 @@ submitBtn:false, emptyBtn:false, column: [{ - label: '鍒嗙被', + label: '鍒嗙粍', prop: 'groups', type: 'select', span: 24, multiple:true, - dicData:this.types + dicData:[], + props:{ + label:'value', + value:'key' + } }, { label: "闄勪欢涓婁紶", prop: "file", @@ -137,27 +146,51 @@ groups:[], file:null }, + editType:'edit', editVisible:false, editOption:{ - labelWidth: 80, + labelWidth: 90, submitBtn:false, emptyBtn:false, column: [{ - label: 'name', - prop: 'name', + label: '鍥炬爣搴撳悕', + prop: 'libname', type: 'input', disabled:true, span: 24, rules: [{ required: true, - message: "璇疯緭鍏ュ浘鏍噉ame", + message: "璇疯緭鍏ュ浘鏍囧簱鍚�", trigger: "blur" }] + },{ + label: '鍚嶇О', + prop: 'iconname', + type: 'input', + disabled:true, + span: 24, + rules: [{ + required: true, + message: "璇疯緭鍏ュ浘鏍囧悕绉�", + trigger: "blur" + }] + },{ + label: '鍒嗙粍', + prop: 'groups', + type: 'select', + span: 24, + multiple:true, + dicData:[], + props:{ + label:'value', + value:'key' + } }, { - label: "svg", + label: "svg浠g爜", prop: "content", type: "textarea", span: 24, + placeholder:'璇疯緭鍏ュ浘鏍噑vg浠g爜锛屾牸寮忕ず渚�<svg xmlns=\"http://www.w3.org/2000/svg\" ></svg>', rules: [{ required: true, message: "璇疯緭鍏ュ浘鏍噑vg浠g爜", @@ -167,7 +200,8 @@ }, editForm:{ oid:'', - name:'', + libname:'', + iconname:'', content:'' }, menuVisible:false, @@ -193,20 +227,35 @@ } }, created() { - this.initList(); - this.option.column[0].dicData=this.types; - }, + this.getGroups(); + this.initList(); }, methods:{ + getGroups() { + getDicts('EnumIconGroups').then(res => { + if (res.data.success) { + this.types = res.data.obj; + this.option.column[0].dicData = res.data.obj; + this.editOption.column[2].dicData =res.data.obj; + } else { + this.$message.error(res.data.msg); + } + }) + }, initList(reload){ - if(reload){ + if(reload) { getIcons().then(res => { - this.iconList = res.data.data; - this.allIconList = this.iconList; - store.dispatch("setIcons", this.iconList); - if (this.iconList.length > 0) { - this.activeName = this.iconList[0].lable; + if (res.data.success) { + this.iconList = res.data.data; + this.allIconList = this.iconList; + store.dispatch("setIcons", this.iconList); + if (this.iconList.length > 0) { + this.activeName = this.iconList[0].lable; + } + } else { + this.$message.error(res.data.msg); } }) + return; } if (!validatenull(this.$store.state.icons)) { @@ -219,25 +268,29 @@ this.activeName=this.iconList[0].lable; }else { getIcons().then(res => { - this.iconList = [{ - lable: 'iconoir', - list: [{ - oid: '', - groups: '0', - "name": "iconoir:accessibility", - "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\"><path d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10M7 9l5 1m5-1l-5 1m0 0v3m0 0l-2 5m2-5l2 5\"/><path fill=\"currentColor\" d=\"M12 7a.5.5 0 1 1 0-1a.5.5 0 0 1 0 1\"/></g></svg>" + if (res.data.success) { + this.iconList = [{ + lable: 'iconoir', + list: [{ + oid: '', + groups: '1', + "name": "iconoir:accessibility", + "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\"><path d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2S2 6.477 2 12s4.477 10 10 10M7 9l5 1m5-1l-5 1m0 0v3m0 0l-2 5m2-5l2 5\"/><path fill=\"currentColor\" d=\"M12 7a.5.5 0 1 1 0-1a.5.5 0 0 1 0 1\"/></g></svg>" + }] }] - }] - this.iconList = res.data.data; - this.allIconList = this.iconList; - store.dispatch("setIcons", this.iconList); - if (this.iconList.length > 0) { - this.activeName = this.iconList[0].lable; + this.iconList = res.data.data; + this.allIconList = this.iconList; + store.dispatch("setIcons", this.iconList); + if (this.iconList.length > 0) { + this.activeName = this.iconList[0].lable; + } + } else { + this.$message.error(res.data.msg); } }) } }, - changeType(type){debugger; + changeType(type){ if(this.checkedTypes.includes(type)){ this.checkedTypes=this.checkedTypes.filter(item=> item!=type) }else { @@ -248,9 +301,16 @@ this.iconList=this.allIconList }else{ const checkedTypes=JSON.stringify(this.checkedTypes); - this.iconList=this.allIconList.filter(item=> { - return checkedTypes.indexOf(JSON.stringify(item.groups))!=-1; + const iconList=[]; + this.allIconList.forEach(item=>{ + iconList.push({ + lable:item.lable, + list:item.list.filter(iconitem=> { + return checkedTypes.indexOf(iconitem.groups)!=-1; + }) + }) }) + this.iconList=iconList; } this.activeName=this.iconList[0].lable; }, @@ -327,24 +387,49 @@ } }); }, + addHandler(){ + this.editOption.column[0].disabled=false; + this.editOption.column[1].disabled=false; + this.editType='add'; + this.editVisible=true; + }, editHandler(){ + this.editType='edit'; + this.editOption.column[0].disabled=true; + this.editOption.column[1].disabled=true; this.editForm=this.checkItem; + this.editForm.libname=this.checkItem.name.split(':')[0] + this.editForm.iconname=this.checkItem.name.split(':')[1] this.editVisible=true; }, editSaveHandler(){ this.$refs.editForm.validate((valid,done) => { if (valid) { done() - updateIcon(this.editForm).then(res => { - if (res.data.code === 200) { - this.$message.success(res.data.msg); - this.initList(true); - done(); - this.closeHandler(); - } else { - this.$message.error(res.data.msg); - } - }) + this.editForm.name= this.editForm.libname+':'+ this.editForm.iconname; + if(this.editType=='edit'){ + updateIcon(this.editForm).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.msg); + this.initList(true); + done(); + this.closeHandler(); + } else { + this.$message.error(res.data.msg); + } + }) + }else { + addIcon(this.editForm).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.msg); + this.initList(true); + done(); + this.closeHandler(); + } else { + this.$message.error(res.data.msg); + } + }) + } } else { return false; } @@ -352,11 +437,17 @@ }, closeHandler(){ this.editForm={ + type:'svg', oid:'', - name:'', + libname:'', + iconname:'', + groups:[], content:'' - } + }; + this.editOption.column[0].disabled=false; + this.editOption.column[1].disabled=false; this.editVisible=false; + this.$refs.editForm.clearValidate(); }, delHandler(){ this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎璇ュ浘鏍囧悧锛�', '鎻愮ず', { @@ -395,11 +486,14 @@ flex-wrap: wrap; } .iconList .iconItem{ - width: 35px; - margin: 6px 12px; + width: 85px; + margin: 6px 5px 10px 5px; text-align: center; } -.iconList .iconItem div:hover{ +.iconList .iconItem .svgContent{ + font-size: 26px; +} +.iconList .iconItem .svgContent:hover{ transform: scale(1.5); } .iconList .iconItem span{ -- Gitblit v1.9.3