diff --git a/README.md b/README.md index 9aa4a525..f5c7f9fb 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,49 @@ litemall = Spring Boot后端 + Vue管理员前端 + 微信小程序用户前端 1. 浏览器打开,输入以下网址[http://122.152.206.172:8080/#/login](http://122.152.206.172:8080/#/login) 2. 管理员名称`admin123`,管理员密码`admin123` -![](doc/pic/4.png) +![](doc/pic/4.png) + +## 快速启动 + +1. 配置最小开发环境: + * [MySQL](https://dev.mysql.com/downloads/mysql/) + * [JDK1.8或以上](http://www.oracle.com/technetwork/java/javase/overview/index.html) + * [Maven](https://maven.apache.org/download.cgi) + * [Nodejs](https://nodejs.org/en/download/) + * [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html) + +2. 数据库依次导入litemall-db/sql下的数据库文件 + * litemall_schema.sql + * litemall_table.sql + * litemall_data.sql + +3. 启动小商场和管理后台的后台服务 + + 打开命令行,输入以下命令 + ```bash + cd litemall + mvn install + mvn package + cd ./litemall-all + mvn spring-boot:run + ``` + +4. 启动管理后台前端 + + 打开命令行,输入以下命令 + ```bash + cd litemall/litemall-admin + cnpm install + cnpm run dev + ``` + 此时,浏览器打开,输入网址`http://localhost:9527`, 此时进入管理后台登录页面。 + +5. 启动小商城前端 + + 打开微信开发者工具,导入litemall-wx模块,点击`编译`即可,此时可以预览小商场效果。 + +注意: +> 这里只是最简启动方式,而且小商场的微信登录会失败,更详细方案请参考文档。 ## 开发计划 @@ -99,9 +141,6 @@ V 3.0.0 完成以下目标: 2. 后台服务加强安全功能、配置功能 3. 缓存功能以及优化一些性能 -警告: -> **以上仅仅是个人规划的开发计划,实际可能出现任何情况,例如能力有限而放弃开发。** - ## 警告 > 1. 本项目仅用于学习练习 @@ -121,16 +160,14 @@ V 3.0.0 完成以下目标: ![](doc/pic/qq.png) -开发者有问题或者好的建议可以用Issues反馈交流,请给出详细信息,本人会尽可能解决。 - * 如果问题是共性问题(如代码bug或文档不全),本人会及时解决。 - * 如果问题是个人问题(如开发者了解不深入或者没有相关技术),请见谅(本人也是百度和谷歌)。 + * 开发者有问题或者好的建议可以用Issues反馈交流,请给出详细信息 + * 在开发交流群中应讨论开发、业务和合作问题 * 如果真的需要QQ群里提问,请在提问前先完成以下过程: - * 请仔细阅读本项目文档,特别是是[**FAQ**](./doc/7.md),查看能否解决; + * 请仔细阅读本项目文档,特别是是[**FAQ**](./doc/FAQ.md),查看能否解决; * 请阅读[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md); * 请百度或谷歌相关技术; * 请查看相关技术的官方文档,例如微信小程序的官方文档; * 请提问前尽可能做一些DEBUG或者思考分析,然后提问时给出详细的错误相关信息以及个人对问题的理解。 - * 在开发交流群中应讨论开发、业务和合作问题。 ## 相关项目 diff --git a/deploy/.gitignore b/deploy/.gitignore index 9b6a6735..ed5468bd 100644 --- a/deploy/.gitignore +++ b/deploy/.gitignore @@ -1,6 +1,3 @@ -/litemall-admin/dist.tar -/litemall-db/litemall_schema.sql -/litemall-db/litemall_table.sql -/litemall-db/litemall_data.sql -/litemall-api/litemall-admin-api.jar -/litemall-api/litemall-wx-api.jar \ No newline at end of file + +/db/litemall.sql +/litemall/litemall.jar diff --git a/deploy/README.md b/deploy/README.md index 77197d25..903619a2 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -1,58 +1,104 @@ +## deploy -1. 项目进一步打包到deploy文件夹中: - * litemall-wx-api模块编译得到的litemall-wx-api-0.1.0-exec.jar 保存到deploy的litemall-api文件夹中,同时重命名成litemall-wx-api.jar - * litemall-admin-api模块编译得到的litemall-admin-api-0.1.0-exec.jar 保存到deploy的litemall-api文件夹中,同时重命名成litemall-admin-api.jar - * litemall-admin模块编译以后,把dist文件夹压缩,然后放到deploy的litemall-admin文件夹中。 - * litemall-db模块的sql文件拷贝到deploy的litemall-db文件夹中。 +### 项目打包 -2. 使用FileZilla把deploy整个文件夹上传到云主机的/home/ubuntu文件夹中 +1. 在主机或者开发机打包项目到deploy; + ``` + cd litemall + cat ./litemall-db/sql/litemall_schema.sql > ./deploy/db/litemall.sql + cat ./litemall-db/sql/litemall_table.sql >> ./deploy/db/litemall.sql + cat ./litemall-db/sql/litemall_data.sql >> ./deploy/db/litemall.sql + + cd ./litemall-admin + cnpm install + cnpm run build:dep + + cd .. + mvn clean package + cp -f ./litemall-all/target/litemall-all-*-exec.jar ./deploy/litemall/litemall.jar + ``` + 这里的工作是: + 1. 把数据库文件拷贝到deploy/db文件夹 + 2. 编译litemall-admin项目 + 3. 编译litemall-all模块,同时把litemall-admin编译得到的静态文件拷贝到 + litemall-all模块的static目录 + +2. 修改litemall文件夹下面的*.yml外部配置文件,当litemall-all模块启动时会 + 加载外部配置文件,而覆盖默认jar包内部的配置文件。 + 例如,配置文件中一些地方需要设置成远程主机的IP地址 + +此时deploy部署包结构如下: -3. 使用PuTTY登录云主机 +* bin -4. 如果开发者没有部署litemall数据库,可以运行以下命令: +存放远程主机运行的脚本,包括deploy.sh脚本和reset.sh脚本 +* db + +存放litemall数据库文件 + +* litemall + +存放远程主机运行的代码,包括litemall-all二进制可执行包和litemall外部配置文件 + +* util +存放开发主机运行的脚本,包括package.sh脚本和lazy.sh脚本。 +由于是本地开发主机运行,因此开发者可以不用上传到远程主机。 + +### 项目部署 + +1. 远程主机环境(MySQL和JDK1.8)已经安装好,请确保云主机的安全组已经允许相应的端口。 +2. 导入db/litemall.sql ```bash - cd deploy - mysql -h localhost -u root -p123456 - source ./litemall-db/litemall_schema.sql - use litemall; - source ./litemall-db/litemall_table.sql - source ./litemall-db/litemall_data.sql + cd /home/ubuntu/deploy/db + mysql -h localhost -u $ROOT -p$PASSWORD < litemall.sql ``` - 注意,123456是开发者所设置的MySQL管理员密码 - 警告: - > litemall_schema.sql会尝试删除litemall数据库然后重建一个新的数据。 - -5. 运行脚本部署运行 - +3. 启动服务 ```bash - sudo ./deploy/bin/deploy.sh + sudo service litemall stop + sudo ln -f -s /home/ubuntu/deploy/litemall/litemall.jar /etc/init.d/litemall + sudo service litemall start ``` - -6. 测试部署是否成功 - - 请确保云主机的安全组已经允许相应的端口(见1.5.3.1); - 然后测试是否部署成功(xxx.xxx.xxx.xxx是云主机IP): - +4. 测试是否部署成功(xxx.xxx.xxx.xxx是云主机IP): ``` - http://xxx.xxx.xxx.xxx:8082/wx/index/index - http://xxx.xxx.xxx.xxx:8083/admin/index/index + http://xxx.xxx.xxx.xxx:8080/wx/index/index + http://xxx.xxx.xxx.xxx:8080/admin/index/index http://xxx.xxx.xxx.xxx:8080/#/login ``` -7. 部署脚本 +### 项目辅助脚本 - 为了简化步骤1和步骤2,完成了deploy/util/package.sh上传脚本和deploy/util/lazy.sh部署脚本, +在前面的项目打包和项目部署中都是采用手动命令来部署。 +这里可以写一些脚本简化: + +* util/packet.sh + +在开发主机运行可以自动项目打包 + +* util/lazy.sh + +在开发主机运行可以自动项目打包、项目上传远程主机、自动登录系统执行项目部署脚本。 - 注意: - > 1. 开发者需要在deploy/util/package.sh和deploy/util/lazy.sh中设置相应的云主机登录账号和密钥文件路径。 - > 2. 开发者需要在deploy/bin/reset.sh设置云主机的MySQL的root登录账户。 - > 3. 请先执行1.5.1中上述步骤,确保部署环境成功。 +注意: +> 1. 开发者需要在util/lazy.sh中设置相应的远程主机登录账号和密钥文件路径。 +> 2. 开发者需要在bin/reset.sh设置远程主机的MySQL的root登录账户。 - * package.sh - - 该脚本会自动把当前项目Spring Boot项目打包和Vue项目打包工作,然后复制到deploy文件夹中。 - - * lazy.sh - - 该脚本会调用package.sh打包项目,然后上传deploy文件夹到云主机,最后ssh登录远程主机执行bin下面的deploy.sh脚本。 \ No newline at end of file +* bin/deploy.sh + +在远程主机运行可以自动部署服务 + +* bin/reset.sh + +在远程主机运行可以自动项目导入数据、删除本地上传图片、再执行bin/deploy.sh部署服务。 + +注意: +> 开发者需要在bin/reset.sh设置远程主机的MySQL的root登录账户。 + +总结,当开发者设置好配置信息以后,可以在本地运行lazy.sh脚本自动一键部署: +```bash +cd litemall +./deploy/util/lazy.sh +``` + +不过由于需要设置的信息会包含敏感安全信息,强烈建议开发者参考这里的deploy文件夹, +然后实现自己的deploy文件夹,妥善处置外部配置文件和脚本中的敏感安全信息!!! \ No newline at end of file diff --git a/deploy/bin/deploy.sh b/deploy/bin/deploy.sh index 832a255c..cf3623b6 100644 --- a/deploy/bin/deploy.sh +++ b/deploy/bin/deploy.sh @@ -1,29 +1,6 @@ #!/bin/bash -# 请注意 -# 1. 本脚本的作用是停止当前Spring Boot应用,然后再次部署 -# 2. 解压dist.tar到/home/ubuntu/deploy/litemall-admin/dist, -# 而这个目录也正是tomcat或者nginx所配置静态文件目录的路径(见1.5.3.5节) - -#部署litemall-admin静态文件应用 -cd /home/ubuntu/deploy/litemall-admin -rm -rf dist -mkdir dist -tar -zxvf dist.tar -C dist - -#部署三个Spring Boot应用 -#如果服务已经启动,则尝试停止 -sudo service litemall-wx-api stop -sudo service litemall-admin-api stop - -#部署Spring Boot应用成服务 -sudo ln -f -s /home/ubuntu/deploy/litemall-api/litemall-wx-api.jar /etc/init.d/litemall-wx-api -sudo ln -f -s /home/ubuntu/deploy/litemall-api/litemall-admin-api.jar /etc/init.d/litemall-admin-api - -#启动服务 -sudo service litemall-wx-api restart -sudo service litemall-admin-api restart - -# 如果静态文件是通过tomcat来服务,则tomcat8服务最好也再启动 -#sudo service tomcat8 stop -#sudo service tomcat8 start \ No newline at end of file +# 本脚本的作用是停止当前Spring Boot应用,然后再次部署 +sudo service litemall stop +sudo ln -f -s /home/ubuntu/deploy/litemall/litemall.jar /etc/init.d/litemall +sudo service litemall start \ No newline at end of file diff --git a/deploy/bin/reset.sh b/deploy/bin/reset.sh index aa34d9cc..e6bc8e21 100644 --- a/deploy/bin/reset.sh +++ b/deploy/bin/reset.sh @@ -18,15 +18,12 @@ then exit -1 fi -cd /home/ubuntu/deploy/litemall-db -cat litemall_schema.sql > db.sql -cat litemall_table.sql >> db.sql -cat litemall_data.sql >> db.sql -mysql -h localhost -u $ROOT -p$PASSWORD < db.sql -rm db.sql +# 导入数据 +cd /home/ubuntu/deploy/db +mysql -h localhost -u $ROOT -p$PASSWORD < litemall.sql # 删除storage文件夹内文件 -cd /home/ubuntu/deploy/litemall-api/storage +cd /home/ubuntu/deploy/litemall/storage rm -f ./** # 重新部署服务 diff --git a/deploy/litemall/application-admin.yml b/deploy/litemall/application-admin.yml new file mode 100644 index 00000000..e69de29b diff --git a/deploy/litemall/application-core.yml b/deploy/litemall/application-core.yml new file mode 100644 index 00000000..a5370c5c --- /dev/null +++ b/deploy/litemall/application-core.yml @@ -0,0 +1,104 @@ +litemall: + # 开发者应该设置成自己的wx相关信息 + wx: + app-id: wxa5b486c6b918ecfb + app-secret: e04004829d4c383b4db7769d88dfbca1 + mch-id: 111111 + mch-key: xxxxxx + notify-url: http://122.152.206.172:8080/wx/order/pay-notify + + #通知相关配置 + notify: + mail: + # 邮件通知配置,邮箱一般用于接收业务通知例如收到新的订单,sendto 定义邮件接收者,通常为商城运营人员 + enable: false + host: smtp.exmail.qq.com + username: ex@ex.com.cn + password: XXXXXXXXXXXXX + sendfrom: ex@ex.com.cn + sendto: ex@qq.com + + # 短消息模版通知配置 + # 短信息用于通知客户,例如发货短信通知,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值 + sms: + enable: false + appid: 111111111 + appkey: xxxxxxxxxxxxxx + template: + - name: paySucceed + templateId: 156349 + - name: captcha + templateId: 156433 + - name: ship + templateId: 158002 + - name: refund + templateId: 159447 + + # 微信模版通知配置 + # 微信模版用于通知客户或者运营者,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值 + wx: + enable: false + template: + - name: paySucceed + templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + - name: captcha + templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + - name: ship + templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + - name: refund + templateId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # 快鸟物流查询配置 + express: + enable: false + appId: "XXXXXXXXX" + appKey: "XXXXXXXXXXXXXXXXXXXXXXXXX" + vendors: + - code: "ZTO" + name: "中通快递" + - code: "YTO" + name: "圆通速递" + - code: "YD" + name: "韵达速递" + - code: "YZPY" + name: "邮政快递包裹" + - code: "EMS" + name: "EMS" + - code: "DBL" + name: "德邦快递" + - code: "FAST" + name: "快捷快递" + - code: "ZJS" + name: "宅急送" + - code: "TNT" + name: "TNT快递" + - code: "UPS" + name: "UPS" + - code: "DHL" + name: "DHL" + - code: "FEDEX" + name: "FEDEX联邦(国内件)" + - code: "FEDEX_GJ" + name: "FEDEX联邦(国际件)" + + # 对象存储配置 + storage: + # 当前工作的对象存储模式,分别是local、aliyun、tencent + active: local + # 本地对象存储配置信息 + local: + storagePath: storage + address: http://122.152.206.172:8080/wx/storage/fetch/ + # 阿里云对象存储配置信息 + aliyun: + endpoint: oss-cn-shenzhen.aliyuncs.com + accessKeyId: 111111 + accessKeySecret: xxxxxx + bucketName: xxxxxx + # 腾讯对象存储配置信息 + # 请参考 https://cloud.tencent.com/document/product/436/6249 + tencent: + secretId: 111111 + secretKey: xxxxxx + region: xxxxxx + bucketName: xxxxxx \ No newline at end of file diff --git a/deploy/litemall/application-db.yml b/deploy/litemall/application-db.yml new file mode 100644 index 00000000..efe31994 --- /dev/null +++ b/deploy/litemall/application-db.yml @@ -0,0 +1,26 @@ +pagehelper: + helperDialect: mysql + reasonable: true + supportMethodsArguments: true + params: count=countSql + +spring: + datasource: + druid: + url: jdbc:mysql://localhost:3306/litemall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&verifyServerCertificate=false&useSSL=false + driver-class-name: com.mysql.jdbc.Driver + username: litemall + password: litemall123456 + initial-size: 10 + max-active: 50 + min-idle: 10 + max-wait: 60000 + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + validation-query: SELECT 1 FROM DUAL + test-on-borrow: false + test-on-return: false + test-while-idle: true + time-between-eviction-runs-millis: 60000 + filters: stat,wall,log4j + diff --git a/deploy/litemall/application-wx.yml b/deploy/litemall/application-wx.yml new file mode 100644 index 00000000..e69de29b diff --git a/deploy/litemall/application.yml b/deploy/litemall/application.yml new file mode 100644 index 00000000..3802b74f --- /dev/null +++ b/deploy/litemall/application.yml @@ -0,0 +1,19 @@ +spring: + profiles: + active: db, core, admin, wx + message: + encoding: UTF-8 + +server: + port: 8080 + +logging: + level: + root: ERROR + org.springframework: ERROR + org.mybatis: ERROR + org.linlinjava.litemall.core: ERROR + org.linlinjava.litemall.db: ERROR + org.linlinjava.litemall.admin: ERROR + org.linlinjava.litemall.wx: ERROR + org.linlinjava.litemall: ERROR \ No newline at end of file diff --git a/deploy/util/lazy.sh b/deploy/util/lazy.sh index 4ca240fe..33dbc35c 100644 --- a/deploy/util/lazy.sh +++ b/deploy/util/lazy.sh @@ -3,7 +3,7 @@ # 本脚本的作用是 # 1. 项目打包 # 2. 上传云主机 -# 3. 远程登录云主机并执行deploy脚本 +# 3. 远程登录云主机并执行reset脚本 # 请设置云主机的IP地址和账户 # 例如 ubuntu@122.152.206.172 @@ -34,10 +34,12 @@ cd $LITEMALL_HOME ./deploy/util/package.sh # 上传云主机 +cd $LITEMALL_HOME scp -i $ID_RSA -r ./deploy $REMOTE:/home/ubuntu/ -# 远程登录云主机并执行deploy脚本 +# 远程登录云主机并执行reset脚本 ssh $REMOTE -i $ID_RSA << eeooff -sudo ./deploy/bin/deploy.sh +cd /home/ubuntu +sudo ./deploy/bin/reset.sh exit eeooff \ No newline at end of file diff --git a/deploy/util/package.sh b/deploy/util/package.sh index 45aac623..9df8a1fc 100644 --- a/deploy/util/package.sh +++ b/deploy/util/package.sh @@ -2,9 +2,9 @@ # 请注意 # 本脚本的作用是把本项目编译的结果保存到deploy文件夹中 -# 1. 把项目数据库文件拷贝到litemall-db -# 2. 编译litemall-admin,然后打包到litemall-admin -# 3. 编译后台服务模块,然后拷贝到litemall-api +# 1. 把项目数据库文件拷贝到deploy/db +# 2. 编译litemall-admin +# 3. 编译litemall-all模块,然后拷贝到deploy/litemall DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" cd $DIR/../.. @@ -12,24 +12,17 @@ LITEMALL_HOME=$PWD echo "LITEMALL_HOME $LITEMALL_HOME" # 复制数据库 -cp -f ./litemall-db/sql/litemall_schema.sql ./deploy/litemall-db/litemall_schema.sql -cp -f ./litemall-db/sql/litemall_table.sql ./deploy/litemall-db/litemall_table.sql -cp -f ./litemall-db/sql/litemall_data.sql ./deploy/litemall-db/litemall_data.sql +cat $LITEMALL_HOME/litemall-db/sql/litemall_schema.sql > $LITEMALL_HOME/deploy/db/litemall.sql +cat $LITEMALL_HOME/litemall-db/sql/litemall_table.sql >> $LITEMALL_HOME/deploy/db/litemall.sql +cat $LITEMALL_HOME/litemall-db/sql/litemall_data.sql >> $LITEMALL_HOME/deploy/db/litemall.sql -cd ./litemall-admin +cd $LITEMALL_HOME/litemall-admin # 安装阿里node镜像工具 npm install -g cnpm --registry=https://registry.npm.taobao.org # 安装node项目依赖环境 cnpm install cnpm run build:dep -cd .. -# 压缩litemall-admin应用 -tar -zcvf ./deploy/litemall-admin/dist.tar -C ./litemall-admin/dist . -# 复制三个Spring Boot应用 -# 需要注意的是target目录里面存在两种jar,一种是当前模块纯编译代码的jar,另外一种是包含依赖库的可执行jar, -# 这里我们需要的是可执行jar -mvn clean -mvn package -cp -f ./litemall-wx-api/target/litemall-wx-api-*-exec.jar ./deploy/litemall-api/litemall-wx-api.jar -cp -f ./litemall-admin-api/target/litemall-admin-api-*-exec.jar ./deploy/litemall-api/litemall-admin-api.jar \ No newline at end of file +cd $LITEMALL_HOME +mvn clean package +cp -f $LITEMALL_HOME/litemall-all/target/litemall-all-*-exec.jar $LITEMALL_HOME/deploy/litemall/litemall.jar \ No newline at end of file diff --git a/doc/5.md b/doc/5.md deleted file mode 100644 index f165c400..00000000 --- a/doc/5.md +++ /dev/null @@ -1,8 +0,0 @@ - -# 5 litemall商场网站 - -目前不开发 - -## 5.1 litemall-web-api - -## 5.2 litemall-web diff --git a/doc/6.md b/doc/6.md deleted file mode 100644 index a86ad464..00000000 --- a/doc/6.md +++ /dev/null @@ -1,107 +0,0 @@ -# 6 下一步计划 - -6.1节涉及到技术层面需要改进的部分,而6.2节则是业务方面未实现的部分,这两个部分的代码都会在本项目中实现。而6.3节会进一步完善本项目的安全和性能,但是不一定会在本项目中实现,因为会增加相当大的复杂性。 - -## 6.1 技术 - -### 6.1.1 ENUM -数据库中涉及到枚举类型的字段,目前设置成VARCHAR。 -下一步应该设计不同的业务enum类型,然后mybatis自定义BaseTypeHandler来处理不同的枚举类型。 - -### 6.1.2 litemall-db AutoConig -目前,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.n 代码重构 - -技术不断迭代开发中,应该在业务基本完成和功能基本完善以后, -重新审视代码架构和技术,或者重构代码,或者采用更为合理的技术。 - -## 6.2 业务 - -### 6.2.1 支付模块 - -目前微信支付模块因缺乏支付权限而不能开发。 - -### 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 推荐系统(可选) - -目前的关键字是管理员设置,然后用户的搜索时匹配关键字,因此需要专业的推荐系统。 - -Apache Solor - -### 6.3.7 Spring Boot 2.0 - -### 6.3.8 Spring Cloud - -### 6.3.8 定时任务模块 - -### 6.3.9 单点登录模块 - -### 6.3.10 消息队列 \ No newline at end of file diff --git a/doc/7.md b/doc/FAQ.md similarity index 88% rename from doc/7.md rename to doc/FAQ.md index dedfd2de..79df5f43 100644 --- a/doc/7.md +++ b/doc/FAQ.md @@ -1,8 +1,8 @@ -# 7. 常见问题 +# 常见问题 -## 7.1 小商城 +## 小商城 -### 7.1.1 小程序微信登录失败 +### 小程序微信登录失败 原因: @@ -13,7 +13,7 @@ 1. 如果只是体验商品购买流程,开发者可以采用账号注册登录方式。 2. 开发者在litemall-wx和litemall-wx-api模块的appid等信息设置成自己申请的信息。 -#### 7.1.1.1 appid已经修改,微信登陆仍然失败 +#### appid已经修改,微信登陆仍然失败 现象: @@ -27,7 +27,7 @@ 微信开发者工具中修改appid以后,请关闭litemall-wx项目或者微信开发者工具,重新启动导入litemall-wx。 -### 7.1.2 手机真机测试不正常 +### 手机真机测试不正常 现象: @@ -45,7 +45,7 @@ * 小商场的后台服务未启动 2. 手机小商场的**调试功能**开启 -### 7.1.3 第三方手机测试不正常 +### 第三方手机测试不正常 现象: @@ -57,7 +57,7 @@ 2. 第三者手机小商场的**调试功能**开启 3. 在微信小程序平台设置第三者的微信账号是**体验者** -### 7.1.4 微信支付失败 +### 微信支付失败 现象: @@ -67,18 +67,18 @@ 开发者必须拥有商户支付权限,然后设置好以下信息: ``` -wx.app-id= -wx.app-secret= -wx.mch-id= -wx.mch-key= -wx.notify-url= +litemall.wx.app-id= +litemall.wx.app-secret= +litemall.wx.mch-id= +litemall.wx.mch-key= +litemall.wx.notify-url= ``` 解决方案: 参考`3.0 小商场环境`,设置相应支付配置信息 -### 7.1.5 支付成功,但商品仍未付款 +### 支付成功,但商品仍未付款 现象: @@ -99,9 +99,9 @@ wx.notify-url= 2. 如果开发者已经上线服务,请确认`wx.notify-url`所指向的访问链接可以正常工作。 -## 7.2 管理后台 +## 管理后台 -### 7.2.1 Invalid bound statement +### Invalid bound statement 现象: @@ -123,11 +123,11 @@ mvn clean mvn package ``` -## 7.3 基础系统 +## 基础系统 -## 7.4 项目 +## 项目 -### 7.4.1 项目导入IDEA时卡顿 +### 项目导入IDEA时卡顿 现象: @@ -142,4 +142,4 @@ node_modules是litemall-admin所依赖的项目库,可能有近200M的文件 解决方案: 右键把node_modules设置Excluded -![](./pic7/excluded.png) +![](./pic/excluded.png) diff --git a/doc/README.md b/doc/README.md index e8d86464..63898eb1 100644 --- a/doc/README.md +++ b/doc/README.md @@ -3,10 +3,8 @@ * [介绍](../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 +* [FAQ](./FAQ.md) +* [1. 系统架构](./project.md) +* [2. 基础系统](./platform.md) +* [3. 小商场](./wxmall.md) +* [4. 管理后台](./admin.md) \ No newline at end of file diff --git a/doc/4.md b/doc/admin.md similarity index 76% rename from doc/4.md rename to doc/admin.md index 7c0d5b45..59d9c910 100644 --- a/doc/4.md +++ b/doc/admin.md @@ -7,7 +7,7 @@ * vuex * vue-router * axios - * element-ui + * element * vue-element-admin * 其他,见package.json * 后台管理后端, 即litemall-admin-api模块 @@ -16,32 +16,20 @@ 目前存在的问题: -* `严重`业务功能重新设计,例如即使是管理员也不能删除修改用户的相关数据 -* `严重`商品和货品管理,特别是添加一个商品 * `缺失`支持微信登录 -* `缺失`后台采用事务 * `缺失`首页中实现一些小组件,同时点击能够跳转相应页面 * `缺失`商品评价中管理员回复功能 * `缺失`支持导出表所有数据 -* `改善`返回的时间日期,在前端显示20180101T0000格式,效果不好 * `改善`管理员登录页面打开慢,优化速度 -* `改善`大部分页面仅仅是一个表CRUD的效果,交互性一般。 - 例如,显示商品的时候,只是简单显示表中保存的类目ID和品牌商ID, - 更好的效果可能是显示对应的类目名称和品牌商名称, - 同时能够显示更详细的类目信息和品牌商信息。 -* `改善`页面中图片数据目前是显示地址,更好地做法应该是显示小图片, - 同时支持点击放大的效果 * `改善`地址优化,目前每一次点击都会请求后台,应该缓存已有的数据 -* `改善`查询时排序功能 * `改善`vue和vue-element-admin等及时更新 * `功能`系统角色和权限 * `功能`系统日志功能 * `功能`系统数据字典功能 * `功能`系统栏目管理功能 -* `功能`支持国际化??? +* `功能`支持国际化 * `功能`支持数据库备份 - ## 4.1 litemall-admin-api 本节介绍管理后台的后台服务模块。 diff --git a/doc/pic7/excluded.png b/doc/pic/excluded.png similarity index 100% rename from doc/pic7/excluded.png rename to doc/pic/excluded.png diff --git a/doc/pic1/1-12.png b/doc/pic1/1-12.png new file mode 100644 index 00000000..fe9907c4 Binary files /dev/null and b/doc/pic1/1-12.png differ diff --git a/doc/pic1/1-2.png b/doc/pic1/1-2.png index 4b48e476..06a1cabb 100644 Binary files a/doc/pic1/1-2.png and b/doc/pic1/1-2.png differ diff --git a/doc/pic1/1-9.png b/doc/pic1/1-9.png index 6021c31a..43a8c02e 100644 Binary files a/doc/pic1/1-9.png and b/doc/pic1/1-9.png differ diff --git a/doc/2.md b/doc/platform.md similarity index 99% rename from doc/2.md rename to doc/platform.md index d3c18ebe..b805cbde 100644 --- a/doc/2.md +++ b/doc/platform.md @@ -7,8 +7,6 @@ * litemall-db模块 * litemall-all模块 -实际上,litemall**真正的基础系统**是litemall-core模块和litemall-db模块。 - litemall-all模块则只是一个包裹模块,几乎没有任何代码。该模块的作用是融合两个spring boot模块 和litemall-admin模块静态文件到一个单独spring boot应用中,并最终打包成war格式的项目安装包。 diff --git a/doc/1.md b/doc/project.md similarity index 62% rename from doc/1.md rename to doc/project.md index eb112106..0aea8097 100644 --- a/doc/1.md +++ b/doc/project.md @@ -9,9 +9,9 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 项目的架构是三个系统和六个模块: -* 基础系统子系统(core) +* 基础系统子系统(platform) - 由数据库、litemall-cre模块、litemall-db模块和litemall-all模块组成; + 由数据库、litemall-core模块、litemall-db模块和litemall-all模块组成; * 小商场子系统(wxmall) @@ -29,8 +29,8 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 * Spring Boot技术栈 - 采用IDEA开发工具,开发litemall-core、litemall-db、litemall-all、 - litemall-admin-api和litemall-wx-api共六个个模块; + 采用IDEA开发工具,开发litemall-core、litemall-db、litemall-admin-api、 + litemall-wx-api和litemall-all共五个模块; * miniprogram(微信小程序)技术栈 @@ -115,7 +115,7 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 * 安全方面,仅采用最基本的代码,提供简单基本的安全服务; * 性能方面,没有涉及内存数据库缓存功能,而是完全依赖MySQL; * 对象存储服务方面,支持本地存储和第三方云存储方案。 -* 消息提醒方面,支持邮件提醒、第三方云短信提醒和微信模板提醒; +* 消息通知方面,支持邮件通知、第三方云短信通知和微信模板通知; * 部署方便,支持多服务部署和一键部署脚本; * 文档全面,虽然还在开发中,但是规划中文档和代码注释一定会完成,帮助开发者理解项目。 @@ -163,20 +163,6 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 先不开发和测试这样业务功能,等其他功能开发完毕和部署测试成功以后,再来开发这些线上环境才能 运行的功能,此时会有一个好的基础。 -注意: -> 以上三种阶段基于个人理解,有可能有误或不当的地方。 - -讨论: -> 对于内网IP,例如"192.168.0.1",是应该认为属于开发阶段的配置,还是应该认为属于部署阶段的配置? -> 本人认为,这里可能不一定,看开发者的实际需要,不过更倾向于开发阶段。 -> -> 场景1,开发者本机是"192.168.0.1",那么此时litemall-wx模块的api.js中,如果采用localhost,那么 -> 本机的微信开发者工具可以访问,但是局域网内手机测试则不能访问;而如果采用本机的IP地址,那么 -> 本机微信开发者工具可以访问,同时局域网内手机测试也能访问。此时,设置IP地址应该属于开发阶段。 -> -> 场景2,局域网内管理后台代码部署到局域网服务器中,用户基于局域网的内网IP来访问管理平台, -> 此时,设置IP地址应该属于部署阶段(甚至可以认为是“上线阶段”)。 - ## 1.4 开发方案 ![](pic1/1-2.png) @@ -184,15 +170,15 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 如图所示,当前开发阶段的方案: * MySQL数据访问地址`jdbc:mysql://localhost:3306/litemall` -* litemall-wx-api后台服务地址`http://localhost:8082`,数据则来自MySQL -* litemall-admin-api后台服务地址`http://localhost:8083`,数据则来自MySQL +* litemall-wx-api后台服务地址`http://localhost:8080/wx`,数据则来自MySQL +* litemall-admin-api后台服务地址`http://localhost:8080/admin`,数据则来自MySQL * litemall-admin前端访问地址`http://localhost:9527`, 数据来自litemall-admin-api * litemall-wx没有前端访问地址,而是直接在微信小程序工具上编译测试开发,最终会部署到微信官方平台(即不需要自己部署web服务器),而数据则来自litemall-wx-api ### 1.4.1 数据库 -按照开发环境前,需要先在本地配置好数据库: +数据库环境设置过程如下: 1. 安装MySQL @@ -236,61 +222,39 @@ litemall是一个简单的商场系统,基于现有的开源项目,重新实 如果采用IDEA也可以跳过当前步骤,直接步骤8(因为运行时会自动编译再运行)。 -8. 采用Maven命令运行本项目的litemall-wx-api模块。 +8. 采用Maven命令运行本项目的litemall-all 例如: ``` - cd litemall/litemall-wx-api + cd litemall/litemall-all mvn spring-boot:run ``` - 如果采用IDEA,则litemall-wx-api模块的Application类 + 如果采用IDEA,则litemall-all模块的Application类 右键` Run Application.main()`方式运行该模块, ![](pic1/1-9.png) 打开浏览器,输入 ``` - http://localhost:8082/wx/index/index + http://localhost:8080/wx/index/index + http://localhost:8080/admin/index/index ``` - 如果出现JSON数据,则litemall-wx-api模块运行正常。 + 如果出现JSON数据,则litemall-all模块运行正常。 -9. 采用Maven命令运行本项目的litemall-admin-api模块。 - - 例如: - ``` - cd litemall/litemall-admin-api - mvn spring-boot:run - ``` - - 如果采用IDEA,则litemall-admin-api模块的Application类 - 右键` Run Application.main()`方式运行该模块, - - 打开浏览器,输入 - ``` - http://localhost:8083/admin/index/index - ``` - 如果出现JSON数据,则litemall-admin-api模块运行正常。 - 注意: -> 1. 由于设置不同的端口,因此开发时,IDEA可以同时运行litemall-wx-api和litemall-admin-api两个Spring Boot程序。 -> 2. 有些开发者可能会运行litemall-all模块来运行整个项目,这里并不反对,但是开发者需要 -> 清楚地明白当前小程序前端依赖后台服务litemall-wx-api的默认端口是8082,管理后台前端 -> 依赖后台服务litemall-admin-api的默认端口是8083;而包裹两个后台服务的litemall-all模块 -> 的端口则是8080,因此这里开发者需要对前端进行调整才能对接成功。 -> 3. 在上述开发步骤中,既介绍了Maven命令方式,也介绍了IDEA方式,但是仍然建议 +> 1. 在上述开发步骤中,既介绍了Maven命令方式,也介绍了IDEA方式,但是仍然建议 > 开发时采用IDEA即可。 -> 4. 以上是本人开发过程中采用的一些步骤,开发者可不拘泥于这些步骤。 - -有的时候,开发者使用IDEA导入项目或者运行项目的时候会出现软件卡顿的现象,这通常是litemall-admin的 -node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当IDEA尝试索引该文件夹内的大量文件时 -则出现IDEA卡顿的现象,具体解决方式可以参见[FAQ](./7.md) +> 2. 以上是本人开发过程中采用的一些步骤,开发者可不拘泥于这些步骤。 +> 3. 开发者使用IDEA导入项目或者运行项目的时候会出现软件卡顿的现象,这通常是litemall-admin的 +> node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当IDEA尝试索引该文件夹内的大量文件时 +> 则出现IDEA卡顿的现象,具体解决方式可以参见[FAQ](./FAQ.md) ### 1.4.3 微信小程序开发环境 1. 安装微信小程序开发工具 2. 导入本项目的litemall-wx模块文件夹 -3. 编译前,请确定litemall-wx-api模块已经运行,而litemall-wx模块的config文件夹中的api.js已经设置正确的后台数据服务地址; +3. 编译前,请确定litemall-all模块已经运行,而litemall-wx模块的config文件夹中的api.js已经设置正确的后台数据服务地址; 4. 点击`编译`,如果出现数据和图片,则运行正常 注意: @@ -299,23 +263,22 @@ node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当 > 因此微信登录导致后台服务向微信服务器交互时会失败。 > 2. 有的开发者可能认为把litemall-wx模块的appid设置成开发者自己的appid就可以, > 但是由于小商场的云主机后台服务的appid仍然是本人appid,因此微信登录时仍然会失败。 -> 3. 开发者可以在litemall-wx和litemall-wx-api中设置自己的appid,以及部署自己的后台服务, +> 3. 开发者可以在litemall-wx和litemall-core模块中设置自己的appid,以及部署自己的后台服务, > 相关内容请阅读章节3。或者,开发者可以采用账号登录方式登录,然后体验商品购买下单的方式。 > 4. 由于没有设置商户支付信息,因此开发者在付款时会失败。相关内容阅读章节3。 ### 1.4.4 Vue开发环境 1. 安装[nodejs](https://nodejs.org/en/) -2. 安装VSC(Visual Studio Code) -3. 导入本项目的litemall-admin模块文件夹 -4. 安装依赖库 +2. 安装依赖库 ``` + cd litemall/litemall-admin npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install ``` -5. 编译并运行 +3. 编译并运行 ``` cnpm run dev @@ -323,7 +286,9 @@ node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当 然后,打开浏览器,输入`http://localhost:9527`。 如果出现管理后台登录页面,则表明管理后台的前端运行正常; -6. 请确定litemall-admin-api模块已经运行,然后点击`登录`,如果能够成功登录,则表明管理后台的前端和后端对接成功,运行正常。 +4. 请确定litemall-all模块已经运行,然后点击`登录`,如果能够成功登录,则表明管理后台的前端和后端对接成功,运行正常。 + +目前本人采用VSC(Visual Studio Code)来开发litemall-admin项目,开发者也可以采用其他熟悉的IDE。 ## 1.5 部署方案 @@ -335,22 +300,22 @@ node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当 * litemall-wx-api模块会包含litemall-core模块和litemall-db模块,部署在服务器中 * litemall-admin-api模块会包含litemall-core模块和litemall-db模块,部署在服务器中 + * litemall-all模块则会包装litemall-wx-api模块和litemall-admin-api模块; * litemall-wx模块部署在微信开发者工具中,此外数据API地址指向litemall-wx-api所在服务qi地址 * litemall-admin编译出的静态文件放在web服务器或者tomcat服务器,此外服务器地址设置指向3中litemall-admin-api所在地址 最后,**如果项目部署云主机,则根据开发者的部署环境在以下文件中或代码中修改相应的配置。** 1. MySQL数据库设置合适的用户名和密码信息; -2. 后台服务模块设置合适的配置信息,建议开发者参考deploy/litemall-api/config方式,即在后台服务模块外部设置部署配置文件, - 这样可以避免开发者对模块内部的开发配置文件造成修改; +2. 后台服务模块设置合适的配置信息; 3. 小商场前端litemall-wx模块`config/api.js`的`WxApiRoot`设置小商场后台服务的服务地址; 4. 管理后台前端litemall-admin模块`config/dep.env.js`中的`BASE_API`设置管理后台后台服务的服务地址。 实际上,最终的部署方案是灵活的: +* 可以是同一云主机中安装一个Spring Boot服务,同时提供litemall-admin、litemall-admin-api和litemall-wx-api三种服务 * 可以单一云主机中仅安装一个tomcat/nginx服务器部署litemall-admin静态页面分发服务, 然后部署两个Spring Boot的后台服务; -* 也可以是同一云主机中安装一个Spring Boot服务,同时提供litemall-admin、litemall-admin-api和litemall-wx-api三种服务 * 也可以把litemall-admin静态页面托管第三方cdn,然后开发者部署两个后台服务 * 当然,甚至多个服务器,采用集群式并发提供服务。 @@ -360,15 +325,14 @@ node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当 以下简单列举几种方案。 -### 1.5.1 单机云部署方案 +### 1.5.1 单机单服务部署方案 -本节介绍基于腾讯云的单机云部署方案,面向的是服务器数据和应用部署在云主机单机中用于演示的场景。 +本节介绍基于腾讯云的单机单服务部署方案,面向的是服务器数据和应用部署在云主机单机中用于演示的场景。 其他云应该也是可行的。 -主要流程是:创建云主机,安装ubuntu操作系统,按照JDK和MySQL应用运行环境,部署两个Spring Boot微服务后台应用, -以及部署管理后台静态文件到tomcat。 +主要流程是:创建云主机,安装ubuntu操作系统,按照JDK和MySQL应用运行环境,部署单一Spring Boot服务。 -![](pic1/1-3.png) +![](pic1/1-11.png) #### 1.5.1.1 主机 @@ -386,6 +350,9 @@ node_modules文件夹内自动下载了大量的litemall-admin的依赖库,当 目前允许的端口:8081,8082,8083,8080,80,443,22,3306 + 注意: + 这里其实只需要8080端口,允许其他端口只是方面开发阶段的测试和调试。 + 4. 设置SSH密钥(可选) 建议开发者设置SSH密钥,可以免密码登录云主机,以及用于脚本自动上传应用。 @@ -419,232 +386,109 @@ sudo apt-get update sudo apt-get install mysql-server sudo apt-get install mysql-client ``` - -下面是可选地设置root账号远程访问MySQL - -1. MySQL默认不支持远程访问,因此需要修改配置文件 - ``` - sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf - ``` - 添加'#'注释掉其中的`bind-address`, - ``` - #bind-address= 127.0.0.1`; - ``` - -2. 设置root账号远程访问权限 - ``` - mysql -u root -p - GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; - FLUSH PRIVILEGES; - quit; - ``` -3. 登录腾讯云,设置云主机的`安全组`,允许`3306`端口访问,然后重启云主机,使得这些配置生效。 - -警告 -> 1. 因为安全的原因,MySQL不应该设置远程访问, -> 这里仅仅用于方便数据导入操作。 -> 2. MySQL应该部署在专门的服务器中, -> 这里仅仅用于演示远程部署MySQL。 - -#### 1.5.1.4 litemall数据 - -这里可以采用命令行式,也可以采用MySQL自带的Workbench导入。 - -* 命令行导入 - - 1. 采用FileZilla把本项目的数据库文件上传到云主机 - 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`完成数据导入。 - -* 命令脚本 - ```bash - cd deploy - mysql -h localhost -u root -p123456 - source ./litemall-db/litemall_schema.sql - use litemall; - source ./litemall-db/litemall_table.sql - source ./litemall-db/litemall_data.sql - ``` - - 其中123456是开发者所设置的MySQL的管理员密码。 - -#### 1.5.1.5 Tomcat/Nginx - -本项目中采用二进制jar包方式来部署Spring Boot后端应用,因此可以不需要部署在tomcat中。 -但是,litemall-admin前端项目最终会编译出静态文件,需要部署在服务器中, -因此这里需要安装tomcat或者nginx(或者其他服务器)。 - -这里可能有点绕: - -1. 开发方案,无需tomcat/nginx,直接用VSC即可; -2. 部署方案,采用tomcat,这里是因为80端口可能需要云主机备案因此采用tomcat使用8080端口; -3. 上线方案. 采用nginx,通过反向代理访问后台服务。 - -因此目前这里采用tomcat部署静态文件,通过8080端口访问管理后台。 -当然,这里没有严格限制,开发者也可以直接配置好nginx,在部署方案就使用nginx来 -部署静态文件服务,通过web端口80访问管理后台。 - -* Tomcat部署静态文件 - - 1. 安装tomcat - ```bash - sudo apt-get install tomcat8 - ``` - - 2. 配置tomcat指向`delpoy/litemall-admin/dist`目录 - - ```bash - sudo vi /var/lib/tomcat8/conf/server.xml - ``` - 在其中添加一行新的内容 - ``` - - ... - - ... - - ``` - - 注意:这里假定litemall-admin静态文件是上传在`/home/ubuntu/deploy/litemall-admin/dist`文件夹中,开发者可以自行调整。 - - 3. 运行/重启tomcat - - ``` - sudo service tomcat8 stop - sudo service tomcat8 start - sudo service tomcat8 restart - ``` - -* Nginx部署静态文件 - - 这里可以参考http://www.nginx.cn/4723.html - - 1. 安装nginx - - ```bash - sudo apt-get update - sudo apt-get install nginx - ``` - - 2. 配置nginx指向`delpoy/litemall-admin/dist`目录 - 注意:这里假定litemall-admin静态文件是上传在`/home/ubuntu/deploy/litemall-admin/dist`文件夹中,开发者可以自行调整。 - - 3. 运行/重启nginx - ``` - sudo service nginx stop - sudo service nginx start - sudo service nginx restart - ``` - -#### 1.5.1.6 项目打包 - -这里项目打两个Spring Boot模块的打包和Vue项目的编译打包两种: - -1. Spring Boot打包 - - 采用如下命令进行项目打包 +### 1.5.1.4 项目打包 +1. 在主机或者开发机打包项目到deploy; ``` cd litemall - mvn clean - mvn package - ``` - - 此时,在litemall-wx-api项目的target文件夹中看到litemall-wx-xxx-exec.jar; - 在litemall-admin-api项目的target文件夹中看到litemall-admin-xxx-exec.jar。 - -2. Vue项目打包 - - 采用如下命令进行项目打包 - - ````bash - cd litemall/litemall-admin + cat ./litemall-db/sql/litemall_schema.sql > ./deploy/db/litemall.sql + cat ./litemall-db/sql/litemall_table.sql >> ./deploy/db/litemall.sql + cat ./litemall-db/sql/litemall_data.sql >> ./deploy/db/litemall.sql + + cd ./litemall-admin + cnpm install cnpm run build:dep - ```` + + cd .. + mvn clean package + cp -f ./litemall-all/target/litemall-all-*-exec.jar ./deploy/litemall/litemall.jar + ``` + 这里的工作是: + 1. 把数据库文件拷贝到deploy/db文件夹 + 2. 编译litemall-admin项目 + 3. 编译litemall-all模块,同时把litemall-admin编译得到的静态文件拷贝到 + litemall-all模块的static目录 + +2. 修改litemall文件夹下面的*.yml外部配置文件,当litemall-all模块启动时会 + 加载外部配置文件,而覆盖默认jar包内部的配置文件。 + 例如,配置文件中一些地方需要设置成远程主机的IP地址 + +此时deploy部署包结构如下: - 此时,litemall-admin模块的dist文件夹中就是最终部署时的代码,可以先压缩,上传到云主机,再解压缩。 +* bin +存放远程主机运行的脚本,包括deploy.sh脚本和reset.sh脚本 -#### 1.5.1.7 项目部署运行 +* db +存放litemall数据库文件 -https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#deployment-service +* litemall +存放远程主机运行的代码,包括litemall-all二进制可执行包和litemall外部配置文件 -1. 项目进一步打包到deploy文件夹中: - * litemall-wx-api模块编译得到的litemall-wx-api-xxx-exec.jar 保存到deploy的litemall-wx-api文件夹中,同时重命名成litemall-wx-api.jar - * litemall-admin-api模块编译得到的litemall-admin-api-xxx-exec.jar 保存到deploy的litemall-admin-api文件夹中,同时重命名成litemall-admin-api.jar - * litemall-admin模块编译以后,把dist文件夹压缩,然后放到deploy的litemall-admin文件夹中。 - * litemall-db模块的sql文件拷贝到deploy的litemall-db文件夹中。 +* util +存放开发主机运行的脚本,包括package.sh脚本和lazy.sh脚本。 +由于是本地开发主机运行,因此开发者可以不用上传到远程主机。 -2. 使用FileZilla把deploy整个文件夹上传到云主机的/home/ubuntu文件夹中 - -3. 使用PuTTY登录云主机 - -4. 如果开发者没有部署litemall数据库,可以运行以下命令: +### 1.5.1.5 项目部署 +1. 远程主机环境(MySQL和JDK1.8)已经安装好,请确保云主机的安全组已经允许相应的端口。 +2. 导入db/litemall.sql ```bash - cd deploy - mysql -h localhost -u root -p123456 - source ./litemall-db/litemall_schema.sql - use litemall; - source ./litemall-db/litemall_table.sql - source ./litemall-db/litemall_data.sql + cd /home/ubuntu/deploy/db + mysql -h localhost -u $ROOT -p$PASSWORD < litemall.sql ``` - 注意,123456是开发者所设置的MySQL管理员密码 - 警告: - > litemall_schema.sql会尝试删除litemall数据库然后重建新的数据库。 - -5. 运行脚本部署运行 - +3. 启动服务 ```bash - sudo ./deploy/bin/deploy.sh + sudo service litemall stop + sudo ln -f -s /home/ubuntu/deploy/litemall/litemall.jar /etc/init.d/litemall + sudo service litemall start ``` - - ![](pic1/1-6.png) - -6. 测试部署是否成功 - - 请确保云主机的安全组已经允许相应的端口(见1.5.3.1); - 然后测试是否部署成功(xxx.xxx.xxx.xxx是云主机IP): - +4. 测试是否部署成功(xxx.xxx.xxx.xxx是云主机IP): ``` - http://xxx.xxx.xxx.xxx:8082/wx/index/index - http://xxx.xxx.xxx.xxx:8083/admin/index/index + http://xxx.xxx.xxx.xxx:8080/wx/index/index + http://xxx.xxx.xxx.xxx:8080/admin/index/index http://xxx.xxx.xxx.xxx:8080/#/login ``` -#### 1.5.1.8 部署脚本 +### 1.5.1.6 项目辅助脚本 -为了简化步骤1和步骤2,完成了deploy/util/lazy.sh上传脚本和deploy/util/package.sh部署脚本, +在前面的项目打包和项目部署中都是采用手动命令来部署。 +这里可以写一些脚本简化: + +* util/packet.sh + +在开发主机运行可以自动项目打包 + +* util/lazy.sh + +在开发主机运行可以自动项目打包、项目上传远程主机、自动登录系统执行项目部署脚本。 注意: -> 1. 开发者需要在deploy/util/package.sh和deploy/util/lazy.sh中设置相应的云主机登录账号和密钥文件路径。 -> 2. 开发者需要在deploy/bin/reset.sh设置云主机的MySQL的root登录账户。 -> 3. 请先执行1.5.1中上述步骤,确保部署环境成功。 +> 1. 开发者需要在util/lazy.sh中设置相应的远程主机登录账号和密钥文件路径。 +> 2. 开发者需要在bin/reset.sh设置远程主机的MySQL的root登录账户。 -* package.sh - -该脚本会自动把当前项目Spring Boot项目打包和Vue项目打包工作,然后复制到deploy文件夹中。 - -* lazy.sh - -该脚本会调用package.sh打包项目,然后上传deploy文件夹到云主机,最后ssh登录远程主机执行bin下面的deploy.sh脚本。 - +* bin/deploy.sh + +在远程主机运行可以自动部署服务 + +* bin/reset.sh + +在远程主机运行可以自动项目导入数据、删除本地上传图片、再执行bin/deploy.sh部署服务。 + 注意: -> 本项目的deploy文件夹以及其中的部署相关脚本只能适用于本节部署方式。 -> 目前灵活性较差,开发者可以参考实现自己的相关脚本,简化开发工作。 +> 开发者需要在bin/reset.sh设置远程主机的MySQL的root登录账户。 + +总结,当开发者设置好配置信息以后,可以在本地运行lazy.sh脚本自动一键部署: +```bash +cd litemall +./deploy/util/lazy.sh +``` + +不过由于需要设置的信息会包含敏感安全信息,强烈建议开发者参考这里的deploy文件夹, +然后实现自己的deploy文件夹,妥善处置外部配置文件和脚本中的敏感安全信息!!! + +### 1.5.2 单机多服务部署方案 + ### 1.5.2 集群式云部署方案 @@ -657,38 +501,12 @@ https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#dep 5. 一台或多台云主机部署小商场的后台服务 虽然由于环境原因没有正式测试过,但是这种简单的集群式场景应该是可行的。 -在1.5.1节中所演示的三个服务是独立的,因此延伸到这里分布式是非常容易的。 +在1.5.2节中所演示的三个服务是独立的,因此延伸到这里分布式是非常容易的。 但是,如果需要实现互联网式分布式云部署,目前的项目架构和方案不支持。 至少每个功能模块应该是独立服务系统。此外,需要引入单点登录系统、集群、缓存 和消息队列等多种技术。因此如果开发者需要这种形式的分布式方案,请参考其他项目。 -### 1.5.3 war部署方案 - -这里介绍另外一种单主机单服务的war部署方案,即三个服务打包成一个war格式的项目部署包。 - -![](pic1/1-11.png) - -和1.5.1节相比,采用这样方案的原因是: - -1. 安装方便,是传统的web项目安装方式,在tomcat里面部署一个war项目包,即可完成安装; -2. 内存消耗少。在1.5.1节中三个独立的java环境消耗的内存大概900M多,而这里部署以后 -只需要一个java环境,因此消耗内存只有1.5.3节方案的三分之一,适合1G云主机部署。 -3. 只存在一个域名和端口,没有多个服务之间依赖关系。 - -具体的打包部署方案是; - -1. litemall-admin首先需要先编译得到静态文件; -2. 采用`mvn package`命令,litemall-all模块自动生成war格式的安装包,里面 - 包含了三个后台服务和静态文件; -3. 把这个安装包手动或采用其他方式部署云主机的tomcat服务器。 - -更多细节阅读2.5节litemall-all模块。 - -注意: -> 虽然这里介绍了这种方案,但是本项目的开发、测试和部署是基于1.5.1方案, -> 因此开发者可能需要做一些配置方面的调整,例如后台服务地址调整。 - ## 1.6 上线方案 在1.5节部署方案中,我们介绍了多种部署的方案,但是实际上这些方案都不能立即用于正式环境: @@ -701,7 +519,15 @@ https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#dep 注意 > `www.example.com`仅作为实例,不是真实环境下的域名。 -这里列举一种可行的单机上线方案,开发者可以基于自身业务采用其他上线方案。 +这里列举一种基于1.5.2的单机多服务上线方案,即: +* 一个litemall-admin-api服务,独立提供管理后台前端的后台数据; +* 一个litemall-wx-api服务,独立提供小商城前端的后台数据; +* 一个nginx,对外出来litemall-admin的静态文件。 + +![](pic1/1-12.png) + + +开发者可以基于自身业务采用其他上线方案。 ### 1.6.1 域名 @@ -889,7 +715,7 @@ http://www.example.com 管理后台服务上线,则开发者需要自己的线上环境在以下文件中或代码中修改相应的配置。 1. MySQL数据库设置合适的用户名和密码信息; -2. 后台服务模块设置合适的配置信息,建议开发者参考deploy/litemall-api/config方式,即在后台服务模块外部设置部署配置文件, +2. 后台服务模块设置合适的配置信息,建议开发者参考deploy/litemall的外部配置文件, 这样可以避免开发者对模块内部的开发配置文件造成修改; 3. 小商场前端litemall-wx模块`config/api.js`的`WxApiRoot`设置小商场后台服务的服务地址; 4. 管理后台前端litemall-admin模块`config/prod.env.js`中的`BASE_API`设置管理后台后台服务的服务地址。 @@ -961,8 +787,8 @@ litemall-admin编译得到的前端文件在第一次加载时相当耗时,这 流程如下: 1. util脚本是当前开发主机运行,用来打包项目和上传腾讯云主机; -2. 打包项目时,会编译打包项目相关模块到litemall-admin、litemall-api和litemall-db文件夹中; -3. bin脚本是云主机运行,用来安装数据库、导入数据、启动静态文件服务和Spring Boot后台服务。 +2. 打包项目时,会编译打包项目相关模块到litemall和db文件夹中; +3. bin脚本是云主机运行,用来安装数据库、导入数据、启动项目服务。 这里deploy部署方式比较简单不灵活,开发者可以参考开发自己的项目脚本。 diff --git a/doc/3.md b/doc/wxmall.md similarity index 97% rename from doc/3.md rename to doc/wxmall.md index c8e5ad7b..03e70463 100644 --- a/doc/3.md +++ b/doc/wxmall.md @@ -12,12 +12,6 @@ 目前发现存在的一些问题: -* `严重`账号登录和注册中验证码 - - 注意: - > 这里之所以没有实现,是因为需要接入云平台的短信服务。 - > 后期可能接入腾讯的短信服务。 - * `缺失`优惠券功能 * `缺失`商品评价中管理员回复功能,进一步地用户之间相互评价回复 * `缺失`后台服务返回的token存在有效期,小商场应该自动刷新 @@ -36,7 +30,6 @@ * `改善`商品的订单中支持订单号搜索功能 * `改善`在一些内容比较多的页面中支持“顶部”功能 * `功能`目前已经有账号登录页面,可以再支持手机短信登录方式。 -* `功能`个人页面支持联系客服 * `功能`个人页面支持帮助中心 * `功能`推荐功能,基于用户的一些信息,在合适的页面给出推荐商品 @@ -50,10 +43,12 @@ 开发者在微信小程序官网申请以后,可以有app-id和app-secret信息。 -1. 在litemall-wx-api模块的src/main/resources的资源文件中设置 +1. 在litemall-core模块的src/main/resources的资源文件中设置 ``` -wx.app-id=开发者申请的app-id -wx.app-secret=开发者申请的app-secret +litemall + wx + app-id=开发者申请的app-id + app-secret=开发者申请的app-secret ``` 2. 在litemall-wx模块的project.config.json文件中设置 diff --git a/litemall-admin-api/pom.xml b/litemall-admin-api/pom.xml index 21f3f86d..8ee7dc92 100644 --- a/litemall-admin-api/pom.xml +++ b/litemall-admin-api/pom.xml @@ -29,21 +29,6 @@ - - - src/main/resources - - - - src/main/java - - **/*.properties - **/*.xml - - false - - - org.springframework.boot diff --git a/litemall-admin/config/dep.env.js b/litemall-admin/config/dep.env.js index 7b80557e..4f61bd0c 100644 --- a/litemall-admin/config/dep.env.js +++ b/litemall-admin/config/dep.env.js @@ -1,5 +1,5 @@ module.exports = { NODE_ENV: '"production"', - ENV_CONFIG: '"dep"', - BASE_API: '"http://localhost:8083/admin"' + ENV_CONFIG: '"dep"', + BASE_API: '"http://122.152.206.172:8080/admin"' } diff --git a/litemall-admin/config/dev.env.js b/litemall-admin/config/dev.env.js index 4629bf88..94da1459 100644 --- a/litemall-admin/config/dev.env.js +++ b/litemall-admin/config/dev.env.js @@ -1,5 +1,5 @@ module.exports = { NODE_ENV: '"development"', - ENV_CONFIG: '"dev"', - BASE_API: '"http://localhost:8083/admin"' + ENV_CONFIG: '"dev"', + BASE_API: '"http://localhost:8080/admin"' } diff --git a/litemall-all/pom.xml b/litemall-all/pom.xml index c5479395..a2db2efc 100644 --- a/litemall-all/pom.xml +++ b/litemall-all/pom.xml @@ -60,6 +60,19 @@ org.springframework.boot spring-boot-maven-plugin + + true + + + + + repackage + + + exec + + + diff --git a/litemall-all/src/main/resources/application.yml b/litemall-all/src/main/resources/application.yml index 9722d747..3802b74f 100644 --- a/litemall-all/src/main/resources/application.yml +++ b/litemall-all/src/main/resources/application.yml @@ -12,6 +12,8 @@ logging: root: ERROR org.springframework: ERROR org.mybatis: ERROR - org.linlinjava.litemall.admin: DEBUG - org.linlinjava.litemall.wx: DEBUG - org.linlinjava.litemall: DEBUG \ No newline at end of file + org.linlinjava.litemall.core: ERROR + org.linlinjava.litemall.db: ERROR + org.linlinjava.litemall.admin: ERROR + org.linlinjava.litemall.wx: ERROR + org.linlinjava.litemall: ERROR \ No newline at end of file diff --git a/litemall-core/pom.xml b/litemall-core/pom.xml index a9a61cc5..b3d010cc 100644 --- a/litemall-core/pom.xml +++ b/litemall-core/pom.xml @@ -89,20 +89,4 @@ - - - - src/main/resources - - - - src/main/java - - **/*.properties - **/*.xml - - false - - - \ No newline at end of file diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/LocalStorage.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/LocalStorage.java index 345fff5b..305ee71b 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/LocalStorage.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/LocalStorage.java @@ -20,7 +20,6 @@ public class LocalStorage implements Storage { private String storagePath; private String address; - private String port; private Path rootLocation; @@ -47,15 +46,6 @@ public class LocalStorage implements Storage { this.address = address; } - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - - @Override public void store(MultipartFile file, String keyName) { try { diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageAutoConfiguration.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageAutoConfiguration.java index 62fe0920..514a9b1e 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageAutoConfiguration.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageAutoConfiguration.java @@ -45,7 +45,6 @@ public class StorageAutoConfiguration { LocalStorage localStorage = new LocalStorage(); StorageProperties.Local local = this.properties.getLocal(); localStorage.setAddress(local.getAddress()); - localStorage.setPort(local.getPort()); localStorage.setStoragePath(local.getStoragePath()); return localStorage; } diff --git a/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageProperties.java b/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageProperties.java index b8b21f0d..1844f4ac 100644 --- a/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageProperties.java +++ b/litemall-core/src/main/java/org/linlinjava/litemall/core/storage/config/StorageProperties.java @@ -43,7 +43,6 @@ public class StorageProperties { public static class Local { private String address; - private String port; private String storagePath; public String getAddress() { @@ -54,14 +53,6 @@ public class StorageProperties { this.address = address; } - public String getPort() { - return port; - } - - public void setPort(String port) { - this.port = port; - } - public String getStoragePath() { return storagePath; } diff --git a/litemall-core/src/main/resources/application-core.yml b/litemall-core/src/main/resources/application-core.yml index 69b561c0..c88468b6 100644 --- a/litemall-core/src/main/resources/application-core.yml +++ b/litemall-core/src/main/resources/application-core.yml @@ -88,8 +88,8 @@ litemall: # 本地对象存储配置信息 local: storagePath: storage - address: http://localhost:8082/wx/storage/fetch/ - port: 8081 + # 这个地方应该是wx模块的WxStorageController的fetch方法对应的地址 + address: http://localhost:8080/wx/storage/fetch/ # 阿里云对象存储配置信息 aliyun: endpoint: oss-cn-shenzhen.aliyuncs.com diff --git a/litemall-db/pom.xml b/litemall-db/pom.xml index e26d65a3..b9b215aa 100644 --- a/litemall-db/pom.xml +++ b/litemall-db/pom.xml @@ -41,22 +41,6 @@ - - - - src/main/resources - - - - src/main/java - - **/*.properties - **/*.xml - - false - - - org.mybatis.generator diff --git a/litemall-wx-api/pom.xml b/litemall-wx-api/pom.xml index f2b18064..f0e3968a 100644 --- a/litemall-wx-api/pom.xml +++ b/litemall-wx-api/pom.xml @@ -56,22 +56,6 @@ - - - - src/main/resources - - - - src/main/java - - **/*.properties - **/*.xml - - false - - - org.springframework.boot diff --git a/litemall-wx/config/api.js b/litemall-wx/config/api.js index b43bd1a3..3332ac25 100644 --- a/litemall-wx/config/api.js +++ b/litemall-wx/config/api.js @@ -1,10 +1,10 @@ // 以下是业务服务器API地址 // 本机开发时使用 - // var WxApiRoot = 'http://localhost:8082/wx/'; +// var WxApiRoot = 'http://localhost:8080/wx/'; // 局域网测试使用 -// var WxApiRoot = 'http://192.168.0.101:8082/wx/'; +// var WxApiRoot = 'http://192.168.0.101:8080/wx/'; // 云平台部署时使用 -var WxApiRoot = 'http://122.152.206.172:8082/wx/'; +var WxApiRoot = 'http://122.152.206.172:8080/wx/'; // 云平台上线时使用 // var WxApiRoot = 'https://www.menethil.com.cn/wx/'; diff --git a/pom.xml b/pom.xml index 9ef2bd8d..2eb2fc5c 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,11 @@ litemall-admin-api ${project.version} + + org.linlinjava + litemall-all + ${project.version} + com.fasterxml.jackson.datatype