基于ABP做一个简单的系统——实战篇:2.代码生成器
上一篇正说着呢,代码生成器就来了。
1.适用于ABP官网的Startup Template V3.x的包含了登录、用户等页面的MPA应用模板
2.当前view仅支持文本框生成,远期规划根据字段类型生成不同的控件
3.只需要写好Entity,剩下的交给代码生成器,一键生成所有重复代码。
4.基于winform,脱离VS存在,只要有.net framework,什么环境都能运行起来。
下载链接放在最后
使用方法及其简单:
1.按照规则,编写Entity实体类. 规则如下:
1)命名空间统一用复数,类名用单数,方便代码维护
2)如果时String类型字段,需要加一个MaxFieldLengthd的静态int变量,不仅用于code-first生成数据库时使用,也用于DTO字段长度限制,也会在生成视图时自动加上maxlength属性
3)每个字段都要加上FieldDisplay格式的静态String变量,用于dto,view的字段名称显示
4)如果是必填字段,打上Required属性,Entity不需要加DisplayName属性!保持如下干净的状态即可。
5)建议每个entity都加上String类型字段Name,用于模糊查询
using Abp.Domain.Entities.Auditing;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text; namespace Rock.DictBooks
{
[Table("ai_dict_book")]
public class DictBook : FullAuditedEntity<long>
{
public const int MaxDictNameLength = ;
public const int MaxItemNameLength = ;
public const int MaxItemDescLength = ; public const string DictNameDisplay = "字典名称";
public const string ItemNameDisplay = "数据项名称";
public const string ItemDescDisplay = "数据项描述"; [Required]
[StringLength(MaxDictNameLength)]
public string DictName { get; set; }
[Required]
[StringLength(MaxItemNameLength)]
public string ItemName { get; set; }
[StringLength(MaxItemDescLength)]
public string ItemDesc { get; set; }
}
}
2.修改“\src\Rock.EntityFrameworkCore\EntityFrameworkCore\RockDbContext.cs”,新增一行“public DbSet<EntityName> EntityNames { get; set; }”,把其中的ENtityName换成实际的实体名称。
3.并Add-Migration "xxx",Update-Database(做过code-first的都懂)
4..启动代码生成器,设置好实体类文件路径,项目根目录,命名空间(下载模板时的“Choose your project's name”),实体中文面描述,主键类型,点击生成代码
5.修改“\src\Rock.Web.Mvc\Startup\PageNames.cs”,增加一行“ public const string Test = "Test";”,把其中的Test换成实际的页面名称
6.修改\src\Rock.Core\Localization\SourceFiles\Rock-zh-Hans.xml,新增一行“<text name="Default">默认页面</text>”,是为了代码生成器生成的页面中文翻译,这里的Default更改为实际页面名称,下同
7.修改“\src\Rock.Core\Authorization\PermissionNames.cs”,新增一行“ public const string Pages_Default = "Pages.Default";”
8.修改"\src\Rock.Core\Authorization\RockAuthorizationProvider.cs",新增一行“context.CreatePermission(PermissionNames.Pages_Default, L("Default"));”,是为了给新增页面赋予默认权限
9.修改“\src\Rock.Web.Mvc\Startup\RockNavigationProvider.cs”,增加以下代码,加入菜单
.AddItem(
new MenuItemDefinition(
PageNames.Test,
L("Default"),
url: "Test",
icon: "fas fa-info-circle",
permissionDependency: new SimplePermissionDependency(PermissionNames.Pages_Default)
)
)
这时候编译程序,运行,就可以打开默认模板生成的页面了
V 1.0默认模板只生成基本的增删改查功能,所有内容录入都为文本框,后续版本会根据字段类型生成不同类型的输入框。程序是基于Razor引擎开发的,所以只要你懂Razor语法,tpl文件可以按自己的意思修改,全部放在Template目录下。代码写的比较早,等我整理一下再开源吧。不用T4是因为每个项目都要手动生成,而且还经常进程锁死,很闹心,所以自己弄了个。
P.S. 需要.net framework 4.5.2才能运行
使用方法:解压,运行Winform.exe即可
链接:https://pan.baidu.com/s/1jormHZBRZyPOj3ijLagG_g
提取码:v21l
基于ABP做一个简单的系统——实战篇:2.代码生成器的更多相关文章
- 基于ABP做一个简单的系统——实战篇:1.项目准备
现阶段需要做一个小项目,体量很小,业务功能比较简单,就想到用最熟悉的.net来做,更何况现在.net core已经跨平台,也可以在linux服务器上部署.所以决定用.net core 3.1+mysq ...
- 基于ABP做一个简单的系统——实战篇:4.基于富文本编辑器,Razor模板引擎生成内容并导出Word 填坑记录
起因 需求是这样的,有一种协议需要生成,协议的模板是可配置的,在生成过程中,模板中的内容可以根据约定的标记进行替换(就像mvc的razor模板一样).生成后的内容还需要导出成word或pdf. 常见的 ...
- 使用React并做一个简单的to-do-list
1. 前言 说到React,我从一年之前就开始试着了解并且看了相关的入门教程,而且还买过一本<React:引领未来的用户界面开发框架 >拜读.React的轻量组件化的思想及其virtual ...
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- Jmeter初步使用二--使用jmeter做一个简单的性能测试
经过上一次的初步使用,我们懂得了Jmeter的安装与初步使用的方法.现在,我们使用Jmeter做一个简单的性能测试.该次测试,提交的参数不做参数化处理,Jmeter各元件使用将在介绍在下一博文开始介绍 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
- HTTP lab01 做一个简单的测试用 web页面
做一个简单的测试用 web页面 1.安装httpd服务 yum install httpd 安装完httpd服务后,系统就自动生成了/var/www/html目录 创建一个 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- 基于PHP实现一个简单的在线聊天功能(轮询ajax )
基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...
随机推荐
- Python列表,元组,字典,字符串方法笔记
01. 列表 1.1 列表的定义 List(列表) 是 Python 中使用 最频繁 的数据类型,在其他语言中通常叫做 数组 专门用于存储 一串 信息 列表用 [] 定义,数据 之间使用 , 分隔 列 ...
- scrapy中间件之下载中间件使用(网易新闻爬取)
scrapy项目中的middlewarse.py中间件 爬虫中间件:目前先不介绍 下载中间件(需要在settings.py中开启) (1)请求处理函数:process_request(self, re ...
- Django视图函数之FBV与CBV模式
FBV模式: FBV(function base views) 就是在视图里使用函数处理请求. 一般直接用函数写的都属于是FBV模式. veiws.py from django.shortcuts i ...
- Canvas 画圆
原文地址:http://hi.baidu.com/lj2tj/item/557d8d1a65adfa721009b58b --------------------------------------- ...
- vue打包时semver.js版本报错
如图,报错semver.js版本不正确,解决思路是在node_modules/semver.js内,忽略版本检查 ''' // if ANY of the sets match ALL of its ...
- poj1904 完美匹配+Tarjan
King's Quest Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 9460 Accepted: 3497 C ...
- 工作中遇到的SQL
1.根据a表中的字段col,修改b表中的col UPDATE a INNER JOIN b ON a.id = b.id SET b.col = xx WHERE a.col = xx 2.模糊查询 ...
- 自定义realm实现授权
对用户和权限封装 更具用户查询已经拥有的角色 实现类 根据用户查询已经拥有的权限
- 如何使用JPA的@Formula注解?
背景描述 我们经常会在项目中用到一些数据字典,在存储和传输时使用Code,在前端展示时使用Name,这样做的好处是便于系统维护,比如项目中用到了"医院"这个名称,如果后期需求发生变 ...
- [Objective-C] 017_UI篇_UIView(中)
在上篇我们简单讲了UIView的坐标与几何结构,这篇我们来实战UIView一下.UIView在App中有着绝对重要的地位,因为可视化控件几乎都是UIView的子类.在App负责渲染区域的内容,并且响应 ...