飞道的博客

手办商城系统|Springboot+vue+ElementUI手办商城系统

263人阅读  评论(0)

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-SC-040

一,项目简介

基于SpringBoot手办周边系统功能结构图如图3-1所示:

图1-1 功能结构图

本项目基于Spring Boot+Vue搭建的前后端分离手办周边商城系统主要有用户管理功能、商品管理功能、购物车管理功能、订单管理功能、角色管理功能等,一共分为七个大的核心模块:

前台管理系统:

(1)用户功能模块:用户可以进行登录注册与注销操作,并且可以对个人信息进行响应的修改。

(2)手办功能模块:用户可以搜索查看自己想要的手办,也可以点击手办进行查看手办的详细信息。

(3)购物车管理模块:用户可以把自己感兴趣的商品加入购物车,点击购物车查看购物车信息,可以的对购物车内的商品进行修改,用账号余额对购物车进行结算。

(4)订单功能模块:用户点击订单查看自己的所有订单信息,看到当前订单状态,对已完成的订单进行评价。

后台管理系统:

(5)用户管理模块:管理员可以对普通用户信息进行相应的增删改查操作。

(6)手办资讯管理:管理员可以对商品资讯进行相应的增删改查操作,向用户进行商品推荐。

(7)商品管理模块:管理员可以对商品的信息进行修改,增加新的商品,删除掉不用的商品。

(8)轮播图管理模块:管理员可以对轮播图的信息进行修改,增加新的轮播图,根据优惠在首页显示推荐商品轮播图,实时修改轮播图信息。

 

本系统采用B/S架构进行设计,主要针对PC端用户使用的,不需要专门的客户端,只需要浏览器就能使用,所以对于其他架构来说方便就是它的优势。它是跨平台的,是基于网页语言的、操作系统对其没有太大的影响。系统架构设计图如下图4-1所示:

图2-1 系统架构设计图

 

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:Springboot+Mybatis

前台开发技术:Vue+nodejs+ElementUI

特色:支付宝沙箱支付、前后端分离开发

三,系统展示

3.1 前端功能实现

商城首页

 

商品信息

 

商品资讯

 

商品详情

 

购物车

下单

我的订单

个人中心

支付宝沙箱在线充值

个人后台管理

 

3.2 后端功能实现

管理员登陆

 

用户管理

 

商品分类管理

商品信息管理

订单评价管理

轮播图管理

商品资讯管理

订单管理

四,核心代码展示


  
  1. package com.controller;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Calendar;
  6. import java.util.Map;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.Date;
  10. import java.util.List;
  11. import javax.servlet.http.HttpServletRequest;
  12. import com.utils.ValidatorUtils;
  13. import org.apache.commons.lang3.StringUtils;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.format.annotation.DateTimeFormat;
  16. import org.springframework.web.bind.annotation.PathVariable;
  17. import org.springframework.web.bind.annotation.RequestBody;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import com.baomidou.mybatisplus.mapper.EntityWrapper;
  22. import com.baomidou.mybatisplus.mapper.Wrapper;
  23. import com.annotation.IgnoreAuth;
  24. import com.entity.CartEntity;
  25. import com.entity.view.CartView;
  26. import com.service.CartService;
  27. import com.service.TokenService;
  28. import com.utils.PageUtils;
  29. import com.utils.R;
  30. import com.utils.MD5Util;
  31. import com.utils.MPUtil;
  32. import com.utils.CommonUtil;
  33. /**
  34. * 购物车表
  35. * 后端接口
  36. * @author
  37. * @email
  38. * @date 2021-03-13 12:49:52
  39. */
  40. @RestController
  41. @RequestMapping("/cart")
  42. public class CartController {
  43. @Autowired
  44. private CartService cartService;
  45. /**
  46. * 后端列表
  47. */
  48. @RequestMapping("/page")
  49. public R page (@RequestParam Map<String, Object> params,CartEntity cart,
  50. HttpServletRequest request){
  51. if(!request.getSession().getAttribute( "role").toString().equals( "管理员")) {
  52. cart.setUserid((Long)request.getSession().getAttribute( "userId"));
  53. }
  54. EntityWrapper<CartEntity> ew = new EntityWrapper<CartEntity>();
  55. PageUtils page = cartService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, cart), params), params));
  56. return R.ok().put( "data", page);
  57. }
  58. /**
  59. * 前端列表
  60. */
  61. @RequestMapping("/list")
  62. public R list (@RequestParam Map<String, Object> params,CartEntity cart, HttpServletRequest request){
  63. EntityWrapper<CartEntity> ew = new EntityWrapper<CartEntity>();
  64. PageUtils page = cartService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, cart), params), params));
  65. return R.ok().put( "data", page);
  66. }
  67. /**
  68. * 列表
  69. */
  70. @RequestMapping("/lists")
  71. public R list ( CartEntity cart){
  72. EntityWrapper<CartEntity> ew = new EntityWrapper<CartEntity>();
  73. ew.allEq(MPUtil.allEQMapPre( cart, "cart"));
  74. return R.ok().put( "data", cartService.selectListView(ew));
  75. }
  76. /**
  77. * 查询
  78. */
  79. @RequestMapping("/query")
  80. public R query (CartEntity cart){
  81. EntityWrapper< CartEntity> ew = new EntityWrapper< CartEntity>();
  82. ew.allEq(MPUtil.allEQMapPre( cart, "cart"));
  83. CartView cartView = cartService.selectView(ew);
  84. return R.ok( "查询购物车表成功").put( "data", cartView);
  85. }
  86. /**
  87. * 后端详情
  88. */
  89. @RequestMapping("/info/{id}")
  90. public R info (@PathVariable("id") Long id){
  91. CartEntity cart = cartService.selectById(id);
  92. return R.ok().put( "data", cart);
  93. }
  94. /**
  95. * 前端详情
  96. */
  97. @RequestMapping("/detail/{id}")
  98. public R detail (@PathVariable("id") Long id){
  99. CartEntity cart = cartService.selectById(id);
  100. return R.ok().put( "data", cart);
  101. }
  102. /**
  103. * 后端保存
  104. */
  105. @RequestMapping("/save")
  106. public R save (@RequestBody CartEntity cart, HttpServletRequest request){
  107. cart.setId( new Date().getTime()+ new Double(Math.floor(Math.random()* 1000)).longValue());
  108. //ValidatorUtils.validateEntity(cart);
  109. cart.setUserid((Long)request.getSession().getAttribute( "userId"));
  110. cartService.insert(cart);
  111. return R.ok();
  112. }
  113. /**
  114. * 前端保存
  115. */
  116. @RequestMapping("/add")
  117. public R add (@RequestBody CartEntity cart, HttpServletRequest request){
  118. cart.setId( new Date().getTime()+ new Double(Math.floor(Math.random()* 1000)).longValue());
  119. //ValidatorUtils.validateEntity(cart);
  120. cartService.insert(cart);
  121. return R.ok();
  122. }
  123. /**
  124. * 修改
  125. */
  126. @RequestMapping("/update")
  127. public R update (@RequestBody CartEntity cart, HttpServletRequest request){
  128. //ValidatorUtils.validateEntity(cart);
  129. cartService.updateById(cart); //全部更新
  130. return R.ok();
  131. }
  132. /**
  133. * 删除
  134. */
  135. @RequestMapping("/delete")
  136. public R delete (@RequestBody Long[] ids){
  137. cartService.deleteBatchIds(Arrays.asList(ids));
  138. return R.ok();
  139. }
  140. /**
  141. * 提醒接口
  142. */
  143. @RequestMapping("/remind/{columnName}/{type}")
  144. public R remindCount (@PathVariable("columnName") String columnName, HttpServletRequest request,
  145. @PathVariable("type") String type, @RequestParam Map<String, Object> map) {
  146. map.put( "column", columnName);
  147. map.put( "type", type);
  148. if(type.equals( "2")) {
  149. SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd");
  150. Calendar c = Calendar.getInstance();
  151. Date remindStartDate = null;
  152. Date remindEndDate = null;
  153. if(map.get( "remindstart")!= null) {
  154. Integer remindStart = Integer.parseInt(map.get( "remindstart").toString());
  155. c.setTime( new Date());
  156. c.add(Calendar.DAY_OF_MONTH,remindStart);
  157. remindStartDate = c.getTime();
  158. map.put( "remindstart", sdf.format(remindStartDate));
  159. }
  160. if(map.get( "remindend")!= null) {
  161. Integer remindEnd = Integer.parseInt(map.get( "remindend").toString());
  162. c.setTime( new Date());
  163. c.add(Calendar.DAY_OF_MONTH,remindEnd);
  164. remindEndDate = c.getTime();
  165. map.put( "remindend", sdf.format(remindEndDate));
  166. }
  167. }
  168. Wrapper<CartEntity> wrapper = new EntityWrapper<CartEntity>();
  169. if(map.get( "remindstart")!= null) {
  170. wrapper.ge(columnName, map.get( "remindstart"));
  171. }
  172. if(map.get( "remindend")!= null) {
  173. wrapper.le(columnName, map.get( "remindend"));
  174. }
  175. if(!request.getSession().getAttribute( "role").toString().equals( "管理员")) {
  176. wrapper.eq( "userid", (Long)request.getSession().getAttribute( "userId"));
  177. }
  178. int count = cartService.selectCount(wrapper);
  179. return R.ok().put( "count", count);
  180. }
  181. }


  
  1. package com.controller;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.json.JSONObject;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.util.ResourceUtils;
  16. import org.springframework.web.bind.annotation.PathVariable;
  17. import org.springframework.web.bind.annotation.RequestBody;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import com.annotation.IgnoreAuth;
  22. import com.baidu.aip.face.AipFace;
  23. import com.baidu.aip.face.MatchRequest;
  24. import com.baidu.aip.util.Base64Util;
  25. import com.baomidou.mybatisplus.mapper.EntityWrapper;
  26. import com.baomidou.mybatisplus.mapper.Wrapper;
  27. import com.entity.ConfigEntity;
  28. import com.service.CommonService;
  29. import com.service.ConfigService;
  30. import com.utils.BaiduUtil;
  31. import com.utils.FileUtil;
  32. import com.utils.R;
  33. /**
  34. * 通用接口
  35. */
  36. @RestController
  37. public class CommonController{
  38. @Autowired
  39. private CommonService commonService;
  40. @Autowired
  41. private ConfigService configService;
  42. private static AipFace client = null;
  43. private static String BAIDU_DITU_AK = null;
  44. @RequestMapping("/location")
  45. public R location (String lng,String lat) {
  46. if(BAIDU_DITU_AK== null) {
  47. BAIDU_DITU_AK = configService.selectOne( new EntityWrapper<ConfigEntity>().eq( "name", "baidu_ditu_ak")).getValue();
  48. if(BAIDU_DITU_AK== null) {
  49. return R.error( "请在配置管理中正确配置baidu_ditu_ak");
  50. }
  51. }
  52. Map<String, String> map = BaiduUtil.getCityByLonLat(BAIDU_DITU_AK, lng, lat);
  53. return R.ok().put( "data", map);
  54. }
  55. /**
  56. * 人脸比对
  57. *
  58. * @param face1 人脸1
  59. * @param face2 人脸2
  60. * @return
  61. */
  62. @RequestMapping("/matchFace")
  63. public R matchFace (String face1, String face2) {
  64. if(client== null) {
  65. /*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
  66. String APIKey = configService.selectOne( new EntityWrapper<ConfigEntity>().eq( "name", "APIKey")).getValue();
  67. String SecretKey = configService.selectOne( new EntityWrapper<ConfigEntity>().eq( "name", "SecretKey")).getValue();
  68. String token = BaiduUtil.getAuth(APIKey, SecretKey);
  69. if(token== null) {
  70. return R.error( "请在配置管理中正确配置APIKey和SecretKey");
  71. }
  72. client = new AipFace( null, APIKey, SecretKey);
  73. client.setConnectionTimeoutInMillis( 2000);
  74. client.setSocketTimeoutInMillis( 60000);
  75. }
  76. JSONObject res = null;
  77. try {
  78. File file1 = new File(ResourceUtils.getFile( "classpath:static/upload").getAbsolutePath()+ "/"+face1);
  79. File file2 = new File(ResourceUtils.getFile( "classpath:static/upload").getAbsolutePath()+ "/"+face2);
  80. String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
  81. String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
  82. MatchRequest req1 = new MatchRequest(img1, "BASE64");
  83. MatchRequest req2 = new MatchRequest(img2, "BASE64");
  84. ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
  85. requests.add(req1);
  86. requests.add(req2);
  87. res = client.match(requests);
  88. System.out.println(res.get( "result"));
  89. } catch (FileNotFoundException e) {
  90. e.printStackTrace();
  91. return R.error( "文件不存在");
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. return R.ok().put( "data", com.alibaba.fastjson.JSONObject.parse(res.get( "result").toString()));
  96. }
  97. /**
  98. * 获取table表中的column列表(联动接口)
  99. * @param table
  100. * @param column
  101. * @return
  102. */
  103. @IgnoreAuth
  104. @RequestMapping("/option/{tableName}/{columnName}")
  105. public R getOption (@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
  106. Map<String, Object> params = new HashMap<String, Object>();
  107. params.put( "table", tableName);
  108. params.put( "column", columnName);
  109. if(StringUtils.isNotBlank(level)) {
  110. params.put( "level", level);
  111. }
  112. if(StringUtils.isNotBlank(parent)) {
  113. params.put( "parent", parent);
  114. }
  115. List<String> data = commonService.getOption(params);
  116. return R.ok().put( "data", data);
  117. }
  118. /**
  119. * 根据table中的column获取单条记录
  120. * @param table
  121. * @param column
  122. * @return
  123. */
  124. @IgnoreAuth
  125. @RequestMapping("/follow/{tableName}/{columnName}")
  126. public R getFollowByOption (@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
  127. Map<String, Object> params = new HashMap<String, Object>();
  128. params.put( "table", tableName);
  129. params.put( "column", columnName);
  130. params.put( "columnValue", columnValue);
  131. Map<String, Object> result = commonService.getFollowByOption(params);
  132. return R.ok().put( "data", result);
  133. }
  134. /**
  135. * 修改table表的sfsh状态
  136. * @param table
  137. * @param map
  138. * @return
  139. */
  140. @RequestMapping("/sh/{tableName}")
  141. public R sh (@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
  142. map.put( "table", tableName);
  143. commonService.sh(map);
  144. return R.ok();
  145. }
  146. /**
  147. * 获取需要提醒的记录数
  148. * @param tableName
  149. * @param columnName
  150. * @param type 1:数字 2:日期
  151. * @param map
  152. * @return
  153. */
  154. @IgnoreAuth
  155. @RequestMapping("/remind/{tableName}/{columnName}/{type}")
  156. public R remindCount (@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,
  157. @PathVariable("type") String type, @RequestParam Map<String, Object> map) {
  158. map.put( "table", tableName);
  159. map.put( "column", columnName);
  160. map.put( "type", type);
  161. if(type.equals( "2")) {
  162. SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd");
  163. Calendar c = Calendar.getInstance();
  164. Date remindStartDate = null;
  165. Date remindEndDate = null;
  166. if(map.get( "remindstart")!= null) {
  167. Integer remindStart = Integer.parseInt(map.get( "remindstart").toString());
  168. c.setTime( new Date());
  169. c.add(Calendar.DAY_OF_MONTH,remindStart);
  170. remindStartDate = c.getTime();
  171. map.put( "remindstart", sdf.format(remindStartDate));
  172. }
  173. if(map.get( "remindend")!= null) {
  174. Integer remindEnd = Integer.parseInt(map.get( "remindend").toString());
  175. c.setTime( new Date());
  176. c.add(Calendar.DAY_OF_MONTH,remindEnd);
  177. remindEndDate = c.getTime();
  178. map.put( "remindend", sdf.format(remindEndDate));
  179. }
  180. }
  181. int count = commonService.remindCount(map);
  182. return R.ok().put( "count", count);
  183. }
  184. /**
  185. * 单列求和
  186. */
  187. @IgnoreAuth
  188. @RequestMapping("/cal/{tableName}/{columnName}")
  189. public R cal (@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
  190. Map<String, Object> params = new HashMap<String, Object>();
  191. params.put( "table", tableName);
  192. params.put( "column", columnName);
  193. Map<String, Object> result = commonService.selectCal(params);
  194. return R.ok().put( "data", result);
  195. }
  196. /**
  197. * 分组统计
  198. */
  199. @IgnoreAuth
  200. @RequestMapping("/group/{tableName}/{columnName}")
  201. public R group (@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
  202. Map<String, Object> params = new HashMap<String, Object>();
  203. params.put( "table", tableName);
  204. params.put( "column", columnName);
  205. List<Map<String, Object>> result = commonService.selectGroup(params);
  206. return R.ok().put( "data", result);
  207. }
  208. /**
  209. * (按值统计)
  210. */
  211. @IgnoreAuth
  212. @RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
  213. public R value (@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
  214. Map<String, Object> params = new HashMap<String, Object>();
  215. params.put( "table", tableName);
  216. params.put( "xColumn", xColumnName);
  217. params.put( "yColumn", yColumnName);
  218. List<Map<String, Object>> result = commonService.selectValue(params);
  219. SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd");
  220. for(Map<String, Object> m : result) {
  221. for(String k : m.keySet()) {
  222. if(m.get(k) instanceof Date) {
  223. m.put(k, sdf.format((Date)m.get(k)));
  224. }
  225. }
  226. }
  227. return R.ok().put( "data", result);
  228. }
  229. }

五,项目总结

本系统的主要使用对象为手办系统管理员以及消费者,由于消费者主要为年轻人群体,所以对时间的要求不高,没有限制使用的时间。本系统在浏览器运行,需要保证隐私性要强。

时间性:新品手办上架时,可能登录系统的用户较多,需要保证用户操作时服务器反应时间在5秒以内。

运行环境约束:系统可以在IE8以上浏览器平稳运行,可以在不同浏览器运行,对运行的环境要求较低。

易用性需求:本系统页面简介明了易操作,对于众多用户来说可用性较强,不需要进行培训等流程都可以操作。


转载:https://blog.csdn.net/whirlwind526/article/details/128412863
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场