隋唐演义

隋唐演义

阿里图标库取消iconfont 阿里iconfont怎么下载字体

双十一 0

手机淘宝搜:天降红包55 5月20日开始,每天领红包。
京示搜:天降红包369,5月28日开始

阿里app图标,阿里巴图标库,如何在以前阿里图标库加图标,阿里 图标

系列文章目录 文章目录系列文章目录前言一、质量名词二、ISO9001 、TS169491.主要区别2.标准化的构成和内容不一样3.工序方式的差别4.TS16949配套手册三、GJB9001C及CMMI1.CMMI总结前言 一、质量名词 1、PPM C 百万分之一 2、Audit扣分 C 年度产品质量管理考核细则 3、质量…...

编程日记 2023/1/27 2:43:14

1. 二叉树遍历 #【【微信】】 <stdbool.h> #【【微信】】 "stdio.h" #【【微信】】 "【【微信】】.h"typedef struct TNode *Position; typedef Position BinTree; // 二叉树类型 typedef char ElementType;// 树结点定义 struct TNode {ElementType Data; // 结点数据Bin…...

编程日记 2023/1/27 2:38:11

文章目录前言🚀🚀🚀一. rpm命令介绍1.1 RPM包介绍1.2 rpm包的优缺点1.3 rpm包获取方式二. 语法格式及常用选项2.1 RPM安装常用参数2.2 rpm格式介绍三. 应用案例3.1 从本地安装软件包3.2 查询lrzsz的包有没有安装3.3 查询命令是哪个包安装的3.…...

编程日记 2023/2/25 13:05:42

FME介绍FME是一套将不同GIS数据模型和要素进行整合处理的强大软件软件,可用于读写存储和转换各种空间数据。FME支持超过300种数据格式的读写,满足日常办公、测绘、地理信息等方面的数据读写、处理需求。FME将各类操作整合成转换器,让用户能够…...

编程日记 2023/3/2 22:44:28

1.堆的由来普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事…...

编程日记 2023/1/27 2:17:48

【【微信】】入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比:2.快速入门2.1.安装【【微信】】2.2.【【微信】】消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.【【微信】】 简单队列模型3…...

编程日记 2023/2/28 18:26:29

上期介绍了Linux的文件权限,这期我们仔细来说说Linux环境下目录权限和默认权限一、目录权限1.1 进入目录所需的权限我们在进入目录时需要什么样的权限呢?是r、w还是x呢?下面我们一起来验证一下:📋如下我门拥有全部目录…...

编程日记 2023/1/27 2:02:30

文章目录1 list介绍2 list的模拟实现2.1 类的定义2.2 默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造2.2.4 赋值重载2.3 迭代器2.3.1 正向迭代器2.3.2 反向迭代器2.4 修改接口2.4.1 任意位置插入2.4.2 任意位置删除2.5 其他接口2.5.1 尾插2.5.2 头插2.5.3 尾删2.5.3 …...

编程日记 2023/1/27 1:57:27

【【微信】】的宏与VBA宏的录制宏的启动运行快捷键运行宏:使用Excel对象运行宏*VBA的数据类型字符串(String)整形(Integer)和长整形(Long)单精度浮点型(Single)和双精度浮点型…...

编程日记 2023/1/27 1:52:24

之前就说过我们的数据结构分为两种,分别是线性结构和非线性结构,我们今天要学的第一种线性结构就是树型结构。 1. 树型结构 树型结构并非我们熟悉的重点,所以在这里只做了解。 概念: 树是一种非线性的数据结构,它是…...

编程日记 2023/2/26 21:52:50

博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 问题:为什么会存在this? 在上一篇【JavaSE】一文看懂构造器/构造方法(Cunstructor)中,我们已…...

编程日记 2023/1/27 1:42:12

k8s dashboard github地址:https://github.com/kubernetes/dashboard注意:dashboard版本要和k8s版本匹配,具体参考release里的Compatibility:https://github.com/kubernetes/dashboard/releases安装命令wget https://raw.githubus…...

编程日记 2023/2/24 17:23:47

靶机地址: https://app.hackthebox.com/machine【【微信】】枚举 使用nmap枚举靶机 nmap -sC -sV 10.10.11.196机子开放了22,80端口,我们本地解析一下这个域名 echo "10.10.11.196 【【微信】】.htb" >> /etc/hosts 去浏览器访问…...

编程日记 2023/2/27 18:52:21

1.首先我们来看这个,给定一个X,能确定一个Y那么就说,X确定Y,或者Y依赖x,那么 比如y=x * x 就是x确定y,或者y依赖于x 2.然后再来看图,那么左边的部分函数依赖,就是,通过A和B能决定C,那么如果A只用给就能决定C,那么就是部分函数依赖. 3.然后再来看,可以看到,A可以决定B,那么…...

编程日记 2023/1/27 1:21:43

目录1.详细报错信息:2.问题原因:3.解决方法:3.1)使用MyBatisPlus自带的分页功能3.2)PageHelper ShardingJDBC53.3)PageHelper ShardingJDBC41.详细报错信息: Caused by: org.apache.ibatis.e…...

编程日记 2023/3/3 13:34:27

在k8s单机环境中,我们经常使用本机路径作为持久化存储。在k8s官方文档中有两种方式使用本机存储,一种是hostPath,另一种是local volume,这两种都不支持动态扩容,并且程序移植改动比较大,而local-path-provi…...

编程日记 2023/1/27 1:11:33

Lab3 部分【【微信】】:Its Always a Good PrimeQ6:Church numeralsQ5:It’【【微信】】lement di【【微信】】, which takes in an integer nand returns an n-di【【微信】】. An n-di【【微信】】 is a funct…...

编程日记 2023/2/18 17:00:55

目录 制作并发布动态库 使用动态库 使用动态库程序运行时的错误 制作并发布动态库 静态库的代码在链接的时候会被拷贝进对应的可执行程序内部,动态库则不需要拷贝。 动态库在形成目标文件时,需要加一个选项 -fPIC:形成一个与位置无关的二…...

编程日记 2023/1/27 1:01:23

各位朋友大家好,刚才播放的片段来自一部电视剧,天下长河,讲的是陈潢靳辅治理黄河的故事。为什么要播放这样的一个片段呢,这个片段跟我的课程一个plc的实现第二部有什么关系呢? 其实关注我的朋友都知道我出过的《一个pl…...

编程日记 2023/1/27 0:56:19

系列文章目录1.初始化测试数据1.初始化表格(user表)2.初始化表格(product表)3.初始化表格(user表数据初始化)4.初始化表格(product表函数)5.初始化表格(product表数据初始…...

编程日记 2023/2/18 16:57:05

1. Linux环境下,输入密码,不回回显(*)。 2.普通用户的密码一定不要和root一样,root一定要安全级别更高。具体的添加账户和修改密码的操作,见蛋哥Linux训练营,第2课,30分钟处。 3.在最高权限(root)&#x…...

编程日记 2023/1/27 0:46:13

一、什么是框架 ● 在文献中看到的framework被翻译为框架 ● java常用的框架: SSM三大框架:SpingSpringM【【微信】】pringCloud● 框架其实就是对通用代码的封装,提前写好了一堆接口和类,我们可以在做项目的时候直接引…...

编程日记 2023/1/27 0:41:09

目录 前言 举例 小练习 储存前三名金银牌数量 二维数组定义 二维数组初始化 敲重点啦 总结 前言 过了几天了,终于有时间更新了,有个通知,以后我不用颜色区分了,不然换了背景看不见,理解一下,蟹蟹~…...

编程日记 2023/1/27 0:26:02

前言 这两天学了学Latex,主要是为了以后写毕业论文做铺垫,而且Latex在数学公式这一方面,要比Word方便许多,于是我就下载了一款国产的公式编辑器――AxMath。永久会员不贵,只要36元,而且软件很好用…...

编程日记 2023/3/3 11:29:49

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux 文章目录一、前言二、冯诺依曼体系结构1、体系简述2、内存的重要性3、硬件方案解释软件行为4、体系结构中的数据流动5、拓展三、操作系统简述…...

编程日记 2023/1/27 0:10:42

线程池的学习基本概念好处应用场景ThreadPoolExecutor实例理解:执行流程自定义线程池4大核心参数测试demo结论:ExecutorService常用方法思考获取ExecutorService代码示例【【微信】】ice常用获取方式如下【【微信】】ice常用方法如下:代…...

编程日记 2023/2/22 10:03:23

3小时精通opencv(五) 利用【【微信】】进行颜色检测 参考视频资源:3h精通Openc【【微信】】 本章内容介绍如何利用【【微信】】调节色域, 手动提取到我们需要的颜色 文章目录3小时精通opencv(五) 利用【【微信】】进行颜色检测创建Trackbar色彩检测创建Trackbar 在opencv中使用【【微信】】函…...

编程日记 2023/1/26 23:55:23

一、需求背景为了更好的支持直播业务,产品设计为直播业务增加弹幕功能,但是最初的弹幕设计使用效果并不理想,经常出现卡顿、弹幕偏少等需要解决的问题。二、问题分析按照背景来分析,系统主要面临以下问题:带宽压力;弱网…...

编程日记 2023/1/26 23:50:21

ArrayList类 目录ArrayList类一、构造方法摘要1.1 ArrayList()1.2 ArrayList(Collection c)1.3 ArrayList(int initialCapacity)二、 ArrayList的扩容机制:2.1 源码如下:2.2. 以上扩容机制的弊端:三、代码案例ArrayList类一、构造方法摘要 1…...

编程日记 2023/1/26 23:45:18

📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴。 🍁 操作系统【带你快速了解】对于电脑来说,如果说…...

编程日记 2023/3/3 2:30:28

Pandas 是数据科学社区中使用最广泛的库之一,它是一个强大的工具,可以进行数据操作、清理和分析。本文将提供最常用的 Pandas 函数以及如何实际使用它们的样例。我们将涵盖从基本数据操作到高级数据分析技术的所有内容,到本文结束时ÿ…...

编程日记 2023/3/4 9:37:21

JMeter测试redis性能前言插件使用说明前言 针对Redis的性能测试需求本身就比较小众,因为Redis的性能指标在官网已经给出了详细的数据。但是有时候我们仍然需要对redis进行性能测试,例如资源配置需求,参数调优对比,程序优化等场景…...

编程日记 2023/1/26 23:30:11

文章目录9、断点调试9.1 为什么需要Debug9.2 Debug的步骤1 添加断点2 启动调试3 单步调试工具介绍9.3 多种Debug情况介绍1 行断点2 方法断点3 字段断点4 条件断点5 异常断点6 线程断点7 强制结束9.4 自定义调试数据视图9.5 常见问题【尚硅谷】idea实战教程-讲师:宋红…...

编程日记 2023/3/3 17:05:39

15.GC :垃圾回收机制 垃圾回收的区域只有在堆里面(方法区在堆里面) 15.1 垃圾回收 GC JVM 在进行垃圾回收(GC)时,并不是堆这三个区域统一回收。大部分时候,回收都是新生代~ 1.新生代 …...

编程日记 2023/1/26 23:20:05

甲骨文云推出了容器实例,这是一项无服务器计算服务,可以即时运行容器,而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 8 Desktop加强版。 加强版里包括,Minio,ssh登录,OCI CLI命令行…...

编程日记 2023/2/28 8:00:32

1.1绘制 matplotlib 图表组成元素的主要函数matplotlib 是如何组织内容的?在一个图形输出窗口中,底层是一个 Figure实例,我们通常称之为画布,包含一些可见和不可见的元素。在画布上,自然是图形,这些图形就是…...

编程日记 2023/1/26 23:09:59

重启 如果由于某种原因,你的实例崩溃了,你可以用下面的命令重新启动它: wget -【【微信】】://get.coollabs.io/coolify/install.sh \ -O install.sh; sudo bash http://www.syrr.cn/news/install.sh -r防火墙设置 您需要在防火墙中允许以下端口 Coolify: 3000 (re【【微信】】)Revers…...

编程日记 2023/3/1 15:28:36

名字:阿h的小东东 学习:python。c 主页:没了 今天阿h带大家来看看更详细的python的练习题 目录 1. 在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 2. 静态函数, 类函数, 成员函数、属性函数的区别? 2.1静态…...

编程日记 2023/3/1 16:50:10

程序打包 SpringBoot程序是基于Maven创建的,在Maven中提供有打包的指令,叫做package。本操作可以在Idea环境下执行。 m【【微信】】? 打包后会产生一个与工程名类似的jar文件,其名称是由模块名版本号.jar组成的。 程序运行 ? 程序包打好以…...

编程日记 2023/2/26 21:56:29

安装


基于ASP.NET+SQL Server简单的 MVC 电商网站【100010406】

基于asp的网站设计与实现,基于ASP.NET的图书管理系统,基于ASP.NET的校园二手商品交易市场的设计与实现,基于ASP.NET的新闻网站的设计与实现

主要功能与知识点如下:

分类、产品浏览、购物车、结算、CRUD(增删改查) 管理、发邮件、分页、模型绑定、认证过滤器和单元测试等(预计四篇、周五、下周一和周二)。

  • 创建项目架构
  • 创建域模型实体
  • 创建单元测试
  • 创建控制器与视图
  • 创建分页
  • 加入样式

1.新建一个解决方案“【【微信】】”,并添加以下项目:

【【微信】】.Domain:类库,存放域模型和逻辑,使用 EF;

【【微信】】.WebUI:Web MVC 应用程序,存放视图和控制器,充当显示层,使用了 Ninject 作为 DI 容器;

BoosStore.UnitTest:单元测试,对上述两个项目进行测试。

Web MVC 为一个空的 MVC 项目:

2.添加项目引用(需要使用 NuGet):

这是不同项目需要引用的类库和项目

3.设置 DI 容器

我们通过 Ninject ,创建一个自定义的工厂,一个名为 NinjectControllerFactory 的类继承 DefaultControllerFactory(默认的控制器工厂)。你也可以在里面添加自定义的代码,改变 MVC 框架的默认行为。

AddBindings() 添加绑定方法,先留空。

4.并且在 Global.asax 中加入一行代码,告诉 MVC 用新建的类来创建控制器对象。

1.在图中位置创建一个名为 Book 的实体类。

有了实体之后,我们应该创建一个“库”对该实体进行操作,而这种持久化逻辑操作也应该和域模型是进行隔离的。

2.先定义一个接口 IbookRepository,在根目录创建一个名为 Abstract 的文件夹,顾名思义就是应该放置一些抽象的类,如接口。

我们通过该接口就可以得到对应类的相关信息,而不需要去管该数据如何存储,以及存储的位置,这就是存储库模式的本质。

3.接下来,我们就需要对数据库进行操作了,我们使用简单的 EF(ORM 对象关系模型) 去对数据库进行操作,所以需要自己通过 Nuget 下载 EF 的类库。

4.因为之前定义了接口类,接下来就应该定义实现该接口的类了

安装完之后,再次建立一个名为 Concrete 的文件夹,存放实例。

在里面创建一个 EfDbContext 的类,派生于 DbContext,该类会为用户要使用的数据库中的每个表自动的定义一个属性。该属性名为 Books,指定了表名,DbSet 表示为 Book 实体的表模型,Book 对象相当于 Books 表中的行(记录)。

再创建一个 EfBookRepository 存储库类,它实现 IBookRepository 接口,使用了上文创建的 EfDbContext 上下文对象,包含了具体的方法定义。

5.现在只差在数据库新建一张表了。

并插入测试数据:

测试数据

因为我希望表名为 Book,而不是 Books,所以我在之前的 Book 类上加上特性 [Table(“Book”)] :

1.做完预热操作后,你可能想立即以界面的的方式进行显示,别急,先用单元测试检查一下我们对数据库的操作是否正常,通过对数据进行简单的读取,检查下连接是否成功。

2.单元测试也需要引入 ef 类库(Nuget)。

3.安装完之后会生成一个 【【网址】】nfig 配置文件,需要额外添加一行连接字符串(在后续的 Web UI 项目里,也需要加上这条信息,不然会提示对应的错误信息)。

4.当所有前置工作都准备好了的时候,就应该填写测试方法了,因为我插入了 7 条数据,这里我就判断一下从数据库读取出的行数是否为 7 :

5.在该方法体的内部单击右键,你可以看到一个“运行测试”的选项,这时你可以尝试单击它:

从这个符号可以看到,是成功了!

接下来,我们要正式从页面显示我们想要的信息了。

1.先新建一个空的控制器:BookController:

2.需要我们自定义一个 【【微信】】 方法,用于后续与界面进行交互。

3.接下来,要创建一个视图 View 了。

4.将 【【微信】】.cshtml 的内容替换为下面的:

5.改下默认的路由机制,让他默认跳转到该页面。

6.还有一点需要注意的是,因为我们使用了 Ninject 容器,并且需要对控制器中的构造函数中的参数 IBookRepository 进行解析,告诉他将使用哪个对象对该接口进行服务,也就是需要修改之前的 AddBindings 方法:

7.运行的效果大致如下(因为加了点 CSS 样式,所以显示的效果可能有些许不同),结果是一致的。

1.在 Models 文件夹新增一个 PagingInfo.cs 分页信息类。

2.新增一个 HtmlHelpers 文件夹存放一个基于 HTML 帮助类的扩展方法:

3.添加完毕后需要在配置文件内加入该命名空间

4.现在要重新修改 BookController.cs 控制器内的的代码,并添加新的视图模型类 Book【【微信】】【【微信】】,让它继承之前的分页类。

修改后的控制器代码:

5.修改视图模型后,对应的视图页也需要修改

1.页面的样式简单的设计为 3 大板块,顶部为标题,左侧边栏为分类,主模块将显示具体内容。

我们现在要在 Views 文件夹下创建一个文件 _【【微信】】.cshtml,再创建一个 Shared 的文件夹和文件 _Layout.cshtml。

2._Layout.cshtml 这是布局页,当代码执行到 @RenderBody() 时,就会负责将之前 【【微信】】.cshtml 的内容进行渲染:

_【【微信】】.cshtml 该文件表示默认的布局页为该视图文件:

3.网站的根目录下也要添加一个名为 【【微信】】 的文件夹,用于存放 CSS。

site.css

现在,分页也已经有了效果,基本界面就出来了。

上一部分我们尝试了:创建项目架构、创建域模型实体、创建单元测试、创建控制器与视图、创建分页和加入样式,而这一节我们会完成两个功能,分类导航与购物车。

主要功能与知识点如下:

分类、产品浏览、购物车、结算、CRUD(增删改查) 管理、发邮件、分页、模型绑定、认证过滤器和单元测试等(预计剩余两篇,预计明天(因为周六不放假)和周三(因为周二不上班)发布)。

  • 添加分类导航
  • 加入购物车
  • 创建一个分部视图 Partial View

上一次我们把网页划分成了三个模块,其中左侧栏的部分尚未完成,左侧栏拥有将书籍分类展示的功能。

图 1

1.回到之前的 Book【【微信】】【【微信】】 视图模型,我们额外再添加一个新的属性用作分类(CurrentCategory):

2.修改完视图模型,现在就应该修改对应的 BookController 中的 【【微信】】 方法

参数增加了一个 【【微信】】,用于获取分类的字符串,对应 Books 中的属性的赋值语句改为 _bookRepository.Books.Where(x => 【【微信】】 == null || x.Category == 【【微信】】),这里的 Lambda 表达式 x => 【【微信】】 == null || x.Category == 【【微信】】 的意思是,分类字符串为空就取库中所有的 Book 实体,不为空时根据分类进行对集合进行筛选过滤。

还要对属性 CurrentCategory 进行赋值。

别忘了,因为分页是根据 TotalItems 属性进行的,所以还要修改地方 _bookRepository.Books.Count(x => 【【微信】】 == null || x.Category == 【【微信】】),通过 LINQ 统计不同分类情况的个数。

3.该控制器对应的 【【微信】】.cshtml 中的分页辅助器也需要修改,添加新的路由参数:

4.路由区域也应当修改一下

5.现在新建一个名为 Na【【微信】】 的控制器,并添加一个名为 【【微信】】 的方法,专门用于渲染左侧边栏。

不过返回的 View 视图类型变成 PartialView 分部视图类型:

在方法体在右键,添加一个视图,勾上创建分部视图。

【【微信】】.cshtml 修改为:

MVC 框架具有一种叫作“子动作(Child Action)”的概念,可以适用于重用导航控件之类的东西,使用类似 【【淘密令】】() 的方法,在当前的视图中输出指定的动作方法。

因为需要在父视图中呈现另一个 Action 中的分部视图,所以原来的 _Layout.cshtml 布局页修改如下:

现在,启动的结果应该和图 1 是一样的,尝试点击左侧边栏的分类,观察主区域的变化情况。

图 2

界面的大体功能如图 2,在每本图书的区域新增一个链接(添加到购物车),会跳转到一个新的页面,显示购物车的详细信息 - 购物清单,也可以通过“结算”链接跳转到一个新的页面。

购物车是应用程序业务域的一部分,因此,购物车实体应该为域模型。

1.添加两个类:

Cart.cs 有添加、移除、清空和统计功能:

CartItem.cs 表示购物车中的每一项:

2.修改一下之前的 【【微信】】.cshtml,增加“添加到购物车”的按钮:

【备注】@Html.BeginForm() 方法默认会创建一个 Post 请求方法的表单,为什么不直接使用 Get 请求呢,HTTP 规范要求,会引起数据变化时不要使用 Get 请求,将产品添加到一个购物车明显会出现新的数据变化,所以,这种情形不应该使用 Get 请求,直接显示页面或者列表数据,这种请求才应该使用 Get。

3.先修改下 CSS 中的样式

4.再添加一个 【【微信】】

【备注】这里的购物车是通过 Session 会话状态进行保存用户的 Cart 对象。当会话过期(典型的情况是用户很长时间没有对服务器发起任何请求),与该会话关联的数据就会被删除,这就意味着不需要对 Cart 对象进行生命周期的管理。

【备注】RedirectToAction() 方法:将一个 HTTP 重定向的指令发给客户端浏览器,要求浏览器请求一个新的 Url。

5.在 Index 方法中选择右键新建视图,专门用于显示购物清单:

Index.cshtml 中的代码

我想,这一定是一个令人激动的时刻,因为我们已经完成了这个基本的添加到购物车的功能。

分部视图,是嵌入在另一个视图中的一个内容片段,并且可以跨视图重用,这有助于减少重复,尤其需要在多个地方需要重复使用相同的数据时。

在 Shared 内部新建一个名为 _BookSummary.cshtml 的视图,并且把之前 【【微信】】.cshtml 的代码进行整理。

修改后的两个视图:

【【微信】】.cshtml

_BookSummary.cshtml

上一部分我们完成了两个主要功能:添加到购物车和分类导航,这一节我们会完成整个购物车的流程,以及订单处理。

该系列主要功能与知识点如下:

分类、产品浏览、购物车、结算、CRUD(增删改查) 管理、发邮件、分页、模型绑定、认证过滤器和单元测试等(预计剩余两篇,周三(因为周二不上班)先发布一篇)。

  • 完成购物车
  • 订单结算

上一节其实已经完成了移除购物车和清空购物车的方法,只是尚未将可供用户操作的按钮放在页面区域。除了增加这两个按钮,也会在页面顶部的位置增加购物车的摘要(用于显示用户的购物总额)。

下面是上一节已经写好的 【【微信】】 代码。

1.加入移除书籍和清空购物车的功能

Index.cshtml

【备注】@Html.Hidden(“id”, item.Book.Id) 是用于生成隐藏的字段,如果直接使用 @Html.HiddenFor(),生成的 name 将会是 item.Book.Id ,将和 【【微信】】 中 Remo【【微信】】(int id, string return) 的参数不匹配。

显示的效果如下:

2.添加摘要:我们在购物车存放了许多东西,通过摘要,可以显示购物总额的缩略图,我们选择的位置在顶部右上角的一个比较显眼的位置进行显示它,当然,还需要有点击的跳转按钮方便显示所有的购物清单页面。

继续在 【【微信】】 下新增一个 Action,名为 Summary,返回值是一个分部视图

对应的 Summary.cshtml

对应的布局页 _Layout.cshtml 修改的地方为:

添加了新的东西,CSS 也要进行修改:

购物完毕就是结算页面了,这里的订单结算并不涉及支付接口的调用,只是使用邮件的形式进行通知而已。

这里,我设计结算的时候需要要求用户输入一些信息,如姓名、地址和邮箱等信息,在点击确定时我再将这些输入的信息与购物清单的信息从系统的邮箱发到你所输入的邮箱当中。一个比较直观的图:

1.在 Entities 中添加一个域模型 【【微信】】.cs 表示联系人的信息。

【【微信】】.cs 添加一个用于结算的 Action:

Checkout.cshtml 中的:

这里使用的是模型校验,_Layout.cshtml 布局页需要引入 js:

尝试运行,会出现以下页面,如果信息不填的话会出现相关的错误提示:

2.接下来,要进入“提交”后的流程了。

现在还需要一个组件用于处理订单,创建一个用于订单处理的接口,和一个该接口的实现,再通过 Ninject 进行两者的绑定:

建立一个实现该接口用于处理订单的实体类,这里并不是调用支付接口,而是简单通过 BCL 中的进行邮件的发送。

EmailOrderProcessor.cs:

【【微信】】 也需要稍作调整:

还要在 【【微信】】 中额外添加一个带 [【【微信】】] 特性的名为 Checkout 方法:

当校验成功时,会调用接口发一条信息,并且清空已有的购物车,然后跳转到指定的一个新视图页:

新建 Thanks.cshtml,内容如下:

别忘了添加绑定哦,使用 DI 容器将两者进行绑定:

启动页面,试试效果吧:

看来,好像成功了哦:

上一节我们完成了两个主要功能:完成了整个购物车的流程,以及订单处理(发邮件进行通知),今天我们来学习一下最基本的增删改查,以及登录认证过滤器,加入防 CSRF 攻击,本系列已完结。

该系列主要功能与知识点如下:

分类、产品浏览、购物车、结算、CRUD(增删改查) 管理、发邮件、分页、模型绑定、认证过滤器和单元测试等。

  • 基本的增删改查 CRUD
  • 登录授权认证过滤

我们创建一个新的控制器进行增删改查功能,AdminController,并添加一个显示所有数据的方法:

不在沿用之前的布局页了,创建一个新的布局页 _AdmindLayout.cshtml:

对应的 Index.cshtml:

编辑,我把新增和编辑的位置放在一块,使用 id 进行区分,如果 id = 0 就表示新增的信息。

在 AdminCtroller 中添加关于编辑的方法

更新存储库中的方法:

IBookRepository.cs

EfBookRepository.cs

需要对 Book 模型加上验证用的特性:

AdminLayout.cshtml 需要引入验证用的 js(客户端验证):

Edit.cshtml

图:错误提示

删除

加入提示,我们在新增、编辑和删除时应该加入必要的提示信息,使用 TempData。

/Admin/Index.cshtml 下的也要添加:

执行效果:

【备注】TempData 临时数据保存了一条信息,是一个“键/值”字典,类似会话 Session 和 【【微信】】,它和 Session 的差别是,在 HTTP 请求结束后会被删除。因为这里使用了 RedirectToAction ,一条重定向指令,会告诉浏览器重定向请求到一个新地址,这时就不能使用 【【微信】】,【【微信】】 用于在控制器与视图之间传递数据,但它保持数据的时间不能比当前的 HTTP 请求长,重定向意味着用户是跨请求的,【【微信】】 不能用于跨请求时传递数据。

上面是一个 Admin 的后台管理操作,不是每一个用户都能够进入管理的,所以现在加入登录授权认证功能,只有成功后,才能进入管理界面。

先在配置文件 WebConfig.cs 中加入

在这里使用的授权认证模式为表单认证,为了简化与数据库的交互操作,采取的是硬编码的形式。如果尚未得到认证,会跳转到 Account/Login 的地址让管理员先进行登录,timeout 表示登录(即认证)成功的保持时长为 2880 分钟(即 48 小时),而 name 表示的就是用户名, password 表示的就是登录密码。

这里采用的是授权认证过滤器,我们需要对要认证后才能进入的控制器添加一个特性[【【微信】】],即对 AdminController 添加该特性。

新建表单认证提供器,一个接口和一个实现:

IAuthProvider.cs:

【【微信】】.cs:

AddBindings() 方法中注册: