C#TMS系统代码-基础页面BaseCity学习

本人纯新手,刚进公司跟领导报道,我说我是java全栈,他问我会不会C#,我说大学学过,他说这个TMS系统就给你来管了。外包已经把代码给我了,这几天先把增删改查的代码背一下,说不定后面就要赶鸭子上架了

Service页面

//using => import 导入
using Microsoft.AspNetCore.Mvc;
using SHZY.BaseData.Entitys.TMS.Dto.City;
using SHZY.BaseData.Interfaces.TMS;
...... //声明命名空间
namespace SHZY.BaseData.TMS {
//接口调用记录
[ApiDescriptionSettings(Tag = "BaseData", Name = "TmsBaseCity", Order = 200)]
//路由匹配
[Route("api/TMS/BaseData/[controller]")]
// : => implements 实现多接口
public class TmsBaseCityService : ITmsBaseCityService, IDynamicApiController, ITransient {
//Dao
private readonly ISqlSugarRepository<TmsBaseCityEntity> _repository;//city的各种方法
private readonly ITenant _db;//数据库事务
private readonly IUserManager _userManager;//用户管理
......
//初始化新实例
public TmsBaseCityService(
ISqlSugarRepository<TmsBaseCityEntity> tmsBaseCityRepository,
ISqlSugarClient context,
IUserManager userManager,
ISqlSugarRepository<TmsBaseCityEntity> cityRepository) {
_repository = tmsBaseCityRepository;
_db = context.AsTenant();
_userManager = userManager;
}
//各种方法
......
}
}

查询单个City

//get请求,id做参数
[HttpGet("{id}")]
//async-异步请求? Task-等待任务 dynamic-可变类型
public async Task<dynamic> GetInfo(string id)
{
//await-等待这行完成 FirstOrDefaultAsync-返回结果集第一个,后面匿名函数查询规则id匹配 Adapt-转类型
//链式写法,我不知道后面怎么打断点调试
return (await _repository.FirstOrDefaultAsync(x => x.Id == id)).Adapt<TmsBaseCityInfoOutput>();
}

查询City分页List

[HttpGet("")]
//[FromQuery]-请求查询字符串参数,JSON格式(一般用于get)
public async Task<dynamic> GetList([FromQuery] TmsBaseCityListQueryInput input)
{
//开查
var queryable = _repository.Context.Queryable<TmsBaseCityEntity>()
//判断查询参数是否为空,不为空用Contains判断是否包含(有多个也能满足)
.WhereIF(!string.IsNullOrEmpty(input.name), it => it.Name.Contains(input.name))
.......
//直接where里面的条件
.Where(it => it.DeleteMark == null)
//把结果集数据转成要输出的类
//似乎每种业务场景都会有变种类,这个是查询List的输出类 这是TMS系统的格式要求?
.Select(it => new TmsBaseCityListOutput
{
id = it.Id,
countryNo = it.CountryNo,
......
})
//两个或多个表的行合并到一个结果集中
.MergeTable();
//判断排序,为什么不用OrderByIF连着写算了
if (!string.IsNullOrEmpty(input.sidx))
{
queryable.OrderBy(input.sidx + " " + input.sort);
}
else
{
queryable.OrderBy(it => it.id);
}
//带上页数和条数转分页 如果不分页直接ToListAsync()返回
var data = await queryable.ToPagedListAsync(input.currentPage, input.pageSize);
//转PageResult分页类型
return PageResult<TmsBaseCityListOutput>.SqlSugarPageResult(data);
}

新增City

[HttpPost("")]
//[FromBody]-请求正文,JSON格式(一般用于post)
public async Task Create([FromBody] TmsBaseCityCrInput input)
{
//AnyAsync判断有没有满足条件的结果(即数据库已有要新增的对象)
if (await _repository.AnyAsync(it => it.CountryNo == input.countryNo && it.ProvinceNo == input.provinceNo && it.ProvinceName == input.provinceName && it.No == input.no && it.Name == input.name && it.DeleteMark == null))
//抛出错误,ErrorCode是枚举,里面有各种报错信息
throw Oops.Oh(ErrorCode.COM1004);
var entity = input.Adapt<TmsBaseCityEntity>();
//Insertable-插入数据 IgnoreColumns-忽略为null的列 CallEntityMethod-在插入数据库之前,对实体类的某个方法进行调用 ExecuteCommandAsync-执行
var isOk = await _repository.Context.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(it => it.Creator()).ExecuteCommandAsync();
//如果isOk不大于0,抛出错误
if (!(isOk > 0)) throw Oops.Oh(ErrorCode.COM1000);
}

更新City

//put请求,id做参
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] TmsBaseCityUpInput input)
{
//AnyAsync判断有没有满足条件的结果(数据库id不同其他数据相同)
if (await _repository.AnyAsync(it => it.CountryNo == input.countryNo && it.ProvinceNo == input.provinceNo && it.ProvinceName == input.provinceName && it.No == input.no && it.Name == input.name && it.DeleteMark == null && it.Id != input.id))
throw Oops.Oh(ErrorCode.COM1004);
//Adapt转一下类型
var entity = input.Adapt<TmsBaseCityEntity>();
//Updateable-修改数据 UpdateColumns-修改那些数据列 ExecuteCommandAsync-执行
var isOk = await _repository.Context.Updateable(entity).UpdateColumns(it => new
{
it.CountryNo,
......
}).ExecuteCommandAsync();
if (!(isOk > 0)) throw Oops.Oh(ErrorCode.COM1001);
}

删除City

//Delete请求
[HttpDelete("{id}")]
public async Task Delete(string id)
{
//没有删掉,只是更改DeleteMark,这里的写法类似写sql了
//ExecuteCommandHasChangeAsync-返回一个布尔值表示是否有变更
var isOk = await _repository.Context.Updateable<TmsBaseCityEntity>().SetColumns(it => new TmsBaseCityEntity()
{
DeleteTime = DateTime.Now,
DeleteMark = 1,
DeleteUserId = _userManager.UserId
}).Where(it => it.Id.Equals(id)).ExecuteCommandHasChangeAsync();
if (!isOk) throw Oops.Oh(ErrorCode.COM1002);
}

批量删除City

//这里为啥不用Delete?
[HttpPost("batchRemove")]
public async Task BatchRemove([FromBody] List<string> ids)
{
//In(it => it.Id, ids) 把数据全部先查出来
var entitys = await _repository.Context.Queryable<TmsBaseCityEntity>().In(it => it.Id, ids).ToListAsync();
if (entitys.Count > 0)
{
try
{
//开启事务
_db.BeginTran();
//批量删除城市信息维护,这边用的Where(it => ids.Contains(it.Id))
var isOk = await _repository.Context.Updateable<TmsBaseCityEntity>().SetColumns(it => new TmsBaseCityEntity()
{
DeleteTime = DateTime.Now,
DeleteMark = 1,
DeleteUserId = _userManager.UserId
}).Where(it => ids.Contains(it.Id)).ExecuteCommandHasChangeAsync();
//关闭事务
_db.CommitTran();
}
catch (Exception)
{
//回滚事务
_db.RollbackTran();
throw Oops.Oh(ErrorCode.COM1002);
}
}
}

导出

[HttpGet("Actions/Export")]
public async Task<dynamic> Export([FromQuery] TmsBaseCityListQueryInput input)
{
var exportData = new List<TmsBaseCityListOutput>();
//导出全部或者当前数据
if (input.dataType == 0)
//创建粘土对象转List<TmsBaseCityListOutput>
exportData = Clay.Object(await GetList(input)).Solidify<PageResult<TmsBaseCityListOutput>>().list;
else
exportData = await GetNoPagingList(input);
//导出数据列,JSON格式字符串直接ToList<ParamsModel>()手工转
List<ParamsModel> paramList = "[{\"value\":\"国家代码\",\"field\":\"countryNo\"},{\"value\":\"省份代码\",\"field\":\"provinceNo\"},{\"value\":\"省份名称\",\"field\":\"provinceName\"},{\"value\":\"城市代码\",\"field\":\"no\"},{\"value\":\"城市名称\",\"field\":\"name\"},{\"value\":\"有效标志\",\"field\":\"enabledMark\"},]".ToList<ParamsModel>();
//配置ExcelConfig
ExcelConfig excelconfig = new ExcelConfig();
excelconfig.FileName = "城市信息维护.xls";
excelconfig.HeadFont = "微软雅黑";
excelconfig.HeadPoint = 10;
excelconfig.IsAllSizeColumn = true;
excelconfig.ColumnModel = new List<ExcelColumnModel>();
//selectKey=>用户选中的数据列
foreach (var item in input.selectKey.Split(',').ToList())
{
var isExist = paramList.Find(p => p.field == item);
//找到之后加入ColumnModel
if (isExist != null)
excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value });
}
//临时文件储存路径
var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
//导出
ExcelExportHelper<TmsBaseCityListOutput>.Export(exportData, excelconfig, addPath);
//excel文件路径
var fileName = _userManager.UserId + "|" + addPath + "|xls";
return new
{
//文件名
name = excelconfig.FileName,
//加密
url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "SHZY")
};
}

C#TMS系统学习(BaseCity页面)的更多相关文章

  1. 零基础如何系统学习Java Web

    零基础如何系统学习Java Web?   我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...

  2. Hibernate的系统 学习

    Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...

  3. Dubbo -- 系统学习 笔记 -- 示例 -- 结果缓存

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 结果缓存 结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用 ...

  4. Dubbo -- 系统学习 笔记 -- 示例 -- 静态服务

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 静态服务 有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管 ...

  5. Dubbo -- 系统学习 笔记 -- 入门

    Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...

  6. 彻底明白Flink系统学习5:window、Linux本地安装Flink

    http://www.aboutyun.com/thread-26393-1-1.html 问题导读 1.如何在window下安装Flink? 2.Flink本地安装启动命令与原先版本有什么区别? 3 ...

  7. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  8. MES系统学习

    MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...

  9. 001 今天开始系统学习C#

    2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...

  10. php大力力 [036节] 后台系统的登录页面界面做完啦

    php大力力 [036节] 后台系统的登录页面界面做完啦 我认为做的不错,我就先不上截图啦 要你的祝福 分布注册 Twitter Login Or Signup Form 藤藤每日一练——172个Ic ...

随机推荐

  1. #欧拉回路#AT4518 [AGC032C] Three Circuits

    题目 给定一个 \(n\) 个点,\(m\) 条边的简单无向连通图, 问是否能将边分成三部分,使每部分都能成为环 分析 每个点的度数都得为偶数,这不由得想到了欧拉回路. 如果整张图是一个简单环那么一定 ...

  2. USACO 4.1

    目录 洛谷 2737 麦香牛块 分析 代码 洛谷 2738 篱笆回路 分析 代码 麦香牛块洛谷传送门,麦香牛块USACO传送门,篱笆回路洛谷传送门,篱笆回路USACO传送门 洛谷 2737 麦香牛块 ...

  3. 攻防世界 Mine- IDA静调或x64dbg动调 两种方式

    刷攻防世界的最后一道二星题,记录一下,大佬请飘过 题目 分析过程 我很勇,我先双击看看这是什么 是一个扫雷游戏,第一下运气好没踩雷,发现无法继续输入了:如果运气不好,会输出"您踩雷啦!&qu ...

  4. 批处理及有状态等应用类型在 K8S 上应该如何配置?

    众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:h ...

  5. Redis Stack功能介绍及redis-om-dotnet使用示例

    为了简化开发人员对较新的 Redis 模块及其提供的功能的体验,同时简化支持其功能的文档和客户端.以帮助开发人员从开始使用 Redis 的那一刻起,就能充分提高工作效率.Redis Stack诞生了. ...

  6. node 父子进程传递对象

    背景 node的父子进程中可以传递这是肯定的,但是传递对象,这是一个稀奇的地方. code 发送 server 对象 sendHandle 参数可用于将一个 TCP server 对象句柄传给子进程, ...

  7. MVC如何创建区域

    前言 MVC 划分区域可以为项目成立不同的小模块,方便团队之间开发,与增强项目结构的清晰度. 正文 建立区域: 在areas里面建立区域.,然后填写命名. 然后区域注册即可: 但是这样做依然无法解决项 ...

  8. tensorflow的variable、variable_scope和get_variable的用法和区别

    在tensorflow中,可以使用tf.Variable来创建一个变量,也可以使用tf.get_variable来创建一个变量,但是在一个模型需要使用其他模型的变量时,tf.get_variable就 ...

  9. MaxCompute同步数据的网络配置

    MaxCompute可以通过数据集成加载不同数据源(例如:MySQL数据库等)数据,同样也可以通过数据集成把MaxCompute的数据导出到各种业务数据库.数据集成功能已经集成到DataWorks作为 ...

  10. 云原生DevOps的5步升级路径

    简介: 究竟什么是云原生DevOps呢?我们认为:云原生DevOps是充分利用云原生基础设施,基于微服务/无服务架构体系和开源标准,语言和框架无关,具备持续交付和智能自运维能力,从而做到比传统DevO ...