From 1bdae0407502a473ff96790fe95e7500c5724830 Mon Sep 17 00:00:00 2001 From: liuwenhui Date: Fri, 18 May 2018 14:14:59 +0800 Subject: [PATCH 01/54] =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-wx/pages/ucenter/addressAdd/addressAdd.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litemall-wx/pages/ucenter/addressAdd/addressAdd.js b/litemall-wx/pages/ucenter/addressAdd/addressAdd.js index 4b25ba33..e04d0e1d 100644 --- a/litemall-wx/pages/ucenter/addressAdd/addressAdd.js +++ b/litemall-wx/pages/ucenter/addressAdd/addressAdd.js @@ -287,7 +287,7 @@ Page({ return false; } - if (!check.isValidPhone(this.data.mobile)) { + if (!check.isValidPhone(address.mobile)) { util.showErrorToast('手机号不正确'); return false; } From b82e38353e188fbc63045452a415be31ad8ae8a2 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Fri, 18 May 2018 15:31:38 +0800 Subject: [PATCH 02/54] =?UTF-8?q?fix[litemall-wx]:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=A0=81=E6=A0=BC=E5=BC=8F=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-wx/pages/shopping/addressAdd/addressAdd.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litemall-wx/pages/shopping/addressAdd/addressAdd.js b/litemall-wx/pages/shopping/addressAdd/addressAdd.js index db988789..9c83d162 100644 --- a/litemall-wx/pages/shopping/addressAdd/addressAdd.js +++ b/litemall-wx/pages/shopping/addressAdd/addressAdd.js @@ -287,7 +287,7 @@ Page({ return false; } - if (!check.isValidPhone(this.data.mobile)) { + if (!check.isValidPhone(address.mobile)) { util.showErrorToast('手机号不正确'); return false; } From fad176f3def06206db5e6c6d486b1f72e39d2c7a Mon Sep 17 00:00:00 2001 From: liuwenhui Date: Fri, 18 May 2018 17:10:55 +0800 Subject: [PATCH 03/54] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=88=96=E8=80=85=E5=8F=96=E6=B6=88=E4=B8=80=E5=AE=9A=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E8=AE=A2=E5=8D=95=E5=90=8E=E5=86=8D=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=97=A0=E6=B3=95=E5=93=8D=E5=BA=94=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-wx/pages/ucenter/order/order.wxml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litemall-wx/pages/ucenter/order/order.wxml b/litemall-wx/pages/ucenter/order/order.wxml index efa6c926..66574272 100644 --- a/litemall-wx/pages/ucenter/order/order.wxml +++ b/litemall-wx/pages/ucenter/order/order.wxml @@ -24,7 +24,7 @@ - + 订单编号:{{item.orderSn}} {{item.orderStatusText}} From d97bb18cdcfab698d00a2519042348dee61b01f3 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Fri, 18 May 2018 22:20:37 +0800 Subject: [PATCH 04/54] =?UTF-8?q?fix[litemall-wx]:=20=E6=94=B6=E8=97=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=B8=8D=E6=88=90=E5=8A=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-wx/pages/ucenter/collect/collect.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/litemall-wx/pages/ucenter/collect/collect.js b/litemall-wx/pages/ucenter/collect/collect.js index e1df447c..2b325c3f 100644 --- a/litemall-wx/pages/ucenter/collect/collect.js +++ b/litemall-wx/pages/ucenter/collect/collect.js @@ -60,7 +60,8 @@ Page({ openGoods(event) { let that = this; - let goodsId = this.data.collectList[event.currentTarget.dataset.index].valueId; + let index = event.currentTarget.dataset.index; + let goodsId = this.data.collectList[index].valueId; //触摸时间距离页面打开的毫秒数 var touchTime = that.data.touchEnd - that.data.touchStart; @@ -81,7 +82,10 @@ Page({ icon: 'success', duration: 2000 }); - that.getCollectList(); + that.data.collectList.splice(index, 1) + that.setData({ + collectList: that.data.collectList + }); } }); } From 4aa3f204959402697414cc95950237e51d990dae Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Fri, 18 May 2018 23:30:59 +0800 Subject: [PATCH 05/54] =?UTF-8?q?fix[litemall-wx]:=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=B6=B3=E8=BF=B9=E5=88=A0=E9=99=A4=E4=B8=8D=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/ucenter/footprint/footprint.js | 17 ++++++++++++----- .../pages/ucenter/footprint/footprint.wxml | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/litemall-wx/pages/ucenter/footprint/footprint.js b/litemall-wx/pages/ucenter/footprint/footprint.js index f6229b40..59420103 100644 --- a/litemall-wx/pages/ucenter/footprint/footprint.js +++ b/litemall-wx/pages/ucenter/footprint/footprint.js @@ -41,7 +41,9 @@ Page({ }, deleteItem (event){ let that = this; - let footprint = event.currentTarget.dataset.footprint; + let index = event.currentTarget.dataset.index; + let iindex = event.currentTarget.dataset.iindex; + let goodsId = this.data.footprintList[index][iindex].id; var touchTime = that.data.touchEnd - that.data.touchStart; console.log(touchTime); //如果按下时间大于350为长按 @@ -51,15 +53,20 @@ Page({ content: '要删除所选足迹?', success: function (res) { if (res.confirm) { - util.request(api.FootprintDelete, { footprintId: footprint.id }, 'POST').then(function (res) { + util.request(api.FootprintDelete, { footprintId: goodsId }, 'POST').then(function (res) { if (res.errno === 0) { wx.showToast({ title: '删除成功', icon: 'success', duration: 2000 }); - that.data.footprintList = []; - that.getFootprintList(); + that.data.footprintList[index].splice(iindex, 1) + if (that.data.footprintList[index].length == 0){ + that.data.footprintList.splice(index, 1) + } + that.setData({ + footprintList: that.data.footprintList + }); } }); } @@ -67,7 +74,7 @@ Page({ }); } else { wx.navigateTo({ - url: '/pages/goods/goods?id=' + footprint.goodsId, + url: '/pages/goods/goods?id=' + goodsId, }); } diff --git a/litemall-wx/pages/ucenter/footprint/footprint.wxml b/litemall-wx/pages/ucenter/footprint/footprint.wxml index cb51d425..925a473f 100644 --- a/litemall-wx/pages/ucenter/footprint/footprint.wxml +++ b/litemall-wx/pages/ucenter/footprint/footprint.wxml @@ -6,10 +6,10 @@ - + {{item[0].addTime}} - + {{iitem.name}} From 2d5a7b2209d17f745166cdce7f21b92e0b812fc1 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Sun, 20 May 2018 22:21:55 +0800 Subject: [PATCH 06/54] update[doc] --- .gitbook.yaml | 3 +++ doc/README.md | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 .gitbook.yaml create mode 100644 doc/README.md diff --git a/.gitbook.yaml b/.gitbook.yaml new file mode 100644 index 00000000..6ff8abe3 --- /dev/null +++ b/.gitbook.yaml @@ -0,0 +1,3 @@ +structure: + readme: README.md + summary: doc/README.md \ No newline at end of file diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 00000000..6b821a1a --- /dev/null +++ b/doc/README.md @@ -0,0 +1,12 @@ +# Table of Contents + +* [介绍](../README.md) +* [更新日志](../CHANGELOG.md) +* [贡献指南](../CONTRIBUTE.md) +* [1. 系统架构](./1.md) +* [2. 基础平台](./2.md) +* [3. 小商场](./3.md) +* [4. 管理后台](./4.md) +* [5. 商场](./5.md) +* [6. 下一步计划](./6.md) +* [7. FAQ](./7.md) \ No newline at end of file From ff7a73a955744658027cd7ca8b690b557ac1074f Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Sun, 20 May 2018 22:57:51 +0800 Subject: [PATCH 07/54] update[doc] --- .gitbook.yaml | 1 - doc/7.md | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitbook.yaml b/.gitbook.yaml index 6ff8abe3..10f02b39 100644 --- a/.gitbook.yaml +++ b/.gitbook.yaml @@ -1,3 +1,2 @@ structure: - readme: README.md summary: doc/README.md \ No newline at end of file diff --git a/doc/7.md b/doc/7.md index aed61221..f3d4a620 100644 --- a/doc/7.md +++ b/doc/7.md @@ -13,7 +13,7 @@ 1. 如果只是体验商品购买流程,开发者可以采用账号注册登录方式。 2. 开发者在litemall-wx和litemall-wx-api模块的appid等信息设置成自己申请的信息。 -#### 7.1.2 为什么开发者工具运行正常,但是手机真机测试不正常? +### 7.1.2 为什么开发者工具运行正常,但是手机真机测试不正常? 现象: @@ -31,7 +31,7 @@ * 小商场的后台服务未启动 2. 手机小商场的**调试功能**开启 -#### 7.1.3 为什么本人手机测试正常,而第三者手机测试不正常? +### 7.1.3 为什么本人手机测试正常,而第三者手机测试不正常? 解决方案: @@ -39,7 +39,7 @@ 2. 第三者手机小商场的**调试功能**开启 3. 在微信小程序平台设置第三者的微信账号是**体验者** -#### 7.1.4 小商场为什么不能支付,或者为什么点击支付总是报错? +### 7.1.4 小商场为什么不能支付,或者为什么点击支付总是报错? 原因: @@ -56,7 +56,7 @@ wx.notify-url= 参考`3.0 小商场环境`,设置好相应支付配置信息 -#### 7.1.5 为什么小商城支付成功,但是返回以后商品订单? +### 7.1.5 为什么小商城支付成功,但是返回以后商品订单? 现象: From 018a8598cdc047baa7cff4fc3cb68106d8830b25 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Sun, 20 May 2018 23:07:58 +0800 Subject: [PATCH 08/54] update[doc] --- CHANGELOG.md | 12 ++++++------ CONTRIBUTE.md | 10 +++++----- README.md | 47 +++++++++++++++-------------------------------- 3 files changed, 26 insertions(+), 43 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ddbc0aa..6ad1dedd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ -## 更新日志 +# 更新日志 -### V 0.5.0 +## V 0.5.0 *2018-05-11*,项目支持微信支付和修复小程序的一些BUG @@ -18,7 +18,7 @@ * `项目`文档整理部署方案和上线方案 * `项目`文档支持更新日志、贡献指南和常见问题 -### V 0.4.0 +## V 0.4.0 *2018-04-21*,项目结构调整,增加了两个模块 @@ -33,7 +33,7 @@ * `基础系统`新增litemall-all模块作为包裹模块,支持三个后台服务和静态文件 打包成一个war项目包 -### V 0.3.0 +## V 0.3.0 *2018-04-07*,业务模块从物理删除调整成逻辑删除 @@ -46,7 +46,7 @@ * `基础系统`数据库中除regions几个表,其他所有表都添加`add_time`和`deleted`字段 * `基础系统`litemall-db模块不支持数据物理删除,删除则设置`deleted`,而查询则过滤`deleted` -### V 0.2.0 +## V 0.2.0 *2018-04-02*,修复一些小商场出现的问题。 @@ -59,6 +59,6 @@ * `管理后台`禁止管理员修改超级管理员信息 * `基础系统`自动脚本util/lazy.sh和util/upload.sh -### V 0.1.0 +## V 0.1.0 *2018-03-24*, 项目架构基本完成。 \ No newline at end of file diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index 5150dec4..ba3ee769 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -1,4 +1,4 @@ -## 贡献 +# 贡献指南 任何形式的贡献都欢迎,包括: @@ -13,7 +13,7 @@ 目前项目基本框架已经建立,但是还不完整,因此非常欢迎人一起讨论技术和业务。 但是交流合作之前,请查看以下碎碎念。 -### 项目理念 +## 项目理念 litemall的设计受众是小微型企业,而不是互联网企业,因此litemall的开发理念是一个小而美: @@ -68,7 +68,7 @@ litemall的设计受众是小微型企业,而不是互联网企业,因此lit 当然,如果开发者不认同这里的一些理念,也可以基于自己的技术选型来开发自己的版本。 如果认为自己开发的好,可以在本项目提交链接地址,让其他开发者了解。 -### 项目业务 +## 项目业务 本项目所设想的基本业务功能已经在文档中列举完成。 @@ -78,11 +78,11 @@ litemall的设计受众是小微型企业,而不是互联网企业,因此lit 当然更希望开发者直接提供代码,丰富完善目前的基础业务功能。 -### 代码贡献 +## 代码贡献 * 代码规范目前没有严格要求,后续会补充。 -### Issue规范 +## Issue规范 * 在提交issue之前,请搜索是否存在相关问题。 * 提交的Issue请尽可能给出详细信息 diff --git a/README.md b/README.md index f3c16f73..f7ba1e34 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,16 @@ -litemall -===== +# litemall 又一个小商场系统。 -项目代码 -==== +## 项目代码 * [码云](https://gitee.com/linlinjava/litemall) * [GitHub](https://github.com/linlinjava/litemall) -项目架构 -==== +## 项目架构 ![](./doc/pic/1.png) -技术栈 -=== +## 技术栈 > 1. Spring Boot > 2. Vue @@ -22,8 +18,7 @@ litemall ![](doc/pic/2.png) -效果 -== +## 效果 ### 小商城效果 @@ -78,8 +73,7 @@ litemall * 管理员 * 对象存储 -云演示 -== +## 云演示 ### 小商城演示访问 @@ -97,8 +91,7 @@ litemall 1. 浏览器打开,输入以下网址[http://122.152.206.172:8080/#/login](http://122.152.206.172:8080/#/login) 2. 管理员名称`admin123`,管理员密码`admin123` -文档 -== +## 文档 1. [系统架构](doc/1.md) 2. [基础平台](doc/2.md) @@ -110,8 +103,7 @@ litemall 文档内容采用 [署名-禁止演绎 4.0 国际协议许可](https://creativecommons.org/licenses/by-nd/4.0/deed.zh) -开发计划 -==== +## 开发计划 目前项目开发中,存在诸多不足,以下是目前规划的开发计划。 @@ -141,37 +133,30 @@ V 3.0.0 完成以下目标: 警告: > ** 以上仅仅是个人规划的开发计划,实际可能出现任何情况,例如能力有限而放弃开发。** -开发进度更新 -====== +## 开发进度 查看[更新日志](CHANGELOG.md) 目前V0.5.0 -警告 -== +## 警告 > 1. 本项目仅用于学习练习 > 2. 数据库数据来自nideshop > 3. 项目代码目前还不完善,仍处在开发中 > 4. 项目开源(MIT),但不承担任何使用后果 -致谢 -== +## 致谢 本项目基于或参考以下项目: > 1. [nideshop-mini-program](https://github.com/tumobi/nideshop-mini-program) > 如果后端希望采用nodejs,开发者可以访问nideshop项目 -> 2. [platform](https://gitee.com/fuyang_lipengjun/platform) -> 如果后端希望采用非spring boot版的普通spring版或者更多功能, -> 开发者可以访问platform项目 -> 3. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) +> 2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) > 一个基于Vue和Element的后台集成方案 本项目所依赖的其他开源项目见相关章节 -问题 -== +## 问题 开发者有问题或者好的建议可以用Issues反馈交流,请给出详细信息,本人会尽可能解决。 * 如果问题是共性问题(如代码bug或文档不全),本人会及时解决。 @@ -183,8 +168,7 @@ V 3.0.0 完成以下目标: * 请查看相关技术的官方文档,例如微信小程序的官方文档; * 请提问前尽可能做一些DEBUG或者思考分析,然后提问时给出详细的错误相关信息以及个人对问题的理解。 -贡献 -== +## 贡献 任何形式的贡献都欢迎,查看[贡献指南](CONTRIBUTE.md) @@ -195,7 +179,6 @@ V 3.0.0 完成以下目标: > * 在开发交流群中应讨论开发、业务和合作问题。 > * 交流结果如果是共识性的则在文档中记录,如果是开放性的则会在Issue中记录。 -相关项目 -==== +## 相关项目 [HubertYoung](https://github.com/HubertYoung)正在开发Android端[Litemall-Android](https://github.com/HubertYoung/Litemall-Android) \ No newline at end of file From 607d3af316e6642cfc054cfb742336b398bc10cf Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 21 May 2018 14:52:51 +0800 Subject: [PATCH 09/54] =?UTF-8?q?update[litemall-admin,=20litemall-admin-a?= =?UTF-8?q?pi]:=20=E5=88=A0=E9=99=A4=E7=AE=A1=E7=90=86=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=9A=84=E7=94=A8=E6=88=B7=E8=B4=AD=E7=89=A9=E8=BD=A6=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E9=A1=B5=E9=9D=A2=E5=92=8C=E5=90=8E=E5=8F=B0=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/web/AdminCartController.java | 94 ------- litemall-admin/src/api/cart.js | 41 --- litemall-admin/src/router/index.js | 3 +- litemall-admin/src/views/user/cart.vue | 236 ------------------ 4 files changed, 1 insertion(+), 373 deletions(-) delete mode 100644 litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCartController.java delete mode 100644 litemall-admin/src/api/cart.js delete mode 100644 litemall-admin/src/views/user/cart.vue diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCartController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCartController.java deleted file mode 100644 index dd1a7aa1..00000000 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminCartController.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.linlinjava.litemall.admin.web; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.linlinjava.litemall.admin.annotation.LoginAdmin; -import org.linlinjava.litemall.db.domain.LitemallCart; -import org.linlinjava.litemall.db.service.LitemallCartService; -import org.linlinjava.litemall.db.service.LitemallGoodsService; -import org.linlinjava.litemall.db.service.LitemallProductService; -import org.linlinjava.litemall.db.service.LitemallUserService; -import org.linlinjava.litemall.core.util.ResponseUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping("/admin/cart") -public class AdminCartController { - private final Log logger = LogFactory.getLog(AdminCartController.class); - - @Autowired - private LitemallCartService cartService; - @Autowired - private LitemallUserService userService; - @Autowired - private LitemallGoodsService goodsService; - @Autowired - private LitemallProductService productService; - - @GetMapping("/list") - public Object list(@LoginAdmin Integer adminId, - Integer userId, Integer goodsId, - @RequestParam(value = "page", defaultValue = "1") Integer page, - @RequestParam(value = "limit", defaultValue = "10") Integer limit, - String sort, String order){ - if(adminId == null){ - return ResponseUtil.fail401(); - } - List cartList = cartService.querySelective(userId, goodsId, page, limit, sort, order); - int total = cartService.countSelective(userId, goodsId, page, limit, sort, order); - - Map data = new HashMap<>(); - data.put("total", total); - data.put("items", cartList); - - return ResponseUtil.ok(data); - } - - /* - * 目前的逻辑不支持管理员创建 - */ - @PostMapping("/create") - public Object create(@LoginAdmin Integer adminId, @RequestBody LitemallCart cart){ - if(adminId == null){ - return ResponseUtil.fail401(); - } - - return ResponseUtil.fail501(); - } - - @GetMapping("/read") - public Object read(@LoginAdmin Integer adminId, Integer id){ - if(adminId == null){ - return ResponseUtil.fail401(); - } - - LitemallCart cart = cartService.findById(id); - return ResponseUtil.ok(cart); - } - - /* - * 目前的逻辑不支持管理员创建 - */ - @PostMapping("/update") - public Object update(@LoginAdmin Integer adminId, @RequestBody LitemallCart cart){ - if(adminId == null){ - return ResponseUtil.fail401(); - } - return ResponseUtil.fail501(); - } - - @PostMapping("/delete") - public Object delete(@LoginAdmin Integer adminId, @RequestBody LitemallCart cart){ - if(adminId == null){ - return ResponseUtil.fail401(); - } - cartService.deleteById(cart.getId()); - return ResponseUtil.ok(); - } - -} diff --git a/litemall-admin/src/api/cart.js b/litemall-admin/src/api/cart.js deleted file mode 100644 index 7825d527..00000000 --- a/litemall-admin/src/api/cart.js +++ /dev/null @@ -1,41 +0,0 @@ -import request from '@/utils/request' - -export function listCart(query) { - return request({ - url: '/cart/list', - method: 'get', - params: query - }) -} - -export function createCart(data) { - return request({ - url: '/cart/create', - method: 'post', - data - }) -} - -export function readCart(data) { - return request({ - url: '/cart/read', - method: 'get', - data - }) -} - -export function updateCart(data) { - return request({ - url: '/cart/update', - method: 'post', - data - }) -} - -export function deleteCart(data) { - return request({ - url: '/cart/delete', - method: 'post', - data - }) -} diff --git a/litemall-admin/src/router/index.js b/litemall-admin/src/router/index.js index 3f96052b..de73dd83 100644 --- a/litemall-admin/src/router/index.js +++ b/litemall-admin/src/router/index.js @@ -66,8 +66,7 @@ export const asyncRouterMap = [ { path: 'address', component: _import('user/address'), name: 'address', meta: { title: '收货地址', noCache: true }}, { path: 'collect', component: _import('user/collect'), name: 'collect', meta: { title: '会员收藏', noCache: true }}, { path: 'footprint', component: _import('user/footprint'), name: 'footprint', meta: { title: '会员足迹', noCache: true }}, - { path: 'history', component: _import('user/history'), name: 'history', meta: { title: '搜索历史', noCache: true }}, - { path: 'cart', component: _import('user/cart'), name: 'cart', meta: { title: '购物车', noCache: true }} + { path: 'history', component: _import('user/history'), name: 'history', meta: { title: '搜索历史', noCache: true }} ] }, diff --git a/litemall-admin/src/views/user/cart.vue b/litemall-admin/src/views/user/cart.vue deleted file mode 100644 index a2aac59f..00000000 --- a/litemall-admin/src/views/user/cart.vue +++ /dev/null @@ -1,236 +0,0 @@ - - - \ No newline at end of file From d0891e5e3fdb48979745e90311a74bea00f77a68 Mon Sep 17 00:00:00 2001 From: tiger Date: Mon, 21 May 2018 16:27:59 +0800 Subject: [PATCH 10/54] --- litemall-wx-api/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litemall-wx-api/src/main/resources/application.properties b/litemall-wx-api/src/main/resources/application.properties index 6894a0ac..1d5bfda0 100644 --- a/litemall-wx-api/src/main/resources/application.properties +++ b/litemall-wx-api/src/main/resources/application.properties @@ -1,3 +1,3 @@ -spring.profiles.active=prod +spring.profiles.active=dev server.port=8082 logging.level.org.linlinjava.litemall.wx.Application=DEBUG From cc441db166dbe9a28bd75d2d4d718eb8ac1f1d41 Mon Sep 17 00:00:00 2001 From: tiger Date: Mon, 21 May 2018 18:09:23 +0800 Subject: [PATCH 11/54] =?UTF-8?q?litemall-wx-api=20=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E4=BA=86=E4=BD=BF=E7=94=A8docker=E9=83=A8=E7=BD=B2=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-wx-api/pom.xml | 41 +++++++++++++++++++ litemall-wx-api/src/main/docker/Dockerfile | 4 ++ .../src/main/resources/application-docker.yml | 14 +++++++ .../src/main/resources/application.properties | 2 +- litemall-wx/project.config.json | 4 +- 5 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 litemall-wx-api/src/main/docker/Dockerfile create mode 100644 litemall-wx-api/src/main/resources/application-docker.yml diff --git a/litemall-wx-api/pom.xml b/litemall-wx-api/pom.xml index 2f06d74d..17828cad 100644 --- a/litemall-wx-api/pom.xml +++ b/litemall-wx-api/pom.xml @@ -10,6 +10,13 @@ 0.1.0 + + UTF-8 + UTF-8 + 1.8 + litemall + + @@ -35,6 +42,22 @@ + + + + src/main/resources + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + org.springframework.boot @@ -53,6 +76,24 @@ + + + com.spotify + docker-maven-plugin + 0.4.13 + + ${docker.image.prefix}/${project.artifactId} + src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + + diff --git a/litemall-wx-api/src/main/docker/Dockerfile b/litemall-wx-api/src/main/docker/Dockerfile new file mode 100644 index 00000000..0d0714de --- /dev/null +++ b/litemall-wx-api/src/main/docker/Dockerfile @@ -0,0 +1,4 @@ +FROM java +MAINTAINER tiger +ADD /litemall-wx-api-0.1.0.jar // +ENTRYPOINT java -jar /litemall-wx-api-0.1.0.jar \ No newline at end of file diff --git a/litemall-wx-api/src/main/resources/application-docker.yml b/litemall-wx-api/src/main/resources/application-docker.yml new file mode 100644 index 00000000..2686e9a2 --- /dev/null +++ b/litemall-wx-api/src/main/resources/application-docker.yml @@ -0,0 +1,14 @@ +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://${MYSQL_HOST}:3306/${MYSQL_DATABASE}?useUnicode=true&characterEncoding=utf-8 + username: ${MYSQL_USERNAME} + password: ${MYSQL_PASSWORD} + type: com.alibaba.druid.pool.DruidDataSource + +wx: + app-id: ${WX_APP_ID} + app-secret: ${WX_APP_SECRET} + mch-id: ${WX_MCH_ID} + mch-key: ${WX_MCH_KEY} + notify-url: ${WX_NOTIFY_URL} \ No newline at end of file diff --git a/litemall-wx-api/src/main/resources/application.properties b/litemall-wx-api/src/main/resources/application.properties index 1d5bfda0..591705b4 100644 --- a/litemall-wx-api/src/main/resources/application.properties +++ b/litemall-wx-api/src/main/resources/application.properties @@ -1,3 +1,3 @@ -spring.profiles.active=dev +spring.profiles.active=docker server.port=8082 logging.level.org.linlinjava.litemall.wx.Application=DEBUG diff --git a/litemall-wx/project.config.json b/litemall-wx/project.config.json index 3455070e..1fe9aefb 100644 --- a/litemall-wx/project.config.json +++ b/litemall-wx/project.config.json @@ -9,8 +9,8 @@ }, "compileType": "miniprogram", "libVersion": "1.9.93", - "appid": "wxa5b486c6b918ecfb", - "projectname": "litemall-wx", + "appid": "wx3d9beeb7481eddd3", + "projectname": "%E5%BE%AE%E5%A6%9E%E6%89%AB%E7%A0%81%E8%B4%AD", "condition": { "search": { "current": -1, From 3269ec2bce486c05d89b3bf41a22df45256fe477 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 21 May 2018 18:50:17 +0800 Subject: [PATCH 12/54] =?UTF-8?q?update[project]:=20=E8=BF=9B=E4=B8=80?= =?UTF-8?q?=E6=AD=A5=E5=AE=8C=E5=96=84=E6=89=80=E6=9C=89=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=9A=84pom.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-admin-api/pom.xml | 16 ++++++++++++++++ litemall-all/pom.xml | 15 +++++++++++++++ litemall-core/pom.xml | 17 +++++++++++++++++ litemall-db/pom.xml | 16 ++++++++++++++++ litemall-os-api/pom.xml | 16 ++++++++++++++++ litemall-wx-api/pom.xml | 3 --- litemall-wx/project.config.json | 4 ++-- 7 files changed, 82 insertions(+), 5 deletions(-) diff --git a/litemall-admin-api/pom.xml b/litemall-admin-api/pom.xml index c7f580f1..e9510a83 100644 --- a/litemall-admin-api/pom.xml +++ b/litemall-admin-api/pom.xml @@ -25,6 +25,22 @@ + + + + src/main/resources + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + org.springframework.boot diff --git a/litemall-all/pom.xml b/litemall-all/pom.xml index 7a65d4da..b06c0c11 100644 --- a/litemall-all/pom.xml +++ b/litemall-all/pom.xml @@ -47,6 +47,21 @@ + + + src/main/resources + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + maven-resources-plugin diff --git a/litemall-core/pom.xml b/litemall-core/pom.xml index 19d19c8e..4792d401 100644 --- a/litemall-core/pom.xml +++ b/litemall-core/pom.xml @@ -34,4 +34,21 @@ + + + + + src/main/resources + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + \ No newline at end of file diff --git a/litemall-db/pom.xml b/litemall-db/pom.xml index 1b1b63b8..659a5877 100644 --- a/litemall-db/pom.xml +++ b/litemall-db/pom.xml @@ -41,6 +41,22 @@ + + + + src/main/resources + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + org.mybatis.generator diff --git a/litemall-os-api/pom.xml b/litemall-os-api/pom.xml index c4d5f52b..c8c69743 100644 --- a/litemall-os-api/pom.xml +++ b/litemall-os-api/pom.xml @@ -25,6 +25,22 @@ + + + + src/main/resources + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + org.springframework.boot diff --git a/litemall-wx-api/pom.xml b/litemall-wx-api/pom.xml index 17828cad..901bde4d 100644 --- a/litemall-wx-api/pom.xml +++ b/litemall-wx-api/pom.xml @@ -11,9 +11,6 @@ - UTF-8 - UTF-8 - 1.8 litemall diff --git a/litemall-wx/project.config.json b/litemall-wx/project.config.json index 1fe9aefb..354012c5 100644 --- a/litemall-wx/project.config.json +++ b/litemall-wx/project.config.json @@ -9,8 +9,8 @@ }, "compileType": "miniprogram", "libVersion": "1.9.93", - "appid": "wx3d9beeb7481eddd3", - "projectname": "%E5%BE%AE%E5%A6%9E%E6%89%AB%E7%A0%81%E8%B4%AD", + "appid": "wxa5b486c6b918ecfb", + "projectname": "litemall-wx", "condition": { "search": { "current": -1, From 65127a0c4291922d1a883a2e9f1858b68b61b1d4 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 21 May 2018 20:17:21 +0800 Subject: [PATCH 13/54] =?UTF-8?q?fix[litemall-wx-api]:=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4dev=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-wx-api/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litemall-wx-api/src/main/resources/application.properties b/litemall-wx-api/src/main/resources/application.properties index 591705b4..1d5bfda0 100644 --- a/litemall-wx-api/src/main/resources/application.properties +++ b/litemall-wx-api/src/main/resources/application.properties @@ -1,3 +1,3 @@ -spring.profiles.active=docker +spring.profiles.active=dev server.port=8082 logging.level.org.linlinjava.litemall.wx.Application=DEBUG From 09e1847bb3546aefd447afcc8ebefb4c6d73d2f7 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 21 May 2018 22:04:38 +0800 Subject: [PATCH 14/54] update[doc] --- README.md | 22 +++---- doc/1.md | 167 ++++++++++++++++++++++++++++---------------------- doc/2.md | 71 +++++++++++++-------- doc/3.md | 68 ++++++++++---------- doc/4.md | 53 ++++++++++++++-- doc/7.md | 24 +++++--- doc/README.md | 2 +- 7 files changed, 250 insertions(+), 157 deletions(-) diff --git a/README.md b/README.md index f7ba1e34..e750edc9 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ 又一个小商场系统。 +litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端 + ## 项目代码 * [码云](https://gitee.com/linlinjava/litemall) @@ -48,14 +50,13 @@ * 会员管理 * 会员管理 - * 收货地址管理 + * 收货地址 * 会员收藏 * 会员足迹 * 搜索历史 - * 购物车 * 商城管理 * 区域配置 - * 品牌制造商 + * 品牌商 * 订单管理 * 商品类目 * 通用问题 @@ -83,6 +84,7 @@ 2. 项目配置,启用“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书” 3. 点击“编译”,即可在微信开发工具预览效果; 4. 也可以点击“预览”,然后手机扫描登录。 + 注意,手机需要打开调试功能。 ![](doc/pic/5.gif) @@ -93,31 +95,28 @@ ## 文档 -1. [系统架构](doc/1.md) -2. [基础平台](doc/2.md) -3. [小商场](doc/3.md) -4. [管理后台](doc/4.md) -5. [商场](doc/5.md) -6. [下一步计划](doc/6.md) -7. [FAQ](doc/7.md) +[在线文档](https://linlinjava.gitbook.io/litemall/)。 -文档内容采用 [署名-禁止演绎 4.0 国际协议许可](https://creativecommons.org/licenses/by-nd/4.0/deed.zh) +文档采用 [署名-禁止演绎 4.0 国际协议许可](https://creativecommons.org/licenses/by-nd/4.0/deed.zh) ## 开发计划 目前项目开发中,存在诸多不足,以下是目前规划的开发计划。 V 1.0.0 完成以下目标: + 1. 除了部分功能(如支付和优惠券等),小商城的优化和改进基本结束; 2. 管理后台基本实现所有表的CRUD操作; 3. 后台服务能够对参数进行检验。 V 2.0.0 完成以下目标: + 1. 小商城能够完成基本的业务功能; 2. 管理后台实现较好的业务操作和交互效果,而不是简单的CRUD; 3. 管理后台实现统计功能、日志功能 V 3.0.0 完成以下目标: + 1. 管理后台一些辅助功能 2. 后台服务加强安全功能、配置功能 3. 项目代码重构和清理 @@ -126,6 +125,7 @@ V 3.0.0 完成以下目标: 项目结束,已经是一个真正可工作的项目,此时进入维护阶段。 如果真的坚持到维护阶段,那么存在三种可能性: + 1. 或者开发 V 4.0.0,实现web商场子系统; 2. 或者重新开发一个新的独立项目,引入企业级功能,如缓存、权限、对象存储云服务等; 3. 或者结束,不再开发,仅仅维护。 diff --git a/doc/1.md b/doc/1.md index 6f02613e..b8bfd03a 100644 --- a/doc/1.md +++ b/doc/1.md @@ -9,27 +9,46 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 项目的架构是三个系统和六个模块: -* 基础系统(core),由数据库、litemall-cre模块、litemall-db模块、litemall-os-api模块和litemall-all模块组成; -* 小商场系统(wxmall),由litemall-wx-api模块和litemall-wx模块组成; -* 后台管理系统(admin),由litemall-admin-api模块和litemall-admin模块组成。 -* 简单商城系统(mall),这里仅列出,目前没有开发计划。 +* 基础系统子系统(core) + + 由数据库、litemall-cre模块、litemall-db模块、litemall-os-api模块和litemall-all模块组成; + +* 小商场子系统(wxmall) + + 由litemall-wx-api模块和litemall-wx模块组成; + +* 后台管理子系统(admin) + + 由litemall-admin-api模块和litemall-admin模块组成。 + +* 简单商城系统(mall) + + 这里仅列出,目前没有开发计划。 而六个模块的开发设计到三种技术栈: -* Spring Boot技术栈,采用IDEA开发工具,开发litemall-core、litemall-db、litemall-all、 +* Spring Boot技术栈 + + 采用IDEA开发工具,开发litemall-core、litemall-db、litemall-all、 litemall-os-api、litemall-admin-api和litemall-wx-api共六个个模块; -* miniprogram(微信小程序)技术栈,采用微信小程序开发工具,开发litemall-wx模块; -* Vue技术栈,采用VSC开发工具,开发litemall-admin模块。 + +* miniprogram(微信小程序)技术栈 + + 采用微信小程序开发工具,开发litemall-wx模块; + +* Vue技术栈 + + 采用VSC开发工具,开发litemall-admin模块。 ## 1.2 系统功能 -从业务功能上,目前由五个业务模块(参考nideshop-mini-program和platform)组成: +从业务功能上,目前由五个业务模块组成: * 会员业务模块 * 商场业务模块 * 商品业务模块 * 推广业务模块 -* 系统业务模块(仅管理平台) +* 系统业务模块 ### 1.2.1 小程序端功能 @@ -171,7 +190,9 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 最后,其实dep和prod不存在先后关系。例如,如果开发者已经存在域名和生产环境,可以直接 跳过dep阶段,而直接部署在线上环境中。因此有些时候,这里部署和上线是一个阶段。 + 当然,这里仍然建议先dep后prod,是因为对于第一次开发而言,先dep阶段可以避免对域名、https证书等非业务相关工作的干扰。 + 此外,有些业务功能(例如微信支付)必须是域名访问,那么开发和部署阶段可以先采用模拟或跳过的形式, 先不开发和测试这样业务功能,等其他功能开发完毕和部署测试成功以后,再来开发这些线上环境才能 运行的功能,此时会有一个好的基础。 @@ -211,6 +232,7 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 ### 1.4.0 数据库 按照开发环境前,需要先在本地配置好数据库: + 1. 本项目目前采用MySQL,请上网下载安装MySQL 5.7.x 注意: @@ -339,11 +361,9 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 > 原因是这里的appid是本人申请的,而开发者不是本人app的开发者或体验者, > 因此微信登录导致后台服务向微信服务器交互时会失败。 > 2. 有的开发者可能认为把litemall-wx模块的appid设置成开发者自己的appid就可以, -> 但是实际上,由于小商场的云主机后台服务的appid仍然是本人appid, -> 因此微信登录时仍然会失败。 +> 但是由于小商场的云主机后台服务的appid仍然是本人appid,因此微信登录时仍然会失败。 > 3. 开发者可以在litemall-wx和litemall-wx-api中设置自己的appid,以及部署自己的后台服务, -> 相关内容请阅读章节3。 -> 或者,开发者可以采用账号登录的方式登录后台服务,然后体验商品购买下单的方式。 +> 相关内容请阅读章节3。或者,开发者可以采用账号登录方式登录,然后体验商品购买下单的方式。 > 4. 由于没有设置商户支付信息,因此开发者在付款时会失败。相关内容阅读章节3。 ### 1.4.3 Vue开发环境 @@ -356,6 +376,7 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 ``` cnpm install ``` + 5. 编译并运行 ``` @@ -363,6 +384,7 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 ``` 然后,打开浏览器,输入`http://localhost:9527`。 如果出现管理后台登录页面,则表明管理后台的前端运行正常; + 6. 请确定litemall-admin-api模块已经运行,然后点击`登录`,如果能够成功登录,则表明管理后台的前端和后端对接成功,运行正常。 ## 1.5 部署方案 @@ -379,11 +401,6 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 * litemall-wx模块部署在微信开发者工具中,此外数据API地址指向litemall-wx-api所在服务qi地址 * litemall-admin编译出的静态文件放在web服务器或者tomcat服务器,此外服务器地址设置指向3中litemall-admin-api所在地址 -注意 -> * 这里litemall-os-api、litemall-admin-api和litemall-wx-api也可以选择编译成jar模式的可执行文件(因为内嵌tomcat服务器),然后直接运行。 -> * litemall-wx部署时可以放在微信开发者工具中测试,但是上线时必须设置https开头的合法域名,因此litemall-wx-api所在的服务器需要配置合适的域名和SSL证书, -> 具体参见官方文档和本项目的1.6节。 - 最后,**如果项目部署,则根据开发者的部署环境在以下文件中或代码中修改相应的配置。** 1. MySQL数据库设置合适的用户名和密码等信息,同时在litemall-os-api、litemall-wx-api和litemall-admin-api模块 @@ -414,8 +431,10 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 以下简单列举几种方案。 -### 1.5.3 基于ubuntu腾讯云的单机云部署方案 -单机云部署方案,面向的是服务器数据和应用部署在云主机单机中用于演示的场景。 +### 1.5.3 单机云部署方案 + +本节介绍基于腾讯云的单机云部署方案,面向的是服务器数据和应用部署在云主机单机中用于演示的场景。 +其他云应该也是可行的。 主要流程是:创建云主机,安装ubuntu操作系统,按照JDK和MySQL应用运行环境,部署三个Spring Boot微服务后台应用, 以及部署管理后台静态文件到tomcat。 @@ -449,6 +468,7 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 #### 1.5.3.2 JDK8 https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-get-on-ubuntu-16-04 + http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html ```bash @@ -464,7 +484,6 @@ sudo apt-get install oracle-java8-set-default #### 1.5.3.3 MySQL https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-16-04 -https://www.linuxidc.com/Linux/2017-01/139502.htm ``` sudo apt-get update @@ -504,31 +523,33 @@ sudo apt-get install mysql-client * 命令行导入 -1. 采用FileZilla把本项目的litemall.sql上传到云主机 -2. 使用PuTTY登录云主机 -3. 进入MySQL,输入上节所设置的MySQL的root密码 -4. 创建数据库、 创建用户并分配访问权限 -5. 导入数据 -6. 退出 + 1. 采用FileZilla把本项目的litemall.sql上传到云主机 + 2. 使用PuTTY登录云主机 + 3. 进入MySQL,输入上节所设置的MySQL的root密码 + 4. 创建数据库、 创建用户并分配访问权限 + 5. 导入数据 + 6. 退出 * MySQL Workbench导入 -1. 先确认已经在1.4.3节中设置了root可以远程访问; -2. 创建一个新的连接,设置`Hostname` 、`Username` 和`Password`, -然后点击`Test Connection`测试是否能够连接到云主机; -如果测试成功,则进入; -![](pic1/1-5.png) -3. 开发者自行学习文档,完成`创建数据库`、`创建用户`和`分配权限`三个操作; -4. 利用Workbench的`Server`菜单下的`Data Import`完成数据导入。 + 1. 先确认已经在1.4.3节中设置了root可以远程访问; + 2. 创建一个新的连接,设置`Hostname` 、`Username` 和`Password`, + 然后点击`Test Connection`测试是否能够连接到云主机; + 如果测试成功,则进入; + ![](pic1/1-5.png) + 3. 开发者自行学习文档,完成`创建数据库`、`创建用户`和`分配权限`三个操作; + 4. 利用Workbench的`Server`菜单下的`Data Import`完成数据导入。 * 命令脚本 -```bash -cd deploy -mysql -h localhost -u root -p123456 -source ./litemall-db/litemall_schema.sql -source ./litemall-db/litemall.sql -``` -其中123456是开发者所设置的MySQL的管理员密码。 + + ```bash + cd deploy + mysql -h localhost -u root -p123456 + source ./litemall-db/litemall_schema.sql + source ./litemall-db/litemall.sql + ``` + + 其中123456是开发者所设置的MySQL的管理员密码。 #### 1.5.3.5 Tomcat/Nginx @@ -537,15 +558,15 @@ source ./litemall-db/litemall.sql 因此这里需要安装tomcat或者nginx(或者其他服务器)。 这里可能有点绕: + 1. 开发方案,无需tomcat/nginx,直接用VSC即可; -2. 部署方案,采用tomcat,这里是因为80端口可能需要云主机备案; +2. 部署方案,采用tomcat,这里是因为80端口可能需要云主机备案因此采用tomcat使用8080端口; 3. 上线方案. 采用nginx,通过反向代理访问后台服务。 因此目前这里采用tomcat部署静态文件,通过8080端口访问管理后台。 当然,这里没有严格限制,开发者也可以直接配置好nginx,在部署方案就使用nginx来 -部署静态文件服务,通过80web端口访问管理后台。 +部署静态文件服务,通过web端口80访问管理后台。 - * Tomcat部署静态文件 1. 安装tomcat @@ -581,10 +602,10 @@ source ./litemall-db/litemall.sql 1. 安装nginx - ```bash - sudo apt-get update - sudo apt-get install nginx - ``` + ```bash + sudo apt-get update + sudo apt-get install nginx + ``` 2. 配置nginx指向`delpoy/litemall-admin/dist`目录 @@ -597,36 +618,32 @@ source ./litemall-db/litemall.sql #### 1.5.3.6 项目打包 +这里项目打包括两种: + 1. Spring Boot打包 -通常项目打包方案存在两种: + 采用如下命令进行项目打包 -* 一是打包war格式,因此云主机需要专门安装tomcat -* 二是打包可执行jar格式,此时内部包含嵌入式tomcat + ``` + cd litemall + mvn clean + mvn package + ``` -这里仅采用第二种方案,简化tomcat的安装配置过程。 - -采用如下命令进行项目打包 - -``` -cd litemall -mvn clean -mvn package -``` -此时,在litemall-os-api项目的target文件夹中看到litemall-os-xxx.jar; -在litemall-wx-api项目的target文件夹中看到litemall-wx-xxx.jar; -在litemall-admin-api项目的target文件夹中看到litemall-admin-xxx.jar。 + 此时,在litemall-os-api项目的target文件夹中看到litemall-os-xxx.jar; + 在litemall-wx-api项目的target文件夹中看到litemall-wx-xxx.jar; + 在litemall-admin-api项目的target文件夹中看到litemall-admin-xxx.jar。 2. Vue项目打包 -采用如下命令进行项目打包 + 采用如下命令进行项目打包 -````bash -cd litemall/litemall-admin -cnpm run build:dep -```` + ````bash + cd litemall/litemall-admin + cnpm run build:dep + ```` -此时,litemall-admin模块的dist文件夹中就是最终部署时的代码,可以先压缩,上传到云主机,再解压缩。 + 此时,litemall-admin模块的dist文件夹中就是最终部署时的代码,可以先压缩,上传到云主机,再解压缩。 #### 1.5.3.7 项目部署运行 @@ -705,6 +722,7 @@ cd litemall ### 1.5.4 集群式云部署方案 由于本项目是面向微小型企业的小商城系统,因此预期的分布式部署方案是 + 1. 专门的云数据库部署数据 2. 专门的云存储方案 3. 专门的CDN分发管理后台的静态文件 @@ -718,19 +736,21 @@ cd litemall 至少每个功能模块应该是独立服务系统。此外,需要引入单点登录系统、集群、缓存 和消息队列等多种技术。因此如果开发者需要这种形式的分布式方案,请参考其他项目。 -### 1.5.5 单主机单服务war部署方案 +### 1.5.5 war部署方案 -这里介绍另外一种单主机单服务的方案,即四个服务打包成一个war格式的项目部署包。 +这里介绍另外一种单主机单服务的war部署方案,即四个服务打包成一个war格式的项目部署包。 ![](pic1/1-11.png) 和1.5.3节相比,采用这样方案的原因是: + 1. 安装方便,是传统的web项目安装方式,在tomcat里面部署一个war项目包,即可完成安装; 2. 内存消耗少。在1.5.3节中四个独立的java环境消耗的内存大概1.2G多,而这里部署以后 只需要一个java环境,因此消耗内存只有1.5.3节方案的四分之一,适合1G云主机部署。 3. 只存在一个域名和端口,没有多个服务之间依赖关系。 具体的打包部署方案是; + 1. litemall-admin首先需要先编译得到静态文件; 2. 采用`mvn package`命令,litemall-all模块自动生成war格式的安装包,里面 包含了三个后台服务和静态文件; @@ -746,6 +766,7 @@ cd litemall ## 1.6 上线方案 在1.5节部署方案中,我们介绍了多种部署的方案,但是实际上这些方案都不能立即用于正式环境: + 1. 正式环境需要域名和HTTPS证书 2. 小商场的小程序端对服务器域名存在接入要求。 @@ -917,7 +938,7 @@ http://www.example.com > 本人对nginx也不了解,仅仅依靠网络知识配置了简单的效果。 > 更多配置方法和功能,请开发者自行学习。 -### 1.6.3 小商场的小程序端上线 +### 1.6.3 小程序端上线 这里参考小程序官方文档,上线自己的小商城。 @@ -965,7 +986,7 @@ http://www.example.com ### 1.6.5 上线脚本 -本项目的deploy文件夹是用于 +本项目目前没有上线脚本,不过可以参考1.5.3节中的部署脚本。 ### 1.6.6 优化 diff --git a/doc/2.md b/doc/2.md index 16e9d4b1..28fac0eb 100644 --- a/doc/2.md +++ b/doc/2.md @@ -1,13 +1,20 @@ -# 2 litemall基础平台 +# 2 litemall基础系统 -目前litemall基础系统主要由litemall数据库、litemall-core模块、litemall-db模块、 -litemall-os-api模块和litemall-all模块组成。 +目前litemall基础系统由以下部分组成: + +* litemall数据库 +* litemall-core模块 +* litemall-db模块、 +* litemall-os-api模块 +* litemall-all模块组成 + +实际上,litemall**真正的基础系统**是litemall-core模块和litemall-db模块。 -实际上,属于litemall**真正的基础系统**是litemall-core模块和litemall-db模块。 litemall-os-api模块只是为了减少开发中对第三方图片存储服务依赖而实现的简单图像存储服务, -建议开发者最终部署时切换到第三方图片存储服务。litemall-all模块只是一个包裹模块, -没有任何代码,其作用是融合三个spring boot模块和litemall-adminm模块静态文件到 -一个单独spring boot应用中,并最终打包成war格式的项目安装包。 +建议开发者最终部署时切换到第三方图片存储服务。 + +litemall-all模块则只是一个包裹模块,几乎没有任何代码。该模块的作用是融合三个spring boot模块 +和litemall-adminm模块静态文件到一个单独spring boot应用中,并最终打包成war格式的项目安装包。 目前存在的问题: @@ -102,8 +109,7 @@ litemall.sql数据库基于nideshop中的[nideshop.sql](https://github.com/tumob * 商品规格可以存在规格图片,效果是规格名称前放置规格图片 * 货品也可以存在货品图片,效果是所有规格选定以后对应的货品有货,则在货品价格前放置货品图片 * 如果商品是两种规格,分别是M个和N个规格值,那么通常应该是`M*N`个货品,但是有些货品可能天然不存在。 - 那么,此时数据库如何来设计,是允许少于`M*N`个项,还是必须等于`M*N`个,而不存在货品的数量设置为0? - * + 目前这里要求所有货品信息都应该存在,如果实际中货品不存在,也要设置商品数量为0. 注意: @@ -112,7 +118,9 @@ litemall.sql数据库基于nideshop中的[nideshop.sql](https://github.com/tumob ### 2.1.2 用户和微信用户设计 -目前准备支持用户普通账号登录和微信登录两种方式,两种登录方式仅仅采用一个litemall-user表可能不是很合适。此外,如果进一步支持其他多种第三方登录,那么这里需要重新设计。 +目前准备支持用户普通账号登录和微信登录两种方式,两种登录方式仅仅采用一个litemall-user表可能不是很合适。 + +外,如果进一步支持其他多种第三方登录,那么这里需要重新设计。 ### 2.1.3 行政区域设计 @@ -199,16 +207,16 @@ litemall.sql数据库基于nideshop中的[nideshop.sql](https://github.com/tumob 注意: > 1. 目前退款相关功能未完成。 > 2. 在上图中可以看到`101`到`101`的状态变化,这里只是小商场用户的操作,不会影响订单状态码。 -> * 用户点击付款时,后台服务会生成预支付会话id,但是不会影响订单状态。 -> * 而用户支付过程中,放弃支付,例如没有 +> 如果用户点击付款时,后台服务会生成预支付会话id,但是不会影响订单状态。 +> 如果而用户支付过程中,放弃支付,则也不会影响订单状态。 #### 2.1.4.2 状态变化所对应的流程 -* -> 101 +* 初始 -> 101 小商场用户在小商场点击`下单`按钮,此时小商城后台服务会生产商户订单。 -所对应的后台服务方法是litemall-wx-api模块的`WxOrderController.submit` +所对应的后台服务方法是litemall-wx-api模块的`WxOrderController.submit`方法。 * 101 -> 101 @@ -332,6 +340,7 @@ litemall.sql数据库基于nideshop中的[nideshop.sql](https://github.com/tumob 用户可以`确认收货` * 401 + 用户可以`退货`、`删除`、`去评价`、`再次购买` * 402 @@ -562,12 +571,16 @@ https://blog.csdn.net/isea533/article/details/42102297 开发者可以自行修改代码进行真正的物理删除。 -### 2.2.8 乐观锁 +### 2.2.8 并发访问 由于服务是多线程并发的,因此这带来了多线程同时操作数据库中同一数据的问题。 由于数据极少删除或者是逻辑删除,因此操作数据,可以简化成更新数据。 也就是说,需要解决多线程更新数据库同一数据的并发问题。 +* https://blog.csdn.net/qq315737546/article/details/76850173 +* http://baijiahao.baidu.com/s?id=1571172971189129 +* https://blog.csdn.net/speedme/article/details/48525119 + 例如,下单操作中,用户A购买商品G的数量是1个,而用户B同一时间也购买商品G的 数量也是1个,那么如果没有很好地并发控制,有可能商品G的数量仅仅是减1,而不是 设想的2。 @@ -583,14 +596,6 @@ https://blog.csdn.net/isea533/article/details/42102297 * 如果相同,说明数据没有改变则可以更新,数据更新同时version调整一个新值; * 如果不相同,则说明数据改变了则更新失败,不能修改数据。 -当然,这里好像也存在一个漏洞,3中所比较的数据库当前version字段的值有可能修改过 -但是恰巧没有变。例如version加1再减1,那么查询时该值并没有变化。当然,如果version -是单调自增,则应该不存在这个问题。 - -具体技术细节如下: - -1. - 当然,由于采用乐观锁,这里也会带来另外一个问题: 数据库有可能更新失败,那么如何处理更新失败的情况? @@ -605,7 +610,25 @@ https://blog.csdn.net/isea533/article/details/42102297 开发者需要注意这个问题,可能需要采用其他技术来解决或避免。 -### 2.2.9 mybatis增强框架 +### 2.2.9 事务管理 + +litemall-db模块中不涉及到事务管理,而是在其他后台服务模块中涉及。 +但是其他后台服务模块因为依赖litemall-db模块,因此这里列出。 + +事务管理的问题出现在多个表的修改操作中。 + +例如用户A修改表1,再修改表2,而如果修改表2的时候出现错误推出, +此时如果没有引入事务管理,那么这里会存在表1数据已跟新,表2数据 +未更新的问题。 + +解决的方案是采用spring自带的事务管理机制。 +当事务管理中的任何SQL操作出现错误而抛出异常时,则回滚之前的操作。 + +注意: +> 并发访问是多个用户同时操作单个表时可能出现的问题; +> 而事务管理是单个用户操作多个表时可能出现的问题。 + +### 2.2.10 mybatis增强框架 通过mybatis-generator已经自动生成了很多代码,而且具有一定的功能, 但是开发者仍然需要基于生成的代码写一些固定的CRUD代码。 diff --git a/doc/3.md b/doc/3.md index 3107d049..c8e5ad7b 100644 --- a/doc/3.md +++ b/doc/3.md @@ -94,6 +94,8 @@ wx.app-secret=开发者申请的app-secret ## 3.1 litemall-wx-api +本节介绍小商场的后台服务模块。 + ### 3.1.1 授权服务 #### 3.1.1.1 账号登录 @@ -266,7 +268,7 @@ wx.app-secret=开发者申请的app-secret ### 3.1.16 安全 -#### 3.1.161 Token +#### 3.1.16.1 Token 用户登录成功以后,后端会返回`token`,之后用户的请求都会携带token。 @@ -389,30 +391,36 @@ var WxApiRoot = 'http://localhost:8082/wx/'; ### 3.2.2 页面 -#### 3.2.2.1 首页 - -#### 3.2.2. - -#### 3.2.2. - -#### 3.2.2. - -#### 3.2.2. - -#### 3.2.2. - -#### 3.2.2. - -#### 3.2.2. -#### 3.2.2. - -#### 3.2.2. -#### 3.2.2. -#### 3.2.2. -#### 3.2.2. -#### 3.2.2. -#### 3.2.2. - +* 首页 +* 专题页 +* 专题详情页 +* 专题评论页 +* 专题评论添加页 +* 品牌页 +* 品牌详情页 +* 人气推荐页 +* 新品首发页 +* 分类页 +* 分类详情页 +* 查找页 +* 商品详情页 +* 商品评论页 +* 购物车页 +* 下单页 +* 下单地址页 +* 下单地址添加页 +* 支付结果页 +* 个人页 +* 订单列表页 +* 订单详情页 +* 优惠券页 +* 收藏页 +* 足迹页 +* 收货地址页 +* 收货地址添加页 +* 登录页 +* 注册页 +* 找回密码页 ### 3.2.3 登录设计 @@ -489,16 +497,6 @@ var WxApiRoot = 'http://localhost:8082/wx/'; }); ``` -#### 3.2.2.4 登录拒绝授权 - -还存在一个问题,当用户登录时,会出现"微信授权"的对话框。 -如果用户选择”拒绝“,那么之后用户的登录操作总是失败的。 - -目前的做法是,用户拒绝授权后,如果再次登录,则: -1. 弹出对话框,请求用户授权 -2. 如果用户仍然拒绝,则返回 -3. 如果用户接受授权,则弹出系统权限配置页面,等待用户给与授权。 - ### 3.2.4 立即购买和放入购物车 ### 3.2.5 storage使用 diff --git a/doc/4.md b/doc/4.md index 4eb720e6..7c0d5b45 100644 --- a/doc/4.md +++ b/doc/4.md @@ -1,7 +1,5 @@ # 4 litemall管理后台 -这里的后台管理业务参考了[platform](https://gitee.com/fuyang_lipengjun/platform). - 项目技术架构: * 后台管理前端,即litemall-admin模块 @@ -46,16 +44,61 @@ ## 4.1 litemall-admin-api -### 4.1.1 +本节介绍管理后台的后台服务模块。 + +### 4.1.1 授权服务 -### 4.1.2 安全配置 -### 4.1.3 CROS配置 +### 4.1.16 安全 + +#### 4.1.16.1 Token + +用户登录成功以后,后端会返回`token`,之后用户的请求都会携带token。 + +目前token的失效和跟新机制没有涉及。 + +#### 4.1.16.2 CROS + +如果litemall-admin-api不配置CROS,则Spring Boot会失败。 + +#### 4.1.16.3 账号密码加盐 + +如果是微信登录,那么无需账号和密码。 + +而如果用户采用了账号和密码的形式登录,那么后端需要把用户密码加盐。 + +#### 4.1.16.4 限制登录 + +如果采用账号密码登录,那么登录失败一定次数,应该限制登录。 + +进一步地,如果项目启用了短信功能,应该短信提醒用户,防止他人登录。 + +目前这里没有实现,仅列出。 + +### 4.1.17 定时任务 + +### 4.1.18 并发控制 + +参考`2.2.8 乐观锁` + +当乐观锁更新失败时采用多次尝试方案。 + +### 4.1.19 事务管理 + +### 4.1.20 开发技巧 + +当小商城后台服务开发中因为测试或者debug可能需要经常性重启应用,此时 +一旦重启,将导致小商场的小程序段的token失效,因此要求用户再次登录。 +这里,介绍一个小技巧: +开发时, + ## 4.2 litemall-admin +本节介绍管理后台的前端模块。 + litemall-admin模块的代码基于[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) ### 4.2.1 diff --git a/doc/7.md b/doc/7.md index f3d4a620..0e6c044a 100644 --- a/doc/7.md +++ b/doc/7.md @@ -2,7 +2,7 @@ ## 7.1 小商城 -### 7.1.1 为什么小程序微信登录失败 +### 7.1.1 小程序微信登录失败 原因: @@ -13,11 +13,11 @@ 1. 如果只是体验商品购买流程,开发者可以采用账号注册登录方式。 2. 开发者在litemall-wx和litemall-wx-api模块的appid等信息设置成自己申请的信息。 -### 7.1.2 为什么开发者工具运行正常,但是手机真机测试不正常? +### 7.1.2 手机真机测试不正常 现象: -手机真机扫描加载小商场以后,只有页面结构,没有数据和图片。 +开发者工具打开正常,但是手机真机扫描加载小商场以后,只有页面结构,没有数据和图片。 原因: @@ -31,7 +31,11 @@ * 小商场的后台服务未启动 2. 手机小商场的**调试功能**开启 -### 7.1.3 为什么本人手机测试正常,而第三者手机测试不正常? +### 7.1.3 第三方手机测试不正常 + +现象: + +本人手机测试正常,而第三者手机测试不正常。 解决方案: @@ -39,7 +43,11 @@ 2. 第三者手机小商场的**调试功能**开启 3. 在微信小程序平台设置第三者的微信账号是**体验者** -### 7.1.4 小商场为什么不能支付,或者为什么点击支付总是报错? +### 7.1.4 微信支付失败 + +现象: + +小商场不能支付,或者点击支付总是报错 原因: @@ -54,9 +62,9 @@ wx.notify-url= 解决方案: -参考`3.0 小商场环境`,设置好相应支付配置信息 +参考`3.0 小商场环境`,设置相应支付配置信息 -### 7.1.5 为什么小商城支付成功,但是返回以后商品订单? +### 7.1.5 支付成功,但商品仍未付款 现象: @@ -79,4 +87,4 @@ wx.notify-url= ## 7.2 管理后台 -## 7.3 基础平台 \ No newline at end of file +## 7.3 基础系统 \ No newline at end of file diff --git a/doc/README.md b/doc/README.md index 6b821a1a..e8d86464 100644 --- a/doc/README.md +++ b/doc/README.md @@ -4,7 +4,7 @@ * [更新日志](../CHANGELOG.md) * [贡献指南](../CONTRIBUTE.md) * [1. 系统架构](./1.md) -* [2. 基础平台](./2.md) +* [2. 基础系统](./2.md) * [3. 小商场](./3.md) * [4. 管理后台](./4.md) * [5. 商场](./5.md) From 95559f374e2c667aa1fa989834a51db2d1d4e210 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 21 May 2018 22:17:28 +0800 Subject: [PATCH 15/54] update[doc] --- README.md | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index e750edc9..71fac786 100644 --- a/README.md +++ b/README.md @@ -30,49 +30,26 @@ litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端 * 专题列表、专题详情 * 分类列表、分类详情 * 品牌列表、品牌详情 -* 新品首发 -* 人气推荐 -* 商品搜索 +* 新品首发、人气推荐 +* 搜索 * 商品详情 * 商品评价列表、商品评价 * 购物车 * 下单 -* 我的主页 +* 个人 * 订单列表、订单详情 * 地址列表、地址添加、地址删除 -* 我的收藏 -* 我的足迹 - +* 收藏、足迹 ### 管理平台效果 ![](doc/pic/4.png) * 会员管理 - * 会员管理 - * 收货地址 - * 会员收藏 - * 会员足迹 - * 搜索历史 * 商城管理 - * 区域配置 - * 品牌商 - * 订单管理 - * 商品类目 - * 通用问题 - * 关键词 * 商品管理 - * 商品管理 - * 商品参数 - * 商品规格 - * 货品管理 - * 用户评论 * 推广管理 - * 广告列表 - * 专题管理 * 系统管理 - * 管理员 - * 对象存储 ## 云演示 @@ -95,7 +72,7 @@ litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端 ## 文档 -[在线文档](https://linlinjava.gitbook.io/litemall/)。 +[在线文档](https://linlinjava.gitbook.io/litemall/) 文档采用 [署名-禁止演绎 4.0 国际协议许可](https://creativecommons.org/licenses/by-nd/4.0/deed.zh) From b48b884d46df04ceb7de6564b4b3ed9a61dc49dc Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Sat, 26 May 2018 11:08:40 +0800 Subject: [PATCH 16/54] =?UTF-8?q?fix[litemall-core]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=97=A5=E6=9C=9F=E6=98=BE=E7=A4=BA=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../litemall/core/config/JacksonConfig.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/JacksonConfig.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/JacksonConfig.java index 499a2202..545dffdf 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/config/JacksonConfig.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/config/JacksonConfig.java @@ -1,15 +1,16 @@ package org.linlinjava.litemall.core.config; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.time.LocalDate; @@ -19,18 +20,24 @@ import java.time.format.DateTimeFormatter; @Configuration public class JacksonConfig { - @Bean - @Primary - public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { - JavaTimeModule javaTimeModule = new JavaTimeModule(); - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); - javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); - ObjectMapper objectMapper = builder.createXmlMapper(false).build(); - objectMapper.registerModule(javaTimeModule); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - return objectMapper; + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + public Jackson2ObjectMapperBuilderCustomizer customJackson() { + return new Jackson2ObjectMapperBuilderCustomizer() { + @Override + public void customize(Jackson2ObjectMapperBuilder builder) { + builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + builder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + builder.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); + + builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + builder.deserializerByType(LocalDate.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + builder.deserializerByType(LocalTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); + builder.serializationInclusion(JsonInclude.Include.NON_NULL); + builder.failOnUnknownProperties(false); + builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + } + }; } } From d55d5d3f1ca69da56bf30df76239aeacf1967ed7 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Sat, 2 Jun 2018 23:58:47 +0800 Subject: [PATCH 17/54] =?UTF-8?q?fix[litemall-admin]=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=B1=BB=E7=9B=AE=E9=A1=B5=E9=9D=A2=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-admin/src/views/mall/category.vue | 43 ++++++++++++++-------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/litemall-admin/src/views/mall/category.vue b/litemall-admin/src/views/mall/category.vue index f18043fe..818561e8 100644 --- a/litemall-admin/src/views/mall/category.vue +++ b/litemall-admin/src/views/mall/category.vue @@ -102,13 +102,13 @@ - + 点击上传 - + 点击上传 @@ -120,7 +120,7 @@ - + 点击上传 @@ -151,6 +151,7 @@ \ No newline at end of file diff --git a/litemall-admin/src/views/stat/order.vue b/litemall-admin/src/views/stat/order.vue new file mode 100644 index 00000000..d348aea6 --- /dev/null +++ b/litemall-admin/src/views/stat/order.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/litemall-admin/src/views/stat/user.vue b/litemall-admin/src/views/stat/user.vue new file mode 100644 index 00000000..a89073ab --- /dev/null +++ b/litemall-admin/src/views/stat/user.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java new file mode 100644 index 00000000..4d57a60e --- /dev/null +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/dao/StatMapper.java @@ -0,0 +1,13 @@ +package org.linlinjava.litemall.db.dao; + +import org.apache.ibatis.annotations.Param; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public interface StatMapper { + List statUser(); + List statOrder(); + List statGoods(); +} \ No newline at end of file diff --git a/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java new file mode 100644 index 00000000..0e39bde1 --- /dev/null +++ b/litemall-db/src/main/java/org/linlinjava/litemall/db/service/StatService.java @@ -0,0 +1,32 @@ +package org.linlinjava.litemall.db.service; + +import com.github.pagehelper.PageHelper; +import org.linlinjava.litemall.db.dao.LitemallUserMapper; +import org.linlinjava.litemall.db.dao.StatMapper; +import org.linlinjava.litemall.db.domain.LitemallUser; +import org.linlinjava.litemall.db.domain.LitemallUserExample; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; + +@Service +public class StatService { + @Resource + private StatMapper statMapper; + + + public List statUser() { + return statMapper.statUser(); + } + + public List statOrder(){ + return statMapper.statOrder(); + } + + public List statGoods(){ + return statMapper.statGoods(); + } +} diff --git a/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml b/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml new file mode 100644 index 00000000..bef392e7 --- /dev/null +++ b/litemall-db/src/main/resources/org/linlinjava/litemall/db/dao/StatMapper.xml @@ -0,0 +1,31 @@ + + + + + + + \ No newline at end of file diff --git a/litemall-db/src/test/java/org/linlinjava/litemall/db/StatMapperTest.java b/litemall-db/src/test/java/org/linlinjava/litemall/db/StatMapperTest.java new file mode 100644 index 00000000..fc3cd751 --- /dev/null +++ b/litemall-db/src/test/java/org/linlinjava/litemall/db/StatMapperTest.java @@ -0,0 +1,46 @@ +package org.linlinjava.litemall.db; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.linlinjava.litemall.db.dao.StatMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import java.util.List; +import java.util.Map; + +@WebAppConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest +public class StatMapperTest { + + @Autowired + private StatMapper statMapper; + + @Test + public void testUser() { + List result = statMapper.statUser(); + for(Map m : result) { + m.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); + } + } + + @Test + public void testOrder() { + List result = statMapper.statOrder(); + for(Map m : result) { + m.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); + } + } + + @Test + public void testGoods() { + List result = statMapper.statGoods(); + for(Map m : result) { + m.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v)); + } + } + +} From 240caad9f82f1920f1f2edcd7f94c0013a15be05 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Mon, 4 Jun 2018 16:03:02 +0800 Subject: [PATCH 19/54] =?UTF-8?q?fix[litemall-wx,litemall-wx-api]:=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E5=B0=8F=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/linlinjava/litemall/wx/web/WxAuthController.java | 1 + .../org/linlinjava/litemall/wx/web/WxHomeController.java | 9 ++++++++- .../linlinjava/litemall/wx/web/WxOrderController.java | 1 + litemall-wx/pages/shopping/checkout/checkout.js | 5 +++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java index 93583ad0..ff820457 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java @@ -237,6 +237,7 @@ public class WxAuthController { user.setStatus("可用"); user.setLastLoginTime(LocalDateTime.now()); user.setLastLoginIp(IpUtil.client(request)); + user.setAddTime(LocalDateTime.now()); userService.add(user); diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxHomeController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxHomeController.java index 98a9432e..4b640030 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxHomeController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxHomeController.java @@ -84,7 +84,14 @@ public class WxHomeController { l2List.add(catL2.getId()); } - List categoryGoods = goodsService.queryByCategory(l2List, 0, 5); + List categoryGoods = null; + if(l2List.size() == 0){ + categoryGoods = new ArrayList<>(); + } + else{ + categoryGoods = goodsService.queryByCategory(l2List, 0, 5); + } + Map catGoods = new HashMap(); catGoods.put("id", catL1.getId()); catGoods.put("name", catL1.getName()); diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java index c8b9d72b..e38343e7 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java @@ -341,6 +341,7 @@ public class WxOrderController { orderGoods.setNumber(cartGoods.getNumber()); orderGoods.setGoodsSpecificationIds(cartGoods.getGoodsSpecificationIds()); orderGoods.setGoodsSpecificationValues(cartGoods.getGoodsSpecificationValues()); + orderGoods.setAddTime(LocalDateTime.now()); // 添加订单商品表项 orderGoodsService.add(orderGoods); diff --git a/litemall-wx/pages/shopping/checkout/checkout.js b/litemall-wx/pages/shopping/checkout/checkout.js index 471ac4cc..360d9808 100644 --- a/litemall-wx/pages/shopping/checkout/checkout.js +++ b/litemall-wx/pages/shopping/checkout/checkout.js @@ -162,6 +162,11 @@ Page({ } }); } + else{ + wx.redirectTo({ + url: '/pages/payResult/payResult?status=0&orderId=' + orderId + }); + } }); } else { From 86cbc11db3b3177df9cbdc19e38878d6a3c3b2a5 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Tue, 5 Jun 2018 16:39:14 +0800 Subject: [PATCH 20/54] =?UTF-8?q?feature[litemall-admin]:=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E7=AC=AC=E4=B8=89=E6=96=B9=E7=99=BB=E9=99=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E7=9B=AE=E5=89=8D=E4=B8=8D=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- litemall-admin/src/permission.js | 2 +- litemall-admin/src/router/index.js | 1 - .../src/views/login/authredirect.vue | 10 --- litemall-admin/src/views/login/index.vue | 53 +-------------- .../src/views/login/socialsignin.vue | 68 ------------------- 5 files changed, 3 insertions(+), 131 deletions(-) delete mode 100644 litemall-admin/src/views/login/authredirect.vue delete mode 100644 litemall-admin/src/views/login/socialsignin.vue diff --git a/litemall-admin/src/permission.js b/litemall-admin/src/permission.js index 73ec8946..e9937a51 100644 --- a/litemall-admin/src/permission.js +++ b/litemall-admin/src/permission.js @@ -14,7 +14,7 @@ function hasPermission(roles, permissionRoles) { return roles.some(role => permissionRoles.indexOf(role) >= 0) } -const whiteList = ['/login', '/authredirect']// no redirect whitelist +const whiteList = ['/login']// no redirect whitelist router.beforeEach((to, from, next) => { NProgress.start() // start progress bar diff --git a/litemall-admin/src/router/index.js b/litemall-admin/src/router/index.js index 35b95a6c..35ed5fd1 100644 --- a/litemall-admin/src/router/index.js +++ b/litemall-admin/src/router/index.js @@ -29,7 +29,6 @@ import Layout from '../views/layout/Layout' **/ export const constantRouterMap = [ { path: '/login', component: _import('login/index'), hidden: true }, - { path: '/authredirect', component: _import('login/authredirect'), hidden: true }, { path: '/404', component: _import('error/404'), hidden: true }, { path: '/401', component: _import('error/401'), hidden: true }, { diff --git a/litemall-admin/src/views/login/authredirect.vue b/litemall-admin/src/views/login/authredirect.vue deleted file mode 100644 index 7cf37e81..00000000 --- a/litemall-admin/src/views/login/authredirect.vue +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/litemall-admin/src/views/login/index.vue b/litemall-admin/src/views/login/index.vue index 880f7328..b92048dd 100644 --- a/litemall-admin/src/views/login/index.vue +++ b/litemall-admin/src/views/login/index.vue @@ -2,7 +2,7 @@ - - 第三方登录 - - 本地不能模拟,请结合自己业务进行模拟!!! -
-
-
- -
- @@ -210,12 +172,6 @@ $light_gray:#eee; text-align: center; font-weight: bold; } - .set-language { - color: #fff; - position: absolute; - top: 5px; - right: 0px; - } } .show-pwd { position: absolute; @@ -226,10 +182,5 @@ $light_gray:#eee; cursor: pointer; user-select: none; } - .thirdparty-button { - position: absolute; - right: 35px; - bottom: 28px; - } } diff --git a/litemall-admin/src/views/login/socialsignin.vue b/litemall-admin/src/views/login/socialsignin.vue deleted file mode 100644 index bdd11120..00000000 --- a/litemall-admin/src/views/login/socialsignin.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - From 1d08bb4db69d65e770e38130325c6c660eb0fe50 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Tue, 5 Jun 2018 19:27:31 +0800 Subject: [PATCH 21/54] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=94=99=E8=AF=AF=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/web/AdminAddressController.java | 10 ++-- .../admin/web/AdminHistoryController.java | 4 +- .../admin/web/AdminOrderController.java | 4 +- .../admin/web/AdminUserController.java | 4 +- litemall-admin/src/permission.js | 2 +- litemall-admin/src/utils/request.js | 23 +++++---- .../litemall/core/util/ResponseUtil.java | 47 ++++++------------- .../litemall/wx/web/WxAuthController.java | 2 +- .../litemall/wx/web/WxOrderController.java | 6 +-- .../litemall/wx/web/WxTopicController.java | 2 +- litemall-wx/utils/util.js | 2 +- 11 files changed, 47 insertions(+), 59 deletions(-) diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java index a71befc9..89922198 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminAddressController.java @@ -53,7 +53,7 @@ public class AdminAddressController { @RequestParam(value = "limit", defaultValue = "10") Integer limit, String sort, String order){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } List addressList = addressService.querySelective(userId, name, page, limit, sort, order); @@ -75,7 +75,7 @@ public class AdminAddressController { @PostMapping("/create") public Object create(@LoginAdmin Integer adminId, @RequestBody LitemallAddress address){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } String mobile = address.getMobile(); @@ -92,7 +92,7 @@ public class AdminAddressController { @GetMapping("/read") public Object read(@LoginAdmin Integer adminId, Integer addressId){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } LitemallAddress address = addressService.findById(addressId); @@ -103,7 +103,7 @@ public class AdminAddressController { @PostMapping("/update") public Object update(@LoginAdmin Integer adminId, @RequestBody LitemallAddress address){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } addressService.updateById(address); Map addressVo = toVo(address); @@ -113,7 +113,7 @@ public class AdminAddressController { @PostMapping("/delete") public Object delete(@LoginAdmin Integer adminId, @RequestBody LitemallAddress address){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } addressService.delete(address.getId()); return ResponseUtil.ok(); diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminHistoryController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminHistoryController.java index 93580a75..03521d57 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminHistoryController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminHistoryController.java @@ -43,9 +43,9 @@ public class AdminHistoryController { @PostMapping("/create") public Object create(@LoginAdmin Integer adminId, @RequestBody LitemallSearchHistory history){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } - return ResponseUtil.fail501(); + return ResponseUtil.unsupport(); } @GetMapping("/read") diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java index dd3475ee..3732279f 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java @@ -48,7 +48,7 @@ public class AdminOrderController { @RequestParam(value = "limit", defaultValue = "10") Integer limit, String sort, String order){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } List orderList = orderService.querySelective(userId, orderSn, page, limit, sort, order); int total = orderService.countSelective(userId, orderSn, page, limit, sort, order); @@ -74,7 +74,7 @@ public class AdminOrderController { @GetMapping("/read") public Object read(@LoginAdmin Integer adminId, Integer id){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } LitemallOrder order = orderService.findById(id); diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java index a172dbd9..36469866 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminUserController.java @@ -29,7 +29,7 @@ public class AdminUserController { @RequestParam(value = "limit", defaultValue = "10") Integer limit, String sort, String order){ if(adminId == null){ - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } List userList = userService.querySelective(username, mobile, page, limit, sort, order); int total = userService.countSeletive(username, mobile, page, limit, sort, order); @@ -43,7 +43,7 @@ public class AdminUserController { @GetMapping("/username") public Object username(String username){ if(StringUtil.isEmpty(username)){ - return ResponseUtil.fail402(); + return ResponseUtil.badArgument(); } int total = userService.countSeletive(username, null, null, null, null, null); diff --git a/litemall-admin/src/permission.js b/litemall-admin/src/permission.js index e9937a51..b6c6bf9e 100644 --- a/litemall-admin/src/permission.js +++ b/litemall-admin/src/permission.js @@ -33,7 +33,7 @@ router.beforeEach((to, from, next) => { }) }).catch(() => { store.dispatch('FedLogOut').then(() => { - Message.error('Verification failed, please login again') + Message.error('验证失败,请输入正确的用户名和密码') next({ path: '/login' }) }) }) diff --git a/litemall-admin/src/utils/request.js b/litemall-admin/src/utils/request.js index 750123de..c0c5757b 100644 --- a/litemall-admin/src/utils/request.js +++ b/litemall-admin/src/utils/request.js @@ -26,22 +26,29 @@ service.interceptors.request.use(config => { service.interceptors.response.use( response => { const res = response.data - if (res.errno === 502) { - MessageBox.alert('系统内部错误,请联系管理员维护', '错误', { + + if (res.errno === 501) { + MessageBox.alert('系统未登录,请重新登录', '未登录', { confirmButtonText: '确定', type: 'error' - }) - return Promise.reject('error') - } else if (res.errno !== 0) { - MessageBox.alert('超时自动退出系统,请重新登录', '已退出', { - confirmButtonText: '重新登录', - type: 'error' }).then(() => { store.dispatch('FedLogOut').then(() => { location.reload() }) }) return Promise.reject('error') + } else if (res.errno === 502) { + MessageBox.alert('系统内部错误,请联系管理员维护', '错误', { + confirmButtonText: '确定', + type: 'error' + }) + return Promise.reject('error') + } else if (res.errno === 503) { + MessageBox.alert('请求业务目前未支持', '警告', { + confirmButtonText: '确定', + type: 'error' + }) + return Promise.reject('error') } else { return response } diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java index ed995691..223fa644 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/util/ResponseUtil.java @@ -41,46 +41,27 @@ public class ResponseUtil { return obj; } - public static Object fail401() { - return fail(401, "请登录"); + + + public static Object badArgument(){ + return fail(401, "参数不对"); + } + + + public static Object badArgumentValue(){ + return fail(402, "参数值不对"); } public static Object unlogin(){ - return fail401(); - } - - public static Object fail402() { - return fail(402, "参数不对"); - } - - public static Object badArgument(){ - return fail402(); - } - - public static Object fail403() { - return fail(403, "参数值不对"); - } - - public static Object badArgumentValue(){ - return fail403(); - } - - public static Object fail501() { - return fail(501, "业务不支持"); - } - - public static Object unsupport(){ - return fail501(); - } - - public static Object fail502() { - return fail(502, "系统内部错误"); + return fail(501, "请登录"); } public static Object serious(){ - return fail502(); + return fail(502, "系统内部错误"); } - + public static Object unsupport(){ + return fail(503, "业务不支持"); + } } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java index ff820457..52ef9f03 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAuthController.java @@ -69,7 +69,7 @@ public class WxAuthController { List userList =userService.queryByUsername(username); LitemallUser user = null; if(userList.size() > 1){ - return ResponseUtil.fail502(); + return ResponseUtil.serious(); } else if(userList.size() == 0){ return ResponseUtil.badArgumentValue(); diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java index e38343e7..9080af3b 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxOrderController.java @@ -125,7 +125,7 @@ public class WxOrderController { @RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "size", defaultValue = "10") Integer size) { if (userId == null) { - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } if (showType == null) { showType = 0; @@ -186,10 +186,10 @@ public class WxOrderController { @GetMapping("detail") public Object detail(@LoginUser Integer userId, Integer orderId) { if (userId == null) { - return ResponseUtil.fail401(); + return ResponseUtil.unlogin(); } if (orderId == null) { - return ResponseUtil.fail402(); + return ResponseUtil.badArgument(); } // 订单信息 diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxTopicController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxTopicController.java index 832c4a9a..8cf81975 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxTopicController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxTopicController.java @@ -87,7 +87,7 @@ public class WxTopicController { @GetMapping("related") public Object related(Integer id) { if(id == null){ - return ResponseUtil.fail402(); + return ResponseUtil.badArgument(); } List topicRelatedList = topicService.queryRelatedList(id, 0, 4); diff --git a/litemall-wx/utils/util.js b/litemall-wx/utils/util.js index b8b1862b..8086262d 100644 --- a/litemall-wx/utils/util.js +++ b/litemall-wx/utils/util.js @@ -36,7 +36,7 @@ function request(url, data = {}, method = "GET") { if (res.statusCode == 200) { - if (res.data.errno == 401) { + if (res.data.errno == 501) { // 清除登录相关内容 try { wx.removeStorageSync('userInfo'); From 7e217d8573c0b7c3b17b6a22abec104b46f46ff9 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Tue, 5 Jun 2018 22:01:08 +0800 Subject: [PATCH 22/54] =?UTF-8?q?refactor[litemall-admin,=20litemall-admin?= =?UTF-8?q?-api]:=20=E8=AE=A2=E5=8D=95=E9=A1=B5=E9=9D=A2=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E3=80=82=201.=20=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=A1=B5=E9=9D=A2=E5=8F=AF=E4=BB=A5=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=EF=BC=9B=202.=20=E7=AE=A1=E7=90=86=E5=91=98=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=A1=B5=E9=9D=A2=E5=8F=AF=E4=BB=A5=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/web/AdminOrderController.java | 85 +--------- litemall-admin/src/api/order.js | 24 +-- litemall-admin/src/utils/request.js | 2 + litemall-admin/src/views/mall/order.vue | 156 ++++++++---------- 4 files changed, 85 insertions(+), 182 deletions(-) diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java index 3732279f..93ddfe94 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminOrderController.java @@ -21,6 +21,7 @@ import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; @@ -60,73 +61,6 @@ public class AdminOrderController { return ResponseUtil.ok(data); } - /* - * 目前的逻辑不支持管理员创建 - */ - @PostMapping("/create") - public Object create(@LoginAdmin Integer adminId, @RequestBody LitemallOrder order){ - if(adminId == null){ - return ResponseUtil.unlogin(); - } - return ResponseUtil.unsupport(); - } - - @GetMapping("/read") - public Object read(@LoginAdmin Integer adminId, Integer id){ - if(adminId == null){ - return ResponseUtil.unlogin(); - } - - LitemallOrder order = orderService.findById(id); - return ResponseUtil.ok(order); - } - - /* - * 目前仅仅支持管理员设置发货相关的信息 - */ - @PostMapping("/update") - public Object update(@LoginAdmin Integer adminId, @RequestBody LitemallOrder order){ - if(adminId == null){ - return ResponseUtil.unlogin(); - } - - Integer orderId = order.getId(); - if(orderId == null){ - return ResponseUtil.badArgument(); - } - - LitemallOrder litemallOrder = orderService.findById(orderId); - if(litemallOrder == null){ - return ResponseUtil.badArgumentValue(); - } - - if(OrderUtil.isPayStatus(litemallOrder) || OrderUtil.isShipStatus(litemallOrder)){ - LitemallOrder newOrder = new LitemallOrder(); - newOrder.setId(orderId); - newOrder.setShipChannel(order.getShipChannel()); - newOrder.setShipSn(order.getOrderSn()); - newOrder.setShipStartTime(order.getShipStartTime()); - newOrder.setShipEndTime(order.getShipEndTime()); - newOrder.setOrderStatus(OrderUtil.STATUS_SHIP); - orderService.update(newOrder); - } - else { - return ResponseUtil.badArgumentValue(); - } - - litemallOrder = orderService.findById(orderId); - return ResponseUtil.ok(litemallOrder); - } - - @PostMapping("/delete") - public Object delete(@LoginAdmin Integer adminId, @RequestBody LitemallOrder order){ - if(adminId == null){ - return ResponseUtil.unlogin(); - } - return ResponseUtil.unsupport(); - } - - /** * 订单退款确认 * 1. 检测当前订单是否能够退款确认 @@ -139,12 +73,13 @@ public class AdminOrderController { * 成功则 { errno: 0, errmsg: '成功' } * 失败则 { errno: XXX, errmsg: XXX } */ - @PostMapping("refundConfirm") - public Object refundConfirm(@LoginAdmin Integer adminId, @RequestBody String body) { + @PostMapping("refund") + public Object refund(@LoginAdmin Integer adminId, @RequestBody String body) { if (adminId == null) { return ResponseUtil.unlogin(); } Integer orderId = JacksonUtil.parseInteger(body, "orderId"); + Integer refundMoney = JacksonUtil.parseInteger(body, "refundMoney"); if (orderId == null) { return ResponseUtil.badArgument(); } @@ -153,13 +88,14 @@ public class AdminOrderController { if (order == null) { return ResponseUtil.badArgument(); } - if (!order.getUserId().equals(adminId)) { + + if(order.getActualPrice().compareTo(new BigDecimal(refundMoney)) != 0){ return ResponseUtil.badArgumentValue(); } - OrderHandleOption handleOption = OrderUtil.build(order); - if (!handleOption.isRefund()) { - return ResponseUtil.fail(403, "订单不能取消"); + // 如果订单不是退款状态,则不能退款 + if (!order.getOrderStatus().equals(OrderUtil.STATUS_REFUND)) { + return ResponseUtil.fail(403, "订单不能确认收货"); } // 开启事务管理 @@ -217,9 +153,6 @@ public class AdminOrderController { if (order == null) { return ResponseUtil.badArgument(); } - if (!order.getUserId().equals(adminId)) { - return ResponseUtil.badArgumentValue(); - } // 如果订单不是已付款状态,则不能发货 if (!order.getOrderStatus().equals(OrderUtil.STATUS_PAY)) { diff --git a/litemall-admin/src/api/order.js b/litemall-admin/src/api/order.js index de6e814e..58d76cb2 100644 --- a/litemall-admin/src/api/order.js +++ b/litemall-admin/src/api/order.js @@ -8,33 +8,17 @@ export function listOrder(query) { }) } -export function createOrder(data) { +export function shipOrder(data) { return request({ - url: '/order/create', + url: '/order/ship', method: 'post', data }) } -export function readOrder(data) { +export function refundOrder(data) { return request({ - url: '/order/read', - method: 'get', - data - }) -} - -export function updateOrder(data) { - return request({ - url: '/order/update', - method: 'post', - data - }) -} - -export function deleteOrder(data) { - return request({ - url: '/order/delete', + url: '/order/refund', method: 'post', data }) diff --git a/litemall-admin/src/utils/request.js b/litemall-admin/src/utils/request.js index c0c5757b..c6a9108e 100644 --- a/litemall-admin/src/utils/request.js +++ b/litemall-admin/src/utils/request.js @@ -49,6 +49,8 @@ service.interceptors.response.use( type: 'error' }) return Promise.reject('error') + } else if (res.errno !== 0) { + return Promise.reject('error') } else { return response } diff --git a/litemall-admin/src/views/mall/order.vue b/litemall-admin/src/views/mall/order.vue index efda9744..3c71eb18 100644 --- a/litemall-admin/src/views/mall/order.vue +++ b/litemall-admin/src/views/mall/order.vue @@ -25,17 +25,14 @@ - + - - - - + @@ -43,10 +40,10 @@ - + @@ -59,46 +56,31 @@ - - + + - + - - - - - + - - - - - - - - - - - - - - - - + + + + + @@ -120,7 +102,7 @@ \ No newline at end of file diff --git a/litemall-admin/src/views/goods/specification.vue b/litemall-admin/src/views/goods/specification.vue index 3614033a..96ce4bb1 100644 --- a/litemall-admin/src/views/goods/specification.vue +++ b/litemall-admin/src/views/goods/specification.vue @@ -6,7 +6,6 @@ 查找 - 添加 导出 @@ -30,7 +29,6 @@ @@ -42,8 +40,8 @@ - - + + @@ -60,8 +58,7 @@ @@ -69,7 +66,7 @@ diff --git a/litemall-admin/src/views/goods/comment.vue b/litemall-admin/src/views/goods/comment.vue index f2a7366f..150366b5 100644 --- a/litemall-admin/src/views/goods/comment.vue +++ b/litemall-admin/src/views/goods/comment.vue @@ -15,25 +15,25 @@ - + - + - + - + - + - + - +