基于.NetCore+Layui+小程序实现的在线商城系统

一、文章前言

  因为疫情等客观因素的制约,以及大家思想观念的转变,线上开店逐渐成为人们口中热议的话题,更是慢慢的形成了一种趋势毕竟这个相对于创业,所投入的资金少,风险小。但任何事务的发展到一定的阶段后,门槛以及规则都会不断的提高,相对应的管理成本也随之提升,为了帮助小型微企转战线上,助力平台转型而开发此系统。
  此系统采用C#编程语言,使用.NetCore平台搭建API,前端使用Layui、小程序、数据支持采用的是SQLSERVER2012。

二、系统设计

2.1 背景介绍
(1)系统角色:主要是分为小程序用户及管理员
(2)系统目的:让用户能够通过小程序等入口选购商品、生成订单,管理员可通过后台进行对应的管理配置

2.2 设计目标
(1)数据存储安全可靠
(2)界面友好,操作简单易用
(3)占用资源少,对平台要求低

2.3 功能模块
(1)后台管理系统主要模块有:数据中台、用户管理、商品管理、订单管理、供应商管理、运作报表、系统设置等。
(2)用户端小程序主要模块有:首页、商品分类页、购物车页、个人中心页、商品详情页、活动列表页、支付页、订单列表页、收货地址页

功能结构图如下:
在这里插入图片描述
在这里插入图片描述

三、主要功能模块截图

图3.1:管理员登录页,通过校验账号密码及验证码等步骤后即可跳转至后台
在这里插入图片描述
图3.2:后台数据中台首页,使用Echart前端框架通过图表的方式将数据灵动展示
在这里插入图片描述
图3.3:用户列表,可以对员工信息以及小程序用户信息进行管理
在这里插入图片描述

图3.4:商品列表,可在此页面跳转新增 / 修改页,也可以对商品禁用 / 删除
在这里插入图片描述

图3.5:新增 / 修改商品页
在这里插入图片描述

图3.6:订单列表页
在这里插入图片描述

图3.7:供应商列表
在这里插入图片描述

图3.8:系统设置页
在这里插入图片描述

图3.9:系统权限配置
在这里插入图片描述

图3.10:个人信息设置页
在这里插入图片描述

图3.11:用户端小程序首页、商品推荐页、商品详情页

图3.12:用户端商品分类页、购物车页、个人中心页
图3.13:用户端订单列表页、收货地址页、优惠券页

四、实现步骤

开发软件准备
1.Visual Studio,简称VS,用它来实现API。
2.SQLSERVER数据库,版本不限,用它作为数据支持存储数据。
3.Hbulider,用它来开发后台管理端页面,因为我们采用的是前后端分离的架构。
4.微信Web开发者工具,用它来开发小程序。

4.1、创建数据库及所需的数据表,这里我们先创建一个商品表演示一下开发步骤
在这里插入图片描述

--创建数据库
CREATE DATABASE Electricity;

--创建商品表
CREATE TABLE Product(
	--商品ID
	ProductId INT,
	--商品名称
	ProducrName NVARCHAR(100),
	--商品规格
	ProducrSpec NVARCHAR(100),
	--商品价格
	Price decimal,
	--单位
	Unit NVARCHAR(100),
	--助记码
	Tag NVARCHAR(100),
	--创建时间
	CreateTime NVARCHAR(100),
	--创建人
	CreateBy NVARCHAR(100)
);

4.2、打开VS,选择创建新项目,选择WebApi项目,因为我们需要搭建一个API
在这里插入图片描述
在这里插入图片描述
4.3、配置项目名称以及存放位置,目标框架选择3.1就可以。
在这里插入图片描述
在这里插入图片描述

4.4、在appsettings界面配置对应的数据库连接字符串在这里插入图片描述
4.5、新建一个类,实现查询商品列表的业务功能,这里我使用的是sqlsugur这个ORM框架

public new async Task<IPageList<Product>> QueryPageAsync(Expression<Func<Product, bool>> predicate,
            Expression<Func<Product, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
            int pageSize = 20, bool blUseNoLock = false)
        {
    
    
            RefAsync<int> totalCount = 0;
            List<Product> page;
           
               page = await DbClient.Queryable<Product>()
               .OrderByIF(orderByExpression != null, orderByExpression, orderByType)
               .WhereIF(predicate != null, predicate).Select(p => new Product
               {
    
    
                   ProductCode = p.ProductCode,
                   ProductName = p.ProductName,
                   SpuCode = p.SpuCode,
                   Unit = p.Unit,
                   Color = p.Color,
                   ClSize = p.ClSize,
                   Barcode = p.Barcode,
                   Volume = p.Volume,
                   NetWeight = p.NetWeight,
                   GrossWeight = p.GrossWeight,
                   IsDefault = p.IsDefault,
                   Valid = p.Valid,
                   Remarks = p.Remarks,
                   TimeCreate = p.TimeCreate,
                   CreateBy = p.CreateBy,
                   TimeUpdate = p.TimeUpdate,
                   UpdateBy = p.UpdateBy,

               }).With(SqlWith.NoLock).ToPageListAsync(pageIndex, pageSize, totalCount);
            
            var list = new PageList<Product>(page, pageIndex, pageSize, totalCount);
            return list;
        }

4.5、新建一个控制器,编写对应的动作方法,后续我们将通过访问这个路径来查询数据库中的商品数据。
在这里插入图片描述

[HttpPost]
[Authorize]
public JsonResult GetRecommenProductSpuPictures()
{
    
    
    var jm = new WebApiCallBack();
    var list = _productServices.QueryList.ToList();
    jm.data = list;
    jm.code = 200;
    jm.status = true;
    jm.msg = "请求成功";
    return Json(jm);
}

4.6、打开Hbulider,创建一个页面,引入Layui.js,绘制一个div标签,然后在js中通过请求我们刚才的API地址来渲染数据。

<div class="table-body">
    <table id="dataReqList" lay-filter="dataReqList"></table>
</div>
<script>
    var is_edit = 0;
    layui.config({
    
    
        base: '/lib/layuiadmin/' //静态资源所在路径
    }).extend({
    
    
        index: 'lib/index' //主入口模块
    }).use(['index', 'table', 'coreHelper', 'laydate', 'zTree', 'tableChild', 'xmSelect'], function () {
    
    
        var table = layui.table
            , admin = layui.admin
            , laydate = layui.laydate
            , coreHelper = layui.coreHelper
            , xmSelect = layui.xmSelect
            , tableChild = layui.tableChild
            , form = layui.form;
            
        table.render({
    
    
            elem: '#dataReqList',
            height: '440',
            method: 'POST',
            defaultToolbar: [],
            url: '', //数据接口
            title: '商品列表',
            page: true,
            limit: 20,
            limits: [10, 20, 50, 100, 200, 1000],
            cols: [[ //表头
                {
    
     type: 'checkbox', fixed: 'left', title: '' },
                {
    
     field: 'productCode', title: '商品编码', sort: false, width: 150 },
                {
    
     field: 'productName', title: '商品名称', sort: false, width: 150 },
                {
    
     field: 'productSpec', title: '商品规格', sort: false, width: 150 },
                {
    
     field: 'subSegmentName', title: '商品小类', sort: false, width: 100 },
                {
    
     field: 'unit', title: '单位', sort: false, width: 50 },
                {
    
     field: 'color', title: '颜色', sort: false, width: 80 },
                {
    
     field: 'clSize', title: '尺码', sort: false, width: 80 },
                {
    
     field: 'remarks', title: '备注', sort: false, width: 100 },
            ]],
            done: function () {
    
    
                tableChild.render(this);
            }
        });
        //监听表格复选框选择
        table.on('checkbox(dataReqList)', function (obj) {
    
    
        });
        //监听搜索
        form.on('submit(dataReqList-search)', function (data) {
    
    
            var field = data.field;
            //执行重载
            table.reload('dataReqList', {
    
    
                where: field, page: {
    
     curr: 1 }
            });
        });
        //监听行双击事件
        table.on('rowDouble(dataReqList)', function (obj) {
    
    
        });
        //监听单元格编辑
        table.on('edit(dataReqList)', function (obj) {
    
    
        })
        //确定选择
        form.on('submit(dataReqList-select)', function (data) {
    
    
        });
        //工具栏事件
        table.on('Toolbar(dataReqList)', function (obj) {
    
    
        });
        form.render();
    });
</script>

4.7、后台管理端能够正常走通后我们打开微信Web开发者工具,新建一个项目,在默认的Page里面做操作。点击测试号,选择不使用云服务
在这里插入图片描述
4.8、在JS文件中中编写方法请求我们刚才通过VS编写的接口,url里面就是我们接口的地址,我们可以先console输出一下返回的结果集,然后使用setData将返回的数据进行赋值。

   wx.request({
    
    
      url: '',
      method: 'POST',
      data:{
    
    },
      success: function (res) {
    
    
       	console.log(res);
       	this.setData({
    
    
          proeuctList: res.data
      	})
      }
    })

4.9、在小程序wxml文件中绘制样式,将返回的数据进行渲染输出,这样我们就能得到一个简单的商品列表。

<view class="indexProductList">
  <view class="productItemBottom" wx:for="{
    
    {proeuctList}}">
    <view style="background: url({
    
    {item.productPic}});background-size: 100% 100%;" class="productImgBottom"
      bindtap="bottomGo" data-id="{
    
    {item.productId}}"></view>
    <view class="bottom-productName little">{
    
    {
    
    item.productName}}</view>
    <view class="iconBox little">
      <!-- <view class="iconDetail" wx:for="{
    
    {item.icon}}">{
    
    {
    
    item}}</view> -->
      {
    
    {
    
    item.remark}}
    </view>
    <view class="buyBox-bottom">
      <view class="leftPrice-bottom">
        <text class="priceFh"></text>
        <text class="bottom-price">{
    
    {
    
    item.proSalePrice}}</text>
        <text class="bottom-oldPrice">{
    
    {
    
    item.price}}</text>
      </view>
      <view class="rightAdd-bottom" catchtap="btnAddCart" data-index="{
    
    {index}}" data-goodsid="{
    
    {item.productId}}">
        <image class="rightAdd-bottom" src="{
    
    {imgUrl}}"></image>
      </view>
    </view>
  </view>
</view>

在这里插入图片描述
4.10、后续我们依葫芦画瓢,通过上述的指引步骤,建表、实现API、请求API、渲染数据、操作数据就能得到一个商城系统啦

后续完整代码整理完成后会陆续上传到Git,欢迎指正。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42794881/article/details/127074215
今日推荐