【机房报修管理系统】后端篇(十) Service层开发——管理员管理服务

本文详细介绍了一种基于通用Mapper(tk.mybatis)的管理员管理服务开发流程,包括接口设计、实现及异常处理,涵盖登录、搜索、增删改查等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前情提要


    上一次我们做完了Redis的配置,这一次我们来对Service层进行开发,做管理员管理服务,由于我在使用通用Mapper(tk.mybatis)进行开发,所以代码和普通的Mybatis不太一样。


二、接口设计

1.获得所有管理员信息:searchAllAdministrator

  • 作用:获得所有管理员信息,一般用于管理员页面表单回显。
  • 需要参数:无
  • 返回值:List<Administrator>

2.通过管理员ID搜索管理员信息:searchAdministratorById

  • 作用:通过管理员ID搜索管理员信息,一般用作于搜索管理员功能。
  • 需要参数:id(管理员ID,类型为Integer
  • 返回值:Administrator

3.通过管理员姓名搜索管理员信息:searchAdministratorByName

  • 作用:通过管理员姓名搜索管理员信息,一般用作于搜索管理员功能。
  • 需要参数:name(管理员姓名,类型为String
  • 返回值:List<Administrator>

4.通过管理员手机号搜索管理员信息:searchAdministratorByPhoneNum

  • 作用:通过管理员手机号搜索管理员信息,一般用于搜索管理员功能和登录功能。
  • 需要参数:phoneNum(管理员手机号,类型为String
  • 返回值:Administrator

5.获得管理员总数:countAllAdministrator

  • 作用:获得所有管理员总数,一般用于分页功能。
  • 需要参数:无
  • 返回值:String

6.管理员登录:loginAdministrator

  • 作用:通过此服务进行管理员登录。
  • 需要参数:phone(管理员手机号,类型为String
  • password(管理员密码,类型为String
  • 返回值:Administrator

7.管理员手机号是否存在:administratorPhoneNumberIsExist

  • 作用:查询管理员手机号是否存在重复,一般用于管理员添加或修改功能。
  • 需要参数:number(管理员手机号,类型为String
  • 返回值:boolean

8.保存管理员信息:saveAdministrator

  • 作用:添加管理员信息。
  • 需要参数:admin(管理员信息,类型为管理员实体类Administrator
  • 返回值:无

9.修改管理员信息:updateAdministrator

  • 作用:修改管理员信息。
  • 需要参数:admin(管理员信息,类型为管理员实体类Administrator
  • 返回值:无

10.删除管理员信息:deleteAdministrator

  • 作用:删除管理员信息。
  • 需要参数:id(管理员ID,类型为Integer
  • 返回值:无



三、实践操作


注意:由于有很多工作是重复性的,这里我就不会对每个服务进行详解,只会挑选有一些特别地方进行讲解。

1.使用Maven导入等下需要用到的第三方工具类

pom.xml导入以下工具

  • 加密工具:commons-codec
  • 字符串工具:commons-lang3
		<!-- apache 工具类 -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>

2.创建接口AdministratorService

com.repairsystem.service下创建AdministratorService;并且按照上方接口设计实现。

package com.repairsystem.service;

import com.repairsystem.entity.Administrator;

import java.util.List;

/**
 * @author CheungChingYin
 * @date 2019/1/12
 * @time 11:06
 */
public interface AdministratorService {

    /**
     * 查询所有管理员账户
     * @return
     */
    List<Administrator> searchAllAdministrator();

    /**
     * 统计全部管理员数量
     * @return
     */
    String countAllAdministrator();

    /**
     * 按管理员ID搜索管理员
     * @param id
     * @return
     */
    Administrator searchAdministratorById(Integer id);

    /**
     * 按照管理员姓名搜索管理员
     * @param name
     * @return
     */
    List<Administrator> searchAdministratorByName(String name);

    /**
     * 按照手机号搜索管理员
     * @param phoneNum
     * @return
     */
    Administrator searchAdministratorByPhoneNum(String phoneNum);

    /**
     * 管理员登录
     * @param phone
     * @param password
     * @return
     */
    Administrator loginAdministrator(String phone, String password);

    /**
     * 查询管理员手机是否存在
     * @param number
     * @return
     */
    boolean administratorPhoneNumberIsExist(String number);

    /**
     * 添加管理员
     * @param admin
     */
    void saveAdministrator(Administrator admin);

    /**
     * 修改管理员
     * @param admin
     */
    void updateAdministrator(Administrator admin);

    /**
     * 删除管理员
     * @param id
     */
    void deleteAdministrator(Integer id);
}

3.创建接口实现类AdministratorServiceImpl

com.repairsystem.service.Impl下创建接口实现类AdministratorServiceImpl,并且实现接口AdministratorService

/**
 * @author CheungChingYin
 * @date 2019/1/12
 * @time 11:10
 */
@Service
public class AdministratorServiceImpl implements AdministratorService {

}

4.注入Administrator表的通用Mapper

注入Administrator表的通用Mapper:AdministratorMapper

 	@Autowired
    private AdministratorMapper adminMapper;

5.实现获得全部管理员功能:searchAllAdministrator

  • 作用:获得所有管理员信息,一般用于管理员页面表单回显。
  • 需要参数:无
  • 返回值:List<Administrator>

通用Mapper中封装了一个selectAll()方法,用于当前表的所有数据。

	@Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public List<Administrator> searchAllAdministrator() {
        return adminMapper.selectAll();

    }

6.实现通过管理员ID搜索管理员信息:searchAdministratorById

  • 作用:通过管理员ID搜索管理员信息,一般用作于搜索管理员功能。
  • 需要参数:id(管理员ID,类型为Integer
  • 返回值:Administrator

由于可能会出现形参id为空的可能性,所以我们需要做一个自定义异常
com.repairsystem.exception创建自定义异常AdministratorIdIsNullException

package com.repairsystem.exception;

/**
 * @author CheungChingYin
 * @date 2019/1/12
 * @time 13:32
 */
public class AdministratorIdIsNullException extends RuntimeException {

    public AdministratorIdIsNullException() {
        super();
    }

    public AdministratorIdIsNullException(String message) {
        super(message);
    }

    public AdministratorIdIsNullException(String message, Throwable cause) {
        super(message, cause);
    }

    public AdministratorIdIsNullException(Throwable cause) {
        super(cause);
    }

    protected AdministratorIdIsNullException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

通用Mapper中封装了一个selectByPrimaryKey()方法,通过主键查询相应数据

 	@Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public Administrator searchAdministratorById(Integer id) {

        if (StringUtils.isBlank(id.toString())) {
            throw new AdministratorIdIsNullException("传入的管理员ID为空");
        }
        return adminMapper.selectByPrimaryKey(id);
    }

7.通过管理员姓名搜索管理员信息:searchAdministratorByName

  • 作用:通过管理员姓名搜索管理员信息,一般用作于搜索管理员功能。
  • 需要参数:name(管理员姓名,类型为String
  • 返回值:List<Administrator>

由于在传入管理员姓名的时候可能会出现传空值的问题,所以需要自定义一个管理员姓名为空的自定义异常AdministratorNameIsNullException
com.repairsystem.exception创建自定义异常AdministratorNameIsNullException

package com.repairsystem.exception;

/**
 * @author CheungChingYin
 * @date 2019/1/13
 * @time 21:05
 */
public class AdministratorNameIsNullException extends RuntimeException {

    public AdministratorNameIsNullException() {
        super();
    }

    public AdministratorNameIsNullException(String message) {
        super(message);
    }

    public AdministratorNameIsNullException(String message, Throwable cause) {
        super(message, cause);
    }

    public AdministratorNameIsNullException(Throwable cause) {
        super(cause);
    }

    protected AdministratorNameIsNullException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

com.repairsystem.service.Impl.AdministratorServiceImpl编写以下代码

	@Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public List<Administrator> searchAdministratorByName(String name) {

        if (StringUtils.isBlank(name)) {
            throw new AdministratorNameIsNullException("传入的管理员姓名为空");
        }

        Example example = new Example(Administrator.class);
        example.createCriteria().andLike("adminName","%"+name+"%");

        return adminMapper.selectByExample(example);
    }

8.获得管理员总数:countAllAdministrator

  • 作用:获得所有管理员总数,一般用于分页功能。
  • 需要参数:无
  • 返回值:String

由于在通用Mapper中,并没有一些统计方法(可能是我没有找到),如count、average等等,需要自己手动编写SQL语句。

首先我们在mapper/AdministratorMapper.xml中编写统计表总和的SQL语句,其中的id属性是你在dao接口中的自定义方法名,等下会用到。

 <select id="getAdministratorCount" resultType="java.lang.Integer">
    SELECT COUNT(*) FROM administrator
  </select>

com.repairsystem.dao.AdministratorMapper中编写相关的接口方法(注意接口方法需要和上方的id一致)

 Integer getAdministratorCount();

com.repairsystem.service.Impl.AdministratorServiceImpl直接使用接口的方法即可

@Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public String countAllAdministrator() {

        String count = adminMapper.getAdministratorCount().toString();

        return count;
    }

9.管理员登录:loginAdministrator

  • 作用:通过此服务进行管理员登录。
  • 需要参数:phone(管理员手机号,类型为String
  • password(管理员密码,类型为String
  • 返回值:Administrator

在管理员登录的时候,我们需要为密码进行MD5加密,毕竟如果数据库中的密码是原密码的话,数据库管理员就能够直接看到,数据的私密性就没有了,所以需要加上一层加密。由于MD5的加密是不可逆的,也就是说密码加密后无法反向破解,我们在其他网站修改密码的时候,并没有提供当前密码显示的功能,也是因为这个原因。

我们需要创建一个加密工具类PasswordEncryptionUtils
com.repairsystem.utils下创建加密工具类PasswordEncryptionUtils

package com.repairsystem.utils;

import org.apache.commons.codec.binary.Base64;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author CheungChingYin
 * @date 2019/1/13
 * @time 21:38
 */
public class PasswordEncryptionUtils {

    /**
     * MD5密码加密工具
     * @param password
     * @return
     */
    public static String plainText2MD5Encrypt(String password){
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] output = md.digest(password.getBytes());
            String ret = Base64.encodeBase64String(output);
            return ret;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }

    }
}

创建两个自定义异常类:AdministratorPasswordIsNullExceptionAdministratorPhoneIsNullException

package com.repairsystem.exception;

/**
 * @author CheungChingYin
 * @date 2018/10/30
 * @time 22:15
 */
public class AdministratorPasswordIsNullException extends RuntimeException {

    public AdministratorPasswordIsNullException() {
        super();
    }

    public AdministratorPasswordIsNullException(String message) {
        super(message);
    }

    public AdministratorPasswordIsNullException(String message, Throwable cause) {
        super(message, cause);
    }

    public AdministratorPasswordIsNullException(Throwable cause) {
        super(cause);
    }

    protected AdministratorPasswordIsNullException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

package com.repairsystem.exception;

/**
 * @author CheungChingYin
 * @date 2018/10/30
 * @time 21:55
 */
public class AdministratorPhoneIsNullException extends RuntimeException {

    public AdministratorPhoneIsNullException() {
        super();
    }

    public AdministratorPhoneIsNullException(String message) {
        super(message);
    }

    public AdministratorPhoneIsNullException(String message, Throwable cause) {
        super(message, cause);
    }

    public AdministratorPhoneIsNullException(Throwable cause) {
        super(cause);
    }

    protected AdministratorPhoneIsNullException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

完成服务逻辑业务编写:
首先判断传入的参数是否为空,如果为空直接抛出异常;如果都不为空,将密码进行MD5加密,再查询数据库,如果有则返回管理员对象

@Transactional(propagation = Propagation.SUPPORTS)
    @Override
    public Administrator loginAdministrator(String phone, String password) {

        if (StringUtils.isBlank(phone)) {
            throw new AdministratorPhoneIsNullException("传入的管理员电话号码为空");
        }

        if (StringUtils.isBlank(password)) {
            throw new AdministratorPasswordIsNullException("传入的管理员密码为空");
        }

        password = PasswordEncryptionUtils.plainText2MD5Encrypt(password);
        Example example = new Example(Administrator.class);
        example.createCriteria().andEqualTo("adminPhone", phone).andEqualTo("adminPassword", password);

        Administrator admin = adminMapper.selectOneByExample(example);

        return admin;

    }

    到这里,管理员管理服务已经开发完成了。如果您对次篇文章有疑问,可以在文章下方留言,谢谢您的阅读。如对【机房报修管理系统】系列文章有兴趣,可以关注或收藏我的文章,您的支持是我最大的动力,我会尽快推出下一期内容,敬请期待。

特色重点说明: a.WEB兼容.(ie8+,google,firefox…) b.手机兼容(苹果,安卓) c.app兼容 简介: 本套软件适合于学校、企业的网上报修系统。没有复杂的操作,普通人员都很容易上手实践。并且在软件上不需要投入很多的人力培训进行操作。 网上报修系统管理平台,采用了BS架构开发,利用.NET技术和sqlserver数据库进行系统的开发,系统是一款专业的报修管理平台。灵活调度手段可以即时进行报修,并且自动通知和。所有用户无需安装和繁琐的配置,因为我们的报修管理运行在服务器上.使用时所有要做的就是登录系统。管理且使用好软件可以有效提高您的生产力和效率。对于学校/企业来说,时间就是金钱 - 生产率的提高,可以促使节约更多的成本。 优化: 电子化巡检,维修拍照存证;业主客户在线报修;报修用户可以通过微信、网站、手机、平板一键提交报修单;随时查看报修任务状态;可以评价和投诉报修员;短信绑定/微信绑定,实时通知报修 一、管理员界面 1.管理员登录 2.管理员登录界面 3.用户管理 3.1 报修用户管理 3.1.1 全部报修用户管理 可审核及编辑用户信息、增加新用户等 3.1.2 未审核用户、审核通过用户及审核未通过用户管理 3.2 维修负责人管理 可增加新的维修负责人 4.请假申请管理 5. 改派申请管理 5.1 改派申请记录 5.2 报修详情 5.3 设置状态,指派维修负责人 6.报修申请单管理 6.1 全部报修申请 可设置报修状态、指派维修人员、登记维修费用,指派维修负责人: 设置维修状态: 维修费用登记: 6.2 未指派、待处理、处理中、驳回报修的报修申请管理 6.3改派申请管理 设置改派申请的状态:批准、驳回等 6.4 用户评价管理 6.4.1 未评价的报修记录 6.4.2 已评价的报修记录 6.4.3 报修评价总览 可查看评价内容、评价星级等 7.管理设置 7.1 修改密码 7.2 重置问题答案 7.3 管理 注册须知、维修负责人须知、报修须知和评价须知等 二、维修负责人界面 1.维修负责人登录 2. 报修申请单管理 2.1全部报修申请单 2.2 查看待处理、处理中、驳回报修等的报修单 3. 查看报修详情 4.改派申请:填写申请原因,等待管理员批准 4.修改密码 三、报修用户登录界面 1.首次登录请先注册 2.用户登录 3.填写报修申请 4.查看我的报修记录 4.1 我的全部报修记录 4.2 未指派的报修记录:可选择取消报修 4.3 其他待处理、处理中、已驳回、评级及改派记录等 4.4 查看报修申请记录详情 5.请假申请 5.1 填写请假申请时间和原因 5.2 查看我的请假申请 6.修改密码 分超级管理员、总经理领导审核,部门管理审核人员、维修人员,超级管理员不能删除. 匿名报修人:可以报修任何设备。但必须由相关部门管理者审核是否真实性 。 总经理领导审核 包括 审核 单位所有需要审核 的,需要查看的, 部门管理审核人员 包括 审核部门需要审核 的,需要查看的,只针对部门相关 维修人员 承接自己可以接的任务,及相关自己所接的任务信息 ,查看 相关评语,星级等
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值