Commit 6c14c43c authored by Junling Bu's avatar Junling Bu
Browse files

V 0.1.0, 项目架构基本完成。

parents
/.idea/
/private/
/storage/
MIT License
Copyright (c) 2018 linlinjava(linlinjava@163.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
litemall
=====
又一个小商场系统。
项目代码
====
* [码云](https://gitee.com/linlinjava/litemall)
* [GitHub](https://github.com/linlinjava/litemall)
项目架构
====
![](./doc/pic/1.png)
技术栈
===
> 1. Spring Boot
> 2. Vue
> 3. 微信小程序
![](doc/pic/2.png)
效果
==
### 小商城效果
![](doc/pic/3.png)
* 首页
* 专题列表、专题详情
* 分类列表、分类详情
* 品牌列表、品牌详情
* 新品首发
* 人气推荐
* 商品搜索
* 商品详情
* 商品评价列表、商品评价
* 购物车
* 下单
* 我的主页
* 订单列表、订单详情
* 地址列表、地址添加、地址删除
* 我的收藏
* 我的足迹
### 管理平台效果
![](doc/pic/4.png)
* 会员管理
* 商场管理
* 商品管理
* 推广管理
* 系统管理
云演示
==
### 小商城演示访问
由于没有上线,只能在微信开发工具中测试运行:
1. 微信开发工具导入litemall-wx项目;
2. 项目配置,启用“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”
3. 点击“编译”,即可在微信开发工具预览效果;
4. 也可以点击“预览”,然后手机扫描登陆。
![](doc/pic/5.gif)
### 管理平台演示访问
1. 浏览器打开,输入以下网址`http://122.152.206.172:8080/#/login`
2. 用户名`admin123`,密码`admin123`
文档
==
1. [系统架构](doc/1.md)
2. [基础子系统](doc/2.md)
3. [小程序子系统](doc/3.md)
4. [管理后台子系统](doc/4.md)
5. [商场子系统](doc/5.md)
6. [下一步计划](doc/6.md)
更新
==
* V 0.1.0,项目架构基本完成。
警告
==
> 1. 本项目仅用于学习练习
> 2. 数据库数据来自nideshop
> 3. 项目代码目前还不完善,仍处在开发中
> 4. 项目开源(MIT),但不承担任何使用后果
致谢
==
本项目基于或参考以下项目:
> 1. nideshop-mini-program
> 如果后端希望采用nodejs,用户可以访问nideshop项目
> 2. platform
> 如果后端希望采用非spring boot版的普通spring版或者更多功能,
> 用户可以访问platform项目
> 3. vue-element-admin
本项目所依赖的其他开源项目见相关章节
/litemall-admin-api/litemall-admin-api.jar
/litemall-os-api/litemall-os-api.jar
/litemall-wx-api/litemall-wx-api.jar
/litemall-admin/dist.tar
1. 项目进一步打包到deploy文件夹中:
* litemall-os-api模块编译得到的litemall-os-api-0.1.0.jar 保存到deploy的litemall-os-api文件夹中,同时重命名成litemall-os-api.jar
* litemall-wx-api模块编译得到的litemall-wx-api-0.1.0.jar 保存到deploy的litemall-wx-api文件夹中,同时重命名成litemall-wx-api.jar
* litemall-admin-api模块编译得到的litemall-admin-api-0.1.0.jar 保存到deploy的litemall-admin-api文件夹中,同时重命名成litemall-admin-api.jar
* litemall-admin模块编译以后,把dist文件夹压缩,然后放到deploy的litemall-admin文件夹中。
2. 使用FileZilla把deploy整个文件夹上传到云主机的/home/ubuntu文件夹中
3. 使用PuTTY登陆云主机
4. 运行脚本部署运行
```bash
sudo ./deploy/bin/deploy.sh
```
5. 测试部署是否成功
请确保litemall的Spring Boot应用模块所对应的端口已经打开;
然后测试是否能够访问(xxx.xxx.xxx.xxx是云主机IP):
> http://xxx.xxx.xxx.xxx:8081/storage/index/index
> http://xxx.xxx.xxx.xxx:8082/wx/index/index
> http://xxx.xxx.xxx.xxx:8083/admin/index/index
\ No newline at end of file
#!/bin/bash
#部署litemall-admin静态文件应用
cd /home/ubuntu/deploy/litemall-admin
rm -rf dist
mkdir dist
tar -zxvf dist.tar -C dist
cd .
#部署三个Spring Boot应用
#如果服务已经启动,则尝试停止
sudo /etc/init.d/litemall-os-api stop
sudo /etc/init.d/litemall-wx-api stop
sudo /etc/init.d/litemall-admin-api stop
#部署Spring Boot应用成服务
sudo ln -f -s /home/ubuntu/deploy/litemall-os-api/litemall-os-api.jar /etc/init.d/litemall-os-api
sudo ln -f -s /home/ubuntu/deploy/litemall-wx-api/litemall-wx-api.jar /etc/init.d/litemall-wx-api
sudo ln -f -s /home/ubuntu/deploy/litemall-admin-api/litemall-admin-api.jar /etc/init.d/litemall-admin-api
#启动服务
sudo /etc/init.d/litemall-os-api restart
sudo /etc/init.d/litemall-wx-api restart
sudo /etc/init.d/litemall-admin-api restart
\ No newline at end of file
RUN_ARGS=--spring.profiles.active=prod
JAVA_OPTS=
\ No newline at end of file
RUN_ARGS=--spring.profiles.active=prod
JAVA_OPTS=
\ No newline at end of file
RUN_ARGS=--spring.profiles.active=prod
JAVA_OPTS=
\ No newline at end of file
# 1 litemall系统
## 1.1 简介
litemall是一个简单的商场系统,基于现有的开源项目,重新实现一个完整的前后端项目,包含小程序客户端和网页管理端。
![](./pic1/1-1.png)
项目的架构是三个系统和六个模块:
* 基础系统(core),由数据库、数据库业务模块litemall-db、对象存储模块litemall-os-api组成;
* 小商场系统(wxmall),由litemall-wx-api模块和litemall-wx模块组成;
* 后台管理系统(admin),由litemall-admin-api模块和litemall-admin模块组成。
* 简单商城系统(mall),这里仅列出,目前没有开发计划。
而六个模块的开发设计到三种技术栈:
* Spring Boot技术栈,采用IDEA开发工具,开发litemall-db、litemall-os-api、litemall-admin-api和litemall-wx-api共四个模块;
* miniprogram(微信小程序)技术栈,采用微信小程序开发工具,开发litemall-wx模块;
* Vue技术栈,采用VSC开发工具,开发litemall-admin模块。
## 1.2 系统功能
从业务功能上,目前由五个业务模块(参考nideshop-mini-program和platform)组成:
* 会员业务模块
* 商场业务模块
* 商品业务模块
* 推广业务模块
* 系统业务模块(仅管理平台)
### 1.2.1 小程序端功能
* 首页
* 专题列表
* 专题详情
* 分类列表
* 分类详情
* 品牌列表
* 品牌详情
* 新品首发
* 人气推荐
* 商品搜索
* 商品详情
* 商品评价列表
* 商品评价
* 购物车
* 下单
* 我的主页
* 订单列表
* 订单详情
* 地址列表
* 地址添加
* 我的收藏
* 我的足迹
* 支付页面(待定)
* 优惠券选择(待定)
* 我的优惠券(待定)
### 1.2.2 管理平台功能
* 会员管理
* 会员管理
* 收货地址管理
* 会员收藏
* 会员足迹
* 搜索历史
* 购物车
* 会员等级(待定)
* 会员优惠劵(待定)
* 商城管理
* 区域配置
* 品牌制造商
* 订单管理
* 商品类目
* 通用问题
* 关键词
* 渠道管理(待定)
* 商品管理
* 商品管理
* 商品参数
* 商品规格
* 货品管理
* 用户评论
* 团购设置(待定)
* 商品满减搭配(待定)
* 推广管理
* 广告列表
* 专题管理
* 优惠劵管理(待定)
* 系统管理
* 管理员
* 对象存储
* 权限管理(待定)
* 定时任务(待定)
* 参数管理(待定)
* 系统日志(待定)
## 1.3 项目特点
存在以下特点:
* 数据库方面,只是简单的表,表和表之间的依赖关系没有采用外键设计,而是依赖Java代码在service层面或者业务层面保证。这样做的好处是数据库频繁改动很方便,不会因为外键而导致数据库难以修改;
* 涉及三种技术栈,但是每种技术栈仅涉及最基础的技术;
* 后端技术栈,仅涉及 Spring,Spring Boot, Spring MVC和Mybatis技术,其他后端技术暂时不采用;
* 小程序技术栈,仅涉及miniprogram官方文档和nideshop-mini-program项目;
* 前端技术栈,仅涉及vue, vuex, vue-route,element-ui技术和vue-element-admin项目;
* 安全方面,仅采用最基本的代码,提供简单基本的安全服务;
* 性能方面,没有涉及内存数据库缓存功能,而是完全依赖MySQL;
* 对象存储服务(图片上传和下载)方面,没有采用云存储方案,而是实现自有的简单文件上传下载功能。对象只是简单存储在后台主机的一个文件夹中,从而解耦当前项目对对象存储云平台的依赖,同时加强对对象存储概念的理解。
总之,目前的系统只是为了学习技术和业务而开发的一个简单商场原型系统。虽然缺失很多企业级功能,但是是完整和合理的原型系统。
注意:
> 以上特点并不一定是优点。
## 1.4 开发方案
![](pic1/1-2.png)
如图所示,当前开发阶段的方案:
* MySQL数据访问地址`jdbc:mysql://localhost:3306/litemall`
* litemall-os-api对象存储服务地址`http://localhost:8081`
* litemall-wx-api后台服务地址`http://localhost:8082`,数据则来自MySQL
* litemall-admin-api后台服务地址`http://localhost:8083`,数据则来自MySQL
* litemall-admin前端访问地址`http://localhost:9527`, 数据来自litemall-admin-api
* litemall-wx没有前端访问地址,而是直接在微信小程序工具上编译测试开发,最终会部署到微信官方平台(即不需要自己部署web服务器),而数据则来自litemall-wx-api
### 1.4.1 Spring Boot开发环境
1. 安装JDK8
2. 安装IDEA Community
3. 安装maven
4. 安装Git(可选)
5. IDEA导入本项目
6. 采用maven插件安装依赖库
7. 编译本项目
8. 运行litemall-os-api, 打开浏览器,输入
```
http://localhost:8081/storage/index/index
```
如果出现JSON数据,则Spring Boot开发环境部署成功,litemall-os-api模块运行正常。
9. 同上,运行litemall-wx-api, 打开浏览器,输入
```
http://localhost:8082/wx/index/index
```
如果出现JSON数据,则litemall-wx-api模块运行正常。
10. 同上,运行litemall-admin-api, 打开浏览器,输入
```
http://localhost:8083/admin/index/index
```
如果出现JSON数据,则litemall-admin-api模块运行正常。
注意:
> 由于设置了三个不同的端口,因此开发时,IDEA可以同时运行litemall-os-api、litemall-wx-api和litemall-admin-api三个Spring Boot程序。
### 1.4.2 微信小程序开发环境
1. 安装微信小程序开发工具
2. 导入本项目的litemall-wx模块文件夹
3. 编译前,请确定litemall-wx-api模块已经运行,而litemall-wx模块的config文件夹中的api.js已经设置正确对应的后台数据服务地址;
4. 点击`编译`,如果出现数据和图片,则运行正常
### 1.4.3 Vue开发环境
1. 安装npm(或者cnpm)
2. 安装VSC(Visual Studio Code)
3. 导入本项目的litemall-admin模块文件夹
4. 安装依赖库
```
cnpm install
```
5. 编译并运行
```
cnpm run dev
```
然后,打开浏览器,输入`http://localhost:9527`
如果出现管理后台登陆页面,则表明管理后台的前端运行正常;
6. 请确定litemall-admin-api模块已经运行,然后点击`登陆`,如果能够成功登陆,则表明管理后台的前端和后端对接成功,运行正常。
## 1.5 部署方案
在1.4节中介绍的是开发阶段时一些关键性开发流程。本节将介绍代码开发成功以后开始部署项目时一些关键性流程。
首先,需要明确的是开发时项目使用的服务地址是本地地址,即localhost;而部署时则应该根据具体情况设置合理的服务器地址和端口。
其次,需要明确的是各模块之间的关系:
* litemall-os-api模块会包含litemall-db模块,部署在服务器中
* litemall-wx-api模块会包含litemall-db模块,部署在服务器中
* litemall-admin-api模块会包含litemall-db模块,部署在服务器中
* 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证书,具体参见官方文档。
实际上,最终的部署方案是灵活的:
* 可以单一云主机中仅安装一个tomcat服务器并配置一个端口,然后同时部署四个项目的模块,从而提供四种服务
(即litemall-admin静态页面,litemall-os-api存储服务、litemall-amdin-api后台服务和litemall-wx-api后台服务)。
* 也可以是同一云主机中安装四个服务器分别配置四个端口,分别提供四种服务
* 也可以是四个云主机各自安装服务器配置端口,分别提供四种服务
* 当然,甚至多个服务器,并发提供服务。
注意
> 1. `本机`指的是是当前的开发机
> 2. `云主机`指的是用户购买并部署的远程主机
以下简单列举几种方案。
### 1.5.1 windows下本机测试部署方案
这里,我们是把window作为开发环境进行本项目的开发工作。
而项目开发完毕以后,在正式部署之前,可以先进行一个简单的本机测试部署方案。
首先,需要确保本地MySQL已经安装并且导入了litemall.sql数据;
其次,项目打包
```
cd litemall
mvn clean
mvn package
```
最后,本机测试性部署三个应用
```
cd litemall
java -jar ./litemall-os-api/target/litemall-os-api-0.1.0.jar &
java -jar ./litemall-wx-api/target/litemall-wx-api-0.1.0.jar &
java -jar ./litemall-admin-api/target/litemall-admin-api-0.1.0.jar &
```
如果,能够访问以下链接的数据,则表明本地测试部署成功:
```
http://localhost:8081/storage/index/index
http://localhost:8082/wx/index/index
http://localhost:8083/admin/index/index
```
注意
> 由于这里使用`&`设置成后台运行,因此测试结束以后,用户需要自行通过任务管理器或其他软件关闭这三个后台Spring Boot应用。
### 1.5.2 简单局域网方案
局域网方案,面向的是最终服务器数据和部分应用程序部署在局域网内的场景。
### 1.5.3 基于ubuntu腾讯云的单机云部署方案
单机云部署方案,面向的是云主机单机同时部署演示型场景
创建云主机,安装ubuntu操作系统,按照JDK和MySQL应用运行环境,部署三个Spring Boot微服务后台应用。
![](pic1/1-3.png)
#### 1.5.3.1 主机
腾讯云 ubuntu 16.04.1
1. 创建云主机虚拟机
2. 安装操作系统
3. 创建安全组
![](pic1/1-4.png)
4. 安装SSH密钥(可选)
5. 使用PuTTY远程登陆云主机
#### 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
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
sudo apt-get install oracle-java8-set-default
```
警告
> "ppa:webupd8team/java" 不是Oracle官方PPA,可能存在安全隐患。
#### 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
sudo apt-get install mysql-server
sudo apt-get install mysql-client
```
下面是可选地设置root账号远程访问MySQL
首先,MySQL默认不支持远程访问,因此需要修改配置文件
```
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
```
添加'#'注释掉其中的`bind-address`,
```
#bind-address= 127.0.0.1`;
```
其次,设置root账号远程访问权限
```
mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit;
```
最后,登陆腾讯云,设置云主机的`安全组`,允许`3306`端口访问,然后重启云主机,使得这些配置生效。
警告
> 1. 因为安全的原因,MySQL不应该设置远程访问,
> 这里仅仅用于方便数据导入操作。
> 2. MySQL应该部署在专门的服务器中,
> 这里仅仅用于演示远程部署MySQL。
#### 1.5.3.4 litemall数据
这里可以采用命令行式,也可以采用MySQL自带的Workbench导入。
* 命令行导入
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.5.3.5 Tomcat
1. 本项目中采用二进制jar包方式来部署Spring Boot后端应用,因此可以不需要部署在tomcat中。
但是,litemall-admin前端项目最终会编译出静态文件,需要部署在服务器中,因此这里仍需安装tomcat。
```bash
sudo apt-get install tomcat8
```
2. 为了配置tomcat支持外部文件夹中,修改tomcat的server文件
```bash
sudo vi /var/lib/tomcat8/conf/server.xml
```
在其中添加一行新的内容`<Context path="/" docBase="/home/ubuntu/deploy/litemall-admin/dist" reloadable="true" />`
3. 然后,重启tomcat
```
sudo service tomcat8 restart
```
#### 1.5.3.5 项目打包
1. Spring Boot打包
通常项目打包方案存在两种:
* 一是打包war格式,因此云主机需要专门安装tomcat
* 二是打包可执行jar格式,此时内部包含嵌入式tomcat
这里仅采用第二种方案,简化tomcat的安装配置过程。
采用如下命令进行项目打包
```
cd litemall
mvn clean
mvn package
```
2. Vue项目打包
采用如下命令进行项目打包
````bash
cnpm run build:prod
````
此时,litemall-admin模块的dist文件夹中就是最终部署时的代码。
#### 1.5.3.6 项目部署运行
https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#deployment-service
1. 项目进一步打包到deploy文件夹中:
* litemall-os-api模块编译得到的litemall-os-api-0.1.0.jar 保存到deploy的litemall-os-api文件夹中,同时重命名成litemall-os-api.jar
* litemall-wx-api模块编译得到的litemall-wx-api-0.1.0.jar 保存到deploy的litemall-wx-api文件夹中,同时重命名成litemall-wx-api.jar
* litemall-admin-api模块编译得到的litemall-admin-api-0.1.0.jar 保存到deploy的litemall-admin-api文件夹中,同时重命名成litemall-admin-api.jar
* litemall-admin模块编译以后,把dist文件夹压缩,然后放到deploy的litemall-admin文件夹中。
2. 使用FileZilla把deploy整个文件夹上传到云主机的/home/ubuntu文件夹中
3. 使用PuTTY登陆云主机
4. 运行脚本部署运行
```bash
sudo ./deploy/bin/deploy.sh
```
![](pic1/1-6.png)
5. 测试部署是否成功
请确保litemall的Spring Boot应用模块所对应的端口已经打开;
然后测试是否能够访问(xxx.xxx.xxx.xxx是云主机IP):
> http://xxx.xxx.xxx.xxx:8081/storage/index/index
> http://xxx.xxx.xxx.xxx:8082/wx/index/index
> http://xxx.xxx.xxx.xxx:8083/admin/index/index
\ No newline at end of file
# 2 litemall基础系统
目前litemall基础系统主要由litemall数据库、litemall-db模块和litemall-os-api模块组成。
## 2.1 litemall数据库
litemall数据库基于nideshop中的[nideshop.sql](https://github.com/tumobi/nideshop/blob/master/nideshop.sql)数据库,然后在实际开发过程中进行了调整和修改:
* 删除了一些目前不必要的表;
* 删除了表中一些目前不必要的字段;
* 行政区域数据litemall_region没有采用原nideshop中的数据,而是采用了[Administrative-divisions-of-China](https://github.com/modood/Administrative-divisions-of-China)
* 表中的某些字段采用JSON;
* 表中的日期或时间字段采用DATE、DATETIME;
* 字段的数据类型粗粒度化,例如避免MEDIUMINT,而是INT;
* 表的数据做了清理、调整和补充(假数据)。
具体不同可以比较litemall-db模块下sql文件夹中nideshop.sql和litemall.sql。
以下讨论一些关键性设计
注意:
> 以下设计基于个人理解,很可能存在不合理或者与实际系统不符合的地方。
### 2.1.1 商品和货品设计
这里商品存在商品,商品属性,商品规格,货品四种表
商品表是一种商品的基本信息,主要包括商品介绍,商品图片,商品所属类目,商品品牌商等;
商品参数表其实也是商品的基本信息,但是由于是一对多关系,因此不能直接保存在商品表中(虽然采用JSON也可以但是不合理),
因此采用独立的商品参数表,通常是商品的一些公共基本商品参数;
商品规格表是商品进一步区分货品的标识,例如同样一款衣服,基本信息一致,基本属性一致,但是在尺寸这个属性上可以
把衣服区分成多个货品,而且造成对应的数量和价格不一致。
商品规格和规格值存在以下几种关系:
* 单一规格和单一规格值,最常见的,即当前商品存在一种货品;
* 单一规格和多个规格值,较常见,即当前商品基于某个规格存在多种货品,通常价格都是相同的,当然也可能不相同;
* 多个规格和单一规格值,可以简化成第一种情况,或者采用第四种情况,通常实际情况下不常见;
* 多个规格和多个规格值,通常是两种规格或者三种规格较为常见,而且对应的价格不完全相同。
货品则是最终面向用户购买的商品标识,存在数量和价格两种属性。
因此这里一个商品表项,存在(至少0个)多个商品属性表项目,存在(至少一个)多个商品规格表项,
存在(至少一个)多个货品表项。
举例如下:
* 一个商品“2018春季衣服商品编号1111111”,
* 存在两个商品参数,
* 属性名称“面向人群”,属性值“男士”
* 属性名称“面料”,属性值“100%棉”
* 存在两种规格共八个商品规格项,
* 规格名称“尺寸”,规则值“S”
* 规格名称“尺寸”,规则值“M”
* 规格名称“尺寸”,规则值“L”
* 规格名称“尺寸”,规则值“XL”
* 规格名称“尺寸”,规则值“XXL”
* 规格名称“颜色”,规格值“蓝色”
* 规格名称“颜色”,规格值“灰色”
* 规格名称“颜色”,规格值“黑色”
* 存在15个货品(尺寸*颜色=15个货品)
* 货品“S蓝”,数量 100, 价格 100
* 货品“M蓝”,数量 100, 价格 100
* 货品“L蓝”,数量 100, 价格 100
* 货品“XL蓝”,数量 100, 价格 100
* 货品“XXL蓝”,数量 100, 价格 100
* 货品“S灰”,数量 100, 价格 100
* 货品“M灰”,数量 100, 价格 100
* 货品“L灰”,数量 100, 价格 100
* 货品“XL灰”,数量 100, 价格 100
* 货品“XXL灰”,数量 100, 价格 100
* 货品“S黑”,数量 100, 价格 100
* 货品“M黑”,数量 100, 价格 100
* 货品“L黑”,数量 100, 价格 100
* 货品“XL黑”,数量 0, 价格 100
* 货品“XXL黑”,数量 0, 价格 100
以下是一些细节的讨论:
* 商品表中可能存在数量和价格属性,而货品中也存在数量和价格属性,
但是商品表中的数量和价格应该仅用于展示,而不能用于最终的订单价格计算。
商品表的数量应该是所有货品数量的总和。
商品表的价格应该和某个货品的价格一样,通常应该是所有货品价格的最小值。
因此这里商品表的数量和价格属性可能可以采用自动计算。
* 商品规格可以存在规格图片,效果是规格名称前放置规格图片
* 货品也可以存在货品图片,效果是所有规格选定以后对应的货品有货,则在货品价格前放置货品图片
注意:
> 这里的设计可能与实际项目设计不一致,但是目前是可行的。
> 商品的中文用语“商品”和英语用语“goods”,货品的中文用语“货品”和英语用语“product”可能是不正确的。
### 2.1.2 用户和微信用户设计
目前准备支持用户普通账号登陆和微信登陆两种方式,两种登陆方式仅仅采用一个litemall-user表可能不是很合适。此外,如果进一步支持其他多种第三方登陆,那么这里需要重新设计。
### 2.1.3 行政区域设计
原nideship.sql中存在region数据,但是litemall.sql的region数据则来自
[Administrative-divisions-of-China](https://github.com/modood/Administrative-divisions-of-China)项目。从该项目中导入数据到litemall.sql的litemall-province、litemall-city、litemall-area和litemall-street四个表,然后重新生成一个新的litemall-region表。
### 2.1.4 订单设计
订单信息主要由基本信息、商品信息、地址信息、费用信息、快递信息、支付信息和其他信息组成。
* 基本信息
订单创建时的一些基本信息。
* 商品信息
由于订单可以存在多个商品,因此订单的商品信息是由独立的订单商品表记录(可能更应该称为货品)。
* 费用信息
* 快递信息
目前快递信息仅仅记录快递公司、快递单号、快递发出时间、快递接收时间。而如果快递过程中如果存在一些异常,例如物品丢失,则目前系统难以处理。关于快递费的计算,目前采取简单方式,即满88元则免费,否则10元。
* 支付信息
* 其他信息
#### 2.1.4.1 订单状态
![](pic2/2-1.png)
订单分成几种基本的状态:
* 下单
状态码101,此时订单生成,记录订单编号、收货地址信息、订单商品信息和订单相关费用信息;
* 付款
状态码201,此时用户微信支付付款,系统记录微信支付订单号、支付时间、支付状态;
* 发货
状态码301,此时商场已经发货,系统记录快递公司、快递单号、快递发送时间。
当快递公司反馈用户签收后,系统记录快递到达时间。
* 收货
状态码401,当用户收到货以后点击确认收货,系统记录确认时间。
此时,用户可以评价订单商品。
除了这几种正常状态以外,还存在一些非普通的状态:
* 订单取消
状态码102,用户在生产订单以后未付款之前,点击取消按钮,系统记录结束时间
* 订单取消并退款
状态码202,用户付款以后未发货前,点击取消按钮,系统记录结束时间和退款信息
* 系统自动确认收货
状态码402,快递反馈商场用户已签收,但是用户却不点击确认收货按钮,
此时系统在快递到达时间的一段时间后,自动确认收货。
用户不能再点击确认收货按钮,但是可以评价订单商品
当然,以上的基本状态和非普通状态,和实际项目相比仍然相对简单。
此外,当订单状态码是102、202、401、402时,订单可以设置删除状态,此时
用户查看自己订单信息时将看不到这些“已删除”的订单。
#### 2.1.4.2 状态码所支持的操作
不同的状态码下面,用户能够进行的操作是:
* 101
此时,用户可以“订单支付”、“订单取消”
* 102
此时,用户可以“订单删除”
* 201
此时,用户可以“订单取消”(并退款)
* 202
此时,用户可以“订单删除”
* 301
此时,用户可以“确认收货”
* 401
此时,用户可以“订单删除”、“评价”、“再次购买”
* 402
此时,用户可以“订单删除”、“评价”、“再次购买”
#### 2.1.4.3 售后处理
目前不支持售后或退货相关业务。
#### 2.1.4.4 黑名单
从一些资料看,如果用户订单多次取消,应该加入黑名单。
目前不支持。
## 2.2 litemall-db
![](./pic2/2-2.png)
这里litemall-db模块可以分成以下几种代码:
* mybatis generator自动化代码
* 业务代码
* 安全代码
* JSON支持代码
* 配置代码
### 2.2.1 自动化代码
通过mybatis generator插件可以自动生成三种代码:
* src文件夹`domain` Java代码
* src文件夹`dao` Java代码
* resources文件夹`dao` Mapper代码
这里的代码封装了对数据库的操作,因此用户不需要直接操作sql代码,而是直接操作Java代码即可完成对数据库的访问处理。
当然,为了达到数据库访问效率,用户也可以自定义mapper文件和对应的Java代码,但是至少目前这里不采用。例如,当需要访问两个表的数据时,这里是在业务层通过Java代码遍历的形式来访问两个表。
### 2.2.2 业务代码
基于2.2.1的代码,业务代码处理一些具体业务相关的操作,对其他模块提供具体的服务。
### 2.2.3 安全代码
### 2.2.4 JSON支持代码
### 2.2.5 配置代码
采用Java注解的方式来完成一些特定的配置操作。
## 2.3 litemall-os-api
对象存储服务目前的目标是支持图片的上传下载。
### 2.3.1 业务
支持服务:
* 列表
* 创建
* 修改
* 读取
* 删除
* 下载,即下载对象数据文件
* 访问,即直接访问对象数据
### 2.3.2 安全
警告
> 目前这里没有任何安全机制,这意味着任何人如果知道对象存储服务的地址,都可以直接存储访问对象数据。
这样简化的目的是对象存储服务建议最终采用云服务,因此这里仅仅实现一个简单的服务面向测试开发。
如果用户需要局域网部署,那么这里需要加入一定的安全机制。
# 3 litemall小商城
技术:
* 小商城前端,即litemall-wx模块
* 微信小程序
* 小商城后端,即litemall-wx-api模块
* Spring Boot 1.5.10
* Spring MVC
* [weixin-java-tools](https://gitee.com/binary/weixin-java-tools)
目前发现需要完善的:
* 支付功能
* 运费计算
* 优惠券功能
* 商品搜索
* 进一步区分商品和货品的关系
* 地址优化,目前每一次点击都会请求后台,应该缓存已有的数据
* 商品数量和规格中,如果货品数量不足,则显示不能点击的效果
* 登陆逻辑重新设计,如果用户没有登陆,则相关页面显示登陆的效果
## 3.1 litemall-wx-api
### 3.1.1 业务
### 3.1.2 安全
### 3.1.3 支付
准备采用weixin-java-tools工具简化微信支付代码的开发。
由于需要商户相关信息,目前没有开发。
## 3.2 litemall-wx
这里的代码基于[nideshop-mini-program](https://gitee.com/tumobi/nideshop-mini-program),但是做了一定的修改:
* 数据属性名称调整,原项目中数据属性名称是下划线法命名(例如goods_id),而这里采用骆驼式命名法(例如goodsId),因此代码中需要进行相应调整;
* 代码清理重构,删除了一些目前不必要的文件,梳理一些逻辑功能;
* BUG修补,修改了一些错误;
* 功能完善拓展,例如商品立即购买功能、商品评价功能;
具体变化可以采用工具进行对比。
注意
> 目前litemall-wx项目代码基于nideshop-mini-program的commit版本[acbf6276eb27abc6a48887cddd223d7261f0088e](https://github.com/tumobi/nideshop-mini-program/commit/acbf6276eb27abc6a48887cddd223d7261f0088e)。由于改动变化较大,因此之后litemall-wx将独立开发,nideshop-mini-program的跟新不一定会合并到litemall-wx中。
# 4 litemall后台管理
这里的后台管理业务参考了[platform](https://gitee.com/fuyang_lipengjun/platform).
技术架构:
* 后台管理前端,即litemall-admin模块
* vue
* vuex
* vue-router
* axios
* element-ui
* vue-element-admin
* 其他,见package.json
* 后台管理后端, 即litemall-admin-api模块
* Spring Boot 1.5.10
* Spring MVC
目前存在的问题
* 大部分页面仅仅是一个表CRUD的效果,交互性一般。
例如,显示商品的时候,只是简单显示表中保存的类目ID和品牌商ID,更好的效果可能是显示对应的类目名称和品牌商名称,同时能够显示更详细的类目信息和品牌商信息。
* 地址优化,目前每一次点击都会请求后台,应该缓存已有的数据
* 管理员角色和权限设计
* 首页中实现一些小组件,同时点击能够跳转相应页面
* 查询时排序功能
* 业务功能重新设计,例如即使是管理员也不能删除修改用户的相关数据
* 用户密码加密存储
## 4.1 litemall-admin-api
### 4.1.1 业务
### 4.1.2 安全配置
### 4.1.3 CROS配置
## 4.2 litemall-admin
litemall-admin模块的代码基于[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
## 4.3 开发新组件
这里介绍开发一个新的组件的流程。
\ No newline at end of file
# 5 litemall商场网站
目前不开发
## 5.1 litemall-web-api
## 5.2 litemall-web
# 6 下一步计划
6.1节涉及到技术层面需要改进的部分,而6.2节则是业务方面未实现的部分,这两个部分的代码都会在本项目中实现。而6.3节会进一步完善本项目的安全和性能,但是不一定会在本项目中实现,因为会增加相当大的复杂性。
## 6.1 技术
### 6.1.1 ENUM
数据库中涉及到枚举类型的字段,目前设置成VARCHAR。
下一步应该设计不同的业务enum类型,然后mybatis自定义BaseTypeHandler来处理不同的枚举类型。
### 6.1.2 litemall-db AutoConig
目前,litemall-os-api、litemall-admin-api和litemall-wx-api引入litemall-db的时候,需要在Application类中显式注解查找包和MapperScan来对litemall-db中的mapper查找,此外需要在application.properties配置文件中完成对数据库、数据池等配置。
例如
```
@SpringBootApplication(scanBasePackages={"org.linlinjava.litemall.admin","org.linlinjava.litemall.db"})
@MapperScan("org.linlinjava.litemall.db.dao")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
下一步,应该自动部署,即引入litemall-db则会自动引入对mapper的查找,
同时自动部署对数据库、PageHelper和Druid的配置。
### 6.1.3 统一对日期时间域的处理
目前,数据库的日期时间域有的采用DATE,有的是DATETIME,而对应Java用LocalDate和LocalDateTime。
下一步应该根据具体业务功能采用合适的。
### 6.1.4 vue-element-admin跟新
目前的vue-element-admin基于element 2.0.8, 因此element的很多修复没有跟新。
### 6.1.5 事务管理
目前没有事务管理,因此如果直接把项目用于正式运行中,可能会存在数据不一致等问题。
### 6.1.6 小程序登陆设计
个人觉得目前nideshop-mini-program里的登陆设计内部实现不是很合理。
### 6.1.n 代码重构
技术不断迭代开发中,应该在业务基本完成和功能基本完善以后,
重新审视代码架构和技术,或者重构代码,或者采用更为合理的技术。
## 6.2 业务
### 6.2.1 支付模块
目前微信支付模块因缺乏支付权限而不能开发。
### 6.2.2 任务日程模块
部分业务需要引入任务管理服务,例如订单下单以后一个小时未支付则自动失效关闭。
### 6.2.3 监控管理
项目运行的整个运行过程应该需要监控管理
### 6.2.4 权限管理
目前安全实现非常粗糙,仅仅依赖管理员的用户名和密码。
更好的做法是引入角色权限机制。
## 6.3 企业级
### 6.3.1 安全(必须)
尽在系统所有业务功能完整实现以后。
### 6.3.2 性能(建议)
仅在系统所有业务功能完整实现以后。
性能的提升存在多种方案。
目前考虑到的技术方案:
* 采用内存数据库,如redis,缓存一些改动较少的数据,例如行政区域数据。
* 数据库方面可以引入冗余,例如首页的数据可以先从其他表更新到一个独立的表。
### 6.3.3 对象存储云服务(建议)
仅在系统所有业务功能完整实现以后。
对象存储云服务不一定是必须的:
* 局域网中只能采用内部对象存储服务
* 对象存储云服务也是一笔开销
* 引入对象存储云服务也增加了一定的复杂性
* 导致对具体云平台的耦合
当然,对象存储云服务的益处也是毋庸置疑的,因此建议部署使用。
### 6.3.4 云数据库(必须)
同上,如果仅在局域网中部署项目,那么数据库的部署也只能是在局域网中,但是在互联网中部署应用,数据的重要性和优先级是最高的,采用云数据库可以方便带来其提供的安全和性能服务。
### 6.3.5 短信服务(必须)
真正的项目里面肯定需要短信功能。
### 6.3.6 推荐系统(可选)
目前的关键字是管理员设置,然后用户的搜索时匹配关键字,因此需要专业的推荐系统。
### 6.3.6 Spring Boot 2.0迁移(可选)
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment