创建springboot项目

添加分页依赖等

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency><dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.24.0-GA</version></dependency><!-- 分页--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.3.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><configuration><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin></plugins></build>
</project>

添加配置

spring.datasource.url = jdbc:mysql:///demo?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
spring.datasource.username = root
spring.datasource.password =  123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#指定映射xml文件位置
mybatis.mapper-locations=classpath:mapper/*.xml
#端口
server.port=8888

mybatis反向生成

db.sql

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`email` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`username` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`password` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`createDate` timestamp NULL DEFAULT NULL,`address` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王者归来', '287664409@qq.com', 'admin', '123456', '2020-09-21 00:00:00', '北京市通州区商通大道1号');
INSERT INTO `user` VALUES ('2', '小罗', '', 'tiger', '123456', '2020-09-22 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('3', '福山润', '', 'tiger', '123456', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('4', '莲花池', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('5', '乔峰', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('6', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('7', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('8', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('9', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('10', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('11', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
INSERT INTO `user` VALUES ('12', '王小虎', null, 'tiger', null, '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518');
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><!--导入属性配置 --><properties resource="jdbc.properties"></properties><!--mysql 连接数据库jar 这里选择自己本地位置--><classPathEntry location="${jdbc.driverLocation}"/><context id="testTables" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自动生成的注释 true:是 : false:否 --><property name="suppressAllComments" value="true"/></commentGenerator><!--数据库连接的信息:驱动类、连接地址、用户名、密码 --><jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.jdbcUrl}" userId="${jdbc.user}"password="${jdbc.password}"><!-- 只生成自己指定的 database 中的 User 表--><property name="nullCatalogMeansCurrent" value="true"/></jdbcConnection><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- targetProject:生成PO类的位置 --><javaModelGenerator targetPackage="com.example.demo.entity" targetProject="src/main/java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false"/><!-- 从数据库返回的值被清理前后的空格 --><property name="trimStrings" value="true"/></javaModelGenerator><!-- targetProject:mapper映射文件生成的位置 如果maven工程只是单独的一个工程,targetProject="src/main/java" 若果maven工程是分模块的工程,targetProject="所属模块的名称"--><sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false"/></sqlMapGenerator><!-- targetPackage:mapper接口生成的位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.mapper" targetProject="src/main/java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false"/></javaClientGenerator><!-- 指定数据库表 --><!--tableName:指定了表名 domainObjectName:指定了实体类的名称 --><table tableName="user" domainObjectName="User" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"selectByExampleQueryId="false"></table></context>
</generatorConfiguration>

jdbc.properties

jdbc.driverLocation=D:\\Software\\mysql-connector-java-8.0.11.jar
jdbc.driverClass=com.mysql.cj.jdbc.Driver
#数据库地址
jdbc.jdbcUrl=jdbc:mysql:///demo?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
#用户名
jdbc.user=root
#密码
jdbc.password=123456
#最大连接数
c3p0.maxPoolSize=30
#最小连接数
c3p0.minPoolSize=10
#关闭连接后不自动commit
c3p0.autoCommitOnClose=false
#获取连接超时时间
c3p0.checkoutTimeout=10000
#当获取连接失败重试次数
c3p0.acquireRetryAttempts=2

运行

统一结果处理

Result

package com.example.demo.common;import lombok.Data;@Data
public class Result<T> {/*** 状态码*/private long code;/*** 提示信息*/private String message;/*** 数据封装*/private T data;protected Result() {}protected Result(long code, String message, T data) {this.code = code;this.message = message;this.data = data;}/*** 成功返回结果** @param data 获取的数据*/public static <T> Result<T> success(T data) {return new Result<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);}/*** 成功返回结果** @param data    获取的数据* @param message 提示信息*/public static <T> Result<T> success(T data, String message) {return new Result<T>(ResultCode.SUCCESS.getCode(), message, data);}/*** 失败返回结果** @param errorCode 错误码*/public static <T> Result<T> failed(IErrorCode errorCode) {return new Result<T>(errorCode.getCode(), errorCode.getMessage(), null);}/*** 失败返回结果** @param errorCode 错误码* @param message   错误信息*/public static <T> Result<T> failed(IErrorCode errorCode, String message) {return new Result<T>(errorCode.getCode(), message, null);}/*** 失败返回结果** @param message 提示信息*/public static <T> Result<T> failed(String message) {return new Result<T>(ResultCode.FAILED.getCode(), message, null);}/*** 失败返回结果*/public static <T> Result<T> failed() {return failed(ResultCode.FAILED);}/*** 参数验证失败返回结果*/public static <T> Result<T> validateFailed() {return failed(ResultCode.VALIDATE_FAILED);}/*** 参数验证失败返回结果** @param message 提示信息*/public static <T> Result<T> validateFailed(String message) {return new Result<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);}/*** 未登录返回结果*/public static <T> Result<T> unauthorized(T data) {return new Result<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);}/*** 未授权返回结果*/public static <T> Result<T> forbidden(T data) {return new Result<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);}
}

ResultCode

package com.example.demo.common;/*** 枚举了一些常用API操作码*/
public enum ResultCode implements IErrorCode {SUCCESS(200, "操作成功"),FAILED(500, "操作失败"),VALIDATE_FAILED(404, "参数检验失败"),UNAUTHORIZED(401, "暂未登录或token已经过期"),FORBIDDEN(403, "没有相关权限");private long code;private String message;private ResultCode(long code, String message) {this.code = code;this.message = message;}public long getCode() {return code;}public String getMessage() {return message;}
}

IErrorCode

package com.example.demo.common;/*** 封装API的错误码*/
public interface IErrorCode {long getCode();String getMessage();
}

PageHelperConfig

package com.example.demo.config;import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class PageHelperConfig {@Beanpublic PageHelper createPaeHelper() {PageHelper page = new PageHelper();return page;}
}

CommonPage

package com.example.demo.common;import com.github.pagehelper.PageInfo;
import lombok.Data;
import org.springframework.data.domain.Page;import java.util.List;/*** 分页数据封装类*/
@Data
public class CommonPage<T> {/*** 当前页码*/private Integer pageNum;/*** 每页数量*/private Integer pageSize;/*** 总页数*/private Integer totalPage;/*** 总条数*/private Long total;/*** 分页数据*/private List<T> list;/*** 将PageHelper分页后的list转为分页信息*/public static <T> CommonPage<T> restPage(List<T> list) {CommonPage<T> result = new CommonPage<T>();PageInfo<T> pageInfo = new PageInfo<T>(list);result.setTotalPage(pageInfo.getPages());result.setPageNum(pageInfo.getPageNum());result.setPageSize(pageInfo.getPageSize());result.setTotal(pageInfo.getTotal());result.setList(pageInfo.getList());return result;}/*** 将SpringData分页后的list转为分页信息*/public static <T> CommonPage<T> restPage(Page<T> pageInfo) {CommonPage<T> result = new CommonPage<T>();result.setTotalPage(pageInfo.getTotalPages());result.setPageNum(pageInfo.getNumber());result.setPageSize(pageInfo.getSize());result.setTotal(pageInfo.getTotalElements());result.setList(pageInfo.getContent());return result;}
}

LoginController

/*********************************************** Copyright (C) 2019 IBM All rights reserved.********** K*I*N*G ********** B*A*C*K *******/
package com.example.demo.controller;
/*** @author Moses ** @Date 2020/9/22 12:00*/import com.example.demo.common.Result;
import com.example.demo.entity.User;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestControllerLoginController
public class  {@Autowiredprivate IUserService userService;@PostMapping("/login")public Result login(@RequestBody User user) {User u = userService.findUser(user);return Result.success(u != null);}
}

UserController

/*********************************************** Copyright (C) 2019 IBM All rights reserved.********** K*I*N*G ********** B*A*C*K *******/
package com.example.demo.controller;
/*** @author Moses ** @Date 2020/9/22 12:00*/import com.example.demo.common.CommonPage;
import com.example.demo.common.Result;
import com.example.demo.entity.User;
import com.example.demo.service.IUserService;
import com.github.pagehelper.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping(value = "/user")
public class UserController {@Autowiredprivate IUserService userService;@GetMapping("/detail/{id}")public Result detail(@PathVariable(name = "id") Integer id) {User user = userService.detail(id);return Result.success(user);}@GetMapping("/list")public Result list(@RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {Page page = userService.list(pageNum, pageSize);return Result.success(CommonPage.restPage(page));}@PostMapping("/update")public Result update(@RequestBody User user) {int num = userService.update(user);return Result.success(num);}
}

IUserService

package com.example.demo.service;import com.example.demo.entity.User;
import com.github.pagehelper.Page;public interface IUserService {User detail(Integer id);Page list(Integer pageNum, Integer pageSize);User findUser(User user);int update(User user);
}
UserServiceImpl
@Service("userService")
public class UserServiceImpl implements IUserService {@Resourceprivate UserMapper userMapper;@Overridepublic List<User> list(Map<String, Object> params) {return userMapper.list(params);}@Overridepublic User findUser(User user) {return userMapper.findUser(user);}
}

DemoApplication

package com.example.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

UserMapper添加

    List<User> list(Map<String, Object> params);User findUser(User user);

UserMapper.xml添加

<select id="findUser" resultType="com.example.demo.entity.User">select<include refid="Base_Column_List"/>from userwhere username = #{username,jdbcType=VARCHAR}and password = #{password,jdbcType=VARCHAR}</select><select id="list" resultType="com.example.demo.entity.User">select<include refid="Base_Column_List"/>from user</select>

启动

localhost:8888/user/detail/1

创建vue项目

安装node

安装vue

npm install --global vue-cli

npm install -g webpack

vue init webpack vue

安装淘宝npm

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装element-ui

cnpm install element-ui --save

main.js,引入element-ui依赖

import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(Element)

安装axios

cnpm install axios --save

main.js中全局引入axios

import axios from 'axios'
Vue.prototype.$axios = axios //

配置自动格式化和代码纠正

{"editor.formatOnSave": true,"editor.codeActionsOnSave": {"source.fixAll.eslint": true},"eslint.format.enable": true,"[vue]": {"editor.defaultFormatter": "dbaeumer.vscode-eslint"},"[javascript]": {"editor.defaultFormatter": "dbaeumer.vscode-eslint"},"[jsonc]": {"editor.defaultFormatter": "vscode.json-language-features"}
}

config跨域配置

index.js添加

proxyTable: {'/api': {target: 'http://127.0.0.1:8888',changeOrigin: true,pathRewrite: {'^/api': ''}}},

dev.env.js添加

BASE_API: '"/api/"',

main.js

axios.defaults.baseURL = '/api'

也可以采用后端跨域配置

前端配置axios.defaults.baseURL = 'http://localhost:8888'后端接口方法添加@CrossOrigin

Login.vue

<template><div><el-card class="login-form-layout"><el-form:model="user"status-icon:rules="rules"ref="user"label-width="80px"class="demo-user"><el-form-item label="用户名" prop="username"><el-input type="text" maxlength="12" v-model="user.username"></el-input></el-form-item><el-form-item label="密 码" prop="password"><el-input type="password" v-model="user.password" autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('user')">登录</el-button><el-button @click="resetForm('user')">重置</el-button></el-form-item></el-form></el-card></div>
</template>
<script>
export default {name: 'Login',data () {var validatePass = (rule, value, callback) => {if (value === '') {callback(new Error('请输入密码'))} else {callback()}}return {user: {password: '123456',username: 'admin'},rules: {password: [{ validator: validatePass, trigger: 'blur' }],username: [{ required: true, message: '请输入用户名', trigger: 'blur' },{min: 3,max: 12,message: '长度在 3 到 12 个字符',trigger: 'blur'}]}}},methods: {submitForm (formName) {const _this = thisthis.$refs[formName].validate((valid) => {if (valid) {this.$axios.post('/login', this.user).then((res) => {if (res.data.data) {_this.$router.push('/user')} else {this.$notify({title: '登录失败:',message: '用户名或密码错误',duration: 1500})}})} else {console.log('error submit!!')return false}})},resetForm (formName) {this.$refs[formName].resetFields()}}
}
</script>
<style scoped>
.login-form-layout {position: absolute;left: 0;right: 0;width: 360px;margin: 140px auto;border-top: 10px solid #409eff;
}
</style>

UserIndex.vue

<template><el-container style="height: 500px; border: 1px solid #eee"><el-aside width="200px" style="background-color: rgb(238, 241, 246)"><el-menu :default-openeds="['1', '2']"><el-submenu index="1"><template slot="title"><i class="el-icon-message"></i>用户管理</template><router-link :to="'/user'"><el-menu-item index="1-1">用户列表</el-menu-item></router-link></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-menu"></i>系统管理</template></el-submenu></el-menu></el-aside><el-container><el-header style="text-align: right; font-size: 12px"><el-dropdown><i class="el-icon-setting" style="margin-right: 15px"></i><el-dropdown-menu slot="dropdown"><el-dropdown-item>查看</el-dropdown-item><el-dropdown-item>新增</el-dropdown-item><el-dropdown-item>删除</el-dropdown-item></el-dropdown-menu></el-dropdown><span>王小虎</span></el-header><el-main><el-table :data="tableData"><el-table-column prop="createDate" label="日期" width="140"></el-table-column><el-table-column prop="name" label="姓名" width="120"></el-table-column><el-table-column prop="address" label="地址"></el-table-column><el-table-column fixed="right" label="操作" width="100"><template slot-scope="scope"><el-button @click="handleClick(e, scope)" type="text" size="small">查看</el-button><el-button @click="handleClick(e, scope)" type="text" size="small">编辑</el-button></template></el-table-column></el-table><el-pagination class="mpage"backgroundlayout="prev, pager, next":current-page=pageNum:page-size=pageSize@current-change=page:total="total"></el-pagination></el-main></el-container></el-container>
</template>
<style>
.el-header {background-color: #b3c0d1;color: #333;line-height: 60px;
}
.el-aside {color: #333;
}
</style>
<script>
export default {name: 'UserIndex',data () {return {tableData: [],pageNum: 1,total: 0,pageSize: 5}},mounted () {this.page(1)},methods: {page (pageNum) {const _this = thisthis.$axios.get('/user/list?pageNum=' + pageNum).then((res) => {_this.tableData = res.data.data.list_this.pageNum = res.data.data.pageNum_this.total = res.data.data.total_this.pageSize = res.data.data.pageSize})},handleClick (e, scope) {this.$router.push({ path: '/userDetail', query: { id: scope.row.id } })}}
}
</script>

UserDetail.vue

<template><el-container style="height: 500px; border: 1px solid #eee"><el-aside width="200px" style="background-color: rgb(238, 241, 246)"><el-menu :default-openeds="['1', '2']"><el-submenu index="1"><template slot="title"><i class="el-icon-message"></i>用户管理</template><router-link :to="'/user'"><el-menu-item index="1-1">用户列表</el-menu-item></router-link></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-menu"></i>系统管理</template></el-submenu></el-menu></el-aside><el-container><el-header style="text-align: right; font-size: 12px"><el-dropdown><i class="el-icon-setting" style="margin-right: 15px"></i><el-dropdown-menu slot="dropdown"><el-dropdown-item>查看</el-dropdown-item><el-dropdown-item>新增</el-dropdown-item><el-dropdown-item>删除</el-dropdown-item></el-dropdown-menu></el-dropdown><span>王小虎</span></el-header><el-main><el-form:model="user"status-icon:rules="rules"ref="user"label-width="100px"class="demo-user"><el-form-item label="名称"><el-input v-model="user.name"></el-input></el-form-item><el-form-item label="账号"><el-input v-model="user.username"></el-input></el-form-item><el-form-item label="地址"><el-input v-model="user.address"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('user')">提交</el-button><el-button @click="resetForm('user')">重置</el-button></el-form-item></el-form></el-main></el-container></el-container>
</template>
<style>
.el-header {background-color: #b3c0d1;color: #333;line-height: 60px;
}
.el-aside {color: #333;
}
</style>
<script>
export default {name: 'UserDetail',data () {return {user: {id: '',name: '',username: '',email: '',address: ''}}},methods: {getUser () {const userId = this.$route.query.idconst _this = thisthis.$axios.get('/user/detail/' + userId).then((res) => {_this.user = res.data.data})},submitForm (formName) {const _this = thisthis.$axios.post('/user/update', _this.user).then((res) => {if (res.data.code === 200) {_this.$alert('操作成功', '提示', {confirmButtonText: '确定',callback: action => {_this.$router.push('/user')}})}})},resetForm (formName) {this.$refs[formName].resetFields()}},created () {this.getUser()}
}
</script>

router配置

index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Login from '@/view/Login'
import UserIndex from '@/view/UserIndex'
import UserDetail from '@/view/UserDetail'
Vue.use(Router)export default new Router({routes: [{path: '/',name: 'HelloWorld',component: HelloWorld},{path: '/login',name: 'Login',component: Login},{path: '/user',name: 'UserIndex',component: UserIndex},{path: '/userDetail',name: 'UserDetail',component: UserDetail}]
})

启动

http://localhost:8080/#/login

登录跳转

点击查看

整合SpringSecurity和JWT实现认证和授权

添加表

/*
Navicat MySQL Data TransferSource Server         : mysql
Source Server Version : 80011
Source Host           : localhost:3306
Source Database       : demoTarget Server Type    : MYSQL
Target Server Version : 80011
File Encoding         : 65001Date: 2020-09-29 20:29:40
*/SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for ums_admin
-- ----------------------------
DROP TABLE IF EXISTS `ums_admin`;
CREATE TABLE `ums_admin` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(64) DEFAULT NULL,`password` varchar(64) DEFAULT NULL,`icon` varchar(500) DEFAULT NULL COMMENT '头像',`email` varchar(100) DEFAULT NULL COMMENT '邮箱',`nick_name` varchar(200) DEFAULT NULL COMMENT '昵称',`note` varchar(500) DEFAULT NULL COMMENT '备注信息',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`login_time` datetime DEFAULT NULL COMMENT '最后登录时间',`status` int(1) DEFAULT '1' COMMENT '帐号启用状态:0->禁用;1->启用',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='后台用户表';-- ----------------------------
-- Records of ums_admin
-- ----------------------------
INSERT INTO `ums_admin` VALUES ('1', 'test', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/images/20180607/timg.jpg', 'test@qq.com', '测试账号', null, '2018-09-29 13:55:30', '2018-09-29 13:55:39', '1');
INSERT INTO `ums_admin` VALUES ('3', 'admin', '$2a$10$LdFyu7TrGO4a94BWgBTJSu.Kg5reKxoSXHJi5YOFp1W/Q7E1UqtQ2', 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/images/20180607/timg.jpg', 'admin@163.com', '系统管理员', '系统管理员', '2018-10-08 13:32:47', '2019-04-20 12:45:16', '1');
INSERT INTO `ums_admin` VALUES ('4', 'macro', '$2a$10$Bx4jZPR7GhEpIQfefDQtVeS58GfT5n6mxs/b4nLLK65eMFa16topa', 'string', 'macro@qq.com', 'macro', 'macro专用', '2019-10-06 15:53:51', '2020-02-03 14:55:55', '1');
INSERT INTO `ums_admin` VALUES ('6', 'productAdmin', '$2a$10$6/.J.p.6Bhn7ic4GfoB5D.pGd7xSiD1a9M6ht6yO0fxzlKJPjRAGm', null, 'product@qq.com', '商品管理员', '只有商品权限', '2020-02-07 16:15:08', null, '1');
INSERT INTO `ums_admin` VALUES ('7', 'orderAdmin', '$2a$10$UqEhA9UZXjHHA3B.L9wNG.6aerrBjC6WHTtbv1FdvYPUI.7lkL6E.', null, 'order@qq.com', '订单管理员', '只有订单管理权限', '2020-02-07 16:15:50', null, '1');-- ----------------------------
-- Table structure for ums_admin_login_log
-- ----------------------------
DROP TABLE IF EXISTS `ums_admin_login_log`;
CREATE TABLE `ums_admin_login_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`admin_id` bigint(20) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`ip` varchar(64) DEFAULT NULL,`address` varchar(100) DEFAULT NULL,`user_agent` varchar(100) DEFAULT NULL COMMENT '浏览器登录类型',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=204 DEFAULT CHARSET=utf8 COMMENT='后台用户登录日志表';-- ----------------------------
-- Records of ums_admin_login_log
-- ------------------------------ ----------------------------
-- Table structure for ums_admin_permission_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_admin_permission_relation`;
CREATE TABLE `ums_admin_permission_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`admin_id` bigint(20) DEFAULT NULL,`permission_id` bigint(20) DEFAULT NULL,`type` int(1) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='后台用户和权限关系表(除角色中定义的权限以外的加减权限)';-- ----------------------------
-- Records of ums_admin_permission_relation
-- ------------------------------ ----------------------------
-- Table structure for ums_admin_role_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_admin_role_relation`;
CREATE TABLE `ums_admin_role_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`admin_id` bigint(20) DEFAULT NULL,`role_id` bigint(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COMMENT='后台用户和角色关系表';-- ----------------------------
-- Records of ums_admin_role_relation
-- ----------------------------
INSERT INTO `ums_admin_role_relation` VALUES ('26', '3', '5');
INSERT INTO `ums_admin_role_relation` VALUES ('27', '6', '1');
INSERT INTO `ums_admin_role_relation` VALUES ('28', '7', '2');
INSERT INTO `ums_admin_role_relation` VALUES ('29', '1', '5');
INSERT INTO `ums_admin_role_relation` VALUES ('30', '4', '5');-- ----------------------------
-- Table structure for ums_growth_change_history
-- ----------------------------
DROP TABLE IF EXISTS `ums_growth_change_history`;
CREATE TABLE `ums_growth_change_history` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`change_type` int(1) DEFAULT NULL COMMENT '改变类型:0->增加;1->减少',`change_count` int(11) DEFAULT NULL COMMENT '积分改变数量',`operate_man` varchar(100) DEFAULT NULL COMMENT '操作人员',`operate_note` varchar(200) DEFAULT NULL COMMENT '操作备注',`source_type` int(1) DEFAULT NULL COMMENT '积分来源:0->购物;1->管理员修改',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='成长值变化历史记录表';-- ----------------------------
-- Records of ums_growth_change_history
-- ----------------------------
INSERT INTO `ums_growth_change_history` VALUES ('1', '1', '2018-08-29 17:16:35', '0', '1000', 'test', '测试使用', '1');-- ----------------------------
-- Table structure for ums_integration_change_history
-- ----------------------------
DROP TABLE IF EXISTS `ums_integration_change_history`;
CREATE TABLE `ums_integration_change_history` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`change_type` int(1) DEFAULT NULL COMMENT '改变类型:0->增加;1->减少',`change_count` int(11) DEFAULT NULL COMMENT '积分改变数量',`operate_man` varchar(100) DEFAULT NULL COMMENT '操作人员',`operate_note` varchar(200) DEFAULT NULL COMMENT '操作备注',`source_type` int(1) DEFAULT NULL COMMENT '积分来源:0->购物;1->管理员修改',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='积分变化历史记录表';-- ----------------------------
-- Records of ums_integration_change_history
-- ------------------------------ ----------------------------
-- Table structure for ums_integration_consume_setting
-- ----------------------------
DROP TABLE IF EXISTS `ums_integration_consume_setting`;
CREATE TABLE `ums_integration_consume_setting` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`deduction_per_amount` int(11) DEFAULT NULL COMMENT '每一元需要抵扣的积分数量',`max_percent_per_order` int(11) DEFAULT NULL COMMENT '每笔订单最高抵用百分比',`use_unit` int(11) DEFAULT NULL COMMENT '每次使用积分最小单位100',`coupon_status` int(1) DEFAULT NULL COMMENT '是否可以和优惠券同用;0->不可以;1->可以',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='积分消费设置';-- ----------------------------
-- Records of ums_integration_consume_setting
-- ----------------------------
INSERT INTO `ums_integration_consume_setting` VALUES ('1', '100', '50', '100', '1');-- ----------------------------
-- Table structure for ums_member
-- ----------------------------
DROP TABLE IF EXISTS `ums_member`;
CREATE TABLE `ums_member` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_level_id` bigint(20) DEFAULT NULL,`username` varchar(64) DEFAULT NULL COMMENT '用户名',`password` varchar(64) DEFAULT NULL COMMENT '密码',`nickname` varchar(64) DEFAULT NULL COMMENT '昵称',`phone` varchar(64) DEFAULT NULL COMMENT '手机号码',`status` int(1) DEFAULT NULL COMMENT '帐号启用状态:0->禁用;1->启用',`create_time` datetime DEFAULT NULL COMMENT '注册时间',`icon` varchar(500) DEFAULT NULL COMMENT '头像',`gender` int(1) DEFAULT NULL COMMENT '性别:0->未知;1->男;2->女',`birthday` date DEFAULT NULL COMMENT '生日',`city` varchar(64) DEFAULT NULL COMMENT '所做城市',`job` varchar(100) DEFAULT NULL COMMENT '职业',`personalized_signature` varchar(200) DEFAULT NULL COMMENT '个性签名',`source_type` int(1) DEFAULT NULL COMMENT '用户来源',`integration` int(11) DEFAULT NULL COMMENT '积分',`growth` int(11) DEFAULT NULL COMMENT '成长值',`luckey_count` int(11) DEFAULT NULL COMMENT '剩余抽奖次数',`history_integration` int(11) DEFAULT NULL COMMENT '历史积分数量',PRIMARY KEY (`id`),UNIQUE KEY `idx_username` (`username`),UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='会员表';-- ----------------------------
-- Records of ums_member
-- ----------------------------
INSERT INTO `ums_member` VALUES ('1', '4', 'test', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'windir', '18061581849', '1', '2018-08-02 10:35:44', null, '1', '2009-06-01', '上海', '学生', 'test', null, '5000', null, null, null);
INSERT INTO `ums_member` VALUES ('3', '4', 'windy', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'windy', '18061581848', '1', '2018-08-03 16:46:38', null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `ums_member` VALUES ('4', '4', 'zhengsan', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'zhengsan', '18061581847', '1', '2018-11-12 14:12:04', null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `ums_member` VALUES ('5', '4', 'lisi', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'lisi', '18061581841', '1', '2018-11-12 14:12:38', null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `ums_member` VALUES ('6', '4', 'wangwu', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'wangwu', '18061581842', '1', '2018-11-12 14:13:09', null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `ums_member` VALUES ('7', '4', 'lion', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'lion', '18061581845', '1', '2018-11-12 14:21:39', null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `ums_member` VALUES ('8', '4', 'shari', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'shari', '18061581844', '1', '2018-11-12 14:22:00', null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `ums_member` VALUES ('9', '4', 'aewen', '$2a$10$NZ5o7r2E.ayT2ZoxgjlI.eJ6OEYqjH7INR/F.mXDbjZJi9HF0YCVG', 'aewen', '18061581843', '1', '2018-11-12 14:22:55', null, null, null, null, null, null, null, null, null, null, null);-- ----------------------------
-- Table structure for ums_member_level
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_level`;
CREATE TABLE `ums_member_level` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`growth_point` int(11) DEFAULT NULL,`default_status` int(1) DEFAULT NULL COMMENT '是否为默认等级:0->不是;1->是',`free_freight_point` decimal(10,2) DEFAULT NULL COMMENT '免运费标准',`comment_growth_point` int(11) DEFAULT NULL COMMENT '每次评价获取的成长值',`priviledge_free_freight` int(1) DEFAULT NULL COMMENT '是否有免邮特权',`priviledge_sign_in` int(1) DEFAULT NULL COMMENT '是否有签到特权',`priviledge_comment` int(1) DEFAULT NULL COMMENT '是否有评论获奖励特权',`priviledge_promotion` int(1) DEFAULT NULL COMMENT '是否有专享活动特权',`priviledge_member_price` int(1) DEFAULT NULL COMMENT '是否有会员价格特权',`priviledge_birthday` int(1) DEFAULT NULL COMMENT '是否有生日特权',`note` varchar(200) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='会员等级表';-- ----------------------------
-- Records of ums_member_level
-- ----------------------------
INSERT INTO `ums_member_level` VALUES ('1', '黄金会员', '1000', '0', '199.00', '5', '1', '1', '1', '1', '1', '1', null);
INSERT INTO `ums_member_level` VALUES ('2', '白金会员', '5000', '0', '99.00', '10', '1', '1', '1', '1', '1', '1', null);
INSERT INTO `ums_member_level` VALUES ('3', '钻石会员', '15000', '0', '69.00', '15', '1', '1', '1', '1', '1', '1', null);
INSERT INTO `ums_member_level` VALUES ('4', '普通会员', '1', '1', '199.00', '20', '1', '1', '1', '1', '0', '0', null);-- ----------------------------
-- Table structure for ums_member_login_log
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_login_log`;
CREATE TABLE `ums_member_login_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`ip` varchar(64) DEFAULT NULL,`city` varchar(64) DEFAULT NULL,`login_type` int(1) DEFAULT NULL COMMENT '登录类型:0->PC;1->android;2->ios;3->小程序',`province` varchar(64) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员登录记录';-- ----------------------------
-- Records of ums_member_login_log
-- ------------------------------ ----------------------------
-- Table structure for ums_member_member_tag_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_member_tag_relation`;
CREATE TABLE `ums_member_member_tag_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`tag_id` bigint(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户和标签关系表';-- ----------------------------
-- Records of ums_member_member_tag_relation
-- ------------------------------ ----------------------------
-- Table structure for ums_member_product_category_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_product_category_relation`;
CREATE TABLE `ums_member_product_category_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`product_category_id` bigint(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员与产品分类关系表(用户喜欢的分类)';-- ----------------------------
-- Records of ums_member_product_category_relation
-- ------------------------------ ----------------------------
-- Table structure for ums_member_receive_address
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_receive_address`;
CREATE TABLE `ums_member_receive_address` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`name` varchar(100) DEFAULT NULL COMMENT '收货人名称',`phone_number` varchar(64) DEFAULT NULL,`default_status` int(1) DEFAULT NULL COMMENT '是否为默认',`post_code` varchar(100) DEFAULT NULL COMMENT '邮政编码',`province` varchar(100) DEFAULT NULL COMMENT '省份/直辖市',`city` varchar(100) DEFAULT NULL COMMENT '城市',`region` varchar(100) DEFAULT NULL COMMENT '区',`detail_address` varchar(128) DEFAULT NULL COMMENT '详细地址(街道)',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='会员收货地址表';-- ----------------------------
-- Records of ums_member_receive_address
-- ----------------------------
INSERT INTO `ums_member_receive_address` VALUES ('1', '1', '大梨', '18033441849', '0', '518000', '广东省', '深圳市', '南山区', '科兴科学园');
INSERT INTO `ums_member_receive_address` VALUES ('3', '1', '大梨', '18033441849', '0', '518000', '广东省', '深圳市', '福田区', '清水河街道');
INSERT INTO `ums_member_receive_address` VALUES ('4', '1', '大梨', '18033441849', '1', '518000', '广东省', '深圳市', '福田区', '东晓街道');-- ----------------------------
-- Table structure for ums_member_rule_setting
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_rule_setting`;
CREATE TABLE `ums_member_rule_setting` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`continue_sign_day` int(11) DEFAULT NULL COMMENT '连续签到天数',`continue_sign_point` int(11) DEFAULT NULL COMMENT '连续签到赠送数量',`consume_per_point` decimal(10,2) DEFAULT NULL COMMENT '每消费多少元获取1个点',`low_order_amount` decimal(10,2) DEFAULT NULL COMMENT '最低获取点数的订单金额',`max_point_per_order` int(11) DEFAULT NULL COMMENT '每笔订单最高获取点数',`type` int(1) DEFAULT NULL COMMENT '类型:0->积分规则;1->成长值规则',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员积分成长规则表';-- ----------------------------
-- Records of ums_member_rule_setting
-- ------------------------------ ----------------------------
-- Table structure for ums_member_statistics_info
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_statistics_info`;
CREATE TABLE `ums_member_statistics_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`member_id` bigint(20) DEFAULT NULL,`consume_amount` decimal(10,2) DEFAULT NULL COMMENT '累计消费金额',`order_count` int(11) DEFAULT NULL COMMENT '订单数量',`coupon_count` int(11) DEFAULT NULL COMMENT '优惠券数量',`comment_count` int(11) DEFAULT NULL COMMENT '评价数',`return_order_count` int(11) DEFAULT NULL COMMENT '退货数量',`login_count` int(11) DEFAULT NULL COMMENT '登录次数',`attend_count` int(11) DEFAULT NULL COMMENT '关注数量',`fans_count` int(11) DEFAULT NULL COMMENT '粉丝数量',`collect_product_count` int(11) DEFAULT NULL,`collect_subject_count` int(11) DEFAULT NULL,`collect_topic_count` int(11) DEFAULT NULL,`collect_comment_count` int(11) DEFAULT NULL,`invite_friend_count` int(11) DEFAULT NULL,`recent_order_time` datetime DEFAULT NULL COMMENT '最后一次下订单时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员统计信息';-- ----------------------------
-- Records of ums_member_statistics_info
-- ------------------------------ ----------------------------
-- Table structure for ums_member_tag
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_tag`;
CREATE TABLE `ums_member_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`finish_order_count` int(11) DEFAULT NULL COMMENT '自动打标签完成订单数量',`finish_order_amount` decimal(10,2) DEFAULT NULL COMMENT '自动打标签完成订单金额',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户标签表';-- ----------------------------
-- Records of ums_member_tag
-- ------------------------------ ----------------------------
-- Table structure for ums_member_task
-- ----------------------------
DROP TABLE IF EXISTS `ums_member_task`;
CREATE TABLE `ums_member_task` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL,`growth` int(11) DEFAULT NULL COMMENT '赠送成长值',`intergration` int(11) DEFAULT NULL COMMENT '赠送积分',`type` int(1) DEFAULT NULL COMMENT '任务类型:0->新手任务;1->日常任务',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员任务表';-- ----------------------------
-- Records of ums_member_task
-- ------------------------------ ----------------------------
-- Table structure for ums_menu
-- ----------------------------
DROP TABLE IF EXISTS `ums_menu`;
CREATE TABLE `ums_menu` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`parent_id` bigint(20) DEFAULT NULL COMMENT '父级ID',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`title` varchar(100) DEFAULT NULL COMMENT '菜单名称',`level` int(4) DEFAULT NULL COMMENT '菜单级数',`sort` int(4) DEFAULT NULL COMMENT '菜单排序',`name` varchar(100) DEFAULT NULL COMMENT '前端名称',`icon` varchar(200) DEFAULT NULL COMMENT '前端图标',`hidden` int(1) DEFAULT NULL COMMENT '前端隐藏',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COMMENT='后台菜单表';-- ----------------------------
-- Records of ums_menu
-- ----------------------------
INSERT INTO `ums_menu` VALUES ('1', '0', '2020-02-02 14:50:36', '商品', '0', '0', 'pms', 'product', '0');
INSERT INTO `ums_menu` VALUES ('2', '1', '2020-02-02 14:51:50', '商品列表', '1', '0', 'product', 'product-list', '0');
INSERT INTO `ums_menu` VALUES ('3', '1', '2020-02-02 14:52:44', '添加商品', '1', '0', 'addProduct', 'product-add', '0');
INSERT INTO `ums_menu` VALUES ('4', '1', '2020-02-02 14:53:51', '商品分类', '1', '0', 'productCate', 'product-cate', '0');
INSERT INTO `ums_menu` VALUES ('5', '1', '2020-02-02 14:54:51', '商品类型', '1', '0', 'productAttr', 'product-attr', '0');
INSERT INTO `ums_menu` VALUES ('6', '1', '2020-02-02 14:56:29', '品牌管理', '1', '0', 'brand', 'product-brand', '0');
INSERT INTO `ums_menu` VALUES ('7', '0', '2020-02-02 16:54:07', '订单', '0', '0', 'oms', 'order', '0');
INSERT INTO `ums_menu` VALUES ('8', '7', '2020-02-02 16:55:18', '订单列表', '1', '0', 'order', 'product-list', '0');
INSERT INTO `ums_menu` VALUES ('9', '7', '2020-02-02 16:56:46', '订单设置', '1', '0', 'orderSetting', 'order-setting', '0');
INSERT INTO `ums_menu` VALUES ('10', '7', '2020-02-02 16:57:39', '退货申请处理', '1', '0', 'returnApply', 'order-return', '0');
INSERT INTO `ums_menu` VALUES ('11', '7', '2020-02-02 16:59:40', '退货原因设置', '1', '0', 'returnReason', 'order-return-reason', '0');
INSERT INTO `ums_menu` VALUES ('12', '0', '2020-02-04 16:18:00', '营销', '0', '0', 'sms', 'sms', '0');
INSERT INTO `ums_menu` VALUES ('13', '12', '2020-02-04 16:19:22', '秒杀活动列表', '1', '0', 'flash', 'sms-flash', '0');
INSERT INTO `ums_menu` VALUES ('14', '12', '2020-02-04 16:20:16', '优惠券列表', '1', '0', 'coupon', 'sms-coupon', '0');
INSERT INTO `ums_menu` VALUES ('16', '12', '2020-02-07 16:22:38', '品牌推荐', '1', '0', 'homeBrand', 'product-brand', '0');
INSERT INTO `ums_menu` VALUES ('17', '12', '2020-02-07 16:23:14', '新品推荐', '1', '0', 'homeNew', 'sms-new', '0');
INSERT INTO `ums_menu` VALUES ('18', '12', '2020-02-07 16:26:38', '人气推荐', '1', '0', 'homeHot', 'sms-hot', '0');
INSERT INTO `ums_menu` VALUES ('19', '12', '2020-02-07 16:28:16', '专题推荐', '1', '0', 'homeSubject', 'sms-subject', '0');
INSERT INTO `ums_menu` VALUES ('20', '12', '2020-02-07 16:28:42', '广告列表', '1', '0', 'homeAdvertise', 'sms-ad', '0');
INSERT INTO `ums_menu` VALUES ('21', '0', '2020-02-07 16:29:13', '权限', '0', '0', 'ums', 'ums', '0');
INSERT INTO `ums_menu` VALUES ('22', '21', '2020-02-07 16:29:51', '用户列表', '1', '0', 'admin', 'ums-admin', '0');
INSERT INTO `ums_menu` VALUES ('23', '21', '2020-02-07 16:30:13', '角色列表', '1', '0', 'role', 'ums-role', '0');
INSERT INTO `ums_menu` VALUES ('24', '21', '2020-02-07 16:30:53', '菜单列表', '1', '0', 'menu', 'ums-menu', '0');
INSERT INTO `ums_menu` VALUES ('25', '21', '2020-02-07 16:31:13', '资源列表', '1', '0', 'resource', 'ums-resource', '0');-- ----------------------------
-- Table structure for ums_permission
-- ----------------------------
DROP TABLE IF EXISTS `ums_permission`;
CREATE TABLE `ums_permission` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`pid` bigint(20) DEFAULT NULL COMMENT '父级权限id',`name` varchar(100) DEFAULT NULL COMMENT '名称',`value` varchar(200) DEFAULT NULL COMMENT '权限值',`icon` varchar(500) DEFAULT NULL COMMENT '图标',`type` int(1) DEFAULT NULL COMMENT '权限类型:0->目录;1->菜单;2->按钮(接口绑定权限)',`uri` varchar(200) DEFAULT NULL COMMENT '前端资源路径',`status` int(1) DEFAULT NULL COMMENT '启用状态;0->禁用;1->启用',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`sort` int(11) DEFAULT NULL COMMENT '排序',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='后台用户权限表';-- ----------------------------
-- Records of ums_permission
-- ----------------------------
INSERT INTO `ums_permission` VALUES ('1', '0', '商品', null, null, '0', null, '1', '2018-09-29 16:15:14', '0');
INSERT INTO `ums_permission` VALUES ('2', '1', '商品列表', 'pms:product:read', null, '1', '/pms/product/index', '1', '2018-09-29 16:17:01', '0');
INSERT INTO `ums_permission` VALUES ('3', '1', '添加商品', 'pms:product:create', null, '1', '/pms/product/add', '1', '2018-09-29 16:18:51', '0');
INSERT INTO `ums_permission` VALUES ('4', '1', '商品分类', 'pms:productCategory:read', null, '1', '/pms/productCate/index', '1', '2018-09-29 16:23:07', '0');
INSERT INTO `ums_permission` VALUES ('5', '1', '商品类型', 'pms:productAttribute:read', null, '1', '/pms/productAttr/index', '1', '2018-09-29 16:24:43', '0');
INSERT INTO `ums_permission` VALUES ('6', '1', '品牌管理', 'pms:brand:read', null, '1', '/pms/brand/index', '1', '2018-09-29 16:25:45', '0');
INSERT INTO `ums_permission` VALUES ('7', '2', '编辑商品', 'pms:product:update', null, '2', '/pms/product/updateProduct', '1', '2018-09-29 16:34:23', '0');
INSERT INTO `ums_permission` VALUES ('8', '2', '删除商品', 'pms:product:delete', null, '2', '/pms/product/delete', '1', '2018-09-29 16:38:33', '0');
INSERT INTO `ums_permission` VALUES ('9', '4', '添加商品分类', 'pms:productCategory:create', null, '2', '/pms/productCate/create', '1', '2018-09-29 16:43:23', '0');
INSERT INTO `ums_permission` VALUES ('10', '4', '修改商品分类', 'pms:productCategory:update', null, '2', '/pms/productCate/update', '1', '2018-09-29 16:43:55', '0');
INSERT INTO `ums_permission` VALUES ('11', '4', '删除商品分类', 'pms:productCategory:delete', null, '2', '/pms/productAttr/delete', '1', '2018-09-29 16:44:38', '0');
INSERT INTO `ums_permission` VALUES ('12', '5', '添加商品类型', 'pms:productAttribute:create', null, '2', '/pms/productAttr/create', '1', '2018-09-29 16:45:25', '0');
INSERT INTO `ums_permission` VALUES ('13', '5', '修改商品类型', 'pms:productAttribute:update', null, '2', '/pms/productAttr/update', '1', '2018-09-29 16:48:08', '0');
INSERT INTO `ums_permission` VALUES ('14', '5', '删除商品类型', 'pms:productAttribute:delete', null, '2', '/pms/productAttr/delete', '1', '2018-09-29 16:48:44', '0');
INSERT INTO `ums_permission` VALUES ('15', '6', '添加品牌', 'pms:brand:create', null, '2', '/pms/brand/add', '1', '2018-09-29 16:49:34', '0');
INSERT INTO `ums_permission` VALUES ('16', '6', '修改品牌', 'pms:brand:update', null, '2', '/pms/brand/update', '1', '2018-09-29 16:50:55', '0');
INSERT INTO `ums_permission` VALUES ('17', '6', '删除品牌', 'pms:brand:delete', null, '2', '/pms/brand/delete', '1', '2018-09-29 16:50:59', '0');
INSERT INTO `ums_permission` VALUES ('18', '0', '首页', null, null, '0', null, '1', '2018-09-29 16:51:57', '0');-- ----------------------------
-- Table structure for ums_resource
-- ----------------------------
DROP TABLE IF EXISTS `ums_resource`;
CREATE TABLE `ums_resource` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`create_time` datetime DEFAULT NULL COMMENT '创建时间',`name` varchar(200) DEFAULT NULL COMMENT '资源名称',`url` varchar(200) DEFAULT NULL COMMENT '资源URL',`description` varchar(500) DEFAULT NULL COMMENT '描述',`category_id` bigint(20) DEFAULT NULL COMMENT '资源分类ID',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8 COMMENT='后台资源表';-- ----------------------------
-- Records of ums_resource
-- ----------------------------
INSERT INTO `ums_resource` VALUES ('1', '2020-02-04 17:04:55', '商品品牌管理', '/brand/**', null, '1');
INSERT INTO `ums_resource` VALUES ('2', '2020-02-04 17:05:35', '商品属性分类管理', '/productAttribute/**', null, '1');
INSERT INTO `ums_resource` VALUES ('3', '2020-02-04 17:06:13', '商品属性管理', '/productAttribute/**', null, '1');
INSERT INTO `ums_resource` VALUES ('4', '2020-02-04 17:07:15', '商品分类管理', '/productCategory/**', null, '1');
INSERT INTO `ums_resource` VALUES ('5', '2020-02-04 17:09:16', '商品管理', '/product/**', null, '1');
INSERT INTO `ums_resource` VALUES ('6', '2020-02-04 17:09:53', '商品库存管理', '/sku/**', null, '1');
INSERT INTO `ums_resource` VALUES ('8', '2020-02-05 14:43:37', '订单管理', '/order/**', '', '2');
INSERT INTO `ums_resource` VALUES ('9', '2020-02-05 14:44:22', ' 订单退货申请管理', '/returnApply/**', '', '2');
INSERT INTO `ums_resource` VALUES ('10', '2020-02-05 14:45:08', '退货原因管理', '/returnReason/**', '', '2');
INSERT INTO `ums_resource` VALUES ('11', '2020-02-05 14:45:43', '订单设置管理', '/orderSetting/**', '', '2');
INSERT INTO `ums_resource` VALUES ('12', '2020-02-05 14:46:23', '收货地址管理', '/companyAddress/**', '', '2');
INSERT INTO `ums_resource` VALUES ('13', '2020-02-07 16:37:22', '优惠券管理', '/coupon/**', '', '3');
INSERT INTO `ums_resource` VALUES ('14', '2020-02-07 16:37:59', '优惠券领取记录管理', '/couponHistory/**', '', '3');
INSERT INTO `ums_resource` VALUES ('15', '2020-02-07 16:38:28', '限时购活动管理', '/flash/**', '', '3');
INSERT INTO `ums_resource` VALUES ('16', '2020-02-07 16:38:59', '限时购商品关系管理', '/flashProductRelation/**', '', '3');
INSERT INTO `ums_resource` VALUES ('17', '2020-02-07 16:39:22', '限时购场次管理', '/flashSession/**', '', '3');
INSERT INTO `ums_resource` VALUES ('18', '2020-02-07 16:40:07', '首页轮播广告管理', '/home/advertise/**', '', '3');
INSERT INTO `ums_resource` VALUES ('19', '2020-02-07 16:40:34', '首页品牌管理', '/home/brand/**', '', '3');
INSERT INTO `ums_resource` VALUES ('20', '2020-02-07 16:41:06', '首页新品管理', '/home/newProduct/**', '', '3');
INSERT INTO `ums_resource` VALUES ('21', '2020-02-07 16:42:16', '首页人气推荐管理', '/home/recommendProduct/**', '', '3');
INSERT INTO `ums_resource` VALUES ('22', '2020-02-07 16:42:48', '首页专题推荐管理', '/home/recommendSubject/**', '', '3');
INSERT INTO `ums_resource` VALUES ('23', '2020-02-07 16:44:56', ' 商品优选管理', '/prefrenceArea/**', '', '5');
INSERT INTO `ums_resource` VALUES ('24', '2020-02-07 16:45:39', '商品专题管理', '/subject/**', '', '5');
INSERT INTO `ums_resource` VALUES ('25', '2020-02-07 16:47:34', '后台用户管理', '/admin/**', '', '4');
INSERT INTO `ums_resource` VALUES ('26', '2020-02-07 16:48:24', '后台用户角色管理', '/role/**', '', '4');
INSERT INTO `ums_resource` VALUES ('27', '2020-02-07 16:48:48', '后台菜单管理', '/menu/**', '', '4');
INSERT INTO `ums_resource` VALUES ('28', '2020-02-07 16:49:18', '后台资源分类管理', '/resourceCategory/**', '', '4');
INSERT INTO `ums_resource` VALUES ('29', '2020-02-07 16:49:45', '后台资源管理', '/resource/**', '', '4');
INSERT INTO `ums_resource` VALUES ('31', '2020-08-24 13:43:54', '登录后获取用户信息', '/admin/info', '后台用户登录需要配置', '4');
INSERT INTO `ums_resource` VALUES ('32', '2020-08-24 13:44:37', '后台用户登出', '/admin/logout', '后台用户登出需要配置', '4');-- ----------------------------
-- Table structure for ums_resource_category
-- ----------------------------
DROP TABLE IF EXISTS `ums_resource_category`;
CREATE TABLE `ums_resource_category` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`create_time` datetime DEFAULT NULL COMMENT '创建时间',`name` varchar(200) DEFAULT NULL COMMENT '分类名称',`sort` int(4) DEFAULT NULL COMMENT '排序',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='资源分类表';-- ----------------------------
-- Records of ums_resource_category
-- ----------------------------
INSERT INTO `ums_resource_category` VALUES ('1', '2020-02-05 10:21:44', '商品模块', '0');
INSERT INTO `ums_resource_category` VALUES ('2', '2020-02-05 10:22:34', '订单模块', '0');
INSERT INTO `ums_resource_category` VALUES ('3', '2020-02-05 10:22:48', '营销模块', '0');
INSERT INTO `ums_resource_category` VALUES ('4', '2020-02-05 10:23:04', '权限模块', '0');
INSERT INTO `ums_resource_category` VALUES ('5', '2020-02-07 16:34:27', '内容模块', '0');
INSERT INTO `ums_resource_category` VALUES ('6', '2020-02-07 16:35:49', '其他模块', '0');-- ----------------------------
-- Table structure for ums_role
-- ----------------------------
DROP TABLE IF EXISTS `ums_role`;
CREATE TABLE `ums_role` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) DEFAULT NULL COMMENT '名称',`description` varchar(500) DEFAULT NULL COMMENT '描述',`admin_count` int(11) DEFAULT NULL COMMENT '后台用户数量',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`status` int(1) DEFAULT '1' COMMENT '启用状态:0->禁用;1->启用',`sort` int(11) DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='后台用户角色表';-- ----------------------------
-- Records of ums_role
-- ----------------------------
INSERT INTO `ums_role` VALUES ('1', '商品管理员', '只能查看及操作商品', '0', '2020-02-03 16:50:37', '1', '0');
INSERT INTO `ums_role` VALUES ('2', '订单管理员', '只能查看及操作订单', '0', '2018-09-30 15:53:45', '1', '0');
INSERT INTO `ums_role` VALUES ('5', '超级管理员', '拥有所有查看和操作功能', '0', '2020-02-02 15:11:05', '1', '0');-- ----------------------------
-- Table structure for ums_role_menu_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_role_menu_relation`;
CREATE TABLE `ums_role_menu_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',`menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8 COMMENT='后台角色菜单关系表';-- ----------------------------
-- Records of ums_role_menu_relation
-- ----------------------------
INSERT INTO `ums_role_menu_relation` VALUES ('33', '1', '1');
INSERT INTO `ums_role_menu_relation` VALUES ('34', '1', '2');
INSERT INTO `ums_role_menu_relation` VALUES ('35', '1', '3');
INSERT INTO `ums_role_menu_relation` VALUES ('36', '1', '4');
INSERT INTO `ums_role_menu_relation` VALUES ('37', '1', '5');
INSERT INTO `ums_role_menu_relation` VALUES ('38', '1', '6');
INSERT INTO `ums_role_menu_relation` VALUES ('53', '2', '7');
INSERT INTO `ums_role_menu_relation` VALUES ('54', '2', '8');
INSERT INTO `ums_role_menu_relation` VALUES ('55', '2', '9');
INSERT INTO `ums_role_menu_relation` VALUES ('56', '2', '10');
INSERT INTO `ums_role_menu_relation` VALUES ('57', '2', '11');
INSERT INTO `ums_role_menu_relation` VALUES ('72', '5', '1');
INSERT INTO `ums_role_menu_relation` VALUES ('73', '5', '2');
INSERT INTO `ums_role_menu_relation` VALUES ('74', '5', '3');
INSERT INTO `ums_role_menu_relation` VALUES ('75', '5', '4');
INSERT INTO `ums_role_menu_relation` VALUES ('76', '5', '5');
INSERT INTO `ums_role_menu_relation` VALUES ('77', '5', '6');
INSERT INTO `ums_role_menu_relation` VALUES ('78', '5', '7');
INSERT INTO `ums_role_menu_relation` VALUES ('79', '5', '8');
INSERT INTO `ums_role_menu_relation` VALUES ('80', '5', '9');
INSERT INTO `ums_role_menu_relation` VALUES ('81', '5', '10');
INSERT INTO `ums_role_menu_relation` VALUES ('82', '5', '11');
INSERT INTO `ums_role_menu_relation` VALUES ('83', '5', '12');
INSERT INTO `ums_role_menu_relation` VALUES ('84', '5', '13');
INSERT INTO `ums_role_menu_relation` VALUES ('85', '5', '14');
INSERT INTO `ums_role_menu_relation` VALUES ('86', '5', '16');
INSERT INTO `ums_role_menu_relation` VALUES ('87', '5', '17');
INSERT INTO `ums_role_menu_relation` VALUES ('88', '5', '18');
INSERT INTO `ums_role_menu_relation` VALUES ('89', '5', '19');
INSERT INTO `ums_role_menu_relation` VALUES ('90', '5', '20');
INSERT INTO `ums_role_menu_relation` VALUES ('91', '5', '21');
INSERT INTO `ums_role_menu_relation` VALUES ('92', '5', '22');
INSERT INTO `ums_role_menu_relation` VALUES ('93', '5', '23');
INSERT INTO `ums_role_menu_relation` VALUES ('94', '5', '24');
INSERT INTO `ums_role_menu_relation` VALUES ('95', '5', '25');-- ----------------------------
-- Table structure for ums_role_permission_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_role_permission_relation`;
CREATE TABLE `ums_role_permission_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`role_id` bigint(20) DEFAULT NULL,`permission_id` bigint(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COMMENT='后台用户角色和权限关系表';-- ----------------------------
-- Records of ums_role_permission_relation
-- ----------------------------
INSERT INTO `ums_role_permission_relation` VALUES ('1', '1', '1');
INSERT INTO `ums_role_permission_relation` VALUES ('2', '1', '2');
INSERT INTO `ums_role_permission_relation` VALUES ('3', '1', '3');
INSERT INTO `ums_role_permission_relation` VALUES ('4', '1', '7');
INSERT INTO `ums_role_permission_relation` VALUES ('5', '1', '8');
INSERT INTO `ums_role_permission_relation` VALUES ('6', '2', '4');
INSERT INTO `ums_role_permission_relation` VALUES ('7', '2', '9');
INSERT INTO `ums_role_permission_relation` VALUES ('8', '2', '10');
INSERT INTO `ums_role_permission_relation` VALUES ('9', '2', '11');
INSERT INTO `ums_role_permission_relation` VALUES ('10', '3', '5');
INSERT INTO `ums_role_permission_relation` VALUES ('11', '3', '12');
INSERT INTO `ums_role_permission_relation` VALUES ('12', '3', '13');
INSERT INTO `ums_role_permission_relation` VALUES ('13', '3', '14');
INSERT INTO `ums_role_permission_relation` VALUES ('14', '4', '6');
INSERT INTO `ums_role_permission_relation` VALUES ('15', '4', '15');
INSERT INTO `ums_role_permission_relation` VALUES ('16', '4', '16');
INSERT INTO `ums_role_permission_relation` VALUES ('17', '4', '17');-- ----------------------------
-- Table structure for ums_role_resource_relation
-- ----------------------------
DROP TABLE IF EXISTS `ums_role_resource_relation`;
CREATE TABLE `ums_role_resource_relation` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',`resource_id` bigint(20) DEFAULT NULL COMMENT '资源ID',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=225 DEFAULT CHARSET=utf8 COMMENT='后台角色资源关系表';-- ----------------------------
-- Records of ums_role_resource_relation
-- ----------------------------
INSERT INTO `ums_role_resource_relation` VALUES ('178', '5', '1');
INSERT INTO `ums_role_resource_relation` VALUES ('179', '5', '2');
INSERT INTO `ums_role_resource_relation` VALUES ('180', '5', '3');
INSERT INTO `ums_role_resource_relation` VALUES ('181', '5', '4');
INSERT INTO `ums_role_resource_relation` VALUES ('182', '5', '5');
INSERT INTO `ums_role_resource_relation` VALUES ('183', '5', '6');
INSERT INTO `ums_role_resource_relation` VALUES ('184', '5', '8');
INSERT INTO `ums_role_resource_relation` VALUES ('185', '5', '9');
INSERT INTO `ums_role_resource_relation` VALUES ('186', '5', '10');
INSERT INTO `ums_role_resource_relation` VALUES ('187', '5', '11');
INSERT INTO `ums_role_resource_relation` VALUES ('188', '5', '12');
INSERT INTO `ums_role_resource_relation` VALUES ('189', '5', '13');
INSERT INTO `ums_role_resource_relation` VALUES ('190', '5', '14');
INSERT INTO `ums_role_resource_relation` VALUES ('191', '5', '15');
INSERT INTO `ums_role_resource_relation` VALUES ('192', '5', '16');
INSERT INTO `ums_role_resource_relation` VALUES ('193', '5', '17');
INSERT INTO `ums_role_resource_relation` VALUES ('194', '5', '18');
INSERT INTO `ums_role_resource_relation` VALUES ('195', '5', '19');
INSERT INTO `ums_role_resource_relation` VALUES ('196', '5', '20');
INSERT INTO `ums_role_resource_relation` VALUES ('197', '5', '21');
INSERT INTO `ums_role_resource_relation` VALUES ('198', '5', '22');
INSERT INTO `ums_role_resource_relation` VALUES ('199', '5', '23');
INSERT INTO `ums_role_resource_relation` VALUES ('200', '5', '24');
INSERT INTO `ums_role_resource_relation` VALUES ('201', '5', '25');
INSERT INTO `ums_role_resource_relation` VALUES ('202', '5', '26');
INSERT INTO `ums_role_resource_relation` VALUES ('203', '5', '27');
INSERT INTO `ums_role_resource_relation` VALUES ('204', '5', '28');
INSERT INTO `ums_role_resource_relation` VALUES ('205', '5', '29');
INSERT INTO `ums_role_resource_relation` VALUES ('206', '5', '31');
INSERT INTO `ums_role_resource_relation` VALUES ('207', '5', '32');
INSERT INTO `ums_role_resource_relation` VALUES ('208', '2', '8');
INSERT INTO `ums_role_resource_relation` VALUES ('209', '2', '9');
INSERT INTO `ums_role_resource_relation` VALUES ('210', '2', '10');
INSERT INTO `ums_role_resource_relation` VALUES ('211', '2', '11');
INSERT INTO `ums_role_resource_relation` VALUES ('212', '2', '12');
INSERT INTO `ums_role_resource_relation` VALUES ('213', '2', '31');
INSERT INTO `ums_role_resource_relation` VALUES ('214', '2', '32');
INSERT INTO `ums_role_resource_relation` VALUES ('215', '1', '1');
INSERT INTO `ums_role_resource_relation` VALUES ('216', '1', '2');
INSERT INTO `ums_role_resource_relation` VALUES ('217', '1', '3');
INSERT INTO `ums_role_resource_relation` VALUES ('218', '1', '4');
INSERT INTO `ums_role_resource_relation` VALUES ('219', '1', '5');
INSERT INTO `ums_role_resource_relation` VALUES ('220', '1', '6');
INSERT INTO `ums_role_resource_relation` VALUES ('221', '1', '23');
INSERT INTO `ums_role_resource_relation` VALUES ('222', '1', '24');
INSERT INTO `ums_role_resource_relation` VALUES ('223', '1', '31');
INSERT INTO `ums_role_resource_relation` VALUES ('224', '1', '32');-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`email` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`username` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`password` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`createDate` timestamp NULL DEFAULT NULL,`address` varchar(255) DEFAULT NULL,`status` tinyint(4) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王者归来', '287664409@qq.com', 'admin', '123456', '2020-09-21 00:00:00', '北京市通州区商通大道1号', '0');
INSERT INTO `user` VALUES ('2', '小罗', '', 'tiger', '123456', '2020-09-22 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('3', '福山润', '', 'tiger', '123456', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('4', '莲花池', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('5', '乔峰', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('6', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('7', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('8', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('9', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('10', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('11', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');
INSERT INTO `user` VALUES ('12', '王小虎', null, 'tiger', 'e10adc3949ba59abbe56e057f20f883e', '2020-09-23 00:00:00', '上海市普陀区金沙江路 1518', '0');

ums_admin:后台用户表
ums_role:后台用户角色表
ums_permission:后台用户权限表
ums_admin_role_relation:后台用户和角色关系表,用户与角色是多对多关系
ums_role_permission_relation:后台用户角色和权限关系表,角色与权限是多对多关系
ums_admin_permission_relation:后台用户和权限关系表(除角色中定义的权限以外的加减权限),加权限是指用户比角色多出的权限,减权限是指用户比角色少的权限

添加依赖

<!--SpringSecurity依赖配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!--Hutool Java工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.4.3</version></dependency><!--JWT(Json Web Token)登录支持--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

JwtTokenUtil

package com.example.demo.util;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** JwtToken生成的工具类* Created by macro on 2018/4/26.*/
@Component
public class JwtTokenUtil {private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class);private static final String CLAIM_KEY_USERNAME = "sub";private static final String CLAIM_KEY_CREATED = "created";@Value("${jwt.secret}")private String secret;@Value("${jwt.expiration}")private Long expiration;/*** 根据负责生成JWT的token*/private String generateToken(Map<String, Object> claims) {return Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate()).signWith(SignatureAlgorithm.HS512, secret).compact();}/*** 从token中获取JWT中的负载*/private Claims getClaimsFromToken(String token) {Claims claims = null;try {claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();} catch (Exception e) {LOGGER.info("JWT格式验证失败:{}", token);}return claims;}/*** 生成token的过期时间*/private Date generateExpirationDate() {return new Date(System.currentTimeMillis() + expiration * 1000);}/*** 从token中获取登录用户名*/public String getUserNameFromToken(String token) {String username;try {Claims claims = getClaimsFromToken(token);username = claims.getSubject();} catch (Exception e) {username = null;}return username;}/*** 验证token是否还有效** @param token       客户端传入的token* @param userDetails 从数据库中查询出来的用户信息*/public boolean validateToken(String token, UserDetails userDetails) {String username = getUserNameFromToken(token);return username.equals(userDetails.getUsername()) && !isTokenExpired(token);}/*** 判断token是否已经失效*/private boolean isTokenExpired(String token) {Date expiredDate = getExpiredDateFromToken(token);return expiredDate.before(new Date());}/*** 从token中获取过期时间*/private Date getExpiredDateFromToken(String token) {Claims claims = getClaimsFromToken(token);return claims.getExpiration();}/*** 根据用户信息生成token*/public String generateToken(String username) {Map<String, Object> claims = new HashMap<>();claims.put(CLAIM_KEY_USERNAME, username);claims.put(CLAIM_KEY_CREATED, new Date());return generateToken(claims);}/*** 判断token是否可以被刷新*/public boolean canRefresh(String token) {return !isTokenExpired(token);}/*** 刷新token*/public String refreshToken(String token) {Claims claims = getClaimsFromToken(token);claims.put(CLAIM_KEY_CREATED, new Date());return generateToken(claims);}
}

SecurityConfig

package com.example.demo.config;import com.example.demo.component.JwtAuthenticationTokenFilter;
import com.example.demo.component.RestAuthenticationEntryPoint;
import com.example.demo.component.RestfulAccessDeniedHandler;
import com.example.demo.domain.AdminUserDetails;
import com.example.demo.entity.UmsAdmin;
import com.example.demo.entity.UmsPermission;
import com.example.demo.service.UmsAdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;import java.util.List;/*** SpringSecurity的配置* Created by macro on 2018/4/26.*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UmsAdminService adminService;@Autowiredprivate RestfulAccessDeniedHandler restfulAccessDeniedHandler;@Autowiredprivate RestAuthenticationEntryPoint restAuthenticationEntryPoint;@Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception {httpSecurity.csrf()// 由于使用的是JWT,我们这里不需要csrf.disable().sessionManagement()// 基于token,所以不需要session.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers(HttpMethod.GET, // 允许对于网站静态资源的无授权访问"/","/*.html","/favicon.ico","/**/*.html","/**/*.css","/**/*.js","/swagger-resources/**","/v2/api-docs/**").permitAll().antMatchers("/admin/login", "/admin/register")// 对登录注册要允许匿名访问.permitAll().antMatchers(HttpMethod.OPTIONS)//跨域请求会先进行一次options请求.permitAll()
//                .antMatchers("/**")//测试时全部运行访问
//                .permitAll().anyRequest()// 除上面外的所有请求全部需要鉴权认证.authenticated();// 禁用缓存httpSecurity.headers().cacheControl();// 添加JWT filterhttpSecurity.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);//添加自定义未授权和未登录结果返回httpSecurity.exceptionHandling().accessDeniedHandler(restfulAccessDeniedHandler).authenticationEntryPoint(restAuthenticationEntryPoint);}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic UserDetailsService userDetailsService() {//获取登录用户信息return username -> {UmsAdmin admin = adminService.getAdminByUsername(username);if (admin != null) {List<UmsPermission> permissionList = adminService.getPermissionList(admin.getId());return new AdminUserDetails(admin, permissionList);}throw new UsernameNotFoundException("用户名或密码错误");};}@Beanpublic JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() {return new JwtAuthenticationTokenFilter();}@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}
}

相关依赖及方法说明

configure(HttpSecurity httpSecurity):用于配置需要拦截的url路径、jwt过滤器及出异常后的处理器;
configure(AuthenticationManagerBuilder auth):用于配置UserDetailsService及PasswordEncoder;
RestfulAccessDeniedHandler:当用户没有访问权限时的处理器,用于返回JSON格式的处理结果;
RestAuthenticationEntryPoint:当未登录或token失效时,返回JSON格式的结果;
UserDetailsService:SpringSecurity定义的核心接口,用于根据用户名获取用户信息,需要自行实现;
UserDetails:SpringSecurity定义用于封装用户信息的类(主要是用户信息和权限),需要自行实现;
PasswordEncoder:SpringSecurity定义的用于对密码进行编码及比对的接口,目前使用的是BCryptPasswordEncoder;
JwtAuthenticationTokenFilter:在用户名和密码校验前添加的过滤器,如果有jwt的token,会自行根据token信息进行登录。

RestfulAccessDeniedHandler

package com.example.demo.component;import cn.hutool.json.JSONUtil;
import com.example.demo.common.CommonResult;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 当访问接口没有权限时,自定义的返回结果* Created by macro on 2018/4/26.*/
@Component
public class RestfulAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request,HttpServletResponse response,AccessDeniedException e) throws IOException, ServletException {response.setCharacterEncoding("UTF-8");response.setContentType("application/json");response.getWriter().println(JSONUtil.parse(CommonResult.forbidden(e.getMessage())));response.getWriter().flush();}
}

RestAuthenticationEntryPoint

package com.example.demo.component;import cn.hutool.json.JSONUtil;
import com.example.demo.common.CommonResult;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 当未登录或者token失效访问接口时,自定义的返回结果* Created by macro on 2018/5/14.*/
@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {response.setCharacterEncoding("UTF-8");response.setContentType("application/json");response.getWriter().println(JSONUtil.parse(CommonResult.unauthorized(authException.getMessage())));response.getWriter().flush();}
}

AdminUserDetails

package com.example.demo.domain;import com.example.demo.entity.UmsAdmin;
import com.example.demo.entity.UmsPermission;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;/*** SpringSecurity需要的用户详情* Created by macro on 2018/4/26.*/
public class AdminUserDetails implements UserDetails {private UmsAdmin umsAdmin;private List<UmsPermission> permissionList;public AdminUserDetails(UmsAdmin umsAdmin, List<UmsPermission> permissionList) {this.umsAdmin = umsAdmin;this.permissionList = permissionList;}@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {//返回当前用户的权限return permissionList.stream().filter(permission -> permission.getValue() != null).map(permission -> new SimpleGrantedAuthority(permission.getValue())).collect(Collectors.toList());}@Overridepublic String getPassword() {return umsAdmin.getPassword();}@Overridepublic String getUsername() {return umsAdmin.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return umsAdmin.getStatus().equals(1);}
}

JwtAuthenticationTokenFilter

package com.example.demo.component;import com.example.demo.util.JwtTokenUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** JWT登录授权过滤器* Created by macro on 2018/4/26.*/
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationTokenFilter.class);@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Value("${jwt.tokenHeader}")private String tokenHeader;@Value("${jwt.tokenHead}")private String tokenHead;@Overrideprotected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws ServletException, IOException {String authHeader = request.getHeader(this.tokenHeader);if (authHeader != null && authHeader.startsWith(this.tokenHead)) {String authToken = authHeader.substring(this.tokenHead.length());// The part after "Bearer "String username = jwtTokenUtil.getUserNameFromToken(authToken);LOGGER.info("checking username:{}", username);if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);if (jwtTokenUtil.validateToken(authToken, userDetails)) {UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));LOGGER.info("authenticated user:{}", username);SecurityContextHolder.getContext().setAuthentication(authentication);}}}chain.doFilter(request, response);}
}

UmsAdminController

package com.example.demo.controller;import com.example.demo.common.CommonResult;
import com.example.demo.entity.UmsAdmin;
import com.example.demo.entity.UmsPermission;
import com.example.demo.entity.User;
import com.example.demo.service.UmsAdminService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 后台用户管理* Created by macro on 2018/4/26.*/
@Controller
@Api(tags = "UmsAdminController", description = "后台用户管理")
@RequestMapping("/admin")
public class UmsAdminController {@Autowiredprivate UmsAdminService adminService;@Value("${jwt.tokenHeader}")private String tokenHeader;@Value("${jwt.tokenHead}")private String tokenHead;@ApiOperation(value = "用户注册")@RequestMapping(value = "/register", method = RequestMethod.POST)@ResponseBodypublic CommonResult<UmsAdmin> register(@RequestBody UmsAdmin umsAdminParam, BindingResult result) {UmsAdmin umsAdmin = adminService.register(umsAdminParam);if (umsAdmin == null) {CommonResult.failed();}return CommonResult.success(umsAdmin);}@ApiOperation(value = "登录以后返回token")@RequestMapping(value = "/login", method = RequestMethod.POST)@ResponseBodypublic CommonResult login(@RequestBody User umsAdminLoginParam, BindingResult result) {String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());if (token == null) {return CommonResult.validateFailed("用户名或密码错误");}Map<String, String> tokenMap = new HashMap<>();tokenMap.put("token", token);tokenMap.put("tokenHead", tokenHead);return CommonResult.success(tokenMap);}@ApiOperation("获取用户所有权限(包括+-权限)")@RequestMapping(value = "/permission/{adminId}", method = RequestMethod.GET)@ResponseBodypublic CommonResult<List<UmsPermission>> getPermissionList(@PathVariable Long adminId) {List<UmsPermission> permissionList = adminService.getPermissionList(adminId);return CommonResult.success(permissionList);}
}

UmsAdminService

package com.example.demo.service;import com.example.demo.entity.UmsAdmin;
import com.example.demo.entity.UmsPermission;import java.util.List;/*** 后台管理员Service* Created by macro on 2018/4/26.*/
public interface UmsAdminService {/*** 根据用户名获取后台管理员*/UmsAdmin getAdminByUsername(String username);/*** 注册功能*/UmsAdmin register(UmsAdmin umsAdminParam);/*** 登录功能** @param username 用户名* @param password 密码* @return 生成的JWT的token*/String login(String username, String password);/*** 获取用户所有权限(包括角色权限和+-权限)*/List<UmsPermission> getPermissionList(Long adminId);
}

UmsAdminServiceImpl

package com.example.demo.service.impl;import com.example.demo.entity.UmsAdmin;
import com.example.demo.entity.UmsPermission;
import com.example.demo.mapper.UmsAdminMapper;
import com.example.demo.mapper.UmsAdminRoleRelationMapper;
import com.example.demo.service.UmsAdminService;
import com.example.demo.util.JwtTokenUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;import java.util.Date;
import java.util.List;/*** UmsAdminService实现类* Created by macro on 2018/4/26.*/
@Service
public class UmsAdminServiceImpl implements UmsAdminService {private static final Logger LOGGER = LoggerFactory.getLogger(UmsAdminServiceImpl.class);@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate JwtTokenUtil jwtTokenUtil;@Autowiredprivate PasswordEncoder passwordEncoder;@Value("${jwt.tokenHead}")private String tokenHead;@Autowiredprivate UmsAdminMapper adminMapper;@Autowiredprivate UmsAdminRoleRelationMapper adminRoleRelationMapper;@Overridepublic UmsAdmin getAdminByUsername(String username) {return adminMapper.getAdminByUsername(username);}@Overridepublic UmsAdmin register(UmsAdmin umsAdminParam) {UmsAdmin umsAdmin = new UmsAdmin();BeanUtils.copyProperties(umsAdminParam, umsAdmin);umsAdmin.setCreateTime(new Date());umsAdmin.setStatus(1);//查询是否有相同用户名的用户if (adminMapper.getAdminByUsername(umsAdmin.getUsername()) != null) {return null;}//将密码进行加密操作String encodePassword = passwordEncoder.encode(umsAdmin.getPassword());umsAdmin.setPassword(encodePassword);adminMapper.insert(umsAdmin);return umsAdmin;}@Overridepublic String login(String username, String password) {String token = null;try {UmsAdmin userDetails = getAdminByUsername(username);UserDetails aa = userDetailsService.loadUserByUsername(username);if (!passwordEncoder.matches(password, userDetails.getPassword())) {throw new BadCredentialsException("密码不正确");}UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authentication);token = jwtTokenUtil.generateToken(username);} catch (AuthenticationException e) {LOGGER.warn("登录异常:{}", e.getMessage());}return token;}@Overridepublic List<UmsPermission> getPermissionList(Long adminId) {return adminRoleRelationMapper.getPermissionList(adminId);}
}

SwaggerConfig

package com.example.demo.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.ArrayList;
import java.util.List;/*** @author Moses* @date 2020/5/20*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Value("${server.port}")protected String port;@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//为当前包下controller生成API文档.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")).paths(PathSelectors.any()).build()//添加登录认证.securitySchemes(securitySchemes()).securityContexts(securityContexts());}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("SwaggerUI演示").description("mall-tiny").contact("macro").version("1.0").build();}private List<ApiKey> securitySchemes() {//设置请求头信息List<ApiKey> result = new ArrayList<>();ApiKey apiKey = new ApiKey("Authorization", "Authorization", "header");result.add(apiKey);return result;}private List<SecurityContext> securityContexts() {//设置需要登录认证的路径List<SecurityContext> result = new ArrayList<>();result.add(getContextByPath("/brand/.*"));return result;}private SecurityContext getContextByPath(String pathRegex) {return SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex(pathRegex)).build();}private List<SecurityReference> defaultAuth() {List<SecurityReference> result = new ArrayList<>();AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];authorizationScopes[0] = authorizationScope;result.add(new SecurityReference("Authorization", authorizationScopes));return result;}
}

http://localhost:8888/swagger-ui.html#/

未登录前访问接口

登录

添加store

npm install --save vuex

添加store文件夹和index.js

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({state: {token: '',userInfo: JSON.parse(sessionStorage.getItem('userInfo'))},mutations: {// setSET_TOKEN: (state, token) => {state.token = tokenlocalStorage.setItem('token', token)},SET_USERINFO: (state, userInfo) => {state.userInfo = userInfosessionStorage.setItem('userInfo', JSON.stringify(userInfo))},REMOVE_INFO: (state) => {state.token = ''state.userInfo = {}localStorage.setItem('token', '')sessionStorage.setItem('userInfo', JSON.stringify(''))}},getters: {// getgetUser: state => {return state.userInfo}},actions: {},modules: {}
})

引入

import store from './store'

使用

const jwt = res.headers['authorization']
const userInfo = res.data.data
// 把数据共享出去
_this.$store.commit('SET_TOKEN', jwt)
_this.$store.commit('SET_USERINFO', userInfo)

Login.vue

<template><div><el-card class="login-form-layout"><el-form:model="user"status-icon:rules="rules"ref="user"label-width="80px"class="demo-user"><el-form-item label="用户名" prop="username"><el-input type="text" maxlength="12" v-model="user.username"></el-input></el-form-item><el-form-item label="密 码" prop="password"><el-input type="password" v-model="user.password" autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('user')">登录</el-button><el-button @click="resetForm('user')">重置</el-button></el-form-item></el-form></el-card></div>
</template>
<script>
export default {name: 'Login',data () {var validatePass = (rule, value, callback) => {if (value === '') {callback(new Error('请输入密码'))} else {callback()}}return {user: {password: 'macro123',username: 'admin'},rules: {password: [{ validator: validatePass, trigger: 'blur' }],username: [{ required: true, message: '请输入用户名', trigger: 'blur' },{min: 3,max: 12,message: '长度在 3 到 12 个字符',trigger: 'blur'}]}}},methods: {submitForm (formName) {const _this = thisthis.$refs[formName].validate((valid) => {if (valid) {this.$axios.post('/admin/login', this.user).then((res) => {debuggerif (res.data) {// const jwt = res.headers['authorization']const jwt = res.data.toker// 把数据共享出去_this.$store.commit('SET_TOKEN', jwt)// _this.$store.commit('SET_USERINFO', userInfo)_this.$router.push('/user')} else {this.$notify({title: '登录失败:',message: '用户名或密码错误',duration: 1500})}})} else {console.log('error submit!!')return false}})},resetForm (formName) {this.$refs[formName].resetFields()}}
}
</script>
<style scoped>
.login-form-layout {position: absolute;left: 0;right: 0;width: 360px;margin: 140px auto;border-top: 10px solid #409eff;
}
</style>

代码地址:https://github.com/glory2018/SpringBoot-Mybatis-Vue.git

SpringBoot+Mybatis+Vue整合相关推荐

  1. 超详细的SpringBoot+Mybatis+Vue整合笔记

    这是我的第一篇博客.请多多指教! 开发工具 前端:WebStorm.后台:Eclipse Vue环境搭建 vue是一个JavaMVVM库,是一套用于构建用户界面的渐进式框架,是初创项目的首选前端框架. ...

  2. 一个基于SpringBoot + Mybatis + Vue的代码生成器

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! code-gen 一款代码生成工具,可自定义模板生成不同的 ...

  3. 基于javaweb的平行志愿管理系统(java+springboot+mybatis+vue+mysql)

    基于javaweb的平行志愿管理系统(java+springboot+mybatis+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:eclip ...

  4. springboot+mybatis+redis整合

    springBoot+mybatis+redis整合,这里搭建一个简单的框架是为了记录怎么使用redis做缓存. 一.构建一个springboot的maven项目,目录结构如下: 二.在pom.xml ...

  5. springboot mybatis easyui 整合的一个小demo

    springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...

  6. 基于javaweb的水果生鲜商城系统(java+springboot+mybatis+vue+mysql)

    基于javaweb的水果生鲜商城系统(java+springboot+mybatis+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:eclip ...

  7. 基于javaweb的精品养老院管理系统(java+springboot+mybatis+vue+mysql)

    基于javaweb的精品养老院管理系统(java+springboot+mybatis+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:ecli ...

  8. 基于javaweb的医院管理系统(java+springboot+mybatis+vue+mysql)

    基于javaweb的医院管理系统(java+springboot+mybatis+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:eclipse ...

  9. 基于javaweb的在线点餐系统(java+springboot+mybatis+vue+mysql+redis)

    基于javaweb的在线点餐系统(java+springboot+mybatis+vue+mysql+redis) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:e ...

最新文章

  1. 记忆碎片 - 2015.09.11
  2. python字符串单个替换_如何用变量替换列表中的单个字符串?
  3. BugKuCTF 杂项 come_game
  4. Android学习笔记之android:collapseColumns,android:shrinkColumns和stretchColumn
  5. python单击url下载网页文件_使用不带url的python脚本从网页下载文件,调用onClick函数 - javascript...
  6. 邮件发送---SpringBoot
  7. python常见安装
  8. Leviathan系列4-7
  9. Tomcat5.5链接Oracle、DB2、MySQL数据源实现JSP下拉框的填充
  10. 【关系抽取】详聊如何用BERT实现关系抽取
  11. 使用Java中面向对象的思想来实现两个人的一场战斗
  12. 蓝桥杯国赛之光敏电阻传感器
  13. mysql 2037年,正确的方法来存储2037年之后的MySQL日期
  14. LaTeX技巧100:LaTeX如何输入大小写罗马数字?
  15. golang it营_深入理解Go-垃圾回收机制
  16. linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
  17. 装机软件测试工资,实际性能测试及总结_DIY攒机装机不求人-中关村在线
  18. iniparser——C配置文件解析库
  19. 计算机软件工程网络管理员实习报告范文、周记及总结30篇
  20. 酒店餐饮系统Micros9700相关问题

热门文章

  1. perl 模块使用范例
  2. 《小学生四则运算出题软件》结对项目总结
  3. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]
  4. Lammps切削过程实现及工件表面识别
  5. 火车到站时间接口 站到站列车信息检索
  6. 一、elastic-job、elastic-job-lite-console使用案例
  7. c++中函数屏蔽和函数参数屏蔽
  8. Android:logo
  9. 13、撤回(撤销)、驳回(退回)、作废(终止)、挂起(中止)
  10. ui设计移动端字体适配_JavaScript之独立使用lib-flexible.js适配移动端UI设计750px设计图...