借助mybatis-plus的强大和renren框架的引导,很顺利的实现了管理后台的基本功能,包括站点管理、网关管理、通道管理、逆变器管理、电表管理以及基础的网关型号管理、型号通道默认配置管理、字典管理等功能。实现了统一的字典应用和逻辑删除,在此分享一下:
1,统一的逻辑删除
逻辑删除很简单,只需要在application中增加配置语句:
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
然后在数据库中需要删除的表都增加deleted字段,entity增加属性字段deleted即可实现逻辑删除,是否超级简单?
不过对于自定义查询,我这边不能自动增加deleted过滤,需要手动加上,如:
在此过程中还安装了IDEA的MybatisX插件以及db管理插件,感觉idea真的功能好强大。MybaitsX还没深入用,本来也想试一下反向生成代码的,还没有成功,只是可以在xml和dao之间点那个小鸟头像就可以跳转。db插件也试了一下,查看表结构sql语句和导出功能比navicat还方便,不过表复制功能不方便,用sql语句倒是可以,不过还不习惯。慢慢用慢慢琢磨,可能会是新的惊喜。
2,字典管理
首先是数据库设计:
create table sys_dict
(
id int auto_increment comment '主键ID'
primary key,
name varchar(255) not null comment '名称',
parent_id int null comment '父级id',
code varchar(255) not null comment '编码',
value varchar(255) null comment '字典值',
is_default char null comment '默认字典项',
order_no smallint(6) default '1' null comment '显示顺序',
remark varchar(200) null comment '备注',
deleted smallint(1) default '0' null comment '是否删除',
create_time timestamp default CURRENT_TIMESTAMP null comment '创建日期',
constraint idx_code
unique (code)
)
comment '系统字典表';
其次是后台代码。
反向生成管理代码之后,在controller中增加方法:
@GetMapping("/getTypeValue/{vccodetype}")
@ApiOperation("获取下级列表")
public R getTypeValue(@PathVariable("vccodetype") String vccodetype){
List<SysDictEntity> list = sysDictService.getTypeValue(vccodetype);
return R.ok().put("typeList", list);
}
sevice中的代码如下:
@Override
public List<SysDictEntity> getTypeValue(String vccodetype){
List<SysDictEntity> list = new ArrayList <>();
SysDictEntity entity = this.getOne(new QueryWrapper <SysDictEntity>().eq("code",vccodetype));
if(entity != null){
list = this.list(
new QueryWrapper <SysDictEntity>().eq("parent_id",entity.getId())
);
}
return list;
}
通过传入一个字典项代码,可以获取到下级字典项列表。
再就是前台使用。
增加utils/dict.js:
import httpRequest from '@/utils/httpRequest'
export function getTypeValue (vccodetype) {
return httpRequest({
url: this.$http.adornUrl('/sys/sysdict/getTypeValue/' + vccodetype),
method: 'get'
})
}
main.js中引入为全局函数:
import { getTypeValue } from './utils/dict'
Vue.prototype.getTypeValue = getTypeValue // 全局数据字典方法
使用页面可以如下获取字典:
created () {
// 获取通道类型数据字典
this.getTypeValue('iot_channel_type').then(response => {
this.channelTypeList = response.data.typeList
})
// 获取校验方式字典
this.getTypeValue('iot_data_check').then(response => {
this.channelCheckList = response.data.typeList
})
},
列表页使用方法:
<body>
<el-table>
<el-table-column
prop="channelProtocal"
:formatter="formatterChannelType"
header-align="center"
align="center"
label="通道类型">
</el-table-column>
</el-table>
</body>
<script>
formatterChannelType (row, column, value) {
var index = this.channelTypeList.findIndex(x => x.value === value.toString())
if (index !== -1) {
return this.channelTypeList[index].name
}
return ''
},
</script>
如此,就实现了统一的字典管理。不过这样处理会有大量的接口访问次数。以后有时间了再研究是否一次读取到redis,然后在vue前端看怎么用起来更方便,效率更高。