This commit is contained in:
z 2025-04-29 23:16:02 +08:00
parent d85521717c
commit 719035dcaf
16 changed files with 327 additions and 58 deletions

View File

@ -66,6 +66,8 @@
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>

View File

@ -0,0 +1,8 @@
package com.example.demo.common;
public class StrUtil {
public static boolean isEmpty(String str) {
return str == null || str.isEmpty();
}
}

View File

@ -1,45 +1,64 @@
package com.example.demo.controller;
import com.example.demo.common.ResponseBean;
import com.example.demo.common.StrUtil;
import com.example.demo.dto.request.AddArticleRequest;
import com.example.demo.mapper.ArticleMapper;
import com.example.demo.model.Article;
import com.example.demo.service.Cookie;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
@RequestMapping("/api/article")
public class ArticleController {
@Resource
private ArticleMapper articleMapper;
@PostMapping
public ResponseBean<Object> addUser(@RequestBody Article article) {
int insert = articleMapper.insert(article);
return ResponseBean.success(insert);
@PostMapping("/add")
public ResponseBean<Object> addArticle(@RequestBody AddArticleRequest addArticleRequest) {
Article article = ArticleMapper.get(addArticleRequest.getTitle(), addArticleRequest.getContent(), addArticleRequest.getAuthor());
return ResponseBean.success();
}
@GetMapping
public Article get(@RequestParam Integer id) {
@GetMapping("/get")
public Article getArticle(@RequestParam Integer id) {
return articleMapper.selectById(id);
}
@DeleteMapping
public ResponseBean<Object> delete(@RequestParam Integer id) {
@GetMapping("/deletearticle")
public ResponseBean<Object> deleteArticle(@RequestParam Integer id) {
int insert = articleMapper.deleteById(id);
return ResponseBean.success(insert);
}
@PutMapping
public ResponseBean<Object> updateUser(@RequestBody Article user) {
@PostMapping("/updatearticle")
public ResponseBean<Object> updateArticle(@RequestBody Article article) {
int update = articleMapper.updateById(user);
int update = articleMapper.updateById(article);
return ResponseBean.success(update);
}
@PostMapping("/readcount")
private ResponseBean<Object> ReadCount(@RequestBody Integer id, HttpServletRequest request, HttpServletResponse response) {
Article byId = articleMapper.selectById(id);
// 如果cookie为空,说明第一次访问,访问量可以增加
if (StrUtil.isEmpty(Cookie.getCookieValue(request, Article.VIEW_COOKIES + id))) {
Integer views = byId.getViews();
views = views + 1;
byId.setViews(views);
articleMapper.updateById(byId);
Cookie.setCookie(request, response, Article.VIEW_COOKIES + id, "viewd", 60 * 60);
}
return ResponseBean.success(byId);
}
}

View File

@ -1,12 +0,0 @@
package com.example.demo.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/auth")
public class HelloController {
}

View File

@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
@RequestMapping("/api/like")
public class LikeController {
private final LikeService likeService;
@ -15,22 +15,22 @@ public class LikeController {
}
@PostMapping("/{targetId}")
public void like(@PathVariable("targetId") String targetId, @RequestHeader("userId") String userId) {
public void like(@PathVariable("targetId") Integer targetId, @RequestHeader("userId") Integer userId) {
likeService.like(targetId, userId);
}
@DeleteMapping("/{targetId}")
public void unlike(@PathVariable("targetId") String targetId, @RequestHeader("userId") String userId) {
public void unlike(@PathVariable("targetId") Integer targetId, @RequestHeader("userId") Integer userId) {
likeService.unlike(targetId, userId);
}
@GetMapping("/{targetId}/hasLiked")
public boolean hasLiked(@PathVariable("targetId") String targetId, @RequestHeader("userId") String userId) {
public boolean hasLiked(@PathVariable("targetId") Integer targetId, @RequestHeader("userId") Integer userId) {
return likeService.hasLiked(targetId, userId);
}
@GetMapping("/{targetId}/count")
public long getLikeCount(@PathVariable("targetId") String targetId) {
public long getLikeCount(@PathVariable("targetId") Integer targetId) {
return likeService.getLikeCount(targetId);
}

View File

@ -1,15 +1,15 @@
package com.example.demo.controller;
import com.example.demo.common.ResponseBean;
import com.example.demo.mapper.ArticleMapper;
import com.example.demo.dto.request.AddArticleRequest;
import com.example.demo.dto.request.AddNewsRequest;
import com.example.demo.mapper.NewsMapper;
import com.example.demo.model.Article;
import com.example.demo.model.News;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
@RestController
//@RequestMapping("/api/auth")
@RequestMapping("/api/news")
public class NewsController {
@Resource
@ -17,29 +17,30 @@ public class NewsController {
@PostMapping
public ResponseBean<Object> addUser(@RequestBody News news) {
int insert = newsMapper.insert(news);
return ResponseBean.success(insert);
@PostMapping("/addnews")
public ResponseBean<Object> addNews(@RequestBody AddNewsRequest addNewsRequest) {
News news = NewsMapper.get(addNewsRequest.getTitle(),addNewsRequest.getContent(),addNewsRequest.getAuthor());
return ResponseBean.success();
}
@GetMapping
public News get(@RequestParam String title) {
return (News) newsMapper.selectById(title);
@GetMapping("/getnews")
public News getNews(@RequestParam String title) {
return newsMapper.selectById(title);
}
@DeleteMapping
public ResponseBean<Object> delete(@RequestParam String title) {
@GetMapping("/deletenews")
public ResponseBean<Object> deleteNews(@RequestParam String title) {
int insert = newsMapper.deleteById(title);
return ResponseBean.success(insert);
}
@PutMapping
public ResponseBean<Object> updateUser(@RequestBody News news) {
@PostMapping("/updatenews")
public ResponseBean<Object> updateNews(@RequestBody News news) {
int update = newsMapper.updateById(news);
return ResponseBean.success(update);
}
}

View File

@ -0,0 +1,10 @@
package com.example.demo.dto.request;
import lombok.Data;
@Data
public class AddArticleRequest {
private String title;
private String content;
private String author;
}

View File

@ -0,0 +1,10 @@
package com.example.demo.dto.request;
import lombok.Data;
@Data
public class AddNewsRequest {
private String title;
private String content;
private String author;
}

View File

@ -6,5 +6,9 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
static Article get(String title,String content,String author) {
return null;
}
}

View File

@ -1,10 +1,13 @@
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.Article;
import com.example.demo.model.News;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface NewsMapper extends BaseMapper {
public interface NewsMapper extends BaseMapper<News> {
static News get(String title, String content, String author) {
return null;
}
}

View File

@ -4,18 +4,27 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@TableName("article")
@Setter
@Getter
@Data
@AllArgsConstructor
public class Article {
public static final String VIEW_COOKIES = "ZWW_ARTICLE_VIEWS_";
@TableId(type = IdType.AUTO)
private Integer id;
private String title;
private String content;
private String author;
private Integer views;
private Integer likes;
private String created_at;
private String updated_at;
// created_at updated_at
// null
}

View File

@ -14,4 +14,9 @@ public class News {
private String content;
private String author;
private String date;
private Integer views;
private Integer likes;
private String created_at;
private String updated_at;
}

View File

@ -0,0 +1,211 @@
package com.example.demo.service;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Cookie {
final static Logger logger = LoggerFactory.getLogger(Cookie.class);
public static String getCookieValue(HttpServletRequest request, String cookieName) {
return getCookieValue(request, cookieName, false);
}
public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
jakarta.servlet.http.Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
if (isDecoder) {
retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");
} else {
retValue = cookieList[i].getValue();
}
break;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retValue;
}
public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
jakarta.servlet.http.Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);
break;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retValue;
}
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue) {
setCookie(request, response, cookieName, cookieValue, 60*60);
}
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage) {
setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);
}
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, boolean isEncode) {
setCookie(request, response, cookieName, cookieValue, -1, isEncode);
}
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, boolean isEncode) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);
}
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, String encodeString) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);
}
public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName) {
doSetCookie(request, response, cookieName, null, -1, false);
// doSetCookie(request, response, cookieName, "", -1, false);
}
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
try {
if (cookieValue == null) {
cookieValue = "";
} else if (isEncode) {
cookieValue = URLEncoder.encode(cookieValue, "utf-8");
}
jakarta.servlet.http.Cookie cookie = new jakarta.servlet.http.Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request) {// 设置域名的cookie
String domainName = getDomainName(request);
logger.info("========== domainName: {} ==========", domainName);
if (!"localhost".equals(domainName)) {
cookie.setDomain(domainName);
}
}
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
try {
if (cookieValue == null) {
cookieValue = "";
} else {
cookieValue = URLEncoder.encode(cookieValue, encodeString);
}
jakarta.servlet.http.Cookie cookie = new jakarta.servlet.http.Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request) {// 设置域名的cookie
String domainName = getDomainName(request);
logger.info("========== domainName: {} ==========", domainName);
if (!"localhost".equals(domainName)) {
cookie.setDomain(domainName);
}
}
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
private static final String getDomainName(HttpServletRequest request) {
String domainName = null;
String serverName = request.getRequestURL().toString();
if (serverName == null || serverName.equals("")) {
domainName = "";
} else {
serverName = serverName.toLowerCase();
serverName = serverName.substring(7);
final int end = serverName.indexOf("/");
serverName = serverName.substring(0, end);
if (serverName.indexOf(":") > 0) {
String[] ary = serverName.split("\\:");
serverName = ary[0];
}
final String[] domains = serverName.split("\\.");
int len = domains.length;
if (len > 3 && !isIp(serverName)) {
// www.xxx.com.cn
domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
} else if (len <= 3 && len > 1) {
// xxx.com or xxx.cn
domainName = "." + domains[len - 2] + "." + domains[len - 1];
} else {
domainName = serverName;
}
}
return domainName;
}
public static String trimSpaces(String IP){//去掉IP字符串前后所有的空格
while(IP.startsWith(" ")){
IP= IP.substring(1,IP.length()).trim();
}
while(IP.endsWith(" ")){
IP= IP.substring(0,IP.length()-1).trim();
}
return IP;
}
public static boolean isIp(String IP){//判断是否是一个IP
boolean b = false;
IP = trimSpaces(IP);
if(IP.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")){
String s[] = IP.split("\\.");
if(Integer.parseInt(s[0])<255)
if(Integer.parseInt(s[1])<255)
if(Integer.parseInt(s[2])<255)
if(Integer.parseInt(s[3])<255)
b = true;
}
return b;
}
}

View File

@ -7,8 +7,6 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
@Data
public class LikeService {
private final RedisTemplate<String, Object> redisTemplate;
@ -17,20 +15,20 @@ public class LikeService {
this.redisTemplate = redisTemplate;
}
public void like(String targetId, String userId) {
public void like(Integer targetId, Integer userId) {
// 使用集合记录点赞用户防止重复点赞
redisTemplate.opsForSet().add(targetId + ":likes", userId);
// 点赞数自增使用字符串存储点赞数方便后续展示
redisTemplate.opsForValue().increment(targetId + ":likeCount", 1);
}
public void unlike(String targetId, String userId) {
public void unlike(Integer targetId, Integer userId) {
redisTemplate.opsForSet().remove(targetId + ":likes", userId);
redisTemplate.opsForValue().decrement(targetId + ":likeCount", 1);
}
public boolean hasLiked(String targetId, String userId) {
public boolean hasLiked(Integer targetId, Integer userId) {
return redisTemplate.opsForSet().isMember(targetId + ":likes", userId);
}
public long getLikeCount(String targetId) {
public long getLikeCount(Integer targetId) {
Long count = (Long) redisTemplate.opsForValue().get(targetId + ":likeCount");
return count == null? 0 : count;
}

View File

@ -13,7 +13,8 @@ public class UserService extends ServiceImpl<UserMapper, User >{
}
public boolean checkLogin() {
return true;}
return true;
}
public Object getLoginUser() {
return null;

View File

@ -5,7 +5,7 @@ spring:
datasource:
url: jdbc:mysql://localhost:3306/dj-weapp?useUnicode=true&characterEncoding=utf8
username: root
password: '@liu061102'
password: ''
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource