[Java] Grundlegende Grammatik und Anwendung von SpringBoot

Die folgenden Analysen und Anwendungen beziehen sich alle auf Springboot mit Front-End- und Back-End-Trennung

1. Analyse jeder Ebene

Aufgeteilt in mehrere Ebenen:
Hierarchie

1.1 Hierarchische Beziehung

entity
mapper
service
serviceImpl
controller

Referenz: Hierarchische Beziehungsanalyse
Hierarchie

1.2 Hierarchische Rolle

Siehe auch: Hierarchie

  1. Entitätsschicht

Gleicher Typ: Modellschicht = Entitätsschicht = Domänenschicht
Funktion: Wird zum Speichern unserer Entitätsklassen verwendet, die grundsätzlich mit den Attributwerten in der Datenbank übereinstimmen.

  1. Mapper-Ebene

Ähnlich: Mapper-Schicht = Dao-Schicht
Funktion: Führen Sie Datenpersistenzoperationen für die Datenbank durch, und ihre Methodenanweisungen zielen direkt auf Datenbankoperationen ab

  1. Serviceschicht

Gleicher Typ: Nur eine Serviceschicht.
Funktion: Die Serviceschicht ist der Controller für die Controllerschicht, also für unsere Benutzer.
Das Impl des Dienstes ist eine Datei, die Mapper und Dienst integriert.

  1. Controller-Schicht

Ähnlich: Controller-Schicht = Web-Schicht
Funktion: Controller, Import-Service-Schicht, da die Methode im Service das ist, was wir verwenden, führt der Controller Geschäftsvorgänge aus, indem er die vom Front-End übergebenen Parameter empfängt und dann die Verarbeitungsergebnisse an das Front-End zurückgibt .

2. Datenbank: MyBatis

CRUD-Syntax:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.main.datainfo.mapper.UserMapper">
    <select id="getAllUsers" resultType="User">select * from user</select>
    <select id="getUserByPhone" resultType="User">select * from user where phone=#{phone}</select>
    <insert id="insertUser">
        insert into user(name,password,phone,job,question,answer, tags)
        values (#{name},#{password},#{phone},#{job},#{question},#{answer},#{tags})
    </insert>
    <update id="updatePasswd">
        update user set password = #{new_password} where phone = #{phone}
    </update>
</mapper>

Unter diesen sollte die ID der ID im Mapper entsprechen

2.1 Betreten von Gruben

2.1.1 Das Abfrageergebnis ist null oder 0

Der Datenbankfeldname ist auf unterstrichen gesetzt: user_id, das Abfrageergebnis ist 0 und das Abfrageergebnis des Wechsels zum Typ varchar ist null. Es stellt sich heraus, dass es sich um ein Problem mit dem MyBatis-Mechanismus handelt. Legen Sie die resultMap entweder selbst fest oder entfernen Sie den Unterstrich.
Referenz: [MyBatis ist auf die Grube getreten] Führen Sie SQL korrekt aus und drucken Sie es auf der Konsole aus, aber der Wert ist [null] ==> unterstrichener Feldname

2.2 Anwendung

2.2.1 Abfrage des Artikeldatensatzes durchsuchen

Spezifische Anforderungen:
Fragen Sie Informationen zu Artikeln ab, die von einem Benutzer durchsucht wurden.
Hinweis:
Es ist möglich, dass ein Benutzer diesen Artikel im vorherigen Moment durchsucht hat und diesen Artikel im nächsten Moment erneut durchsucht hat. Dieser Artikel erscheint nur einmal in der Tabelle und ist das neueste Suchergebnis.

Hinweis: Es wird das Tool PageHelper verwendet.

Die Abfrageanweisung lautet wie folgt:

	<select id="getBehaviorsByUserIDAndType" resultType="com.main.datainfo.entity.Behavior">
        select * from behavior where id in (
            select max(id) from behavior
            where userID=#{userID} and type=#{type} group by articleID order by time desc
        ) order by time desc
    </select>

Referenz: Grundlegende Verwendung von PageHelper
Die Anweisungen, die PageHelper verwenden, lauten wie folgt:

	@Override
    public List<Behavior> getBehaviorsByUserIDAndTypeByPage(int userID, int type, int pageNum,int pageSize){
    
    
        PageHelper.startPage(pageNum, pageSize);
        return behaviorMapper.getBehaviorsByUserIDAndType(userID, type);
    }

3. Rechteverwaltung

Sehr umfassend: Auf einen Blick verstehen! Front-End- und Back-End-getrenntes Anmeldeabfangen basierend auf dem Springboot-Interceptor

3.1 Erstellen Sie einen Abfangjäger

package com.main.datainfo.interceptor;

import com.main.datainfo.entity.User;
import com.main.datainfo.service.AuthService;
import com.main.datainfo.utils.HttpContextUtil;
import com.main.datainfo.utils.Result;
import com.main.datainfo.utils.TimeUtil;
import com.main.datainfo.utils.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.ModelAndView;
import java.time.LocalDateTime;

public class AuthInterceptor implements HandlerInterceptor {
    
    
    @Autowired
    private AuthService authService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
    
    
        String token = TokenUtil.getRequestToken(request);
        //如果token为空
        if (StringUtils.isBlank(token)) {
    
    
            setReturn(response,400,"用户未登录,请先登录");
            return false;
        }
        //1. 根据token,查询用户信息
        User user = authService.findByToken(token);
        //2. 若用户不存在,
        if (user == null) {
    
    
            setReturn(response,400,"用户不存在");
            return false;
        }
        //3. token失效
        if (TimeUtil.StringToLocalDateTime(user.getExpireTime()).isBefore(LocalDateTime.now())) {
    
    
            setReturn(response,400,"用户登录凭证已失效,请重新登录");
            return false;
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
    
    

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    
    

    }
    //返回错误信息
    private static void setReturn(HttpServletResponse response, int status, String msg) throws IOException {
    
    
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
        httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtil.getOrigin());
        //UTF-8编码
        httpResponse.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=utf-8");
        Result build = Result.build(status, msg);
        String json = JSON.toJSONString(build);
        httpResponse.getWriter().print(json);
    }

}

3.2 Interceptor registrieren: Konfigurationsklasse

import com.main.datainfo.interceptor.AuthInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        InterceptorRegistration registration = registry.addInterceptor(new AuthInterceptor());
        registration.addPathPatterns("/**");//所有路径都被拦截
        registration.excludePathPatterns("/login");//login不被拦截
    }
}

3.3 Service- und ServiceImpl-Klasse

package com.main.datainfo.service;

import com.main.datainfo.entity.User;

public interface AuthService {
    
    

    User findByPhone(String phone);
    User findByToken(String token);
    String createToken(User user);

    //根据token去修改用户token ,使原本token失效
    void logout(String token);
}

Einige Abfragevorgänge in UserMapper werden verwendet

package com.main.datainfo.service.impl;

import com.main.datainfo.entity.User;
import com.main.datainfo.mapper.UserMapper;
import com.main.datainfo.service.AuthService;
import com.main.datainfo.utils.TimeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.UUID;

@Service
public class AuthServiceImpl implements AuthService {
    
    

    @Autowired
    private UserMapper userMapper;

    @Override
    public User findByPhone(String phone) {
    
    
        return userMapper.getUserByPhone(phone);
    }
    @Override
    public User findByToken(String token) {
    
    
        return userMapper.getUserByToken(token);
    }
    //12小时后失效
    private final static int EXPIRE = 12;

    @Override
    public String createToken(User user) {
    
    
        //用UUID生成token
        String token = UUID.randomUUID().toString();
        //当前时间
        LocalDateTime now = LocalDateTime.now();
        //过期时间
        LocalDateTime expireTime = now.plusHours(EXPIRE);
        //保存到数据库

        user.setLoginTime(TimeUtil.LocalDateTimetoString(now));
        user.setExpireTime(TimeUtil.LocalDateTimetoString(expireTime));
        user.setToken(token);
        userMapper.updateLoginInfo(user);
        return token;
    }

    @Override
    public void logout(String token) {
    
    
        User user = userMapper.getUserByToken(token);
        //用UUID生成token
        token = UUID.randomUUID().toString();
        //修改用户的token使原本的token失效,前端需配合将token清除
        user.setToken(token);
        userMapper.updateLoginInfo(user);
    }
}

3.4 Controller-Klasse

package com.main.datainfo.controller;

import com.main.datainfo.entity.Token;
import com.main.datainfo.entity.User;
import com.main.datainfo.service.AuthService;
import com.main.datainfo.utils.Result;
import com.main.datainfo.utils.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping
public class AuthController {
    
    

    @Autowired
    AuthService authService;

    @RequestMapping("/login")
    public Result login(HttpServletRequest request) {
    
    
        String phone = request.getParameter("phone");
        String password = request.getParameter("password");
        //System.out.println(phone+" "+password);
        //用户信息
        User user = authService.findByPhone(phone);
        //账号不存在、密码错误
        if (user == null || !user.getPassword().equals(password)) {
    
    
            return Result.build(400, "用户名或密码错误");
        } else {
    
    
            //生成token,并保存到数据库
            String token = authService.createToken(user);
            Token tokenVO = new Token();
            tokenVO.setToken(token);
            return Result.ok(tokenVO);
        }
    }

    @PostMapping("/logout")
    public Result logout(HttpServletRequest request) {
    
    
        //从request中取出token
        String token = TokenUtil.getRequestToken(request);
        authService.logout(token);
        return Result.ok();
    }

    @RequestMapping("/test")
    public Result test() {
    
    
        return Result.ok("恭喜你,验证成功啦,我可以返回数据给你");
    }
}

4. Dateivorschau

Weitere Informationen finden Sie in meinen anderen Blog-Beiträgen:
[1] [Back-End-Lernen] Das Back-End der SpringBoot-Website konvertiert Word- oder andere Office-Dateien in PDF und wandelt sie dann Seite für Seite in Bilder zur Anzeige auf der Website um Front-End (Linux)
[2] [Back-End-Lernen] Springboot-Back-End konvertiert PPT-Datei in PDF

Ich denke du magst

Origin blog.csdn.net/Kandy0125/article/details/121251458
Empfohlen
Rangfolge