项目实战之旅游网(二)后台用户管理(上)

news2024/11/19 1:27:47

目录

一.管理员列表

二. 新增管理员

三.修改管理员

四.管理员详情


一.管理员列表

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


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

查询管理员后端代码:

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这个页面当中展示出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四、网络层(四)IPv6

目录 4.1 IPv6的主要特点 4.2 IPv6地址 4.3 从IPv4到IPv6过渡 4.1 IPv6的主要特点 解决IP地址耗尽问题的措施有以下3种 采用无分类域间路由&#xff0c;使IP地址的分配更加合理。采用网络地址转换NAT以节省全球IP地址。采用具有更大地址空间的新版本的IP协议IPv6。&am…

力扣(LeetCode)199. 二叉树的右视图(C++)

迭代 按照层序遍历&#xff0c;每一层最右边的元素就是二叉树右视图的元素。迭代算法需要队列保存二叉树每一层的所有结点&#xff0c;并且在遍历下一层时&#xff0c;上一层的所有结点已经出队。在遍历下一层之前&#xff0c;记录队列大小&#xff0c;即为二叉树当前层的结点…

三.keepalived介绍及工作原理

keepalived介绍及工作原理keepalived介绍及工作原理一、keepalived的介绍二、Keepalived服务的重要功能1、管理LVS负载均衡软件2、实现对LVS集群节点健康检查功能&#xff08;healthcheck&#xff09;3、作为系统网络服务的高可用功能&#xff08;failover&#xff09;三、Keep…

Redis 集合(Sorted Set)方法使用详解

目录一、简介二、常用方法2.1、ZADD2.2、ZREM2.3、ZSCORE2.4、ZINCRBY2.5、ZCARD2.6、ZRANK、ZREVRANK2.7、ZRANGE、ZREVRANGE2.8、ZRANGEBYSCORE、ZREVRANGEBYSCORE2.9、ZCOUNT2.10、ZREMRANGEBYRANK2.11、ZREMRANGEBYSCORE2.12、ZINTERSTORE、ZUNIONSTORE2.13、ZRANGEBYLEX、…

day 9 模拟和高精度

P4924 [1007]魔法少女小Scarlet 题目描述 Scarlet 最近学会了一个数组魔法&#xff0c;她会在 nn 二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转 90∘。 首先&#xff0c;Scarlet 会把 1 到 n^2 的正整数按照从左往右&#xff0c;从上至下的顺序填入初始的二维数组中…

带您认识spreadsheet专属的数据仓库,助力报表开发好帮手

业务主题是针对业务的一个概念&#xff0c;它将同一数据源中属于同一个分析主题的表或表中的字段组合在一起&#xff0c;为进一步的可视化数据集提供基本元素。 业务主题我们看作是 Smartbi 产品中的数据仓库&#xff0c;主要应用于可视化数据集等操作。 业务主题的应用场景有如…

佳缘线上超市网站

成品详细信息 开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 基于SPRINGBOOTE的佳源线上超市管理系统的设计与实现 模块划分&#xff1a;公告类型模块、公告信息模块…

【Pycharm教程】在 PyCharm 中使用 Emacs 作为外部编辑器

Emacs是一个高级的文本编辑器&#xff0c;可以让你全面地操作你的代码。使用 Emacs 意味着可以根据您用于编码的语言进行完全可调整的编辑。 本文介绍了如何将 Emacs 添加到 PyCharm 并使用它来修改您的代码。 最新版本的 Emacs 可以从官网下载安装。 将 Emacs 配置为外部编…

介绍在全志A40i Ubuntu系统上定制文件系统的操作过程

为了给客户的测试和开发提供便利&#xff0c;飞凌嵌入式的开发板产品一般都支持多种操作系统&#xff0c;以基于全志T507H处理器设计研发的OKT507-C开发板为例&#xff0c;它支持三种操作系统&#xff0c;分别是&#xff1a;Linux、Android 和 Forlinx Desktop&#xff08;Ubun…

stm32cubemx hal学习记录:电机控制

一、基础配置 1、配置RCC、SYS&#xff0c;SYS的Timebase Source选择TIM6 2、配置USART1、时钟84MHz 3、激活FreeRTOS&#xff0c;选择CMSIS_V1&#xff0c;Config parameters种USE_TIMERS选择ENABLE 二、编码器及电机驱动引脚配置 1、选用TIM3的编码器模式 2、驱动使用L2…

以数据赋能业务,qlik为企业搭建透明绩效管理平台

自从各类金融APP出现以来&#xff0c;分支机构网络的性质已经发生了巨大的变化。下一代分支机构通常是围绕着深化客户关系的愿景建立起来的&#xff0c;这些愿景包括理财方面的建议&#xff0c;以及企业和家庭贷款等更大的承诺&#xff0c;同时提供现金和交易设施。由于分支机构…

2022-12-23 工作记录--CSS-超出多行显示省略号ios真机偶失效问题

CSS-超出多行显示省略号ios真机偶失效问题 一、前言 最近帮同事解决一个了bug&#xff1a;在ios真机上&#xff0c;超出多行显示省略号的文本内容&#xff0c;偶然会出现未显示问题。 最开始&#xff0c;我没往 超出多行显示省略号 样式方面进攻&#xff0c;还以为是react渲染…

离散数学图论的练习题详解

文章目录学习技巧图论练习学习技巧 坚持 图论练习 一颗树有2个2度结点&#xff0c;1个3度结点和3个4度结点&#xff0c;则1度结点数为&#xff08;&#xff09; 知识点&#xff1a;握手定理&#xff1a;所有节点度数之和等于边数的两倍解答&#xff1a;221334x2(213x−1)2\…

亚马逊首次亮相中性原子量子计算机Aquila

Aquila处理器内饰&#xff08;图片来源&#xff1a;网络&#xff09; 亚马逊网络服务&#xff08;AWS&#xff09;将在其名为Amazon Braket的特殊云服务器中托管量子计算机Aquila。这是量子计算第一次可以直接从AWS云端访问中性原子量子处理器。 而提供这台量子计算机的公司是Q…

数字化时代,看商业智能BI与业务发展分析

每一家企业我们都可以从模式、问题和求解这三个角度对企业的业务经营管理进行探讨&#xff0c;比如模式&#xff0c;公司目前的管理模式和运营模式效果如何&#xff0c;是否符合公司长期战略目标或中短期业绩增长目标&#xff1f; 数据分析 - 派可数据商业智能BI可视化分析平台…

12项数据安全国标全文来了

二十大报告是新时代党和国家事业发展的理论指南和行动纲领&#xff0c;报告强调&#xff0c;“强化经济、重大基础设施、金融、网络、数据、生物、资源、核、太空、海洋等安全保障体系建设”、“加强个人信息保护”等。“数据安全”与“个人信息保护”被提到前所未有的高度&…

说话人识别的数据需求

概述 机器学习领域名言“Garbage In, Garbage Out!”不论神经网络多么先进&#xff0c;如果输入是垃圾&#xff0c;那么输出也一定是垃圾在说话人识别领域&#xff0c;所需的最小数据单元&#xff0c;包括&#xff1a; 一段只包含单一说话人语音的音频&#xff0c;被称为Utter…

RocketMQ

q RocketMQ 1. RocketMQ简介 官网&#xff1a; http://rocketmq.apache.org/ RocketMQ是阿里巴巴2016年MQ中间件&#xff0c;使用Java语言开发&#xff0c;RocketMQ 是一款开源的分布式消息系统 &#xff0c;基于高可用分布式集群技术&#xff0c;提供低延时的、高可靠的消息…

如何通过链路追踪进行定时任务诊

背景简介 什么是定时任务 定时任务是业务应用系统中存在定时周期性运行的业务逻辑。由于其运行于后端进程中往往存在执行状态和执行链路的不可见性《常见定时任务技术方案》。 什么是链路追踪 随着分布式微服务化架构在企业中大规模运用&#xff0c;业务运行的应用平台是一…

基于GINA/凭证提供程序的自助密码管理

大多数组织依赖于密码自助管理工具来跟踪用户的密码相关日常 事务。但是&#xff0c;另一方面&#xff0c;大多数自助解决方案只能从web浏览器进行访问。因此&#xff0c;已锁定的用户被迫从同事的工作站或用web浏览器从自助服务终端重置其密码。这与自助密码管理的意图背道而驰…