当前位置:   article > 正文

基于springboot高校闲置物品交易系统微信小程序源码和论文_基于springboot的小程序中期报告

基于springboot的小程序中期报告

基于springboot二手物品交易系统微信小程序

  互联网的兴起从本质上改变了整个社会的商品交易方式,国内各大企业从上个世纪 90 年代互联网兴起之时,就产生了通过网络进行销售经营商品的想法。但是由于在互网上企业的信誉难以认证、网络的法规政策不健全、物流不发达等一系列的原因,限制 了网上交易发展的步伐。进入 21 世纪以后,随着整个社会的发展、进步,制约网上交易的各个瓶颈问题逐一被击破,各企业也纷纷的加入到电子商务的洪潮之中。 根据会员企业艾瑞咨询集团的预测,2008年我国网络购物交易将同比增长125.1%, 交易总量将达 1263 亿,形成了中国网络购物的快速增长浪潮 据 CNNIC, 2012 年中国网络购物市场研究发现,近 50%的中国网购用户每周至少网 购一次,网购频率领先于全球平均水平。业界领先的网络效果营销公司爱点击 iClick 今年 8 月重磅发布了《2013 中国网络 购物市场分析报告》,该报告指出 2012 年中国网购用户人均年消费金额达人民币 5,203 元,同比增长 25%,不仅与美国的差距正逐年缩小,并预计于 2015 年超过美国成为全球 第一。对任何品牌商和零售商而言,谁先了解中国网购用户需求,率先在中国网购市场下 手,谁就拥有了胜算。中国互联网协会网络营销工作委员会调查显示,随着国内产业环 境和消费市场的成熟,网络购物将在今年实现更大发展。
  根据以上的各种数据可以看出,网购已经渐渐成为人们的一种生活习惯,甚至已经
发展成人们生活中不可或缺的一部分。网络购物这一消费方式给人们生活带来的变化,
除了购物场所的改变以外,更重要的是大大改变了传统的消费行为习惯,无论是否在网
上购物,上网查看产品的相关信息,已经成为购物决策环节的重要组成部分,这一环节
对购物行为的实际发生起到了至关重要的指导作用。   

演示视频:

【java毕业设计】基于springboot高校闲置物品交易系统微信小程序java二手商城小程序

 

 

 

随着经济的不断发展,随着人们生活水平的不断提高,每天都产生大量的旧的、闲
置的生活用品、学习用品、数码产品以及各种户外用品等。此校园二手交易网站,就是
为了让这些闲置物品得到更有效的利用,为欲售商品者节省了摆摊所需要的时间,为欲
售商品而填小广告者扩展了信息量,为拥有小量商品用户提供了平台。同时,也响应了
党的十八大提出的“低碳节能”生活。

 

 

  1. package com.oyhp.esyu.web;
  2. import cn.hutool.json.JSONObject;
  3. import cn.hutool.json.JSONUtil;
  4. import com.oyhp.esyu.pojo.*;
  5. import com.oyhp.esyu.service.*;
  6. import com.oyhp.esyu.util.Result;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.util.ArrayList;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. @RestController
  14. public class DiscussController {
  15. @Autowired
  16. OrderItemService orderItemService;
  17. @Autowired
  18. DiscussService discussService;
  19. @Autowired
  20. DiscussItemService discussItemService;
  21. @Autowired
  22. OrderService orderService;
  23. @Autowired
  24. UserService userService;
  25. /**创建聊天窗口*/
  26. @PutMapping("/wx/discuss/create/{oid}")
  27. public Object onCreate(@PathVariable("oid")int oid,@RequestBody String type){
  28. System.out.println("type-"+type);
  29. JSONObject typeObj = JSONUtil.parseObj(type);
  30. //根据订单id获取订单项
  31. OrderItem orderItem = orderItemService.getByOrderId(oid);
  32. Discuss discuss = new Discuss();
  33. //买家、卖家、订单号、类型
  34. discuss.setBuser(orderItem.getUser());
  35. discuss.setSuser(orderItem.getProduct().getUser());
  36. discuss.setOrder(orderItem.getOrder());
  37. discuss.setType((String) typeObj.get("type"));
  38. //创建聊天窗口
  39. discussService.add(discuss);
  40. System.out.println(orderItem);
  41. return Result.success(discuss.getId());
  42. }
  43. /**添加聊天项*/
  44. @GetMapping("/wx/discuss/{id}/user/{uid}")
  45. public Object addDiscussItem(@PathVariable("id")int id, @PathVariable("uid")int uid,
  46. @RequestParam("content")String content){
  47. User user = userService.getById(uid);
  48. Discuss discuss = discussService.get(id);
  49. DiscussItem discussItem = new DiscussItem();
  50. discussItem.setDiscuss(discuss);
  51. discussItem.setContent(content);
  52. discussItem.setCreateDate(new Date());
  53. discussItem.setUser(user);
  54. discussItemService.add(discussItem);
  55. return Result.success("发送成功");
  56. }
  57. /**根据窗口id获取聊天窗口*/
  58. @GetMapping("/wx/discuss/{id}")
  59. public Object getDiscuss(@PathVariable("id")int id){
  60. Discuss discuss = discussService.get(id);
  61. //填充订单的订单项 -- 考虑要不要
  62. orderItemService.wxFill(discuss.getOrder());
  63. orderService.removeOrderFromOrderItem(discuss.getOrder());
  64. List<DiscussItem> discussItems = discussItemService.listByDiscuss(discuss);
  65. for (DiscussItem discussItem: discussItems) {
  66. discussItem.setDiscuss(null);
  67. }
  68. discuss.setDiscussItemList(discussItems);
  69. return Result.success(discuss);
  70. }
  71. /**
  72. * 判断是否存在聊天窗口
  73. */
  74. @GetMapping("/wx/discuss/order/{oid}/buser/{buid}/suser/{suid}")
  75. public Object isHasDicuss(@PathVariable("oid")int oid,
  76. @PathVariable("buid")int buid,
  77. @PathVariable("suid")int suid){
  78. Order order = orderService.get(oid);
  79. User buser = userService.getById(buid);
  80. User suser = userService.getById(suid);
  81. Discuss discuss = discussService.getDiscussByOrderAndBuserAndSuser(order,buser,suser);
  82. //不存在聊天项
  83. if(discuss == null){
  84. return Result.fail("不存在聊天窗");
  85. }else{
  86. return Result.success(discuss);
  87. }
  88. }
  89. /**获取用户的聊天窗口和系统信息*/
  90. @GetMapping("/wx/discuss/user/{uid}")
  91. public Object getDiscussByUser(@PathVariable("uid")int uid){
  92. User user = userService.getById(uid);
  93. //聊天信息
  94. List<Discuss> discusses = discussService.listByUser(user);
  95. //系统信息
  96. Discuss systemDiscuss = discussService.get(1);
  97. List<DiscussItem> systemNews = discussItemService.listByDiscuss(systemDiscuss);
  98. for (DiscussItem d:systemNews) {
  99. d.setDiscuss(null);
  100. }
  101. //填充聊天窗中聊天项
  102. discussItemService.fill(discusses);
  103. //移除聊天项中的聊天
  104. discussItemService.removeDiscussFromDiscussItems(discusses);
  105. //产品名称和交易方式
  106. ArrayList<String> productName = new ArrayList<>();
  107. // ArrayList<String> tradeWays = new ArrayList<>();
  108. for (Discuss d:discusses) {
  109. orderItemService.wxFill(d.getOrder());
  110. orderService.removeOrderFromOrderItem(d.getOrder());
  111. productName.add(d.getOrder().getOrderItems().get(0).getProduct().getName());
  112. // tradeWays.add(d.getOrder().getTradeWay());
  113. }
  114. //移除discuss中的order
  115. discussService.removeOrderFromDiscuss(discusses);
  116. HashMap<Object,Object> maps = new HashMap<>();
  117. maps.put("discusses",discusses);
  118. maps.put("productName",productName);
  119. maps.put("systemNews",systemNews);
  120. // maps.put("tradeWays",tradeWays);
  121. return Result.success(maps);
  122. }
  123. }

 

 

 

MySql 是一个关系型数据库管理系统,使用 C 和 C++编写,并使用了多种编译器进
行测试,保证源代码的可移植性;支持
AIX、FreeBSD、HP-UX、Linux、Mac OS 、
NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows 等多种操作系统;为多种编
程语言提供了 API;支持多线程,充分利用 CPU 资源;提供 TCP/IP、ODBC 和 JDBC 等多
种数据库连接途径;可以处理拥有上千万条记录的大型数据库。对于一般的个人使用者
和中小型企业来说,MySql 提供的功能已经绰绰有余,而且由于 MySql 是开放源码软件,
因此可以大大降低总体拥有成本。
  1. package com.oyhp.esyu.web;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import javax.imageio.ImageIO;
  8. import javax.servlet.http.HttpServletRequest;
  9. import com.oyhp.esyu.pojo.Product;
  10. import com.oyhp.esyu.pojo.ProductImage;
  11. import com.oyhp.esyu.service.CategoryService;
  12. import com.oyhp.esyu.service.ProductImageService;
  13. import com.oyhp.esyu.service.ProductService;
  14. import com.oyhp.esyu.util.ImageUtil;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.web.bind.annotation.DeleteMapping;
  17. import org.springframework.web.bind.annotation.GetMapping;
  18. import org.springframework.web.bind.annotation.PathVariable;
  19. import org.springframework.web.bind.annotation.PostMapping;
  20. import org.springframework.web.bind.annotation.RequestParam;
  21. import org.springframework.web.bind.annotation.RestController;
  22. import org.springframework.web.multipart.MultipartFile;
  23. @RestController
  24. public class ProductImageController {
  25. @Autowired
  26. ProductService productService;
  27. @Autowired
  28. ProductImageService productImageService;
  29. @Autowired
  30. CategoryService categoryService;
  31. /**
  32. * 1. 首先访问路径,admin_productImage_list?pid=2, 通过AdminPageController 中的映射,返回 listProductImage.html
  33. * 2. 在listProductImage.html 加载后就获取了参数上的 pid
  34. * 3. 然后自动调用 listSingles 函数
  35. * 4. listSingles 函数用过 axios.js 调用 products/2/productImages?type=single 这个地址
  36. * 5. 步骤4的地址,导致 ProductImageController 的 list 方法被调用
  37. * 6. list 方法里根据参数调用 ProductService的 listSingleProductImages 方法,返回当前产品的单个图片集合
  38. * 7. 这个图片集合返回 json数组
  39. * 8. axios拿到这个json数组就放在 vue的singleProductImages对象上
  40. * 9. vue 把 singleProductImages 通过v-for 遍历在视图上
  41. * 以上就是单个图片的查询,详情图片的查询同理可得就是参数不一样。
  42. */
  43. @GetMapping("/products/{pid}/productImages")
  44. public List<ProductImage> list(@RequestParam("type") String type, @PathVariable("pid") int pid) throws Exception {
  45. Product product = productService.get(pid);
  46. if(ProductImageService.type_single.equals(type)) {
  47. List<ProductImage> singles = productImageService.listSingleProductImages(product);
  48. return singles;
  49. }
  50. else if(ProductImageService.type_detail.equals(type)) {
  51. List<ProductImage> details = productImageService.listDetailProductImages(product);
  52. return details;
  53. }
  54. else {
  55. return new ArrayList<>();
  56. }
  57. }
  58. /**
  59. * 增加产品图片分单个和详情两种,其区别在于增加所提交的type类型不一样。
  60. * 这里就对单个的进行讲解,详情图片的处理同理。
  61. * 1. 选中图片后,会导致 getSingleFile 函数被调用,vue就拿到了文件
  62. * 2. 点击提交按钮会导致addSingle函数被调用
  63. * 3. 与分类上传图片类似, axios,js 上传图片要用 FormData 的方式
  64. * 4. 上传到路径 productImages,并带上type和pid参数
  65. * 5. ProductImageController 的add方法被调用
  66. * 6. 首先根据pid 和 type 创建 ProductImage 对象,并插入数据库
  67. * 7. 然后根据类型指定保存文件的路径:productSingle
  68. * 8. 接着根据产品图片对象的id,作为文件名,把图片保存到对应的位置
  69. * 9. 像分类上传图片一样,要通过 ImageUtil.change2jpg进行类型强制转换,以确保一定是jpg图片
  70. * 10. 如果是单个图片,还要创建 small 和 middle 两种不同大小的图片,用的是 ImageUtil.resizeImage 函数
  71. * 以上就是单个图片的处理。
  72. */
  73. @PostMapping("/productImages")
  74. public Object add(@RequestParam("pid") int pid, @RequestParam("type") String type, MultipartFile image, HttpServletRequest request) throws Exception {
  75. ProductImage bean = new ProductImage();
  76. Product product = productService.get(pid);
  77. bean.setProduct(product);
  78. bean.setType(type);
  79. productImageService.add(bean);
  80. String folder = "img/";
  81. if(ProductImageService.type_single.equals(bean.getType())){
  82. folder +="productSingle";
  83. }
  84. else{
  85. folder +="productDetail";
  86. }
  87. File imageFolder= new File(request.getServletContext().getRealPath(folder));
  88. File file = new File(imageFolder,bean.getId()+".jpg");
  89. String fileName = file.getName();
  90. if(!file.getParentFile().exists())
  91. file.getParentFile().mkdirs();
  92. try {
  93. image.transferTo(file);
  94. BufferedImage img = ImageUtil.change2jpg(file);
  95. ImageIO.write(img, "jpg", file);
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. if(ProductImageService.type_single.equals(bean.getType())){
  100. String imageFolder_small= request.getServletContext().getRealPath("img/productSingle_small");
  101. String imageFolder_middle= request.getServletContext().getRealPath("img/productSingle_middle");
  102. File f_small = new File(imageFolder_small, fileName);
  103. File f_middle = new File(imageFolder_middle, fileName);
  104. f_small.getParentFile().mkdirs();
  105. f_middle.getParentFile().mkdirs();
  106. ImageUtil.resizeImage(file, 56, 56, f_small);
  107. ImageUtil.resizeImage(file, 217, 190, f_middle);
  108. }
  109. return bean;
  110. }
  111. /**
  112. * 1. 点击删除超链
  113. * 2. vue 上的 deleteBean 函数被调用,访问 productImages/id 路径
  114. * 3. ProductImageController的delete方法被调用
  115. * 4. 根据id获取ProductImage 对象
  116. * 5. 借助productImageService,删除数据
  117. * 6. 如果是单个图片,那么删除3张正常,中等,小号图片
  118. * 7. 如果是详情图片,那么删除一张图片
  119. */
  120. @DeleteMapping("/productImages/{id}")
  121. public String delete(@PathVariable("id") int id, HttpServletRequest request) throws Exception {
  122. ProductImage bean = productImageService.get(id);
  123. productImageService.delete(id);
  124. String folder = "img/";
  125. if(ProductImageService.type_single.equals(bean.getType()))
  126. folder +="productSingle";
  127. else
  128. folder +="productDetail";
  129. File imageFolder= new File(request.getServletContext().getRealPath(folder));
  130. File file = new File(imageFolder,bean.getId()+".jpg");
  131. String fileName = file.getName();
  132. file.delete();
  133. if(ProductImageService.type_single.equals(bean.getType())){
  134. String imageFolder_small= request.getServletContext().getRealPath("img/productSingle_small");
  135. String imageFolder_middle= request.getServletContext().getRealPath("img/productSingle_middle");
  136. File f_small = new File(imageFolder_small, fileName);
  137. File f_middle = new File(imageFolder_middle, fileName);
  138. f_small.delete();
  139. f_middle.delete();
  140. }
  141. return null;
  142. }
  143. }

 

 

 

 

  1. package com.oyhp.esyu.web;
  2. import cn.hutool.json.JSONObject;
  3. import cn.hutool.json.JSONUtil;
  4. import com.oyhp.esyu.comparator.*;
  5. import com.oyhp.esyu.pojo.*;
  6. import com.oyhp.esyu.quartz.manager.QuartzJobManager;
  7. import com.oyhp.esyu.quartz.service.QuartzJobService;
  8. import com.oyhp.esyu.service.*;
  9. import com.oyhp.esyu.util.Result;
  10. import com.oyhp.esyu.util.WXProduct;
  11. import com.oyhp.esyu.util.WXUtil;
  12. import org.apache.commons.lang.math.RandomUtils;
  13. import org.quartz.JobKey;
  14. import org.quartz.SchedulerException;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.transaction.annotation.Propagation;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import org.springframework.web.bind.annotation.*;
  19. import org.springframework.web.multipart.MultipartFile;
  20. import javax.annotation.Resource;
  21. import javax.servlet.http.HttpServletRequest;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. /**
  25. * 微信小程序控制器
  26. */
  27. @RestController
  28. public class WXForeController {
  29. @Autowired
  30. UserService userService;
  31. @Autowired
  32. SchoolService schoolService;
  33. @Autowired
  34. ThemeService themeService;
  35. @Autowired
  36. CategoryService categoryService;
  37. @Autowired
  38. ProductService productService;
  39. @Autowired
  40. ProductImageService productImageService;
  41. @Autowired
  42. ReviewService reviewService;
  43. @Autowired
  44. PropertyValueService propertyValueService;
  45. @Autowired
  46. PropertyService propertyService;
  47. @Autowired
  48. AddressService addressService;
  49. @Autowired
  50. OrderItemService orderItemService;
  51. @Autowired
  52. OrderService orderService;
  53. @Autowired
  54. SecondaryCategoryService secondaryCategoryService;
  55. @Autowired
  56. EvaluationService evaluationService;
  57. @Resource
  58. private QuartzJobService quartzJobService;
  59. /**
  60. * 微信小程序登录
  61. * 需要判断用户是否是新用户,根据用户的openid去查是否有这个用户
  62. * 1、有,不做任何动作
  63. * 2、没有,新建用户
  64. * @param userInfo 用户信息,微信传过来的code country province name gender city
  65. * @return 登录成功,返回openid
  66. */
  67. @PostMapping("/wxlogin")
  68. public Object wx_login(@RequestBody User userInfo,HttpServletRequest request){
  69. Map<String,Object> userKeyMap = WXUtil.getOpenidSessionKeyAndToken(userInfo.getCode());
  70. String openid = (String)userKeyMap.get("openid");
  71. //获取了openid保存到userInfo中
  72. userInfo.setOpenid(openid);
  73. System.out.println(userInfo);
  74. //判断拿到数据是否正确
  75. if(openid==null)
  76. return Result.fail("error");
  77. //微信小程序用户是否为第一次登录
  78. if(userService.isLoginFirst(userInfo)){
  79. //随便设置一下院校,默认城市学院
  80. School school = schoolService.get(1);
  81. userInfo.setSchool(school);
  82. userInfo.setCreateDate(new Date());
  83. userInfo.setUpdateDate(new Date());
  84. userService.add(userInfo);
  85. //保存用户头像到服务器,以后不再保存到数据库
  86. String localUrl = request.getServletContext().getRealPath("img/user/")+userInfo.getId()+".jpg";
  87. WXUtil.downloadPicture(userInfo.getAvatarUrl(),localUrl);
  88. }
  89. //返回openid要求小程序端加入到缓存,用户小程序的其它业务,比如发布
  90. return Result.success(openid);
  91. }
  92. /**
  93. * 根据openid获取User信息
  94. * @param user
  95. * @return
  96. */
  97. @PostMapping("/wxUser")
  98. public Object wx_user(@RequestBody User user){
  99. String openid = user.getOpenid();
  100. //判断openid是否有效
  101. if(openid != null){
  102. User my = userService.getUserByOpenid(openid);
  103. //在售商品
  104. my.setOnSellProduct(productService.onSellProduct(my));
  105. //累计交易,我卖出的
  106. List<Product> products = productService.getProductsByUser(my);
  107. my.setOnOrderProduct(orderItemService.onOrderTraded(products));
  108. //我买到的
  109. my.setOnMyBought(orderService.OnOrderProduct(my));
  110. return Result.success(my);
  111. }
  112. else
  113. return Result.fail("用户未登录");
  114. }
  115. /**
  116. * 获取Token访问
  117. * @return
  118. */
  119. @GetMapping("wxAccessToken")
  120. public Object getAccessToken(){
  121. return Result.success(WXUtil.getAccessToken());
  122. }
  123. /**
  124. * wx小程序首页
  125. * 7个分类,一个全部
  126. * 所有分类下的产品
  127. */
  128. @GetMapping("/wx/home")
  129. public Object home(School school){
  130. /**
  131. * 1、获取所有一级分类
  132. * 2、填充一级分类中的所有产品
  133. * 4、移除产品中的分类,因为在fill(cs)中,根据分类查找产品,将product中的category属性填充
  134. * 导致json死循环,即category实例中有product,而product实例有category
  135. */
  136. List<Category> cs = categoryService.list();
  137. productService.wxFillBySchool(cs,school);
  138. categoryService.removeCategoryFromProduct(cs);
  139. categoryService.removeCategoryFromSC(cs);
  140. for (Category c: cs) {
  141. c.setSecondaryCategories(null);
  142. }
  143. return cs;
  144. }
  145. /**
  146. * 首页
  147. * 获取所有主题,并将产品放入到首页中
  148. */
  149. @GetMapping("/wx/themes")
  150. public Object wxThemes(School school){
  151. System.out.println(school);
  152. //获取所有主题
  153. List<Theme> themes = themeService.list();
  154. //设置主题中产品
  155. themeService.wxFill(themes,school);
  156. return themes;
  157. }
  158. /**
  159. * 1. 获取参数pid
  160. * 2. 根据pid获取Product 对象product
  161. * 3. 判断改产品是否下架或这库存不足 isOfflineOrLackStock
  162. * 4. 根据对象product,获取这个产品对应的详情图片集合
  163. * 5. 获取产品的所有属性值
  164. * 6. 获取产品对应的所有的评价
  165. * 8. 把上述取值放在 map 中
  166. * 9. 通过 Result 把这个 map 返回到浏览器去
  167. * 为什么要用Map呢? 因为返回出去的数据是多个集合,而非一个集合,所以通过 map返回给浏览器,浏览器更容易识别
  168. * @param pid
  169. * @return
  170. */
  171. @GetMapping("/wx/product/{pid}")
  172. public Object product(@PathVariable("pid") int pid) {
  173. Product product = productService.get(pid);
  174. //在售商品
  175. product.getUser().setOnSellProduct(productService.onSellProduct(product.getUser()));
  176. //累计交易,我卖出的
  177. List<Product> products = productService.getProductsByUser(product.getUser());
  178. product.getUser().setOnOrderProduct(orderItemService.onOrderTraded(products));
  179. //我买到的
  180. // product.getUser().setOnOrderProduct(orderService.OnOrderProduct(product.getUser()));
  181. List<ProductImage> productDetailImages = productImageService.listDetailProductImages(product);
  182. List<PropertyValue> pvs = propertyValueService.list(product);
  183. for (PropertyValue p:
  184. pvs) {
  185. p.setProduct(null);
  186. }
  187. Map<String,Object> map= new HashMap<>();
  188. map.put("onSellProduct",product.getUser().getOnSellProduct());
  189. map.put("onOrderProduct",product.getUser().getOnOrderProduct());
  190. map.put("productDetailImages", productDetailImages);
  191. map.put("pvs", pvs);
  192. map.put("isOfflineOrLackStock", productService.isOfflineOrLackStock(product));
  193. return Result.success(map);
  194. }
  195. /**
  196. * 商品搜索模糊查询
  197. * @param key 关键字
  198. * @return
  199. */
  200. @GetMapping("/wx/search")
  201. public Object search(@RequestParam("key") String key,
  202. @RequestParam(name = "sort",defaultValue = "none")String sort){
  203. List<Product> products = productService.search(key,0,5);
  204. for (Product p: products) {
  205. p.setCategory(null);
  206. p.setSecondaryCategory(null);
  207. }
  208. productImageService.setWXFirstProductImages(products);
  209. //防止不支持异常
  210. products = new ArrayList<>(products);
  211. if(null!=sort){
  212. switch(sort){
  213. case "price":
  214. Collections.sort(products,new ProductPriceComparator());
  215. break;
  216. }
  217. }
  218. return Result.success(products);
  219. }
  220. /**
  221. * 预搜索
  222. */
  223. @PutMapping("/wx/preSearch")
  224. public Object preSearch(@RequestParam("key") String key){
  225. List<String> strings = new ArrayList<>();
  226. List<Product> products = productService.search(key,0,5);
  227. for (Product p: products) {
  228. strings.add(p.getName());
  229. }
  230. return strings;
  231. }
  232. /**
  233. * 首页中的全部分类
  234. * 获取所有分类
  235. * @return
  236. */
  237. @GetMapping("/wx/category/all")
  238. public Object getAllCategories(){
  239. List<Category> categories = categoryService.list();
  240. secondaryCategoryService.fill(categories);
  241. secondaryCategoryService.removeCategoryFromSecondCategory(categories);
  242. return Result.success(categories);
  243. }
  244. /**
  245. * 发布页面
  246. * 获取所有一级分类和所有主题
  247. */
  248. @GetMapping("/wx/categoriesAndThemes")
  249. public Object listCategory(){
  250. List<Category> categories = categoryService.list();
  251. List<Theme> themes = themeService.list();
  252. Map<String,Object> map = new HashMap<>();
  253. map.put("categories",categories);
  254. map.put("themes",themes);
  255. return Result.success(map);
  256. }
  257. /**
  258. * 筛选页面
  259. * 获取一级分类下的所有产品
  260. * 1. 获取参数cid
  261. * 2. 根据cid获取分类Category对象 c
  262. * 3. 为c填充二级分类和产品
  263. * 4. 为产品填充销量和评价数据
  264. * 5. 获取参数sort
  265. * 5.1 如果sort==null,即不排序
  266. * 5.2 如果sort!=null,则根据sort的值,从5个Comparator比较器中选择一个对应的排序器进行排序
  267. 6. 返回对象 c
  268. */
  269. @GetMapping("/wx/secondaryCategory/{scid}")
  270. public Object category(@PathVariable("scid")int scid,School school,
  271. @RequestParam(name = "sort",defaultValue = "none") String sort){
  272. //二级分类
  273. SecondaryCategory sc = secondaryCategoryService.get(scid);
  274. //填充二级级分类
  275. productService.wxFillSCBySchool(sc,school);
  276. secondaryCategoryService.removeSecondCategoryFromProduct(sc);
  277. productImageService.setWXFirstProductImages(sc.getProductList());
  278. if(null!=sort){
  279. switch(sort){
  280. case "review":
  281. Collections.sort(sc.getProductList(),new ProductReviewComparator());
  282. break;
  283. case "date" :
  284. Collections.sort(sc.getProductList(),new ProductDateComparator());
  285. break;
  286. case "saleCount" :
  287. Collections.sort(sc.getProductList(),new ProductSaleCountComparator());
  288. break;
  289. case "price":
  290. Collections.sort(sc.getProductList(),new ProductPriceComparator());
  291. break;
  292. case "all":
  293. Collections.sort(sc.getProductList(),new ProductAllComparator());
  294. break;
  295. }
  296. }
  297. return sc;
  298. }
  299. /**
  300. * 获取主题中的商品
  301. */
  302. @GetMapping("/wx/theme/{tid}/products")
  303. public Object wxProductByTheme(@PathVariable("tid")int tid,School school,
  304. @RequestParam(name = "sort",defaultValue = "none") String sort){
  305. Theme theme = themeService.get(tid);
  306. themeService.wxFill(theme,school);
  307. if(null!=sort){
  308. switch(sort){
  309. case "price":
  310. Collections.sort(theme.getProducts(),new ProductPriceComparator());
  311. break;
  312. }
  313. }
  314. return theme.getProducts();
  315. }
  316. /**
  317. * 发布页面
  318. * 根据分类id获取所有属性
  319. */
  320. @GetMapping("/wx/categories/{cid}/properties")
  321. public Object getPropertiesByCid(@PathVariable("cid")int cid){
  322. Category category = categoryService.get(cid);
  323. List<Property> properties = propertyService.listByCategory(category);
  324. /**防止浪费空间*/
  325. for (Property p: properties) {
  326. p.setCategory(null);
  327. }
  328. return properties;
  329. }
  330. /**
  331. * 发布产品-必须使用post传送而且要@RequestBody不然数组内容接受不正确
  332. * 1、openid用户、分类cid、内容content、imgs产品图片、price价格、pvs属性参数、title标题
  333. * 2、工具类创建了一个wxproduct,在赋值给product
  334. * 3、找到数据中最大的pid,是指pid
  335. * 注意对三个表同时操作要进行回滚 !!!还没有实现回滚
  336. * 4、发布产品
  337. * 5、设置产品属性值
  338. * 6、设置产品详细图片
  339. * 7、设置产品主题
  340. * */
  341. @Transactional(propagation= Propagation.REQUIRED,rollbackForClassName="Exception")
  342. @PostMapping("/wx/issueProduct/{scid}/theme/{tid}")
  343. public Object getProduct(@PathVariable("scid")int scid,
  344. @RequestBody WXProduct wxproduct,
  345. @PathVariable("tid")int tid){
  346. System.out.println(wxproduct);
  347. Product product = new Product();
  348. User u = userService.getUserByOpenid(wxproduct.getOpenid());
  349. SecondaryCategory secondaryCategory = secondaryCategoryService.get(scid);
  350. Category c = secondaryCategory.getCategory();
  351. /** 用户、分类、创建时间 */
  352. product.setUser(u);
  353. product.setCategory(c);
  354. product.setSecondaryCategory(secondaryCategory);
  355. product.setCreateDate(new Date());
  356. /** 库存 在线 标题、内容、原价、二手价、运费、属性值、图片集合 */
  357. product.setStock(1);
  358. product.setOnline("T");
  359. product.setName(wxproduct.getName());
  360. product.setSubTitle(wxproduct.getSubTitle());
  361. product.setPromotePrice(wxproduct.getPromotePrice());
  362. product.setOriginalPrice(wxproduct.getOriginalPrice());
  363. product.setCarriagePrice(wxproduct.getCarriagePrice());
  364. String[] pvs = wxproduct.getPvs();
  365. /**设置产品可以交易的方式*/
  366. String[] selects = wxproduct.getSelect();
  367. for (String s:selects) {
  368. if(s.equals("school"))
  369. product.setIsSchool("T");
  370. if(s.equals("change"))
  371. product.setIsChange("T");
  372. if(s.equals("express"))
  373. product.setIsExpress("T");
  374. }
  375. //发布产品
  376. productService.add(product);
  377. //添加主题产品表
  378. Theme theme = themeService.get(tid);
  379. ThemeProduct themeProduct = new ThemeProduct();
  380. themeProduct.setProduct(product);
  381. themeProduct.setTheme(theme);
  382. themeService.addThemeProduct(themeProduct);
  383. // System.out.println(product); //打印
  384. //初始化属性值,即写入属性值到数据库
  385. propertyValueService.init(product,pvs);
  386. return Result.success(product.getId()); //返回产品id,让前端继续上传图片
  387. }
  388. /**
  389. * pid 产品id、imgs用户上传的图片,有以下两种方案
  390. * 1、只要存储detail 2、两种都要存储比如single 这样就不会报错了 修改多一个WXFill了
  391. * 选择了方案一
  392. */
  393. @PostMapping("/wx/productImgs")
  394. public Object add(@RequestParam("pid") int pid, @RequestParam(value = "imgs") MultipartFile image,
  395. HttpServletRequest request){
  396. ProductImage bean = new ProductImage();
  397. Product product = productService.get(pid);
  398. bean.setProduct(product);
  399. bean.setType("detail"); //锁定详细
  400. //添加图片
  401. productImageService.add(bean);
  402. //上传图片
  403. WXUtil.upFile(bean.getId(),"productDetail",image,request);
  404. return Result.success("图片上传成功");
  405. }
  406. /**
  407. * 商品库存是否足够,是否下架?true继续,否则错误
  408. * order订单生成
  409. * pid:产品id, uid:用户id,address:收货地址,post:邮政编号,receiver:收货人,mobile:移动电话, number:1 数量
  410. * 订单项生成(id,uid,oid,pid,number)
  411. * 定时任务: 10分钟未支付取消订单
  412. */
  413. @PutMapping("/wx/order/{pid}")
  414. public Object createWxOrder(@PathVariable("pid")int pid,@RequestParam(value = "uid")String uid,@RequestBody Order order){
  415. User user = userService.getById(Integer.parseInt(uid));
  416. Product product = productService.get(pid);
  417. //用户是否登录
  418. if(null == user)
  419. return Result.fail("未登录");
  420. //商品未下架且库存>0
  421. if(!(product.getOnline().equals("T") && (product.getStock()>0))){
  422. return Result.fail("无效商品");
  423. }
  424. //商品库存-1
  425. product.setStock(product.getStock() - 1);
  426. productService.update(product);
  427. //先创建订单项
  428. OrderItem oi = new OrderItem();
  429. oi.setUser(user);
  430. oi.setProduct(product);
  431. oi.setNumber(1);
  432. orderItemService.add(oi);
  433. //后生成订单
  434. String orderCode = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + RandomUtils.nextInt(10000);
  435. order.setOrderCode(orderCode);
  436. order.setCreateDate(new Date());
  437. order.setUser(user);
  438. order.setStatus(OrderService.waitPay);
  439. //设置订单项中的订单 这里价格没有用到
  440. orderService.wxAdd(order,oi);
  441. //设置订单定时任务
  442. JobKey jobKey = JobKey.jobKey(String.valueOf(order.getId()),"waitPayOrder");
  443. String desc = "待支付订单,超过十分钟取消订单";
  444. Map<String,String> jobMap = new HashMap<>();
  445. jobMap.put("oid",String.valueOf(order.getId()));
  446. jobMap.put("pid",String.valueOf(product.getId()));
  447. jobMap.put("status","waitPayOrder");
  448. try {
  449. QuartzJobManager.startQuartzJob(quartzJobService,jobKey,jobMap,desc);
  450. } catch (SchedulerException e) {
  451. e.printStackTrace();
  452. }
  453. //返回数据
  454. Map<String,Object> map = new HashMap<>();
  455. map.put("oid", order.getId());
  456. map.put("orderCode",order.getOrderCode());
  457. map.put("tradeWay",order.getTradeWay());
  458. map.put("total", order.getTotalPrice());
  459. return Result.success(map);
  460. }
  461. /**
  462. * 获取订单详细信息
  463. */
  464. @GetMapping("/wx/order/{oid}/orderDetail")
  465. public Object onOrderDetail(@PathVariable("oid") int oid){
  466. Order order = orderService.get(oid);
  467. //填充order
  468. orderItemService.wxFill(order);
  469. orderService.removeOrderFromOrderItem(order);
  470. return Result.success(order);
  471. }
  472. /**
  473. * 立即支付
  474. * 1 获取参数oid
  475. * 2 根据oid获取到订单对象order
  476. * 3 修改订单对象的状态和支付时间
  477. * 4 取消待支付订单计时
  478. * 5 更新这个订单对象到数据库
  479. * 6 返回订单
  480. */
  481. @PutMapping("/wx/payed/{oid}")
  482. public Object payed(@PathVariable("oid") int oid) {
  483. Order order = orderService.get(oid);
  484. //买家账号
  485. User user = order.getUser();
  486. //余额不足
  487. if(user.getMoney() < Float.parseFloat(order.getTotalPrice())){
  488. return Result.fail("余额不足");
  489. }
  490. //扣除买家金额
  491. user.setMoney(user.getMoney() - Float.parseFloat(order.getTotalPrice()));
  492. //更新用户账号
  493. userService.update(user);
  494. //取消待支付定时10分钟
  495. JobKey jobKey = JobKey.jobKey(String.valueOf(order.getId()),"waitPayOrder");
  496. try {
  497. QuartzJobManager.pauseQuartzJob(quartzJobService,jobKey);
  498. } catch (SchedulerException e) {
  499. e.printStackTrace();
  500. }
  501. order.setStatus(OrderService.waitDelivery);
  502. order.setPayDate(new Date());
  503. //更新订单
  504. orderService.update(order);
  505. return Result.success("支付成功");
  506. }
  507. /**
  508. * 确认发货
  509. * 1 获取参数oid
  510. * 2 根据oid获取到订单对象order
  511. * 3 修改订单对象的状态和发货时间
  512. * 4 更新这个订单对象到数据库
  513. * 5 返回订单
  514. */
  515. @GetMapping("/wx/delivery/{oid}")
  516. public Object waitDelivery(@PathVariable("oid") int oid){
  517. Order order = orderService.get(oid);
  518. System.out.println(order);
  519. order.setStatus(OrderService.waitConfirm);
  520. order.setDeliveryDate(new Date());
  521. orderService.update(order);
  522. return Result.success("发货成功");
  523. }
  524. /**
  525. * 确认收货
  526. * 1 获取参数oid
  527. * 2 根据oid获取到订单对象order
  528. * 3 修改订单对象的状态和收货时间
  529. * 4 更新卖家账号金额
  530. * 5 更新这个订单对象到数据库
  531. * 6 返回订单
  532. */
  533. @GetMapping("/wx/receive/{oid}")
  534. public Object waitConfirmReceive(@PathVariable("oid") int oid){
  535. Order order = orderService.get(oid);
  536. System.out.println(order);
  537. //找到卖家,更新账户
  538. OrderItem orderItem = orderItemService.getByOrderId(order.getId());
  539. Product product = orderItem.getProduct();
  540. User user = product.getUser();
  541. user.setMoney(user.getMoney() + Float.parseFloat(order.getTotalPrice()));
  542. userService.update(user);
  543. order.setStatus(OrderService.waitReview);
  544. order.setConfirmDate(new Date());
  545. orderService.update(order);
  546. return Result.success("收货成功");
  547. }
  548. /**获取order订单*/
  549. @GetMapping("/wx/getOrder/{oid}")
  550. public Object getOrder(@PathVariable("oid") int oid){
  551. Order order = orderService.get(oid);
  552. orderItemService.wxFill(order);
  553. orderService.removeOrderFromOrderItem(order);
  554. order.setUser(null);
  555. return Result.success(order);
  556. }
  557. /**
  558. * 获取全部我的订单 微信小程序我买到的
  559. * 1、订单里面的uid是下单者的(我),并不是商家uid,应该用product中的uid
  560. * 1. 通过openid获取用户user
  561. * 2. 查询user所有的状态不是"delete" 的订单集合os
  562. * 3. 为这些订单填充订单项
  563. * 4. 返回 订单集合
  564. */
  565. @GetMapping("/wx/order/bought")
  566. public Object bought(@RequestParam(value = "openid")String openid) {
  567. User user = userService.getUserByOpenid(openid);
  568. System.out.println(user);
  569. if(null==user)
  570. return Result.fail("未登录");
  571. //微信小程序的获取,由于图片问题没有处理好
  572. List<Order> os= orderService.wxListByUserWithoutDelete(user);
  573. orderService.removeOrderFromOrderItem(os);
  574. return os;
  575. }
  576. /**
  577. * 微信小程序我卖出
  578. * 1. 通过openid获取用户user
  579. * 2. 通过user查找到我发布的产品Product
  580. * 3. 通过我发布的产品找到对应的orderItem
  581. * 4. 返回 订单项orderItems集合
  582. */
  583. @GetMapping("/wx/order/sell")
  584. public Object mySell(@RequestParam(value = "openid")String openid){
  585. User user = userService.getUserByOpenid(openid);
  586. List<Product> products = productService.getProductsByUser(user);
  587. for(Product p : products){
  588. //设置为空,防止数据冗余
  589. p.setCategory(null);
  590. // System.out.println(p);
  591. }
  592. List<List<OrderItem>> listOrderItems = orderItemService.listByProduct(products);
  593. List<OrderItem> goalOrderItems = new ArrayList<>();
  594. for (List<OrderItem> orderItems: listOrderItems) {
  595. for (OrderItem oi: orderItems) {
  596. goalOrderItems.add(oi);
  597. }
  598. }
  599. //设置第一张图片
  600. productImageService.setWXFirstProductImages(products);
  601. return Result.success(goalOrderItems);
  602. }
  603. /**
  604. * 我发布的
  605. * @param openid
  606. * @return 产品
  607. */
  608. @GetMapping("/wx/order/release")
  609. public Object myRelease(@RequestParam(value = "openid")String openid){
  610. User user = userService.getUserByOpenid(openid);
  611. List<Product> products = productService.getProductsByUser(user);
  612. for (Product p: products) {
  613. //设置为空,防止数据冗余
  614. p.setCategory(null);
  615. p.setSecondaryCategory(null);
  616. }
  617. //设置第一张图片
  618. productImageService.setWXFirstProductImages(products);
  619. //设置详细图片
  620. return Result.success(products);
  621. }
  622. /**
  623. * 下架商品
  624. * 该商品是否处于交易中,是下架失败,否下架成功
  625. */
  626. @PutMapping("/wx/my/product/{pid}/offline")
  627. public Object offline(@PathVariable("pid") int pid){
  628. Product product = productService.get(pid);
  629. boolean isTrading = productService.isTrading(product);
  630. if(isTrading){
  631. return Result.fail("无法下架,商品正处于交易");
  632. }
  633. product.setOnline("F");
  634. productService.update(product);
  635. return Result.success();
  636. }
  637. /**
  638. * 重新上架商品
  639. * 该商品是否处于交易中,是下架失败,否下架成功
  640. */
  641. @PutMapping("/wx/my/product/{pid}/reOnline")
  642. public Object reOnline(@PathVariable("pid") int pid){
  643. Product product = productService.get(pid);
  644. product.setOnline("T");
  645. productService.update(product);
  646. return Result.success();
  647. }
  648. /**
  649. * 取消订单-买家
  650. */
  651. @GetMapping("/wx/order/{id}/cancel")
  652. public Object orderCancel(@PathVariable("id") int id){
  653. Order order = orderService.get(id);
  654. order.setStatus("waitCancel");
  655. //更新订单
  656. orderService.update(order);
  657. return Result.success("待卖家同意");
  658. }
  659. /**
  660. * 同意取消-卖家
  661. */
  662. @GetMapping("/wx/order/{id}/agreeCancel/{pid}")
  663. public Object agreeOrderCancel(@PathVariable("id") int id,@PathVariable("pid") int pid){
  664. Order order = orderService.get(id);
  665. User user = order.getUser();
  666. Product product = productService.get(pid);
  667. //更新订单
  668. order.setStatus("cancel");
  669. order.setCancelDate(new Date());
  670. //更新库存+1 买家金额退还
  671. product.setStock(product.getStock()+1);
  672. user.setMoney(user.getMoney() + Float.parseFloat(order.getTotalPrice()));
  673. userService.update(user);
  674. orderService.update(order);
  675. productService.update(product);
  676. return Result.success("同意取消");
  677. }
  678. /**
  679. * 拒绝取消-卖家
  680. * 少了确认收货后
  681. */
  682. @GetMapping("/wx/order/{id}/refuseCancel")
  683. public Object refuseOrderCancel(@PathVariable("id")int id){
  684. Order order = orderService.get(id);
  685. if(order.getPayDate() == null)
  686. order.setStatus("waitPay");
  687. else if(order.getDeliveryDate() == null)
  688. order.setStatus("waitDelivery");
  689. else if(order.getConfirmDate() == null)
  690. order.setStatus("waitConfirm");
  691. else
  692. return Result.success("拒绝失败");
  693. orderService.update(order);
  694. return Result.success("拒绝取消");
  695. }
  696. /**
  697. * 充值recharge 提现 withdraw
  698. */
  699. @PutMapping("/wx/my/{id}/wallet")
  700. public Object rechargeOrWithdraw(@PathVariable("id")int id,@RequestBody String data){
  701. JSONObject wallet = JSONUtil.parseObj(data);
  702. User user = userService.getById(id);
  703. float charge = Float.parseFloat((String)wallet.get("charge"));
  704. String type = (String) wallet.get("type");
  705. if(type.equals("recharge")){
  706. user.setMoney(user.getMoney() + charge);
  707. }else if(type.equals("withdraw")){
  708. user.setMoney(user.getMoney() - charge);
  709. }
  710. //更新钱包
  711. userService.update(user);
  712. return Result.success(user);
  713. }
  714. /**
  715. * 卖家在订单中修改收货地址
  716. */
  717. @PutMapping("/wx/order/{id}/updateOrderAddress")
  718. public Object updateOrderAddress(@PathVariable("id")int id,@RequestBody String address){
  719. JSONObject addrObj = JSONUtil.parseObj(address);
  720. String addr = (String)addrObj.get("address");
  721. //更新订单收货地址
  722. Order order = orderService.get(id);
  723. order.setAddress(addr);
  724. orderService.update(order);
  725. return Result.success();
  726. }
  727. /**
  728. * 订单评价
  729. */
  730. @PostMapping("/wx/orderItem/{id}/evaluation")
  731. public void orderItemEvaluation(@PathVariable("id")int id,@RequestBody String result){
  732. JSONObject resultObj = JSONUtil.parseObj(result);
  733. String content = (String) resultObj.get("content");
  734. int score = (int) resultObj.get("score");
  735. if(content.equals("")){
  736. content = "此用户没有填写评价";
  737. }
  738. //订单项
  739. OrderItem orderItem = orderItemService.get(id);
  740. Order order = orderItem.getOrder();
  741. //订单评价
  742. EvaluationOrder evaluationOrder = new EvaluationOrder();
  743. evaluationOrder.setContent(content);
  744. evaluationOrder.setScore(score);
  745. evaluationOrder.setCreateDate(new Date());
  746. evaluationOrder.setOrderItem(orderItem);
  747. //添加评价
  748. evaluationService.add(evaluationOrder);
  749. //修改订单状态
  750. order.setStatus("finish");
  751. orderService.update(order);
  752. }
  753. /**
  754. * 查看评价
  755. */
  756. @GetMapping("/wx/orderItem/{id}/evaluation")
  757. public Object getEvaluationByOrderItem(@PathVariable("id")int id){
  758. EvaluationOrder evaluationOrder = evaluationService.getByOrderItem_Id(id);
  759. evaluationOrder.getOrderItem().setOrder(null);
  760. //设置商品图片
  761. productImageService.setWXFirstProductImage(evaluationOrder.getOrderItem().getProduct());
  762. return Result.success(evaluationOrder);
  763. }
  764. }
本系统所用的软件都是开源的,为开发软件节省了大量的金钱和时间,达到降低成
本,提高开发效率的目的,本系统对计算机配置的要求不高,甚至网吧更换下来的低配
置电脑都可以完全满足需要,所以在经济上具有完全的可行性。
2.1.3 操作可行性
本系统操作简单,输入信息页面大多数都是下拉框的选择形式,在某些页面,信息
可以自动生成,无需输入,时间的输入也是用的日历控件,操作简便,对操作人员的要
求很低,只需对 WINDOWS 操作熟练,加之对本系统的操作稍加培训即可工作,而且本系
统可视性非常好,所以在技术上不会有很大难度。
2.1.4 法律的可行性
本校园二手物品交易网是自行开发的管理系统,是很有实际意义的系统 ,开发环境
软件和使用的数据库都是开源代码,开发这个系统不同于开发普通的系统软件,不存在
侵权等问题,即法律上是可行的。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/420554
推荐阅读
相关标签
  

闽ICP备14008679号