一、前情提要
上一次我们做完了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;
}
}
}
创建两个自定义异常类:AdministratorPasswordIsNullException
、AdministratorPhoneIsNullException
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;
}
到这里,管理员管理服务已经开发完成了。如果您对次篇文章有疑问,可以在文章下方留言,谢谢您的阅读。如对【机房报修管理系统】系列文章有兴趣,可以关注或收藏我的文章,您的支持是我最大的动力,我会尽快推出下一期内容,敬请期待。