From 9b3dbdc74b2a508249b1d1e489db8a2134a3a7de Mon Sep 17 00:00:00 2001
From: 安瑾然 <107107765@qq.com>
Date: 星期一, 18 七月 2022 15:36:31 +0800
Subject: [PATCH] 权限模块

---
 src/test/java/com/example/jz/dao/UserDaoTest.java                   |   30 +
 src/main/java/com/example/jz/auth/DefaultPwdEncoder.java            |   34 +
 src/main/resources/mapper/ReportDao.xml                             |   63 +++
 src/main/java/com/example/jz/dao/ReportDao.java                     |   11 
 src/main/java/com/example/jz/utils/MD5Utils.java                    |  131 ++++++
 src/main/java/com/example/jz/controller/ReportController.java       |   15 
 src/main/java/com/example/jz/service/impl/CauseServiceImpl.java     |   37 +
 pom.xml                                                             |   11 
 src/main/java/com/example/jz/service/ReportService.java             |   11 
 src/main/java/com/example/jz/auth/MyUnAuthEntryPoint.java           |   35 +
 src/main/java/com/example/jz/auth/MyAccessDeniedHandler.java        |   40 ++
 src/main/java/com/example/jz/modle/dto/ReportParamDto.java          |   43 ++
 src/main/java/com/example/jz/controller/AnnouncementController.java |    1 
 src/main/java/com/example/jz/service/impl/ReportServiceImpl.java    |   26 +
 src/main/java/com/example/jz/auth/UserDetailService.java            |   50 ++
 src/main/java/com/example/jz/auth/TokenAuthFilter.java              |   66 +++
 src/main/java/com/example/jz/modle/dto/AddReportDto.java            |   31 +
 src/main/java/com/example/jz/modle/entity/Report.java               |    5 
 src/main/java/com/example/jz/modle/entity/User.java                 |  129 -----
 src/main/java/com/example/jz/auth/TokenLoginFilter.java             |   72 +++
 src/main/java/com/example/jz/controller/CauseController.java        |   54 ++
 src/main/java/com/example/jz/modle/vo/ReportListVo.java             |   13 
 src/main/java/com/example/jz/modle/entity/SecurityUser.java         |   73 +++
 src/main/java/com/example/jz/auth/MyTokenSecurityConfig.java        |  103 +++++
 src/main/java/com/example/jz/dao/UserDao.java                       |    3 
 src/main/java/com/example/jz/auth/MyLogoutHandler.java              |   51 ++
 src/main/java/com/example/jz/auth/TokenJwtManager.java              |   47 ++
 src/main/java/com/example/jz/service/CauseService.java              |    3 
 28 files changed, 1,052 insertions(+), 136 deletions(-)

diff --git a/pom.xml b/pom.xml
index 2b8c206..9b62808 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,6 +88,17 @@
             <artifactId>hutool-all</artifactId>
             <version>5.8.3</version>
         </dependency>
+        <!-- 鏉冮檺楠岃瘉 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <!-- JWT -->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.19.2</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/example/jz/auth/DefaultPwdEncoder.java b/src/main/java/com/example/jz/auth/DefaultPwdEncoder.java
new file mode 100644
index 0000000..17f4434
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/DefaultPwdEncoder.java
@@ -0,0 +1,34 @@
+package com.example.jz.auth;
+
+import com.example.jz.utils.Md5Utils;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:52 AM
+ * @description 瀵嗙爜鍔犲瘑绠楁硶
+ */
+@Component
+public class DefaultPwdEncoder  implements PasswordEncoder {
+    /**
+     * 鍔犲瘑
+     * @param charSequence
+     * @return
+     */
+    @Override
+    public String encode(CharSequence charSequence) {
+        return Md5Utils.md5(charSequence.toString());
+    }
+
+    /**
+     * 杩涜瀵嗙爜姣斿
+     * @param charSequence 涓嶅姞瀵�
+     * @param encodePwd  鍔犲瘑
+     * @return
+     */
+    @Override
+    public boolean matches(CharSequence charSequence, String encodePwd) {
+        return encodePwd.equalsIgnoreCase(Md5Utils.md5(charSequence.toString()));
+    }
+}
diff --git a/src/main/java/com/example/jz/auth/MyAccessDeniedHandler.java b/src/main/java/com/example/jz/auth/MyAccessDeniedHandler.java
new file mode 100644
index 0000000..0ad7404
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/MyAccessDeniedHandler.java
@@ -0,0 +1,40 @@
+package com.example.jz.auth;
+
+
+import cn.hutool.json.JSONUtil;
+import com.example.jz.modle.R;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.web.access.AccessDeniedHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:35 AM
+ * @description 鏃犳潈璁块棶閰嶇疆
+ */
+@Component
+public class MyAccessDeniedHandler implements AccessDeniedHandler {
+
+    @Override
+    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
+        R<String> r = new R<>();
+        r.setCode(403);
+        r.setMsg("鏃犳潈璁块棶");
+        r.setData(null);
+        // 璁剧疆杩斿洖娑堟伅绫诲瀷
+        httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8");
+        httpServletResponse.setCharacterEncoding("utf-8");
+        httpServletResponse.setContentType("application/json;charset=UTF-8");
+        // 杩斿洖缁欒姹傜
+        PrintWriter writer = httpServletResponse.getWriter();
+        writer.write(JSONUtil.toJsonStr(r));
+        writer.flush();
+        writer.close();
+    }
+}
diff --git a/src/main/java/com/example/jz/auth/MyLogoutHandler.java b/src/main/java/com/example/jz/auth/MyLogoutHandler.java
new file mode 100644
index 0000000..6f1e8d7
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/MyLogoutHandler.java
@@ -0,0 +1,51 @@
+package com.example.jz.auth;
+
+import cn.hutool.json.JSONUtil;
+import com.example.jz.modle.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutHandler;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:45 AM
+ * @description 鐧诲嚭
+ */
+@Component
+public class MyLogoutHandler implements LogoutHandler {
+
+    private TokenJwtManager tokenJwtManager;
+
+    @Autowired
+    public void setTokenJwtManager(TokenJwtManager tokenJwtManager) {
+        this.tokenJwtManager = tokenJwtManager;
+    }
+
+    @Override
+    public void logout(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) {
+        // 浠巋eader涓幏鍙杢oken
+        String token = httpServletRequest.getHeader("token");
+        String username = tokenJwtManager.getUserName(token);
+        // 璁剧疆杩斿洖娑堟伅绫诲瀷
+        httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8");
+        httpServletResponse.setCharacterEncoding("utf-8");
+        httpServletResponse.setContentType("application/json;charset=UTF-8");
+        // 杩斿洖缁欒姹傜
+        PrintWriter writer = null;
+        try {
+            writer = httpServletResponse.getWriter();
+            writer.write(JSONUtil.toJsonStr(R.ok(null, username + "鐧诲嚭鎴愬姛")));
+            writer.flush();
+            writer.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+}
diff --git a/src/main/java/com/example/jz/auth/MyTokenSecurityConfig.java b/src/main/java/com/example/jz/auth/MyTokenSecurityConfig.java
new file mode 100644
index 0000000..1e9aea1
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/MyTokenSecurityConfig.java
@@ -0,0 +1,103 @@
+package com.example.jz.auth;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 11:23 AM
+ * @description
+ */
+@Configuration
+@EnableGlobalMethodSecurity(prePostEnabled = true)  // 鏂规硶澧炲姞鏉冮檺
+public class MyTokenSecurityConfig extends WebSecurityConfigurerAdapter {
+
+    // 灏� UserDetailService 娉ㄥ叆锛屼娇鍏跺幓鏌ヨ鏁版嵁搴�
+    @Autowired
+    private UserDetailService userDetailsService;
+
+    // token 鐢熸垚鍣�
+    @Autowired
+    private TokenJwtManager tokenManager;
+
+    // 鑷畾涔夊瘑鐮佸姞瀵嗚В瀵�
+    @Autowired
+    private DefaultPwdEncoder defaultPwdEncoder;
+
+    // 鏈櫥褰昲andler
+    @Autowired
+    private MyUnAuthEntryPoint myUnAuthEntryPoint;
+
+    // 鏃犳潈闄�
+    @Autowired
+    private MyAccessDeniedHandler myAccessDeniedHandler;
+
+    //  鐧诲嚭handler澶勭悊
+    @Autowired
+    private MyLogoutHandler myLogoutHandler;
+
+
+    /**
+     * 鐧诲綍鏃讹紝浠庢暟鎹簱鑾峰彇鍩烘湰淇℃伅鍜屾潈闄愪俊鎭�
+     *
+     * @param auth
+     * @throws Exception
+     */
+    @Override
+    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+        // 璁剧疆 userDetailsService 鍜� 瀵嗙爜瑙f瀽
+        auth.userDetailsService(userDetailsService).passwordEncoder(defaultPwdEncoder);
+    }
+
+    /**
+     * 閰嶇疆璁块棶杩囨护
+     *
+     * @param http
+     * @throws Exception
+     */
+    @Override
+    protected void configure(HttpSecurity http) throws Exception {
+        http
+                .exceptionHandling()
+                .authenticationEntryPoint(myUnAuthEntryPoint) // 鏈櫥褰� handler
+                .accessDeniedHandler(myAccessDeniedHandler) // 鏃犳潈闄�
+                .and().csrf().disable() // 鍏抽棴 csrf 璺ㄥ煙璇锋眰
+                .formLogin()
+                .loginProcessingUrl("/login")  // 璁惧畾鐧诲綍璇锋眰鎺ュ彛
+                .usernameParameter("username")
+                .passwordParameter("password")
+                .permitAll()
+                .and()
+                .authorizeRequests() // 璇锋眰璁剧疆
+                .antMatchers("/user/register", "/webjars/**", "/swagger/**", "/v2/api-docs", "/doc.html", "/swagger-ui.html", "/swagger-resources/**" ).permitAll() // 閰嶇疆涓嶉渶瑕佽璇佺殑鎺ュ彛
+                .antMatchers("/api/**").permitAll() // 寮�鏀惧皬绋嬪簭鐨勬帴鍙�
+                .anyRequest().authenticated() // 浠讳綍璇锋眰閮介渶瑕佽璇�
+                .and()
+                .logout() // logout璁惧畾
+                .logoutUrl("/logout")  //閫�鍑鸿姹�  /logout 鏈畾涔夛紝浜ょ粰鑷畾涔塰andler瀹炵幇鍔熻兘
+                .addLogoutHandler(myLogoutHandler) // 鐧诲嚭 myLogoutHandler 澶勭悊
+                .and()
+                .addFilter(new TokenLoginFilter(tokenManager, authenticationManager())) // 璁よ瘉浜ょ粰 鑷畾涔� TokenLoginFilter 瀹炵幇
+                .addFilter(new TokenAuthFilter(authenticationManager(), tokenManager))
+                .httpBasic();
+    }
+
+    /**
+     * 閰嶇疆涓嶉渶瑕侀獙璇佺殑璁块棶璺緞
+     *
+     * @param web
+     * @throws Exception
+     */
+    @Override
+    public void configure(WebSecurity web) throws Exception {
+//        web.ignoring().antMatchers("/test", "/user/login");
+        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
+    }
+}
diff --git a/src/main/java/com/example/jz/auth/MyUnAuthEntryPoint.java b/src/main/java/com/example/jz/auth/MyUnAuthEntryPoint.java
new file mode 100644
index 0000000..9cd8e29
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/MyUnAuthEntryPoint.java
@@ -0,0 +1,35 @@
+package com.example.jz.auth;
+
+import cn.hutool.json.JSONUtil;
+import com.example.jz.modle.R;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:55 AM
+ * @description 鏈櫥褰曞鐞�
+ */
+@Component
+public class MyUnAuthEntryPoint implements AuthenticationEntryPoint {
+    @Override
+    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
+        // 璁剧疆杩斿洖娑堟伅绫诲瀷
+        httpServletResponse.setHeader("Content-type", "text/html;charset=UTF-8");
+        httpServletResponse.setCharacterEncoding("utf-8");
+        httpServletResponse.setContentType("application/json;charset=UTF-8");
+        // 杩斿洖缁欒姹傜
+        PrintWriter writer = httpServletResponse.getWriter();
+        writer.write(JSONUtil.toJsonStr(R.failed("褰撳墠璐︽埛鏈櫥褰�")));
+        writer.close();
+    }
+}
+
+
diff --git a/src/main/java/com/example/jz/auth/TokenAuthFilter.java b/src/main/java/com/example/jz/auth/TokenAuthFilter.java
new file mode 100644
index 0000000..b599189
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/TokenAuthFilter.java
@@ -0,0 +1,66 @@
+package com.example.jz.auth;
+
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:56 AM
+ * @description
+ */
+public class TokenAuthFilter extends BasicAuthenticationFilter {
+
+    private TokenJwtManager tokenJwtManager;
+
+    public TokenAuthFilter(AuthenticationManager authenticationManager, TokenJwtManager tokenJwtManager) {
+        super(authenticationManager);
+        this.tokenJwtManager = tokenJwtManager;
+    }
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
+        //鑾峰彇褰撳墠璁よ瘉鎴愬姛鐢ㄦ埛鏉冮檺淇℃伅
+        UsernamePasswordAuthenticationToken authRequest = getAuthentication(request);
+        if(authRequest != null){
+            // 鏈夋潈闄愶紝鍒欐斁鍏ユ潈闄愪笂涓嬫枃涓�
+            SecurityContextHolder.getContext().setAuthentication(authRequest);
+        }
+        // 鎵ц涓嬩竴涓� filter 杩囨护鍣ㄩ摼
+        chain.doFilter(request,response);
+    }
+
+    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
+        //浠巋eader鑾峰彇token
+        String token = request.getHeader("token");
+        if(token != null) {
+            //浠巘oken鑾峰彇鐢ㄦ埛鍚�
+            String username = tokenJwtManager.getUserName(token);
+            // 鐧诲綍鎴愬姛鏃讹紝浼氬皢鏉冮檺鏁版嵁瀛樺叆redis
+            // 杩欓噷鏄獙璇佽幏鍙栨潈闄愪俊鎭�
+            // 1銆佷粠redis涓幏鍙栧搴旇鐢ㄦ埛鐨勬潈闄愪俊鎭�
+            // 2銆佹垨浠庢暟鎹簱涓啀娆℃煡璇�
+            List<String> permissionValueList = Arrays.asList("admin","select");
+            Collection<GrantedAuthority> authority = new ArrayList<>();
+            for(String permissionValue : permissionValueList) {
+                SimpleGrantedAuthority auth = new SimpleGrantedAuthority(permissionValue);
+                authority.add(auth);
+            }
+            return new UsernamePasswordAuthenticationToken(username,token,authority);
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/example/jz/auth/TokenJwtManager.java b/src/main/java/com/example/jz/auth/TokenJwtManager.java
new file mode 100644
index 0000000..abf9544
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/TokenJwtManager.java
@@ -0,0 +1,47 @@
+package com.example.jz.auth;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.HashMap;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:46 AM
+ * @description token宸ュ叿绫�
+ */
+@Component
+public class TokenJwtManager {
+
+    // 璁剧疆token鏃堕棿
+    private int tokenEcpiration = 24 * 60 * 60 * 1000; // 1澶�
+
+    // 缂栫爜瀵嗛挜
+    private String tokenSignKey = "6^wy=$}E";
+
+    // 1銆佹牴鎹敤鎴峰悕鐢熸垚token
+    public String createToken(String username) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.SECOND, tokenEcpiration);
+
+        return JWT.create()
+                .withHeader(new HashMap<>())
+                .withClaim("username", username)
+                .withExpiresAt(calendar.getTime())
+                .sign(Algorithm.HMAC256(tokenSignKey));
+    }
+
+    // 2銆佹牴鎹畉oken寰楀埌鐢ㄦ埛鍚嶄俊鎭�
+    public String getUserName(String token) {
+        JWTVerifier build = JWT.require(Algorithm.HMAC256(tokenSignKey)).build();
+        DecodedJWT verify = build.verify(token);
+        Claim username = verify.getClaim("username");
+        return username.asString();
+    }
+}
+
diff --git a/src/main/java/com/example/jz/auth/TokenLoginFilter.java b/src/main/java/com/example/jz/auth/TokenLoginFilter.java
new file mode 100644
index 0000000..a181e93
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/TokenLoginFilter.java
@@ -0,0 +1,72 @@
+package com.example.jz.auth;
+
+import cn.hutool.json.JSONUtil;
+import com.example.jz.modle.R;
+import com.example.jz.modle.entity.SecurityUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:57 AM
+ * @description
+ */
+public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter {
+
+    private TokenJwtManager tokenJwtManager;
+    private AuthenticationManager authenticationManager;
+
+    public TokenLoginFilter(TokenJwtManager tokenJwtManager, AuthenticationManager authenticationManager) {
+        this.tokenJwtManager = tokenJwtManager;
+        this.authenticationManager = authenticationManager;
+        this.setPostOnly(false); // 鍏抽棴鐧诲綍鍙厑璁� post
+        // 璁剧疆鐧婚檰璺緞锛屽苟涓攑ost璇锋眰
+        this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/login", "POST"));
+    }
+
+    // 1銆佽幏鍙栫櫥褰曢〉浼犻�掓潵鐨勮处鎴峰拰瀵嗙爜淇℃伅
+    @Override
+    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
+        String username = request.getParameter("username");
+        String password = request.getParameter("password");
+
+        // 鐧诲綍鎺ュ彛 /login 璋冪敤璇锋眰鏃惰Е鍙�
+        // UsernamePasswordAuthenticationToken 灏佽鐧诲綍鏃朵紶閫掓潵鐨勬暟鎹俊鎭�
+        // 浜ょ粰 AuthenticationManager  杩涜鐧诲綍璁よ瘉鏍¢獙
+        return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username,
+                password, new ArrayList<>()));
+    }
+
+    // 2銆佽璇佹垚鍔熻皟鐢�
+    @Autowired
+    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult)
+            throws IOException, ServletException {
+        // 璁よ瘉鎴愬姛涔嬪悗锛岃幏鍙栬璇佸悗鐨勭敤鎴峰熀鏈俊鎭�
+        SecurityUser securityUser = (SecurityUser) authResult.getPrincipal();
+        // 鏍规嵁鐢ㄦ埛鍚嶇敓鎴愬搴旂殑token
+        String token = tokenJwtManager.createToken(securityUser.getUsername());
+        // token淇℃伅瀛樹簬redis銆佹暟鎹簱銆佺紦瀛樼瓑
+
+        // 璁剧疆杩斿洖娑堟伅绫诲瀷
+        response.setHeader("Content-type", "text/html;charset=UTF-8");
+        response.setCharacterEncoding("utf-8");
+        response.setContentType("application/json;charset=UTF-8");
+        // 杩斿洖缁欒姹傜
+        PrintWriter writer = response.getWriter();
+        writer.write(JSONUtil.toJsonStr(R.ok(token, "鐧诲綍鎴愬姛")));
+        writer.flush();
+        writer.close();
+    }
+}
diff --git a/src/main/java/com/example/jz/auth/UserDetailService.java b/src/main/java/com/example/jz/auth/UserDetailService.java
new file mode 100644
index 0000000..1ee9d8f
--- /dev/null
+++ b/src/main/java/com/example/jz/auth/UserDetailService.java
@@ -0,0 +1,50 @@
+package com.example.jz.auth;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.jz.dao.UserDao;
+import com.example.jz.modle.entity.SecurityUser;
+import com.example.jz.modle.entity.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:34 AM
+ * @description 鐢ㄦ埛璇︽儏鏈嶅姟
+ */
+@Service("userDetailsService")
+public class UserDetailService implements UserDetailsService {
+    // 娉ㄥ叆Usermapper
+    @Autowired
+    private UserDao userDao;
+
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+        // 閫氳繃username鏌ヨ鏁版嵁搴撹幏鍙栫敤鎴蜂俊鎭�
+        User user = userDao.selectOne(new LambdaQueryWrapper<>(User.class).eq(User::getLoginUsername, username));
+        // 鍒ゆ柇鐢ㄦ埛鏄惁瀛樺湪
+        if (user == null) {
+            throw new UsernameNotFoundException("璐︽埛淇℃伅涓嶅瓨鍦紒");
+        }
+        // 瀛樺湪瀵瑰簲鐨勭敤鎴蜂俊鎭紝鍒欏皢鍏跺皝瑁咃紝涓㈢粰security鑷繁鍘昏В鏋�
+
+        // 鐧诲綍鏃讹紝浼氳蛋杩欎釜鎺ュ彛
+        // 鏉冮檺鏆傛椂涓嶆煡鏁版嵁搴�
+        List<String> roles = Arrays.asList("ROLE_admin,admin");
+
+        // 灏嗘暟鎹皝瑁呯粰 SecurityUser 锛屽洜涓� SecurityUser 鏄� UserDetails 鐨勫瓙绫�
+        SecurityUser securityUser = new SecurityUser();
+        securityUser.setPermissionValueList(roles);
+        securityUser.setUsername(user.getLoginUsername());
+        securityUser.setPassword(user.getLoginPassword());
+
+        return securityUser;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/example/jz/controller/AnnouncementController.java b/src/main/java/com/example/jz/controller/AnnouncementController.java
index 1a91dbb..d537234 100644
--- a/src/main/java/com/example/jz/controller/AnnouncementController.java
+++ b/src/main/java/com/example/jz/controller/AnnouncementController.java
@@ -6,6 +6,7 @@
 import com.example.jz.modle.entity.Announcement;
 import com.example.jz.modle.R;
 import com.example.jz.service.AnnouncementService;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
diff --git a/src/main/java/com/example/jz/controller/CauseController.java b/src/main/java/com/example/jz/controller/CauseController.java
index 2609aba..fbe2d62 100644
--- a/src/main/java/com/example/jz/controller/CauseController.java
+++ b/src/main/java/com/example/jz/controller/CauseController.java
@@ -1,16 +1,23 @@
 package com.example.jz.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.api.ApiController;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.example.jz.modle.R;
+import com.example.jz.modle.dto.AddReportDto;
 import com.example.jz.modle.dto.CauseDto;
+import com.example.jz.modle.dto.ReportParamDto;
+import com.example.jz.modle.entity.Report;
+import com.example.jz.modle.vo.ReportListVo;
 import com.example.jz.service.CauseService;
+import com.example.jz.service.ReportService;
+import com.example.jz.service.UserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
 
 /**
  * 妗堜欢琛�(Cause)琛ㄦ帶鍒跺眰
@@ -20,13 +27,24 @@
  */
 @RestController
 @RequestMapping("cause")
-@Api(tags = "妗堜欢鍖�-妗堜欢褰曞叆")
+@Api(tags = "妗堜欢鍖�")
 public class CauseController extends ApiController {
     /**
      * 鏈嶅姟瀵硅薄
      */
-    @Resource
     private CauseService causeService;
+    private ReportService reportService;
+
+    @Autowired
+    public void setReportService(ReportService reportService) {
+        this.reportService = reportService;
+    }
+
+    @Autowired
+    public void setCauseService(CauseService causeService) {
+        this.causeService = causeService;
+    }
+
 
     @ApiOperation(httpMethod = "POST", value = "娣诲姞妗堜欢")
     @PostMapping("/addCause")
@@ -39,8 +57,8 @@
     @ApiOperation(httpMethod = "PUT", value = "淇敼妗堜欢")
     @PutMapping("/updateCause")
     @ApiResponse(message = "鎵ц鎴愬姛", code = 200)
-    public R updateCause(@RequestBody CauseDto causeDto,Integer id) {
-        return R.ok(causeService.updateCause(causeDto,id));
+    public R updateCause(@RequestBody CauseDto causeDto, Integer id) {
+        return R.ok(causeService.updateCause(causeDto, id));
     }
 
 
@@ -79,6 +97,28 @@
         causeService.deleteCause(id);
         return R.ok();
     }
-    // TODO: 2022/7/15 瀵煎叆
+
+    @ApiOperation(httpMethod = "GET", value = "鏍规嵁缇ょ粍id鏌ヨ妗堜欢鍒嗛〉")
+    @GetMapping("/getAllReportList")
+    @ApiResponse(message = "鎵ц鎴愬姛", code = 200)
+    public R<IPage<ReportListVo>> get(Page<ReportListVo> page, ReportParamDto reportParamDto, Integer groupId) {
+        return R.ok(reportService.getPageByGroupId(page, reportParamDto, groupId));
+    }
+
+    @ApiOperation(httpMethod = "POST", value = "娣诲姞浜哄憳")
+    @PostMapping("/addReporter")
+    @ApiResponse(message = "鎵ц鎴愬姛", code = 200)
+    public R<Boolean> get(AddReportDto addReportDto) {
+        if (addReportDto.getReporterName() == null || addReportDto.getReporterName().equals("")) {
+            return R.failed("鎶ユ浜哄憳涓嶈兘涓虹┖");
+        }
+        if (addReportDto.getMobile() == null || addReportDto.getMobile().equals("")) {
+            return R.failed("鎶ユ浜哄憳鐢佃瘽涓嶈兘涓虹┖");
+        }
+        if (addReportDto.getIdcard() == null || addReportDto.getIdcard().equals("")) {
+            return R.failed("鎶ユ浜哄憳韬唤璇佷笉鑳戒负绌�");
+        }
+        return R.ok(causeService.addReportPeople(addReportDto));
+    }
 }
 
diff --git a/src/main/java/com/example/jz/controller/ReportController.java b/src/main/java/com/example/jz/controller/ReportController.java
index a0c9c82..f2cc3f0 100644
--- a/src/main/java/com/example/jz/controller/ReportController.java
+++ b/src/main/java/com/example/jz/controller/ReportController.java
@@ -1,12 +1,10 @@
 package com.example.jz.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.api.ApiController;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.example.jz.enums.BusinessHttpStatus;
-import com.example.jz.exception.BusinessException;
 import com.example.jz.modle.R;
+import com.example.jz.modle.dto.ReportParamDto;
 import com.example.jz.modle.entity.Report;
 import com.example.jz.modle.vo.ReportListVo;
 import com.example.jz.service.ReportService;
@@ -18,7 +16,6 @@
 import javax.annotation.Resource;
 import java.io.Serializable;
 import java.util.Date;
-import java.util.List;
 
 /**
  * 鎶ユ琛�(Report)琛ㄦ帶鍒跺眰
@@ -40,13 +37,13 @@
      * 鍒嗛〉鏌ヨ鎵�鏈夋暟鎹�
      *
      * @param page   鍒嗛〉瀵硅薄
-     * @param report 鏌ヨ瀹炰綋
+     * @param reportParamDto 鏌ヨ瀹炰綋
      * @return 鎵�鏈夋暟鎹�
      */
     @GetMapping
     @ApiOperation(value = "鍒嗛〉鏌ヨ鎵�鏈夋暟鎹�")
-    public R<IPage<Report>> selectAll(Page<Report> page, Report report) {
-        return R.ok(reportService.page(page, new QueryWrapper<>(report)));
+    public R<IPage<ReportListVo>> selectAll(Page<ReportListVo> page, ReportParamDto reportParamDto) {
+        return R.ok(reportService.getPage(page, reportParamDto));
     }
 
     /**
@@ -57,8 +54,8 @@
      */
     @GetMapping("{id}")
     @ApiOperation(value = "閫氳繃涓婚敭鏌ヨ鍗曟潯鏁版嵁")
-    public R<Report> selectOne(@PathVariable Serializable id) {
-        return R.ok(reportService.getById(id));
+    public R<ReportListVo> selectOne(@PathVariable Serializable id) {
+        return R.ok(reportService.getReportListVoById(id));
     }
 
     /**
diff --git a/src/main/java/com/example/jz/dao/ReportDao.java b/src/main/java/com/example/jz/dao/ReportDao.java
index 34690be..53fd686 100644
--- a/src/main/java/com/example/jz/dao/ReportDao.java
+++ b/src/main/java/com/example/jz/dao/ReportDao.java
@@ -1,8 +1,14 @@
 package com.example.jz.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.example.jz.modle.dto.ReportParamDto;
 import com.example.jz.modle.entity.Report;
+import com.example.jz.modle.vo.ReportListVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.io.Serializable;
 
 /**
  * 鎶ユ琛�(Report)琛ㄦ暟鎹簱璁块棶灞�
@@ -13,5 +19,10 @@
 @Mapper
 public interface ReportDao extends BaseMapper<Report> {
 
+    Page<ReportListVo> getPage(Page<ReportListVo> page,@Param("reportDto") ReportParamDto reportParamDto);
+
+    ReportListVo getReportListVoById(Serializable id);
+
+    Page<ReportListVo> getPageByGroupId(Page<ReportListVo> page, ReportParamDto reportParamDto, Integer groupId);
 }
 
diff --git a/src/main/java/com/example/jz/dao/UserDao.java b/src/main/java/com/example/jz/dao/UserDao.java
index 59e9595..8d45888 100644
--- a/src/main/java/com/example/jz/dao/UserDao.java
+++ b/src/main/java/com/example/jz/dao/UserDao.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.example.jz.modle.entity.User;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * 鐢ㄦ埛琛�(User)琛ㄦ暟鎹簱璁块棶灞�
@@ -9,6 +10,6 @@
  * @author makejava
  * @since 2022-07-11 16:35:57
  */
+@Mapper
 public interface UserDao extends BaseMapper<User> {
-
 }
diff --git a/src/main/java/com/example/jz/modle/dto/AddReportDto.java b/src/main/java/com/example/jz/modle/dto/AddReportDto.java
new file mode 100644
index 0000000..9c68dc1
--- /dev/null
+++ b/src/main/java/com/example/jz/modle/dto/AddReportDto.java
@@ -0,0 +1,31 @@
+package com.example.jz.modle.dto;
+
+import com.example.jz.modle.entity.Report;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 2:12 PM
+ * @description
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AddReportDto extends Report {
+    @ApiModelProperty(value = "鎶ユ浜�",dataType = "String")
+    private String reporterName;
+
+    @ApiModelProperty(value = "鎶ユ浜烘墜鏈哄彿",dataType = "String")
+    //鎶ユ浜烘墜鏈哄彿
+    private String mobile;
+
+    @ApiModelProperty(value = "鎶ユ浜鸿韩浠借瘉鍙�",dataType = "String")
+    //鎶ユ浜鸿韩浠借瘉鍙�
+    private String idcard;
+
+    @ApiModelProperty(value = "缇ょ粍id",dataType = "Integer")
+    private Integer groupId;
+}
diff --git a/src/main/java/com/example/jz/modle/dto/ReportParamDto.java b/src/main/java/com/example/jz/modle/dto/ReportParamDto.java
new file mode 100644
index 0000000..7708269
--- /dev/null
+++ b/src/main/java/com/example/jz/modle/dto/ReportParamDto.java
@@ -0,0 +1,43 @@
+package com.example.jz.modle.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/15 - 11:54 AM
+ * @description
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel("淇濆畨鏌ヨ鏉′欢")
+public class ReportParamDto {
+    /**
+     * 鏌ヨ鏉′欢 鍙互鏄鍚嶄篃鍙互鏄韩浠借瘉鍙�
+     */
+    @ApiModelProperty(value = "鏌ヨ鏉′欢 鍙互鏄鍚嶄篃鍙互鏄韩浠借瘉鍙�")
+    private String people;
+    /**
+     * 鐢佃瘽鍙风爜
+     */
+    @ApiModelProperty(value = "鐢佃瘽鍙风爜")
+    private String phoneNumber;
+    /**
+     * 鏄惁杩涚兢
+     */
+    @ApiModelProperty(value = "鏄惁杩涚兢 0鏄� 1鍚�")
+    private String isInGroup;
+    /**
+     * 鏄惁鏈夋潗鏂�
+     */
+    @ApiModelProperty(value = "鏄惁鏈夋潗鏂� 0鏄� 1鍚�")
+    private String havaMaterial;
+}
diff --git a/src/main/java/com/example/jz/modle/entity/Report.java b/src/main/java/com/example/jz/modle/entity/Report.java
index 0a8b23f..260ef99 100644
--- a/src/main/java/com/example/jz/modle/entity/Report.java
+++ b/src/main/java/com/example/jz/modle/entity/Report.java
@@ -4,11 +4,13 @@
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 
@@ -38,6 +40,7 @@
     //鎶ユ鏉愭枡鍥剧墖鍦板潃 澶氫釜鐢�,鍒嗛殧
     private String reportMaterials;
     //鎶ユ鏃堕棿
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date reportTime;
     //鎶ユ鏂瑰紡
     private String reportMethod;
@@ -46,8 +49,10 @@
     //鐘舵�侊紝1涓洪�氳繃 0涓烘湭瀹℃牳
     private Integer status;
     //鍒涘缓鏃堕棿
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date ctime;
     //琚獥鏃堕棿
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date cheatTime;
     //琛ュ厖淇℃伅
     private String information;
diff --git a/src/main/java/com/example/jz/modle/entity/SecurityUser.java b/src/main/java/com/example/jz/modle/entity/SecurityUser.java
new file mode 100644
index 0000000..75f26e0
--- /dev/null
+++ b/src/main/java/com/example/jz/modle/entity/SecurityUser.java
@@ -0,0 +1,73 @@
+package com.example.jz.modle.entity;
+
+import com.example.jz.auth.UserDetailService;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 11:00 AM
+ * @description
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SecurityUser implements UserDetails {
+
+    private String username;
+    private String password;
+    private List<String> permissionValueList;
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        Collection<GrantedAuthority> authorities = new ArrayList<>();
+        permissionValueList.forEach(permission -> {
+            if (!StringUtils.isEmpty(permission)) {
+                SimpleGrantedAuthority authority = new SimpleGrantedAuthority(permission);
+                authorities.add(authority);
+            }
+        });
+        return authorities;
+    }
+
+    @Override
+    public String getPassword() {
+        return this.password;
+    }
+
+    @Override
+    public String getUsername() {
+        return this.username;
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+}
diff --git a/src/main/java/com/example/jz/modle/entity/User.java b/src/main/java/com/example/jz/modle/entity/User.java
index 20968c7..65b195b 100644
--- a/src/main/java/com/example/jz/modle/entity/User.java
+++ b/src/main/java/com/example/jz/modle/entity/User.java
@@ -1,5 +1,10 @@
 package com.example.jz.modle.entity;
 
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -9,8 +14,14 @@
  * @author makejava
  * @since 2022-07-12 16:50:59
  */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
 public class User implements Serializable {
+
     private static final long serialVersionUID = 853192857312832170L;
+
     /**
      * 鐢ㄦ埛鏄电О
      */
@@ -19,6 +30,10 @@
      * 鐪熷疄濮撳悕
      */
     private String realName;
+    /**
+     * 鐧诲綍璐﹀彿
+     */
+    private String loginUsername;
     /**
      * 鐧诲綍瀵嗙爜
      */
@@ -68,118 +83,6 @@
      */
     private Integer id;
 
-
-    public String getNickName() {
-        return nickName;
-    }
-
-    public void setNickName(String nickName) {
-        this.nickName = nickName;
-    }
-
-    public String getRealName() {
-        return realName;
-    }
-
-    public void setRealName(String realName) {
-        this.realName = realName;
-    }
-
-    public String getLoginPassword() {
-        return loginPassword;
-    }
-
-    public void setLoginPassword(String loginPassword) {
-        this.loginPassword = loginPassword;
-    }
-
-    public String getUserMobile() {
-        return userMobile;
-    }
-
-    public void setUserMobile(String userMobile) {
-        this.userMobile = userMobile;
-    }
-
-    public String getUserIdcard() {
-        return userIdcard;
-    }
-
-    public void setUserIdcard(String userIdcard) {
-        this.userIdcard = userIdcard;
-    }
-
-    public Date getModifyTime() {
-        return modifyTime;
-    }
-
-    public void setModifyTime(Date modifyTime) {
-        this.modifyTime = modifyTime;
-    }
-
-    public Date getUserRegtime() {
-        return userRegtime;
-    }
-
-    public void setUserRegtime(Date userRegtime) {
-        this.userRegtime = userRegtime;
-    }
-
-    public String getUserRegip() {
-        return userRegip;
-    }
-
-    public void setUserRegip(String userRegip) {
-        this.userRegip = userRegip;
-    }
-
-    public Date getUserLasttime() {
-        return userLasttime;
-    }
-
-    public void setUserLasttime(Date userLasttime) {
-        this.userLasttime = userLasttime;
-    }
-
-    public String getUserLastip() {
-        return userLastip;
-    }
-
-    public void setUserLastip(String userLastip) {
-        this.userLastip = userLastip;
-    }
-
-    public String getUserMemo() {
-        return userMemo;
-    }
-
-    public void setUserMemo(String userMemo) {
-        this.userMemo = userMemo;
-    }
-
-    public String getPic() {
-        return pic;
-    }
-
-    public void setPic(String pic) {
-        this.pic = pic;
-    }
-
-    public Integer getStatus() {
-        return status;
-    }
-
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-
-
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
+    private Integer role;
 }
 
diff --git a/src/main/java/com/example/jz/modle/vo/ReportListVo.java b/src/main/java/com/example/jz/modle/vo/ReportListVo.java
index f008f83..c87ddf0 100644
--- a/src/main/java/com/example/jz/modle/vo/ReportListVo.java
+++ b/src/main/java/com/example/jz/modle/vo/ReportListVo.java
@@ -2,6 +2,7 @@
 
 import com.example.jz.modle.entity.Report;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
@@ -12,4 +13,16 @@
 
     //缇d
     private Integer groupId;
+
+    //鎶ユ浜�
+    @ApiModelProperty(value = "鎶ユ浜�",dataType = "String")
+    private String reporterName;
+
+    @ApiModelProperty(value = "鎶ユ浜烘墜鏈哄彿",dataType = "String")
+    //鎶ユ浜烘墜鏈哄彿
+    private String mobile;
+
+    @ApiModelProperty(value = "鎶ユ浜鸿韩浠借瘉鍙�",dataType = "String")
+    //鎶ユ浜鸿韩浠借瘉鍙�
+    private String idcard;
 }
diff --git a/src/main/java/com/example/jz/service/CauseService.java b/src/main/java/com/example/jz/service/CauseService.java
index 0d4adcb..20f6c79 100644
--- a/src/main/java/com/example/jz/service/CauseService.java
+++ b/src/main/java/com/example/jz/service/CauseService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.example.jz.modle.PageParam;
+import com.example.jz.modle.dto.AddReportDto;
 import com.example.jz.modle.dto.CauseDto;
 import com.example.jz.modle.entity.Cause;
 import com.example.jz.modle.vo.AnnouncementVo;
@@ -67,5 +68,7 @@
      * @return void
      **/
     void deleteCause(Integer id);
+
+    Boolean addReportPeople(AddReportDto addReportDto);
 }
 
diff --git a/src/main/java/com/example/jz/service/ReportService.java b/src/main/java/com/example/jz/service/ReportService.java
index 89fa38b..95cfc6c 100644
--- a/src/main/java/com/example/jz/service/ReportService.java
+++ b/src/main/java/com/example/jz/service/ReportService.java
@@ -1,7 +1,12 @@
 package com.example.jz.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.example.jz.modle.dto.ReportParamDto;
 import com.example.jz.modle.entity.Report;
+import com.example.jz.modle.vo.ReportListVo;
+
+import java.io.Serializable;
 
 /**
  * 鎶ユ琛�(Report)琛ㄦ湇鍔℃帴鍙�
@@ -14,5 +19,11 @@
     Boolean audit(Report report);
 
     void leaveGroup(Integer id, Integer groupId);
+
+    Page<ReportListVo> getPage(Page<ReportListVo> page, ReportParamDto reportParamDto);
+
+    ReportListVo getReportListVoById(Serializable id);
+
+    Page<ReportListVo> getPageByGroupId(Page<ReportListVo> page, ReportParamDto reportParamDto, Integer groupId);
 }
 
diff --git a/src/main/java/com/example/jz/service/impl/CauseServiceImpl.java b/src/main/java/com/example/jz/service/impl/CauseServiceImpl.java
index a7d54ad..bcc2ce5 100644
--- a/src/main/java/com/example/jz/service/impl/CauseServiceImpl.java
+++ b/src/main/java/com/example/jz/service/impl/CauseServiceImpl.java
@@ -1,10 +1,12 @@
 package com.example.jz.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.example.jz.dao.*;
 import com.example.jz.modle.PageParam;
+import com.example.jz.modle.dto.AddReportDto;
 import com.example.jz.modle.dto.CauseDto;
 import com.example.jz.modle.entity.*;
 import com.example.jz.modle.vo.AnnouncementVo;
@@ -22,7 +24,7 @@
 import java.util.stream.Collectors;
 
 /**
- * 案件表(Cause)表服务实现类
+ * 锟斤拷锟斤拷锟斤拷(Cause)锟斤拷锟斤拷锟绞碉拷锟斤拷锟�
  *
  * @author makejava
  * @since 2022-07-13 11:52:58
@@ -40,6 +42,8 @@
     CauseService causeService;
     @Resource
     GroupDao groupDao;
+    @Resource
+    GroupUserDao groupUserDao;
 
     @Resource
     AnnouncementDao announcementDao;
@@ -47,12 +51,12 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer addCause(CauseDto causeDto) {
-        //创建案件
+        //锟斤拷锟斤拷锟斤拷锟斤拷
         Cause cause = new Cause();
         BeanUtils.copyProperties(causeDto, cause);
         cause.setCtime(new Date());
         causeService.save(cause);
-        //创建群组
+        //锟斤拷锟斤拷群锟斤拷
         Group group = new Group();
         group.setCtime(new Date());
         group.setGroupName(causeDto.getName());
@@ -145,6 +149,31 @@
 
     @Override
     public void deleteCause(Integer id) {
-         causeDao.deleteById(id);
+        causeDao.deleteById(id);
+    }
+
+    @Override
+    @Transactional
+    public Boolean addReportPeople(AddReportDto addReportDto) {
+        User user = userDao.selectOne(new LambdaQueryWrapper<User>(User.class).eq(User::getUserIdcard, addReportDto.getIdcard()));
+        if (user == null) {
+            // 濡傛灉鐢ㄦ埛涓嶅瓨鍦� 鍒欐坊鍔犵敤鎴�
+            user = new User().setUserIdcard(addReportDto.getIdcard()).setUserMobile(addReportDto.getMobile()).setRealName(addReportDto.getReporterName())
+                    .setModifyTime(new Date()).setUserRegtime(new Date()).setPic(addReportDto.getPic());
+            userDao.insert(user);
+        }
+        // 娣诲姞浜哄憳杩涚兢缁�
+        groupUserDao.insert(new GroupUser().setGroupId(addReportDto.getGroupId()).setUserId(user.getId()).setCtime(new Date()).setBanSpeech(0));
+        // 娣诲姞鎶ユ淇℃伅
+        Report report = new Report();
+        BeanUtils.copyProperties(addReportDto, report);
+        report
+                .setUserId(user.getId())
+                .setCtime(new Date())
+                .setStatus(0)
+                .setReportMethod("鐜板満褰曞叆")
+                .setIsCommission("0").setReportTime(new Date())
+                .setCauseId(groupDao.selectOne(new QueryWrapper<Group>().eq("id", addReportDto.getGroupId())).getCauseId());
+        return reportDao.insert(report) > 0;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/example/jz/service/impl/ReportServiceImpl.java b/src/main/java/com/example/jz/service/impl/ReportServiceImpl.java
index c56e2c2..e3ff882 100644
--- a/src/main/java/com/example/jz/service/impl/ReportServiceImpl.java
+++ b/src/main/java/com/example/jz/service/impl/ReportServiceImpl.java
@@ -2,19 +2,22 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.example.jz.dao.CauseDao;
 import com.example.jz.dao.GroupDao;
 import com.example.jz.dao.GroupUserDao;
 import com.example.jz.dao.ReportDao;
+import com.example.jz.modle.dto.ReportParamDto;
 import com.example.jz.modle.entity.Group;
 import com.example.jz.modle.entity.GroupUser;
 import com.example.jz.modle.entity.Report;
+import com.example.jz.modle.vo.ReportListVo;
 import com.example.jz.service.ReportService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -55,7 +58,26 @@
 
     @Override
     public void leaveGroup(Integer id, Integer groupId) {
-        groupUserDao.delete(new QueryWrapper<GroupUser>().eq("user_id",id).eq("group_id",groupId));
+        groupUserDao.delete(new QueryWrapper<GroupUser>().eq("user_id", id).eq("group_id", groupId));
+    }
+
+    @Override
+    public Page<ReportListVo> getPage(Page<ReportListVo> page, ReportParamDto reportParamDto) {
+        Page<ReportListVo> aaa = reportDao.getPage(page, reportParamDto);
+        aaa.getRecords().stream().forEach(x -> x.setIdcard(x.getIdcard().replaceAll("(?<=[\\d]{3})\\d(?=[\\d]{4})", "*")));
+        return aaa;
+    }
+
+    @Override
+    public ReportListVo getReportListVoById(Serializable id) {
+        return reportDao.getReportListVoById(id);
+    }
+
+    @Override
+    public Page<ReportListVo> getPageByGroupId(Page<ReportListVo> page, ReportParamDto reportParamDto, Integer groupId) {
+        Page<ReportListVo> aaa = reportDao.getPageByGroupId(page, reportParamDto,groupId);
+        aaa.getRecords().stream().forEach(x -> x.setIdcard(x.getIdcard().replaceAll("(?<=[\\d]{3})\\d(?=[\\d]{4})", "*")));
+        return aaa;
     }
 }
 
diff --git a/src/main/java/com/example/jz/utils/MD5Utils.java b/src/main/java/com/example/jz/utils/MD5Utils.java
new file mode 100644
index 0000000..4112d5e
--- /dev/null
+++ b/src/main/java/com/example/jz/utils/MD5Utils.java
@@ -0,0 +1,131 @@
+package com.example.jz.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 10:52 AM
+ * @description 鍔犲瘑宸ュ叿绫�
+ */
+public class Md5Utils {
+
+    public static String md5(String str) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(str.getBytes());
+            byte b[] = md.digest();
+
+            str = byteToStr(b);
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        }
+        return str;
+    }
+
+    public static String byteToStr(byte[] b){
+        int i;
+        StringBuffer buf = new StringBuffer("");
+        for (int offset = 0; offset < b.length; offset++) {
+            i = b[offset];
+            //System.out.println(i);
+            if (i < 0)
+                i += 256;
+            if (i < 16)
+                buf.append("0");
+            buf.append(Integer.toHexString(i));
+        }
+        return buf.toString();
+    }
+
+    /**
+     * 浼犲叆鏂囨湰鍐呭锛岃繑鍥� SHA-256 涓�
+     *
+     * @param strText
+     * @return
+     */
+    public static String SHA256(final String strText)
+    {
+        return SHA(strText, "SHA-256");
+    }
+
+    public static String SHA1(final String strText)
+    {
+        return SHA(strText, "SHA-1");
+    }
+
+    /**
+     * 浼犲叆鏂囨湰鍐呭锛岃繑鍥� SHA-512 涓�
+     *
+     * @param strText
+     * @return
+     */
+    public static String SHA512(final String strText)
+    {
+        return SHA(strText, "SHA-512");
+    }
+
+    /**
+     * 瀛楃涓� SHA 鍔犲瘑
+     *
+     * @param strText
+     * @return
+     */
+    private static String SHA(final String strText, final String strType)
+    {
+        // 杩斿洖鍊�
+        String strResult = null;
+
+        // 鏄惁鏄湁鏁堝瓧绗︿覆
+        if (strText != null && strText.length() > 0)
+        {
+            try
+            {
+                // SHA 鍔犲瘑寮�濮�
+                MessageDigest messageDigest = MessageDigest.getInstance(strType);
+                // 浼犲叆瑕佸姞瀵嗙殑瀛楃涓�
+                messageDigest.update(strText.getBytes("utf-8"));
+                // 寰楀埌 byte 绫诲瀷鐨勭粨鏋�
+                byte byteBuffer[] = messageDigest.digest();
+                strResult = byteToStr(byteBuffer);
+            }
+            catch (NoSuchAlgorithmException e)
+            {
+                e.printStackTrace();
+            }catch (UnsupportedEncodingException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
+        }
+
+        return strResult;
+    }
+
+    public static String base64(String str){
+        String baseStr = null;
+        Base64.Encoder encoder = Base64.getEncoder();
+        byte[] textByte;
+        try {
+            textByte = str.getBytes("UTF-8");
+            baseStr = encoder.encodeToString(textByte);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        return baseStr;
+
+    }
+
+    public static void main(String[] args) {
+        String password = "bunana1";
+        System.out.println(md5(password));
+        //String base64 = base64(sha512);
+        //System.out.println(base64);
+        //String pwd1 = md5(base64);
+        //System.out.println(pwd1);
+    }
+}
diff --git a/src/main/resources/mapper/ReportDao.xml b/src/main/resources/mapper/ReportDao.xml
new file mode 100644
index 0000000..9242398
--- /dev/null
+++ b/src/main/resources/mapper/ReportDao.xml
@@ -0,0 +1,63 @@
+<?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.example.jz.dao.ReportDao">
+
+    <select id="getPage" resultType="com.example.jz.modle.vo.ReportListVo">
+        select u.user_mobile mobile,u.user_idcard idcard,u.real_name reporterName,r.*
+        from report r
+        join user u on r.user_id = u.id
+        <where>
+            1=1
+            <if test="reportParamDto.people != ''">
+                and (u.real_name like '%${reportParamDto.people}%' or u.user_idcard like '%${reportParamDto.people}%')
+            </if>
+            <if test="reportParamDto.phoneNumber != ''">
+                and u.user_mobile = ${reportParamDto.phoneNumber}
+            </if>
+            <if test="reportParamDto.havaMaterial != ''">
+                <if test="reportParamDto.havaMaterial == 1">
+                    and r.report_materials is not null
+                </if>
+                <if test="reportParamDto.havaMaterial == 0">
+                    and r.report_materials is null
+                </if>
+            </if>
+            <if test="reportParamDto.isInGroup != ''">
+                and r.status = ${reportParamDto.isInGroup}
+            </if>
+        </where>
+    </select>
+    <select id="getReportListVoById" resultType="com.example.jz.modle.vo.ReportListVo">
+        select u.user_mobile mobile, u.user_idcard idcard, u.real_name reporterName, r.*
+        from report r
+                 join user u on r.user_id = u.id
+        where r.id = #{id}
+    </select>
+    <select id="getPageByGroupId" resultType="com.example.jz.modle.vo.ReportListVo">
+        select u.user_mobile mobile,u.user_idcard idcard,u.real_name reporterName,r.*
+        from report r
+        join user u on r.user_id = u.id
+        join group_user gu on gu.user_id = u.id
+        <where>
+            1=1
+            <if test="reportParamDto.people != ''">
+                and (u.real_name like '%${reportParamDto.people}%' or u.user_idcard like '%${reportParamDto.people}%')
+            </if>
+            <if test="reportParamDto.phoneNumber != ''">
+                and u.user_mobile = ${reportParamDto.phoneNumber}
+            </if>
+            <if test="reportParamDto.havaMaterial != ''">
+                <if test="reportParamDto.havaMaterial == 1">
+                    and r.report_materials is not null
+                </if>
+                <if test="reportParamDto.havaMaterial == 0">
+                    and r.report_materials is null
+                </if>
+            </if>
+            <if test="reportParamDto.isInGroup != ''">
+                and r.status = ${reportParamDto.isInGroup}
+            </if>
+        </where>
+        and gu.group_id = #{groupId}
+    </select>
+</mapper>
diff --git a/src/test/java/com/example/jz/dao/UserDaoTest.java b/src/test/java/com/example/jz/dao/UserDaoTest.java
new file mode 100644
index 0000000..84eab22
--- /dev/null
+++ b/src/test/java/com/example/jz/dao/UserDaoTest.java
@@ -0,0 +1,30 @@
+package com.example.jz.dao;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.example.jz.modle.entity.User;
+import com.example.jz.utils.Md5Utils;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author 瀹夌懢鐒�
+ * @data 2022/7/18 - 11:49 AM
+ * @description
+ */
+@SpringBootTest
+class UserDaoTest {
+
+    @Autowired
+    private UserDao userDao;
+
+    void updateUser() {
+        User user = userDao.selectOne(new LambdaQueryWrapper<>(User.class).eq(User::getId, 1));
+        System.out.println(user);
+        user.setLoginUsername("admin");
+        user.setLoginPassword(Md5Utils.md5("admin"));
+        userDao.updateById(user);
+    }
+}
\ No newline at end of file

--
Gitblit v1.8.0