基于SSM可视化人力资源管理系统的设计与实现(二)

后端代码

1.管理员功能实现

流程
1.创建数据库

首先建立system_manger数据库表,管理员所用到的是序号(sm_id),管理员名字(sm_name),管理员用户名(sm_account),管理员密码(sm_password)。

数据库代码

-- ----------------------------
-- Table structure for system_manager
-- ----------------------------
DROP TABLE IF EXISTS `system_manager`;
CREATE TABLE `system_manager`  (
  `sm_id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `sm_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sm_account` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账号',
  `sm_password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`sm_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of system_manager
-- ----------------------------
INSERT INTO `system_manager` VALUES (1, '管理员', 'admin', '9EF9EE6C825CEAE1D980483E7BDEFE0C');

2.创建实体类

建立与数据库对应的实体名称,便于在后端代码中数据库与接口的连接。

SystemManager.java

package com.esms.dao;

/**
 * Created with IntelliJ IDEA.
 * Author: wxy
 * DateTime: 2023/2/1 17:51
 * Description:
 */

public class SystemManager {
    private Integer smId;//系统管理员ID,主键

    private String smName;//姓名

    private String smAccount;//账户

    private String smPassword;//密码

    public Integer getSmId() {
        return smId;
    }

    public void setSmId(Integer smId) {
        this.smId = smId;
    }

    public String getSmName() {
        return smName;
    }

    public void setSmName(String smName) {
        this.smName = smName == null ? null : smName.trim();
    }

    public String getSmAccount() {
        return smAccount;
    }

    public void setSmAccount(String smAccount) {
        this.smAccount = smAccount == null ? null : smAccount.trim();
    }

    public String getSmPassword() {
        return smPassword;
    }

    public void setSmPassword(String smPassword) {
        this.smPassword = smPassword == null ? null : smPassword.trim();
    }

    @Override
    public String toString() {
        return "SystemManager{" +
                "smId=" + smId +
                ", smName='" + smName + '\'' +
                ", smAccount='" + smAccount + '\'' +
                ", smPassword='" + smPassword + '\'' +
                '}';
    }
}
3.建立接口

这里主要是建立与实体对应的接口,因为使用的是mybatis,所以无需再写数据库的代码在接口中,后面可以使用代理的方式来实现,直接在其中定义对管理员的增删查改操作的名称即可。

SystemManagerMapper.java

package com.esms.mapper;

/**
 * Created with IntelliJ IDEA.
 * Author: wxy
 * DateTime: 2023/2/1 17:55
 * Description:
 */

import com.esms.dao.SuperManager;
import com.esms.dao.SystemManager;

import java.util.HashMap;
import java.util.List;

public interface SystemManagerMapper {

    int deleteByPrimaryKey(Integer smId);

    int insert(SystemManager record);

    int insertSelective(SystemManager record);

    SystemManager selectByPrimaryKey(Integer smId);

    int updateByPrimaryKeySelective(SystemManager record);

    int updateByPrimaryKey(SystemManager record);

    SystemManager selectByAccountAndPassword(SystemManager systemManager);

    List<SuperManager> selectAdminSelective(HashMap<String, Object> map);

    SystemManager findByeAccount(String smAccount);

    SystemManager selectVoByPrimaryKey(Integer smId);
}
4.创建服务类接口以及实现类

这里主要写业务代码,除了实现简单的CURD,还可以进行复杂功能的定义。

AdminService.java

package com.esms.service;

import com.esms.dao.SuperManager;
import com.esms.dao.SystemManager;

import java.util.HashMap;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Author: wxy
 * DateTime: 2023/2/1 21:42
 * Description:
 */

public interface AdminService {

    List<SuperManager> selectAdminSelective(HashMap<String, Object> map);

    SystemManager findByeAccount(String smAccount);

    void insert(SystemManager systemManager);

    void updateByPrimaryKeySelective(SystemManager systemManager);

    SystemManager selectVoByPrimaryKey(Integer smId);

    int deleteByPrimaryKey(Integer smId);
}

AdminServiceImpl.java

package com.esms.service.impl;

import com.esms.dao.SuperManager;
import com.esms.dao.SystemManager;
import com.esms.mapper.SystemManagerMapper;
import com.esms.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Author: wxy
 * DateTime: 2023/2/1 21:50
 * Description:
 */
@Service
public class AdminServiceImpl implements AdminService {

    @Autowired
    public SystemManagerMapper systemManagerMapper;

    @Override
    public List<SuperManager> selectAdminSelective(HashMap<String, Object> map) {
        List<SuperManager> superManagers = systemManagerMapper.selectAdminSelective(map);
        return superManagers;
    }

    @Override
    public SystemManager findByeAccount(String smAccount) {
        SystemManager systemManager = systemManagerMapper.findByeAccount(smAccount);
        return systemManager;
    }

    @Override
    public void insert(SystemManager systemManager) {
        systemManagerMapper.insert(systemManager);
    }

    @Override
    public void updateByPrimaryKeySelective(SystemManager systemManager) {
        systemManagerMapper.updateByPrimaryKeySelective(systemManager);
    }

    @Override
    public SystemManager selectVoByPrimaryKey(Integer smId) {
        SystemManager systemManager = systemManagerMapper.selectByPrimaryKey(smId);
        return systemManager;
    }

    @Override
    public int deleteByPrimaryKey(Integer smId) {
        int i = systemManagerMapper.deleteByPrimaryKey(smId);
        return i;
    }
}

5.创建vo层(前端页面数据展示)

vo层也成为视图层,主要用于展示,其作用是把某个指定页面(或组件)的所有数据封装起来。

AdminPages.java

package com.esms.vo;

import com.esms.dao.SystemManager;

import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Author: wxy
 * DateTime: 2023/2/10 23:00
 * Description:
 */

public class AdminPages {
    Integer code;
    String msg;
    Integer count;
    List<SystemManager> data;

    @Override
    public String toString() {
        return "EmployeePages{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", count=" + count +
                ", data=" + data +
                '}';
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public List<SystemManager> getData() {
        return data;
    }

    public void setData(List<SystemManager> data) {
        this.data = data;
    }
}

6.controller层
package com.esms.controller;

import com.esms.dao.SuperManager;
import com.esms.dao.SystemManager;
import com.esms.service.AdminService;
import com.esms.utils.MD5Utils;
import com.esms.vo.AdminPages;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Author: wxy
 * DateTime: 2023/2/1 21:37
 * Description:
 */
@Controller
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    private AdminService adminService;



    @RequestMapping("/findSelective.do")
    @ResponseBody
    public AdminPages findSelective(
            @RequestParam(value="page", defaultValue="1")int pageNum,
            @RequestParam(value="limit", defaultValue="5") int limit,
            @RequestParam(value="sm_account", defaultValue="") String sm_account,
            @RequestParam(value="sm_name", defaultValue="") String sm_name) throws Exception {
        //传递多个参数用HashMap
        HashMap map = new HashMap();
        //添加键值对可以使用put方法
        map.put("sm_account",sm_account);
        map.put("sm_name",sm_name);
        //pageNum:起始页面  pageSize:每页的大小
        PageHelper.startPage(pageNum,limit);
        //查找条件,一定要紧跟在startPage后,因为紧跟着的第一个select方法会被分页
        List list =
                adminService.selectAdminSelective(map);

        PageInfo pageResult = new PageInfo(list);
        //为了方便直接使用PageInfo,如使用里面的getToal()方法,减少代码的冗余

        //设置前台需要的数据
        AdminPages adminPages = new AdminPages();
        adminPages.setCode(0);
        adminPages.setMsg("");
        adminPages.setCount((int) pageResult.getTotal());
        adminPages.setData(pageResult.getList());
        return adminPages;
    }


    @RequestMapping("/add.do")
    @ResponseBody
    public int add(String smAccount,
                   String smName,
                   String smPassword) throws Exception {

        //检测工号是否相同
        //查找是否同名
        SystemManager s = adminService.findByeAccount(smAccount);
        if(s != null) {
            return 0;
        } else {
            SystemManager systemManager = new SystemManager();
            systemManager.setSmAccount(smAccount);
            systemManager.setSmName(smName);
            systemManager.setSmPassword(MD5Utils.encodeByMD5(smPassword));
            adminService.insert(systemManager);
            return 1;
        }


    }


    @RequestMapping("/selectVoByPrimaryKey.do")
    @ResponseBody
    public SystemManager selectVoByPrimaryKey(Integer smId) {

        SystemManager systemManager = adminService.selectVoByPrimaryKey(smId);
        return systemManager;
    }



    @RequestMapping("/updateByPrimaryKeySelective.do")
    @ResponseBody
    public int updateByPrimaryKeySelective(
            Integer smId,
            String smName,
            String smAccount) throws Exception {

        SystemManager systemManager = new SystemManager();
        systemManager.setSmId(smId);
        systemManager.setSmName(smName);
        systemManager.setSmAccount(smAccount);
        adminService.updateByPrimaryKeySelective(systemManager);
        return 1;


    }

    /**
     * 删除
     * @param id
     * @throws Exception
     */
    @RequestMapping("/deleteByPrimaryKey.do")
    @ResponseBody
    public int deleteByPrimaryKey(Integer smId) throws Exception {
        adminService.deleteByPrimaryKey(smId);
        return 1;
    }

}

代码讲解
(1)@RequestParam
将请求参数绑定到控制器的方法参数上(是springmvc中接收普通参数的注解)

语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)

value:参数名

required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。

defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

(2)HashMap

在java编程语言中最基本的数据结构有两种,数组和链表。

  • 数组:查询速度快,可以根据索引查询;但插入和删除比较困难;
  • 链表:查询速度慢,需要遍历整个链表,但插入和删除操作比较容易。

hashmap是数组和链表组成的,数据结构中又叫“链表散列”。

本项目中,使用HashMap这个存储结构是为了传递多个参数

传递一个参数一般使用int类型,比如通过id查询用户信息:User findUserById(int id);
传递两个参数可以直接传递,比如通过名字和性别来查询用户信息:User findUser(int name,String sex);

传递两个及两个以上,就可以使用HashMap来进行传递;

比如:通过名字和性别来查询用户信息,就可以这样写:List findUser(HashMap map);这里传参就直接是map,这样测试的时候,就直接通过map.put(key,value),将多个要传递的参数的值放入map中,从而传递到后端;

(3)PageHelper与PageInfo

我们在使用分页时,首先要在pom中导包,本项目pom中导入了如下分页jar包。


    <dependency>
      <groupId>com.github.pagehelpergroupId>
      <artifactId>pagehelperartifactId>
      <version>5.0.0version>
    dependency>

其次,导包结束后,要将其配置到spring和mybatis整合的配置文件中。


	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			
			<property name="reasonable" value="true"/>
		plugin>
	plugins>

方法调用

使用PageHelper.startPage 静态方法调用startPage :

PageHelper.startPage()方法特点:

  1. 静态方法,传递两个参数(当前页码,每页查询条数)
  2. 使用pageHelper 分页的时候,不再关注具体的分页语句,查询全部的语句
  3. 自动的对PageHelper.startPage()方法下一行的第一个sql 查询进行分页

PageInfo.class是插件里的类,非常方便的调用,分页再次提高性能

下面是PageInfo.calss部分代码

    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
 
    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"
 
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
 
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
 
    //前一页
    private int prePage;
    //下一页
    private int nextPage;
    //是否为第一页
    private boolean isFirstPage;
    //是否为最后一页
    private boolean isLastPage;
    //是否有前一页
    private boolean hasPreviousPage;
    //是否有下一页
    private boolean hasNextPage;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;
 
    public PageInfo() {
        this.isFirstPage = false;
        this.isLastPage = false;
        this.hasPreviousPage = false;
        this.hasNextPage = false;
    }            

pageInfo.getTotal() 总记录数
在真正使用时, 会发现total的值并不等于数据库中记录总数, 并且该值永远等于查询页的记录数, 即getTotal和getSize()效果相同。查看SQL日志, 可发现startPage()方法成功执行, 返回的List是符合查询条件的。PageInfo.getList()返回的是一个结果集

(4)MD5Utils.encodeByMD5(smPassword)

add.do映射中,设置密码使用了MD5加密工具类,其主要作用为保存的密码加密保存到数据库中。

​ Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)。
​ MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
本项目的MD5工具类如下:

class MD5Utils {
        /** 十六进制下数字到字符的映射数组 */
        private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
                "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

        /**
         * 对字符串进行MD5编码
         * @param originString
         * @return
         */
        public static String encodeByMD5(String originString) {
            if (originString != null){
                StringBuffer stringBuffer = new StringBuffer();
                stringBuffer.append(originString);
                //BookSharingPlatform  MD5加密后的32位数字作为秘钥
                stringBuffer.append("esms");
                //加入秘钥后的字符串在进行MD5加密
                originString = String.valueOf(stringBuffer);
                try {
                    MessageDigest md = MessageDigest.getInstance("MD5");
                    byte[] results = md.digest(originString .getBytes());
                    String resultString = byteArrayToHexString(results);
                    return resultString.toUpperCase();//转为大写
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            return null;
        }

        /**
         * 转换字节数组为16进制字串
         *
         * @param b  字节数组
         * @return 十六进制字串
         */
        private static String byteArrayToHexString(byte[] b) {
            StringBuffer resultSb = new StringBuffer();
            for (int i = 0; i < b.length; i++) {
                resultSb.append(byteToHexString(b[i]));
            }
            return resultSb.toString();
        }

        /**
         * 将一个字节转化成16进制形式的字符串
         * @param b
         * @return
         */
        private static String byteToHexString(byte b) {
            int n = b;
            if (n < 0) {
                n = 256 + n;
            }
            int d1 = n / 16;
            int d2 = n % 16;
            return hexDigits[d1] + hexDigits[d2];
        }
        
        public static void main(String[] args) {
			System.out.println(encodeByMD5("123456"));
		}
}

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer方法

  1. public StringBuffer append(String s)
    将指定的字符串追加到此字符序列。
  2. public StringBuffer reverse()
    将此字符序列用其反转形式取代。
  3. public delete(int start, int end)
    移除此序列的子字符串中的字符。
  4. public insert(int offset, int i)
    int 参数的字符串表示形式插入此序列中。
  5. insert(int offset, String str)
    str 参数的字符串插入此序列中。
  6. replace(int start, int end, String str)
    使用给定 String 中的字符替换此序列的子字符串中的字符。

制作不易,项目源码+v:www_098789
觉得不错点个关注吧~

你可能感兴趣的:(Java,java,mysql,intellij-idea,mybatis)