权限管理、旅游系统后篇
SSM权限操作
1.数据库与表结构
1.1 用户表
1.1.1 用户表信息描述users
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | varchar2 | 无意义,主键uuid |
2 | varchar2 | 非空,唯一 | |
3 | username | varchar2 | 用户名 |
5 | password | varchar2 | 密码(加密) |
6 | phoneNum | varchar2 | 电话 |
7 | status | int | 状态0 未开启 1 开启 |
1.1.2 sql语句
CREATE TABLE users(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
email VARCHAR2(50) UNIQUE NOT NULL,
username VARCHAR2(50),
PASSWORD VARCHAR2(50),
phoneNum VARCHAR2(20),
STATUS INT
)
1.1.3 实体类
/**
* @outhor Mr.JK
* @create 2020-05-02 15:32
* 与数据库中的users对应
*/
public class UserInfo {
private String id;
private String username;
private String email;
private String password;
private String phoneNum;
private int status;
private String statusStr;
private List<Role> roles;
}
1.2 角色表
1.2.1 角色表信息描述role
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | varchar2 | 无意义,主键uuid |
2 | roleName | varchar2 | 角色名 |
3 | roleDesc | varchar2 | 角色描述 |
1.2.2 sql语句
CREATE TABLE role(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
roleName VARCHAR2(50) ,
roleDesc VARCHAR2(50)
)
1.2.3 实体类
public class Role {
private String id;
private String roleName;
private String roleDesc;
private List<Permission> permissions;
private List<User> users;
}
1.2.4 用户与角色关联关系
用户与角色之间是多对多关系,我们通过user_role表来描述其关联,在实体类中User中存在List,在Role中有List.而角色与权限之间也存在关系,我们会在后面介绍。
CREATE TABLE users_role(
userId varchar2(32),
roleId varchar2(32),
PRIMARY KEY(userId,roleId),
FOREIGN KEY (userId) REFERENCES users(id),
FOREIGN KEY (roleId) REFERENCES role(id)
)
1.3 资源权限表
1.3.1 权限资源表描述permission
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | varchar2 | 无意义,主键uuid |
2 | permissionName | varchar2 | 权限名 |
3 | url | varchar2 | 资源路径 |
1.3.2 sql语句
CREATE TABLE permission(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
permissionName VARCHAR2(50) ,
url VARCHAR2(50)
)
1.3.3 实体类
public class Permission {
private String id;
private String permissionName; private String url;
private List<Role> roles;
}
1.3.4.权限资源与角色关联关系
权限资源与角色是多对多关系,我们使用role_permission表来描述。在实体类Permission中存在List,在Role类中有List
CREATE TABLE role_permission(
permissionId varchar2(32),
roleId varchar2(32),
PRIMARY KEY(permissionId,roleId),
FOREIGN KEY (permissionId) REFERENCES permission(id),
FOREIGN KEY (roleId) REFERENCES role(id)
)
2.用户管理
2.1 用户登录
spring security的配置
<security:authentication-manager>
<security:authentication-provider user-service-ref="userService">
<!-- 配置加密的方式
<security:password-encoder ref="passwordEncoder"/> -->
</security:authentication-provider>
</security:authentication-manager>
2.1.1.登录页面login.jsp
详细页面请查看资料
2.1.2.Service
public interface IUserService extends UserDetailsService{
}
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = null;
try {
userInfo = userDao.findByUsername(username);
} catch (Exception e) {
e.printStackTrace();
}
//处理自己的用户对象封装成UserDetails
User user = new User(userInfo.getUsername(),userInfo.getPassword(),userInfo.getStatus()== 0?false:true,true,true,true, getAuthority(userInfo.getRoles()));
return user;
}
//作用就是返回一个List集合,集合中装入的是角色描述
public List<SimpleGrantedAuthority> getAuthority(List<Role> roles){
List<SimpleGrantedAuthority> list = new ArrayList<SimpleGrantedAuthority>();
for (Role role : roles){
list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
}
return list;
}
}
2.1.3.IUserDao
/**
* @outhor Mr.JK
* @create 2020-05-02 15:32
*/
public interface IUserDao {
@Select("select * from users where username=#{username}")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "username",column = "username"),
@Result(property = "email",column = "email"),
@Result(property = "password",column = "password"),
@Result(property = "phoneNum",column = "phoneNum"),
@Result(property = "status",column = "status"),
@Result(property = "roles",column = "id",javaType = java.util.List.class,many = @Many(select = "com.jk.ssm.dao.IRoleDao.findRoleByUserId"))
})
UserInfo findByUsername(String username) throws Exception;
}
2.2 用户退出
使用spring security完成用户退出,非常简单
配置
<security:logout invalidate-session="true" logout-url="/logout.do" logout-success- url="/login.jsp" />
页面中
<a href="${pageContext.request.contextPath}/logout.do"
class="btn btn-default btn-flat">注销</a>
2.3 用户查询
2.3.1.用户查询页面 user-list.jsp
请在资料中查看具体代码
2.3.2.UserController
@Controller @RequestMapping("/user")
public class UserControlller {
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
List<UserInfo> users = userService.findAll();
ModelAndView mv = new ModelAndView();
mv.addObject("userlist", users);
mv.setViewName("user-list");
return mv;
}
}
2.3.3.Dao
@Select("select * from user")
public List<UserInfo> findAll();
2.4 用户添加
2.4.1.用户添加页面 user-add.jsp
请在资料中查看具体页面码
2.4.2.UserController
@Controller @RequestMapping("/user")
public class UserControlller {
@Autowired
private IUserService userService;
@RequestMapping("/save.do")
public String save(UserInfo user) throws Exception {
userService.save(user);
return "redirect:findAll.do";
}
}
2.4.3.Service
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public void save(UserInfo user) throws Exception { user.setPassword(passwordEncoder.encode(user.getPassword())); userDao.save(user);
}
}
前期我们的用户密码没有加密,现在添加用户时,我们需要对用户密码进行加密
<!-- 配置加密类 -->
<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
2.4.4.Dao
@Insert("insert into user(email,username,password,phoneNum,status) value(#{email},#
{username},#{password},#{phoneNum},#{status})")
public void save(UserInfo user) throws Exception;
2.5 用户详情
3.5.1.用户详情页面user-show.jsp
请在资料中查看页面详细代码
注意:需要添加js
$("#collapse-table").treetable({
expandable : true
});
3.5.2.UserController
@Controller @RequestMapping("/user")
public class UserControlller {
@Autowired
private IUserService userService; @RequestMapping("/findById.do")
public ModelAndView findById(@RequestParam(name = "id", required = true) Long id) throws
Exception {
UserInfo user = userService.findById(id);
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("user-show");
return mv;
}
}
3.5.3.Dao
@Select("select * from user where id=#{id}")
@Results({ @Result(id = true, property = "id", column = "id"), @Result(column = "username", property = "username"),
@Result(column = "email", property = "email"), @Result(column =
"password", property = "password"),
@Result(column = "phoneNum", property = "phoneNum"), @Result(column =
"status", property = "status"),
@Result(column = "id", property = "roles", javaType = List.class, many =
@Many(select = "com.itheima.ssm.dao.IRoleDao.findRoleByUserId")) })
public UserInfo findById(Long id) throws Exception;
@Select("select * from role where id in( select roleId from user_role where userId=#{userId})")
@Results(
{
@Result(id=true,column="id",property="id"), @Result(column="roleName",property="roleName"), @Result(column="roleDesc",property="roleDesc"),
@Result(column="id",property="permissions",javaType=List.class,many=@Many(select="com.itheima.ssm
.dao.IPermissionDao.findByRoleId"))
})
public List<Role> findRoleByUserId(Long userId);
我们需要将用户的所有角色及权限查询出来所以需要调用IRoleDao中的findRoleByUserId,而在IRoleDao中需要调用IPermissionDao的findByRoleId
@Select("select * from permission where id in (select permissionId from role_permission where
roleId=#{roleId})")
public List<Permission> findByRoleId(Long roleId);
3.角色管理
3.1 角色查询
3.1.1.角色页面role-list.jsp
请在资料中查看页面详细代码
3.1.2.RoleControlller
@RequestMapping("/role")
@Controller
public class RoleController {
@Autowired
private IRoleService roleService;
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
List<Role> roleList = roleService.findAll();
ModelAndView mv = new ModelAndView();
mv.addObject("roleList", roleList);
mv.setViewName("role-list");
return mv;
}
}
3.1.3.Dao
@Select("select * from role")
public List<Role> findAll();
3.2 角色添加
3.2.1.角色添加页面role-add.jsp
请在页面中查看详细代码
3.2.2.RoleControlller
@RequestMapping("/role")
@Controller
public class RoleController {
@Autowired
private IRoleService roleService;
@RequestMapping("/save.do")
public String save(Role role) {
roleService.save(role);
return "redirect:findAll.do";
}
}
3.2.3.Dao
@Insert("insert into role(roleName,roleDesc) value(#{roleName},#{roleDesc})")
public void save(Role role);
4.资源权限管理
4.1 资源权限查询
4.1.1.权限资源页面permission-list.jsp
请在资料中查看详细代码
4.1.2.PermissionController
@RequestMapping("/permission")
@Controller
public class PermissionController {
@Autowired
private IPermissionService permissionService;
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
List<Permission> permissionList = permissionService.findAll();
ModelAndView mv = new ModelAndView();
mv.addObject("permissionList", permissionList);
mv.setViewName("permission-list");
return mv;
}
}
4.1.3.Dao
@Select("select * from permission")
public List<Permission> findAll();
4.2 资源权限添加
4.2.1.权限资源添加页面permission-add.jsp
请在资料中查看页面详细代码
4.2.2.PermissionController
@RequestMapping("/permission")
@Controller
public class PermissionController {
@Autowired
private IPermissionService permissionService;
@RequestMapping("/save.do")
public String save(Permission p) throws Exception {
permissionService.save(p);
return "redirect:findAll.do";
}
}
4.2.3.Dao
@Insert("insert into permission(permissionName,url) value(#{permissionName},#{url})")
public void save(Permission p);
5.权限关联与控制
5.1 用户角色关联
用户与角色之间是多对多关系,我们要建立它们之间的关系,只需要在中间表user_role插入数据即可。
5.1.1. 用户角色关联相关页面
在user-list.jsp页面上添加链接
<a href="${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id=${user.id}" class="btn bg-olive btn-xs">添加角色</a>
展示可以添加角色的页面user-roe-add.jsp
请在资料中查看页面详细代码
5.1.2.UserController
findUserByIdAndAllRole(Long id)方法
此方法用于查找要操作的用户及可以添加的角色,参数是要操作的用户id
@RequestMapping("/findUserByIdAndAllRole.do")
public ModelAndView findUserByIdAndAllRole(Long id) throws Exception {
UserInfo user = userService.findById(id);
List<Role> roleList = roleService.findOtherRole(id);
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.addObject("roleList", roleList);
mv.setViewName("user-role-add");
return mv;
}
调用IUserService的findById方法获取要操作的User
调用IRoleService的findOtherRole方法用于获取可以添加的角色信息
addRoleToUser(Long userId,Long[] ids)方法
些方法用于在用户与角色之间建立关系,参数userId代表要操作的用户id,参数ids代表的是角色id数组
@RequestMapping("/addRoleToUser.do")
public String addRoleToUser(Long userId, Long[] ids) throws Exception {
userService.addRoleToUser(userId,ids);
return "redirect:findAll.do";
}
5.1.3.Dao
IRoleDao
@Select("select * from role where id not in( select roleId from user_role where userId=# {id})")
public List<Role> findOtherRole(Long id);
用于查找可以添加的角色
IUserDao
@Insert("insert into user_role(userId,roleId) value(#{userId},#{roleId})")
public void addRoleToUser(@Param("userId") Long userId, @Param("roleId") Long roleId);
用于添加用户与角色关系
5.2 角色权限关联
角色权限之间是多对多关系,我们要建立它们之间的关系,只需要在中间表role_permission插入数据即可。
5.2.1. 角色权限关联相关页面
在role-list.jsp页面上添加链接
a href="${pageContext.request.contextPath}/role/findRoleByIdAndAllPermission.do?
id=${role.id}" class="btn bg-olive btn-xs">添加权限</a>
展示可以添加权限的页面roe-permission-add.jsp
请在资料中查看页面详细代码
5.2.2.RoleController
findRoleByIdAndAllPermission(Long roleId)方法
此方法用于查找要操作的角色及可以添加的权限,参数是要操作的角色id
@RequestMapping("/findRoleByIdAndAllPermission.do")
public ModelAndView findRoleByIdAndAllPermission(@RequestParam(name = "id", required = true) Long roleid) throws Exception {
ModelAndView mv = new ModelAndView();
Role role = roleService.findById(roleid);
mv.addObject("role", role);
List<Permission> permissionList =permissionService.findOtherPermission(roleid); mv.addObject("permissionList", permissionList);
mv.setViewName("role-permission-add");
return mv;
}
调用IRoleService的findById方法获取要操作的Role
调用IPermissionService的findOtherPermission方法用于获取可以添加的权限信息
addPermissionToRole(Long roleId,Long[] ids)方法
些方法用于在角色与权限之间建立关系,参数roleId代表要操作的角色id,参数permissionIds代表的是权限id数组
@RequestMapping("/addPermissionToRole.do")
public String addPermissionToRole(@RequestParam(name = "roleId") Long roleId, @RequestParam(name = "ids") Long[] permissionIds) throws Exception {
roleService.addPermissionToRole(roleId, permissionIds);
return "redirect:findAll.do";
}
5.2.3.Dao
IPermissionDao
@Select("select * from permission where id not in (select permissionId from role_permission where roleId=#{roleId})")
public List<Permission> findOtherPermission(Long roleid);
用于查找可以添加的权限
IRoleDao
@Insert("insert into role_permission (roleId,permissionId) value (#{roleId},# {permissionId})")
public void addPermissionToRole(@Param("roleId") Long roleId, @Param("permissionId") Long permissionId);
用于绑定角色与权限的关系
5.3 服务器端方法级权限控制
在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制。Spring Security在方法的权限控制上支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启用的,需要单独通过global-method-security元素的对应属性进行启用
5.3.1.开启注解使用
配置文件
<security:global-method-security jsr250-annotations="enabled"/>
<security:global-method-security secured-annotations="enabled"/> <security:global-method-security pre-post-annotations="disabled"/>
注解开启
@EnableGlobalMethodSecurity :Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将AuthenticationManager定义为Bean。
5.3.2.JSR-250注解
@RolesAllowed表示访问对应方法时所应该具有的角色
示例:
@RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN
@PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制@DenyAll是和PermitAll相反的,表示无论什么角色都不能访问
5.3.3.支持表达式的注解
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
示例:
@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P("userId") long userId ){ }
这里表示在changePassword方法执行之前,判断方法参数userId的值是否等于principal中保存的当前用户的userId,或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。
@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
示例:
@PostAuthorize
User getUser("returnObject.userId == authentication.principal.userId or hasPermission(returnObject, 'ADMIN')");
@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值
5.3.4.@Secured注解
@Secured注解标注的方法进行权限控制的支持,其值默认为disabled。
示例:@Secured("IS_AUTHENTICATED_ANONYMOUSLY") public Account readAccount(Long id); @Secured("ROLE_TELLER")
5.4 页面端标签控制权限
在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制
5.4.1.导入
maven导入
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>version</version>
</dependency>
页面导入
<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
5.4.2.常用标签
在jsp中我们可以使用以下三种标签,其中authentication代表的是当前认证对象,可以获取当前认证对象信息,例如用户名。其它两个标签我们可以用于权限控制
5.4.2.1 authentication
<security:authentication property="" htmlEscape="" scope="" var=""/>
property:只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”,不允许直接通过方法进行调用
htmlEscape:表示是否需要将html进行转义。默认为true。
scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认我pageContext。Jsp中拥有的作用范围都进行进行指定
var:用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存放,默认是存放在pageConext中
5.4.2.2 authorize
authorize是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示
<security:authorize access="" method="" url="" var=""></security:authorize>
access: 需要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限
method:method属性是配合url属性一起使用的,表示用户应当具有指定url指定method访问的权限,method的默认值为GET,可选值为http请求的7种方法
url:url表示如果用户拥有访问指定url的权限即表示可以显示authorize标签包含的内容var:用于指定将权限鉴定的结果存放在pageContext的哪个属性中
5.4.2.3 accesscontrollist
accesscontrollist标签是用于鉴定ACL权限的。其一共定义了三个属性:hasPermission、domainObject和var,其中前两个是必须指定的
<security:accesscontrollist hasPermission="" domainObject="" var=""></security:accesscontrollist>
hasPermission:hasPermission属性用于指定以逗号分隔的权限列表
domainObject:domainObject用于指定对应的域对象
var:var则是用以将鉴定的结果以指定的属性名存入pageContext中,以供同一页面的其它地方使用
SSMAOP日志
1.数据库与表结构
1.1.日志表信息描述sysLog
序号 | 字段名称 | 字段类型 | 字段描述 |
---|---|---|---|
1 | id | VARCHAR2 | 主键 无意义uuid |
2 | visitTime | timestamp | 访问时间 |
3 | username | VARCHAR2 | 操作者用户名 |
4 | ip | VARCHAR2 | 访问ip |
5 | url | VARCHAR2 | 访问资源url |
6 | executionTime | int | 执行时长 |
7 | method | VARCHAR | 访问方法 |
1.2.sql语句
CREATE TABLE sysLog(
id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,
visitTime timestamp,
username VARCHAR2(50), ip VARCHAR2(30),
url VARCHAR2(50), executionTime int,
method VARCHAR2(200)
)
1.3.实体类
public class SysLog {
private String id;
private Date visitTime;
private String visitTimeStr;
private String username;
private String ip;
private String url;
private Long executionTime;
private String method;
}
2.基于AOP日志处理
2.1.页面syslog-list.jsp
详细内容请查看资源中页面信息
2.2.创建切面类处理日志
/**
* @outhor Mr.JK
* @create 2020-05-05 9:19
*/
@Controller
@Aspect
public class LogAop {
@Autowired
private HttpServletRequest request;
@Autowired
private ISysLogService sysLogService;
private Date visitTime;//开始的时间
private Class clazz;//访问的类
private Method method;//访问的方法
//前置通知 主要是获取开始时间,执行的类是哪一个,执行的是哪个方法
@Before("execution(* com.jk.ssm.controller.*.*(..))")
public void doBefore(JoinPoint jp) throws NoSuchMethodException {
visitTime = new Date();//当前时间就是开始访问的时间
clazz = jp.getTarget().getClass();//具体要访问的类
String methodName = jp.getSignature().getName();//获取访问方法的名称
Object[] args = jp.getArgs();//获取访问的方法的参数
if (args == null || args.length == 0){
method = clazz.getMethod(methodName); //只能获取无参数的方法
}else {
Class[] classArgs = new Class[args.length];
for (int i = 0; i < args.length; i++) {
classArgs[i] = args[i].getClass();
}
clazz.getMethod(methodName,classArgs);
}
}
//后置通知
@After("execution(* com.jk.ssm.controller.*.*(..))")
public void doAfter(JoinPoint jp) throws Exception {
Long time = new Date().getTime() - visitTime.getTime();
String url = "";
if (clazz.getName() == "com.jk.ssm.controller.SysLogController"){
return;
}
//获取url
if (clazz != null && method != null && clazz != LogAop.class){
//获取类上的注解
RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
if (classAnnotation != null){
String[] classValue = classAnnotation.value();
//2.获取方法上的注解
RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
if (methodAnnotation != null){
String[] methodValue = methodAnnotation.value();
url = classValue[0] + methodValue[0];
//获取访问的ip
String ip = request.getRemoteAddr();
//获取当前操作的用户
SecurityContext context = SecurityContextHolder.getContext();//从上下文中获取当前的用户
User user = (User) context.getAuthentication().getPrincipal();
String username = user.getUsername();
SysLog sysLog = new SysLog();
sysLog.setExecutionTime(time);
sysLog.setIp(ip);
sysLog.setMethod("[类名]" + clazz.getName() + "[方法名]" + method.getName());
sysLog.setUrl(url);
sysLog.setUsername(username);
sysLog.setVisitTime(visitTime);
//调用
sysLogService.save(sysLog);
}
}
}
}
}
在切面类中我们需要获取登录用户的username,还需要获取ip地址,我们怎么处理?
username获取SecurityContextHolder获取ip地址获取
ip地址的获取我们可以通过request.getRemoteAddr()方法获取到。
在Spring中可以通过RequestContextListener来获取request或session对象。
2.3.SysLogController
@Controller
@RequestMapping("/sysLog")
public class SysLogController {
@Autowired
private ISysLogService sysLogService;
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
ModelAndView mv = new ModelAndView();
List<SysLog> sysLogList = sysLogService.findAll();
mv.addObject("sysLogs",sysLogList);
mv.setViewName("syslog-list");
return mv;
}
}
2.4.Service
/**
* @outhor Mr.JK
* @create 2020-05-05 10:13
*/
@Service
@Transactional
public class SysLogServiceImpl implements ISysLogService {
@Autowired
private ISysLogDao sysLogDao;
public void save(SysLog sysLog) throws Exception {
sysLogDao.save(sysLog);
}
public List<SysLog> findAll() throws Exception {
return sysLogDao.findAll();
}
}
2.5.Dao
/**
* @outhor Mr.JK
* @create 2020-05-05 10:14
*/
public interface ISysLogDao {
@Insert("insert into sysLog(visitTime,username,ip,url,executionTime,method) values(#{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})")
void save(SysLog sysLog) throws Exception;
@Select("select * from sysLog")
List<SysLog> findAll() throws Exception;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!