C#TMS系统学习(BaseCity页面)
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页面)的更多相关文章
- 零基础如何系统学习Java Web
零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...
- Hibernate的系统 学习
Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 结果缓存
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 结果缓存 结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 静态服务
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 静态服务 有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管 ...
- Dubbo -- 系统学习 笔记 -- 入门
Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...
- 彻底明白Flink系统学习5:window、Linux本地安装Flink
http://www.aboutyun.com/thread-26393-1-1.html 问题导读 1.如何在window下安装Flink? 2.Flink本地安装启动命令与原先版本有什么区别? 3 ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇
前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
- MES系统学习
MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...
- 001 今天开始系统学习C#
2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...
- php大力力 [036节] 后台系统的登录页面界面做完啦
php大力力 [036节] 后台系统的登录页面界面做完啦 我认为做的不错,我就先不上截图啦 要你的祝福 分布注册 Twitter Login Or Signup Form 藤藤每日一练——172个Ic ...
随机推荐
- #欧拉回路#AT4518 [AGC032C] Three Circuits
题目 给定一个 \(n\) 个点,\(m\) 条边的简单无向连通图, 问是否能将边分成三部分,使每部分都能成为环 分析 每个点的度数都得为偶数,这不由得想到了欧拉回路. 如果整张图是一个简单环那么一定 ...
- USACO 4.1
目录 洛谷 2737 麦香牛块 分析 代码 洛谷 2738 篱笆回路 分析 代码 麦香牛块洛谷传送门,麦香牛块USACO传送门,篱笆回路洛谷传送门,篱笆回路USACO传送门 洛谷 2737 麦香牛块 ...
- 攻防世界 Mine- IDA静调或x64dbg动调 两种方式
刷攻防世界的最后一道二星题,记录一下,大佬请飘过 题目 分析过程 我很勇,我先双击看看这是什么 是一个扫雷游戏,第一下运气好没踩雷,发现无法继续输入了:如果运气不好,会输出"您踩雷啦!&qu ...
- 批处理及有状态等应用类型在 K8S 上应该如何配置?
众所周知, Kubernetes(K8S)更适合运行无状态应用, 但是除了无状态应用. 我们还会有很多其他应用类型, 如: 有状态应用, 批处理, 监控代理(每台主机上都得跑), 更复杂的应用(如:h ...
- Redis Stack功能介绍及redis-om-dotnet使用示例
为了简化开发人员对较新的 Redis 模块及其提供的功能的体验,同时简化支持其功能的文档和客户端.以帮助开发人员从开始使用 Redis 的那一刻起,就能充分提高工作效率.Redis Stack诞生了. ...
- node 父子进程传递对象
背景 node的父子进程中可以传递这是肯定的,但是传递对象,这是一个稀奇的地方. code 发送 server 对象 sendHandle 参数可用于将一个 TCP server 对象句柄传给子进程, ...
- MVC如何创建区域
前言 MVC 划分区域可以为项目成立不同的小模块,方便团队之间开发,与增强项目结构的清晰度. 正文 建立区域: 在areas里面建立区域.,然后填写命名. 然后区域注册即可: 但是这样做依然无法解决项 ...
- tensorflow的variable、variable_scope和get_variable的用法和区别
在tensorflow中,可以使用tf.Variable来创建一个变量,也可以使用tf.get_variable来创建一个变量,但是在一个模型需要使用其他模型的变量时,tf.get_variable就 ...
- MaxCompute同步数据的网络配置
MaxCompute可以通过数据集成加载不同数据源(例如:MySQL数据库等)数据,同样也可以通过数据集成把MaxCompute的数据导出到各种业务数据库.数据集成功能已经集成到DataWorks作为 ...
- 云原生DevOps的5步升级路径
简介: 究竟什么是云原生DevOps呢?我们认为:云原生DevOps是充分利用云原生基础设施,基于微服务/无服务架构体系和开源标准,语言和框架无关,具备持续交付和智能自运维能力,从而做到比传统DevO ...