java+sql server花店管理系统_管理系统模板开发详细教程

序言

继上一篇 一套管理系统基础模版

详细梳理一下安装流程,功能说明,开发规范等。

  • 后端项目结构?
  • 如何从零搭建环境开发?
  • 如何打包部署?
  • 接入开发及规范
  • 项目地址
  • 小结

后端项目结构

​ 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://github.com/cuteJ/ot-mybatis-generator (定制生成器)

所依赖的项目安装包位置:https://maven.pkg.github.com/cuteJ/ot-server-parent

依赖继承关系如下:

32225a39549c39171cd5347607c9078b.png

项目依赖关系图

如何从零搭建环境开发

此小节为零基础搭建,经验开发人员可直接跳过!!!

安装环境

  • JDK1.8
  • https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
  • Maven
  • https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
  • Git
  • https://git-scm.com/downloads
  • Intellij idea
  • https://www.jetbrains.com/idea/download/
  • Mysql
  • https://downloads.mysql.com/archives/community/
  • NodeJs
  • https://nodejs.org/en/download/

git jdk maven 配置

Git 配置

git config --global user.name git config --global user.email 

Git建议配置

windows

git config --global core.autocrlf true

macos

git config --global core.autocrlf input

不必每次输入密码

git config credential.helper store

Jdk配置

# 执行以下命令,显示版本信息,安装完毕。

➜  ~ java -versionjava 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_profileexport JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk版本/Contents/Homeexport PATH=$PATH:$M2_HOME/bin

Maven配置

➜  ~ vim .bash_profileexport M2_HOME=/Users/lixingping/soft/apache-maven-3.5.2export PATH=$PATH:$M2_HOME/bin➜  ~ source .bash_profile➜  ~ mvn -vApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)

~/.m2 目录下添加settings.xml文件

<?xml version="1.0" encoding="UTF-8"?>githubcuteJ30b172901cad280e75dd5aa519fa02ab1040d3dbnexuscentralhttp://maven.aliyun.com/nexus/content/groups/public/githubgithubGitHub OWNER Apache Maven Packageshttps://maven.pkg.github.com/cuteJ/ot-server-parenttruetrue      github  

运行项目

  1. 下载项目
git clone https://github.com/cuteJ/shop-server.git
  1. 初始化数据库
shop-server/install/sql---- db.sql // 创建数据库和用户---- data.sql // 项目表结构和初始化数据

3. 安装maven依赖启动

maven.pkg.github.com下载有点慢,请有心理准备

4. 安装启动前端

git clone https://github.com/cuteJ/shop-web-mgt.gitcd shop-web-mgtnpm install --registry=https://registry.npm.taobao.orgnpm run dev

如何打包部署

  1. 打包 shop-server
cd shop-servermvn clean package// 将jar拷贝到服务器/data/cuteJ/servershop-server/shop-server-mgt/shop-server-mgt.jar
  1. 添加启动脚本(shop-server/install/shell/execute.sh)

脚本环境变量说明

  • MYSQL_URL:127.0.0.1:3306 数据库地址
  • MYSQL_USER:cuteJ_shop 数据库用户名
  • MYSQL_PASSWORD:cuteJ_shop123 数据库密码
  • SERVER_PORT:8300 应用启动端口
  • SERVER_CONTEXT_PATH:/shop 应用上下文
  • SERVER_SESSION_TIMEOUT:1800 管理后台Session超时时间(单位秒)
  • SERVER_ERROR_MODE:always 服务异常响应形式:always: 返回全部的堆栈信息(一般在debug,开发测试环境使用)never:返回友好提示
  • APP_CORS_ORIGIN: http://localhost:9527 跨域配置,也可以在nginx 配置
  • JWT_HEADER:Authorization Jwt C端API 认证配置
  • JWT_EXPIRATION token失效时间(单位秒)
#!/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#export SERVER_SESSION_TIMEOUT=1800#export SERVER_ERROR_MODE=always#export APP_CORS_ORIGIN: http://localhost:9527#export JWT_HEADER=Authorization#export JWT_SECRET=abkfdsfooi0934#export JWT_EXPIRATION=86400# oss optional(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=xxxMS_HOME=/data/cuteJ/serverMS_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: startstart() {  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: stopstop() {  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 Codecase $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;    ;;esacexit 0;
  1. 执行脚本
sh execute.sh start // 启动应用sh execute.sh stop // 停止应用sh execute.sh status // 查看应用状态
  1. 安装 nginx http://nginx.org
//配置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;  }}
  1. 打包前端 shop-web-mgt
// 配置接口地址shop-web-mgt/config/prod.env.jsnpm run build:prod// 拷贝 dist 目录下的文件到nginx下面

接入开发及规范

后端

基础数据初始化

目录 shop-server-mgt/main/src/java/com.onlythinking.shop.init

  • DicsInitializer (常量初始化)
  • ApisInitializer (常量初始化)
  • MenusInitializer (菜单初始化)
  • AdminInitializer (管理员初始化)
  • GrantInitializer (管理员授权)
  • DBMetaInitializer (数据库表结构数据)

执行初始化

mvn -Pdev spring-boot:runcurl http://127.0.0.1:8300/shop/api/insecure/re_init

Mybatis 生成实体Mapper

目录 shop-server-api

https://github.com/cuteJ/ot-mybatis-generator (可根据自身项目情况定制生成器)

mvn -Pgenerator clean install
5e2325cedc478ed3ed7f2d5ea1e747db.png

generatorConfig配置数据库 generatorConfig.xml添加表

bff1f183d44e216a18ca07cc0c1afb19.png

生成后的实体,mapper效果

API文档的生成

定制化内容可在以下目录

shop-server-mgt/src/docs/asciidoc 添加adoc文件

mvn -PapiDcos clean install
f30d2cf463b2b393b2aae826897d7580.png

Swagger UI

cb5cb50e682693d55230e000031cc0f5.png

生成后的Html文档

cca53e71d58f4ea213162ec32ca6caad.png

生成的后的PDF文档

响应异常处理

// 项目统一响应式异常为com.onlythinking.commons.exception.RespondedException// errorCode用法:如Token失效,接口校验约束异常等。public static final int TOKEN_EXPIRED = 40000;                     // Token 过期。private final int errorCode;private String errorMsg;private Object[] msgArgs;

国际化处理

原则上除代码注释外项目里面不应该有中文

国际化文件目录: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}");}// 携带参数响应式异常提示国际化处理if (StringUtils.isBlank(msg)) {   throw RespondedException.argumentInvalid("{mgt.entity.null}", 10);}

接口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}

权限的处理

// H5,小程序请求接口采用jwt 具体查看:

shop-server-app

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;/** * 

The describe

* * @author Li Xingping */@Slf4j@DisallowConcurrentExecutionpublic 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("执行任务参数错误"); } }}
e5a5f08e27d8b5661c910037982d0885.png

创建任务模版实例


前端

目录结构

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端用户列表

常量值的处理

常量值比如:性别,状态为了适配国际化和特殊字符处理制定一套映射表。

49a80fc62059ea28a1ede8dd9675c375.png

添加常量值

{{ scope.row.status | statusFilter(cacheData.statusMap['1000'])}}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文档实现对应接口即可。

Swagger

在线文档 https://cutej.github.io/shop-server/index.html

项目地址

https://github.com/cuteJ/shop-server 后端

https://github.com/cuteJ/shop-web-mgt 前端

演示地址:

因为项目托管在github上面且第一次加载文件较多,所有打开会比较慢

http://shop-web-mgt.onlythinking.com

小结

​ 项目刚起步,由于个人能力精力有限,项目里的纰漏和不足欢迎大家指出和交流。开源不易,有了大家的支持和鼓励才能更好的走下去。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值