springboot+vue前后端免费开源

序言

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

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

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

后端项目结构

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

依赖继承关系如下:

依赖关系

如何从零搭建环境开发

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

安装环境

  • 下载对应平台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 有两个目录

    1. ~/.m2 用户级配置(如果该目录下面无文件则新建)
    2. $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
      
```bash
mvn -Pgenerator clean install
```
生成样例
  • API文档的生成

    mvn -PapiDcos clean install
    

    定制化内容可在以下目录

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

    生成Html和PDF两种格式文档

    生成截图:

Swagger
在线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();
      }
      
  • 定时任务的开发

    1. 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("执行任务参数错误");
              }
          }
      }
      
    2. 后台系统=》定时任务创建模版和触发器启动实例

      添加任务.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端用户列表
      
    • 常量值的处理

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

      常量值
前端使用:

```javascript
<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文档实现对应接口即可。

Swagger

在线文档

项目地址

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

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

演示地址:

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

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

小结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353