本章介绍学习增、删、改、查、导功能如何实现,下面以商品资料作为示例,该业务栏位如下:
类型、编码、名称、规格、单位、库存下限、库存上限、备注
public class KmGoods : EntityBase
{
[Column("商品类型", "", true, "1", "50")]
public string? Type { get; set; }
......
[Column("库存下限", "", false)]
public decimal? MinStock { get; set; }
......
[Column("备注", "", false)]
public string? Note { get; set; }
}
public class GoodsClient : BaseClient
{
public GoodsClient(Context context) : base(context) { }
public Task<PagingResult<KmGoods>> QueryGoodsesAsync(PagingCriteria criteria) => Context.QueryAsync<KmGoods>("Goods/QueryGoodses", criteria);
public Task<Result> DeleteGoodsesAsync(List<KmGoods> models) => Context.PostAsync("Goods/DeleteGoodses", models);
public Task<Result> SaveGoodsAsync(object model) => Context.PostAsync("Goods/SaveGoods", model);
}
class GoodsList : WebGridView<KmGoods, GoodsForm>
{
//分页查询
protected override Task<PagingResult<KmGoods>> OnQueryData(PagingCriteria criteria)
{
return Client.Goods.QueryGoodsesAsync(criteria);
}
//表格栏位格式化显示
protected override void FormatColumns()
{
Column(c => c.Type).Select(new SelectOption { Codes = AppDictionary.GoodsType });
Column(c => c.TaxRate).Template((b, r) => b.Text(r.TaxRate?.ToString("P")));
}
public void New() => ShowForm();//新增按钮方法
public void DeleteM() => OnDeleteM(Client.Goods.DeleteGoodsesAsync);//批量删除按钮方法
public void Edit(KmGoods row) => ShowForm(row);//编辑操作方法
public void Delete(KmGoods row) => OnDelete(row, Client.Goods.DeleteGoodsesAsync);//删除操作方法
}
[Dialog(800, 420)]//设置对话框大小
class GoodsForm : WebForm<KmGoods>
{
//表单布局
protected override void BuildFields(FieldBuilder<KmGoods> builder)
{
builder.Hidden(f => f.Id);//隐藏字段
builder.Table(table =>
{
table.ColGroup(15, 35, 15, 35);
table.Tr(attr =>
{
builder.Field<Text>(f => f.Code).Enabled(TModel.IsNew).Build();//编码,编辑时灰显
builder.Field<Text>(f => f.Name).Build();
});
table.Tr(attr =>
{
builder.Field<Select>(f => f.Type).Set(f => f.Codes, AppDictionary.GoodsType).Build();//下拉框
builder.Field<Select>(f => f.Unit).Set(f => f.Codes, AppDictionary.GoodsUnit).Build();
});
table.Tr(attr => builder.Field<Text>(f => f.Model).ColSpan(3).Build());
table.Tr(attr => builder.Field<RadioList>(f => f.TaxRate).ColSpan(3).Set(f => f.Items, AppDictionary.TaxRates).Build());//单选按钮
table.Tr(attr =>
{
builder.Field<Number>(f => f.MinStock).Build();//数值框
builder.Field<Number>(f => f.MaxStock).Build();
});
table.Tr(attr => builder.Field<TextArea>(f => f.Note).ColSpan(3).Build());//文本域
});
}
//表单底部按钮
protected override void BuildButtons(RenderTreeBuilder builder)
{
builder.Button(FormButton.Save, Callback(OnSave), !ReadOnly);
base.BuildButtons(builder);
}
//保存按钮方法
private void OnSave() => SubmitAsync(Client.Goods.SaveGoodsAsync);
}
[Route("[controller]")]
public class GoodsController : BaseController
{
private GoodsService Service => new(Context);
[HttpPost("[action]")]
public PagingResult<KmGoods> QueryGoodses([FromBody] PagingCriteria criteria) => Service.QueryGoodses(criteria);
[HttpPost("[action]")]
public Result DeleteGoodses([FromBody] List<KmGoods> models) => Service.DeleteGoodses(models);
[HttpPost("[action]")]
public Result SaveGoods([FromBody] object model) => Service.SaveGoods(GetDynamicModel(model));//转成dynamic类型
}
class GoodsService : ServiceBase
{
internal GoodsService(Context context) : base(context) { }
//分页查询
internal PagingResult<KmGoods> QueryGoodses(PagingCriteria criteria)
{
return GoodsRepository.QueryGoodses(Database, criteria);
}
//删除数据
internal Result DeleteGoodses(List<KmGoods> models)
{
if (models == null || models.Count == 0)
return Result.Error(Language.SelectOneAtLeast);
//此处增加删除数据校验
return Database.Transaction(Language.Delete, db =>
{
foreach (var item in models)
{
db.Delete(item);
}
});
}
//保存数据
internal Result SaveGoods(dynamic model)
{
var entity = Database.QueryById<KmGoods>((string)model.Id);
entity ??= new KmGoods { CompNo = CurrentUser.CompNo };
entity.FillModel(model);
var vr = entity.Validate();
if (vr.IsValid)
{
if (GoodsRepository.ExistsGoods(Database, entity))
return Result.Error("商品编码已存在。");
}
if (!vr.IsValid)
return vr;
return Database.Transaction(Language.Save, db =>
{
if (entity.IsNew)
{
entity.Code = GetGoodsMaxNo(db);
}
db.Save(entity);
}, entity.Id);
}
//获取商品最大编码
private static string GetGoodsMaxNo(Database db)
{
var prefix = "G";
var maxNo = GoodsRepository.GetGoodsMaxNo(db, prefix);
if (string.IsNullOrWhiteSpace(maxNo))
maxNo = $"{prefix}0000";
return GetMaxFormNo(prefix, maxNo);
}
}
class GoodsRepository
{
//分页查询
internal static PagingResult<KmGoods> QueryGoodses(Database db, PagingCriteria criteria)
{
var sql = "select * from KmGoods where CompNo=@CompNo";
return db.QueryPage<KmGoods>(sql, criteria);//查询条件自动绑定
}
//获取商品最大编码
internal static string GetGoodsMaxNo(Database db, string prefix)
{
var sql = $"select max(Code) from KmGoods where CompNo=@CompNo and Code like '{prefix}%'";
return db.Scalar<string>(sql, new { db.User.CompNo });
}
//判断商品是否已存在
internal static bool ExistsGoods(Database db, KmGoods entity)
{
var sql = "select count(*) from KmGoods where Id<>@Id and Code=@Code";
return db.Scalar<int>(sql, new { entity.Id, entity.Code }) > 0;
}
}
class KmGoodsImport : BaseImport
{
public KmGoodsImport(Database database) : base(database) { }
//定义导入栏位,自动生成导入规范
public override List<ImportColumn> Columns
{
get
{
return new List<ImportColumn>
{
new ImportColumn("商品类型", true),
new ImportColumn("商品编码", true),
new ImportColumn("商品名称", true),
new ImportColumn("计量单位", true),
new ImportColumn("规格型号", true),
new ImportColumn("税率"),
new ImportColumn("库存下限"),
new ImportColumn("库存上限"),
new ImportColumn("备注")
};
}
}
//异步导入处理逻辑
public override Result Execute(SysFile file)
{
var models = new List<KmGoods>();
var result = ImportHelper.ReadFile(file, row =>
{
var model = new KmGoods
{
CompNo = file.CompNo,
Type = row.GetValue("商品类型"),
Code = row.GetValue("商品编码"),
Name = row.GetValue("商品名称"),
Unit = row.GetValue("计量单位"),
Model = row.GetValue("规格型号"),
TaxRate = row.GetValue<decimal?>("税率"),
MinStock = row.GetValue<decimal?>("库存下限"),
MaxStock = row.GetValue<decimal?>("库存上限"),
Note = row.GetValue("备注")
};
var vr = model.Validate();
if (vr.IsValid)
{
if (models.Exists(m => m.Code == model.Code))
vr.AddError("商品编码不能重复!");
else if (GoodsRepository.ExistsGoods(Database, model))
vr.AddError($"系统已经存在该商品编码!");
}
if (!vr.IsValid)
row.ErrorMessage = vr.Message;
else
models.Add(model);
});
if (!result.IsValid)
return result;
return Database.Transaction("导入", db =>
{
foreach (var item in models)
{
db.Save(item);
}
});
}
}
大家好,又见面了,我是你们的朋友全栈君。虚拟机搭建web服务器描述:把主机的项目部署到虚拟机Linux系统下,并且可以在主机上访问得到一、首先下载虚拟机 链接:https://blog.csdn.net/felix__h/article/details/82853501 二、下载Linux镜像文件 链接:https://pan.baidu.com/s/12vA9yELUWV_nRNDHJaOmWw密码:a1yz 三、打开下载好的Vmware,选择创建新的虚拟机 1、接下来进入新建虚拟机向导,选择自定义 2、点击下一步下面选择默认的选项 3、点击下一步,选择稍后安装 4、点击下一步,选择Linux系统,版本选择CentOS764位 5、点击下一步,这里的位置,是你安装的虚拟机的位置 6、点击下一步,这里保持默认配置 7、点击下一步,这里设置你要从内存中分配给虚拟机的内存,推荐是1G,保持默认,内存越大,运行越流畅,但不能超出推荐的最大内存, 8、虚拟机分配网络,如果你想在虚拟机中上网浏览网页,请选择前两种的任一种,如果你不需要在虚拟机中上网,请选择后两种的任一种,点击“下
Eslint是我们每天都在用的工具,我们会用它的cli或api来做代码错误检查和格式检查,有时候也会写一些rule来做自定义的检查和修复。虽然每天都用,但我们却很少去了解它是怎么实现的。而了解Eslint的实现原理能帮助我们更好的使用它,更好的写一些插件。所以,这篇文章我们就通过源码来探究下Eslint的实现原理吧。LinterLinter是eslint最核心的类了,它提供了这几个api:verify//检查 verifyAndFix//检查并修复 getSourceCode//获取AST defineParser//定义Parser defineRule//定义Rule getRules//获取所有的Rule 复制SourceCode就是指的AST(抽象语法树),Parser是把源码字符串解析成AST的,而Rule则是我们配置的那些对AST进行检查的规则。这几个api比较容易理解。Linter主要的功能是在verify和verifyAndFix里实现的,当命令行指定--fix或者配置文件指定fix:true就会调用verifyAndFix对代码进行检查并修复,否则会调用verify
微软的解决办法usingSystem;usingSystem.Data;usingSyst运维微软的解决办法usingSystem; usingSystem.Data; usingSystem.Data.SqlClient; usingSystem.Drawing; usingSystem.Windows.Forms;publicclassPagingSample:Form { //Formcontrols. ButtonprevBtn=newButton(); ButtonnextBtn=newButton();staticDataGridmyGrid=newDataGrid(); staticLabelpageLbl=newLabel();//Pagingvariables. staticintpageSize=10;//Sizeofviewedpage. staticinttotalPages=0;//Totalpages. staticintcurrentPage=0;//Currentpage. staticstringfirstVisibleCustomer="&
阅读目录(Content)一、Hadoop客户端配置二、Java访问HDFS集群2.1、HDFS的Java访问接口 2.2、Java访问HDFS主要编程步骤 2.3、使用FileSystemAPI读取数据文件三、实战Java访问HDFS集群3.1、环境介绍3.2、查询HDFS集群文件系统的一个文件将它文件内容打印出来3.3、我们在IEDA中执行来获取文件系统的内容并打印在控制台和相应的本地文件中3.4、获取HDFS集群文件系统中的文件到本地文件系统3.5、通过设置命令行参数变量来编程3.6、从HDFS集群中下载文件到本地前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令:hdfsdfs-lsxxx hdfsdfs-mkdir-p/xxx/xxx hdfsdfs-catxxx hdfsdfs-putlocalcluster hdfsdfs-getclusterlocal hdfsdfs-cp/xxx/xxx/xxx/xxx hdfsdfs-chmod-R777/xxx hdfsdfs-chown-Rzyh:zyh/xxx复制 注意:这里要说明一下-cp,我
没错,我又要开一个新的系列文章了。第一篇文章我们来玩一个游戏:两个人从1,2,3,4,5,6,7,8,9里面轮流取数,每次取一个数,一个人取了某个数,另一个人就不能再取它了。 取胜条件:1.先取数的人,从自己拥有的数字里面任取三个数,这三个数相加之和为15。2.后取数的人:三个数之和为15。 例如:A取6,B取7,A取4,B取3,A取5,此时A的三个数之和为15,A获胜。这个游戏初看起来很简单,但是策略性却不低。假设A取了一个数字4,为了获胜,他接下来需要取两个数,这两个数之和是11,那么组合有(2,9)、(3,8),(5,6)。此时B为了防止A胜利,那么他可以设法破坏一个组合,比如他取走了3。A只能从(2,9),(5,6)里面取一个数。如果A取了2,B就取9;A取6,B取5现在局势倒转了,B拥有5和9、3和5,如果A取1,那么B取7胜利;如果A取7,那么B取1胜利。A虽然有先手优势,但是他一味贪胜,没有注意到B在堵他的时候,依然悄悄凑够了一个胜利的局势。B虽然是后手,但是他在A第一次取了数以后,并不是随便乱选一个数来破坏A剩余的11,而是有策略的深入考虑了后面的可能性。如果B一开始没
一名27岁的网站管理员,为了能在黑客界展现自己的技术,从2017年起,多次黑入他人计算机系统,其中不乏一些大的企业公司,甚至曾经将河南一工商局的网站变成了赌博网。今年6月初,张家港市公安局网警大队民警网络巡查时发现,一名网名"星爷"的人多次通过木马病毒入侵他人计算机系统。张家港市公安局后塍派出所接到这条线索后立即展开调查,通过分析研判,锁定"星爷"就是辖区某公司员工郑某。6月8日上午,民警将嫌疑人郑某成功抓获。据查,27岁的郑某是湖北十堰人,就职于金港镇后塍街道的一家公司,主要负责公司的网站维护管理。审讯中,郑某对利用木马病毒入侵他人计算机系统的犯罪事实供认不讳。有着稳定体面工作的他,为何要铤而走险进行犯罪呢?原来,90后的郑某从小对计算机网络感兴趣。为证明自身黑客技术非常高超,从2017年起,郑某就开启了黑客之路,并在当年7月,成功"黑"入河南省新乡市工商局网站,将该网站变成赌博网。此事在当地也引起了不小的反响,郑某从此一发不可收拾。郑某向民警交代,他多次入侵别人计算机系统,其实并不是为了钱,而是为了名。他先后2次向40余个
VA11创建询价潜在客户向我们发送了最终产品的询价。将其输入系统。系统中有客户/物料的主数据。有客户的规格文档。后勤®销售和分销®销售®询价®创建1.在创建询价:初始屏幕上,输入以下数据:字段名称用户操作和值注释询价类型YDAFBP询价销售组织1000分销渠道10产品组101.选择回车确认输入。2.在创建BP询价:概览屏幕上,输入以下数据:字段名称描述用户操作和值注释售达方潜在客户100001可使用输入帮助采购订单编号客户的采购订单编号输入编号链接到客户内部编号采购订单日期客户采购订单的日期当天3.选择回车更新屏幕数据。4.在项目总览选项页中,输入以下数据:字段名称描述用户操作和值注释请求交货日期到达客户的日期<当天+6个月>大约未来6个月以内报价有效至<当天+2个月>物料主要项目的物料编号F240-1订单数量1需要的最终产品的数量5.选择回车更新屏幕数据,选择回车确认以下信息:修改发票日期:重新确定出具发票日期。6.选择销售选项页,并维护定价日期[<当天+2个月>]。7.保存输入并记下询价编号:_______________________.
一、执行两次的useEffect。前段时间在本地启了一个ReactDemo项目,在编码的过程中遇到一个很奇怪的“Bug”。 其中简化版的代码如下所示。//入口文件 import{StrictMode}from'react'; import*asReactDOMClientfrom'react-dom/client'; importAppfrom'./App'; constroot=ReactDOMClient.createRoot(document.getElementById('root')); root.render( <StrictMode> <App/> </StrictMode> );复制//组件代码 importReact,{useEffect}from'react'; constApp=()=>{ useEffect(()=>{ console.log('组件挂载完成!'); },[]); return&
根据本文内容用Numpy实现的一个前馈神经网络https://github.com/massquantity/DNN_implementation 本篇本来是想写神经网络反向传播算法,但感觉光写这个不是很完整,所以就在前面将相关的求导内容一并补上。所谓的神经网络求导,核心是损失函数对线性输出\(\mathbf{z}\;\;(\mathbf{z}=\mathbf{Wa}+\mathbf{b})\)求导,即反向传播中的\(\delta=\frac{\partial\mathcal{L}}{\partial\mathbf{z}}\),求出了该值以后后面的对参数求导就相对容易了。 \(\text{Jacobian}\)矩阵 函数\(\boldsymbol{f}:\mathbb{R}^n\rightarrow\mathbb{R}^m\),则\(\text{Jacobian}\)矩阵为: \[\frac{\partial\boldsymbol{f}}{\partial\mathbf{x}}= \begin{bmatrix} \frac{\partialf_1}{\partialx_1}&
现在你已经掌握了创建和升级数据库的方法,接下来就该学习一下如何对表中的数据进行操作了。其实我们可以对数据进行的操作也就无非四种,即CRUD。其中C代表添加 (Create),R代表查询(Retrieve),U代表更新(Update),D代表删除(Delete)。每一种操作又各自对应了一种SQL命令,如果你比较熟悉SQL语言的话,一定会知道添加数据时使用insert,查询数据时使用select,更新数据时使用update,删除数据时使用delete。但是开发者的水平总会是参差不齐的,未必每一个人都能非常熟悉地使用SQL语言,因此Android也是提供了一系列的辅助性方法,使得在Android中即使不去编写SQL语句,也能轻松完成所有的CRUD操作。 前面我们已经知道,调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法是可以用于创建和升级数据库的,不仅如此,这两个方法还都会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行CRUD操作了。那么我们一个一个功能地看,首先学习一下如何向数据库的表中
本系列将分析ASP.NETCore运行原理 【ASP.NETCore】运行原理[1]:创建WebHost 【ASP.NETCore】运行原理[2]:启动WebHost 【ASP.NETCore】运行原理[3]:认证 本节将分析WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build();代码。 源代码参考.NETCore2.0.0 WebHostBuilder WebHost Kestrel 问题概要 Hosting中有哪2个ServiceProvider,各自如何创建,以及有哪些ServiceCollection。 什么时候执行Startup的ConfigureServices和Configure方法 什么时候注册和使用的Server 手工模拟一个DefaultWebHost环境 WebHost.CreateDefaultBuilder(args) 该方法为WebHost类的静态方法,内部创建1个WebHostBuilder。 参数args将作为配置项 添加了Kestrel、Configur
Andythesmartcomputersciencestudentwasattendinganalgorithmsclass whentheprofessoraskedthestudentsasimplequestion,"Canyoupropose anefficientalgorithmtofindthelengthofthelargestpalindromeinastring?" Astringissaidtobeapalindromeifitreadsthesamebothforwardsandbackwards, forexample"madam"isapalindromewhile"acm"isnot. Thestudentsrecognizedthatthisisaclassicalproblembutcouldn'tcomeupwithasolutionbetter thaniteratingoverallsubstringsandcheckingwhethertheyarepalindromeornot,obviouslythis algorithmisnotef
Recursion deffact(n): ifn==1: return1 else: returnn*fact(n-1) a=fact(5) print(a) ##ThisisaRecursion复制 BinarySearch ##linearsearch->bruteforce ##linearsearchfirst defsqrt(p): foriinrange(p): ifi*i==p: returni a=sqrt(25) ##Hereisbinarysearch defsqrt2(n): low=0 high=n whilelow<=high: mid=(low+high)//2 ifmid*mid==n: returnmid ifmid*mid>n: high=mid-1 else: low=mid+1 a=sqrt2(25) print(a)复制 Printfibnaccinumbersin3ways ##ordinarymethod deff1(n): ifn==0: return0 elifn==1orn==2: return1 else
原文链接:https://blog.csdn.net/qwezxc24680/article/details/74550556 从github上看到一个不错的开源项目:https://github.com/lavyun/vue-demo-search, 自己琢磨着不看代码做了一遍学习了不少,现将碰到的坑与填坑过程分享出来。 首先看一下demo的界面: 简单来说就是一个复刻各大搜索引擎的功能,用户输入关键字能出现搜索建议并上下键控制输入框内容。 同时点击上方logo能够切换不同引擎,点击搜一下能跳转到对应网站搜索结果。 首先分析一下页面,基本由2个部分组成:上方的LOGO部分和下方的输入框与搜索建议弹框。 由于篇幅关系,这次先分析logo部分的实现代码。 基于这次练习是针对Vue组件,所以我们可以将其拆分为logo组件和搜索组件,并将其设为父子组件方便初学,将来熟练以后可以考虑变为更常见的兄弟组件并使用eventbus或者vuex来实现组件通信。 开发环境:Vue2.0、
静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。 <?php functiontestStatic($start,$end){ static$num=""; if($start<$end){ $v1=$start; $v2=$end; }else{ $v1=$end; $v2=$start; } for($i=$v1;$i<=$v2;$i++){ $num.=$i."<br/>"; } return$num; } testStatic(1,30); $lastnum=testStatic(31,70); echo$lastnum; ?> 复制 则最终的结果显示的是1到70之间的数字
E.Minimumspanningtreeforeachedge timelimitpertest 2seconds memorylimitpertest 256megabytes input standardinput output standardoutput Connectedundirectedweightedgraphwithoutself-loopsandmultipleedgesisgiven.Graphcontains n verticesand m edges. Foreachedge (u, v) findtheminimalpossibleweightofthespanningtreethatcontainstheedge (u, v). Theweightofthespanningtreeisthesumofweightsofalledgesincludedinspanningtree. Input Firstlinecontainstwointegers n&nbs
之前写网页都很标准的格式,最近一个项目出现了页面闪动等一系列问题【项目不是前后端分离】, 所以这边有后台的功劳,有部分后台是不管你页面结构的,在他们操作的时候可能会在,你的head内meta前加内联css,或者js,在引擎加载规范的前面有其他css,js干扰,加载后又有其他样式,js,导致页面结构不稳定。在这里提醒各位开发者,搭建规范的页面结构还是很重要的,这边我去百度了一篇比较有道理的解释。 基本上就这几个标签么<meta>、<link>、<title>、<script>、<style>、<base> 它们没有(规范上的)既定顺序标准。一般是按照具体经验来分配。如: <meta> <title> <link>\<style> <base> <script> 当然,约往后位置约不重要。比如45调换也没啥大事儿。基本规律是: meta最好写在第一个,特别是metachaset设定必须写第一个,它们是元数据,能让数据获取方
A、RescueThePrincess 已知一个等边三角形的两个顶点A、B,求第三个顶点C,A、B、C成逆时针方向。 常规的解题思路就是用已知的两个点列出x,y方程,但这样求出方程的解的表达式比较复杂。更为简单的方法就是以A的坐标加A、C直线的角度求解,使用atan2函数求出A、B直线的角度再加上60就是A、C的角度,使用A、B求出等边三角形的边长。 1#include<cstdio> 2#include<cmath> 3#include<iostream> 4 5usingnamespacestd; 6 7constdoublepi=acos(-1.0); 8doublexx1,yy1,xx2,yy2,xx3,yy3,jiao,leng; 9 10intmain(intargc,charconst*argv[]) 11{ 12freopen("SD_3230_Rescue_The_Princess.in","r",stdin); 13intamount; 14scanf("%d",&amount); 15while(amount--){
一.安装XGBoost: 通过链接: https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 下载自己适用的版本: 下载完后,打开anacodaprompt,使用: pipinstallxgboost-0.90-cp35-none-win_amd64.whl复制 安装过程中可能会遇到问题: 为了解决这个问题,我们在cmd后中输入: >>>importpip; >>>print(pip.pep425tags.get_supported()) [('cp35','none','win_amd64'),('py3','none','win_amd64'),('cp35','none',' any'),('cp3','none','any'),('cp34','none','any'),('cp33','none','any'), ('cp32','none','any'),('cp31','none','any'),('cp30