Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 156 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.test-backend-java</groupId>
<artifactId>test-backend-java</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test-backend-java</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>11</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>

<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.jiang.core</groupId>
<artifactId>core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

<!--Spring Security + OAuth 2.0 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-security</artifactId>-->
<!-- </dependency>-->

<!-- <dependency>-->
<!-- <groupId>org.springframework.security.oauth.boot</groupId>-->
<!-- <artifactId>spring-security-oauth2-autoconfigure</artifactId>-->
<!-- <version>2.1.2.RELEASE</version>-->
<!-- </dependency>-->

<!-- <dependency>-->
<!-- <groupId>org.springframework.security</groupId>-->
<!-- <artifactId>spring-security-oauth2-client</artifactId>-->
<!-- <version>5.5.0</version>-->
<!-- </dependency>-->


<!-- Spring Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring Security OAuth2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>


<!-- Logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>

<!-- Flyway Core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.11.1</version>
</dependency>

</dependencies>

<build>

<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.5.0.Final</version>
</extension>
</extensions>

<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<!-- 编译jar包的jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>

</plugins>
</build>

</project>
13 changes: 13 additions & 0 deletions src/main/java/com/jiang/test/backend/TestBackendApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.jiang.test.backend;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestBackendApplication {

public static void main(String[] args) {
SpringApplication.run(TestBackendApplication.class, args);
}

}
12 changes: 12 additions & 0 deletions src/main/java/com/jiang/test/backend/annotation/Authorized.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.jiang.test.backend.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Authorized {
}

30 changes: 30 additions & 0 deletions src/main/java/com/jiang/test/backend/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.jiang.test.backend.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").authenticated()
.anyRequest().permitAll()
.and()
.formLogin().disable();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// 在这里配置模拟的授权用户,可以根据需要自定义
auth.inMemoryAuthentication()
.withUser("username")
.password("{noop}password") // {noop} 表示密码不加密
.roles("USER");
}
}
20 changes: 20 additions & 0 deletions src/main/java/com/jiang/test/backend/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.jiang.test.backend.config;

import com.jiang.test.backend.interceptor.AuthorizationInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

@Autowired
private AuthorizationInterceptor authorizationInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizationInterceptor)
.addPathPatterns("/api/**"); // 设置需要进行授权检查的接口路径
}
}
22 changes: 22 additions & 0 deletions src/main/java/com/jiang/test/backend/constant/ApiConstants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.jiang.test.backend.constant;

public final class ApiConstants {

public static final String COMMON_URL = "/api";
public static final String GET_URL = "/user/getUser/{id}";
public static final String POST_URL = "/user/addUser";
public static final String UPDATE_URL = "/user/updateUser";
public static final String DELETE_URL = "/user/delUser";

public static final String GET_FOLLOWERS_URL = "/friend/{userId}";
public static final String ADD_FOLLOWERS_URL = "/friend/addFollower";
public static final String REMOVE_FOLLOWERS_URL = "/friend/removeFollower";
public static final String GET_FRIENDS_URL = "/friend/getFriends/{userId}";
public static final String GET_COMMON_FRIENDS_URL = "/friend/{userId}/friends/{otherUserId}";
public static final String GET_NEARBY_FRIENDS_URL = "/friend/{userId}/distance/{disdance}";


private ApiConstants() {
// 私有构造函数,防止实例化
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.jiang.test.backend.controller;

import com.jiang.test.backend.annotation.Authorized;
import com.jiang.test.backend.constant.ApiConstants;
import com.jiang.test.backend.entity.User;
import com.jiang.test.backend.service.FriendService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(ApiConstants.COMMON_URL)
public class FriendController {

@Autowired
FriendService friendService;

/**
* 获取用户的所有关注者
* @param userId
* @return List<User>
*/
@GetMapping(ApiConstants.GET_FOLLOWERS_URL)
@Authorized
public ResponseEntity<List<User>> getFollowers(@PathVariable int userId) {
List<User> followers = friendService.getFollowers(userId);
return ResponseEntity.ok(followers);
}

/**
* 添加关注者
* 请求体中包含要添加的关注者的ID。
* @param userId
* @param followerId
* @return
*/
@PostMapping(ApiConstants.ADD_FOLLOWERS_URL)
@Authorized
public ResponseEntity<String> addFollower(@RequestParam int userId, @RequestParam int followerId) {
friendService.addFollower(userId,followerId);
return ResponseEntity.ok("Follower added successfully.");
}

/**
* 删除关注者
* @param userId
* @param followerId
* @return
*/
@DeleteMapping(ApiConstants.REMOVE_FOLLOWERS_URL)
@Authorized
public ResponseEntity<String> removeFollower(@RequestParam int userId, @RequestParam int followerId) {
friendService.removeFollower(userId,followerId);
return ResponseEntity.ok("Follower removed successfully.");
}

/**
* 获取用户的所有好友
* @param userId
* @return
*/
@GetMapping(ApiConstants.GET_FRIENDS_URL)
@Authorized
public ResponseEntity<List<User>> getFriends(@PathVariable int userId) {
List<User> friends = friendService.getFriends(userId);
return ResponseEntity.ok(friends);
}

/**
* 获取共同的朋友
* @param userId
* @param otherUserId
* @return
*/
@GetMapping(ApiConstants.GET_COMMON_FRIENDS_URL)
@Authorized
public ResponseEntity<List<User>> getCommonFriends(@PathVariable int userId, @PathVariable int otherUserId) {
List<User> commonFriends = friendService.getCommonFriends(userId,otherUserId);
return ResponseEntity.ok(commonFriends);
}

/**
* 获取最近的朋友信息
* @param userId
* @param distance
* @return
*/
@GetMapping(ApiConstants.GET_NEARBY_FRIENDS_URL)
@Authorized
public ResponseEntity<List<User>> getNearbyFriends(@PathVariable int userId,
@PathVariable double distance) {
List<User> nearbyFriends = friendService.getNearbyFriends(userId,distance);
return ResponseEntity.ok(nearbyFriends);
}
}
Loading