Admin后台管理页面实现步骤01

日志查询模块

日志模块实现整体业务架构设计
Admin后台管理页面实现步骤01_第1张图片

服务端日志分页查询代码基本架构
Admin后台管理页面实现步骤01_第2张图片

服务端分页查询数据基本架构
Admin后台管理页面实现步骤01_第3张图片

创建项目

  • 基本步骤
    1.创建maven web项目,名字为CGB-JT-SYS-V1.01
    2.生成部署描述文件 web.xml(tomcat启动时读取)
    3.修改项目编码为utf-8
    4.设置项目targeted runtimes (Tomcat):提供javaee标准支持,例如servlet
    5.修改项目编译版本project facets (jdk1.8)

  • 步骤实现:
    1.创建maven web项目,名字为CGB-JT-SYS-V1.01
    2.生成部署描述文件 web.xml
    3.修改项目编码为utf-8
    4.设置项目targeted runtimes (Tomcat)
    5.修改项目project facets (jdk1.8)

资源整合

  • 整合流程分析:
    1.整合Spring MVC 环境(一个依赖spring-webmvc)
    2.整合 jackjson库(一个依赖jackjson,用于将对象转换为json串)
    3.整合Druid 连接池(两个依赖:mysql驱动,druid库文件)
    4.整合Mybatis 框架(三个依赖:mybatis,mybatis-spring,spring-jdbc)
    5.整合Junit 单元测试框架

资源整合实现:

  • 第一步:整合Spring MVC 应用组件
    1.添加依赖(spring-webmvc)
    2.添加配置文件(spring-configs.xml)
    配置bean扫描,启用mvc默认配置,配置视图解析器。
    3.配置前端控制器(DispatcherServlet)
    4.启动环境进行测试(启动tomcat测试)。

  • 第二步:整合Druid连接池对象
    1.添加依赖(mysql,druid)
    2.添加configs.properties文件,并定义key/value
    3.配置druid对象(spring-configs.xml)

  • 第三步:整合mybatis框架(用户实现持久层的数据操作)
    1.添加依赖(mybatis,mybatis-spring,spring-jdbc)
    2.配置mybatis(spring-configs.xml)
    说明:配置完成以后部署项目,启动tomcat测试是否有问题.

应用实现

Entity类实现

  • 业务描述:
    定义实体对象(POJO)封装从数据库查询的日志数据实现ORM映射
  • 业务实现
    构建与sys_Logs表对应的实体类型
    a)包名 com.jt.sys.entity
    b)类名 SysLog (实现序列化接口,并定义序列化id)
    c)属性 与表(sys_Logs)中字段有对应关系
    d)方法 set/get/toString
  • 关键代码实现:
package com.jt.sys.entity;

import java.io.Serializable;
import java.util.Date;

/***
 * 日志POJO对象:主要用于实现与jtsys数据库
 * 中sys_logs表之间数据的映射.
 * SysLog对象用户封装用户在系统中的操作日志
 */
public class SysLog implements Serializable {
	private static final long serialVersionUID = 1L;
	/**日志id*/
	private Integer id;
	/**用户名*/
	private String username;
	/**用户操作*/
	private String operation;
	/**请求方法*/
	private String method;
	/**请求参数*/
	private String params;
	/**执行时长(毫秒)*/
	private Long time;
	/**IP地址*/
	private String ip;
	/**创建时间*/
	private Date createdTime;

	/**设置*/
	public void setId(Integer id) {
		this.id = id;
	}
	/**获取*/
	public Integer getId() {
		return id;
	}
	/**设置:用户名*/
	public void setUsername(String username) {
		this.username = username;
	}
	/**获取:用户名*/
	public String getUsername() {
		return username;
	}
	/**设置:用户操作*/
	public void setOperation(String operation) {
		this.operation = operation;
	}
	/** 获取:用户操作*/
	public String getOperation() {
		return operation;
	}
	/**设置:请求方法 */
	public void setMethod(String method) {
		this.method = method;
	}
	/**获取:请求方法 */
	public String getMethod() {
		return method;
	}
	/**设置:请求参数*/
	public void setParams(String params) {
		this.params = params;
	}
	/**获取:请求参数*/
	public String getParams() {
		return params;
	}
	/**设置:IP地址*/
	public void setIp(String ip) {
		this.ip = ip;
	}
	/**获取:IP地址*/
	public String getIp() {
		return ip;
	}
	/**设置:创建时间*/
	public void setCreateDate(Date createdTime) {
		this.createdTime = createdTime;
	}
	/**获取:创建时间 */
	public Date getCreatedTime() {
		return createdTime;
	}
	
	public Long getTime() {
		return time;
	}

	public void setTime(Long time) {
		this.time = time;
	}
}

说明:
通过此对象除了可以封装从数据库查询的数据,还可以封装客户端请求数据,实现层与层之间数据的传递。

Dao接口实现

  • 业务描述:(核心-查询当前页显示的数据以及总记录数)
    1)接收业务层参数数据
    2)基于参数进行数据查询
    3)将查询结果进行封装
    4)将结果返回给业务层对象

  • 代码实现:创建接口并定义相关方法。
    1)Dao接口定义
    a)包名: com.jt.sys.dao
    b)名字: SysLogDao
    2)方法定义:负责基于条件查询当前页数据
    a)方法名:findPageObjects
    b)参数列表:(String username,Integer startIndex,Integer pageSize)
    c)返回值:List
    3)方法定义:负责基于条件查询总记录数
    a)方法名:getRowCount
    b)参数列表:(String username)
    c)返回值:int

  • 代码实现:

package com.jt.sys.dao;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.jt.sys.entity.SysLog;

/**
 * 用户日志操作的数据层接口
 */
public interface SysLogDao {
     /**
      * 依据条件查询当前页数据
      * @param username 查询条件(按用户名查询)
      * @param startIndex 当前页的起始位置
      * @param pageSize 当前模块的页面大小(每页最多显示多少条记录)
      * @return
      */
	 List findPageObjects(
			 @Param("username") String username,
			 @Param("startIndex") Integer startIndex,
			 @Param("pageSize") Integer pageSize);
	 /**
	  * 按照查询条件统计用户操作日志数
	  * @param username (用户名)
	  * @return 查询到的记录数,按照这个值以及pageSize
	  * 计算总页数
	  */
	 int getRowCount(@Param("username")String username);
}

说明:
1)当DAO中方法参数多余一个时尽量使用@Param注解进行修饰并指定名字,然后再Mapper文件中便可以通过类似#{username}方式进行获取,否则只能通过#{0},#{1}或者#{param1},#{param2}等方式进行获取。
2)当DAO方法中的参数应用在动态SQL中时无论多少个参数,尽量使用@Param注解进行修饰并定义。

Mapper文件实现
业务描述
1)基于Dao接口创建映射文件
2)基于Dao方法在映射文件中创建映射元素建映射元素
业务实现

  1. 创建映射文件
    a)包名:mapper.sys
    b)文件名:SysLogMapper.xml
    c)命名空间 com.jt.sys.dao.SysLogDao
  2. 创建映射元素实现翻页查询操作
    a)元素名 select
    b)元素id findPageObjects
    c)参数类型 (不写)
    d)结果类型 com.jt.sys.entity.SysLog
    e)SQL定义 select * from sys_Logs where name like ? limit ?,?
  3. 创建映射元素实现查询统计操作
    a)元素名 select
    b)元素id getRowCount
    c)参数类型 (不写)
    d)结果类型 int
    e)SQL定义 select count(*) from sys_Logs where name like ?

代码实现:





javascript
// An highlighted block
   
   
        
            
             username like concat("%",#{username},"%")
            
          
   
   
   
   

Service接口及实现类

  • 业务描述:核心业务就是分页查询数据并对数据进行封装。
    1)通过参数变量接收控制层数据(例如username,pageCurrent)
    2)对数据进行合法验证(例如pageCurrent不能小于1)
    3)基于参数数据进行总记录数查询(通过此结果要计算总页数)
    4)基于参数数据进行当前页记录的查询(username,startIndex,pageSize)
    5)对数据进行封装(例如封装分页信息和当前页记录)

  • 业务实现
    1)业务值对象定义:(封装分页信息以及当前数据)
    a)包名 com.jt.common.vo (封装值的对象)
    b)类名 PageObject (实现序列化接口并添加序列化id)
    c)属性 (总行数,总页数,当前页码,页面大小,当前页记录信息)
    d)方法 (set/get)

  • 代码实现:

package com.jt.common.vo;

import java.io.Serializable;
import java.util.List;

/**
 * VO:value object --值对象
 * 借助此对象封装业务层数据
 * 1.当前页要呈现的记录
 * 2.分页信息
 * @param  类上定义的泛型参数
 */
public class PageObject implements Serializable {
	private static final long serialVersionUID = 6780580291247550747L;//类泛型
    /**当前页的页码值*/
	private Integer pageCurrent=1;
    /**页面大小*/
    private Integer pageSize=3;
    /**总行数(通过查询获得)*/
    private Integer rowCount=0;
    /**总页数(通过计算获得)*/
    private Integer pageCount=0;
    /**当前页记录*/
    private List records;
	public Integer getPageCurrent() {
		return pageCurrent;
	}
	public void setPageCurrent(Integer pageCurrent) {
		this.pageCurrent = pageCurrent;
	}
	public Integer getPageSize() {
		return pageSize;
	}
	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}
	public Integer getRowCount() {
		return rowCount;
	}
	public void setRowCount(Integer rowCount) {
		this.rowCount = rowCount;
	}
	
	public Integer getPageCount() {
		return pageCount;
	}
	public void setPageCount(Integer pageCount) {
	   this.pageCount = pageCount;
	}
	public List getRecords() {
		return records;
	}
	public void setRecords(List records) {
		this.records = records;
	} 
}
  • 接口定义:为控制层请求提供服务
    a)包名 com.jt.sys.service
    b)类名 SysLogService

  • 接口方法定义:
    a)方法名 findPageObjects
    b)参数列表 (String username,Integer pageCurrent)
    c)返回值 PageObject

关键代码实现:

package com.jt.sys.service;

import com.jt.common.vo.PageObject;
import com.jt.sys.entity.SysLog;
/**
 * 日志模块业务层接口
 * @author Administrator
 */
public interface SysLogService {
	/**
	 * 按照条件分页查询用户日志数据
	 * @param username 查询条件(按用户名查询操作日志)
	 * @param pageCurrent 当前页的页码值
	 * @return 当前页记录有以及分页信息
	 */
	PageObject findPageObjects(
			String username,
			Integer pageCurrent);
}
  • 接口实现类的定义:
    a)包名 com.jt.sys.service.impl
    b)类名 SysLogServiceImpl

  • 代码实现

package com.jt.sys.service.impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jt.common.exception.ServiceException;
import com.jt.common.vo.PageObject;
import com.jt.sys.dao.SysLogDao;
import com.jt.sys.entity.SysLog;
import com.jt.sys.service.SysLogService;

@Service
public class SysLogServiceImpl implements SysLogService {
	@Autowired//自动装配
	private SysLogDao sysLogDao;
	
	@Override
	public PageObject findPageObjects(String username, Integer pageCurrent) {
		//验证参数合法性校验
		if(pageCurrent==null||pageCurrent<1)
			throw new IllegalArgumentException("页码值无效");
		//按照条件查询总记录数并进行校验
		int rowCount=sysLogDao.getRowCount(username);
		if(rowCount==0)
			throw new ServiceException("没有对应记录");
		//按照条件查询当前页记录
		int pageSize=3;
		int startIndex=(pageCurrent-1)*pageSize;
		List records = sysLogDao.findPageObjects(username, startIndex, pageSize);
		//封装查询结果并返回
		PageObject pageObject=new PageObject();
		pageObject.setRecords(records);
		pageObject.setRowCount(rowCount);
		pageObject.setPageCount(pageCurrent);
		pageObject.setPageSize(pageSize);
		//计算总页数:方法一
		int pageCount=rowCount/pageSize;
		if(rowCount%pageSize!=0){
			pageCount++;
		}
		//方法二
		//int pageCount=(rowCount-1)/pageSize+1;
		pageObject.setPageCount(pageCount);
		return pageObject;
	}
  • 说明:在当前方法中需要的ServiceException是一个自己定义的异常,代码如下
package com.jt.common.exception;

/**
 * 自定义异常
 * @author Administrator
 * 更加精确的定位问题
 * 更加友好的描述异常
 */
public class ServiceException extends RuntimeException{
	private static final long serialVersionUID = 8029523183323748146L;

	public ServiceException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

	public ServiceException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public ServiceException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public ServiceException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}
	
}

说明:通过自定义异常可更好的定位错误,确定问题以便提供用户体验。

Controller类的实现

  • 业务描述:核心业务是处理客户端请求
    1)接收客户端请求中的数据
    2)基于请求调用业务方法进行请求处理
    3)对处理结果进行封装(JsonResult)
    4)将结果转换为json格式的字符串(适配不同客户端)
    5)将字符串通过服务器输出到客户端。

业务实现:

  • 值对象定义:(封装控制层方法的返回结果)
    a)包名: com.jt.common.vo
    b)类名: JsonResult
    c)属性: (状态码,状态信息,正确数据):
    d)方法: (set/get,构造方法)

  • Controller方法定义:(在SysLogController中定义请求处理方法)
    a)方法名 doFindPageObjects
    b)参数列表 (String name,Integer pageCurrent)
    c)返回值 JsonResult
    d)映射 doFindPageObjects

  • 统一异常处理类的定义
    a)包名 com.jt.common.web
    b)类名 GlobalExceptionHandler
    c)注解 @ControllerAdvice

  • 异常类中方法定义(处理参数异常的方法)
    a)方法名 doHandleRuntimeException
    b)参数列表 RuntimeException
    c)返回值 JsonResult
    d)注解描述(@ResponseBody,@ExceptionHandler)

  • 关键代码实现:
    封装控制层值的对象

  public class JsonResult implements Serializable {
            	private static final long serialVersionUID = -856924038217431339L;//SysResult/Result/R
            	/**状态码*/
            	private int state=1;//1表示SUCCESS,0表示ERROR
            	/**状态信息*/
            	private String message="ok";
            	/**正确数据*/
            	private Object data;
            	public JsonResult() {}
            	public JsonResult(String message){
            		this.message=message;
            	}
            	/**一般查询时调用,封装查询结果*/
            	public JsonResult(Object data) {
            		this.data=data;
            	}
            	/**出现异常时时调用*/
            	public JsonResult(Throwable t){
            		this.state=0;
            		this.message=t.getMessage();
            	}
            	public int getState() {
            		return state;
            	}
            	public void setState(int state) {
            		this.state = state;
            	}
            	public String getMessage() {
            		return message;
            	}
            	public void setMessage(String message) {
            		this.message = message;
            	}
            	public Object getData() {
            		return data;
            	}
            	public void setData(Object data) {
            		this.data = data;
            	}
            }

Controller方法定义

  • 业务描述:核心业务是处理客户端请求
    1)接收客户端请求中的数据
    2)基于请求调用业务方法进行请求处理
    3)对处理结果进行封装(JsonResult)
    4)将结果转换为json格式的字符串(适配不同客户端)
    5)将字符串通过服务器输出到客户端。

  • 业务实现:

  • 值对象定义:封装控制层方法的返回结果
    a)包名: com.jt.common.vo
    b)类名: JsonResult
    c)属性: (状态码,状态信息,正确数据)
    d)方法: (set/get,构造方法)

  • Controller方法定义:在SysLogController中定义请求处理方法
    a)方法名 doFindPageObjects
    b)参数列表 (String name,Integer pageCurrent)
    c)返回值 JsonResult
    d)映射 doFindPageObjects

  • 统一异常处理类的定义
    a)包名 com.jt.common.web
    b)类名 GlobalExceptionHandler
    c)注解 @ControllerAdvice

  • 异常类中方法定义 : 处理参数异常的方法
    a)方法名 doHandleRuntimeException
    b)参数列表 RuntimeException
    c)返回值 JsonResult
    d)注解描述(@ResponseBody,@ExceptionHandler)

  • 关键代码实现:
    封装控制层值的对象

package com.jt.common.vo;

import java.io.Serializable;

/**
 * VO:通过此对象实现控制层数据的封装操作
 * @author Administrator
 * 规范
 * 控制层返回的所有数据只要不是页面,必须通过此对象进行封装
 */
public class JsonResult implements Serializable {
	private static final long serialVersionUID = -856924038217431339L;//SysResult/Result/R
	/**状态码:1正确,0错误 */
	private int state=1;//1表示SUCCESS,0表示ERROR
	/**状态码对应信息*/
	private String message="ok";
	/**要呈现的正确数据*/
	private Object data;//必须为data
	
	/**构造函数*/
	public JsonResult() {}
	public JsonResult(String message){
		this.message=message;
	}
	/**一般查询时调用,封装查询结果*/
	public JsonResult(Object data) {
		this.data=data;
	}
	/**出现异常时时调用*/
	public JsonResult(Throwable t){
		this.state=0;
		this.message=t.getMessage();
	}
	/**Get Set方法*/
	public int getState() {
		return state;
	}
	public void setState(int state) {
		this.state = state;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
}

Controller方法定义

package com.jt.sys.controller;

import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jt.common.vo.JsonResult;
import com.jt.common.vo.PageObject;
import com.jt.sys.entity.SysLog;
import com.jt.sys.service.SysLogService;

/**
 * 用户控制层对象定义
 * @author Administrator
 * http://localhost/CGB-JT-SYS-V1.01/log/
 */
@Controller
@RequestMapping("/log/")
public class SysLogController {
	@Autowired
	private SysLogService sysLogService;
	
	/**从业务层获取的数据,又封装到JsonResult
	 * String username:用来接收参数
	 */
	@RequestMapping("doFindPageObjects")
	@ResponseBody//返回一个JSON串
	public JsonResult doFindPageObjects(
			String username,
			Integer pageCurrent){
		PageObject data=sysLogService.findPageObjects(username, pageCurrent);
		return new JsonResult(data);
	}
}

页面
Admin后台管理页面实现步骤01_第4张图片

统一异常类及方法定义

package com.jt.common.web;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jt.common.vo.JsonResult;

/**
 * @ControllerAdvice:交给Spring管理,全局异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {
	/**
	 * @ExceptionHandler 此注解描述的方法表示是一个异常处理方法
	 * RuntimeException.class 定义异常类型,要<=方法中的异常
	 * @param e
	 * @return 封装了异常信息的JsonResult对象
	 * JDK中的自带的日志API
	 */
	@ExceptionHandler(RuntimeException.class)
	@ResponseBody
	public JsonResult doHandlerRuntimeException(RuntimeException e){
		//后台异常 也可以写日志
		e.printStackTrace();
		//用户异常 封装异常信息
		return new JsonResult(e);
	}
}

错误界面
Admin后台管理页面实现步骤01_第5张图片

你可能感兴趣的:(Admin后台管理页面实现步骤01)