IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 项目实战之旅游网(二)后台用户管理(上) -> 正文阅读

[Java知识库]项目实战之旅游网(二)后台用户管理(上)

目录

一.管理员列表

二. 新增管理员

三.修改管理员

四.管理员详情


一.管理员列表

后台用户也称为管理员,每个管理员能在后台进行的操作不同,所以不同的管理员有不同的权限。在项目中,权限表的设计为用户-角色多对多,角色权限多对多,既一个用户有多个角色,一个角色有多个权限。所以后台首先要拥有用户管理、角色管理、权限管理的功能。


我们首先编写用户管理中的查询用户功能。

查询管理员后端代码:

1.编写AdminMapper

package com.first.travel.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.first.travel.pojo.Admin;

public interface AdminMapper extends BaseMapper<Admin> {

}

我们需要MybatisPlus扫描所有接口,并放到Spring容器当中,所以需要在配置类里添加扫描注解?

@SpringBootApplication
//扫描mapper包下的所有接口并放到Spring容器当中
@MapperScan("com.first.travel.mapper")
public class TravelApplication {

    public static void main(String[] args) {
        SpringApplication.run(TravelApplication.class, args);
    }

}

?在配置类里注册MybatisPlus的分页插件:

@SpringBootApplication
//扫描mapper包下的所有接口并放到Spring容器当中
@MapperScan("com.first.travel.mapper")
public class TravelApplication {

    public static void main(String[] args) {
        SpringApplication.run(TravelApplication.class, args);
    }

    // 注册分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2.编写AdminService

我们可以在service层下添加@Service注解来调用spring容器中的接口实例了。

@Service
public class AdminService {
    @Autowired
    private AdminMapper adminMapper;

    //分类查询管理员
    public Page<Admin> findPage(int page, int size){
        //直接用MybatisPlus的分页插件(得去配置里注册一下),查询条件是null
        Page selectPage=adminMapper.selectPage(new Page(page,size),null);
        return selectPage;
    }
}

然后编写控制类

@Controller
@RequestMapping("/backstage/admin")
public class AdminController {
    @Autowired
    private AdminService adminService;

    @RequestMapping("/all")
    public ModelAndView all(@RequestParam(defaultValue = "1") int page,
                            @RequestParam(defaultValue = "10") int size){
        ModelAndView modelAndView=new ModelAndView();
        Page<Admin> adminPage=adminService.findPage(page,size);
        modelAndView.addObject("adminPage",adminPage);
        modelAndView.setViewName("/backstage/admin_all");
        return modelAndView;
    }
}

通过这个小例子,咱们又能看到mapper,service以及controller这三层的关系,就是mapper来定义接口,service来实现接口功能,然后controller作为控制层是根据具体业务关系来调度这些功能的一个调度层。

?查询管理员前端代码:

太长了就不贴了,毕竟咱们都用上AdminLTE了,所以主要是把后端功能讲明白了,逻辑都实现了就很不错了。

运行项目:

前端分页插件:

AdminLTE这个框架的分页插件不是很好,所以我们用另一个分页插件

(bootstrap-paginator.js),引入到通用模板common_resources.html当中

<script src="/backstage/js/bootstrap-paginator.js"></script>
<div class="box-tools pull-right">
    <ul class="pagination"></ul>
</div>
<!--配置分页插件-->
<script th:inline="javascript">
    var currentPage = [[${adminPage.current}]];
    var pages = [[${adminPage.pages}]];
    $(".pagination").bootstrapPaginator({
        bootstrapMajorVersion: 3, // bootstrap版本
        currentPage: currentPage, // 当前页
        totalPages: pages, // 总页数
        numberOfPages: 5, // 最多显示多少页
        itemTexts: function (type, page, current) {
            switch (type) {
                case "first":
                    return "首页";
                case "prev":
                    return "上一页";
                case "next":
                    return "下一页";
                case "last":
                    return "末页";
                case "page":
                    return page;
            }
        },
        onPageClicked: function (event, originalEvent, type, page) { // 点击页码执行的方法
            location.href =  "/backstage/admin/all?page=" + page;
        }
    })
</script>

二. 新增管理员

前端页面

把上面那个admin_all.html里的那个新建按钮放在一个a标签里,实现点击新建就跳转到一个新增用户的界面,填完新用户信息之后,然呕点击保存,就会实现用户的新增。然后创建一个新增用户的界面,并改成我们想要的样子。

后端代码

开始实现后端的添加用户的代码,我们就不用在AdminMapper.java中添加接口了,因为MybatisPlus已经有新增借口了,所以,咱们直接在service层(AdminService.java)实现该功能即可。添加代码如下:

    //新增管理员
    public void add(Admin admin){
        adminMapper.insert(admin);
    }

然后咱们再在控制层添加代码:

    //新增管理员控制逻辑
    @RequestMapping("/add")
    public String add(Admin admin){
        adminService.add(admin);
        return "redirect:/backstage/admin/all";
    }

启动项目测试一下

三.修改管理员

注意新增的时候是没有用户ID的,修改的时候点击修改跳转到的界面要有用户原始数据。

所以要先按照id来查询管理员

在service层添加代码:

    //根据id查询管理员
    public Admin findById(Integer aid){
        return adminMapper.selectById(aid);
    }

在控制层添加控制逻辑:

先查询到那个管理员并跳转到修改页面

    //查询管理员并跳转到修改页面
    @RequestMapping("/edit")
    public ModelAndView edit(Integer aid){
        Admin admin = adminService.findById(aid);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("admin",admin);
        modelAndView.setViewName("/backstage/admin_edit");
        return modelAndView;
    }

注意前端页面中用户id放到隐藏域中传过去,因为新增时id自增的,所以不需要id,但是修改需要id来确认修改的是哪个用户。

然后我们再实现修改的后台逻辑:

service层:

    //修改管理员
    public void update(Admin admin){
        adminMapper.updateById(admin);
    }

controller层:

    //根据id修改管理员的信息
    @RequestMapping("/update")
    public String update(Admin admin){
        adminService.update(admin);
        //更新之后跳转到主页
        return "redirect:/backstage/admin/all";
    }

运行项目测试成功!

在写这里的时候我遇到了一个问题,就是点击修改按钮之后却报了404错误,于是我第一时间先去看了看首页的代码,问题就是href没写成thymleaf的语法,所以导致页面加载不到!

<td class="text-center">
    <!--/backstage/admin/desc是路径,其他同理-->
    <a th:href="@{/backstage/admin/desc(aid=${admin.aid})}" class="btn bg-green btn-xs">详情</a>
    <a th:href="@{/backstage/admin/edit(aid=${admin.aid})}" class="btn bg-olive btn-xs">修改</a>
    <a th:href="@{/backstage/admin/findRole(aid=${admin.aid})}" class="btn bg-blue btn-xs">分配角色</a>
    <a th:href="@{/backstage/admin/updateStatus(aid=${admin.aid})}" class="btn bg-gray btn-xs">启用/禁用</a>
</td>

四.管理员详情

管理员详情包含管理员的角色,以及角色拥有的权限,所以需要进行多表查询。这就需要我们自定义方法了,MybatisPlus提供给我们的方法已经不够看了。

这需要做一个五表查询,如下:

后端页面:

1.编写AdminMapper

public interface AdminMapper extends BaseMapper<Admin> {
    //查询用户详情(五表关联)
    Admin findDesc(Integer aid);
}

2.编写AdminMapper.xml

即AdminMapper的映射文件,位置放在:resources下,和mapper包的目录相同

<?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.first.travel.mapper.AdminMapper">
    <resultMap id="adminMap" type="com.first.travel.pojo.Admin">
        <id property="aid" column="aid"></id>
        <result property="username" column="username"></result>
        <collection property="roles" column="aid" ofType="com.first.travel.pojo.Role">
            <result property="roleName" column="roleName"></result>
            <result property="roleDesc" column="roleDesc"></result>
            <collection property="permissions" column="rid" ofType="com.first.travel.pojo.Permission">
                <result property="permissionName" column="permissionName"></result>
                <result property="permissionDesc" column="permissionDesc"></result>
            </collection>
        </collection>
    </resultMap>
    <select id="findDesc" parameterType="int" resultMap="adminMap">
        select * FROM
            admin
                LEFT JOIN admin_role
                          on admin.aid = admin_role.aid
                LEFT JOIN role
                          on admin_role.rid = role.rid
                LEFT JOIN role_permission
                          on role.rid = role_permission.rid
                LEFT JOIN permission
                          on role_permission.pid = permission.pid
        where admin.aid = #{aid}
    </select>

</mapper>

然后在测试函数里测试一下:

@SpringBootTest
class TravelApplicationTests {
    @Autowired
    private AdminMapper adminMapper;

    @Test
    void contextLoads() {
        Admin desc = adminMapper.findDesc(1);
        System.out.println(desc);
    }
}

前端页面:

我们上面已经把管理员详情从数据库中查询出来了,现在我们来展示一下,先补齐service层和controller层。

service层:

    //查询用户详情
    public Admin findDesc(Integer aid){
        return adminMapper.findDesc(aid);
    }

controller层:

    @RequestMapping("/desc")
    public ModelAndView desc(Integer aid){
        Admin admin = adminService.findDesc(aid);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("admin",admin);
        modelAndView.setViewName("/backstage/admin_desc");
        return modelAndView;
    }

现在我们来写一下前端的页面:使用树表格来展示信息(代码就不放了,长)

另外在这里说一下这个跳转的流程,我们在主页点击了详情按钮,代码如下图:

?可以看到路径是/backstage/admin/desc,然后就会根据这个路径在控制层里找到对应的控制器(上面已写),然后这个控制器有一句代码是

modelAndView.setViewName("/backstage/admin_desc");

即跳转到admin_desc.html中(连同查询到的详情数据一块过去了),然后数据就在admin_desc.html这个页面当中展示出来了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-12-25 10:52:38  更:2022-12-25 10:52:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 9:34:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码