【机房报修管理系统】后端篇(十) 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;

    }

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值