序言
繼上一篇 一套管理系統基礎模版
詳細梳理一下安裝流程,功能說明,開發規範等。
- 後端專案結構?
- 如何從零搭建環境開發?
- 如何打包部署?
- 接入開發及規範
- 專案地址
- 小結
後端專案結構
shop-server 依賴以下專案
https://github.com/cuteJ/ot-server-parent (統一版本外掛管理)
https://github.com/cuteJ/ot-server-commons (公共基礎類)
https://github.com/cuteJ/ot-boot-starter (自定義Spring boot starter)
所依賴的專案安裝包位置:https://maven.pkg.github.com/cuteJ/ot-server-parent
依賴繼承關係如下:
如何從零搭建環境開發
這一節為零基礎搭建,經驗開發人員可直接跳過!!!!
安裝環境
-
下載對應平臺JDK1.8 Download
# 執行以下命令,顯示版本資訊,安裝完畢。 ➜ ~ java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) #如果提示找不到對應命令新增 ➜ ~ vim .bash_profile export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk版本/Contents/Home export PATH=$PATH:$M2_HOME/bin
-
下載Maven Download
# 多個PATH變數用冒號分割 ➜ ~ vim .bash_profile export M2_HOME=/Users/lixingping/soft/apache-maven-3.5.2 export PATH=$PATH:$M2_HOME/bin # 執行以下命令,顯示版本資訊,安裝完畢。 ➜ ~ mvn -v Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00) Maven home: /data/apache-maven-3.5.2 Java version: 1.8.0_151, vendor: Oracle Corporation Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre Default locale: zh_CN, platform encoding: UTF-8 OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"
配置Maven settings.xml
settings.xml 有兩個目錄
- ~/.m2 使用者級配置(如果該目錄下面無檔案則新建)
- $M2_HOME/conf 全域性配置
在settings.xml 檔案新增以下內容:
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>github</id> <username>cuteJ</username> <password>b5bbc403f1b807e64a606bb98af0ab60f5302e67</password> </server> </servers> <mirrors> <mirror> <id>nexus</id> <mirrorOf>central</mirrorOf> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror> </mirrors> <profiles> <profile> <id>github</id> <repositories> <repository> <id>github</id> <name>GitHub OWNER Apache Maven Packages</name> <url>https://maven.pkg.github.com/cuteJ/ot-server-parent</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile> </profiles> <activeProfiles> <activeProfile>github</activeProfile> </activeProfiles> </settings>
-
Git Download
-
全域性配置
git config --global user.name <your name> git config --global user.email <your_email@example.com>
-
建議配置
- crlf
# windows系統 git config --global core.autocrlf true # mac系統 git config --global core.autocrlf input git config credential.helper store
-
-
開發工具 intellij idea
-
資料庫(選擇相應平臺安裝安裝) Mysql
-
安裝NodeJs Download
# 顯示版本則安裝成功 ➜ ~ npm -v 5.6.0
啟動專案
-
下載前後端專案
git clone https://github.com/cuteJ/shop-server.git
-
建立資料庫並初始化資料
# 專案install 目錄下兩個檔案 shop-server/install/sql ---- db.sql // 建立資料庫和使用者 ---- data.sql // 專案表結構和初始化資料
-
啟動後端專案(maven.pkg.github.com下載有點慢,請有心理準備?)
➜ ~ cd shop-server ➜ ~ mvn clean install ➜ ~ cd shop-server-mgt ➜ ~ mvn spring-boot:run
-
安裝啟動前端
git clone https://github.com/cuteJ/shop-web-mgt.git cd shop-web-mgt npm install --registry=https://registry.npm.taobao.org npm run dev
如何打包部署
-
後端 shop-server
cd shop-server mvn clean package # 拷貝到執行目錄 shop-server/shop-server-mgt/shop-server-mgt.jar
啟動指令碼(shop-server/install/shell/execute.sh)
#!/bin/bash - # 資料庫配置 #export MYSQL_URL=127.0.0.1:3306 #export MYSQL_USER=cuteJ_shop #export MYSQL_PASSWORD=cuteJ_shop123 # 應用配置 #export SERVER_PORT=8300 #export SERVER_CONTEXT_PATH=/shop # 管理後臺Session超時時間(單位秒) #export SERVER_SESSION_TIMEOUT=1800 # 服務異常響應形式:always: 返回全部的堆疊資訊(一般在debug,開發測試環境使用)never:返回友好提示 #export SERVER_ERROR_MODE=always # 跨域配置,也可以在nginx 配置 #export APP_CORS_ORIGIN: http://localhost:9527 #Jwt C端API 認證配置 #export JWT_HEADER=Authorization #export JWT_SECRET=abkfdsfooi0934 # token失效時間(單位秒) #export JWT_EXPIRATION=86400 # oss 可選(aliyun|huawei) #export APP_OSS_KEY=xxx #export APP_OSS_SECRET=xxx #export APP_OSS_ENDPOINT=xxx #export APP_OSS_URL=xxx #export APP_OSS_BUCKET=xxx # Linux 路徑 MS_HOME=/data/cuteJ/server MS_JAR=shop-server-mgt.jar # APP_NAME=shop-server-mgt # JAVA_OPTS="-Dspring.profiles.active=prod -Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m -XX:+UseG1GC"; MS_PID=`ps fax|grep java|grep "${MS_JAR}"|awk '{print $1}'` export MS_PID; # Function: start start() { pid=${MS_PID} if [ -n "${pid}" ]; then { echo "${APP_NAME} Service is already running (pid: ${pid})"; } else { # Start screener ms echo "Starting ${APP_NAME} service"; cd ${MS_HOME} nohup java ${JAVA_OPTS} -jar ./${MS_JAR} > /dev/null 2>&1 & } fi; # return 0; } # Function: stop stop() { pid=${MS_PID} if [ -n "${pid}" ]; then { echo -ne "Stopping service module"; kill -15 ${pid} sleep 5 pid=`ps fax|grep java|grep "${MS_JAR}"|awk '{print $1}'` if [ ${pid} ]; then { echo 'Kill Process!' kill -9 ${pid} } else { echo "${APP_NAME} stop success." } fi; } else { echo "${APP_NAME} service is not running"; } fi; #return 0; } # Main Code case $1 in start) start; ;; stop) stop; ;; restart) stop; sleep 1; start; ;; status) pid=${MS_PID} if [ "${pid}" ]; then { echo "${APP_NAME} service is running with pid: ${pid}"; } else { echo "${APP_NAME} service is not running"; } fi; ;; esac exit 0;
./execute.sh start # 啟動應用 ./execute.sh stop # 停止應用 ./execute.sh status # 檢視應用狀態
-
前端 shop-web-mgt
安裝 nginx Download
#配置 server { listen 80; server_name www.xxxx.com; proxy_set_header Host $host; proxy_set_header x-auth-token $http_x_auth_token; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Authorization $http_authorization; proxy_pass_header Authorization; location / { # shop-web-mgt 打包後 dist檔案 root /www/shop-web-mgt; add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate"; index index.html index.htm; } location /shop/ { proxy_set_header Host $host; proxy_set_header Cookie $http_cookie; proxy_set_header Referer $http_referer; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass_header Server; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://127.0.0.1:8300/shop/; #expires 0; } }
# 配置介面地址 shop-web-mgt/config/prod.env.js npm run build:prod # 拷貝 dist 目錄下的檔案到nginx下面
接入開發及規範
-
後端
-
基礎資料初始化
檔案目錄
shop-server-mgt/com.onlythinking.shop.init DicsInitializer (常量初始化) ApisInitializer (常量初始化) MenusInitializer (選單初始化) AdminInitializer (管理員初始化) GrantInitializer (管理員授權) DBMetaInitializer (資料庫表結構資料)
執行初始化(注意:會刪除之前的資料)
mvn -Pdev spring:boot curl http://127.0.0.1:8300/shop/api/insecure/re_init
-
Mybatis 生成實體Mapper
https://github.com/cuteJ/ot-mybatis-generator (可根據自身專案情況定製生成器)
目錄 shop-server-api
配置如下檔案 generatorConfig.properties,generatorConfig.xml
mvn -Pgenerator clean install
-
API文件的生成
mvn -PapiDcos clean install
定製化內容可在以下目錄
shop-server-mgt/src/docs/asciidoc 新增adoc檔案
生成Html和PDF兩種格式文件
生成截圖:
-
> [Swagger](https://www.zzhjshop.com/shop_test/swagger-ui.html)
>
> [線上文件](https://cutej.github.io/shop-server/index.html)
>
> [線上文件(pdf)](http://shop-mgt.zzhjshop.com/pdf/index.pdf)
-
響應異常處理
專案統一響應式異常為com.onlythinking.commons.exception.RespondedException
errorCode用法:如Token失效,介面校驗約束異常等。
-
國際化處理
原則上除程式碼註釋外專案裡面不應該有中文
國際化檔案目錄:shop-server-mgt/src/main/resources/i18n
// 方式一 private final MessageSource messageSource; String message = messageSource.getMessage("mgt.entity.null", null) // 異常類 if (StringUtils.isBlank(msg)) { throw RespondedException.argumentInvalid("{mgt.entity.null}"); }
-
介面URL規範
//(因為‘shop-server-app’和'shop-server-mgt'合併為一個應用啟動,為了方便許可權控制新增了/app字首作為區分| 根據情況也可以拆分為兩個應用) /{content-path}/api/app/ //(h5,小程式請求介面) /{content-path}/api/ //(管理後臺介面) com.onlythinking.commons.config.annotation.@ApiRest //說明 // 如下: @Slf4j @RequiredArgsConstructor(onConstructor = @__(@Autowired)) @Api(tags = "使用者登入") @ApiRest(serviceId = "app", value = "/auth/{appNo}/{maType}") public class MaAuthController { // controller 的拼接路徑為 /${content-path}/api/${serviceId}/${value}
-
許可權的處理
-
shop-server-app
// H5,小程式請求介面採用jwt 具體檢視:com.onlythinking.shop.app.core.security.JwtAuthorizationTokenFilter
-
shop-server-mgt
管理端採用Shiro框架
// RequiresPermissions value 規則 (module:domain:action) @ApiOperation("系統角色新增") @RequiresPermissions(value = "sys:role:save") @PostMapping(value = "/role/save") public RespondedBody sysRoleSave(@RequestBody OtSysRole dto) { infraSystemService.saveOrUpdateSysRole(dto); return RespondedBody.successful(); }
-
-
定時任務的開發
-
com.onlythinking.shop.mgt.system.jobs 建立任務
package com.onlythinking.shop.mgt.system.jobs; /** * <p> The describe </p> * * @author Li Xingping */ @Slf4j @DisallowConcurrentExecution public class HelloWordJob implements Job { @Override public void execute(JobExecutionContext context) { String instanceId = context.getMergedJobDataMap().getString("instanceId"); log.info("Job [{}] running ", instanceId); log.info("Hello world"); if (new Random().nextInt(20) % 2 == 0) { throw RespondedException.argumentInvalid("執行任務引數錯誤"); } } }
-
後臺系統=》定時任務建立模版和觸發器啟動例項
-
-
前端
-
目錄結構
src -- 原始碼目錄 ├── api -- API ├── assets -- 圖片資原始檔 ├── components -- 通用元件 ├── directive -- vue指令 ├── filters -- 過濾器 ├── lang -- 國際化配置 ├── icons -- svg檔案 ├── router -- 路由配置 ├── store -- vuex狀態管理 ├── styles -- 全域性css樣式 ├── utils -- 工具類 └── views -- 頁面元件 ├── app -- 應用管理(小程式) ├── dashboard -- 首頁 ├── errorPage -- 錯誤頁面 ├── layout -- 佈局頁面 ├── login -- 登入頁 ├── profile -- 個人配置 ├── svg-icons -- 圖示 ├── system -- 系統管理 ├── components -- 頁面級別元件 ├── sysApiListManager -- 介面列表 ├── sysAuthorityManager -- 介面許可權 ├── sysDicManager -- 常量管理 ├── sysJobManager -- 定時任務 ├── sysJobRunLogManager -- 定時任務日誌 ├── sysMenuManager -- 選單管理 ├── sysMetadataManager -- 資料字典 ├── sysOptLogManager -- 操作日誌 ├── sysRegionManager -- 地區管理 ├── sysRoleManager -- 角色管理 ├── sysUserManager -- 系統使用者管理 ├── user -- C端使用者管理 ├── userLoginManager -- C端使用者列表
-
常量值的處理
常量值比如:性別,狀態為了適配國際化和特殊字元處理制定一套對映表。
前端使用:
<template> <!--元件使用--> <sys-code v-if="cacheData.codes" :cache-options="cacheData['codes']" :type-code="'1000'" :selected.sync="ok" /> <!--過濾器使用--> <span v-if="cacheData.statusMap">{{ scope.row.status | statusFilter(cacheData.statusMap['1000'])}}</span> </template> import SysCode from '@/components/SysCode' import {cacheData} from '@/utils/cache' export default { name: 'demo', components: { SysCode }, data() { return { cacheData: {}, } }, mounted() { cacheData(this.cacheData, '1000').then(() => { }) } }
-
專案地址
如有需要使用其它語言實現後端,可以參考下面API文件實現對應介面即可。
專案地址
演示地址:
因為專案託管在github上面且第一次載入檔案較多,所有開啟會比較慢
小結
專案剛起步,由於個人能力精力有限,專案裡的紕漏和不足歡迎?大家指出和交流。開源不易,有了大家的支援和鼓勵才能更好的走下去。