Model定义
- 自己写的类至少要从TopBasePoco继承, 且需要
using WalkingTec.Mvvm.Core;
- BasePoco(推荐)比TopBasePoco多了创建人, 创建时间, 更新人, 更新时间
- PersistPoco比BasePoco甚至还多了isValid, 用来假删除数据
- 定义外键建议使用guid类型, 如
public Guid? CityId{get;set;}
- 数据类型可以使用FileAttachment, 貌似很好用
- enum的每一项都可以加
[Display(Name="{name}")]
- 若希望enum生成的下拉菜单出现空白选项, model设定时要加上问号, 比如
public HospitalLevel? level{get;set;}
(非下拉菜单不需要这么干)
要实现树形结构(比如表要支持上海市>上海市>杨浦区):
- 继承BasePoco/TopBasePoco之外还需要继承ITreeData
, T写这个model自己, 如
public class City: TopBasePoco, ITreeData<City>{ //在ITreeData上点击右键可实现本接口
}
- 鼠标悬停在ITreeData这里选择“实现接口”
多对多的话, 则是需要一个中间表, 要定义好外键, 类似这样:
[MiddleTable]
public class PatientVirus : TopBasePoco
{
public Patient Patient{get;set;}
public Guid PatientId{get;set;}
public Virus Virus {get;set;}
public Guid VirusId{get;set;}
}
数据库创建和迁移
- 注意一定要在DataContext.cs中再次填写连接字符串,否则无法实现迁移
- 首次运行前先要运行ef的标准流程,
add-migration {name}
update-database
搭建页面
- 定义完模型以后需要在DataContext.cs中注册DbSet,
public DbSet<{classname}> {DbSetName} {get;set;};
部署生产
- 先要把appsettings.json里的debug参数关掉
- publish时选择依赖框架,win-x64架构
- 重新进入系统, admin默认密码000000, 配置用户的主菜单
VM是啥
第一次看完之后的理解:
Mvvm的vm是view model, 是在m的基础上添加许多属性和方法(这话不一定对, 有点模糊, 其实现在我理解是vm利用了m, 而vm是独立对象, 配合c进行工作)
wtm框架的vm是在controller中通过createVM方法创建的.
wtm的vm最基本的basevm也已经很强大了, 在此基础上还有CRUD的vm, 批量操作的vm, 导入导出的vm.
传统mvc的模型实现CRUD需要在controller内自己写. 而wtm搞定了这一步.
第二次看的时候的理解:
vm不是用来代替model也不是完全代替controller的. 因为如果完全代替了他们的话, 不但破坏的原本的mvc结构(导致不易理解), 也会把vm做的太杂(啥都放一起).
因此现在的架构就是m+v+vm+c, 其中c的存在感降低了, 更多的作用是用c实现路由.
系统界面定制
定制界面要分两块走. 第一个是首页, 完全独立的css. 第二个是layui. 类似我自己开发的旧的仁意系统, 首页也是独立的.
比方说要改logo和系统名称页面title, 那么首页和layui的配置都要改.
登录首页搜索login.cshtml, 直接改这个view即可.
layui的配置文件搜索 layui config.js首页在frontpage.cshtml
以上都用vscode搜索即可.
增删改查界面定制及TagHelper
实质就是生成html用的辅助标签, 要用taghelper的前提是必须在view文件内先引用相应的对象.
Wtm框架基于layui的样式提供了许多表单tag. 可在每个业务模块不同的增删改查界面内修改.
比方说搜索patient create.cshtml, 可把checkbox改成combobox或者radio, 部分控件也可增加属性multi-select=“true”. 除此之外还有和一个强大的多选控件叫transfer.
改新增界面时别忘记同时实现更改界面(是分开的)
更多内容可到官网文档"界面层"看.
实现联动菜单
详见视频教程, 第4个视频28分钟开始.
WebApi相关
- api需单独生成, 且推荐认证方式只选择jwt
- api若认证方式支持cookies, 表示可以在登录后(调用登录api)直接调用该系列api
- 即使只选择了jwt认证, 也可通过在swagger文档内登录(调试登录接口, 使用admin/000000, use cookies选false)来获得jwt token, 并通过输入Bearer {token}来调试
- postman调试的话必须在authorization内选择Bearer并只填写token, 然后参数使用raw+json传递
- api controller不走配置文件的路由. 而是在每个controller内定义
- api权限通过先配置菜单再配置用户组权限来进行
- 若要彻底开放某api的权限,给它增加[Public]这个属性即可
关于JWT
看了许多介绍,基本都是以“session和jwt的区别”、“jwt的优点”之类为主题。
我自己的理解是这玩意还是只能用来做做api的鉴权,做用户登录有点麻烦,使用不当还有安全问题
我目前的理解是它主要用来在替代session做用户登录和登录后的操作验证(负载平衡的情况下session方式很麻烦)。
现阶段对我来说最主要用到的是从wtm里获取某某栏目的数据,而不是在自研系统里让某个管理员登录然后获取自己的数据,
因此在前端调用jwt登录和保存token的必要性是没有的。
所以我完全可以对这类获取数据的api直接设[Public]属性,这样一来专题页面的数据加载方面能获得最大的性能
至于某些场景下需要更新数据的时候,则需要单独去调用封装后的api(封装wtm的api)或者自己写api(和wtm完全无关了)