后台管理系统开发
功能模块:用户登录、权限管理(用户管理、菜单管理、角色管理)
技术应用:SSM框架+Mysql5.7+jsp+前端layui和EasyUI框架
项目工具:Maven+tomcat9.0+jdk1.8+GIT
开发工具:IDEA
测试环境:window7+搜狗浏览器10.0
一、数据库表结构设计
基础权限管理需要五张表:菜单、用户、角色、角色权限、用户角色
创建数据库
CREATE DATABASE IF NOT EXISTS exam;
1、菜单表menu
描述 | 字段 | 类型 | 约束 |
---|---|---|---|
菜单id | id | int | 主键自增 |
菜单名 | name | varchar | 不能为空 |
链接页面 | url | varchar | |
父菜单id | parent_id | int | |
菜单排序 | sort | int | |
icon | varchar | ||
perms | varchar | ||
菜单类型 | type | smallint |
建表sql:
CREATE TABLE menu (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(50) NOT NULL,
parent_id int,
url varchar(500),
icon varchar(30),
perms varchar(100),
type smallint(6),
sort int
);
插入数据:
insert into menu(name,icon,type,sort) value("权限管理","fa fa-bug",0,1);
insert into menu(name,parent_id,url,icon,perms,type,sort) value("菜单管理",2,"/sys/menu.html","fa fa-th-list","svs:menu:list",1,1000);
insert into menu(name,parent_id,url,icon,perms,type,sort) value("角色管理",2,"/sys/role.html","fa fa-key","svs:role:list",1,1000);
insert into menu(name,parent_id,url,icon,perms,type,sort) value("用户管理",2,"/sys/user.html","fa fa-user","svs:user:list",1,1000);
insert into menu(name,parent_id,perms,type,sort) value("添加",5,"sys:user:add",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("修改",5,"sys:user:update",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("删除",5,"sys:user:delete",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("授权",5,"sys:user:assign",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("添加",3,"sys:menu:add",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("修改",3,"sys:menu:update",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("删除",3,"sys:menu:delete",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("添加",4,"sys:role:add",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("修改",4,"sys:role:update",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("删除",4,"sys:role:delete",2,1000);
insert into menu(name,parent_id,perms,type,sort) value("授权",4,"sys:role:assign",2,1000);
2、用户表user
描述 | 字段 | 类型 | 约束 |
---|---|---|---|
用户id | id | int | 主键自增 |
用户名 | account | varchar | 唯一、不能为空 |
用户密码 | password | varchar | |
昵称 | nickname | varchar | |
动态盐(用户名md5) | salt | varchar | |
用户状态 | status | int | 为1正常,为0表示停用 |
建表sql:
CREATE TABLE user (
id int PRIMARY KEY AUTO_INCREMENT,
account varchar(50) NOT NULL UNIQUE,
password varchar(50),
nickname varchar(50),
salt varchar(50),
STATUS int DEFAULT '1'
);
插入数据:
insert into user(account, password, nickname)
VALUES ("a000001", "123456", "瞪谁谁怀孕"),
("a000002", "123456", "骑猪上高速"),
("a000003", "123456", "朕要去幼儿园深造了"),
("a000004", "123456", "帅到拖网速"),
("a000005", "123456", "遇蛇撑伞装许仙"),
("a000006", "123456", "谈情不如逗狗"),
("a000007", "123456", "地球是哥捏圆的"),
("a000008", "123456", "不贱不散"),
("a000009", "123456", "跳进海里躲雨"),
("a000010", "123456", "此用户下落不明")
("a000011", "123456", "软妹轰炸机"),
("a000012", "123456", "怡红院掌柜"),
("a000013", "123456", "被丢弃的小盆友"),
("a000014", "123456", "近猪者吃"),
("a000015", "123456", "跪是种美德"),
("a000016", "123456", "老衲逛青楼"),
("a000017", "123456", "武功再高也怕菜刀"),
("a000018", "123456", "镜子你又胖了"),
("a000019", "123456", "骑猪总裁"),
("a000020", "123456", "抢我辣条还想跑"),
("a000021", "123456", "骗子被骗子骗了"),
("a000022", "123456", "农夫三拳"),
("a000023", "123456", "夜以深,适宜私奔"),
("a000024", "123456", "卖女孩的小火柴"),
("a000025", "123456", "唐伯虎点蚊香"),
("a000026", "123456", "贱男春"),
("a000027", "123456", "老鼠上了猫"),
("a000028", "123456", "穷人的孩子早出家"),
("a000029", "123456", "车到山前是死路"),
("a000030", "123456", "我在马路边丢了一分钱"),
("a000031", "123456", "卖身葬楼主"),
("a000032", "123456", "人贱人爱"),
("a000033", "123456", "看野花一朵朵");
3、角色表role
描述 | 字段 | 类型 | 约束 |
---|---|---|---|
角色id | id | int | 主键自增 |
角色名 | name | varchar | |
角色备注 | remark | varchar | |
角色状态 | status | int |
建表sql:
CREATE TABLE role (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(50) NOT NULL,
remark varchar(50) NOT NULL,
status int NOT NULL
);
插入数据:
INSERT INTO role (NAME, REMARK, STATUS) VALUES ('admin', '超级管理员', 1),
('test1', 'remark', 1),
('aa3', '3333', 0),
('asd', 'sadsa', 0),
('sa', 'asd', 0);
4、角色权限表role_menu
描述 | 字段 | 类型 | 约束 |
---|---|---|---|
角色id | role_id | int | 不能为空 |
菜单名 | menu_id | int | 不能为空 |
建表sql:
CREATE TABLE role_menu (
role_id int NOT NULL,
menu_id int NOT NULL,
CONSTRAINT `PRIMARY` PRIMARY KEY (role_id, menu_id)
);
插入数据:
INSERT INTO role_menu (role_id, menu_id)
VALUES(1, 2),(1, 3),(1, 4),(1, 5),(1, 6),(1, 7),(1, 8),(1, 9),(1, 10),(1, 11),(1, 12),(1, 13),(1, 14),(1, 15);
INSERT INTO role_menu (role_id, menu_id)
VALUES(2, 4),(2, 12),(2, 13),(2, 14),(2, 15);
5、用户角色表user_role
描述 | 字段 | 类型 | 约束 |
---|---|---|---|
用户id | user_id | int | 不能为空 |
角色id | role_id | int | 不能为空 |
建表sql:
CREATE TABLE user_role (
user_id int NOT NULL,
role_id int NOT NULL,
CONSTRAINT `PRIMARY` PRIMARY KEY (user_id, role_id)
);
插入数据:
INSERT INTO user_role (USER_ID, ROLE_ID) VALUES (1, 1),(2, 2);
二、项目准备
1、创建maven项目
建包
主包:com.booy.ssm.exam
子包:实体类包pojo、dao包、service包、controller包、utils包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h63d5ung-1592834137816)(\img\1.jpg)]
2、创建实体类
User类
package com.booy.ssm.exam.pojo;
import lombok.Data;
@Data
public class User {
private Integer id;
private String account;
private String password;
private String nickname;
private Integer status;
}
Menu类:
package com.booy.ssm.exam.pojo;
import lombok.Data;
@Data
public class Menu {
private Integer id;
private String name;//菜单名
private String url;
private Integer parentId;//父id
private Integer sort;//排序
}
3、添加依赖
在pom.xml添加项目所需要用到的依赖包
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>ssmdemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
<dependencies>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<!--spring数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring-mybatis整合包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!--spring相关包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--实体类注解-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!--配置资源文件扫描,否则Mapper-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
三、登录功能简单实现
1、dao层
创建UserDAO接口:
package com.booy.ssm.exam.dao;
import com.booy.ssm.exam.pojo.User;
public interface UserDAO {
User getUserByAccount(String account);
}
创建UserMapper.xml映射sql查询:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.booy.ssm.exam.dao.UserDAO">
<!--<![CDATA[你的注释]]>-->
<select id="getUserByAccount" resultType="User" parameterType="String">
select id, account, password,status
from user
where account=#{
account}
</select>
</mapper>
2、service层
创建UserService接口:
package com.booy.ssm.exam.service;
import com.booy.ssm.exam.pojo.User;
public interface UserService {
//用户登录
User dologin(String account,String password);
}
UserService接口实现类:
package com.booy.ssm.exam.service.impl;
import com.booy.ssm.exam.dao.UserDAO;
import com.booy.ssm.exam.pojo.User;
import com.booy.ssm.exam.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public User dologin(String account, String password) {
User user = userDAO.getUserByAccount(account);
if(user==null || !user.getPassword().equals(password)|| user.getStatus().equals(ExamConstants.USER_STATUS_DELETE)){
return null;//账号或密码错误
}
return user;
}
}
3、controller层
创建SystemController
package com.booy.ssm.exam.controller;
import com.booy.ssm.exam.pojo.User;
import com.booy.ssm.exam.service.UserService;
import com.booy.ssm.exam.utils.ExamConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;
@Controller
public class SystemController {
@Autowired
UserService userService;
@RequestMapping("login.html")
public String login(){
return "login";
}
@RequestMapping("dologin.html")
public String dologin(String account, String password, Model model, HttpSession session){
User user = userService.dologin(account, password);
if(user==null){
model.addAttribute("message","用户名或密码错误!");
return "login";
}
model.addAttribute("message","登录成功!");
session.setAttribute(ExamConstants.SESSION_USER,user.getAccount());
return "redirect:index.html";
}
}
4、utils工具类
package com.booy.ssm.exam.utils;
public interface ExamConstants {
String SESSION_USER="SESSION_USER";
int USER_STATUS_DELETE=0;
}
5、引入配置文件
1)、jdbc配置文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exam?characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
2)、日志文件log4j.properties
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
#begin
#for normal test, delete when online
log4j.logger.com.ibatis=DEBUG
1og4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
1og4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
1og4j.logger.java.sql.Connection=DEBUG
1og4j.logger.java.sql.Statement=DEBUG
1og4j.logger.java.sql.PreparedStatement=DEBUG
1og4j.1ogger.java.sq1.ResultSet=DEBUG
3)、spring配置文件spring-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--数据源管理-->
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username