Spring Boot+JPA+thymeleaf项目整合

最近几天学习了一下spring boot,于是做了个demo 写的不好,仅供参考

Spring Boot

        是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

特点:

1. 创建独立的Spring应用程序
2. 嵌入的Tomcat,无需部署WAR文件
3. 简化Maven配置
4. 自动配置Spring
5. 提供生产就绪型功能,如指标,健康检查和外部配置
6. 绝对没有代码生成和对XML没有要求配置

多余的话就不说了,请参考spring boot官方中文文档:spring boot

首先可以通过spring boot在线生成demo:Spring Initializrable

将项目导入eclipse或者idea,接下来重头戏来了

第一步:POM配置

<?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.sang</groupId>
    <artifactId>lg-eis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>lg-eis</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- ojdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- 添加对jsp视图解析的支持 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!-- 只需引入spring-boot-devtools 即可实现热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!-- Json包 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.16</version>
        </dependency>
        <!-- 为了监控数据库 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <!-- Junit 单元测试 -->
        <dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-test</artifactId>
		    <scope>test</scope>
		</dependency>
		<!-- <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency> -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <dependencies>
                        <!-- 热部署 -->
                        <dependency>
                            <groupId>org.springframework</groupId>
                            <artifactId>springloaded</artifactId>
                            <version>1.2.6.RELEASE</version>
                        </dependency>
                    </dependencies>
                </plugin>
        </plugins>
    </build>
	<repositories>
       <repository>
           <id>ali</id>
           <name>ali Repository</name>
           <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
           <snapshots>
               <enabled>false</enabled>
           </snapshots>
       </repository>
     </repositories>

</project>

第二部:配置好application.properties

#Tomcat
server.port=8081
server.context-path=/lg-eis
server.tomcat.max-threads=800
server.session.timeout=10
server.tomcat.uri-encoding=UTF-8
#HTTP encoding
spring.http.encoding.charset = UTF-8
spring.http.encoding.enabled = true
spring.messages.encoding=UTF-8
#dataSource-MySQL
# 数据库访问配置
# 主数据源,默认的
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/lg-eis
spring.datasource.username= root
spring.datasource.password= 1234
spring.datasource.driverClassName = com.mysql.jdbc.Driver
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
spring.datasource.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒 
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 
#spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.useGlobalDataSourceStat=true
#spring security权限控制
#JPA Configuration:  
spring.jpa.database=MYSQL
logging.level.org.hibernate.SQL=DEBUG
# Show or not log for each sql query
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true  
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto=update  
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect  
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy  
#spring.jpa.database=org.hibernate.dialect.MySQL5InnoDBDialect 
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
#视图
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.cache=false
#thymeleaf end

分别对应tomcat配置,数据源配置,jpa配置,以及spring boot推荐使用的thymeleaf

第三步:配置日志文件目录以及日志输出logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="./logs" />
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg  %n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/runtime.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

下面开始配置javabean采用jpa

新建一个SysUser

package com.lgeis.common.entity;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
/**
 * 
 *  @application name: 
 *  @author: zhouxinlei 
 *  @time:2018年6月22日
 *  @version:ver 1.1
 */
@Entity
@Table(name = "sys_user")
public class SysUser implements java.io.Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@Column(name = "user_id",length = 20)
	private Long id;
	@Column(name = "user_nm")
	private String username;
	@Column(name = "password")
	private String password;
	@Column(name = "display_nm")
	private String displayNm;
	@Column(name = "user_gender")
	private int userGender;
	@Column(name = "birth_day")
	private String birthDay;
	@Column(name = "phone")
	private String phone;
	@Column(name = "email")
	private String email;
	@Column(name = "wechat")
	private String weChat;
	@Column(name = "isdel")
	private int isdel;
	@Column(name = "updt_by")
	private int updtBy;
	@Column(name = "updt_ts")
	private String updtTs;
	@Column(name = "salt")
	private String salt;//加密密码的盐
	@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
	@JoinTable(name = "user_role", 
    joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "user_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "role_id", referencedColumnName = "role_id") })
	@OrderBy("role_id asc")
	private Set<SysRole> roles = new HashSet<SysRole>();
	@OneToOne(cascade=CascadeType.PERSIST, fetch = FetchType.EAGER, mappedBy="user")
	private Attachment file;
	public SysUser() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	 public SysUser(Long id, String username, String password, String displayNm, int userGender, String birthDay,
			String phone, String email, String weChat, int isdel, int updtBy, String updtTs, String salt,
			Set<SysRole> roles, Attachment file) {
		super();
		this.id = id;
		this.username = username;
		this.password = password;
		this.displayNm = displayNm;
		this.userGender = userGender;
		this.birthDay = birthDay;
		this.phone = phone;
		this.email = email;
		this.weChat = weChat;
		this.isdel = isdel;
		this.updtBy = updtBy;
		this.updtTs = updtTs;
		this.salt = salt;
		this.roles = roles;
		this.file = file;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getDisplayNm() {
		return displayNm;
	}

	public void setDisplayNm(String displayNm) {
		this.displayNm = displayNm;
	}

	public int getUserGender() {
		return userGender;
	}

	public void setUserGender(int userGender) {
		this.userGender = userGender;
	}

	public String getBirthDay() {
		return birthDay;
	}

	public void setBirthDay(String birthDay) {
		this.birthDay = birthDay;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getWeChat() {
		return weChat;
	}

	public void setWeChat(String weChat) {
		this.weChat = weChat;
	}

	public int getIsdel() {
		return isdel;
	}

	public void setIsdel(int isdel) {
		this.isdel = isdel;
	}

	public int getUpdtBy() {
		return updtBy;
	}

	public void setUpdtBy(int updtBy) {
		this.updtBy = updtBy;
	}

	public String getUpdtTs() {
		return updtTs;
	}

	public void setUpdtTs(String updtTs) {
		this.updtTs = updtTs;
	}

	public String getSalt() {
		return salt;
	}

	public void setSalt(String salt) {
		this.salt = salt;
	}

	public Set<SysRole> getRoles() {
		return roles;
	}

	public void setRoles(Set<SysRole> roles) {
		this.roles = roles;
	}

	public Attachment getFile() {
		return file;
	}

	public void setFile(Attachment file) {
		this.file = file;
	}

	/**
     * 密码盐.
     * @return
     */
    public String getCredentialsSalt(){
        return this.username+this.salt;
    }
    //重新对盐重新进行了定义,用户名+salt,这样就更加不容易被破解
}

下面写dao层,由于我封装了jpa,所以dao层可能有所不同

package com.lgeis.common.dao;

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

import com.lgeis.base.dao.common.BaseRepository;
import com.lgeis.common.entity.SysUser;
/**
 * 
 * @Notes:用户管理
 * @author: zhouxinlei
 *
 */
@Repository
public interface SysUserDao extends BaseRepository<SysUser,Long>, JpaSpecificationExecutor<SysUser>{
	
	SysUser findByUsername(String username);
	
	SysUser findUserById(Long id);
}

service层

package com.lgeis.business.user.service;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import com.lgeis.common.entity.SysUser;

public interface ISysUserService {
	
	public void deleteUser(Long Id);
	
	public void saveUser(SysUser user);
	
	public void updateUser(SysUser user);
	
	public List<SysUser> findUserByName(String name);
	
	public List<SysUser> findUserList();
	
	public SysUser findUserInfo(Long Id);
	
	public Page<SysUser> queryUserList(String userName,String isStop, Pageable pageable);

	public SysUser findByUsername(String username);
	
	
}
serviceImpl层




package com.lgeis.business.user.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import com.lgeis.base.specification.SimpleSpecificationBuilder;
import com.lgeis.business.user.service.ISysUserService;
import com.lgeis.common.dao.SysUserDao;
import com.lgeis.common.entity.SysUser;
/**
 * 
 *  @application name: 
 *  @author: zhouxinlei 
 *  @time:2018年6月22日
 *  @version:ver 1.1
 */
@Service
public class SysUserServiceImpl implements ISysUserService{
	@Resource
	public SysUserDao userDao;
	@Override
	public List<SysUser> findUserByName(String name) {
        @SuppressWarnings("unchecked")
		List<SysUser> list = userDao.findAll(new SimpleSpecificationBuilder<Object>("name","=",name).generateSpecification());
		return list;
	}
	@Override
	public Page<SysUser> queryUserList(String userName,String isStop,Pageable pageable) {
		SimpleSpecificationBuilder<Object> ssfb = new SimpleSpecificationBuilder<>();
		if (userName!=null&&!"".equals(userName)) {
			ssfb.add("displayNm", "=", userName);
		}
		if (isStop!=null&&!"".equals(isStop)) {
			ssfb.add("isdel", "=", isStop);
		}
		Page<SysUser> list = userDao.findAll(ssfb.generateSpecification(),pageable);
		return list;
	}
	@Override
	public SysUser findUserInfo(Long Id) {
		SysUser user = userDao.findUserById(Id);
		return user;
	}
	@Override
	public void deleteUser(Long Id) {
		userDao.deleteById(Id);
	}
	@Override
	public void saveUser(SysUser user) {
		
		userDao.save(user);
	}
	@Override
	public void updateUser(SysUser user) {
		userDao.save(user);
		
	}
	@Override
	public List<SysUser> findUserList() {
		List<SysUser> list =userDao.findAll();
		return list;
	}
	@Override
	public SysUser findByUsername(String username) {
		SysUser user = userDao.findByUsername(username);
		return user;
	}

}

controller层

package com.lgeis.business.user.controller;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.lgeis.business.file.controller.FileHanderUtil;
import com.lgeis.business.role.service.ISysRoleService;
import com.lgeis.business.user.service.ISysUserService;
import com.lgeis.common.entity.Attachment;
import com.lgeis.common.entity.SysUser;
import com.lgeis.common.utils.ControllerUtil;
import com.lgeis.common.utils.KeyUtil;
import com.lgeis.common.utils.PageTag;

import common.Util.String.StringUtilFomat;
/**
 * 
 *  @application name: 
 *  @author: zhouxinlei 
 *  @time:2018年6月22日
 *  @version:ver 1.1
 */
@Controller
public class UserController {
	@Resource
	private ISysUserService userInfo;
	@Resource
	private ISysRoleService roleService;
	/**
	 * 分页查询用户
	 * @param response
	 * @param request
	 * @param pageable
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value ="/queryUserInfoList",method = RequestMethod.GET)
	public String queryUserInfoList(HttpServletResponse response, HttpServletRequest request,Pageable pageable) throws Exception {
		int pageNum = 0;
		String currentNum = request.getParameter("currentNum");
		String displayNm = request.getParameter("displayNm");
		String isdel = request.getParameter("isdel");
		if (currentNum!=null&&!"".equals(currentNum)) {
			pageNum=Integer.valueOf(currentNum);
		}
		pageable = new PageRequest(pageNum,10, Sort.Direction.ASC,"id");
		Page<SysUser> list = userInfo.queryUserList(displayNm,isdel,pageable);
		PageTag<SysUser> page = new PageTag<SysUser>(list, "/queryUserInfoList");
		request.setAttribute("userInfoList", page.getContent());
		request.setAttribute("page",page);
		request.setAttribute("displayNm", displayNm);
		request.setAttribute("isdel", isdel);
		return "user/userlist";
		
	}
	/**
	 * 查看用户信息
	 * @param response
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value ="/viewUserInfo",method = RequestMethod.GET)
	public String viewUserInfo(HttpServletResponse response, HttpServletRequest request) throws Exception {
		String userId= request.getParameter("userId");
		Long id =null;
		SysUser user =null;
		if (userId!=null&&!"".equals(userId)) {
			id = Long.valueOf(userId);
		}
		user = userInfo.findUserInfo(id);
		request.setAttribute("user", user);
		return "user/userview";
		
	}
	/**
	 * 更新用户转发
	 * @param response
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value ="/updataUserForworrd",method = RequestMethod.GET)
	public String updataUserForworrd(HttpServletResponse response, HttpServletRequest request) throws Exception {
		String userId= request.getParameter("userId");
		Long id =null;
		SysUser user =null;
		if (userId!=null&&!"".equals(userId)) {
			id = Long.valueOf(userId);
		}
		user = userInfo.findUserInfo(id);
		request.setAttribute("user", user);
		return "user/userupdate";
		
	}
	/**
	 * 新增用户转发
	 * @param response
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value ="/addUserForworrd")
	public String addUserForworrd(HttpServletResponse response, HttpServletRequest request) throws Exception {
		return "user/useradd";
	}
	/**
	 * 删除用户
	 * @param response
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping(value ="/deleteUser",produces="application/json;charset=UTF-8")
	@ResponseBody
	public void deleteUser(HttpServletResponse response, HttpServletRequest request) throws Exception {
		String userId= request.getParameter("userId");
		String jsonData="";
		try {
			Long id =null;
			if (userId!=null&&!"".equals(userId)) {
				id = Long.valueOf(userId);
			}
			userInfo.deleteUser(id);
			jsonData="{\"msgkey\":\"success\",\"msgData\":\"删除用户成功!\"}";
		} catch (Exception e) {
			e.printStackTrace();
			jsonData="{\"msgkey\":\"error\",\"msgData\":\"删除用户失败!\"}";
		}
		ControllerUtil.writejsonAndSession(response,request,jsonData);
	}
	/**
	 * 保存用户信息
	 * @param response
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping(value ="/saveUser",produces="application/json;charset=UTF-8")
	@ResponseBody
	public void saveUser(HttpServletResponse response, HttpServletRequest request) throws Exception {
		String jsonData="";
		String userNm= request.getParameter("usernameAdd");
		String displayNm= request.getParameter("displayNmAdd");
		String password= request.getParameter("password");
		String birthDay= request.getParameter("birthDay");
		String phone= request.getParameter("phone");
		String weChat= request.getParameter("weChat");
		String email= request.getParameter("email");
		String userGender= request.getParameter("addUserGender");
		String isdel= request.getParameter("addIsdel");
		try {
			SysUser user = new SysUser();
			user.setId(KeyUtil.GeneratedValue());
			user.setUsername(userNm);
			user.setDisplayNm(displayNm);
			user.setPassword(password);
			user.setBirthDay(birthDay);
			user.setPhone(phone);
			user.setWeChat(weChat);
			user.setEmail(email);
			user.setUserGender(Integer.valueOf(userGender));
			user.setIsdel(Integer.valueOf(isdel));
			user.setUpdtBy(0);
			user.setUpdtTs(StringUtilFomat.dateToString(new Date(), StringUtilFomat.dateFormat_yyyy_MM_dd_HH_MM_SS));
			/*Attachment attachment = FileHanderUtil.uploadFile(file, request);
			user.setFile(attachment);*/
			userInfo.saveUser(user);
			jsonData="{\"msgkey\":\"success\",\"msgData\":\"新增用户成功!\"}";
		} catch (Exception e) {
			e.printStackTrace();
			jsonData="{\"msgkey\":\"error\",\"msgData\":\"新增用户失败!\"}";
		}
		ControllerUtil.writejsonAndSession(response,request,jsonData);
	}
	@RequestMapping(value ="/updateUser",produces="application/json;charset=UTF-8")
	@ResponseBody
	public void updateUser(HttpServletResponse response, HttpServletRequest request) throws Exception {
		String jsonData="";
		String userId= request.getParameter("userId");
		String userNm= request.getParameter("updateUsername");
		String displayNm= request.getParameter("updateDisplayNm");
		String password= request.getParameter("updatePassword");
		String birthDay= request.getParameter("updateBirthDay");
		String phone= request.getParameter("updatePhone");
		String weChat= request.getParameter("updateWeChat");
		String email= request.getParameter("updateEmail");
		String userGender= request.getParameter("updateUserGender");
		String isdel= request.getParameter("updateIsdel");
		try {
			SysUser user = new SysUser();
			if (userId!=null&&!"".equals(userId)) {
				user.setId(Long.valueOf(userId));
			}
			user.setUsername(userNm);
			user.setDisplayNm(displayNm);
			user.setPassword(password);
			user.setBirthDay(birthDay);
			user.setPhone(phone);
			user.setWeChat(weChat);
			user.setEmail(email);
			user.setUserGender(Integer.valueOf(userGender));
			user.setIsdel(Integer.valueOf(isdel));
			user.setUpdtBy(0);
			user.setUpdtTs(StringUtilFomat.dateToString(new Date(), StringUtilFomat.dateFormat_yyyy_MM_dd_HH_MM_SS));
			userInfo.updateUser(user);
			jsonData="{\"msgkey\":\"success\",\"msgData\":\"修改用户成功!\"}";
		} catch (Exception e) {
			e.printStackTrace();
			jsonData="{\"msgkey\":\"error\",\"msgData\":\"修改用户失败!\"}";
		}
		ControllerUtil.writejsonAndSession(response,request,jsonData);
	}
	/**
	 * 查询所有用户
	 * @param response
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value ="/queryUserList",method = RequestMethod.GET)
	public String queryUserList(HttpServletResponse response, HttpServletRequest request) throws Exception {
		String roleId = request.getParameter("roleId");
		List<SysUser> list = userInfo.findUserList();
		request.setAttribute("roleId", roleId);
		request.setAttribute("userList", list);
		return "role/usermodal";
		
	}
}

下面开始新建页面 userlist.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>用户列表</title>
	<!-- 导航菜单样式 -->
	<link rel="stylesheet" href="css/simple-line-icons/css/simple-line-icons.css">
	<link rel="stylesheet" href="css/mdi/css/materialdesignicons.css">
	<link rel="stylesheet" href="css/icheck/skins/all.css" />
	<link rel="stylesheet" href="css/style.css">
	<!-- jQuery -->
	<script src="jquery/jquery.min.js"></script>
	<script type="text/javascript" src="jquery/jquery-1.11.2.min.js"></script>
	<script type="text/javascript" src="jquery/jquery.form.js"></script>
	<!-- bootStrap -->
	<script src="BootstrapEx/popper.min.js"></script>
	<script src="bootstrap/bootstrap.min.js"></script>
  	<script src="js/sidebar-icon.js"></script>
	<!-- Ajax -->
	<link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
	<script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>
	<script type="text/javascript" src="extjs/ext-all.js"></script>
    <!-- 模态框 -->
    <link rel="stylesheet" href="css/newapprove.css" />
    <link rel="stylesheet" href="css/formodal.css" />
    <link rel="stylesheet" href="css/cxq.css" />
    <link rel="stylesheet" href="css/outside.css" />
    <script type="text/javascript" src="BootstrapEx/js/bootstrapEx.js"></script>
	
	<!-- 业务代码js文件-->
	<script src="businessJs/common.js"></script>
	<script src="businessJs/user.js"></script>
</head>
<body>
	<div id="body" class="container-scroller">
		<!-- top -->
		<nav
			class="navbar navbar-primary col-lg-12 col-12 fixed-top d-flex flex-row"
			th:replace="sys/top.html"></nav>
		<div class="container-fluid page-body-wapper">
			<div class="row row-offcanvas row-offcanvas-right">
				<!--left -->
				<nav class="sidebar sidebar-fixed sidebar-offcanvas" id="sidebar"
					th:replace="sys/left.html"></nav>
				<!--body -->
				<div class="content-wrapper">
					<ul class="nav nav-tabs" id="Demo-tab1" role="tablist">
						<li class="nav-item"><a class="nav-link" href="/index">Home</a>
						</li>
						<li class="nav-item"><a class="nav-link active"
							href="/queryUserInfoList">用户信息列表</a></li>
					</ul>
					<div id="page-inner">
						<div class="row">
							<div class="col-md-12">
								<div class="card">
									<div style="margin-top: 20px;margin-bottom: 20px;margin-left: 40px;">
										<button class="btn btn-outline-success btn-sm" οnclick="saveUserForward();">新增用户</button>
										<button class="btn btn-outline-primary btn-sm" οnclick="queryTermExpand();">查询用户</button>
									</div>
									<div id="queryTerm" style="display: none;width: auto;">
									<form action="/queryUserInfoList" method="get">
										<div class="card-content">
											<table style="border: 1px solid #DDDDDD;">
												<tr>
													<td width="20%">
														<div style="margin-left: 60px; margin-top: 10px;">
															<p style="margin-top: 10px;">
																<label>姓名</label>
																<input style="margin-left: 50px; margin-top: -37px; width: 75%;height: 35px" name="displayNm" id="displayNm" th:value="${displayNm}" class="form-control" type="text"/>
															</p>
														</div>
													</td>
													<td> </td>
													<td>
														<div style="margin-left: 60px; margin-top: 20px;">
															<p style="margin-top: 10px;">
																<label>用户状态:</label> <select name="isdel">
																	<option value="">请选择</option>
																	<option th:selected="${isdel}==0" value="0">正常</option>
																	<option th:selected="${isdel}==1" value="1">停用</option>
																</select>
															</p>
														</div>
													</td>
													<td>
														<div class="col"
															style="margin-top: 10px; margin-right: -50px; margin-bottom: 10px;">
															<ul class="tabs">
																<li>
																	<button class="btn btn-outline-primary btn-sm" type="submit">确定</button>
																</li>
															</ul>

															<ul class="tabs" style="margin-top: 5px;">
																<li>
																	<button class="btn btn-outline-primary btn-sm" type="reset">重置</button>
																</li>
															</ul>
														</div>
													</td>
												</tr>
											</table>
										</div>
									</form>
									</div>
									<div class="card-content">
										<div class="table-responsive">
											<table class="table table-striped table-bordered table-hover"
												id="dataTables-example">
												<thead>
													<tr>
														<th width="10%" class="center">用户ID</th>
														<th width="10%" class="center">用户名</th>
														<th width="8%" class="center">英文名</th>
														<th width="5%" class="center">性别</th>
														<th width="10%" class="center">手机号</th>
														<th width="10%" class="center">birthDay</th>
														<th width="5%" class="center">用户状态</th>
														<th width="12%" class="center">操作</th>
													</tr>
												</thead>
												<tbody>
													<tr id="table" class="odd gradeX"
														th:each="user : ${userInfoList}">
														<th scope="row" th:text="${user.id}"></th>
														<td class="center" th:text="${user.displayNm}"></td>
														<td class="center" th:text="${user.username}"></td>
														<td class="center" th:if="${user.userGender}==0" th:text="男"></td>
														<td class="center" th:if="${user.userGender}==1" th:text="女"></td>
														<td class="center" th:text="${user.phone}"></td>
														<td class="center" th:text="${user.birthDay}"></td>
														<td class="center" th:if="${user.isdel}==0" th:text="正常"></td>
														<td class="center" th:if="${user.isdel}==1" th:text="停用"></td>
														<td class="center">
															<button id="btn_view" class="btn btn-outline-primary btn-sm"
																th:id="${user.id}" οnclick="viewUserInfo(this);" type="button" data-dismiss="modal" aria-hidden="true">查看</button>
															<button class="btn btn-outline-success btn-sm" th:id="${user.id}" οnclick="updateUserForward(this);">修改</button>
															<button class="btn btn-outline-danger btn-sm" th:id="${user.id}" οnclick="deleteUser(this);">删除</button>
														</td>
													</tr>
												</tbody>
											</table>
											<div th:replace="page/PageTag.html"></div>
										</div>
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>
				<!-- content-wrapper ends -->
				<!-- partial:partials/_footer.html -->
				<footer class="footer">
					<div class="container-fluid clearfix">
						<span class="float-right"> <a href="#">Admin</a>&copy; 2018
						</span>
					</div>
				</footer>
			</div>
		</div>
	</div>
	<input type="hidden" id="contextPath" name="contextPath" th:value="${contextPath}">
</body>
</html>

基本一个流程就结束了,目前做了用户管理,角色管理,角色用户配置,权限管理,角色权限配置

我只是截取了部分demo的代码,完整可参照我GitHub上的项目demo

,写的不怎么好,欢迎大家来指导和指正

下面附上demo画面展示






下面附上GitHu源码地址:spring boot demo

后面我会慢慢的改进

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值