代码生成
代码生成
大部分项目里其实有很多代码都是重复的,几乎每个基础模块的代码都有增删改查的功能,而这些功能都是大同小异, 如果这些功能都要自己去写,将会大大浪费我们的精力降低效率。所以这种重复性的代码可以使用代码生成。
修改配置文件
在代码生成之前需要简单的一些配置才能完成,根据自己实际需求调整默认值
- 修改配置文件
appsettings.json
下面以 sqlserver 库连接字符串为例,其他字符串请参考快速开始
"CodeGenDbConfig": {
//代码生成连接字符串,注意{dbName}为固定格式,将正常的链接字符串里面的数据库名替换成{dbName},比如ZrAdmin替换成{dbName}
"Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog={dbName};",
"DbType": 1,
"IsAutoCloseConnection": true,
"DbName": "ZrAdmin" //代码生成默认连接数据库
},
//代码生成配置
"CodeGen": {
//是否显示移动端代码生成
"showApp": false,
//自动去除表前缀
"autoPre": true,
//默认生成业务模块名
"moduleName": "business",
"author": "admin",
"tablePrefix": "sys_", //"表前缀(生成类名不会包含表前缀,多个用逗号分隔)",
"vuePath": "" //前端代码存储路径eg:D:\Work\ZRAdmin-Vue3
},
提示
- 上面高亮的是需要要修改的
- 有移动端代码的小伙伴需要注意,默认是不显示和生成的,需要将
showApp
设置为true
导入表
登录系统打开菜单(系统工具 -> 代码生成 -> 导入对应表)
提示
如果你的数据库里面已经有表直接进行导入,如果是通过 C#实体类
创建来生成数据库表,在实体类创建好后使用codefirst
生成表结构后再进行导入
- 通过 C#实体类来创建表
namespace ZR.Model.Public
{
/// <summary>
/// 广告管理
/// </summary>
[SugarTable("banner_config")]
[Tenant("0")]
public class BannerConfig
{
/// <summary>
/// id
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// Title
/// </summary>
public string Title { get; set; }
}
}
编辑表内容
代码生成列表中找到需要表点击编辑(可预览、编辑、同步、删除生成配置) 填写基本信息,生成信息,字段信息
提示
代码生成支持编辑、预览、同步
预览
:对生成的代码提前预览,防止出现一些不符合预期的情况。
同步
:对原表的字段进行同步,包括新增、删除、修改的字段处理。
- 不会删除原数据库已经删除的列。只会同步列信息,表数据不会同步
- 同步:是否编辑、自动填充、排序、是否导出、是否排序、如果列是列表同步查询类型、字典类型
修改
:对生成的代码基本信息、字段信息、生成信息做一系列的调整。
- 关于字典类型说明
只有 下拉框、下拉框(多选)、单选框、复选框、下拉单选组合,才会有字典类型选择。
- 1、选择带字典类型表单组件,未选择字典类型数据源
前端不会自动绑定数据,需要自己实现绑定数据源
const state = reactive({
options: {
// 排序 选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}
sys_notice_status: [
{ dictLabel: "标签", dictValue: "0" },
{ dictLabel: "标签", dictValue: "0" },
],
},
});
提示
{ dictLabel: "标签", dictValue: "0" } 固定格式,dictValue 要用字符串
- 2、选择带字典类型表单组件,选择字典类型数据源
前端会自动绑定数据
- 自动填充列说明
数据库需要设置默认值,插入数据的时候才会起作用
生成代码
点击 操作栏里面 更多-> 生成代码
注意
- 如果生成的是本项目,将会覆盖原有代码
- 前端生成的表单会生成所有字段,如果不需要将其删除即可
- 生成本项目之后后端将会重启,前端可能会提示后端服务链接异常,等后端启动完成即可
添加菜单栏
方法一
代码生成后,会在后端项目根目录中生成一个
sql
的文件夹,找到刚刚生成的表名 sql 文件,打开执行,注意:只支持sqlServer
,mySql
库方法二建议
生成修改 -> 生成信息 -> 代码生成方式选择自定义路径,会出现一个
添加菜单
的选择 —> 选择 添加菜单(依赖于上级菜单)
提示
- 代码生成需要权限高的数据库账号
- 前端生成的表单编辑不需要的字段需要自己手动删除
代码生成模板
生成树表
新建数据库表结构(树表)
parent_id 不一定叫 parent_id
drop table if exists sys_product;
create table sys_product (
product_id bigint(20) not null auto_increment comment '产品id',
parent_id bigint(20) default 0 comment '父产品id',
product_name varchar(30) default '' comment '产品名称',
order_num int(4) default 0 comment '显示顺序',
status char(1) default '0' comment '产品状态(0正常 1停用)',
primary key (product_id)
) engine=innodb auto_increment=1 comment = '产品表';
生成主子表
比如 客户表 和订单明细表是 一对一 或者 一对多的关系,可以选择导航查询
- 新建数据库表结构(主子表)
-- ----------------------------
-- 客户表
-- ----------------------------
drop table if exists sys_customer;
create table sys_customer (
customer_id bigint(20) not null auto_increment comment '客户id',
customer_name varchar(30) default '' comment '客户姓名',
remark varchar(500) default null comment '客户描述',
primary key (customer_id)
) engine=innodb auto_increment=1 comment = '客户表';
-- ----------------------------
-- 商品表
-- ----------------------------
drop table if exists sys_goods;
create table sys_goods (
goods_id bigint(20) not null auto_increment comment '商品id',
customer_id bigint(20) not null comment '客户id',
name varchar(30) default '' comment '商品名称',
weight int(5) default null comment '商品重量',
price decimal(6,2) default null comment '商品价格',
date datetime comment '商品时间',
type char(1) default null comment '商品种类',
primary key (goods_id)
) engine=innodb auto_increment=1 comment = '商品表';
注意
- 要先生成子表,再生成父表
- 默认生成的是一对多,默认模式:子表先删后加,更多模式用法参考传送门
生成功能说明
导入
默认生成的导入只实现了简单的功能,如果需要更复杂的实现,请前往 sqlsugar 官网查看文档
/// <summary>
/// 导入客户表
/// </summary>
/// <returns></returns>
public (string, object, object) ImportCustomer(List<Customer> list)
{
var x = Context.Storageable(list)
.SplitInsert(it => !it.Any())
//.WhereColumns(it => it.UserName)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2})
.ToStorage();
var result = x.AsInsertable.ExecuteCommand();//插入可插入部分;
string msg = $"插入{x.InsertList.Count} 更新{x.UpdateList.Count} 错误数据{x.ErrorList.Count} 不计算数据{x.IgnoreList.Count} 删除数据{x.DeleteList.Count} 总共{x.TotalList.Count}";
Console.WriteLine(msg);
//输出错误信息
foreach (var item in x.ErrorList)
{
Console.WriteLine("错误" + item.StorageMessage);
}
foreach (var item in x.IgnoreList)
{
Console.WriteLine("忽略" + item.StorageMessage);
}
return (msg, x.ErrorList, x.IgnoreList);
}
导出
默认生成的导出默认是 10000 条数据
/// <summary>
/// 导出客户表
/// </summary>
/// <returns></returns>
[Log(Title = "客户表", BusinessType = BusinessType.EXPORT, IsSaveResponseData = false)]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "business:customer:export")]
public IActionResult Export([FromQuery] CustomerQueryDto parm)
{
parm.PageNum = 1;
parm.PageSize = 100000;
var list = _CustomerService.GetList(parm).Result;
if (list == null || list.Count <= 0)
{
return ToResponse(ResultCode.FAIL, "没有要导出的数据");
}
var result = ExportExcelMini(list, "客户表", "客户表");
return ExportExcel(result.Item2, result.Item1);
}