Commit 986d1328e0a0d37e2de2fb9d937faeed9d9bee7b
1 parent
4a8129bf
v3.6.0 增加字典标签样式回显
Showing
8 changed files
with
129 additions
and
11 deletions
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataBaseVO.java
| ... | ... | @@ -38,6 +38,11 @@ public class DictDataBaseVO { |
| 38 | 38 | // @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}") |
| 39 | 39 | private Integer status; |
| 40 | 40 | |
| 41 | + @ApiModelProperty(value = "颜色类型", example = "default", notes = "default、primary、success、info、warning、danger") | |
| 42 | + private String colorType; | |
| 43 | + @ApiModelProperty(value = "css 样式", example = "btn-visible") | |
| 44 | + private String cssClass; | |
| 45 | + | |
| 41 | 46 | @ApiModelProperty(value = "备注", example = "我是一个角色") |
| 42 | 47 | private String remark; |
| 43 | 48 | ... | ... |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/dict/vo/data/DictDataSimpleRespVO.java
| ... | ... | @@ -17,4 +17,9 @@ public class DictDataSimpleRespVO { |
| 17 | 17 | @ApiModelProperty(value = "字典标签", required = true, example = "男") |
| 18 | 18 | private String label; |
| 19 | 19 | |
| 20 | + @ApiModelProperty(value = "颜色类型", example = "default", notes = "default、primary、success、info、warning、danger") | |
| 21 | + private String colorType; | |
| 22 | + @ApiModelProperty(value = "css 样式", example = "btn-visible") | |
| 23 | + private String cssClass; | |
| 24 | + | |
| 20 | 25 | } | ... | ... |
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/dict/DictDataDO.java
| ... | ... | @@ -47,6 +47,16 @@ public class DictDataDO extends BaseDO { |
| 47 | 47 | */ |
| 48 | 48 | private Integer status; |
| 49 | 49 | /** |
| 50 | + * 颜色类型 | |
| 51 | + * | |
| 52 | + * 对应到 element-ui 为 default、primary、success、info、warning、danger | |
| 53 | + */ | |
| 54 | + private String colorType; | |
| 55 | + /** | |
| 56 | + * css 样式 | |
| 57 | + */ | |
| 58 | + private String cssClass; | |
| 59 | + /** | |
| 50 | 60 | * 备注 |
| 51 | 61 | */ |
| 52 | 62 | private String remark; | ... | ... |
yudao-ui-admin/src/components/DictTag/index.vue
0 → 100644
| 1 | +<template> | |
| 2 | + <div> | |
| 3 | + <template v-for="(dict, index) in this.getDictDatas2(type, value)"> | |
| 4 | + <!-- 默认样式 --> | |
| 5 | + <span v-if="dict.colorType === 'default' || dict.colorType === '' || dict.color === undefined" :key="dict.value" :index="index" | |
| 6 | + :class="dict.cssClass">{{ dict.label }}</span> | |
| 7 | + <!-- Tag 样式 --> | |
| 8 | + <el-tag v-else :key="dict.value" :index="index" :type="dict.colorType" :class="dict.cssClass"> | |
| 9 | + {{ dict.label }} | |
| 10 | + </el-tag> | |
| 11 | + </template> | |
| 12 | + </div> | |
| 13 | +</template> | |
| 14 | + | |
| 15 | +<script> | |
| 16 | +export default { | |
| 17 | + name: "DictTag", | |
| 18 | + props: { | |
| 19 | + type: String, | |
| 20 | + value: [Number, String, Array], | |
| 21 | + }, | |
| 22 | +}; | |
| 23 | +</script> | |
| 24 | +<style scoped> | |
| 25 | +.el-tag + .el-tag { | |
| 26 | + margin-left: 10px; | |
| 27 | +} | |
| 28 | +</style> | ... | ... |
yudao-ui-admin/src/main.js
| ... | ... | @@ -36,7 +36,7 @@ import RightToolbar from "@/components/RightToolbar" |
| 36 | 36 | // 代码高亮插件 |
| 37 | 37 | // import hljs from 'highlight.js' |
| 38 | 38 | // import 'highlight.js/styles/github-gist.css' |
| 39 | -import {DICT_TYPE, getDictDataLabel, getDictDatas} from "@/utils/dict"; | |
| 39 | +import {DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2} from "@/utils/dict"; | |
| 40 | 40 | |
| 41 | 41 | // 全局方法挂载 |
| 42 | 42 | Vue.prototype.getDicts = getDicts |
| ... | ... | @@ -47,6 +47,7 @@ Vue.prototype.addDateRange = addDateRange |
| 47 | 47 | Vue.prototype.addBeginAndEndTime = addBeginAndEndTime |
| 48 | 48 | Vue.prototype.selectDictLabel = selectDictLabel |
| 49 | 49 | Vue.prototype.getDictDatas = getDictDatas |
| 50 | +Vue.prototype.getDictDatas2 = getDictDatas2 | |
| 50 | 51 | Vue.prototype.getDictDataLabel = getDictDataLabel |
| 51 | 52 | Vue.prototype.DICT_TYPE = DICT_TYPE |
| 52 | 53 | Vue.prototype.download = download |
| ... | ... | @@ -70,8 +71,11 @@ Vue.prototype.msgInfo = function (msg) { |
| 70 | 71 | } |
| 71 | 72 | |
| 72 | 73 | // 全局组件挂载 |
| 74 | +Vue.component('DictTag', DictTag) | |
| 73 | 75 | Vue.component('Pagination', Pagination) |
| 74 | 76 | Vue.component('RightToolbar', RightToolbar) |
| 77 | +// 字典标签组件 | |
| 78 | +import DictTag from '@/components/DictTag' | |
| 75 | 79 | // 头部标签插件 |
| 76 | 80 | import VueMeta from 'vue-meta' |
| 77 | 81 | ... | ... |
yudao-ui-admin/src/utils/dict.js
| ... | ... | @@ -68,10 +68,37 @@ export function getDictDatas(dictType) { |
| 68 | 68 | // console.log(store.getters.dict_datas[dictType]); |
| 69 | 69 | // debugger |
| 70 | 70 | // } |
| 71 | + // debugger | |
| 71 | 72 | return store.getters.dict_datas[dictType] || [] |
| 72 | 73 | } |
| 73 | 74 | |
| 74 | -export function getDictDataLabel(dictType, value) { | |
| 75 | +/** | |
| 76 | + * 获取 dictType 对应的数据字典数组 | |
| 77 | + * | |
| 78 | + * @param dictType 数据类型 | |
| 79 | + * @param values 数组、单个元素 | |
| 80 | + * @returns {*|Array} 数据字典数组 | |
| 81 | + */ | |
| 82 | +export function getDictDatas2(dictType, values) { | |
| 83 | + if (values === undefined) { | |
| 84 | + return []; | |
| 85 | + } | |
| 86 | + // 如果是单个元素,则转换成数组 | |
| 87 | + if (!Array.isArray(values)) { | |
| 88 | + values = [this.value]; | |
| 89 | + } | |
| 90 | + // 获得字典数据 | |
| 91 | + const results = []; | |
| 92 | + for (const value of values) { | |
| 93 | + const dict = getDictData(dictType, value); | |
| 94 | + if (dict) { | |
| 95 | + results.push(dict); | |
| 96 | + } | |
| 97 | + } | |
| 98 | + return results; | |
| 99 | +} | |
| 100 | + | |
| 101 | +export function getDictData(dictType, value) { | |
| 75 | 102 | // 获取 dictType 对应的数据字典数组 |
| 76 | 103 | const dictDatas = getDictDatas(dictType) |
| 77 | 104 | if (!dictDatas || dictDatas.length === 0) { |
| ... | ... | @@ -81,8 +108,14 @@ export function getDictDataLabel(dictType, value) { |
| 81 | 108 | value = value + '' // 强制转换成字符串,因为 DictData 小类数值,是字符串 |
| 82 | 109 | for (const dictData of dictDatas) { |
| 83 | 110 | if (dictData.value === value) { |
| 84 | - return dictData.label | |
| 111 | + return dictData; | |
| 85 | 112 | } |
| 86 | 113 | } |
| 87 | - return '' | |
| 114 | + return undefined | |
| 88 | 115 | } |
| 116 | + | |
| 117 | +export function getDictDataLabel(dictType, value) { | |
| 118 | + const dict = getDictData(dictType, value); | |
| 119 | + return dict ? dict.label : ''; | |
| 120 | +} | |
| 121 | + | ... | ... |
yudao-ui-admin/src/views/system/dict/data.vue
| ... | ... | @@ -37,7 +37,13 @@ |
| 37 | 37 | <el-table-column label="字典标签" align="center" prop="label" /> |
| 38 | 38 | <el-table-column label="字典键值" align="center" prop="value" /> |
| 39 | 39 | <el-table-column label="字典排序" align="center" prop="sort" /> |
| 40 | - <el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" /> | |
| 40 | + <el-table-column label="状态" align="center" prop="status"> | |
| 41 | + <template slot-scope="scope"> | |
| 42 | + <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/> | |
| 43 | + </template> | |
| 44 | + </el-table-column> | |
| 45 | + <el-table-column label="颜色类型" align="center" prop="colorType" /> | |
| 46 | + <el-table-column label="CSS Class" align="center" prop="cssClass" /> | |
| 41 | 47 | <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> |
| 42 | 48 | <el-table-column label="创建时间" align="center" prop="createTime" width="180"> |
| 43 | 49 | <template slot-scope="scope"> |
| ... | ... | @@ -59,7 +65,7 @@ |
| 59 | 65 | |
| 60 | 66 | <!-- 添加或修改参数配置对话框 --> |
| 61 | 67 | <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> |
| 62 | - <el-form ref="form" :model="form" :rules="rules" label-width="80px"> | |
| 68 | + <el-form ref="form" :model="form" :rules="rules" label-width="90px"> | |
| 63 | 69 | <el-form-item label="字典类型"> |
| 64 | 70 | <el-input v-model="form.dictType" :disabled="true" /> |
| 65 | 71 | </el-form-item> |
| ... | ... | @@ -77,6 +83,14 @@ |
| 77 | 83 | <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">{{dict.label}}</el-radio> |
| 78 | 84 | </el-radio-group> |
| 79 | 85 | </el-form-item> |
| 86 | + <el-form-item label="颜色类型" prop="colorType"> | |
| 87 | + <el-select v-model="form.colorType"> | |
| 88 | + <el-option v-for="item in colorTypeOptions" :key="item.value" :label="item.label + '(' + item.value + ')'" :value="item.value" /> | |
| 89 | + </el-select> | |
| 90 | + </el-form-item> | |
| 91 | + <el-form-item label="CSS Class" prop="cssClass"> | |
| 92 | + <el-input v-model="form.cssClass" placeholder="请输入 CSS Class" /> | |
| 93 | + </el-form-item> | |
| 80 | 94 | <el-form-item label="备注" prop="remark"> |
| 81 | 95 | <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> |
| 82 | 96 | </el-form-item> |
| ... | ... | @@ -142,6 +156,27 @@ export default { |
| 142 | 156 | { required: true, message: "数据顺序不能为空", trigger: "blur" } |
| 143 | 157 | ] |
| 144 | 158 | }, |
| 159 | + // 数据标签回显样式 | |
| 160 | + colorTypeOptions: [{ | |
| 161 | + value: "default", | |
| 162 | + label: "默认" | |
| 163 | + }, { | |
| 164 | + value: "primary", | |
| 165 | + label: "主要" | |
| 166 | + }, { | |
| 167 | + value: "success", | |
| 168 | + label: "成功" | |
| 169 | + }, { | |
| 170 | + value: "info", | |
| 171 | + label: "信息" | |
| 172 | + }, { | |
| 173 | + value: "warning", | |
| 174 | + label: "警告" | |
| 175 | + }, { | |
| 176 | + value: "danger", | |
| 177 | + label: "危险" | |
| 178 | + } | |
| 179 | + ], | |
| 145 | 180 | |
| 146 | 181 | // 枚举 |
| 147 | 182 | CommonStatusEnum: CommonStatusEnum, |
| ... | ... | @@ -178,10 +213,6 @@ export default { |
| 178 | 213 | this.loading = false; |
| 179 | 214 | }); |
| 180 | 215 | }, |
| 181 | - // 数据状态字典翻译 | |
| 182 | - statusFormat(row, column) { | |
| 183 | - return getDictDataLabel(DICT_TYPE.COMMON_STATUS, row.status) | |
| 184 | - }, | |
| 185 | 216 | // 取消按钮 |
| 186 | 217 | cancel() { |
| 187 | 218 | this.open = false; |
| ... | ... | @@ -195,6 +226,8 @@ export default { |
| 195 | 226 | value: undefined, |
| 196 | 227 | sort: 0, |
| 197 | 228 | status: CommonStatusEnum.ENABLE, |
| 229 | + colorType: 'default', | |
| 230 | + cssClass: undefined, | |
| 198 | 231 | remark: undefined |
| 199 | 232 | }; |
| 200 | 233 | this.resetForm("form"); | ... | ... |
更新日志.md
| ... | ... | @@ -35,7 +35,7 @@ |
| 35 | 35 | * 【新增】前端的表格右侧工具栏组件支持显隐列,具体可见【用户管理】功能 [commit](https://gitee.com/zhijiantianya/ruoyi-vue-pro/commit/20e34e35a3bdc48e6a4c58e3849aa729bd18efe5) |
| 36 | 36 | * 【新增】前端的菜单导航显示风格 TopNav(false 为 左侧导航菜单,true 为顶部导航菜单),支持布局的保存与重置 [commit1](https://gitee.com/zhijiantianya/ruoyi-vue-pro/commit/4bf5b04d542014a49c5a41b20935cef35033a518) [commit2](https://gitee.com/zhijiantianya/ruoyi-vue-pro/commit/cff4391f2d7830770731c0034085c0f77ea8c68e) |
| 37 | 37 | * 【新增】前端的网页标题支持根据选择的菜单,动态展示标题 [commit](https://gitee.com/zhijiantianya/ruoyi-vue-pro/commit/7bf9a85263e0c44b2bc88485b83557c129583f5c) |
| 38 | -* 【新增】前端的 iframe 组件,方便内嵌网页 [commit]() | |
| 38 | +* 【新增】前端的 iframe 组件,方便内嵌网页 [commit](https://gitee.com/zhijiantianya/ruoyi-vue-pro/commit/4a8129bffa9e3928c56333e29f5874f55a079764) | |
| 39 | 39 | |
| 40 | 40 | ### 🐞 Bug Fixes |
| 41 | 41 | ... | ... |