当前位置: 代码迷 >> 综合 >> Jpa+easyui 实现“用户管理”(Transient、ManyToOne、JoinColumn等注解、StringBuffer、Pageable、eval,$.inArray)
  详细解决方案

Jpa+easyui 实现“用户管理”(Transient、ManyToOne、JoinColumn等注解、StringBuffer、Pageable、eval,$.inArray)

热度:51   发布时间:2023-11-24 03:47:16.0

一、实现功能:

关于用户的增删改查:
在这里插入图片描述

在这里插入图片描述
用户的角色设置:
对于用户已经拥有的角色,要默认选中打勾
在这里插入图片描述

用户实体:
在这里插入图片描述
用户角色实体:
在这里插入图片描述
角色实体:在这里插入图片描述

在这里插入图片描述

二、代码

1、查询用户列表
在这里插入图片描述
controller:
在这里插入图片描述
上面大致思路:先获取用户列表,遍历得到每一个用户,
对于每个用户,获取他的角色列表,提取角色名称 拼接起来,设置给该用户的roles属性

service层:

/*** 根据条件分页查询用户信息* @param user* @param page :起始页 * @param pageSize* @param direction :降序或是升序的依据* @param properties* @return* * root:用来获取某个字段信息 cb:用来封装一些条件(like、equal...)* pageRequest的分页对象,第一页是page=0,而前台easyui传来的第一页为1,因此需要 page - 1 * predicate:存储后面构造的查询条件*/@Overridepublic List<User> list(User user, Integer page, Integer pageSize, Direction direction, String... properties) {
    Pageable pageable=new PageRequest(page-1,pageSize);//查询所需参数pageablePage<User> pageUser=userRepository.findAll(new Specification<User>() {
    @Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    Predicate predicate=cb.conjunction();//存储下面构造的查询条件if(user !=null) {
    if(StringUtil.isNotEmpty(user.getUserName())) {
    predicate.getExpressions().add(cb.like(root.get("userName"), "%"+user.getUserName()+"%"));}predicate.getExpressions().add(cb.notEqual(root.get("id"), 1));// 管理员除外}return predicate;}}, pageable);	return pageUser.getContent();}

获取查询记录总数:

/*** 获取总记录数* @param user* @return*/@Overridepublic Long getCount(User user) {
    Long count=userRepository.count(new Specification<User>() {
    @Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    Predicate predicate=cb.conjunction();if(user!=null){
    if(StringUtil.isNotEmpty(user.getUserName())){
    predicate.getExpressions().add(cb.like(root.get("userName"), "%"+user.getUserName()+"%"));}predicate.getExpressions().add(cb.notEqual(root.get("id"), 1));}return predicate;}});return count;}

Repository:

/*** 用户Repository接口* @author Administrator* JpaRepository<实体,主键类型>*/
public interface UserRepository extends JpaRepository<User,Integer>,JpaSpecificationExecutor<User>{
    /** 根据用户名查找用户实体*/@Query(value="select * from t_user where user_name=?1",nativeQuery=true)public User findByUserName(String userName);
}

2.添加或者修改用户信息
js代码:

function saveUser(){
    $("#fm").form("submit",{
    url:url,onSubmit:function(){
    return $(this).form("validate");},success:function(result){
    var result=eval('('+result+')');eval方法是将json字符串转换成json对象 便于下面获取result里面的属性if(result.success){
    $.messager.alert("系统提示","保存成功!");resetValue();$("#dlg").dialog("close");$("#dg").datagrid("reload");}else{
    $.messager.alert("系统提示",result.errorInfo);}}});}

添加或者修改用户可以共用一个接口:
Controller层:
在这里插入图片描述
service层:
在这里插入图片描述

至于Repository:serviceImpl直接使用userRepository.save(user)接口,不用自己再写其他的sql语句了;
3.删除用户:
Controller层:
在这里插入图片描述
service层也是直接调用userRepository.delete(id)接口即可;

4.用户角色设置:

1.页面:

在这里插入图片描述

/* val:当前字段的值 row:一行的值 */function formatEdit(val,row){
    return "<a href=\"javascript:openRoleChooseDialog('"+row.roles+"',"+row.id+")\"> <img style='margin-top:4px' src='/static/images/edit.gif'/> </a>";}
//打开角色设置对话框function openRoleChooseDialog(roles,userId){
    var rolesArr=roles.split(",");    //用户有的角色$("#dlg2").dialog("open").dialog("setTitle","选择角色");$("#dg2").datagrid({
    url:'/admin/role/listAll',onLoadSuccess:function(data){
     //url加载成功后执行此函数var allRows=$("#dg2").datagrid("getRows");for(var i=0;i<allRows.length;i++){
    var name=allRows[i].name;if($.inArray(name,rolesArr)>=0){
      //用户拥有的角色出现在了角色数组中 就让该角色选中$("#dg2").datagrid("checkRow",i);}}}});$("#userId").val(userId);}
//选择角色设置给用户 然后提交function saveRoleSet(){
    var userId=$("#userId").val();var selectedRows=$("#dg2").datagrid("getSelections");var strRoleIds=[];for(var i=0;i<selectedRows.length;i++){
    strRoleIds.push(selectedRows[i].id);}var roleIds=strRoleIds.join(","); //将数组转换为以,分割的字符串$.post("/admin/user/saveRoleSet",{
    roleIds:roleIds,userId:userId},function(result){
    if(result.success){
    closeRoleSetDialog();$("#dg").datagrid("reload");}else{
    $.messager.alert("系统提示","提交失败,请联系管理员!");}},"json");}
  1. Controller:
/*** 保存用户角色设置*大致过程:当为某个用户设置角色时,先根据userId删掉指定用户的所有用户角色关联* 然后再统一将选中的角色设置给该用户* @param roleIds* @param userId* @return* @throws Exception*/@ResponseBody @RequestMapping("/saveRoleSet")public Map<String,Object> saveRoleSet(String roleIds,Integer userId) throws Exception{
    Map<String,Object> resultMap=new HashMap<>();userRoleService.deleteByUserId(userId);if(StringUtil.isNotEmpty(roleIds)) {
    String roleIdStr[]=roleIds.split(",");for(int i=0;i<roleIdStr.length;i++) {
    UserRole userRole=new UserRole();userRole.setUser(userService.findById(userId));userRole.setRole(roleService.findById(Integer.parseInt(roleIdStr[i])));userRoleService.save(userRole);}}resultMap.put("success", true);//logService.save(new Log(Log.UPDATE_ACTION,"保存用户角色设置"));return resultMap;}

三、总结 (主要几点)

1.双击 弹出修改对话框

$(document).ready(function(){
    $("#dg").datagrid({
    onDblClickRow:function(index,row){
    $("#dlg").dialog("open").dialog("setTitle","修改用户信息");$("#fm").form("load",row);$("#userName").attr("readonly","readonly");url="/admin/user/save?id="+row.id;}});});

2.什么时候使用var result=eval(’(’+result+’)’)
保存、修改 提交表单时未指定 “json”格式,这时需要使用eval处理结果:
在这里插入图片描述
下面删除时,指定了“json”格式:
在这里插入图片描述
有的功能可能要删除多条数据,下面补充一下:

function deleteSupplier(){
    var selectedRows=$("#dg").datagrid("getSelections");if(selectedRows.length==0){
    $.messager.alert("系统提示","请选择要删除的数据!");return;}var strIds=[];for(var i=0;i<selectedRows.length;i++){
    strIds.push(selectedRows[i].id);}var ids=strIds.join(",");$.messager.confirm("系统提示","您确定要删除这条数据吗?",function(r){
    if(r){
    $.post("/admin/supplier/delete",{
    ids:ids},function(result){
    if(result.success){
    $.messager.alert("系统提示","数据已成功删除!");$("#dg").datagrid("reload");}else{
    $.messager.alert("系统提示",result.errorInfo);}},"json");}});}
@RequestMapping("/delete")@RequiresPermissions(value="供应商管理")public Map<String,Object> delete(String ids) throws Exception{
    Map<String,Object> resultMap=new HashMap<>();String []idsStr=ids.split(",");for(int i=0;i<idsStr.length;i++) {
    int id=Integer.parseInt(idsStr[i]);logService.save(new Log(Log.DELETE_ACTION,"删除供应商信息"+supplierService.findById(id)));supplierService.delete(id);}resultMap.put("success", true);return resultMap;}

3.$.inArray()
$.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回-1。

4.join方法
将数组转换为以,分割的字符串

完整代码地址:
https://gitee.com/never_enough/jxc_system/blob/master/JXC/src/main/webapp/power/user.html

  相关解决方案