翼度科技»论坛 编程开发 .net 查看内容

[回馈]ASP.NET Core MVC开发实战之商城系统(一)

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,今天着重讲解布局设计,环境搭建,系统配置,及首页商品类型,banner条,友情链接等功能的开发。

 
首页布局设计

 
首页是商城系统的门面,首页的设计的好坏关系着用户的体验,在本示例中,首页主要分为以下几个模块,如下所示:

 
项目环境搭建

 
1. 安装第三方库

 
所谓“工欲善其事必先利其器”,在开发程序之前,先将项目配置好。项目需要安装的第三方库,可通过Nuget包管理器进行安装。
目前程序用到的第三方库有三个:

  • 日志组件:NLog,NLog.Web.AspNetCore,主要用于记录系统日子。
  • 数据库组件:目前采用SqlSugarCore,访问数据库程序。
具体安装库和版本如下所示:

 
2. 启动配置

 
汽配启动配置主要配置注入服务,及路由,主要有以下几个:

  • Session服务,由于到进行用户身份验证,所以需要用到Session。
  • 鉴权/授权组件,主要用于什么验证及权限管理。
  • 日志组件,记录程序执行过程的日志,便于问题分析和解决。
  • 路由控制器注入。
具体配置【Program.cs】参照如下所示:
  1. using EasyBuyShop.DAL;
  2. using EasyBuyShop.Utils;
  3. using Microsoft.AspNetCore.Authentication.Cookies;
  4. using NLog.Web;
  5. var builder = WebApplication.CreateBuilder(args);
  6. // Add services to the container.
  7. builder.Services.AddControllersWithViews();
  8. //1. 往容器中添加Session服务,启用Session服务
  9. builder.Services.AddSession(option =>
  10. {
  11.     option.IdleTimeout = TimeSpan.FromMinutes(10);
  12.     option.Cookie.Name = "DemoMvcCore";
  13. });
  14. //添加鉴权服务
  15. builder.Services.AddAuthentication(options =>
  16. {
  17.     options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  18. }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
  19. {
  20.     options.LoginPath = "/Auth/Login";
  21.     options.LogoutPath = "/Auth/Logout";
  22. });
  23. // NLog: Setup NLog for Dependency injection
  24. builder.Logging.ClearProviders();
  25. builder.Host.UseNLog();
  26. LogHelper.LoadConfiguration();
  27. var app = builder.Build();
  28. //启动时获取数据库连接字符串
  29. BaseDal.ConnStr = app.Configuration.GetConnectionString("Default");
  30. // Configure the HTTP request pipeline.
  31. if (!app.Environment.IsDevelopment())
  32. {
  33.     app.UseExceptionHandler("/Home/Error");
  34.     // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  35.     app.UseHsts();
  36. }
  37. //2.使用Session中间件,主要用于拦截Http请求
  38. app.UseSession();
  39. app.UseHttpsRedirection();
  40. app.UseStaticFiles();
  41. app.UseRouting();
  42. app.UseAuthentication();
  43. app.UseAuthorization();
  44. app.MapControllerRoute(
  45.     name: "default",
  46.     pattern: "{controller=Home}/{action=Index}/{id?}");
  47. app.Run();
复制代码
 
3. 配置文件

 
配置文件【appsetting.json】主要配置数据库连接字符串,及其他信息。如下所示:
  1. {
  2.   "ConnectionStrings": {
  3.     "Default": "Server=localhost;Database=EasyBuyShop;Trusted_Connection=True;User Id=sa;Password=abc123"
  4.   },
  5.   "Logging": {
  6.     "LogLevel": {
  7.       "Default": "Information",
  8.       "Microsoft.AspNetCore": "Warning"
  9.     }
  10.   },
  11.   "AllowedHosts": "*"
  12. }
复制代码
 
4. 日志配置

 
日志配置【nlog.config】主要配置NLog组件需要的日志保存路径以及层级等信息。如下所示:
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.       autoReload="true"
  5.       internalLogLevel="Info"
  6.       internalLogFile="\Logs\internal-nlog-AspNetCore.txt">
  7.        
  8.         <extensions>
  9.                 <add assembly="NLog.Web.AspNetCore"/>
  10.         </extensions>
  11.        
  12.         <targets>
  13.                
  14.                 <target xsi:type="File" name="allfile" fileName="${basedir}\Logs\nlog-all-${shortdate}.log"
  15.                                 layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />
  16.                
  17.                 <target xsi:type="File" name="ownFile-web" fileName="${basedir}\Logs\nlog-own-${shortdate}.log"
  18.                                 layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
  19.                
  20.                 <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />
  21.         </targets>
  22.        
  23.         <rules>
  24.                
  25.                 <logger name="*" minlevel="Info" writeTo="allfile" />
  26.                
  27.                 <logger name="*" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
  28.                
  29.                 <logger name="Microsoft.*" minlevel="Info" final="true" />
  30.                 <logger name="System.Net.Http.*" minlevel="Info" final="true" />
  31.                 <logger name="*" minlevel="Info" writeTo="ownFile-web" />
  32.         </rules>
  33. </nlog>
复制代码
注意:NLog日志组件不支持相对路径配置,如果想让日志保存在程序根目录,需要通过${basedir}进行配置,否则日志如法保存。
 
页面布局

 
其中Header,Footer,前台各个页面都会用到,所以采用Layout布局页面展示【_Layout.cshtml】。如下所示:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="utf-8" />
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6.     <title>@ViewData["Title"] - 易购商城</title>
  7.     <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
  8.     <link rel="stylesheet" href="~/css/shop_style.css" />
  9.     <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
  10.     <link rel="stylesheet" href="~/EasyBuyShop.styles.css" asp-append-version="true" />
  11. </head>
  12. <body>
  13.     <header  >
  14.         
  15.             
  16.                 <a target="_blank" href="https://www.cnblogs.com/Home/Index" >
  17.                     <h2>易购商城</h2>
  18.                 </a>
  19.             
  20.             
  21.                 <form  role="search" action="/Product/Index/">
  22.                     
  23.                         <input type="search"  placeholder="商品名称" aria-label="Search"  name="productName">
  24.                         <button type="submit" >搜索</button>
  25.                     
  26.                 </form>
  27.                
  28.                     @if (!string.IsNullOrEmpty(ViewBag.UserName))
  29.                     {
  30.                         <a target="_blank" href="https://www.cnblogs.com/#"  data-bs-toggle="dropdown" aria-expanded="false">
  31.                             @ViewBag.RealName
  32.                         </a>
  33.                         <ul  >
  34.                             <li><a  target="_blank" href="https://www.cnblogs.com/Cart/Index">购物车</a></li>
  35.                             <li><a  target="_blank" href="https://www.cnblogs.com/Personal/Setting">设置</a></li>
  36.                             <li><a  target="_blank" href="https://www.cnblogs.com/Personal/Index">个人信息</a></li>
  37.                             <li><hr ></li>
  38.                             <li><a  target="_blank" href="https://www.cnblogs.com/Auth/Logout">登出</a></li>
  39.                         </ul>
  40.                     }
  41.                     else
  42.                     {
  43.                         <a target="_blank" href="https://www.cnblogs.com/Auth/Login" >
  44.                             亲,请登录
  45.                         </a>
  46.                     }
  47.                     
  48.                
  49.             
  50.         
  51.     </header>
  52.    
  53.         <main role="main" >
  54.             @RenderBody()
  55.         </main>
  56.    
  57.     <footer  >
  58.         <p >© 2023-2024 易购商城 老码识途 公子小六</p>
  59.     </footer>
  60.    
  61.    
  62.    
  63.     @await RenderSectionAsync("Scripts", required: false)
  64. </body>
  65. </html>
复制代码
布局页面效果如下所示:
页头【Header】包含一个Form表单,用于查询商品信息,如下所示:

页脚【Footer】用于设置版权信息,如下所示:

 
商品类型功能

 
首先每一个商品有类型,类型分为大类【Category】,中类,小类【SubCategory】,细类等,本文为了简化,只分为大类,小类两种。
 
1. 数据库设计

 
数据表结构设计如下:
大类Category表,如下所示:

建表语句如下所示:
  1. CREATE TABLE [dbo].[EB_Category](
  2.         [Id] [bigint] IDENTITY(1,1) NOT NULL,
  3.         [Category] [varchar](100) NULL,
  4.         [Description] [varchar](500) NULL,
  5.         [CreateTime] [datetime] NULL,
  6.         [CreateUser] [varchar](50) NULL,
  7.         [LastEditTime] [datetime] NULL,
  8.         [LastEditUser] [varchar](50) NULL
  9. ) ON [PRIMARY]
复制代码
小类SubCategory表,如下所示:

注意:数据表中的分类内容,是从某宝抄下来的,然后整理好后,导入数据库。
建表语句如下所示:
  1. CREATE TABLE [dbo].[EB_SubCategory](
  2.         [Id] [bigint] IDENTITY(1,1) NOT NULL,
  3.         [CategoryId] [bigint] NULL,
  4.         [SubCategory] [varchar](100) NULL,
  5.         [Description] [varchar](500) NULL,
  6.         [CreateTime] [datetime] NULL,
  7.         [CreateUser] [varchar](50) NULL,
  8.         [LastEditTime] [datetime] NULL,
  9.         [LastEditUser] [varchar](50) NULL
  10. ) ON [PRIMARY]
复制代码
 
2. 项目模型创建

 
SqlSurgar采用模型对象映射ORM操作数据库,所以需要先创建模型对象。
大类Category模型对象,如下所示:
  1. using SqlSugar;
  2. namespace EasyBuyShop.Models
  3. {
  4.     [SugarTable("EB_Category")]
  5.     public class Category : EntityModel
  6.     {
  7.         [SugarColumn(ColumnName ="Category")]
  8.         public string CategoryName { get; set; }
  9.         public string Description { get; set; }
  10.     }
  11. }
复制代码
小类SubCategory模型对象,如下所示:
  1. using SqlSugar;
  2. namespace EasyBuyShop.Models
  3. {
  4.     [SqlSugar.SugarTable("EB_SubCategory")]
  5.     public class SubCategory : EntityModel
  6.     {
  7.         public long CategoryId { get; set; }
  8.         [SugarColumn(ColumnName = "SubCategory")]
  9.         public string SubCategoryName { get; set; }
  10.         public string Description { get; set; }
  11.     }
  12. }
复制代码
其中EntityModel为模型基类,为公共类型,如下所示:
  1. using SqlSugar;
  2. using System.ComponentModel.DataAnnotations.Schema;
  3. using System.Security.Principal;
  4. namespace EasyBuyShop.Models
  5. {
  6.     public class EntityModel
  7.     {
  8.         [SugarColumn(IsNullable = false, IsIdentity = true)]
  9.         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  10.         public int Id { get; set; }
  11.         public DateTime CreateTime { get; set; }
  12.         public string CreateUser { get; set; }
  13.         public DateTime LastEditTime { get; set; }
  14.         public string LastEditUser { get; set; }
  15.     }
  16. }
复制代码
 
3. 数据库操作类

 
数据库操作类位于DAL层,每一个表都有对应的DAL层,如下所示:
大类Category数据表操作DAL层,如下所示:
  1. using EasyBuyShop.Models;
  2. namespace EasyBuyShop.DAL
  3. {
  4.     public class CategoryDal:BaseDal
  5.     {
  6.         public CategoryDal()
  7.         {
  8.         }
  9.         public List<Category> GetCategories()
  10.         {
  11.             return this.getTList<Category>();
  12.         }
  13.     }
  14. }
复制代码
小类SubCategory数据表操作DAL层,如下所示:
  1. using EasyBuyShop.Models;
  2. namespace EasyBuyShop.DAL
  3. {
  4.     public class SubCategoryDal : BaseDal
  5.     {
  6.         public List<SubCategory> GetSubCategories()
  7.         {
  8.             return this.getTList<SubCategory>();
  9.         }
  10.     }
  11. }
复制代码
其中BaseDal为基类,数据库操作的公共方法,如下所示:
  1. using EasyBuyShop.Utils;
  2. using SqlSugar;
  3. namespace EasyBuyShop.DAL
  4. {
  5.     public class BaseDal
  6.     {
  7.         public static string ConnStr = string.Empty;
  8.         /// <summary>
  9.         /// 获取程序数据库操作对象
  10.         /// </summary>
  11.         /// <param name="strConn">数据库连接字符串</param>
  12.         /// <returns></returns>
  13.         public SqlSugarClient GetDb(string strConn)
  14.         {
  15.             var db = new SqlSugarClient(
  16.                 new ConnectionConfig()
  17.                 {
  18.                     ConnectionString = strConn,
  19.                     DbType = DbType.SqlServer,
  20.                     IsAutoCloseConnection = true,
  21.                     InitKeyType = InitKeyType.Attribute,
  22.                     AopEvents = new AopEvents
  23.                     {
  24.                         OnLogExecuting = (sql, p) =>
  25.                         {
  26.                             LogHelper.Info(sql);
  27.                             LogHelper.Info(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value)));
  28.                         }
  29.                     }
  30.                 });
  31.             return db;
  32.         }
  33.         /// <summary>
  34.         /// 查询所有的用户记录
  35.         /// </summary>
  36.         /// <returns></returns>
  37.         public List<T> getTList<T>()
  38.         {
  39.             try
  40.             {
  41.                 return this.GetDb(ConnStr).Queryable<T>().ToList();
  42.             }
  43.             catch (Exception ex)
  44.             {
  45.                 LogHelper.Fatal(ex.Message);
  46.                 return null;
  47.             }
  48.         }
  49.         /// <summary>
  50.         /// 插入一条记录
  51.         /// </summary>
  52.         /// <param name="model"></param>
  53.         /// <returns></returns>
  54.         public int InsertT<T>(T model) where T : class, new()
  55.         {
  56.             try
  57.             {
  58.                 return this.GetDb(ConnStr).Insertable<T>(model).ExecuteCommand();
  59.             }
  60.             catch (Exception ex)
  61.             {
  62.                 LogHelper.Fatal(ex.Message);
  63.                 return -1;
  64.             }
  65.         }
  66.     }
  67. }
复制代码
 
4. 商品类型控制器部分

 
商品类型只是首页【/Home/Index】的一小部分,首页的控制器获取到商品类型信息,然后传递到视图层即可。如下所示:
  1. public IActionResult Index()
  2. {
  3.     CategoryDal categoryDal = new CategoryDal();
  4.     SubCategoryDal subCategoryDal = new SubCategoryDal();
  5.     var categories = categoryDal.GetCategories();
  6.     var subCategories = subCategoryDal.GetSubCategories();
  7.     ViewData["Categories"] = categories;
  8.     ViewData["SubCategories"] = subCategories;
  9.     return View();
  10. }
复制代码
 
5. 商品类型视图部分

 
商品类型视图在首页【/Home/Index.cshtml】中,如下所示:
  1.        
  2.                 @foreach(var category in ViewData["Categories"] as List<Category>)
  3.                 {
  4.                         var id = category.Id;
  5.                         var subCategories = ViewData["SubCategories"] as List<SubCategory>;
  6.                         var subCategoriesById = subCategories.Where(r => r.CategoryId == id);
  7.                        
  8.                                
  9.                                        
  10.                                                
  11.                                                         <a href="https://www.cnblogs.com/"  target="_blank">ↂ</a>
  12.                                                         <a href="https://www.cnblogs.com/"  target="_blank">@category.CategoryName</a>
  13.                                                
  14.                                                
  15.                                                         @foreach(var subCategory in subCategoriesById)
  16.                                                         {
  17.                                                                 <a href="https://www.cnblogs.com/Product/Index/?CategoryId=@(id)&subCategoryId=@(subCategory.Id)"  target="_blank">@subCategory.SubCategoryName</a>
  18.                                                         }
  19.                                                
  20.                                        
  21.                                
  22.                        
  23.                 }
  24.        
复制代码
 
6. 商品类型示例

 
商品类型示例效果图,如下所示:

 
banner条及友情链接

 
banner条主要用与广告位之类的显示,友情链接主要用于链接其他网站或者站内页面。目前banner条设计了两张静态图,友情链接参考了某宝内容,视图文件如下所示:
  1.        
  2.                
  3.                        
  4.                                
  5.                                        
  6.                                                 <a href="https://www.cnblogs.com/#" target="_blank">
  7.                                                         <img  src="https://www.cnblogs.com/~/imgs/001.jpg" width="730" height="280" />
  8.                                                 </a>
  9.                                        
  10.                                        
  11.                                                 <a href="https://www.cnblogs.com/#" target="_blank">
  12.                                                         <img  src="https://www.cnblogs.com/~/imgs/002.jpg" width="730" height="280" />
  13.                                                 </a>
  14.                                        
  15.                                        
  16.                                                 <a href="https://www.cnblogs.com/#" target="_blank">
  17.                                                         <img  src="https://www.cnblogs.com/~/imgs/001.jpg" width="730" height="280" />
  18.                                                 </a>
  19.                                        
  20.                                        
  21.                                                 <a href="https://www.cnblogs.com/#" target="_blank">
  22.                                                         <img  src="https://www.cnblogs.com/~/imgs/002.jpg" width="730" height="280" />
  23.                                                 </a>
  24.                                        
  25.                                
  26.                        
  27.                
  28.                
  29.                        
  30.                                 <a target="_blank" target="_blank" href="https://www.cnblogs.com/Home/Index" ><i >✮</i>我的商城</a>
  31.                        
  32.                         <ul mxa="x30_:h" >
  33.                                 <li data-spm="19985674831">
  34.                                         <a target="_blank" target="_blank" href="https://www.cnblogs.com/Home/Index" >
  35.                                                 <i  >易购商城</i>
  36.                                         </a>
  37.                                 </li>
  38.                                 <li data-spm="19985674832">
  39.                                         <a target="_blank" href="https://www.cnblogs.com/">
  40.                                                 <img src="https://www.cnblogs.com/~/imgs/others/taobao.gif" width="119" height="61">
  41.                                         </a>
  42.                                 </li>
  43.                                 <li data-spm="19985674833">
  44.                                         <a target="_blank" href="https://www.cnblogs.com/">
  45.                                                 <img src="https://www.cnblogs.com/~/imgs/others/juhuasuan.gif" width="119" height="61">
  46.                                         </a>
  47.                                 </li>
  48.                                 <li data-spm="19985674834">
  49.                                         <a target="_blank" href="https://www.cnblogs.com/">
  50.                                                 <img src="https://www.cnblogs.com/~/imgs/others/chaojiyouxuan.png" width="119" height="61">
  51.                                         </a>
  52.                                 </li>
  53.                                 <li data-spm="19985674835">
  54.                                         <a target="_blank" href="https://www.cnblogs.com/" >
  55.                                                 <i  >九块九</i>
  56.                                         </a>
  57.                                 </li>
  58.                                 <li data-spm="19985674836">
  59.                                         <a target="_blank" href="https://www.cnblogs.com/">
  60.                                                 <img src="https://www.cnblogs.com/~/imgs/others/tianmaoguoji.png" width="119" height="61">
  61.                                         </a>
  62.                                 </li>
  63.                                 <li data-spm="19985674837">
  64.                                         <a target="_blank" href="https://www.cnblogs.com/">
  65.                                                 <img src="https://www.cnblogs.com/~/imgs/others/tianmaochaoshi.gif" width="119" height="61">
  66.                                         </a>
  67.                                 </li>
  68.                                 <li data-spm="19985674838">
  69.                                         <a target="_blank" href="https://www.cnblogs.com/">
  70.                                                 <img src="https://www.cnblogs.com/~/imgs/others/ailijiankang.png" width="119" height="61">
  71.                                         </a>
  72.                                 </li>
  73.                         </ul>
  74.                
  75.        
复制代码
以上就是ASP.NET Core MVC开发实战之商城系统(环境搭建及首页设计) 的全部内容,后续将继续介绍其他模块。

来源:https://www.cnblogs.com/hsiang/archive/2023/07/21/17569996.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具