自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(298)
  • 资源 (206)
  • 收藏
  • 关注

原创 第7章 通过内网本机IP获取微信code值及其对code值的回调。

对以上功能更为具体实现和注释见:230810_007WeChatWebApi(通过内网本机IP获取微信code值及其对code值的回调)。在第5章中讲述了怎样通过内网穿透外外网从而获取微信code值,实际上微信测试帐号管理页中也支持通过内网本机IP获取微信code值。,注意该参数名必须为“code”如果使用本机IP进行从微信中获取code值时,如果该参数名不为“code”会出错。当前程序使用使用微信进行身份认证后进行授权登录时,获取微信提供的授权认证信息。【使用微信进行登录时获取微信提供的授权认证信息】

2023-08-10 18:09:07 396

原创 第6章 间接通过code获取微信网页授权中的微信access_token

获取/设置用户使用微信登录后,1个指定微信用户的令牌信息的过期时间,开发者通过该信息让当前程序集成微信的第3方授权认证,微信将其设定为7200秒=2小时。获取/设置用户使用微信登录后,1个指定微信用户的令牌信息的过期时间,开发者通过该信息让当前程序集成微信的第3方授权认证,微信将其设定为7200秒=2小时。当前程序使用使用微信进行身份认证后进行授权登录时,微信服务器向当前程序发送的code值,该code值为使用微信进行登录时获取微信用户的信息提供参数支持。

2023-08-07 11:45:53 527

原创 第5章 通过微信网页授权间接获取微信中的code值

对以上功能更为具体实现和注释见:230805_004WeChatGetCode(微信code值回调页面)、230805_005WeChatWebApi(微信code回调URL拼接组合)。由于当前最新版的微信不再显示带有code值的错误页面,所以开发者必须先自己构建1个用于获取code值外网的有效回调页面,微信浏览器才能通过该有效回调页面获取code值。3、如果你的IIS或其它是内网可使用花生壳做内网穿透,网上也有一些不需要任何费用的命令文件也可以做内内网穿透但配置下来更为复杂和麻烦。2、使用微信扫码登录。

2023-08-05 21:02:35 832

原创 第4章 .NetCore程序通过花生壳实现内网穿透

NetCore程序在调试环境中都是基于内网的,但是.NetCore程序如果需要集成微信第3方认证程序,由于微信第3方认证程序需要外网把认证后的数据信息,通过外网传输到.NetCore程序中,所以必须先实现把内网地址映射为外网地址这样的操作叫做内网穿透。只有经过内网穿透操作才能实现微信第3方认证数据与.NetCore程序的交互通信。输入 ipconfig/all命令,获取内网ip,由于笔记本是双网卡所以必须使用ipconfig/all命令,那个网卡连接外网则,获取其内网ip。

2023-08-01 13:59:53 415

原创 第3章 配置与服务

获取列表============================================================如果数据库软件对自动生成的数据库支持自动备份操作,则通过下行语句在自动生成该数据库中,根据当前项目中的实体类自动生成相应的表。该类中的方法成员,通过1个指定的根节点中1指定的子节点,获取该子节点所对应的值。指定的子节点,获取该子节点所对应的值,最后把该值赋值给该类中的属性成员。通过1个指定的根节点中1指定的子节点,获取该子节点所对应的值。

2023-07-28 18:24:31 366

原创 第2章 逻辑分页、AutoFac注入、工作单元与仓储

个事务中的所有操作进行提交到指定的数据库的过程中如果出现异常时,则通过该方法实现回滚。个事务中的所有操作进行提交到指定的数据库的过程中如果出现异常时,则通过该方法实现回滚。通过继承该接口的具体实现类中的属性成员实例,逻辑的从数据源中加载指定。逻辑页中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。页中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。通过该类及其属性成员实例,只逻辑的从数据源中加载指定。通过继承该接口的具体实现类中的方法成员,获取。个事务中的所有操作进行提交到指定的数据库中。

2023-07-27 15:48:11 813

原创 第1章 获取数据库中的数据

CoreShop源程序是以数据库优先进行定义的,所以其本身不包含代码优先的定义,但本从更习惯于代码优先,所以为其定义了代码优先的定义。如果数据库软件对自动生成的数据库支持自动备份操作,则通过下行语句在自动生成该数据库中,根据当前项目中的实体类自动生成相应的表。的程序是数据库优先,即必须先生成指定的数据库,本人更为喜欢代码优先所以进行了以下定义来实现代码优先。必须定义在下行语句中,否则在自动生成表时,该约束定义将不会被映射到表的字段上。如果指定的数据库软件中不存在指定的数据库,则自动生成该数据库。

2023-07-25 21:15:16 590

原创 第32章 uView多文件上传

对以上功能更为具体实现和注释见:230722_032WebApi(uView多文件上传)230722_006uView_default(uView多文件上传)把多个指定的上传文件从客户端上传到服务器端的指定目录中。上传文件所需要调用的指定的后端控制器行为方法。多个指定的上传文件上传操作后的状态信息。组件本身显示上传预览图片,则必须设置。多个指定的上传文件实例的集合。、如果使用头属性字典传递。需要或已经被上传的文件。参数实例在多文件上传中。个指定的上传文件实例。参数实例,则不用使用。参数实例,则必须使用。

2023-07-22 10:09:07 553

原创 uView单文件上传

对以上功能更为具体实现和注释见:230709_031WebApi( uView单文件上传)230709_005uView_default( uView单文件上传)个指定的上传文件从客户端上传到服务器端的指定目录中。上传文件所需要调用的指定的后端控制器行为方法。个指定的上传文件上传操作后的状态信息。组件本身显示上传预览图片,则必须设置。组件显示上传预览图片,则必须设置。个指定的上传文件的实例。、如果使用头属性字典传递。需要或已经被上传的文件。参数实例,则不用使用。参数实例,则必须使用。

2023-07-09 17:57:36 1059

原创 第30章 uView内置路由在uView 中的CURD实现

对以上功能更为具体实现和注释见:230701_004uView_default(uView内置路由在uView 中的CURD实现)方法进行序列化化,否则不会把数据提交到后端的控制器行为方法。方法进行序列化化,否则不会把数据提交到后端的控制器行为方法。路由依然会把数据提交到后端的控制器行为方法。路由依然会把数据提交到后端的控制器行为方法。注意:如果后端控制器行为使用列表参数实例,内置路由即使不带上述参数。内置路由即使不带上述参数。路由时如果后端没有定义。路由中的参数也必须通过。路由中的参数也必须通过。

2023-07-01 14:47:55 701

原创 第29章 axios路由在uView 中的CURD实现

通过自动生成的迁移类中的定义,自动在指定的数据库软件中生成指定的数据库、表、字段和约束规则。模型生成器实例,用于把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。该方法把当前程序中实体和属性所定义的约束规则,映射到数据库指定表及其字段上。次生成数据库时,则也通过下行执行迁移和更新命令行的结合数据库连接字符串,在。设置实体的数据库设置实例,用于实现指定实体与数据库指定表的。数据库软件中生成指定的数据库数据库、表、字段和约束规则。数据库软件中生成指定的数据库数据库、表、字段和约束规则。

2023-06-30 19:04:13 706

原创 第28章 uView 内置路由与.NetCore调试

对以上功能更为具体实现和注释见:230627_029WebApi(uView 内置路由获取.Netcore http或https数据测试)内置路由不能通过该本机域名获取数据,测试时不可以直接获取数据。内置路由不能通过该本机域名获取数据,测试时不可以直接获取数据。内置路由不能通过该本机域名获取数据。端口,测试时可以直接获取数据。端口,测试时可以直接获取数据。本机域名进行安全认证的,进行安全认证后也无效,协议进行测试,必须通过。内置路由能通过该本机。内置路由能通过该本机。内置路由如果要想使用。

2023-06-27 17:15:43 511

原创 第27章 uView 内置路由使用注意事项

但在移动开发中经常使用“uView”前端模版,“uView”前端模版中内置了自己的路由,但是“uView”内置路由不选择支持使用“localhost”域名,不管该“localhost”域名是由IIS提供还是“.NetCore”提供,如果使用“localhost”域名将会出现以下现象。3、执行命令:C:\Users\Administrator\Downloads>mkcert-v1.4.4-windows-amd64.exe 127.0.0.1 ::1 192.168.1.100 localhost。

2023-06-27 11:14:19 1010

原创 第26章 用户实体删除与批量删除的定义实现

如果分布式缓存数据库中无指定实例,则把指定实例存储到分布式缓存数据库中后,获取指定实例。如果分布式缓存数据库中有指定实例,则直接从分布式缓存数据库中获取指定实例。或从分布式缓存数据库获取用户实体的多个指定实例。个指定实例从用户表中物理批量删除后,并从缓存数据库中移除与用户相关的所有缓存项。个指定的缓存键字符串,该缓存键字符与角色实体所有实例两者构建了缓存映射关系。个指定实体的多个指定实例,缓存到分布式缓存数据库中。列表实例,该实例存储着用户实体的多个指定实例。集合实例,该实例存储着多个指定的长整编号值。

2023-06-13 10:42:03 1947 1

原创 第25章 用户编辑与bootstrap-fileinput头像上传

文件上传的行为方法,注意:如果要想在上传预览的缩略图中显示:删除、上传、缩略、下载、旋转等图标,必须的定义该属性。该类中的属性成员实例设定一些常量值,为多媒体服务相关类的定义实现提供相应的支撑。如果所选择的上传文件的总大小大于限定值,则弹出警告窗口,如果点击弹出警告窗口中的。时,则会把列表中的所有文件的数据同时提交到后台行为方法的对应参数中;也可以定义的后端手动验证来验证选择的上传文件。选择上传文件完成后,自动对文件进行上传操作。,则表示允许的文件数是无限制的。按钮,则删除已经选择的所有的上传文件。

2023-06-12 11:27:51 921

原创 第24章 DataAnnotations自定义手动验证的定义实现

个指定实例从用户角色映射表中物理删除后,并从缓存数据库中移除与用户角色映射实体相关的所有缓存项。个指定实例持久化插入到用户角色映射表中后,并从缓存数据库中移除与用户角色映射相关的所有缓存项。加密方式密码的长度是固定的,且只取决于所使用的算法,当明码的长度大于算法中所规则的长度时,哈希。个指定实例持久化更新到用户表中后,并从缓存数据库中移除与用户实体相关的所有缓存项。个指定实例从用户表中逻辑删除后,并从缓存数据库中移除与用户实体相关的所有缓存项。该方法没有定义缓存操作,更没有定义缓存的移除操作。

2023-06-06 16:27:26 583

原创 第23章 多选下拉框的渲染显示

对以上功能更为具体实现和注释见230604_023ShopRazor(多选下拉框的渲染显示)。,即由于该方法中使用的是非操作所以需要添加扩展属性。个指定的缓存键字符串,该缓存键字符与角色实体。个指定的缓存键字符串,该缓存键字符与角色实体。该类中的属性成员实例设定一些常量值,为获取。个指定实例两者构建了缓存映射关系。个指定实例两者构建了缓存映射关系。设定角色下拉框控件的默认角色实例。个指定的角色实例提供相应的支撑。编辑视图页面中所需的扩展属性。设定一个缓存键实例,用于拼接。设定一个缓存键实例,用于拼接。

2023-06-04 19:54:23 916

原创 第22章 用户密码哈希加密操服务的定义实现

继承于该接口的具体实现类中的方法成员实现了哈希加密操作方式,为用户输入的密码进行加密提供相应的方法支撑。该类中的方法成员实现了哈希加密操作方式,为用户输入的密码进行加密提供相应的方法支撑。通对哈希加密算法方式对指定的密码字符进行加密操作,最后返回一个加密后的密码字符串。通对哈希加密算法方式对指定的密码字符进行加密操作,最后返回一个加密后的密码字符串。当使用哈希方式对用户的密进行加密操作进行加密操作时,设定密钥字符串的长度值为。把存储字节数组实例中的密钥,转换为字符串形式的密钥。

2023-06-02 20:48:09 561

原创 第21章 JQuery DataTables对角色的渲染显示

逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免用户角色映射实体的列表渲染显示出现的异常。逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免用户实体的列表渲染显示出现的异常。逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免角色实体的列表渲染显示出现的异常。个指定的缓存键字符串,该缓存键字符与角色实体所有实例两者构建了缓存映射关系。则缓存键字符所对应缓存项中存储着处于激活状态的角色实体的所有实例。

2023-06-02 18:22:44 821

原创 第20章 自动生成数据库的同时把必要数据持久化到指定表中

1 Core.Configuration.CommonConfignamespace Core.Configuration{ /// <summary> /// 【常规配置--类】 /// <remarks> /// 摘要: /// 通过该类中的属性成员实例对“appsettings.json”文件中的常规配置相关等数据进行设定性读写操作。 /// 说明: /// 属性成员的名称必须与JS

2023-06-01 23:56:53 376

原创 第19章 查询表单与JQuery DataTables级联渲染显示

查询表单必须使用该事件来执行筛选操作,否则查询表单中的输入控件将被清空。实例化该纪录时,为列表接口类型的属性成员实例分配内存空间。设置把班级实体的所有下拉列表实例,存储到列表接口实例中。个字母必是小写,否则实体实例的值将不会被浏览器渲染出来。相应行数的数据,并把这些数据存储到列表实例中。插件当前页渲染显示提供基本且必须的数据支撑。插件当前页渲染显示提供基本且必须的数据支撑。:用于控制对弹出框的关闭和角色列表的刷新渲染。个指定头像图片网络格式的绝对路径。个指定头像图片网络格式的绝对路径。

2023-06-01 11:31:56 680

原创 第18章 JQuery DataTables初始化渲染显示与排序

逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免用户实体的列表渲染显示出现的异常。一个具有返回值的异步委托方法实例,方法实例用于从数据源中通过。个字母必是小写,否则实体实例的值将不会被浏览器渲染出来。根据前端分页组件传递的参数实例,获取符合条件的用户表。该方法没有定义缓存操作,更没有定义缓存的移除操作。操作筛选出所有符合条件的实例,并把这些实例存储到。相应行数的数据,并把这些数据存储到列表实例中。等操作方法的异步实现,并通过自定义的异步。

2023-05-28 10:59:15 1528

原创 第17章 分页与JQuery DataTables渲染显示

框架默定义了一些常用的内置管道中间件,并默认规定了这些内置管道中间件实例在内置管道实例中被调用的顺序,加密方式密码的长度是固定的,且只取决于所使用的算法,当明码的长度大于算法中所规则的长度时,哈希。该纪录是抽象纪录,所以该纪录只能被其它纪录所继承,并由继承纪录所实例化。该纪录是抽象纪录,所以该纪录只能被其它纪录所继承,并由继承纪录所实例化。类的实例中,从而以最少的数据量,提升页面的刷新渲染速度。类的实例中,从而以最少的数据量,提升页面的刷新渲染速度。

2023-05-25 21:09:08 1088

原创 第16章 逻辑分页实现

通过继承该接口的具体实现类中的属性成员实例,只逻辑的从数据源中加载指定。的实例中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。的实例中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。的实例中,从而尽量少的从指定表加载数据,从而尽量降低内存的消耗。,该方法使用的是非操作,即数据源中否包含有实例,如果无实例,则。,该方法使用的是非操作,即数据源中否包含有实例,如果无实例,则。,该方法使用的是非操作,即数据源中否包含有实例,如果无实例,则。设置总页数,即数据源实例项,可以分为页数的总计值。

2023-05-25 11:17:10 810

原创 第15章 通过AutoMapper实现自动赋值映射操作

设置两个不同类型实例赋值操作之间的映射规则实例,该实例为映射器接口的实例化提供映射规则实例支持。继承于当前接口的所有的具体实现类,被实例化时顺序;、两个不同类型实例赋值操作之间的映射规则实例,该实例为映射器接口的实例化提供映射规则实例支持。、两个不同类型实例赋值操作之间的映射规则实例,该实例为映射器接口的实例化提供映射规则实例支持。、两个不同类型实例赋值操作之间的映射规则实例,该实例为映射器接口的实例化提供映射规则实例支持。、实例化置映射器接口实例,通过该实例的成员方法实现两个指定实例之间赋值操作。

2023-05-24 22:00:17 1152

原创 第14章后端验证中间件使用场景与选择

单击提交按钮后,跳转到指定的控制器行为方法中,并在该方法中进行验证,如果未通过验证,那么在前端。可以通过泛型方式方法和具体为特定的模型类的验证实现进行定义,有利于验证的统一定义和管理。其是内置中间件,如果前端是Razor页面,那么就是它了。通过相应的参数实例,远程验证表单中所输入的用户名是否已经被注册。验证的定义实现与模型类和控制器类的定义实现紧密耦合。依赖注入容器通过拷贝构造方法,实例化该类中的变量成员。个列表实例,该实例存储着角色实体的所有实例。解耦了验证实现与控制器类的定义。

2023-05-21 16:23:43 593

原创 第13章 CacheService角色实体的CURD操作示例

个指定实例批量持久化插入到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。个指定实例持久化更新到角色表中后,并从缓存数据库中移除与角色实体相关的所有缓存项。个指定实例批量持久化更新到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。个指定实例批量持久化插入到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。个指定实例持久化更新到角色表中后,并从缓存数据库中移除与角色实体相关的所有缓存项。个指定实例批量持久化更新到角色表中后,并从缓存数据库中移除与角色相关的所有缓存项。

2023-05-12 19:31:19 600

原创 第12章 抽离特定功能(继承于“IStartup”类)实例

框架默定义了一些常用的内置管道中间件,并默认规定了这些内置管道中间件实例在内置管道实例中被调用的顺序,框架默定义了一些常用的内置管道中间件,并默认规定了这些内置管道中间件实例在内置管道实例中被调用的顺序,框架默定义了一些常用的内置管道中间件,并默认规定了这些内置管道中间件实例在内置管道实例中被调用的顺序,框架默定义了一些常用的内置管道中间件,并默认规定了这些内置管道中间件实例在内置管道实例中被调用的顺序,把承于该接口的具体实现类,把具有某项特定功能的依赖注入中间件实例和管道中间件实例,集成到。

2023-05-12 14:46:56 554

原创 第11章 数据库初始化安装页面管道中间件InstallUrlMiddleware

框架内置管道中间件集成当前管道中间件,如果与当前程序连接的指定数据库不存在,则直接通过当前管道中间件把默认启动页面,自动重定向到数据库初始化安装页面。框架内置管道中间件集成当前管道中间件,如果与当前程序连接的指定数据库不存在,则直接通过当前管道中间件把默认启动页面,自动重定向到数据库初始化安装页面。如果与当前程序连接的指定数据库不存在,则直接通过当前管道中间件把默认启动页面,自动重定向到数据库初始化安装页面。中间件实例是否能够打开指定数据库软件指定数据库,用于验证与当前程序连接的指定数据库是否已经存在。

2023-05-12 09:50:56 428

原创 第10 CURD操作与RedisCache缓存的强制清理的实现

分布式缓存数据库软件的连接器实例,该实例实际上是:显式销毁释放内存中的。根据列表实例从缓存数据库中移除与其相关的所有缓存项后,清理该列表实例。显式销毁释放内存中的连接器实例,该实例实际上是:显式销毁释放内存中的。显式销毁释放内存中的连接器实例,该实例实际上是:显式销毁释放内存中的。分布式缓存数据库软件中所有可用的终结点,即所有的分布式缓存数据库。分布式缓存数据库软件中所有可用的终结点,即所有的分布式缓存数据库。分布式缓存数据库软件中所有可用的终结点,即所有的分布式缓存数据库。

2023-05-10 20:48:40 768

原创 第9章 CURD操作与MemoryCache缓存的强制清理的实现

在插入操作执行后,从分布式缓存数据为中强制移除指定体相关的所有缓存项,从而缓存数据库重新缓存加载指定实体的所有实例,最终避免该实体的列表出现渲染显示异常。个指定实例持久化更新到指定表中后,并从缓存数据库中移除与该实体相关的所有缓存项。个指定实例持久化更新到指定表中后,并从缓存数据库中移除与该实体相关的所有缓存项。个指定实例从指定表中物理删除后,并从缓存数据库中移除与该实体相关的所有缓存项。个指定实例从指定表中物理删除后,并从缓存数据库中移除与该实体相关的所有缓存项。但是,关键不在这些属性和方法上,而是。

2023-05-10 17:10:27 1126 1

原创 第8章 未执行缓存的强制清理操作导致显示异常解决方案

using Core.Domain.Customers;using Services.Caching;namespace Services.Customers.Caching{ /// /// 摘要: /// 通过该类中的方法成员,在角色实体的1个实例执行插入、更新或持久化/逻辑删除操作后,为该实体所有相关实例的分布式缓存的强制移除操作提供数据支撑,同时避免角色实体的列表渲染显示出现的异常。 /// publi

2023-05-09 20:45:57 1160

原创 第7章 新建连接字符串实例化EntityFrameworkCore中间件异常解决

//动态实例化EntityFrameworkCore中间件,而非通过当前类的拷贝构造方法实例化EntityFrameworkCore中间件,从而解决在生成数据库如果数据库连接字符串的同时, //重启当前程序后才能执行创建数据库操作,否则会产生异常。 //1、因为当前类的拷贝构造方法实例化EntityFrameworkCore中间件是在程序启动前就被实例化的,如果无数据库如果数据库连接字符串, //那么就会因EntityFram

2023-05-09 20:40:26 2391

原创 第6章 未触发指定实例所有相关缓存的强制清理操作导致显示异常

6 未触发缓存的强制清理操作所导致的列表渲染显示异常: 示例: //IList _roleList = await _repositoryRole.GetAllAsync(query => { return query; }, null); //如果cache => default不为:null,那么在添加实例时必须触发指定实例所有相关缓存的清理操作,列表实例会由继续调用中以前所缓存的数据(不包含新添加的实例),从而导致新添加的实例不能在列表视图

2023-05-09 20:37:02 1097

原创 第5章 分布式缓存中间件的配置及其调用定义

1 分布式缓存中间件的配置定义1.1 Core.Configuration.CacheConfignamespace Core.Configuration{ /// <summary> /// 【缓存配置--类】 /// <remarks> /// 摘要: /// 通过该类中的属性成员实例对“appsettings.json”文件中的1个指定缓存项(键/值对)在内存或指定分布式软件中保存的缓存时间等数据进行设定性读

2023-05-09 20:34:52 1156

原创 第4章 数据库连接配置文件的自动新建及其覆盖性写入

public IActionResult DatabaseCreate() { //使用“Microsoft.EntityFrameworkCore”中间件,以Code-First方式删除和创建数据库。 //注意:使用“Microsoft.EntityFrameworkCore”中间件,生成数据库如果数据库连接字符串是当前生成的,必须重启当前程序后才能执行创建数据库操作,否则会产生异常。 //_context.Data

2023-05-09 20:30:50 691

原创 第3章 程序集反射方式实例化支撑之ITypeFinder

1 Core.NopExceptionusing System.Runtime.Serialization;namespace Core{ /// <summary> /// 【自定义异常--类】 /// <remarks> /// 摘要: /// 通过参数实例该类的构造方法调用其基类(“System.Exception”)构造方法,从而实现当前类的自定义异常功能。 /// 通过对“System.

2023-05-09 20:25:26 580

原创 第2章 Razor通过OpenWindow打开局部弹出页面

1 Area From表单提交[HttpPost]方法不执行异常:在Area中通过From表单执行提交时相应的[HttpPost]方法并不执行。说明: 在Area中使用Razor的From表单提交[HttpPost]方法,必须依赖于引用:“@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers”,而该引用定义在_ViewImports.cshtml文件中所以必须先复制_ViewImports.cshtml文件

2023-05-05 14:40:18 770

原创 第1章 .Net7 Areas实现

/*注意: 在.net7最好不要直接使用app.UseEndpoints或app.UseMvc来集成路由匹配模式,否则会出现:“ASP0014”警告信息,为了避免该警告信息直接使用最小API:app.MapControllerRoute来集成路由匹配模式。*/app.MapControllerRoute( name: "areaRoute", pattern: $"{{area:exists}}/{{controller=Home}}/{{acti

2023-05-05 14:36:55 605

原创 第64章 树型结构数据的前端渲染渲染显示示例

2023-04-27 17:12:26 1080

230222-011shopvue(API统一集中管理)

1 关于统一集中管理API的一些思考 1、统一集中管理是保证工程性项目得保质、保量、成功实施,并对后期维护提供数据支撑的最有效,最节省资源和时间的技能和做法,软件做为一种特殊的工程性项目,也符合上述特性。 2、由于在前台实现中一个URL可能需要多次被调用,如果把一个URL封装到一个实例的指定方法中,同一个项目以大量减少重复性的代码。 3、统一集中管理API的另外一个好处是,如果后台的API方法发生变更,需要把该AIP所对应的封装方法中的URL修改即可以,不再需要对大量的同一个URL进行修改操作。 4、有些开发者习惯于把统一集中管理API与Axios拦截守同时定义在同一个JS文件中,但这种实践方案在本人看来是不好的,最好的实事是把统一集中管理API与Axios拦截守分开定义在两个不同的JS文件中,API JS文件引用Axios JS文件中的拦截守实例,从而实现对一个URL封装,这也是本人会先在前面章节中会先讲述Axios拦截守的原理和抽离的实现。

2023-02-22

230221-010shopvue(抽离Axios拦截守及其全局变量定义)

import axios from 'axios'; import router from '../router/index' //实例化拦截守卫实例。 const axiosInterceptor = axios.create({ baseURL: 'https://localhost:7239/', // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL timeout: 60000, // 请求超时时间毫秒 //withCredentials:必须设定为false,或不对“withCredentials”进行设定,则否会出现异常: //Access to XMLHttpRequest at 'https://localhost:7239/Role/Index' from origin 'http://localhost:8080' //has been blocked by CORS policy: Respon

2023-02-21

230220-009shopvue(后端管理首页与Axios拦截守卫原理)

if (error.response?.status === 400) { statusErrorInfo.message = `${error.response?.status}:由于前端所发送的请求中有语法错误,服务器(后)端不能解析该请求或解析请求时产生错误,从而导致服务器(后)端已处理前端所发送的请求失败。`; console.log(statusErrorInfo.message); return await this.$router.replace(this.$route.query.redirect ? this.$route.query .redirect : "/Login"); } else if (error.response

2023-02-20

230218-040shopDemo(自定义静态与数据库动态授权依赖注入的定义实现)

授权的调用方式有两种:     第一种就是上述例子中通过横切特性来实现对控制器行为方法的权限过滤。     第二种是定义一个布尔型的授权方法,而控制器行为方法通过内置调用该布尔型的授权方法实现权限过滤。     不管是第一种权限过滤方案,还第二种权限过滤方案,其实质都是对控制器行为方法进行权限限定,其区别是: 控制器行为方法可以对权限限定进行集中管理(细粒度更大),即把横切特性标记到控件器上,这种方式更加简便,以最少修改代码的方式实现权限限定;但是第二种方案就做不到。但第二种方案也有自己的优势,即控制器行为方法可以直接返回确且的权限限定操作信息,这是是第一种方案就做不到的。 对以上功能更为具体实现和注释见:230218_040shopDemo(自定义静态与数据库动态授权依赖注入的定义实现)。

2023-02-18

230214-039shopDemo(用户、权限服务和持久化默认数据到数据库)

IDataProvider dataProvider = DataProviderManager.GetDataProvider(DataProviderType.SqlServer); bool _isCreatedDatabase = dataProvider.ConnectionStringExistsByEFCore(); if (!_isCreatedDatabase) return MessageModel<bool>.Fail("当前程序中不存在数据库连接字符串!", 500); _isCreatedDatabase = await dataProvider.DatabaseExistsByEFCoreAsync(); if (!_isCreatedDatabase) { _isCreatedDatabase = await dataProvider.InitializeDatabas

2023-02-14

230211-038shopDemo(用户密码实体及其约束规则的定义实现)

1 说明: 由当前程序需要兼容实现多种用户密码的加密操作,所以必须把“CustomerPassword”定义为实体类,该类用于用于把加密方式、密钥及其加密后的密码持久化到“CustomerPassword”表中,以便用为用户登录操作提供验证支撑。 如果是程序中使用哈西加密方式,且密钥由用户注册或密码修改时随机生成的以增加用户密码的安全性。由于1个指定用户的密钥是随机生成的,且会通过该随机生成的密钥来生成相应的密码,这样做会增加用户密码的安全性,但是在用户用户登录时依然需要该密钥与生成的密码与持久化密码进行匹配,从而实现用户的登录操作,这也是需要把“CustomerPassword”定义为实体类的主要原因。 如果程序中不定义“CustomerPassword” 实体类,且只使用哈西加密方式,那么就需要把属性成员: public string Password { get; set; } public string PasswordSalt { get; set; } public static int PasswordSaltKeySize => 5; public stati

2023-02-11

230211-037shopDemo(菜单实体及其约束规则的定义实现)

public class Menu : BaseEntity { #region 属性 /// <summary> /// 【权限编号】 /// <remarks> /// 摘要: /// 获取/设置权限实体1个指定实例的长整型编号值。 /// </remarks> /// </summary> public long? PermissionId { get; set; } /// <summary> /// 【上级菜单编号】 /// <remarks> /// 摘要: /// 获取/设置上级菜单实体1个指定实例上级菜单的长整型编号值(根级的父编号值为:0)。 /// </remarks> /// </summary> public long ParentId { get; set; }

2023-02-11

230211-036shopDemo(Code-First自增型编号插入异常解决方案)

 builder.HasKey(address => address.Id);             //在Code-First模式下自增型编号字段,在默认况下通过SQL命令插入数据是不能包含编号值的,如果想要包含编号值:             //  EFCore必须使用“builder.Property(address => address.Id).ValueGeneratedNever()”;             //  EF必须使用“builder.Property(address => address.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)”             //如果不包含上述定义,在通过SQL命令插入包含编号值的数据时会出现“当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'Address' 中的标识列插入显式值。”异常。             //注意:             //  如果在Code-First模式下的编号字段被定义上述约束规

2023-02-11

230210-035shopDemo(地址、用户地址实体及其约束规则的定义实现)

public class Address : BaseEntity { #region 属性 /// <summary> /// 【上级区划编号】 /// <remarks> /// 摘要: /// 获取/设置上级区划实体1个指定实例上级区划的长整型编号值(根区划的编号值为:0)。 /// </remarks> /// </summary> public long ParentId { get; set; } /// <summary> /// 【名称】 /// <remarks> /// 摘要: /// 获取/设置1个指定行政区划的名称。 /// </remarks> /// </summary> public string Name { get; set; } ///

2023-02-10

230209-034shopDemo(加、解密功能需求支撑)

第40章 加、解密功能需求支撑 1 可逆加密(Encryption)方式和哈希(Hash)加密方式的区别: 1、可逆加密(Encryption)是可逆的,即明码和加密码之间通过操作是可以相互转换;哈希(Hash)加密方式是不可逆的,哈希(Hash)加密方式一般会导致信息熵减小,即使用哈希(Hash)加密方式转换后可能导致,转换明码是原明码中的一段。 2、可逆加密(Encryption)的密码会随着明码的长度进行改变;而哈希(Hash)加密方式密码的长度是固定的,且只取决于所使用的算法,当明码的长度大于算法中所规则的长度时,哈希(Hash)加密方式会把明码截断后进行加密操作,这也是导致哈希(Hash)加密方式不可逆的与信息熵减小的根本原因。 3、应用场景:一般情况下用户密码加密操作使用可逆加密(Encryption)方式;哈希(Hash)加密方式(一般用于数字签名、数据校验(CRC、SHA、MD5),据说HTTPS协议运行所需要的CA证书就是使用哈希(Hash)算法生成的。 4、哈希(Hash)加密方式无解密操作,即哈希(Hash)加密方式是不能被解

2023-02-09

230208-033shopDemo(抽离跨域(Cors)限制依赖注入和管道中间件之AddCors和UseCors)

1 说明: Cors(跨域)限制中间件可以解决一些Cors(跨域)异常例如:“' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.”。 Cors(跨域)限制中间件更为重要的作用是: 1、 通过IP域名端口来限制前端项目对后端项目的Cors(跨域)访问。 2、 把物理上分离的前后端项目,在逻辑上统合到同1个域名下(例如:http://localhost:8080), 从而减少异常的产生。 3、 如果前端项目是网站应用程序,且前端项目对后端项目Cors(跨域)访问不进行限制,那么程序中只要定义跨域异常处理管道中间件即可;跨域限制依赖注入和管道中间件之AddCors和UseCors可以不定义在程序中。 4、 如果前端项目是App应用程序,则必须在后端项目中定义Cors(跨域)限制中间件,且IP域名端口必须是:http://127.0.0.1:8080,而不能是:http://loc

2023-02-08

230208-032shopDemo(跨域(Cors)限制配置的定义实现)

public class CorsLimitConfig : IConfig { /// <summary> /// 【策略名】 /// <remarks> /// 摘要: /// 获取/设置跨域限制的策略名(通过前端项目的IP域名中的端口进行限制)。 /// </remarks> /// </summary> public string PolicyName { get; set; } = "CorsIpAccess"; /// <summary> /// 【开放限制?】 /// <remarks> /// 摘要: /// 获取/设置1个值false(默认值:限制)/true(不限制),该值指示前端项目对后端项目Cors(跨域)访问是否进行限制。 /// </remarks> /// </summary>

2023-02-08

230207-031shopDemo(抽离跨域异常处理管道中间件之CorsExceptionHandlerMiddleware)

    /// 摘要:     ///     该管道中间件类主要为了集中解决在由vue/uni-app前端项目跨域(Cors)访问当前后端项目时,浏览器或App中出现的异常:     ///    1、“has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.”。     ///    2、“has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”。     ///    3、“has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not hav

2023-02-07

230207-030shopDemo(抽离JwtBearer身份认证依赖注入和授权管道中间件)

public static string IssuerToken(JwtBearerModel tokenModel) { //从单例实例的字典成员实例中获取当前程序所有配置相关数据。 AppSettings _appSettings = Singleton<AppSettings>.Instance; //从应用配置类实例中获取JwtBearer身份认证相关数据。 JwtBearerConfig _jwtBearerConfig = _appSettings.Get<JwtBearerConfig>(); var claims = new List<Claim> { /* * 特别重要: 1、这里将用户的部分信息,比如 uid 存到了Claim 中,如果你想知道如何在其他地方将这个 uid从 Token 中取出

2023-02-07

230206-029shopDemo(JwtBearer身份认证配置的定义实现)

public class JwtBearerConfig : IConfig { /// <summary> /// 【签发机关】 /// <remarks> /// 摘要: /// 获取/设置用于生成所有令牌(Token)字符串实例,提供数据支撑的“签发机关”。 /// </remarks> /// </summary> public string Issuer { get; set; } = "JwtBearer签发"; /// <summary> /// 【订阅者】 /// <remarks> /// 摘要: /// 获取/设置用于生成所有令牌(Token)字符串实例,提供数据支撑的“订阅者”。 /// </remarks> /// </summary> public string Audience

2023-02-06

230206-028shopDemo(抽离UseSwagger管道集成中间件)

public void Configure(IApplicationBuilder application) { //注意:在IIS部署时必须把下面两个管道中间件从“if (app.Environment.IsDevelopment())”取出,否则;“http://localhost:8090/Swagger/index.html”页面会出现“404”错误。 application.UseSwagger(); application.UseSwaggerUI(); //该自定义管道中间件设定/Swagger/index.html为默认启动页面。 //注意:在IIS部署时如果不定义该自定义管道中间件“http://localhost:8090”页面会出现“404”错误,但“http://localhost:8090/Swagger/index.html”页面可用; //如果定义该自定义管道中间件IIS部署后的“http://

2023-02-06

230206-027shopDemo(抽离AddSwaggerGen依赖注入中间件)

  public void ConfigureServices(IServiceCollection services, IConfiguration configuration)         {             services.AddControllers();             // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle             services.AddEndpointsApiExplorer();             //通过AddSwaggerGen依赖注入中间,获取Api控制器方法的版本控制信息和注释等数据信息,依赖注入.Net框架的内置容器中,为在“index.html”页面上渲染显示这些信息,作好预处理操作。             services.AddSwaggerGen(options => {                 options.SwaggerDoc("v1"

2023-02-06

230206-026shopDemo(自动赋值映射操作中间件AutoMapper)

namespace WebApi.Infrastructure.AutoMapper {     /// <summary>     /// 【自动映射配置--类】     /// <remarks>     /// 摘要:     ///    通过该类中拷贝构造方法,对当前程序中的两个指定实例之间赋值操作映射规则,及其赋值操作进行实例化,并对它们进行集中管理。     /// </remarks>     /// </summary>     public class MapperConfiguration : Profile, IOrderedMapperProfile     {         #region 拷贝构造方法         /// <summary>         /// 【拷贝构造方法】         /// <remarks>         /// 摘要:         ///     通过该拷贝构造方法,对当前程序中的两个指定实例之间赋值操作映射规则,及其赋值操作进行实例化,并对它们进行集中管理。

2023-02-06

230204-025shopDemo(CURD操作的泛型定义实现之IRepository)

public IQueryable<TEntity> Table => _context.GetDbSet<TEntity>().AsQueryable(); #endregion #region 方法--接口实现 /// <param name="getAllAsync">1个具有返回值的泛型异步委托方法实例,该泛型异步委托方法实例用于获取1个指定实体的所有实例。</param> /// <param name="getCacheKey">1个具有返回值的委托方法实例,委托方法实例用于获取缓存键类的1个指定实例。</param> /// <summary> /// 【异步获取实体】 /// <remarks> /// 摘要: /// 直接从指定表中1个指定实体的所有实例;或从分布式缓存数据库获取1个指定实体的所有实例。 /// </remarks> /// </summary>

2023-02-04

230203-024shopDemo(分布式缓存强制删除触发器的触发调试)

4 对于分布式缓存强制移除泛型注销器定义的一些思考 1、到目前为止.Net(Core)7的内置依赖注入容器依然不能自动的把多泛型继承类进行实例化,这是“CacheEventConsumer<TEntity>”类被定义为抽象类的原因,也是继承于“IConsumer<>”接口的所有具体实现类必须通过反射方式进行实例化的原因。 2、本人认为对“CacheEventConsumer<TEntity>”类进行继承,从而实现多泛型继承类的实例化,并不是一种最好的解决方案,例如:“RoleCacheEventConsumer”,这样会增加程序定义实现的复杂性。 3、本人认为更好解决方案之一是: 3.1、直接把“CacheEventConsumer<TEntity>”类被定义为单泛型继承类。 3.2、直接把“CacheEventConsumer<TEntity>”类被定义为具体实现(非抽象)类。 3.3、删除例如:“RoleCacheEventConsumer”这样的继承类。 3.4、直接类“CacheEventConsumer<TEntity>”类,实现分布式缓存强制移除操作,而非“Rol

2023-02-03

230202-023shopDemo(分布式缓存强制删除触发器定义实现之IEventPublisher)

public virtual async Task PublishAsync<TEvent>(TEvent @event)         {             //获取所有继承于“IConsumer”接口具体实现类的实例。             var consumers = EngineContext.Current.ResolveAll<IConsumer<TEvent>>().ToList();             foreach (var consumer in consumers)             {                 try                 {                     //在指定实体的1个实例执行插入、更新或持久化 / 逻辑删除操作后,触发执行缓存项的强制移除句柄,从而为新变更的实例缓存操作,预留出相应的内存空间。                     await consumer.HandleEventAsync(@event);                 }    

2023-02-02

230202-022shopDemo(分布式缓存强制移除泛型注销器定义实现之IConsumer)

/// <param name="eventMessage">实体插入事件类的1个指定实例。</param> /// <summary> /// 【异步句柄事件】 /// <remarks> /// 摘要: /// 在指定实体的1个实例执行持久化插入新操作后,为该实体实例的分布式缓存的强制移除操作提供数据支撑,从而为新变更的实例缓存操作,预留出相应的内存空间。 /// </remarks> /// </summary> public virtual async Task HandleEventAsync(EntityInsertedEvent<TEntity> eventMessage) { await ClearCacheAsync(eventMessage.Entity, EntityEventType.Insert); } /// <param name="even

2023-02-02

230131-021shopDemo(分布式缓存数据库的定义实现)

1、当前程序中的所有复用代码来源于“nopCommerce_4.60.1”。 2、在“nopCommerce_4.40.4-- 第14章 HttpContext?.Items数据读写_zhoujian_911的博客-CSDN博客”中本人有一个猜测:PerRequestCache套嵌类通过通过HttpContext?.Items为取代:WebApi+Swagger +Json +跨域(Cors),向nopCommerce程序的App前端提供数据,但随着前后端分离开发技术的发展已经不用这样复杂且精巧的实现了来向App前端提供数据了,所在“nopCommerce_4.60.1”中删除了与:PerRequestCache套嵌类相关的定义,这不但是一种好的重构,同时也简化了程序的定义实现,也证明了本人猜测的正确性。 3、在“nopCommerce_4.60.1”中为了实现当前程序对Redis分布式数据库更加底层操作,把DistributedCacheManager类定义为抽象类,同时为了能够实例化和对Redis分布式数据库更加底层操作以增加定义了RedisCacheManager。实际上“n

2023-01-31

230127-020shopDemo(分布式缓存数据库配置的定义实现)

4 分页式缓存运行原理     由于在开始的程序开发中由于内存资源的昂贵和稀缺,程序中的所有实例都是有生命周期的,在1个指定功能执行完成后,系统会自动销毁这些实例所占据的内存资源,从而为新的实例的产生预先腾出的所需要的内存空间。当前虽然内存资源的昂贵和稀缺得以缓解,但程序的这种产生->释放机制却根深蒂固的存在着。     基于网络数据传输的程序,需要减少把持久化数据加载的内存中的频率,从而提供程序的性能最终达到提升用户体验的目标。但这种目标的实现又与程序内存的产生->释放机制相矛盾,所以最终给出的解决方案是:通过“Redis”等特定分页式软件开辟内存空间,并以键/值对程序中所产生的实例进行集中(读/写/销毁)管理。 4.1“Microsoft.Extensions.Caching.Memory”程序集     “Microsoft.Extensions.Caching.Memory”程序集,是微软最早所提供对述问题的解决方案,但是由于功能态过于单薄,当前在程序开发中已经不太多被使用。     当程序中集成了通过“Microsoft.Extensions.Caching.Mem

2023-01-27

230127-019shopDemo(通过EntityFrameworkCore中间件验证数据库存在)

  通上述定义可以直接看出EntityFrameworkCore中间件是对Microsoft.Data.SqlClient中间件的进一步的定义和封装,实际上SqlSugar/FluentMigrator中间件也是对Microsoft.Data.SqlClient中间件的进一步的定义和封装,所以Microsoft.Data.SqlClient中间件是所有基于.Net框架CURD中间件的底层实现,即如果这些CURD中间件如果有些功能不能实现(包含多数据库软件支持),开发者都可以通过Microsoft.Data.SqlClient中间件自定义扩展以实现CURD中间件不能实现的功能。

2023-01-27

230427-018shopvue(树型结构数据的前端渲染渲染显示示例)

<el-table :data="currentPageList" style="width: 100%" row-key="id" default-expand-all :tree-props="{children: 'childrenCollection', hasChildren: 'hasChildren'}"> <el-table-column label="编号" property="id" width="100px" /> <el-table-column label="名称" property="name" /> <el-table-column prop="createdDateTime" label="创建时间" :formatter="dateTimeformat" width="155" /> <el-table-column prop="updatedDateTime" label="最后更新时间" :formatter="dateTime

2023-04-27

230426-048shopDemo(以泛型方式定义的递归方法构建树型结构数据的2种实现方法)

public static void TreeBuilder<T>(List<T> all, T currentParentItem, long? parentId = null, string idProperty = "Id", string parentIdProperty = "ParentId", string childrenProperty = "ChildrenCollection") { List<T> _childrenList = new List<T>(); if (parentId == null || parentId == 0) { _childrenList = all.Where(a => a.GetType().GetProperty(parentIdProperty)?.GetValue(a) == (object)parentId).ToList(); }

2023-04-26

230418-017shopvue(在线用户统计的前端实现)

//初始化当前页的渲染数据集列表实例。 const currentPageList = ref([]); //获取当前页面渲染显示所需的数据源。 const currentPageInit = async () => { const res = await onlineCustomerIndex(pagination.value); currentPageList.value = res.data.response.data; pagination.value.totalCount = res.data.response.totalCount; //console.log(currentPageList.value); //console.log(pagination.value.totalCount); //console.log(currentPageList.value[0].lastActivityDateTime); //console.lo

2023-04-18

230418-047shopDemo(在线用户统计的后端实现)

  private async Task SaveLastActivityAsync(ActionExecutingContext context)             {                               if (context == null)                     throw new ArgumentNullException(nameof(context));                 if (context.HttpContext.Request == null)                     return;                string _email = context.HttpContext.User.Claims?.SingleOrDefault(s => s.Type == ClaimTypes.Email)?.Value;                if(!string.IsNullOrEmpty(_email))                {     

2023-04-18

230412-016shopvue(用户增、修、删的前端实现)

<!-- elmentUI 子页面的渲染显示注意事项说明: 子页面的渲染显示必须的使用“<el-dialog></el-dialog>标签及其所包含的子标签,否则子页面将不会被渲染显示出来。” --> <el-dialog width="30%"> <template #header> <div class="my-header"> <h1 style="margin: 0px; padding: 0px; "> <el-icon style="margin-right:5px; font-size: 25px; color:#337ecc; vertical-align: middle"> <CirclePlusFilled /> </el-icon> 添加用户 </h1>

2023-04-12

230412-046shopDemo(用户增、修、删的后端实现)

/* 注意: “AutoMapperConfiguration.Mapper.Map(customerModel, _customer)”方法中必须包含“_customer”参数实例,否则在赋值映射时会导致 _customer.CreatedDateTime属性实例为:0001-01-01 00:00:00.0000000 _customer.Avatar属性实例为:空字符串。 1、如果不包含“_customer”参数实例其赋值映射过程的实质为:new Customer()=customerModel; _customer=new Customer();所以才会导致上述状况的产生。 2、如果包含“_customer”参数实例其赋值映射过程的实质为: _customer=customerModel;从而避免了上述状况的产生。 */

2023-04-12

230406-015shopvue(elmentUI Upload组件通过IFormFile参数上传注意事项)

<!-- elmentUI Upload组件注意事项说明: v-model:file-list:文件上传--需要或已经被上传的文件。 :action:必须被实例化的属性,文件上传--上传文件所需要调用的指定的后端控制器行为方法。 name:如果指定的后端控制器行为方法中使用IFormFile参数实例,则该属性是必须被实例化的属性,且属性实例化值与IFormFile参数名必须相同。 :limit="1"://同1次上传操作中,最大能够上传多文件的个数值。 :headers(注意):很多网上的示例把headers属性实例化为“mutipart/form-data,在此我重申一下,没有必要。elementUI已经封装加工过了, 同时如果设定headers属性实例,还会造成异常:"Failed to read the request form. Missing content-type boundary"

2023-04-06

230315-014shopvue(用户页面分页的渲染显示)

async handleTableSort({ column }) { //防止排序方式的值为:null。 if (column.property == null && column.order == null) { column.property = 'createdDateTime', column.order = "descending"; } else if (column.property != null && column.order == null) { column.order = "ascending"; } this.pagination.OrderByModel = JSON.stringify({

2023-03-15

230322-045shopDemo(Swagger通过IFormFile或IFormCollection参数实例实现文件上传)

[HttpPost] public async Task<IActionResult> PostAvatarStream(long customerId, /*IFormCollection collection [FromForm]*/ IFormFile formFile) { Customer _customer = await _customerService.GetCustomerByIdAsync(customerId); //string _avatarPath = string.Empty; if (_customer != null && formFile != null) { if(!string.IsNullOrEmpty(_customer.Avatar)&&!_nopFileProvider.GetFileName(_customer.Avatar).Equals("Default.jpg"))

2023-03-28

230309-013shopvue( 头像图片的前端渲染显示)

<el-col :span="4" class="userinfo"> <el-dropdown trigger="hover" style="hight: 40px; line-height: 40px;" placement="bottom-end"> <span class="el-dropdown-link userinfo-inner"> {{name}} <el-avatar :size="40" style="vertical-align: middle"> <!-- <img src="../assets/AvatarDemo.png" /> --> <!-- <img :src="assetsAvatarDemo" /> --> <img :src="avatarUrl" />

2023-03-09

230304-012shopvue(短信验证服务和登录的前端定义实现)

async postSmsValidate() { if (this.loginSmsForm.phone == '') { this.$refs.refPhoneRequired.focus(); this.$message.error('必须先输入手机号!'); } else { let phone = this.loginSmsForm.phone; let res = await postSmsValidateCreate(JSON.stringify(phone)); if (res.status == 200) { this.sendCode = false; //设置秒倒计时器。

2023-03-09

230304-043shopDemo(短信验证服务和登录的后端定义实现)

private async Task<int> SmsValidateSendAsync(string phone) { //从单例实例的字典成员实例中获取当前程序所有配置相关数据。 var appSettings = Singleton<AppSettings>.Instance; //从应用配置类实例中获取分布式缓存连接相关数据。 SmsConfig _smsConfig = appSettings.Get<SmsConfig>(); using var random = new SecureRandomNumberGenerator(); int _code = random.Next(100000, 999999); Config config = new Config { AccessKeyId = _smsConfig.Acces

2023-03-09

230309-044shopDemo(图片URL的后端获取)

1 注意: 在.NetCore WebApi框架中,在默认情况下由于没有集成“UseStaticFiles”内置管道中间件方法,如果想要通过图片URL显示图片,由会显示“404”错误,必须先把“UseStaticFiles”内置管道中间件方法集成到.NetCore WebApi框架中,这样就会解决该错误。

2023-03-09

230301-042shopDemo(初识第3方阿里云短信验证发送服务)

​​namespace Core.Configuration { /// <summary> /// 【(阿里)短信配置--类】 /// <remarks> /// 摘要: /// 通过该类中的属性成员实例对“appsettings.json”文件中的第3方阿里短信服务相关数据等数据进行设定性读写操作,为当程序实现短信服务功能提供数据支撑。 /// 说明: /// 属性成员的名称必须与JSON键/值对中的键相同,且属性成员的个数与键的个数也必须相等, /// 否则ConfigurationBinder.Bind方法将不支持通过“appsettings.json”文件中数据库连接相关数据与当前类中的属性成员实例的设定性读写操作。 /// </remarks> /// </summary> public class SmsConfig : IConfig { /// <summary> /// 【访问键编号】 /// <remar

2023-03-01

230223-041shopDemo(所有用户实例的分页实现)

1 为什么逻辑分页不使用分布式缓存进行存储?     1、首先必须明白逻辑分页不使用分布式缓存进行存储不是技术层面的因素,在技术层面完全可以把逻辑分页数据通过分布式缓存数据库进行存储和管理。     2、由于逻辑分页操作需要频繁的把数据库指定表中的持久化数据加载到内存中,以便程序使用,如果再把这些数据通过分布式缓存数据库进行存储和管理,不但不能达能增加程序响应速度的目的,反而有极大概率上会增加内存消耗拖慢程序的响应速度的反效果。     3、如果把逻辑分页操作所产生的数据通过分布式缓存数据库进行存储和管理,由于短时间内不会对内存中的数据进行销毁,导致持续不断的增加内存资源的消耗,会由于内存资源的耗尽,从而会造成内存的溢出,最终操作系统的崩溃,这种现象在基于网络实现的程序上会以惊人的速度呈现出来。这是逻辑分页不使用分布式缓存进行存储的物理因素。     4、使用分布式缓存数据库进行存储和管理的持久化数据的基本指导性原则有:在短时间内持久化数据不会发生改变,且不能频繁的加载到内存;例如:登录操作执行后的用户信息数据、角色实体的实例、产品类型实体的实例等;与之相对的则是:用户所有实例

2023-02-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除