后端学习记录 1
大佬让我看的后端教程: https://www.donet5.com/Home/Doc sqlsugar5.0 一个orm框架
orm框架:简化sql操作的工具 建议参考网址: https://geektutu.com/post/geeorm.html 这是Go关于orm的教程,但是对orm写的很清楚。
正式学习,笔记整理:
工具: VS2022 .NET6 ,个人建的是ASP.NET Core(空)
配置:Nuget包(顶部菜单栏:工具(T)→NuGet包管理器(N)→管理解决方案的NuGet程序包(N))
SqlSugarCore //安装SqlSugar,项目带驱动打包 → 本人安装的 SqlSugarCoreNoDrive //安装SqlSugar,项目打包不带驱动,先上车后补票
Furion.SqlSugar.Template.XXX //手脚架,可以Nuget查版本,已经做过尝试NuGet窗口不能安装,错误提示为:包“Furion.SqlSugar.Template.App 4.8.8.30”具有一个包类型“Template”,项目“LearnSqlSugar”不支持该类型。
//Furion安装途径 → 在开发者PowerShell或者新建终端,命令行安装:dotnet new --install Furion.SqlSugar.Template.XXX::XXXX 其中XXX是对应手脚架类型,XXXX是版本号
//会提示donet new --install已弃用,请用donet new install。不过它很聪明,仍然会安装的,不用管。

然后抛弃这个一次性项目,可以新建模板了。我建了:TestForLearnSqlSugar_App,用的模板是Furion.SqlSugar.Template.App。
避坑:
框架选NET8.0会报错 // 改用了NET6.0
新建项目后运行,错误提示:“无法直接启动带有类库输出类型的项目” // 点击“解决方案资源管理器”的整个解决方案,右键选择“属性(R)” // 弹出窗口中,左侧选择“通用属性”→“启动项目”,右侧选择“单启动项目(S)”→“xxxxxxxxx(你的项目).Web.Entry”,后点击确定。 // 运行成功,页面标签为:“让.NET更简单,...”
// 原本可以直接点击项目,右键选择“设为启动项目”的,但是我的选项灰了,设置不了。
大佬给我的网址上面的教程只有功能使用,在哪用这个功能没写的,不适合小白(满脸写着高兴)
该网址提供的源码下载学习 : https://gitee.com/dotnetchina/SqlSugar ,根据我目前所学的内容,下载源码后将打开SqlSugar.sln进行学习,目标文件夹sqliteTest。
然后发现目录结构和手脚架完全不一样(满脸更高兴了)
本地配置修改参考: https://www.donet5.com/Home/Doc?typeId=2260 sliteTest不需要更改地址、用户、密码,不用改配置直接跑。
如果要改数据库配置,在SqlSugar解决方案下的SqlSeverTest的Config.cs中修改。
运行后
阅读终端:可以发现程序把Demo所有的Test的建表都跑了一遍。
阅读目录:

|SqliteTest |--|引用|--| |--|Properties|--| |--|Bugs |--|--|BugTest.cs |--|Demo |--|--|Demo0_SqlSugarClient.cs |--|--|Demo1_Queryable.cs |--|--|Demo2_Updateable.cs |--|--|Demo3_Insertable.cs |--|--|Demo4_Deleteable.cs |--|--|Demo5_SqlQueryable.cs |--|--|Demo6_Queue.cs |--|--|Demo7_Ado.cs |--|--|Demo8_Saveable.cs |--|--|Demo9_EntityMain.cs |--|--|DemoA_DbMain.cs |--|--|DemoB_Aop.cs |--|--|Democ_GobalFilter.cs |--|--|DemoD_DbFirst.cs |--|--|DemoE_CodeFirst.cs |--|--|DemoF_Utilities.cs |--|--|DemoG_SimpleClient.cs |--|--|DemoJ_Report.cs |--|--|DemoN_SplitTable.cs |--|Models |--|--|AttributeTable.cs |--|--|BoolTest.cs |--|--|CarType.cs |--|--|Custom.cs |--|--|EntityMapper.cs |--|--|Mapper.cs |--|--|MyCustomAttributeTable.cs |--|--|Order.cs |--|--|Orderltem.cs |--|--|TestTree.cs |--|--|Tree.cs |--|UnitTest |--|--|Models|--| |--|--|U...|--| |--|x64|--| |--|x86|--| |--|app.config |--|Config.cs |--|Program.cs
程序运行后,入口是program.cs:

using System; namespace OrmTest { class Program { static void Main(string[] args) { //Demo Demo0_SqlSugarClient.Init(); Demo1_Queryable.Init(); DemoN_SplitTable.Init(); Demo2_Updateable.Init(); Demo3_Insertable.Init(); Demo4_Deleteable.Init(); Demo5_SqlQueryable.Init(); Demo6_Queue.Init(); Demo7_Ado.Init(); Demo8_Saveable.Init(); Demo9_EntityMain.Init(); DemoA_DbMain.Init(); DemoB_Aop.Init(); DemoC_GobalFilter.Init(); DemoD_DbFirst.Init(); ; DemoE_CodeFirst.Init(); DemoF_Utilities.Init(); DemoG_SimpleClient.Init(); DemoJ_Report.Init(); //Unit test //NewUnitTest.Init(); //Rest Data NewUnitTest.RestData(); Console.WriteLine("all successfully."); Console.ReadKey(); } } }
内容是将Demo文件夹内的全init一遍,至于末尾的NewUnitTest,位于UnitTest文件夹下的Main.cs,内容是:

using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OrmTest { public partial class NewUnitTest { public static SqlSugarClient Db=> new SqlSugarClient(new ConnectionConfig() { DbType = DbType.Sqlite, ConnectionString = Config.ConnectionString, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true, AopEvents = new AopEvents { OnLogExecuting = (sql, p) => { Console.WriteLine(sql); Console.WriteLine(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value))); } } }); public static void RestData() { Db.DbMaintenance.TruncateTable<Order>(); Db.DbMaintenance.TruncateTable<OrderItem>(); } public static void Init() { UFilter2.Init(); UinitCustomConvert.Init(); UnitNavUpdatee12.Init(); UnitFilterdafa.Init(); UInsert3.Init(); USaveable.Init(); UnitSubToList.Init(); UnitByteArray.Init(); Unit01.Init(); UnitNavInsertadfa1.Init(); UnitNavInsertIssue.Init(); UnitInsertNavN.Init(); UNavTest.Init(); UnitTestReturnPkList.Init(); UCustom01.Init(); UCustom011.Init(); UBulkCopy.Init(); Bulk(); Insert(); CodeFirst(); Updateable(); Json(); Ado(); Queryable(); QueryableAsync(); Thread(); Thread2(); Thread3(); } } }
就是把同级目录下的U开头文件全执行一遍。
而UnitTest文件夹下的Model文件夹,似乎是存储了各类数据模板。
但是终端跑完后并没有什么结果,打开SqlServer对象资源管理器也没有新的表单出现,教程提供了建表、增删改查的语句,但是怎么在项目中插入、在哪插入那是一句都没提,我看了整整一天了。
(满脸写着高兴)也许我应该下班后跟着视频看。
我把源码关了,打算看看公司项目的代码。既然大佬甩我一个教程,那么项目里肯定有用到。
对于文件夹XXX.ORM下的目录:
|FORTOO.ORM |--|Aop |--|--|TransactionAspect.cs //事务切面 异步 过滤 (不懂) |--|--|TransactionAttribute.cs //内容为空,空构造(但是被40多次引用) |--|Repository |--|--|BaseDataRepository.cs //继承SugarManager, IBaseDataRepository,写 |--|--|BaseReadRepository.cs //继承SugarManager, IBaseDataRepository,读 |--|--|BaseRepository.cs //继承SugarDbContext, IBaseRepository,实体数据增删改 |--|--|BusinessRespository.cs //业务抽象方法实践,似乎是excel表导入导出 |--|--|IBaseDataRepository.cs //公共写操作,异步方法、同步方法 |--|--|IBaseReadRepository.cs //公共读操作,异步方法、同步方法 |--|--|IBaseRepository.cs //基类接口,各种查询删改 |--|--|IBusinessRepository.cs //公共业务操作CRUD,全异步方法 |--|SqIDatabaseEnum.cs //意义不明,内嵌“FORTOO,MYHOMEDB”,查了一下应该是DBName |--|SugarDbContext.cs //基础类,调用SqlDatabaseEnum、SugarOption,事务配置 |--|SugarManager.cs //派生自SugarDbContext,取FORTOO |--|SugarOption.cs //配置DBConfig、拼接数据库连接字段
库类设置不在这里。但是有不少自动生成项。
找上了文件夹AutoMapper中的UserProfile.cs,发现汇总了各类表单的创建语句:
CreateMap<xxxxx>();
鼠标放在上方一段时间后能显示注释(如果源代码有标注的话)
找到了系统菜单类的配置:位于
XXX.DTO>VO>BasicData>SystemMenuButtonVO.cs
XXX.Domain>BasicData>SSysMenu.cs
public class SystemMenuButtonVO{ /// <summary>菜单主键</summary> public int ID { get; set; } /// <summary>菜单父级主键</summary> public int Parent_ID { get; set; } /// <summary>菜单名称</summary> public string? Name { get; set; } /// <summary>菜单路径</summary> public string? Path { get; set; } /// <summary>组件目录</summary> public string? Component { get; set; } /// <summary>菜单元数据</summary> public MenuMetaVO? Meta { get; set; } /// <summary>菜单名称</summary> public string? Title { get; set; } /// <summary>菜单图标</summary> public string? Icon { get; set; } /// <summary>菜单名称</summary> public int? Code { get; set; } /// <summary>页面是否需要缓存</summary> public int? KeepAlive { get; set; } /// <summary>菜单描述</summary> public string? Remark { get; set; } /// <summary>按钮集合</summary> public List<SystemButtonVO> Buttons { get; set; } = new List<SystemButtonVO>(); /// <summary>子菜单</summary> public List<SystemMenuButtonVO> Children { get; set; } = new List<SystemMenuButtonVO>(); /// <summary>按钮主键</summary> public List<int> Button_Ids{ get{ return Buttons.Select(it => it.ID).ToList(); } } /// <summary>菜单按钮名称</summary> public string? Funcs_Name{ get{ return string.Join(",", Buttons.Select(it => it.Name)); } } /// <summary>是否子菜单</summary> public int? Type { get; set; } /// <summary>是否有效</summary> public int? Enable { get; set; } }
在不停的把类名复制黏贴到Ctrl+Shift+F中查找所有引用并且判断筛选,我终于找到菜单栏的数据库连接在哪了!
公司数据所用数据库有mysql、mssql、Oracle,配置在XXX.Generate>Template>appsettings.json
哦这后端,直接入门到入土。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通