内容如下
<Table Name="Terminal" Description="终端管理" RenderGenEntity="True">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="TerminalType" DataType="String" Description="终端类型" />
<Column Name="TerminalName" DataType="String" Description="终端名称" />
<Column Name="StringCode" DataType="String" Description="串码" />
<Column Name="Region" DataType="String" Description="支局,区域" />
<Column Name="CEOName" DataType="String" Description="支局长" />
<Column Name="Receiver" DataType="String" Description="领用人" />
<Column Name="TerminalState" DataType="String" Description="状态" />
<Column Name="GrantDate" DataType="DateTime" Description="发放时间" />
<Column Name="Bei1" DataType="String" Description="备注1" />
<Column Name="Bei2" DataType="String" Description="备注2" />
<Column Name="CreateUser" DataType="String" Description="创建者" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" />
</Columns>
</Table>
生成实体,在build_netcore.tt工具上点右键,使用自定义工具
- 生成了终端管理的.cs
- 然后按F5,运行项目,再用数据库软件打开看,表已新建拉。
区域菜单添加
- 要用魔方的后台管理这个表,就要增加区域
- 区域我们用那个业务区域就OK拉,在Areas/Business/Controllers下,新建控制器TerminalController.cs,
将控制器上面的改一下:
[BusinessArea]
[DisplayName("终端管理")]
public class TerminalController : EntityController<Terminal>
{
protected override IDictionary<MethodInfo, Int32> ScanActionMenu(IMenu menu)
{
menu.Visible = true;
return base.ScanActionMenu(menu);
}
测试一下,区域菜单出来拉。
- 看见菜单有了,但右边是空的?这个是哪里有问题哩?
- 但分析后找到原因,新建的控制器中,一定不能写index()方法 ,删 除就OK拉
终端的批量录入
- 因为终端的发放不可能一台一台的发,这样录入也不方便,所以这里新增终端就是指的批量导入XLSX进行批量录入拉。
- 因为CreateUser,CreateTime,UpdateTime三个字段是自动生成,所以在导入XLSX表的模板中是不需要的
- 刚才新建了一个ADDTerminal视图,现在增加这个菜单
- 然后注意要在角色那里,给这个菜单新增的,打上个勾,然后F5,刷新,即可看到这个终端菜单拉。
- 因为终端表比较复杂,我主要想,一是实现批量上传,二是实现批量修改,但在批量修改的时候,分得很细,改状态的只需要上传二列数据,一个串码,一个状态,没必要把上传表整复杂了。也可以修改责任人和其他人员等。
前台代码:
@{ Layout = "_Layout1"; } <div class="uim_addtitle"> <h2>终端管理界面</h2> <div class="uim_npoi text-left"> <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">导入整表</a> | 用于整个表的发放批量导入插入数据库 </div> <hr /> <div class="uim_npoi text-left"> <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">修改状态</a> | 用于对指定的串码修改状态 </div> <hr /> <div class="uim_npoi text-left"> <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">全字段修改</a> | 用于对指定串码进行批量导入进行所有字段的修改 </div> <hr /> <div class="uim_npoi text-left"> <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">修改支局及支局长</a> | 用于对支局及支局CEO名称进行修改 </div> <hr /> <div class="uim_npoi text-left"> <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">修改最终发放人</a> | 可以个修改支局发给谁的,除非支局提供 </div> <hr /> </div>
效果
现在开始实现批量导入功能,先改第一个按钮
a href="~/Business/Terminal/fullimportTerminal" class="btn btn-default" target="_blank">导入整表</a>
然后后台
[HttpGet] public IActionResult fullimportTerminal( ) { return View(); }
生成视图
然后在这里我才发现,我做卡的时候,为什么要新建一个error视图来显示哩,笨死了,在本页面多好httpget
现在上后台代码 ``` [HttpGet]
public IActionResult FullimportTerminal() { ViewBag.error1 = ""; var xx =new List<string>(); ViewBag.errortext2 = xx; return View(); } [HttpPost] public IActionResult FullimportTerminal(IFormFile excelfile) { ////var excelfile=Request.Form.file IFormCollection excelfile var excelfile1 = Request.Form.Files.Where(x => x.Name.Equals("excelfile")); //上传文件没有,同时对10M以上的不给予导入 if (excelfile1 == null || excelfile1.Count() <= 0) { ViewBag.error1 = "未选择文件上传,文件名为空拉!"; return View(); } //格式限制 var allowType = new string[] { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }; if (excelfile1.Any(b => !allowType.Contains(b.ContentType))) { ViewBag.error1 = "只能上传Excel 2007 格式文件拉!"; return View(); } //大小限制 if (excelfile1.Sum(b => b.Length) >= 1024 * 1024 * 10) { ViewBag.error1 = "上传文件的总大小只能在10M以下拉!"; return View(); } //设置一个出错的序号进去list<string>,到时返回前台, ViewBag.errortext2就是这个get方法 List<string> errornum = new List<string>(); //开始try文件的读取 try { ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using ExcelPackage package = new ExcelPackage(excelfile.OpenReadStream()); var workSheet = package.Workbook.Worksheets[0]; int row = workSheet.Dimension.Rows; int colomn = workSheet.Dimension.Columns; //定义一个出错的序列号初始值 int errnum = 0; try { //i是指行数,从2开始要因为1行是标题 for (int i = 2; i <= row; i++) { //组errnumm赋成I值,便于insert出错分析 errnum = i; //分析串码是否存在 string ifcode = workSheet.Cells[i, 4].Value?.ToString(); var mm = Terminal.FindAll(Terminal._.StringCode.Contains(ifcode)); if (mm.Count != 0) { errornum.Add(ifcode + "系统已存在!"); ; } else { var uimcard = new Terminal { TerminalType = workSheet.Cells[i, 2].Value?.ToString(), TerminalName = workSheet.Cells[i, 3].Value?.ToString(), StringCode = workSheet.Cells[i, 4].Value?.ToString(), Region = workSheet.Cells[i, 5].Value?.ToString(), CEOName = workSheet.Cells[i, 6].Value?.ToString(), Receiver = workSheet.Cells[i, 7].Value?.ToString(), TerminalState = workSheet.Cells[i, 8].Value?.ToString(), GrantDate = DateTime.Parse(workSheet.Cells[i, 9].Value.ToString()), Bei1 = workSheet.Cells[i,10].Value?.ToString(), Bei2 = workSheet.Cells[i,11].Value?.ToString(), }; uimcard.Insert(); } } } catch (Exception ex) { ViewBag.error1 = errnum + "行左右导入被中断出错拉!"; return View();
}
}
catch (Exception ex)
{
ViewBag.error1 = "请上传正确的excel!";
return View();
}
ViewBag.error1 = "导入表插入数据库全部完成!!";
ViewBag.errortext2 = errornum;
return View();
}
- 然后点击上传

- 在数据库表中也全部正常

- 我们再测试一下已存在的串码插入

- 呵,正功显示并不在插入
- 然后我利用这个功能,先将近几个月的终端全部插入数据库
<a name="FerdV"></a>
## 导入更改状态
- 很多时候,我只需改状态,只需要二列,只有两列,一列串码,一列状态
- 简单快捷,写个HHTPGET方法 ,并生成视图
[HttpGet]
public IActionResult EditCodeState()
{
ViewBag.error1 = “”;
var xx = new List
- 然后,前台
@{ Layout = “_Layout1”; }
修改串码状态
模板只需二列,一列串码,一列状态