37 changed files with 964 additions and 33 deletions
-
21pom.xml
-
4src/main/java/org/hlrj/duobao_demo/DuobaoDemoApplication.java
-
31src/main/java/org/hlrj/duobao_demo/controller/CuratedVideoController.java
-
47src/main/java/org/hlrj/duobao_demo/controller/LoginController.java
-
95src/main/java/org/hlrj/duobao_demo/controller/RecommendationController.java
-
58src/main/java/org/hlrj/duobao_demo/controller/SpecialTopicController.java
-
20src/main/java/org/hlrj/duobao_demo/controller/VideoDataController.java
-
24src/main/java/org/hlrj/duobao_demo/entity/PageBean.java
-
8src/main/java/org/hlrj/duobao_demo/entity/Recommendation.java
-
7src/main/java/org/hlrj/duobao_demo/entity/SpecialTopic.java
-
45src/main/java/org/hlrj/duobao_demo/entity/User.java
-
18src/main/java/org/hlrj/duobao_demo/entity/VideoData.java
-
11src/main/java/org/hlrj/duobao_demo/mapper/RecommendationMapper.java
-
3src/main/java/org/hlrj/duobao_demo/mapper/SpecialTopicMapper.java
-
17src/main/java/org/hlrj/duobao_demo/mapper/UserMapper.java
-
1src/main/java/org/hlrj/duobao_demo/mapper/VideoDataMapper.java
-
15src/main/java/org/hlrj/duobao_demo/service/ICuratedVideoService.java
-
29src/main/java/org/hlrj/duobao_demo/service/IRecommendationService.java
-
20src/main/java/org/hlrj/duobao_demo/service/ISpecialTopicService.java
-
21src/main/java/org/hlrj/duobao_demo/service/IUserService.java
-
12src/main/java/org/hlrj/duobao_demo/service/IVideoDataService.java
-
10src/main/java/org/hlrj/duobao_demo/service/impl/CuratedVideoServiceImpl.java
-
30src/main/java/org/hlrj/duobao_demo/service/impl/RecommendationServiceImpl.java
-
17src/main/java/org/hlrj/duobao_demo/service/impl/SpecialTopicServiceImpl.java
-
28src/main/java/org/hlrj/duobao_demo/service/impl/UserServiceImpl.java
-
11src/main/java/org/hlrj/duobao_demo/service/impl/VideoDataServiceImpl.java
-
35src/main/java/org/hlrj/duobao_demo/tool/CorsConfig.java
-
34src/main/java/org/hlrj/duobao_demo/tool/DomoFilter.java
-
46src/main/java/org/hlrj/duobao_demo/tool/JwtUtils.java
-
58src/main/java/org/hlrj/duobao_demo/tool/RedisConfig.java
-
3src/main/java/org/hlrj/duobao_demo/tool/Result.java
-
6src/main/resources/application.properties
-
89src/main/resources/mapper/RecommendationMapper.xml
-
52src/main/resources/mapper/SpecialTopicMapper.xml
-
25src/main/resources/mapper/UserMapper.xml
-
26src/main/resources/mapper/VideoDateMapper.xml
-
20src/test/java/org/hlrj/duobao_demo/DuobaoDemoApplicationTests.java
@ -0,0 +1,47 @@ |
|||||
|
package org.hlrj.duobao_demo.controller; |
||||
|
|
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.hlrj.duobao_demo.entity.User; |
||||
|
import org.hlrj.duobao_demo.service.IUserService; |
||||
|
import org.hlrj.duobao_demo.tool.JwtUtils; |
||||
|
import org.hlrj.duobao_demo.tool.Result; |
||||
|
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 java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @program: duobao_demo |
||||
|
* @ClassName LoginController |
||||
|
* @description: |
||||
|
* @author:liuyusong |
||||
|
* @create: 2025−04-14 11:18 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
@RestController |
||||
|
@Slf4j |
||||
|
public class LoginController { |
||||
|
|
||||
|
|
||||
|
@Autowired |
||||
|
private IUserService userService; |
||||
|
@PostMapping("/login") |
||||
|
public Result login(@RequestBody User user) { |
||||
|
log.info("登录操作:{}",user); |
||||
|
User user1 = userService.login(user); |
||||
|
if (user1 != null) { |
||||
|
Map<String, Object> map = new HashMap<>(); |
||||
|
map.put("userid",user1.getUserid()); |
||||
|
map.put("username",user1.getUsername()); |
||||
|
map.put("createTime",user1.getCreateTime()); |
||||
|
//生成jwt令牌 |
||||
|
String jwt = JwtUtils.generateJwt(map); |
||||
|
return Result.success(jwt); |
||||
|
} |
||||
|
return Result.error("用户名或者密码错误"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
package org.hlrj.duobao_demo.entity; |
||||
|
|
||||
|
import lombok.AllArgsConstructor; |
||||
|
import lombok.Data; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @program: duobao_demo |
||||
|
* @ClassName PageBean |
||||
|
* @description: 分页查询的实体类 |
||||
|
* @author:liuyusong |
||||
|
* @create: 2025−04-10 14:37 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
@Data |
||||
|
@NoArgsConstructor |
||||
|
@AllArgsConstructor |
||||
|
public class PageBean { |
||||
|
|
||||
|
private Long total;//总记录数 |
||||
|
private List rows;//数据列表 |
||||
|
} |
@ -0,0 +1,45 @@ |
|||||
|
package org.hlrj.duobao_demo.entity; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||
|
import java.time.LocalDateTime; |
||||
|
import java.io.Serializable; |
||||
|
import io.swagger.annotations.ApiModel; |
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
import lombok.Data; |
||||
|
import lombok.EqualsAndHashCode; |
||||
|
import lombok.experimental.Accessors; |
||||
|
|
||||
|
/** |
||||
|
* <p> |
||||
|
* |
||||
|
* </p> |
||||
|
* |
||||
|
* @author liuyusong |
||||
|
* @since 2025-04-14 |
||||
|
*/ |
||||
|
@Data |
||||
|
@EqualsAndHashCode(callSuper = false) |
||||
|
@Accessors(chain = true) |
||||
|
@TableName("user") |
||||
|
@ApiModel(value="User对象", description="") |
||||
|
public class User implements Serializable { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
@ApiModelProperty(value = "ID") |
||||
|
@TableId(value = "userid", type = IdType.AUTO) |
||||
|
private Integer userid; |
||||
|
|
||||
|
@ApiModelProperty(value = "用户名") |
||||
|
private String username; |
||||
|
|
||||
|
@ApiModelProperty(value = "密码") |
||||
|
private String password; |
||||
|
|
||||
|
@ApiModelProperty(value = "创建时间") |
||||
|
private java.util.Date createTime; |
||||
|
|
||||
|
|
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
package org.hlrj.duobao_demo.mapper; |
||||
|
|
||||
|
import org.hlrj.duobao_demo.entity.User; |
||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
|
||||
|
/** |
||||
|
* <p> |
||||
|
* Mapper 接口 |
||||
|
* </p> |
||||
|
* |
||||
|
* @author liuyusong |
||||
|
* @since 2025-04-14 |
||||
|
*/ |
||||
|
public interface UserMapper extends BaseMapper<User> { |
||||
|
|
||||
|
public User getUserByUsernameAndPassword(User user); |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package org.hlrj.duobao_demo.service; |
||||
|
|
||||
|
import org.hlrj.duobao_demo.entity.User; |
||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||
|
|
||||
|
/** |
||||
|
* <p> |
||||
|
* 服务类 |
||||
|
* </p> |
||||
|
* |
||||
|
* @author liuyusong |
||||
|
* @since 2025-04-14 |
||||
|
*/ |
||||
|
public interface IUserService extends IService<User> { |
||||
|
/** |
||||
|
* 用户登录 |
||||
|
* @param user |
||||
|
* @return |
||||
|
*/ |
||||
|
public User login(User user); |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package org.hlrj.duobao_demo.service.impl; |
||||
|
|
||||
|
import org.hlrj.duobao_demo.entity.User; |
||||
|
import org.hlrj.duobao_demo.mapper.UserMapper; |
||||
|
import org.hlrj.duobao_demo.service.IUserService; |
||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
/** |
||||
|
* <p> |
||||
|
* 服务实现类 |
||||
|
* </p> |
||||
|
* |
||||
|
* @author liuyusong |
||||
|
* @since 2025-04-14 |
||||
|
*/ |
||||
|
@Service |
||||
|
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { |
||||
|
|
||||
|
@Autowired |
||||
|
private UserMapper userMapper; |
||||
|
|
||||
|
@Override |
||||
|
public User login(User user) { |
||||
|
return userMapper.getUserByUsernameAndPassword(user); |
||||
|
} |
||||
|
} |
@ -0,0 +1,35 @@ |
|||||
|
package org.hlrj.duobao_demo.tool; |
||||
|
|
||||
|
/** |
||||
|
* @program: duobao_demo |
||||
|
* @ClassName CorsConfig |
||||
|
* @description: 跨域所用到的跨域类 |
||||
|
* @author:liuyusong |
||||
|
* @create: 2025−04-14 19:02 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.web.cors.CorsConfiguration; |
||||
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource; |
||||
|
import org.springframework.web.filter.CorsFilter; |
||||
|
|
||||
|
@Configuration |
||||
|
public class CorsConfig { |
||||
|
|
||||
|
// 当前跨域请求最大有效时长。这里默认1天 |
||||
|
private static final long MAX_AGE = 24 * 60 * 60; |
||||
|
|
||||
|
@Bean |
||||
|
public CorsFilter corsFilter() { |
||||
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); |
||||
|
CorsConfiguration corsConfiguration = new CorsConfiguration(); |
||||
|
corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址 |
||||
|
corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头 |
||||
|
corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法 |
||||
|
corsConfiguration.setMaxAge(MAX_AGE); |
||||
|
source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置 |
||||
|
return new CorsFilter(source); |
||||
|
} |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
package org.hlrj.duobao_demo.tool; |
||||
|
|
||||
|
|
||||
|
import javax.servlet.*; |
||||
|
import javax.servlet.annotation.WebFilter; |
||||
|
import java.io.IOException; |
||||
|
|
||||
|
/** |
||||
|
* @program: duobao_demo |
||||
|
* @ClassName DomoFilter |
||||
|
* @description: |
||||
|
* @author:liuyusong |
||||
|
* @create: 2025−04-14 15:43 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
@WebFilter(urlPatterns="/*") |
||||
|
public class DomoFilter implements Filter { |
||||
|
|
||||
|
@Override//初始化方法,只调用一次 |
||||
|
public void init(FilterConfig filterConfig) throws ServletException { |
||||
|
System.out.println("init,初始化方法执行了"); |
||||
|
} |
||||
|
|
||||
|
@Override//拦截到请求之后调用,调用多次 |
||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { |
||||
|
filterChain.doFilter(servletRequest, servletResponse); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override//销毁方法,只能调用一次 |
||||
|
public void destroy() { |
||||
|
System.out.println("destroy 销毁方法执行了"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,46 @@ |
|||||
|
package org.hlrj.duobao_demo.tool; |
||||
|
|
||||
|
import io.jsonwebtoken.Claims; |
||||
|
import io.jsonwebtoken.Jwts; |
||||
|
import io.jsonwebtoken.SignatureAlgorithm; |
||||
|
|
||||
|
import java.time.LocalDateTime; |
||||
|
import java.util.Date; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* @program: duobao_demo |
||||
|
* @ClassName JwtUtils |
||||
|
* @description: |
||||
|
* @author:liuyusong |
||||
|
* @create: 2025−04-14 14:38 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
public class JwtUtils { |
||||
|
|
||||
|
private static String singKey="hongli";//签名密钥 |
||||
|
private static Long expire = 30*60*1000L;//设置过期时间为半小时 |
||||
|
|
||||
|
/** |
||||
|
* 生成JWT令牌 |
||||
|
* @param claims |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String generateJwt(Map<String, Object> claims){ |
||||
|
String jwt = Jwts.builder() |
||||
|
.addClaims(claims) |
||||
|
.signWith(SignatureAlgorithm.HS256,singKey) |
||||
|
.setExpiration(new Date(System.currentTimeMillis()+expire)) |
||||
|
.compact(); |
||||
|
return jwt; |
||||
|
} |
||||
|
|
||||
|
public static Claims parseJwt(String jwt){ |
||||
|
Claims claims = Jwts.parser() |
||||
|
.setSigningKey(singKey) |
||||
|
.parseClaimsJws(jwt) |
||||
|
.getBody(); |
||||
|
return claims; |
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
package org.hlrj.duobao_demo.tool; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonAutoDetect; |
||||
|
import com.fasterxml.jackson.annotation.PropertyAccessor; |
||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||
|
import org.springframework.data.redis.core.StringRedisTemplate; |
||||
|
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; |
||||
|
|
||||
|
import java.net.UnknownHostException; |
||||
|
|
||||
|
/** |
||||
|
* @program: duobao_demo |
||||
|
* @ClassName RedisConfig |
||||
|
* @description: |
||||
|
* @author:liuyusong |
||||
|
* @create: 2025−04-11 15:46 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
@Configuration |
||||
|
public class RedisConfig { |
||||
|
@Bean |
||||
|
@ConditionalOnMissingBean(name = "redisTemplate") |
||||
|
public RedisTemplate<String, Object> redisTemplate( |
||||
|
RedisConnectionFactory redisConnectionFactory) |
||||
|
throws UnknownHostException { |
||||
|
|
||||
|
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class); |
||||
|
ObjectMapper om = new ObjectMapper(); |
||||
|
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); |
||||
|
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); |
||||
|
jackson2JsonRedisSerializer.setObjectMapper(om); |
||||
|
|
||||
|
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); |
||||
|
template.setConnectionFactory(redisConnectionFactory); |
||||
|
template.setKeySerializer(jackson2JsonRedisSerializer); |
||||
|
template.setValueSerializer(jackson2JsonRedisSerializer); |
||||
|
template.setHashKeySerializer(jackson2JsonRedisSerializer); |
||||
|
template.setHashValueSerializer(jackson2JsonRedisSerializer); |
||||
|
template.afterPropertiesSet(); |
||||
|
return template; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Bean |
||||
|
@ConditionalOnMissingBean(StringRedisTemplate.class) |
||||
|
public StringRedisTemplate stringRedisTemplate( |
||||
|
RedisConnectionFactory redisConnectionFactory) |
||||
|
throws UnknownHostException { |
||||
|
StringRedisTemplate template = new StringRedisTemplate(); |
||||
|
template.setConnectionFactory(redisConnectionFactory); |
||||
|
return template; |
||||
|
} |
||||
|
} |
@ -1,8 +1,14 @@ |
|||||
# 应用服务 WEB 访问端口 |
# 应用服务 WEB 访问端口 |
||||
server.port=8080 |
server.port=8080 |
||||
|
|
||||
|
#<<<<<<< HEAD |
||||
spring.datasource.url=jdbc:mysql://localhost:3306/duobao?useSSL=false&serverTimezone=UTC |
spring.datasource.url=jdbc:mysql://localhost:3306/duobao?useSSL=false&serverTimezone=UTC |
||||
spring.datasource.username=root |
spring.datasource.username=root |
||||
spring.datasource.password=password |
spring.datasource.password=password |
||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver |
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver |
||||
|
|
||||
|
#======= |
||||
|
#>>>>>>> 3430379550bce337a88771020e4a1dfb7cbf7dd7 |
||||
|
|
||||
|
spring.redis.host=localhost |
||||
|
spring.redis.port=6379 |
@ -0,0 +1,25 @@ |
|||||
|
<?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="org.hlrj.duobao_demo.mapper.UserMapper"> |
||||
|
|
||||
|
<!-- 通用查询映射结果 --> |
||||
|
<resultMap id="BaseResultMap" type="org.hlrj.duobao_demo.entity.User"> |
||||
|
<id column="userid" property="userid" /> |
||||
|
<result column="username" property="username" /> |
||||
|
<result column="password" property="password" /> |
||||
|
<result column="createTime" property="createTime" /> |
||||
|
</resultMap> |
||||
|
<select id="getUserByUsernameAndPassword" resultMap="BaseResultMap" parameterType="org.hlrj.duobao_demo.entity.User"> |
||||
|
SELECT |
||||
|
userid, |
||||
|
username, |
||||
|
password, |
||||
|
createTime |
||||
|
FROM |
||||
|
user |
||||
|
WHERE |
||||
|
username = #{username} |
||||
|
AND |
||||
|
password = #{password} |
||||
|
</select> |
||||
|
</mapper> |
@ -0,0 +1,26 @@ |
|||||
|
<?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="org.hlrj.duobao_demo.mapper.VideoDataMapper"> |
||||
|
|
||||
|
<!-- 通用查询映射结果 --> |
||||
|
<resultMap id="BaseResultMap" type="org.hlrj.duobao_demo.entity.VideoData"> |
||||
|
<id column="id" property="id" /> |
||||
|
<result column="main_title" property="mainTitle" /> |
||||
|
<result column="section_title" property="sectionTitle" /> |
||||
|
<result column="cover_img" property="coverImg" /> |
||||
|
<result column="author" property="author" /> |
||||
|
<result column="publish_time" property="publishTime" /> |
||||
|
<result column="description" property="description" /> |
||||
|
<result column="head" property="head"/> |
||||
|
<result column="is_booked" property="isBooked"/> |
||||
|
</resultMap> |
||||
|
<update id="isBookedById" parameterType="java.lang.Integer"> |
||||
|
UPDATE Video_data |
||||
|
SET is_booked = CASE |
||||
|
WHEN is_booked = 0 THEN 1 |
||||
|
ELSE 0 |
||||
|
END |
||||
|
WHERE id = #{id} |
||||
|
</update> |
||||
|
|
||||
|
</mapper> |
@ -1,13 +1,33 @@ |
|||||
package org.hlrj.duobao_demo; |
package org.hlrj.duobao_demo; |
||||
|
|
||||
|
import io.jsonwebtoken.Jwts; |
||||
|
import io.jsonwebtoken.SignatureAlgorithm; |
||||
import org.junit.jupiter.api.Test; |
import org.junit.jupiter.api.Test; |
||||
import org.springframework.boot.test.context.SpringBootTest; |
import org.springframework.boot.test.context.SpringBootTest; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
@SpringBootTest |
@SpringBootTest |
||||
class DuobaoDemoApplicationTests { |
class DuobaoDemoApplicationTests { |
||||
|
|
||||
@Test |
@Test |
||||
void contextLoads() { |
void contextLoads() { |
||||
} |
} |
||||
|
/* @Test |
||||
|
public void testGenJwt(){ |
||||
|
Map<String,Object> map=new HashMap<>(); |
||||
|
map.put("id",1); |
||||
|
map.put("name","liuyusong"); |
||||
|
|
||||
|
String jwt = Jwts.builder() |
||||
|
.signWith(SignatureAlgorithm.HS256,"hongli")//签名算法 |
||||
|
.setClaims(map)//自定义内容(有效载荷) |
||||
|
.setExpiration(new Date(System.currentTimeMillis()+3600*1000))//设置有效期为一个小时 |
||||
|
.compact(); |
||||
|
System.out.println(jwt); |
||||
|
}*/ |
||||
|
|
||||
|
|
||||
} |
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue