# elm-springboot **Repository Path**: liu-jingzong/elm--springboot ## Basic Information - **Project Name**: elm-springboot - **Description**: 软件工程实践项目四--使用SpringBoot 重构后端 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-09-05 - **Last Updated**: 2025-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 中级实践积分模块 ### 数据库设计 | 表名称 |类型| 说明 | | :-------: | :-:|:----: | | creditId | int |积分ID(主键,自增) | | userId | varchar |用户ID(外键) | | channelType |int| 存储积分变化的类型(0为下单返利,1为兑换消耗,2为活动赠送等) | | num|int|积分数目(正表示增加、负表示减少)| |createTime|datetime|积分增加或减少的时间| |expiredTime|datetime|积分过期的时间(积分减少时此项为空)| 当前积分表(记录当前还未过期的积分) | 表名称 |类型| 说明 | | :-------: |:-: |:----: | | creditId | int |积分ID(主键,自增) | | userId | varchar |用户ID(外键) | | channelType |int| 存储积分变化的类型 | | num|int|积分数目(只有正值)| |createTime|datetime|积分增加或减少的时间| |expiredTime|datetime|积分过期的时间| |deleted|int|1表示该条记录已经删除,0表示为删除| 积分从发放开始7日后内有效。如2022-11-23 14:06:52发放积分,过期时间为2022-11-30 23:59:59 主要目的是为了便于处理一个复杂情况:(优先消费快过期积分) 如当前用户有 1000积分 12月1日过期 500积分 12月3日过期 200积分 12月5日过期 共1700积分 若用户在11月30日花费1600积分 则在 12月4日的查询结果应为: 100积分 12月5日过期 在12月6日的查询结果应为 0积分 ### 接口设计 1. get方法+Credit/totalNum 参数:userId 返回值:int 功能:获得当前用户的全部可用积分数目 2. get方法+Credit/availableCredit 参数:userId 返回值:credit 数组 功能:获得当前用户的全部可用积分明细 3. get方法+Credit/userId 参数:userId 返回值:credit 数组 功能:获得当前用户的全部积分流水明细 4. get方法+Credit/channelType 参数:userId、channelType 返回值:credit 数组 功能:获得当前用户指定类型的全部积分流水明细 5. post方法+Credit/userId 参数:userId、channelType 、num 返回值:int 功能:向积分流水表中添加一条记录(注意前端要判断,不能使消费积分大于当前积分) # 中级实践虚拟钱包模块 ### 数据库设计 virtualwallet表:存储用户虚拟钱包信息 ![输入图片说明](pic/img.png) bvirtualwallet表:存储商家虚拟钱包信息 ![输入图片说明](pic/img_1.png) virtualwallettransaction表:存储交易流水信息 ![输入图片说明](pic/img_2.png) bankcard表:存储银行卡信息 ![输入图片说明](pic/img_3.png) ### 接口设计 1. Get + VirtualWallet/UserId 参数:userId 返回值:VirtualWallet对象 功能:根据用户Id查询用户虚拟钱包 2. Get + VirtualWallet/WalletId 参数:walletId 返回值:balance(账户余额) 功能:根据虚拟钱包Id查询余额 3. Post + VirtualWallet/FromWalletId 参数:walletId,amount 返回值:int(0代表失败,1代表成功) 功能:虚拟钱包提现 4. Post + VirtualWallet/ToWalletId 参数:walletId,amount 返回值:int(0代表失败,1代表成功) 功能:虚拟钱包充值 5. Post + VirtualWallet/WalletId 参数:fromWalletId,toWalletId,amount,orderId 返回值:int(0代表失败,1代表成功) 功能:虚拟钱包支付 6. Get + VirtualWalletTransaction/WalletId 参数:walletId 返回值:VirtualWalletTransaction数组 功能:根据虚拟钱包编号查询相应的交易记录 7. Post+BankCard/CardId 参数:cardId, userName, bankName, walletId 返回值:int(影响的行数) 功能:添加银行卡 8. Get+BankCard/WalletId 参数:walletId 返回值:BankCard数组 功能:根据虚拟钱包Id查询银行卡 9. Get + BVirtualWallet/BusinessId 参数:businessId 返回值:BVirtualWallet对象 功能:根据商家Id查询商家虚拟钱包 # 项目四后端 ## 项目需求 本项目参照 “饿了么官网网页版”制作。本项目专注于完成点餐业务线功能,“饿了么官网”中的其它功能暂不涉及。 以下内容大致概括了本系统的项目需求: (1)用户信息管理:在用户进入系统前要求客户进行登录,未注册的用户需要注册后方可登录。登录时需要对用户Id和密码进行 校验,正确后即可登录。 (2)商家信息管理:向用户提供商家名称、地址、图片以及食物等相关信息。 (3)购物车及订单管理:允许用户向购物车中添加或删除食物,并生成相关订单。 (4)用户地址管理:一个用户可以拥有多个收货地址并对地址进行修改,保存。 ## 业务流程 项目的具体流程如下图所示。 ![输入图片说明](pic/BPF.png) ## 项目设计 ### 数据库设计 项目三、四数据库的设计与数据相同,且与参考文件保持一致,故本文不再赘述。 ### 架构设计与UML图 项目采用MVC架构设计如下图所示。 ![输入图片说明](pic/MVC.png) 项目三、四基于Servlet的简易MVC架构,采用约定优于配置的原则来搭建简易MVC框架。 项目三、四的分层结构基本相同,其中数据库连接层在项目三中为Dao层,在项目四中为Mapper层。 Controller层UML图如下图所示。 ![输入图片说明](pic/controller.png) Service层UML图如下图所示。 ![输入图片说明](pic/service.png) Dao/Mapper层UML图如下图所示。 ![输入图片说明](pic/dao.png) ## 接口设计 与参考视频中的接口设计不同,我们设计了RESTful风格的接口。 RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。多人协作时,统一风格,可提高沟通效率。 ### business (1)get+Business/OrderTypeId 参数:orderTypeId 返回值:business数组 功能:根据点餐分类编号查询所属商家信息 (2)get+Business/BusinessId 参数:businessId 返回值:business对象 功能:根据商家编号查询商家信息 ### food (1)get方法+Food/BusinessId 参数:businessId 返回值:food数组 功能:根据商家编号查询所属食品信息 ### cart (1)get+Cart/CartList 参数:userId、businessId(可选) 返回值:cart数组(多对一:所属商家信息、所属食品信息) 功能:根据用户编号查询此用户所有购物车信息;根据用户编号和商家编号,查询此用户购物车中某个商家的所有购物车信息 (2)post+Cart/Order 参数:userId、businessId、foodId 返回值:int(影响的行数) 功能:向购物车表中添加一条记录 参数:userId、businessId、foodId、quantity 返回值:int(影响的行数) 功能:根据用户编号、商家编号、食品编号更新数 (3)put+Cart/Order 参数:userId、businessId、foodId、quantity 返回值:int(影响的行数) 功能:根据用户编号、商家编号、食品编号更新数量 (4)delete+Cart/Order 参数:userId、businessId、foodId(可选) 返回值:int(影响的行数) 功能:根据用户编号、商家编号、食品编号删除购物车表中的一条食品记录;根据用户编号、商家编号删除购物车表中的多条条记录 ### deliveryAddress (1)get+DeliveryAddress/UserId 参数:userId 返回值:deliveryAddress数组 功能:根据用户编号查询所属送货地址 (2)get+DeliveryAddress/DaId 参数:daId 返回值:deliveryAddress对象 功能:根据送货地址编号查询送货地址 (3)post+DeliveryAddress/DaId 参数:contactName、contactSex、contactTel、address、userId 返回值:int(影响的行数) 功能:向送货地址表中添加一条记录 (4)put+DeliveryAddress/DaId 参数:daId、contactName、contactSex、contactTel、address、userId 返回值:int(影响的行数) 功能:根据送货地址编号更新送货地址信息 (5)delete+DeliveryAddress/DaId 参数:daId 返回值:int(影响的行数) 功能:根据送货地址编号删除一条记录 ### orders (1)post+Orders/OrdersId 参数:userId、businessId、daId、orderTotal 返回值:int(订单编号) 功能:根据用户编号、商家编号、订单总金额、送货地址编号向订单表中添加一条记录, 并获取自动生成的订单编号, 然后根据用户编号、商家编号从购物车表中查询所有数据,批量添加到订单明细表中, 然后根据用户编号、商家编号删除购物车表中的数据。 (2)get+Orders/OrdersId 参数:orderId 返回值:orders对象(包括多对一:商家信息; 一对多:订单明细信息) 功能:根据订单编号查询订单信息,包括所属商家信息,和此订单的所有订单明细信息 (3)get+Orders/userId 参数:userId 返回值:orders数组(包括多对一:商家信息; 一对多:订单明细信息) 功能:根据用户编号查询此用户的所有订单信息 ### user (1)get+User/Login 参数:userId、password 返回值:user对象 功能:根据用户编号与密码查询用户信息 (2)get+User/UserId 参数:userId 返回值:int(返回行数) 功能:根据用户编号查询用户表返回的行数 (3)post+User/UserId 参数:userId、password、userName、userSex 返回值:int(影响的行数) 功能:向用户表中添加一条记录 ## 项目测试 利用postman对接口进行测试,若能正确返回结果,则表明接口实现正确。如下图所示。 ![输入图片说明](pic/postman.png)