百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

管理系统模板开发详细教程

liebian365 2024-11-22 17:15 19 浏览 0 评论

序言

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

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

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

后端项目结构

? 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
  • 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 <your name>
git config --global user.email <your_email@example.com>

Git建议配置

windows

git config --global core.autocrlf true

macos

git config --global core.autocrlf input

不必每次输入密码

git config credential.helper store


Jdk配置

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

?  ~ 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配置


?  ~ vim .bash_profile
export M2_HOME=/Users/lixingping/soft/apache-maven-3.5.2
export PATH=$PATH:$M2_HOME/bin

?  ~ source .bash_profile
?  ~ mvn -v
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)

~/.m2 目录下添加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>30b172901cad280e75dd5aa519fa02ab1040d3db</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>


运行项目

  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.git
cd shop-web-mgt
npm install --registry=https://registry.npm.taobao.org
npm run dev

如何打包部署

  1. 打包 shop-server
cd shop-server
mvn clean package
// 将jar拷贝到服务器/data/cuteJ/server
shop-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=xxx

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;
  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.js
npm 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:run
curl 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


API文档的生成

定制化内容可在以下目录

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

mvn -PapiDcos clean install




响应异常处理

// 项目统一响应式异常为
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;
/**
 * <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文档实现对应接口即可。

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

小结

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

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: