一、需求分析
(一)页面原型展示
- 登录页面有两个文本框需要用户输入用户名和密码,客户端要进行非空校验,单击【登录】按钮之后,表单数据以JSON格式通过AJAX请求方式发送到后台,后台控制器要编写相应的处理函数,对提交的数据进行业务处理,然后将处理结果返回给前端。
- 不妨看一看
login.html
页面代码
!DOCTYPE html>
<html lang="en"><head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>瑞吉外卖管理端</title>
<link rel="shortcut icon" href="../../favicon.ico">
<!-- 引入样式 -->
<link rel="stylesheet" href="../../plugins/element-ui/index.css" />
<link rel="stylesheet" href="../../styles/common.css">
<link rel="stylesheet" href="../../styles/login.css">
<link rel="stylesheet" href="../../styles/icon/iconfont.css" />
<style>
.body{
min-width: 1366px;
}
</style>
</head><body>
<div class="login" id="login-app">
<div class="login-box">
<img src="../../images/login/login-l.png" alt="">
<div class="login-form">
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" >
<div class="login-form-title">
<img src="../../images/login/logo.png" style="width:139px;height:42px;" alt="" />
</div>
<el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号" maxlength="20"
prefix-icon="iconfont icon-user" />
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" type="password" placeholder="密码" prefix-icon="iconfont icon-lock" maxlength="20"
@keyup.enter.native="handleLogin" />
</el-form-item>
<el-form-item style="width:100%;">
<el-button :loading="loading" class="login-btn" size="medium" type="primary" style="width:100%;"
@click.native.prevent="handleLogin">
<span v-if="!loading">登录</span>
<span v-else>登录中...</span>
</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div><!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="../../plugins/vue/vue.js"></script>
<!-- 引入组件库 -->
<script src="../../plugins/element-ui/index.js"></script>
<!-- 引入axios -->
<script src="../../plugins/axios/axios.min.js"></script>
<script src="../../js/request.js"></script>
<script src="../../js/validate.js"></script>
<script src="../../api/login.js"></script><script>
new Vue({
el: '#login-app',
data() {
return {
loginForm:{
username: 'admin',
password: '123456'
},
loading: false
}
},
computed: {
loginRules() {
const validateUsername = (rule, value, callback) => {
if (value.length < 1 ) {
callback(new Error('请输入用户名'))
} else {
callback()
}
}
const validatePassword = (rule, value, callback) => {
if (value.length < 6) {
callback(new Error('密码必须在6位以上'))
} else {
callback()
}
}
return {
'username': [{ 'validator': validateUsername, 'trigger': 'blur' }],
'password': [{ 'validator': validatePassword, 'trigger': 'blur' }]
}
}
},
created() {
},
methods: {
async handleLogin() {
this.$refs.loginForm.validate(async (valid) => {
if (valid) {
this.loading = true
let res = await loginApi(this.loginForm)
if (String(res.code) === '1') {
localStorage.setItem('userInfo',JSON.stringify(res.data))
window.location.href= '/backend/index.html'
} else {
this.$message.error(res.msg)
this.loading = false
}
}
})
}
}
})
</script>
</body>
</html>
Vue对象通过el
属性绑定了id
属性为login-app
的div
元素
(二)登录页面展示
- 页面位置:
项目/resources/backend/page/login/login.html
二、代码开发
(一)创建雇员实体类
- ORM(Object Relation Mapping)对象关系映射
- 创建`entity`子包、在
net.hw.entity
包里创建雇员实体类 -Employee
package net.luog.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; @Data //lobok注解,提供类的get,set方法 public class Employee implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String username; private String name; private String password; private String phone; private String sex; private String idNumber; private Integer status; private LocalDateTime createTime; private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long createUser; @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; }
(二)创建雇员映射器接口
- 创建
mapper
子包、在net.hw.mapper
包里创建雇员映射器接口 -EmployeeMapper
package net.hw.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.hw.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
/**
* 功能:雇员映射器接口
* 作者:华卫
* 日期:2022年11月03日
*/
@Mapper // 交给Spring容器来管理
public interface EmployeeMapper extends BaseMapper<Employee> {
}
- 继承了
BaseMapper<Employee>
接口,无需编写任何代码,直接就实现了对Employee
进行增删改查的功能。
(三)创建雇员服务
1、创建雇员服务接口
- 创建
service
子包、在net.hw.service
包里创建雇员服务接口 -EmployeeService
- 采用mybatis-plus插件,代码及其简单,只需要继承
IService<Employee>
接口
package net.luog.service; import com.baomidou.mybatisplus.extension.service.IService; import net.luog.entity.Employee; public interface EmployeeService extends IService<Employee> { }
2、创建雇员服务接口实现类
- 在
net.hw.service
包里创建impl
子包、在net.hw.service.impl
子包里创建雇员服务接口实现类 -EmployeeServiceImpl
package net.luog.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import net.luog.entity.Employee; import net.luog.mapper.EmployeeMapper; import org.springframework.stereotype.Service; @Service // public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> { }
(四)创建返回结果类
- 服务器端所有处理方法返回结果都封装到这个通用类里
- 创建
common
子包、在net.hw.common
包里创建返回结果类 -R
package net.luog.common; //返回结果类 import lombok.Data; import java.util.HashMap; import java.util.Map; @Data public class R<T> { private Integer code; //编码:1成功,0和其它数字为失败 private String msg; //错误信息 private T data; //数据 private Map map = new HashMap(); //动态数据 public static <T> R<T> success(T object) { R<T> r = new R<T>(); r.data = object; r.code = 1; return r; } public static <T> R<T> error(String msg) { R r = new R(); r.msg = msg; r.code = 0; return r; } public R<T> add(String key, Object value) { this.map.put(key, value); return this; } }
(五)创建雇员控制器
- 创建
controller
子包在net.hw.controller
包里创建雇员控制器类 -EmployeeController
package net.luog.controller; import lombok.extern.slf4j.Slf4j; import net.luog.common.R; import net.luog.entity.Employee; import net.luog.service.EmployeeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @Slf4j // 日志注解 @RestController // 交给Spring容器管理 @RequestMapping("/employee") public class EmployeeController { @Autowired private EmployeeService employeeService; @PostMapping("/login") public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee) { return null; } }
三、哈希加密
(一)加解密基础
采用md5加密算法
- 在
net.hw.common
包里创建Encrypt
类
package net.luog.common; import org.springframework.util.DigestUtils; import java.util.Scanner; public class Encrypt { public static void main(String[] args) { // 声明变量 String plainText, cryptoText; Scanner sc = new Scanner(System.in); // 输入待加密字符串 System.out.print("输入待加密字符串:"); plainText = sc.nextLine(); // 采用MD5加密算法进行加密 cryptoText = DigestUtils.md5DigestAsHex(plainText.getBytes()); // 输出MD5加密字符串 System.out.println("加密之后的字符串:" + cryptoText); System.out.println("md5加密字符串长度:" + cryptoText.length()); } }
运行结果