# test-server **Repository Path**: oliver-puppio/test-server ## Basic Information - **Project Name**: test-server - **Description**: 小程序测试服代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-09-27 - **Last Updated**: 2022-01-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目摘要 ## Ⅰ项目需求 ### • 数据库管理 ### • 数据库建模 ### • 服务器服务代码 ### • 管理员后台管理系统 ### • 小程序 ## Ⅱ Web端后台管理系统 ### 1. 商品管理 #### 1.1 添加商品: 创建新商品,包括对应sku的创建:输入商品基本信息(名称、种类、单位、描述、图片、等级、佣金比),再添加商品子类信息(参考价格、现价、标签、次级标签、条形码、成本、预警库存) PS:加入不同sku使用相同价格的勾选框,默认为选中,方便操作 #### 1.2 库存管理: ​ SKUID生成规则:在商品id后加00,然后每增加一个SKU,就让其值加1 记录入库sku:输入商品对应的skuid、入库数量、入库位置以及经手人留名确认,提交后库存管理表对应的sku的库存数量发生变化 #### 1.3 价格管理 ​ 修改商品对应的sku价格,可选择按商品种类批量打折,也可选择特定商品打折 #### 1.4 商品种类管理 ​ 根据种类标签,区分商品种类 ### 2. 用户管理 #### 2.1 添加用户(web端不做) 根据输入的必要信息,创建用户,并把登录令牌发给前端 #### 2.2 用户升级(web端不做) ​ 每次完成一笔订单后,根据消费额、佣金,检查是否达到升级要求,若是则提升用户等级,并调用优惠券发放函数,发送返回提示 #### 2.3 用户实名认证 ​ 检查用户发过来的认证请求,点击确认 ### 3. 优惠券管理 #### 3.1 活动发布 点击发布活动按钮,创建活动标识码,然后添加活动描述。然后实现活动:选定能参与该活动的商品种类,再设置活动规则,如满多少减多少、超多少打折、直接折扣等。 活动发布后,会在商品信息表中检索能参与活动的商品,然后,对这些商品的activity属性写上活动标签。 在封装商品对象的时候,会根据活动标签生成相应的满减条目,如满多少减多少之类的,同时现价会以计算后的价格显示。然后再发给前端,前端获取商品数据后,会进一步根据用户的消费券信息,额外显示能买到商品的最低价格。 #### 3.2 优惠券设计 管理员点击新建优惠券,设定优惠券名称、优惠券有效期和功能描述。功能描述可能有:满多少减多少、哪一类商品定额减免、哪一类商品打几折。 设计好优惠券后,程序员根据需求设计函数,实现这些优惠券的功能,并把函数和优惠券的id一一对应。 #### 3.3 优惠券发放 管理员选择发放优惠券类型、发放数量和发放人群,然后提交发放请求,这是指定用户会收到这些优惠券。 在用户升级时,也会调用优惠券发放方法,发送指定类型和指定数量。 ### 4. 订单管理 #### 4.1 物流管理 在该页面中**管理员只需在发货后填入物流单号即可**。若与物流公司签订了合约,则可以在订单完成支付后由物流公司自动生成物流单号,并将物流单号返回给订单管理服务,同时业务员等待物流公司上门揽件。(应该技术可行) 用户发起订单,并完成支付后,后台管理员就要进行发货操作了。此时管理员应寄出商品,并填入物流单号,同时订单状态会修改为在途中。用户签收后,物流信息会刷新,此时订单状态也会修改为已签收。若在法定时间内用户不退货,则该订单关闭,并记上订单是第几次购买,否则进入退货管理流程。 #### 4.2 售后管理 ##### 4.1 退货管理 ​ 用户填写相关信息,发起退款。此时系统管理员会看到新的退货发起请求,并选择是否同意(超时未处理自动同意)。若同意则等待用户填写物流单号,管理员可以根据物流单号查询到订单状态。若已经到货并检查无误,则确认退货成功,订单关闭,并退款(szj已实现该功能) ##### 4.2 发票管理 ##### 4.3 评论管理 ### 5. 经营数据收集 还是直接调用sql吧 ### ## Ⅲ服务器模型 ### 1. 后端分层 - Controller:参数校验、处理异常,轻业务逻辑甚至不写业务逻辑 - Service:实现具体的业务,一般地每个controller对应一个service - Manager:可复用逻辑层,如联表查询,属于扩展部分 - DataAccess:创建数据库实例,将数据库转成对象 ​ 在上面四层(其实主要是三层)结构中,Controller作为作为http请求的接收者,负责传入数据、参数检验、调用服务和传回数据,Service负责处理业务请求;Manager属于Service的扩展部分,集成一些服务中常用的功能、第三方接口调用等;DataAccess层创建数据库实例,处理service、manager对数据库的增删改查操作。包括打开数据库、关闭数据库、打开某表、关闭某表等。 ### 2. 服务接口(Controller) #### 2.1. 小程序端 用户信息 - POST api/my/users/wxlogin:微信用户登录,发送code,返回token - POST api/my/users/wxcreate:创建新用户,发送用户基本信息、手机号,返回用户注册状态 - POST api/my/users/auth:实名认证,发送实名信息,返回ok - GET api/my/users/userinfo:获取用户信息,返回用户静态信息,包括等级、实名认证状态 订单 - GET api/my/order/list:查看全部订单,返回用户历史订单列表,每个订单显示状态、商品等信息 - POST api/my/order/check:查看订单详情,发送order_id,返回详细信息,如订单状态 - [^GET api/my/order/prepay:准备支付订单,发送sku_id,返回订单号order_id]: 可能不需要 - POST api/my/order/pay:支付订单,发送支付信息,返回ok 售后 - POST api/my/order/refund:提交退款请求,发送order_id、退款原因,返回ok - POST api/my/order/review:发表评论,发送Order_ID、评论信息,返回ok - POST api/my/order/receipts:输入发票抬头信息,获取发票 收藏 - GET api/my/collect/list:查看所有收藏,返回收藏商品列表 - POST api/my/collect/change:修改收藏状态,发送Pro_ID、修改值,返回ok 卡包 - GET api/my/cards:返回卡包,包括每张卡券的状态、有效期 地址管理 - GET api/my/address/list: 返回用户保存的地址 - POST api/my/address/change:提交修改地址,返回ok 商品信息 - GET api/public/goods/list:根据推荐算法,返回商品列表 - GET api/public/goods/search:查找商品,输入查找关键字,返回对应商品Pro_idnavigator - GET api/public/goods/detail:查看商品详情,发送Pro_id,返回商品详情 #### 2.2. Web端 商品管理 - POST api/admin/goods/create:创建商品 - POST api/admin/goods/price:价格管理 - POST api/admin/goods/inventory:添加商品库存 - GET||PUT||DELETE api/admin/goods/quick:对商品直接删改查 - GET api/admin/goods/list:查看全部 用户管理 - PUT api/admin/users/auth:通过实名认证 - GET||PUT||DELETE api/admin/users/quick:对用户直接删改查 - GET api/admin/users/list:查看全部 优惠券管理 - POST api/admin/coupons/activity: 发布新活动,发送活动的参数,(服务中对特定商品进行折扣并打上活动标签,可能需要**加个活动表**) - POST api/admin/coupons/design:发布新券,发送券的参数,(需要有配套的服务计算被打折的商品的优惠价)并将优惠券信息保存在数据库中 - POST api/admin/coupons/issue(v.签发):向特定用户发放优惠券 - GET api/admin/coupons/list:查看全部券 - GET api/admin/cards/list:查看全部卡包 ### 3. 服务层(Service) - ### 4. 复用层(Manager) ### 5. 数据访问层(uAccess) uAccess功能及使用说明: uAccess是对数据库上下文和对象查询的简单封装,实现数据库到内存模型(Model)的映射,提供基于对象的增、删、改、查等广泛的操作,并将操作的结果(增、删、改)持久化到数据库。“持久化”(Persistence)是把数据(如内存中的对象)保存到可永久保存的存储设备中,主要应用是将内存中的数据存储在关系型的数据库中,也可以存储在json/XML数据文件中。 uAccess所提供的操作方式如下: **1、创建操作对象** `var op = new Services("city");` Services 是类的名称 `` 是待操作的对象的实体模型, ("city") 是Web.Config文件中,定义的数据库连接名,也直接可以用连接字符串,缺省连接名称是:Students **2、op对象中的方法** 目前提供了常用的基本操作,方法扩重后会及时更新 **增删改操作** 首先实例化一个实体对象,作为增删改的数据 `var st = new Student(){ID=10,Name="张三",Sex="男",Age=25}` 或者 `var st = new Student(){ID=10,Name="张三",Sex="男",Age=25}` //如果ID是自增列 Student 是实体类,st 是Student 类的一个对象。 `op.Add(st);` 将st对象添加到Student实体类映射(对应)的数据库表中,返回含有自增列ID值的对象 `op.Update(st, id);` 用st对象更新指定id的行数据 `Delete(int id);` 删除Student实体类映射(对应)的数据库表中指定的行id **数据查询** `op.GetAll();` 查询表Student实体类映射的数据库表中所有值 `GetAll(seleWhere);` 按条件查询表Student实体类映射的数据库表中值,如:op.GetAll(c => c.Name.Contains('李娟')) `op.Get(id);` 按主键查找,id为主键的值,可以是整数或字符串 `op.GetFirst(seleWhere);` 按条件查询表Student实体类映射的数据库表中满足条件是第一个值,如:`op.GetLast(c => c.Name.Contains('李娟'))` `op.GetLast(seleWhere);` 按条件查询表Student实体类映射的数据库表中满足条件是第一个值,如:`op.GetLast(c => c.Name.Contains('李娟'))` `op.GetCount();` 查询表Student实体类映射的数据库表中的记录行数,如: `op.GetCount()` `op.GetCount(seleWhere);` 查询表Student实体类映射的数据库表中的满足条件的记录行数,如:`op.GetCount(c => c.Age >= 20)` `GetPageList(int pageIndex, int pageSize)`, 分页查询表Student实体类映射的数据库表中的记录,返回当前页的数据集合,`int pageIndex` 起始页号, `int pageSize` 每页的行数 ## Ⅳ关键技术细节 - ### 订单号生成算法 年月日时分秒微秒+随机码(2)+流水号+随机码(3), redis的incr命令(推荐):可读性好,纯数字,不会太长。 - ### 分享链接 用户注册时页面会携带参数,该参数和分享者的openid相关。若该值为空,则该值不会传过去。因为获取手机号是注册最后环节,所以这个时候也要把邀请人信息发过去。 现在问题是:如何在分享连接中携带邀请人信息?用何种数据能够指示该邀请人是谁? - ### 图片保存方式 - ### 服务 ### 举例 - `https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata` - ```json { "message": [ { "image_src": "https://api-hmugo-web.itheima.net/pyg/banner1.png", "open_type": "navigate", "goods_id": 129, "navigator_url": "/pages/goods_detail/index?goods_id=129" } ], "meta": { "msg": "获取成功", "status": 200 } } ``` - `https://api-hmugo-web.itheima.net/api/public/v1/users/wxlogin` - ```json { "message": { "user_id": 23, "user_email_code": null, "is_active": null, "user_sex": "男", "user_qq": "", "user_tel": "", "user_xueli": "本科", "user_hobby": "", "user_introduce": null, "create_time": 1562221487, "update_time": 1562221487, "token": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjIzLCJpYXQiOjE1NjQ3MzAwNzksImV4cCI6MTAwMTU2NDczMDA3OH0.YPt-XeLnjV-_1ITaXGY2FhxmCe4NvXuRnRB8OMCfnPo" }, "meta": { "msg": "登录成功", "status": 200 } } ``` - `https://api-hmugo-web.itheima.net/api/public/v1/my/orders/req_unifiedorder` - ```json { "message": [ { "image_src": "https://api-hmugo-web.itheima.net/pyg/banner1.png", "open_type": "navigate", "goods_id": 129, "navigator_url": "/pages/goods_detail/index?goods_id=129" } ], "meta": { "msg": "获取成功", "status": 200 } } ```