博客系统
注册使用确认密码,使用MD5+盐值的方式将用户密码加密存储在数据库中
登录时在数据库里面查询对比用户名,调用解密函数成功登录后将用户信息存储在session里面
用户登录以后,可以使用MarkDown编辑器编辑博客,然后发表博客
未登录也可以浏览博客,查看别人发表的博客
修改必须是建立在已登录的基础上,点击修改按钮,跳转到编辑页面,文章标题和内容都不为空,点击修改,即可成功
使用MD5加密。每次加密之前,给密码加上不同的盐值(32)生成一个最终密码(32)
存储在数据库里面的密码(64)=盐值+最终密码
草稿功能和发表文章类似,但是也有稍微的区别
<insert id="SaveDraft">
insert into articleinfo (title,content,uid,state) values(#{title},#{content},#{uid},2)
</insert>
MyBatis 是一款优秀的持久层框架,MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
MyBatis 也是一个 ORM 框架,会将数据库模型的每张表都映射为一个 Java 类,把字段映射为对象的属性,也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表
public class AjaxResult {
public static HashMap<String, Object> success(Object data) {
HashMap<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("msg", "");
result.put("data", data);
return result;
}
public static HashMap<String, Object> fail(int code,String msg) {
HashMap<String, Object> result = new HashMap<>();
result.put("code", code);
result.put("msg", msg);
result.put("data", "");
return result;
}
统⼀的数据返回格式可以使用 @ControllerAdvice ,
类实现ResponseBodyAdvice 接口,重写supports() 方法和beforeBodyWrite() 方法实现
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if(body instanceof HashMap){//本身已经封装好
return body;
}
if(body instanceof String){//返回类型是String(特殊类型)
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.writeValueAsString(AjaxResult.success(body));
}
return AjaxResult.success(body);
}
}
@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执行某个方法事件
@ControllerAdvice
@ResponseBody
public class ExceptionAdvice {
@ExceptionHandler(Exception.class)
public Object exceptionAdvice(Exception e){
return AjaxResult.fail(-1,e.getMessage());//程序报错的时候返回给前端的一个对象
}
}
Spring 中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步骤:
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception{
//有session 就得到,没有也不创建,和controller 里面的session 不一样
HttpSession session = request.getSession(false);
if(session!= null && session.getAttribute(Constant.SESSION_USERINFO_KEY) != null){
//从session中得到userinfo 对象,表示已经登录
//不等于空,表示当前已经登录
return true;
}
response.setStatus(401);//401表示没有登录,403表示登录但是没有权限
return false;
}
}
@RequestMapping("reg")//注册功能
public Object reg(String username,String password){//返回的是包装的数据类型
//1.非空校验
if(!StringUtils.hasLength(username) || !StringUtils.hasLength(password)){
return AjaxResult.fail(-1,"非法的参数请求");
}
//2.添加操作
int result = userService.add(username,password);
if(result == 1){
return AjaxResult.success("添加成功!",1);
}else {
return AjaxResult.fail(-1,"数据库添加出错!");
}
}
@RequestMapping("/update")//更新文章内容
public int update(HttpServletRequest request,Integer aid,String title,String content){
//1.非空校验
if(aid == null || title == null || content == null){
return 0;
}
UserInfo userInfo = SessionUtil.getLoginUser(request);
if(userInfo != null && userInfo.getId() >0){
return articleService.update(aid,userInfo.getId(),title,content);
}
return 0;
}
public static String encrypt(String password ) {
//每次生成内容不同的,但长度固定的32位的盐值
String salt = UUID.randomUUID().toString().replace("-","");
//最终密码=md5(盐值+密码)
String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
return salt + finalPassword;
}
function getURLParam(key){
var params = location.search;
if(params.indexOf("?") >=0){
params = params.substring(params.indexOf("?")+1);
var paramArr = params.split('&');
for(var i=0; i<paramArr.length;i++){
var namevalues = paramArr[i].split("=");
if(namevalues[0]==key){
return namevalues[1];
}
}
}else{
return "";
}
}
spring:
datasource:
url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&useSSL=false
username: root
password: 942599
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
configuration: # 配置打印 MyBatis 执行的 SQL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl