进入系统后,发现系统已经默认了一个系统使用的一级菜单和下面的二级菜单。
我们很多时间需要普通访问者进去看见的是系统外的菜单。
现在我们建立一个业务系统一级菜单,魔方应该是叫区域。
新建一级菜单
我们首先在魔方的菜单管理中,新建一个一级菜单,一个一级菜单下的二级菜单。
我就新建了二个,一级区域为业务系统,下面建了一个包片商。
但注意我要退出,重新生成后,再进去F5,才能看见。
- 但实际我们是通过控制器的菜单代码进行送的,这上面这部份暂时没有用。
- 并在BusinessArea填入以下内容: ``` using System; using System.ComponentModel; using NewLife; using NewLife.Cube;
namespace jsdhh.Areas.Business { [DisplayName(“业务系统”)] public class BusinessArea : AreaBase { public BusinessArea() : base(nameof(BusinessArea).TrimEnd(“Area”)) { }
static BusinessArea() => RegisterArea<BusinessArea>();
}
}
注意,原教程上说的加上了去空格的public SchoolArea() : base(nameof(SchoolArea).TrimEnd("Area")) { },但一直报错string不能转为char,<br />这里太关键拉**,要引用using NewLife;教程中当时没有,所以一**直报错,但要是取消这句,又有问题。
<a name="HRLPl"></a>
### 新建实体
新建数据库实体类,参考[数据中间件NewLife.XCode教程](https://www.yuque.com/smartstone/xcode)。新建文件夹Areas/Business/Models,将实体类放在此文件夹,具体内容参考[这里](https://github.com/NewLifeX/NewLife.Cube/tree/master/CubeDemoNC/Areas/School/Models) 。
首先我们安装一个数据库管理软件,Navicat_15,安装激活过程就省拉。安装后连上我的项目的Sqlite数据库,能看到他已自动的生成了一些表。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609038462782-98213699-722c-472a-baa8-c578c6b25b07.png#height=238&id=nFZeP&margin=%5Bobject%20Object%5D&name=image.png&originHeight=238&originWidth=975&originalType=binary&ratio=1&size=44832&status=done&style=none&width=975)
- 直接下载模板
可以直接下载 [https://x.newlifex.com/XCode_BuildModel.zip](https://x.newlifex.com/XCode_BuildModel.zip) ,确保build.tt/build_netcore.tt文件属性中的自定义工具为 TextTemplatingFileGenerator 。<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609041060208-5d8f0c6f-0353-4bf4-94b9-c910f46ed4b3.png#height=322&id=dGWpI&margin=%5Bobject%20Object%5D&name=image.png&originHeight=322&originWidth=523&originalType=binary&ratio=1&size=65377&status=done&style=none&width=523)<br />解压拷贝model.xml和build.tt(netcore项目选build_netcore.tt)到需要放置实体类的目标目录。<br />然后我是COPY在根目下的哟<br />![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609038727104-51eba972-6753-41eb-98c0-a492aaa168c0.png#height=486&id=wzkzq&margin=%5Bobject%20Object%5D&name=image.png&originHeight=486&originWidth=374&originalType=binary&ratio=1&size=33010&status=done&style=none&width=374)
- 因为生成实体的时候,他会生成在build_netcore.tt同目录下,所以我们将build_netcore.tt和Model.xml同时COPY到Areas/Business/Models目录
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609038860974-ed1d5bab-8657-4c2b-8757-379142e41b4f.png#height=136&id=opFvt&margin=%5Bobject%20Object%5D&name=image.png&originHeight=136&originWidth=315&originalType=binary&ratio=1&size=6798&status=done&style=none&width=315)
<a name="GQKG7"></a>
# 更改model.xml,对应表关系
Xcode在这里是非常高级的,他会有一个关键东西:Migration=on/off/readonly/full<br />这是四种状态,要是ON(也是默认的)时,他会新建表,但不会修改和删除。OFF是关掉反向工程,FULL是完全操作。<br />打开Model下的model.xml,里面有默认的几个表的模型,我们先不删掉他,他还有一个高级功能哟,要是模型中<br />然后我们在model.xml下面增加一个包片商信息的表BaoPianShang,和BPSOut包片商外出的两张表,随便写了一些字段和预留了三个字段
<?xml version=”1.0” encoding=”utf-8”?>
- 然后,我们重新生成一下方案,然后我们在build_netcore.tt上点键,运行自定义工具,点确定
- 然后你便会发现,MODEL文件下多了好多实体类,也有其中我们建两个表名的类
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609041178711-6e043813-42bf-4dc3-9673-a10dc60e74f4.png#height=219&id=WERmY&margin=%5Bobject%20Object%5D&name=image.png&originHeight=219&originWidth=320&originalType=binary&ratio=1&size=12159&status=done&style=none&width=320)
- 这个实体类,当你在model.xml中有修改和变更时,重新运行build_netcore.tt 自定义工具时,他也会被覆盖,也会变更数据库中的表结构。
- 同时会生成TestXcode.Biz.cs,但这个类因为你要写代码,所以默认model.xml有变更时,tt生成时他不会变动。需要手动修改。
- 然后我们F5一下,再在数据库上看,已成生了二个表拉
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609041465719-0c29a79c-91ed-49ff-b125-fb8bda3f3e2b.png#height=136&id=VAPA2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=136&originWidth=944&originalType=binary&ratio=1&size=26183&status=done&style=none&width=944)
- 然后我按表的格式,建立好电子表格,进行了导入。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609042692369-8a3305a0-91ab-4913-b94f-cd05c9c1182a.png#height=176&id=XaTe3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=176&originWidth=491&originalType=binary&ratio=1&size=22871&status=done&style=none&width=491)
<a name="Kkdn2"></a>
### 新建控制器
- 这里就先实现包片商的控制器。
- 新建文件夹Areas/Business/Controllers,新建BPSController、BPSOutController两个控制器,分别填入以下内容。
因为我的包片商信息是一个基本信息表,我准备只能在后台进行管理,所以我先写这个空的控制器。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using NewLife.Cube;
using NewLife.Web;
using XCode.Membership;
namespace jsdhh.Areas.Business.Controllers
{
[BusinessArea]
[DisplayName(“包片商”)]
public class BPSController : EntityController
}
}
- 此时运行,一切正常,可看到如下页面。
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1174002/1609050867107-ee038f5e-2d7f-41ef-8c2d-5438b8d76f7b.png#height=261&id=Ye0a5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=261&originWidth=805&originalType=binary&ratio=1&size=31321&status=done&style=none&width=805)
- 如果要修改页面,那么直接在对应位置建立对应视图文件即可自动覆盖。详细可覆盖文件参考[这里](https://github.com/NewLifeX/NewLife.Cube/tree/master/NewLife.Cube/Views/Shared)。
- 比如修改学生主页,则新建文件夹Areas/Business/Views/BaoPianShang/,新建文件_List_Data.cshtml。填入以下内容。注意下面的代码块我是没有改改过,这些字段全是错的,只是示范。
@using NewLife;
@using NewLife.Cube
@using NewLife.Web;
@using XCode;
@using XCode.Configuration;
@using XCode.Membership
@{
var fact = ViewBag.Factory as IEntityFactory;
var page = ViewBag.Page as Pager;
var fields = ViewBag.Fields as List
班级2 | 名称3 | 性别4 | 年龄5 | 手机 | 地址 | 创建时间 | 创建地址 | 更新时间 | 更新地址 | 备注 | 操作 |
---|---|---|---|---|---|---|---|---|---|---|---|
@entity.ClassName | @entity.Name | @entity.Sex | @entity.Age.ToString(“n0”) | @entity.Mobile | @entity.Address | @Utility.ToFullString(entity.CreateTime, “”) | @entity.CreateIP | @Utility.ToFullString(entity.UpdateTime, “”) | @entity.UpdateIP | @entity.Remark | @await Html.PartialAsync(“_List_Data_Action”, (Object)entity) |