首先建立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');
建立与数据库对应的实体名称,便于在后端代码中数据库与接口的连接。
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 + '\'' +
'}';
}
}
这里主要是建立与实体对应的接口,因为使用的是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);
}
这里主要写业务代码,除了实现简单的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;
}
}
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;
}
}
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;
}
}
语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
在java编程语言中最基本的数据结构有两种,数组和链表。
hashmap是数组和链表组成的,数据结构中又叫“链表散列”。
本项目中,使用HashMap
传递一个参数一般使用int类型,比如通过id查询用户信息:User findUserById(int id);
传递两个参数可以直接传递,比如通过名字和性别来查询用户信息:User findUser(int name,String sex);
传递两个及两个以上,就可以使用HashMap
比如:通过名字和性别来查询用户信息,就可以这样写:List findUser(HashMap
我们在使用分页时,首先要在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()方法特点:
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()返回的是一个结果集
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方法
int
参数的字符串表示形式插入此序列中。str
参数的字符串插入此序列中。String
中的字符替换此序列的子字符串中的字符。制作不易,项目源码+v:www_098789
觉得不错点个关注吧~