AdminService里面的方法。
登录功能RespBean login(String username, String password, String code, HttpServletRequest request);
Admin getAdminByUserName(String username);
@Override
public Admin getAdminByUserName(String username) {
return adminMapper.selectOne(new QueryWrapper<Admin>().eq("username", username).eq("enabled", true));
}
List<Role> getRoles(Integer adminId);
@Override
public List<Role> getRoles(Integer adminId) {
return roleMapper.getRoles(adminId);
}
public interface RoleMapper extends BaseMapper<Role> {
List<Role> getRoles(Integer adminId);
}
RoleMapper.xml
<?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.xxxx.server.mapper.RoleMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.xxxx.pojo.Role">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="nameZh" property="nameZh" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, nameZh
</sql>
<select id="getRoles" resultType="com.xxxx.server.pojo.Role">
SELECT
r.id,
r.`name`,
r.nameZh
FROM
t_role AS r
LEFT JOIN t_admin_role AS ar ON r.id = ar.rid
WHERE
ar.adminId = #{adminId}
</select>
</mapper>
List<Admin> getAllAdmins(String keywords);
@Override
public List<Admin> getAllAdmins(String keywords) {
return adminMapper.getAllAdmins(AdminUtils.getCurrentAdmin().getId(), keywords);
}
AdminMapper.xml
<?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.xxxx.server.mapper.AdminMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.xxxx.pojo.Admin">
<id column="id" property="id" />
<result column="name" property="name" />
<result column="phone" property="phone" />
<result column="telephone" property="telephone" />
<result column="address" property="address" />
<result column="enabled" property="enabled" />
<result column="username" property="username" />
<result column="password" property="password" />
<result column="userFace" property="userFace" />
<result column="remark" property="remark" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, name, phone, telephone, address, enabled, username, password, userFace, remark
</sql>
<resultMap id="AdminWithRole" type="com.xxxx.server.pojo.Admin" extends="BaseResultMap">
<collection property="roles" ofType="com.xxxx.server.pojo.Role">
<id column="rid" property="id" />
<result column="rname" property="name" />
<result column="rnameZh" property="nameZh" />
</collection>
</resultMap>
<select id="getAllAdmins" resultMap="AdminWithRole">
SELECT
a.*,
r.id AS rid,
r.`name` AS rname,
r.nameZh AS rnameZh
FROM
t_admin a
LEFT JOIN t_admin_role ar ON a.id = ar.adminId
LEFT JOIN t_role r ON r.id = ar.rid
WHERE
a.id != #{id}
<if test="null!=keywords and ''!=keywords">
AND a.`name` LIKE CONCAT( '%', #{keywords}, '%' )
</if>
ORDER BY
a.id
</select>
</mapper>
RespBean updateAdminRole(Integer adminId, Integer[] rids);
@Override
@Transactional
public RespBean updateAdminRole(Integer adminId, Integer[] rids) {
adminRoleMapper.delete(new QueryWrapper<AdminRole>().eq("adminId", adminId));
Integer result = adminRoleMapper.addAdminRole(adminId, rids);
if (rids.length==result){
return RespBean.success("更新成功");
}
return RespBean.error("更新失败");
}
这里用到了事务控制。
RespBean updateAdminPassword(String oldPass, String pass, Integer adminId);
@Override
public RespBean updateAdminPassword(String oldPass, String pass, Integer adminId) {
Admin admin = adminMapper.selectById(adminId);
BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
if (encoder.matches(oldPass, admin.getPassword())){
admin.setPassword(encoder.encode(pass));
int result = adminMapper.updateById(admin);
if (result==1){
return RespBean.success("更新成功");
}
}
return RespBean.error("更新失败");
}
RespBean updateAdminUserFace(String url, Integer id, Authentication authentication);
@Override
public RespBean updateAdminUserFace(String url, Integer id, Authentication authentication) {
Admin admin = adminMapper.selectById(id);
admin.setUserFace(url);
int result = adminMapper.updateById(admin);
if (result==1){
Admin principal = (Admin) authentication.getPrincipal();
principal.setUserFace(url);
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(admin, null, authentication.getAuthorities()));
return RespBean.success("更新成功", url);
}
return RespBean.error("更新失败");
}
更新用户头像方法被AdminInfoController调用,该方法传入了url(新头像的url,是从FastDFS中获取的)、id(用户id)和authentication(应该是框架自动传入的),先把新头像的url更新到t_admin表中,更新成功后再把Spring Security上下文的principal和Authentication更新一下(因为admin的信息已经变了,而Spring Security上下文中的用户信息还是登录时存的旧信息)。(为什么principal和Authentication都要更新?)
AdminController如下:
@RestController
@RequestMapping("/system/admin")
public class AdminController {
@Autowired
private IAdminService adminService;
@Autowired
private IRoleService roleService;
@ApiOperation(value = "获取所有操作员")
@GetMapping("/")
public List<Admin> getAllAdmins(String keywords){
return adminService.getAllAdmins(keywords);
}
@ApiOperation(value = "更新操作员")
@PutMapping("/")
public RespBean updateAdmin(@RequestBody Admin admin){
if (adminService.updateById(admin)){
return RespBean.success("更新成功");
}
return RespBean.error("更新失败");
}
@ApiOperation(value = "删除操作员")
@DeleteMapping("/{id}")
public RespBean deleteAdmin(@PathVariable Integer id){
if (adminService.removeById(id)){
return RespBean.success("删除成功");
}
return RespBean.error("删除失败");
}
@ApiOperation(value = "获取所有角色")
@GetMapping("/roles")
public List<Role> getAllRoles(){
return roleService.list();
}
@ApiOperation(value = "更新操作员角色")
@PutMapping("/role")
public RespBean updateAdminRole(Integer adminId, Integer[] rids){
return adminService.updateAdminRole(adminId, rids);
}
}
有很多都是MyBatis-plus里自带的接口方法。
MenuService如下:
public interface IMenuService extends IService<Menu> {
List<Menu> getMenusByAdminId();
List<Menu> getMenusWithRole();
List<Menu> getAllMenus();
}
List<Menu> getMenusByAdminId();
@Override
public List<Menu> getMenusByAdminId(){
Integer adminId = ((Admin)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId();
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
//从redis获取菜单数据
List<Menu> menus = (List<Menu>) valueOperations.get("menu_" + adminId);
//如果为空,去数据库获取
if (CollectionUtils.isEmpty(menus)){
menus = menuMapper.getMenusByAdminId(adminId);
//将数据设置到Redis中
valueOperations.set("menu_"+adminId,menus);
}
return menus;
}
List<Menu> getMenusWithRole();
@Override
public List<Menu> getMenusWithRole() {
return menuMapper.getMenusWithRole();
}
List<Menu> getAllMenus();
@Override
public List<Menu> getAllMenus() {
return menuMapper.getAllMenus();
}
MenuMapper.xml
<?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.xxxx.server.mapper.MenuMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.xxxx.pojo.Menu">
<id column="id" property="id" />
<result column="url" property="url" />
<result column="path" property="path" />
<result column="component" property="component" />
<result column="name" property="name" />
<result column="iconCls" property="iconCls" />
<result column="keepAlive" property="keepAlive" />
<result column="requireAuth" property="requireAuth" />
<result column="parentId" property="parentId" />
<result column="enabled" property="enabled" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, url, path, component, name, iconCls, keepAlive, requireAuth, parentId, enabled
</sql>
<resultMap id="Menus" type="com.xxxx.server.pojo.Menu" extends="BaseResultMap">
<collection property="children" ofType="com.xxxx.server.pojo.Menu">
<id column="id2" property="id" />
<result column="url2" property="url" />
<result column="path2" property="path" />
<result column="component2" property="component" />
<result column="name2" property="name" />
<result column="iconCls2" property="iconCls" />
<result column="keepAlive2" property="keepAlive" />
<result column="requireAuth2" property="requireAuth" />
<result column="parentId2" property="parentId" />
<result column="enabled2" property="enabled" />
</collection>
</resultMap>
<select id="getMenusByAdminId" resultMap="Menus">
SELECT DISTINCT
m1.*,
m2.id AS id2,
m2.url AS url2,
m2.path AS path2,
m2.component AS component2,
m2.`name` AS name2,
m2.iconCls AS iconCls2,
m2.keepAlive AS keepAlive2,
m2.requireAuth AS requireAuth2,
m2.parentId AS parentId2,
m2.enabled AS enabled2
FROM
t_menu m1,
t_menu m2,
t_admin_role ar,
t_menu_role mr
WHERE
m1.id = m2.parentId
AND m2.id = mr.mid
AND mr.rid = ar.rid
AND ar.adminId = #{id}
AND m2.enabled = TRUE
ORDER BY
m2.id
</select>
<resultMap id="MenusWithRole" type="com.xxxx.server.pojo.Menu" extends="BaseResultMap">
<collection property="roles" ofType="com.xxxx.server.pojo.Role">
<id column="rid" property="id" />
<result column="rname" property="name" />
<result column="rnameZh" property="nameZh" />
</collection>
</resultMap>
<select id="getMenusWithRole" resultMap="MenusWithRole">
SELECT
m.*,
r.id AS rid,
r.`name` AS rname,
r.nameZh AS rnameZh
FROM
t_menu m,
t_menu_role mr,
t_role r
WHERE
m.id = mr.mid
AND r.id = mr.rid
ORDER BY
m.id
</select>
<resultMap id="MenusWithChildren" type="com.xxxx.server.pojo.Menu" extends="BaseResultMap">
<id column="id1" property="id"/>
<result column="name1" property="name"/>
<collection property="children" ofType="com.xxxx.server.pojo.Menu">
<id column="id2" property="id"/>
<result column="name2" property="name"/>
<collection property="children" ofType="com.xxxx.server.pojo.Menu">
<id column="id3" property="id"/>
<result column="name3" property="name"/>
</collection>
</collection>
</resultMap>
<select id="getAllMenus" resultMap="MenusWithChildren">
SELECT
m1.id AS id1,
m1.`name` AS name1,
m2.id AS id2,
m2.`name` AS name2,
m3.id AS id3,
m3.`name` AS name3
FROM
t_menu m1,
t_menu m2,
t_menu m3
WHERE
m1.id = m2.parentId
AND m2.id = m3.parentId
AND m3.enabled = TRUE
</select>
</mapper>