进入系统后,发现系统已经默认了一个系统使用的一级菜单和下面的二级菜单。
我们很多时间需要普通访问者进去看见的是系统外的菜单。
现在我们建立一个业务系统一级菜单,魔方应该是叫区域。

新建一级菜单

我们首先在魔方的菜单管理中,新建一个一级菜单,一个一级菜单下的二级菜单。
image.png
我就新建了二个,一级区域为业务系统,下面建了一个包片商。
但注意我要退出,重新生成后,再进去F5,才能看见。

  • 但实际我们是通过控制器的菜单代码进行送的,这上面这部份暂时没有用。

image.png

  • 下面开始实现这二个菜单和功能。

    新建区域

  • 首先新建区域Business,手动创建文件夹Areas/Business,在此文件夹创建区域类BusinessArea,填入以下内容

image.png

  • 并在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”)) { }

  1. static BusinessArea() => RegisterArea<BusinessArea>();
  2. }

}

注意,原教程上说的加上了去空格的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 { protected override IDictionary ScanActionMenu(IMenu menu) { menu.Visible = true; return base.ScanActionMenu(menu); }

}

}


- 此时运行,一切正常,可看到如下页面。

![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; }

@if (this.Has(PermissionFlags.Detail, PermissionFlags.Update, PermissionFlags.Delete)) { } @foreach (var entity in Model) { @if (this.Has(PermissionFlags.Detail, PermissionFlags.Update, PermissionFlags.Delete)) { } }
班级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)
``` 然后上面可以搜索,批量修改,这个魔方太方便拉。