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 访问端口 |
|||
server.port=8080 |
|||
|
|||
#<<<<<<< HEAD |
|||
spring.datasource.url=jdbc:mysql://localhost:3306/duobao?useSSL=false&serverTimezone=UTC |
|||
spring.datasource.username=root |
|||
spring.datasource.password=password |
|||
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; |
|||
|
|||
import io.jsonwebtoken.Jwts; |
|||
import io.jsonwebtoken.SignatureAlgorithm; |
|||
import org.junit.jupiter.api.Test; |
|||
import org.springframework.boot.test.context.SpringBootTest; |
|||
|
|||
import java.util.Date; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
@SpringBootTest |
|||
class DuobaoDemoApplicationTests { |
|||
|
|||
@Test |
|||
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