diff --git a/SeKeshedemo/.idea/.gitignore b/SeKeshedemo/.idea/.gitignore
new file mode 100644
index 0000000..463c03e
--- /dev/null
+++ b/SeKeshedemo/.idea/.gitignore
@@ -0,0 +1,8 @@
+# ĬϺԵļ
+/shelf/
+/workspace.xml
+# ڱ༭ HTTP ͻ
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/SeKeshedemo/.idea/compiler.xml b/SeKeshedemo/.idea/compiler.xml
new file mode 100644
index 0000000..bfc71e1
--- /dev/null
+++ b/SeKeshedemo/.idea/compiler.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SeKeshedemo/.idea/encodings.xml b/SeKeshedemo/.idea/encodings.xml
new file mode 100644
index 0000000..63e9001
--- /dev/null
+++ b/SeKeshedemo/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SeKeshedemo/.idea/jarRepositories.xml b/SeKeshedemo/.idea/jarRepositories.xml
new file mode 100644
index 0000000..712ab9d
--- /dev/null
+++ b/SeKeshedemo/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SeKeshedemo/.idea/misc.xml b/SeKeshedemo/.idea/misc.xml
new file mode 100644
index 0000000..88aa9a7
--- /dev/null
+++ b/SeKeshedemo/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SeKeshedemo/.idea/uiDesigner.xml b/SeKeshedemo/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/SeKeshedemo/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/SeKeshedemo/.idea/workspace.xml b/SeKeshedemo/.idea/workspace.xml
index a94e0e8..a045fe5 100644
--- a/SeKeshedemo/.idea/workspace.xml
+++ b/SeKeshedemo/.idea/workspace.xml
@@ -36,25 +36,25 @@
- {
+ "keyToString": {
+ "RequestMappingsPanelOrder0": "0",
+ "RequestMappingsPanelOrder1": "1",
+ "RequestMappingsPanelWidth0": "75",
+ "RequestMappingsPanelWidth1": "75",
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "last_opened_file_path": "D:/2025666/SeKeshedemo/src/main/java/com/example/demo",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "spring.configuration.checksum": "fe01ce2a7fbac8fafaed7c982a04e229",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -101,10 +101,26 @@
+
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/com/example/demo/controller/UserController.java
+ 127
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SeKeshedemo/.mvn/wrapper/maven-wrapper.properties b/SeKeshedemo/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..12fbe1e
--- /dev/null
+++ b/SeKeshedemo/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+wrapperVersion=3.3.2
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
diff --git a/SeKeshedemo/pom.xml b/SeKeshedemo/pom.xml
new file mode 100644
index 0000000..1c6089d
--- /dev/null
+++ b/SeKeshedemo/pom.xml
@@ -0,0 +1,109 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.4.2
+
+
+ com.example
+ demo
+ 0.0.1-SNAPSHOT
+ jar
+ demo
+ demo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web-services
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 3.0.4
+
+
+
+ com.mysql
+ mysql-connector-j
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter-test
+ 3.0.4
+ test
+
+
+ org.projectlombok
+ lombok
+
+
+ com.auth0
+ java-jwt
+ 4.4.0
+
+
+
+ org.apache.tomcat
+ tomcat-jdbc
+
+
+
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/SeKeshedemo/src/main/java/com/example/demo/Demo4Application.java b/SeKeshedemo/src/main/java/com/example/demo/Demo4Application.java
new file mode 100644
index 0000000..0344102
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/Demo4Application.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Demo4Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Demo4Application.class, args);
+ }
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/config/MyFilter.java b/SeKeshedemo/src/main/java/com/example/demo/config/MyFilter.java
new file mode 100644
index 0000000..05a6e96
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/config/MyFilter.java
@@ -0,0 +1,64 @@
+package com.example.demo.config;
+
+import com.example.demo.pojo.Result;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.servlet.*;
+import jakarta.servlet.annotation.WebFilter;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+//重点
+@WebFilter({"/user/*","/api","/upload","/borrow","/api/rank"})
+public class MyFilter implements Filter{
+
+ List exclude;
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ System.out.println("初始化MyFilter==========================");
+ exclude = new ArrayList<>();
+ exclude.add("/user/login");
+ exclude.add("/user/register");
+ }
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ HttpServletResponse response = (HttpServletResponse) servletResponse;
+ HttpServletRequest request = (HttpServletRequest) servletRequest;
+ String requestURI = request.getRequestURI();
+ if (exclude.contains(requestURI) ||
+ requestURI.endsWith(".html") ||
+ requestURI.endsWith(".js") ||
+ requestURI.endsWith(".css") ||
+ requestURI.endsWith(".png") ||
+ requestURI.endsWith(".jpg") ||
+ requestURI.endsWith(".jpeg")
+ ) {
+ // 在排除列表中,继续过滤链
+ filterChain.doFilter(servletRequest,servletResponse);
+ return;
+ }
+
+ boolean loginflag = request.getSession().getAttribute("username") != null;
+ if(loginflag){
+ //登陆成功
+ //这就代码就是放行
+ filterChain.doFilter(servletRequest, servletResponse);
+ }else{
+ //登陆失败,打回请求
+ ObjectMapper mapper = new ObjectMapper();
+ response.getWriter().write(mapper.writeValueAsString(Result.error("未登录")));
+ }
+
+ System.out.println("filter==========================");
+ }
+ @Override
+ public void destroy() {
+ System.out.println("销毁filter==========================");
+ }
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/controller/ArticleController.java b/SeKeshedemo/src/main/java/com/example/demo/controller/ArticleController.java
new file mode 100644
index 0000000..a5b6da0
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/controller/ArticleController.java
@@ -0,0 +1,58 @@
+package com.example.demo.controller;
+
+import com.example.demo.mapper.UserMapper;
+import com.example.demo.pojo.Article;
+import com.example.demo.pojo.Result;
+import com.example.demo.service.ArticleService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/api")
+public class ArticleController {
+
+
+ @Autowired
+ ArticleService articleService;
+
+ @Autowired
+ UserMapper userMapper;
+
+ @PostMapping("/add")
+ public Result addarticle(@RequestBody Article article, HttpSession session) throws JsonProcessingException {
+ System.out.println("Received article: " + article); // 添加此行以调试
+ int admin = userMapper.findByUserName(String.valueOf(session.getAttribute("username"))).getAdmin();
+ if (admin == 1) {
+ articleService.addarticle(article);
+ return Result.success(article);
+ }
+ else{
+ return Result.error("权限不够。。。");
+ }
+ }
+
+ @GetMapping("/select")
+ public Result selectarticle(HttpServletRequest request) {
+ List articles = articleService.selectarticle();
+ System.out.println(request.getRequestURL());
+ return Result.success(articles);
+ }
+
+
+
+ //根据书籍名字搜索单个书籍信息
+ @GetMapping("/selectone")
+ public Result selectone(String title){
+ Article article= articleService.selectonearticle(title);
+ return Result.success(article);
+ }
+
+
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/controller/BorrowController.java b/SeKeshedemo/src/main/java/com/example/demo/controller/BorrowController.java
new file mode 100644
index 0000000..bd6f248
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/controller/BorrowController.java
@@ -0,0 +1,68 @@
+package com.example.demo.controller;
+
+import com.example.demo.mapper.BorrowMapper;
+import com.example.demo.pojo.Article;
+import com.example.demo.pojo.Borrow;
+import com.example.demo.pojo.Result;
+import com.example.demo.service.ArticleService;
+import com.example.demo.service.BorrowService;
+
+import com.example.demo.service.UserService;
+import jakarta.servlet.http.HttpSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.LocalDateTime;
+
+@RestController
+@CrossOrigin
+@RequestMapping("/borrow")
+public class BorrowController {
+ @Autowired
+ private BorrowService borrowService;
+
+ @Autowired
+ private UserService userService;
+
+ @Autowired
+ private ArticleService articleService;
+ @Autowired
+ private BorrowMapper borrowMapper;
+
+
+ //租借书
+ @PostMapping("/borrowbook")
+ public Result borrowbook(String title, HttpSession session) {
+ Borrow borrow = new Borrow();
+ borrow.setTitle(title);
+ borrow.setBorrower((String) session.getAttribute("username"));
+ borrow.setBorrow_time(LocalDateTime.now());
+ Article article = articleService.selectonearticle(title);
+ float money = article.getMoney();
+ float balance = userService.findmoney(session.getAttribute("username"));
+ if (balance >= money) {
+ borrowService.borrow(borrow);
+ userService.deduct(money,session.getAttribute("username"));
+ return Result.success(borrow);
+ }
+ else{
+ return Result.error("余额不足!");
+ }
+ }
+
+
+ //还书
+ @PostMapping("/returnbook")
+ public Result returnbook(String title, HttpSession session){
+ Borrow borrow=new Borrow();
+ borrow.setTitle(title);
+ borrow.setBorrower((String) session.getAttribute("username"));
+ borrow.setReturn_time(LocalDateTime.now());
+ borrowService.returnbook(borrow);
+ borrowMapper.fine();
+ return Result.success(borrow);
+ }
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/controller/BorrowRankController.java b/SeKeshedemo/src/main/java/com/example/demo/controller/BorrowRankController.java
new file mode 100644
index 0000000..7b522bb
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/controller/BorrowRankController.java
@@ -0,0 +1,33 @@
+package com.example.demo.controller;
+
+import com.example.demo.pojo.ArticleRentRankDTO;
+import com.example.demo.service.BorrowRankService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/rank")
+public class BorrowRankController {
+
+ @Autowired
+ private BorrowRankService borrowRankService;
+
+ /**
+ * 本周热租榜单接口
+ */
+ @GetMapping("/weekly")
+ public List weeklyRank() {
+ return borrowRankService.getWeeklyRank();
+ }
+
+ /**
+ * 本月热租榜单接口
+ */
+ @GetMapping("/monthly")
+ public List monthlyRank() {
+ return borrowRankService.getMonthlyRank();
+ }
+}
\ No newline at end of file
diff --git a/SeKeshedemo/src/main/java/com/example/demo/controller/UserController.java b/SeKeshedemo/src/main/java/com/example/demo/controller/UserController.java
new file mode 100644
index 0000000..8d35b18
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/controller/UserController.java
@@ -0,0 +1,131 @@
+package com.example.demo.controller;
+
+
+import com.example.demo.mapper.BorrowMapper;
+import com.example.demo.mapper.UserMapper;
+import com.example.demo.pojo.*;
+import com.example.demo.service.ArticleService;
+import com.example.demo.service.UserService;
+import jakarta.servlet.http.HttpSession;
+import org.apache.ibatis.annotations.Delete;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+@CrossOrigin(origins = "http://localhost:8877")
+@RestController
+@RequestMapping("/user")
+
+public class UserController {
+
+ @Autowired
+ private UserService userService;
+ @Autowired
+ private UserMapper userMapper;
+
+ @Autowired
+ private BorrowMapper borrowMapper;
+
+ @Autowired
+ private ArticleService articleService;
+
+//获取用户登陆信息
+ @GetMapping("/getinfo")
+ public ResponseEntity> getInfo(HttpSession session) {
+ String username = (String) session.getAttribute("username");
+ if (username == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("{\"error\": \"Username not found in session\"}");
+ }
+ info info = userService.getinfo(username);
+ System.out.println(info);
+ if (info == null) {
+ return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"error\": \"User information not found for username: " + username + "\"}");
+ }
+ return ResponseEntity.ok(info);
+ }
+
+
+ //注册
+ @PostMapping("/register")
+ public Result register(String username, String password) {
+ User u = userService.findByUserName(username);
+ if (u == null) {
+ userService.register(username, password);
+ return Result.success();
+ } else {
+ return Result.error("该用户名已被注册");
+ }
+ }
+ //登陆
+ @PostMapping("/login")
+ public Result login(String username, String password,HttpSession session) {
+ User u = userService.findByUserName(username);
+ if (u != null) {
+ userService.login(username, password);
+ String pass=userMapper.login(username);
+
+ if (password.equals(pass)) {
+ session.setAttribute("username",username);
+ System.out.println("登陆成功!");
+ return Result.success("登陆成功!");
+ } else {
+ //这里已经处理好了
+ return Result.error("账号或密码错误!");
+ }
+ } else {
+ return null;
+ }
+ }
+//充值金额
+ @PostMapping("/recharge")
+ public Result recharge(float money,HttpSession session){
+ userService.recharge(money, (String) session.getAttribute("username"));
+ return Result.success("成功充值:"+money+"元");
+ }
+
+ //查询金额+VIP
+ @PostMapping("/findmoney")
+ public Result findmoney(HttpSession session){
+ float balance=userService.findmoney(session.getAttribute("username"));
+ userMapper.updateVIP(balance,(String) session.getAttribute("username"));
+ int VIP=userMapper.findVIP((String) session.getAttribute("username"));
+ return Result.success("余额为:"+balance+"元"+" 当前VIP等级为:"+VIP);
+ }
+
+ //查询个人借书记录
+ @GetMapping("findone")
+ public Result findone(HttpSession session){
+ User user=userMapper.findByUserName((String) session.getAttribute("username"));
+ int admin=user.getAdmin();
+ if(admin==1){
+ List borrow=borrowMapper.findall();
+ return Result.success(borrow);
+ }
+ else{
+ Borrow borrow=borrowMapper.findone(user.getUsername());
+ return Result.success(borrow);
+ }
+ }
+
+ //管理员删除书籍
+ @PostMapping("delete")
+ public Result delete(String title,HttpSession session) {
+ int admin = userMapper.findByUserName((String) session.getAttribute("username")).getAdmin();
+ if (admin == 1) {
+ userMapper.deletebook(title);
+ return Result.success("该书本已删除!");
+ }
+ else{
+ return Result.error("权限不够。。。");
+ }
+ }
+
+ @GetMapping("/borrow/books")
+ public Result> getUserBorrowedBooks(HttpSession session) {
+ return Result.success(articleService.getUserBorrowedBooks((String) session.getAttribute("username")));
+ }
+}
\ No newline at end of file
diff --git a/SeKeshedemo/src/main/java/com/example/demo/mapper/ArticleMapper.java b/SeKeshedemo/src/main/java/com/example/demo/mapper/ArticleMapper.java
new file mode 100644
index 0000000..134d6b1
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/mapper/ArticleMapper.java
@@ -0,0 +1,42 @@
+package com.example.demo.mapper;
+
+
+import com.example.demo.pojo.Article;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface ArticleMapper {
+
+ @Insert("INSERT INTO article (title, content, url, state)\n" +
+ "VALUES \n" +
+ "(#{title}, #{content}, #{url},#{state})")
+ @Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
+ Long addarticle(Article article);
+
+
+ //查询所有书籍所有信息
+ @Select("SELECT * FROM article")
+ List selectarticle();
+
+ //查询
+
+//管理员删除书籍
+ @Delete("DELETE FROM article WHERE id = #{id}")
+ Integer deleteArticle(Long id);
+
+ //查询单本书
+ @Select("SELECT * from article where title=#{title}")
+ Article selectonearticle(String title);
+
+
+ @Select("SELECT a.* " +
+ "FROM article a " +
+ "INNER JOIN borrow b ON a.title = b.title " +
+ "INNER JOIN user u ON b.borrower = u.username " +
+ "WHERE u.username = #{username} " +
+ "AND b.borrow_time IS NOT NULL " +
+ "AND b.return_time IS NULL")
+ List findBorrowedBooksByUsername(String username);
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/mapper/BorrowMapper.java b/SeKeshedemo/src/main/java/com/example/demo/mapper/BorrowMapper.java
new file mode 100644
index 0000000..8560fec
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/mapper/BorrowMapper.java
@@ -0,0 +1,62 @@
+package com.example.demo.mapper;
+
+import com.example.demo.pojo.Article;
+import com.example.demo.pojo.Borrow;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+
+import java.util.List;
+
+@Mapper
+public interface BorrowMapper {
+ //借书
+ @Insert("INSERT INTO borrow (title, borrower, borrow_time)\n" +
+ "VALUES \n" +
+ "(#{title}, #{borrower}, now())")
+ void borrowrecord(Borrow borrow);
+
+ // 更新对应物品的被租数量(number+1)
+ @Update("UPDATE article " +
+ "SET number = number + 1 " +
+ "WHERE title = #{title}")
+ void incrementArticleNumber(String title);
+
+//还书
+ @Insert("INSERT INTO borrow (title, borrower, return_time)\n" +
+ "VALUES \n" +
+ "(#{title}, #{borrower}, now())")
+ void returnrecord(Borrow borrow);
+
+ //超过一个月罚金扣20元
+ @Update("UPDATE user\n" +
+ "SET balance = balance - 20\n" +
+ "WHERE username IN (\n" +
+ " SELECT username\n" +
+ " FROM borrow\n" +
+ " WHERE DATEDIFF(CURRENT_DATE(), borrow_time) > 30\n" +
+ ");")
+ void fine();
+
+ //查询还借书记录(所有)
+ @Select("select * from borrow")
+ List findall();
+
+ //查询还书记录(个人)
+ @Select("select * from borrow where borrower=#{username}")
+ Borrow findone(String username);
+
+
+ //查询个人已经借的书的所有信息
+ @Select("SELECT a.* " +
+ "FROM article a " +
+ "INNER JOIN borrow b ON a.title = b.title " +
+ "INNER JOIN user u ON b.borrower = u.username " +
+ "WHERE u.username = #{username} " +
+ "AND b.borrow_time IS NOT NULL " +
+ "AND b.return_time IS NULL")
+ List findBorrowedBooksByUsername(String username);
+
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/mapper/BorrowRankMapper.java b/SeKeshedemo/src/main/java/com/example/demo/mapper/BorrowRankMapper.java
new file mode 100644
index 0000000..4e824eb
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/mapper/BorrowRankMapper.java
@@ -0,0 +1,44 @@
+package com.example.demo.mapper;
+
+import com.example.demo.pojo.ArticleRentRankDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import java.util.List;
+
+@Mapper
+public interface BorrowRankMapper {
+
+ /**
+ * 查询本周热租榜单(Top10)
+ */
+ @Select("SELECT " +
+ "b.title, " +
+ "a.url, " +
+ "a.money, " +
+ "COUNT(b.title) AS number " +
+ "FROM borrow b " +
+ "LEFT JOIN article a ON b.title = a.title " +
+ "WHERE b.borrow_time >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) " +
+ "AND b.borrow_time < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 7 DAY) " +
+ "GROUP BY b.title, a.url, a.money " +
+ "ORDER BY number DESC " +
+ "LIMIT 10")
+ List listWeeklyRank();
+
+ /**
+ * 查询本月热租榜单(Top10)
+ */
+ @Select("SELECT " +
+ "b.title, " +
+ "a.url, " +
+ "a.money, " +
+ "COUNT(b.title) AS number " +
+ "FROM borrow b " +
+ "LEFT JOIN article a ON b.title = a.title " +
+ "WHERE b.borrow_time >= DATE_FORMAT(CURDATE(), '%Y-%m-01') " +
+ "AND b.borrow_time < DATE_ADD(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 1 MONTH) " +
+ "GROUP BY b.title, a.url, a.money " +
+ "ORDER BY number DESC " +
+ "LIMIT 10")
+ List listMonthlyRank();
+}
\ No newline at end of file
diff --git a/SeKeshedemo/src/main/java/com/example/demo/mapper/UserMapper.java b/SeKeshedemo/src/main/java/com/example/demo/mapper/UserMapper.java
new file mode 100644
index 0000000..9686fb8
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/mapper/UserMapper.java
@@ -0,0 +1,63 @@
+package com.example.demo.mapper;
+
+
+import com.example.demo.pojo.User;
+import com.example.demo.pojo.info;
+import org.apache.ibatis.annotations.*;
+
+@Mapper
+public interface UserMapper {
+ @Select("select * from user where username=#{username}")
+ User findByUserName(String username);
+
+ @Insert("insert into user(username,password,vip,create_time,update_time,admin,balance)" +
+ " values(#{username},#{password},#{vip},now(),now(),#{admin},#{balance})")
+ void add(String username,String password,int vip,int admin,float balance);
+
+ @Select("SELECT password FROM user WHERE username=#{username}")
+ String login(String username);
+
+
+ @Select("select username,pic from user where username=#{username}")
+ info getinfo( String username);
+
+
+ //充钱
+ @Update("UPDATE user\n" +
+ "SET balance=balance+#{money1}\n" +
+ "WHERE username=#{username};")
+ void recharge(float money1,String username);
+
+
+ //查询余额
+ @Select("select balance from user where username=#{username}")
+ float findbalance(Object username);
+
+ //更新VIP余额
+ @Update("UPDATE `user`\n" +
+ "SET `vip` = CASE\n" +
+ " WHEN `balance` >= 10 AND `balance` < 30 THEN '1'\n" +
+ " WHEN `balance` >= 30 AND `balance` < 100 THEN '2'\n" +
+ " WHEN `balance` >= 100 AND `balance` < 300 THEN '3'\n" +
+ " WHEN `balance` >= 300 AND `balance` < 500 THEN '4'\n" +
+ " WHEN `balance` >= 500 THEN '5'\n" +
+ " ELSE `vip` -- 不满足条件的记录保持原有vip值\n" +
+ "END\n" +
+ "WHERE `username` = #{username};")
+ void updateVIP( float balance,String username);
+
+ @Select("select vip from user where username=#{username}")
+ int findVIP(String username);
+
+ //扣钱
+ @Update("UPDATE user\n" +
+ "SET balance=balance-#{money1}\n" +
+ "WHERE username=#{username};")
+ void deduct(float money1,String username);
+
+ //管理员删除书
+ @Delete("DELETE FROM article WHERE title=#{title}")
+ void deletebook(String title);
+
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/pojo/Article.java b/SeKeshedemo/src/main/java/com/example/demo/pojo/Article.java
new file mode 100644
index 0000000..e39fcc3
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/pojo/Article.java
@@ -0,0 +1,15 @@
+package com.example.demo.pojo;
+
+
+import lombok.Data;
+
+@Data
+public class Article {
+ private int id;
+ private String title;
+ private String content;
+ private String url;
+ private String state;
+ private float money;
+ private int number;
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/pojo/ArticleRentRankDTO.java b/SeKeshedemo/src/main/java/com/example/demo/pojo/ArticleRentRankDTO.java
new file mode 100644
index 0000000..f40c651
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/pojo/ArticleRentRankDTO.java
@@ -0,0 +1,11 @@
+package com.example.demo.pojo;
+
+import lombok.Data;
+
+@Data
+public class ArticleRentRankDTO {
+ private String title; // 物品名称
+ private String url; // 封面图片
+ private Float money; // 租借价格
+ private Integer number; // 租借次数
+}
\ No newline at end of file
diff --git a/SeKeshedemo/src/main/java/com/example/demo/pojo/Borrow.java b/SeKeshedemo/src/main/java/com/example/demo/pojo/Borrow.java
new file mode 100644
index 0000000..9db0a1d
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/pojo/Borrow.java
@@ -0,0 +1,13 @@
+package com.example.demo.pojo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class Borrow {
+ private String title;
+ private String borrower;
+ private LocalDateTime borrow_time;
+ private LocalDateTime return_time;
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/pojo/Result.java b/SeKeshedemo/src/main/java/com/example/demo/pojo/Result.java
new file mode 100644
index 0000000..9605aec
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/pojo/Result.java
@@ -0,0 +1,31 @@
+package com.example.demo.pojo;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+//统一响应结果
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class Result {
+ private Integer code;//业务状态码 0-成功 1-失败,前端获取到这个code就可以判断了
+ private String message;//提示信息
+ private T data;//响应数据
+
+ //快速返回操作成功响应结果(带响应数据)
+ public static Result success(E data) {
+ return new Result<>(200, "操作成功", data);
+ }
+
+ //快速返回操作成功响应结果
+ public static Result success() {
+ return new Result(200, "操作成功", null);
+ }
+
+ public static Result error(String message) {
+ return new Result(1, message, null);
+ }
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/pojo/User.java b/SeKeshedemo/src/main/java/com/example/demo/pojo/User.java
new file mode 100644
index 0000000..820ce38
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/pojo/User.java
@@ -0,0 +1,17 @@
+package com.example.demo.pojo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+@Data
+public class User {
+ private Integer id;
+ private String username;
+ private String password;
+ private String vip;
+ private String userPic;
+ private LocalDateTime createTime;
+ private LocalDateTime updateTime;
+ private Integer admin;
+ private float balance;
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/pojo/info.java b/SeKeshedemo/src/main/java/com/example/demo/pojo/info.java
new file mode 100644
index 0000000..8aa8d91
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/pojo/info.java
@@ -0,0 +1,9 @@
+package com.example.demo.pojo;
+
+import lombok.Data;
+
+@Data
+public class info {
+ private String username;
+ private String pic;
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/ArticleService.java b/SeKeshedemo/src/main/java/com/example/demo/service/ArticleService.java
new file mode 100644
index 0000000..32723d7
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/ArticleService.java
@@ -0,0 +1,18 @@
+package com.example.demo.service;
+
+import com.example.demo.pojo.Article;
+
+import java.util.List;
+
+public interface ArticleService {
+ Long addarticle(Article article);
+
+ List selectarticle();
+
+ List getUserBorrowedBooks(String username);
+
+ boolean deletearticle(Long id);
+
+ Article selectonearticle(String title);
+}
+
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/BorrowRankService.java b/SeKeshedemo/src/main/java/com/example/demo/service/BorrowRankService.java
new file mode 100644
index 0000000..6bce2d3
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/BorrowRankService.java
@@ -0,0 +1,28 @@
+package com.example.demo.service;
+
+import com.example.demo.mapper.BorrowRankMapper;
+import com.example.demo.pojo.ArticleRentRankDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+@Service
+public class BorrowRankService {
+
+ @Autowired // 改用Spring的@Autowired注解
+ private BorrowRankMapper borrowRankMapper;
+
+ /**
+ * 获取本周热租榜单
+ */
+ public List getWeeklyRank() {
+ return borrowRankMapper.listWeeklyRank();
+ }
+
+ /**
+ * 获取本月热租榜单
+ */
+ public List getMonthlyRank() {
+ return borrowRankMapper.listMonthlyRank();
+ }
+}
\ No newline at end of file
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/BorrowService.java b/SeKeshedemo/src/main/java/com/example/demo/service/BorrowService.java
new file mode 100644
index 0000000..2189cd0
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/BorrowService.java
@@ -0,0 +1,14 @@
+package com.example.demo.service;
+
+import com.example.demo.mapper.BorrowMapper;
+import com.example.demo.pojo.Borrow;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public interface BorrowService {
+
+
+ void borrow(Borrow borrow);
+
+ void returnbook(Borrow borrow);
+
+}
\ No newline at end of file
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/UserService.java b/SeKeshedemo/src/main/java/com/example/demo/service/UserService.java
new file mode 100644
index 0000000..1443d55
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/UserService.java
@@ -0,0 +1,20 @@
+package com.example.demo.service;
+
+import com.example.demo.pojo.User;
+import com.example.demo.pojo.info;
+
+public interface UserService {
+ User findByUserName(String username);
+
+ void register(String username, String password);
+
+ void login(String username, String password);
+
+ info getinfo(String username);
+
+ void recharge(float money, String username);
+
+ float findmoney(Object username);
+
+ void deduct(float money, Object username);
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/impl/ArticleServiceImpl.java b/SeKeshedemo/src/main/java/com/example/demo/service/impl/ArticleServiceImpl.java
new file mode 100644
index 0000000..420d740
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/impl/ArticleServiceImpl.java
@@ -0,0 +1,47 @@
+package com.example.demo.service.impl;
+
+import com.example.demo.mapper.ArticleMapper;
+import com.example.demo.pojo.Article;
+import com.example.demo.service.ArticleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ArticleServiceImpl implements ArticleService {
+
+
+ @Autowired
+ ArticleMapper articleMapper;
+ @Override
+ public Long addarticle(Article article) {
+
+ return articleMapper.addarticle(article);
+ }
+
+ @Override
+ public List selectarticle() {
+ return articleMapper.selectarticle();
+ }
+
+ @Override
+ public boolean deletearticle(Long id) {
+ final Integer integer = articleMapper.deleteArticle((long) Math.toIntExact(id));
+ return integer == 1;
+ }
+
+ @Override
+ public Article selectonearticle(String title) {
+ return articleMapper.selectonearticle(title);
+ }
+
+ @Override
+ public List getUserBorrowedBooks(String username) {
+ // 可添加参数校验(如用户名非空)
+ if (username == null || username.trim().isEmpty()) {
+ throw new IllegalArgumentException("用户名不能为空");
+ }
+ return articleMapper.findBorrowedBooksByUsername(username);
+ }
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/impl/BorrowServiceImpl.java b/SeKeshedemo/src/main/java/com/example/demo/service/impl/BorrowServiceImpl.java
new file mode 100644
index 0000000..38f3618
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/impl/BorrowServiceImpl.java
@@ -0,0 +1,35 @@
+package com.example.demo.service.impl;
+
+
+import com.example.demo.mapper.BorrowMapper;
+import com.example.demo.pojo.Article;
+import com.example.demo.pojo.Borrow;
+import com.example.demo.service.BorrowService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class BorrowServiceImpl implements BorrowService {
+
+ @Autowired
+ BorrowMapper borrowMapper ;
+
+ @Transactional
+ public void borrow(Borrow borrow) {
+ // 1. 新增租借记录
+ borrowMapper.borrowrecord(borrow);
+ // 2. 对应物品的number+1(根据title关联)
+ borrowMapper.incrementArticleNumber(borrow.getTitle());
+ }
+
+
+ @Override
+ public void returnbook(Borrow borrow) {
+ borrowMapper.returnrecord(borrow);
+ }
+
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/service/impl/UserServiceImpl.java b/SeKeshedemo/src/main/java/com/example/demo/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..3d3dd30
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/service/impl/UserServiceImpl.java
@@ -0,0 +1,58 @@
+package com.example.demo.service.impl;
+
+
+import com.example.demo.mapper.UserMapper;
+import com.example.demo.pojo.User;
+import com.example.demo.pojo.info;
+import com.example.demo.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+ @Autowired
+ private UserMapper userMapper;
+
+
+
+
+ @Override
+ public User findByUserName(String username) {
+ User u=userMapper.findByUserName(username);
+ return u;
+ }
+
+ @Override
+ public void register(String username, String password) {
+ userMapper.add(username,password,0,0,0);
+ }
+
+ @Override
+ public void login(String username, String password) {
+
+
+ }
+
+
+
+ public info getinfo(String username) {
+ return userMapper.getinfo(username);
+ }
+
+ @Override
+ public void recharge(float money, String username) {
+ userMapper.recharge(money,username);
+ }
+
+ @Override
+ public float findmoney(Object username) {
+ return userMapper.findbalance(username);
+ }
+
+ @Override
+ public void deduct(float money,Object name) {
+ userMapper.deduct(money, (String) name);
+ }
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/utils/JwtUtil.java b/SeKeshedemo/src/main/java/com/example/demo/utils/JwtUtil.java
new file mode 100644
index 0000000..425b01a
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/utils/JwtUtil.java
@@ -0,0 +1,30 @@
+package com.example.demo.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+
+import java.util.Date;
+import java.util.Map;
+
+public class JwtUtil {
+
+ private static final String KEY = "itheima";
+
+ //接收业务数据,生成token并返回
+ public static String genToken(Map claims) {
+ return JWT.create()
+ .withClaim("claims", claims)
+ .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
+ .sign(Algorithm.HMAC256(KEY));
+ }
+
+ //接收token,验证token,并返回业务数据
+ public static Map parseToken(String token) {
+ return JWT.require(Algorithm.HMAC256(KEY))
+ .build()
+ .verify(token)
+ .getClaim("claims")
+ .asMap();
+ }
+
+}
diff --git a/SeKeshedemo/src/main/java/com/example/demo/utils/Md5Util.java b/SeKeshedemo/src/main/java/com/example/demo/utils/Md5Util.java
new file mode 100644
index 0000000..002c882
--- /dev/null
+++ b/SeKeshedemo/src/main/java/com/example/demo/utils/Md5Util.java
@@ -0,0 +1,73 @@
+package com.example.demo.utils;
+
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class Md5Util {
+ /**
+ * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
+ */
+ protected static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+ protected static MessageDigest messagedigest = null;
+
+ static {
+ try {
+ messagedigest = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException nsaex) {
+ System.err.println(Md5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");
+ nsaex.printStackTrace();
+ }
+ }
+
+ /**
+ * 生成字符串的md5校验值
+ *
+ * @param s
+ * @return
+ */
+ public static String getMD5String(String s) {
+ return getMD5String(s.getBytes());
+ }
+
+ /**
+ * 判断字符串的md5校验码是否与一个已知的md5码相匹配
+ *
+ * @param password 要校验的字符串
+ * @param md5PwdStr 已知的md5校验码
+ * @return
+ */
+ public static boolean checkPassword(String password, String md5PwdStr) {
+ String s = getMD5String(password);
+ return s.equals(md5PwdStr);
+ }
+
+
+ public static String getMD5String(byte[] bytes) {
+ messagedigest.update(bytes);
+ return bufferToHex(messagedigest.digest());
+ }
+
+ private static String bufferToHex(byte bytes[]) {
+ return bufferToHex(bytes, 0, bytes.length);
+ }
+
+ private static String bufferToHex(byte bytes[], int m, int n) {
+ StringBuffer stringbuffer = new StringBuffer(2 * n);
+ int k = m + n;
+ for (int l = m; l < k; l++) {
+ appendHexPair(bytes[l], stringbuffer);
+ }
+ return stringbuffer.toString();
+ }
+
+ private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
+ char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>
+ // 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
+ char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
+ stringbuffer.append(c0);
+ stringbuffer.append(c1);
+ }
+
+}
diff --git a/SeKeshedemo/src/main/resources/application.properties b/SeKeshedemo/src/main/resources/application.properties
new file mode 100644
index 0000000..2ce5e24
--- /dev/null
+++ b/SeKeshedemo/src/main/resources/application.properties
@@ -0,0 +1,25 @@
+
+
+file.upload-dir=D:\\uploads\\files
+# MySQL ?????
+
+#spring.datasource.url= jdbc:mysql://124.220.45.50:3306/big_event
+#spring.datasource.username= big_event
+#spring.datasource.password= 3cjBiCj3ZBafn3kP
+
+#spring.datasource.url= jdbc:mysql://127.0.0.1:3306/big_event
+#spring.datasource.username=root
+#spring.datasource.password=hsp
+
+
+spring.datasource.url= jdbc:mysql://127.0.0.1:3306/big_event1
+spring.datasource.username= root
+spring.datasource.password= hsp
+
+
+
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+server.port=8877
+spring.servlet.multipart.max-file-size=5MB
+spring.servlet.multipart.max-request-size=5MB
+
diff --git a/SeKeshedemo/src/test/java/com/example/demo/Demo4ApplicationTests.java b/SeKeshedemo/src/test/java/com/example/demo/Demo4ApplicationTests.java
new file mode 100644
index 0000000..bf176f8
--- /dev/null
+++ b/SeKeshedemo/src/test/java/com/example/demo/Demo4ApplicationTests.java
@@ -0,0 +1,13 @@
+package com.example.demo;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class Demo4ApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/SeKeshedemo/target/classes/application.properties b/SeKeshedemo/target/classes/application.properties
new file mode 100644
index 0000000..2ce5e24
--- /dev/null
+++ b/SeKeshedemo/target/classes/application.properties
@@ -0,0 +1,25 @@
+
+
+file.upload-dir=D:\\uploads\\files
+# MySQL ?????
+
+#spring.datasource.url= jdbc:mysql://124.220.45.50:3306/big_event
+#spring.datasource.username= big_event
+#spring.datasource.password= 3cjBiCj3ZBafn3kP
+
+#spring.datasource.url= jdbc:mysql://127.0.0.1:3306/big_event
+#spring.datasource.username=root
+#spring.datasource.password=hsp
+
+
+spring.datasource.url= jdbc:mysql://127.0.0.1:3306/big_event1
+spring.datasource.username= root
+spring.datasource.password= hsp
+
+
+
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+server.port=8877
+spring.servlet.multipart.max-file-size=5MB
+spring.servlet.multipart.max-request-size=5MB
+
diff --git a/SeKeshedemo/target/classes/com/example/demo/Demo4Application.class b/SeKeshedemo/target/classes/com/example/demo/Demo4Application.class
new file mode 100644
index 0000000..9b3b9e9
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/Demo4Application.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/config/MyFilter.class b/SeKeshedemo/target/classes/com/example/demo/config/MyFilter.class
new file mode 100644
index 0000000..ba54374
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/config/MyFilter.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/controller/ArticleController.class b/SeKeshedemo/target/classes/com/example/demo/controller/ArticleController.class
new file mode 100644
index 0000000..bdf58c0
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/controller/ArticleController.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/controller/BorrowController.class b/SeKeshedemo/target/classes/com/example/demo/controller/BorrowController.class
new file mode 100644
index 0000000..c47d055
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/controller/BorrowController.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/controller/BorrowRankController.class b/SeKeshedemo/target/classes/com/example/demo/controller/BorrowRankController.class
new file mode 100644
index 0000000..b7e56bb
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/controller/BorrowRankController.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/controller/UserController.class b/SeKeshedemo/target/classes/com/example/demo/controller/UserController.class
new file mode 100644
index 0000000..130026c
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/controller/UserController.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/mapper/ArticleMapper.class b/SeKeshedemo/target/classes/com/example/demo/mapper/ArticleMapper.class
new file mode 100644
index 0000000..2199b40
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/mapper/ArticleMapper.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/mapper/BorrowMapper.class b/SeKeshedemo/target/classes/com/example/demo/mapper/BorrowMapper.class
new file mode 100644
index 0000000..3afcca7
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/mapper/BorrowMapper.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/mapper/BorrowRankMapper.class b/SeKeshedemo/target/classes/com/example/demo/mapper/BorrowRankMapper.class
new file mode 100644
index 0000000..0e41720
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/mapper/BorrowRankMapper.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/mapper/UserMapper.class b/SeKeshedemo/target/classes/com/example/demo/mapper/UserMapper.class
new file mode 100644
index 0000000..ae1983d
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/mapper/UserMapper.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/pojo/Article.class b/SeKeshedemo/target/classes/com/example/demo/pojo/Article.class
new file mode 100644
index 0000000..6a1dd63
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/pojo/Article.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/pojo/ArticleRentRankDTO.class b/SeKeshedemo/target/classes/com/example/demo/pojo/ArticleRentRankDTO.class
new file mode 100644
index 0000000..736f03e
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/pojo/ArticleRentRankDTO.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/pojo/Borrow.class b/SeKeshedemo/target/classes/com/example/demo/pojo/Borrow.class
new file mode 100644
index 0000000..d893d0b
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/pojo/Borrow.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/pojo/Result.class b/SeKeshedemo/target/classes/com/example/demo/pojo/Result.class
new file mode 100644
index 0000000..74f881b
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/pojo/Result.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/pojo/User.class b/SeKeshedemo/target/classes/com/example/demo/pojo/User.class
new file mode 100644
index 0000000..ed6303e
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/pojo/User.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/pojo/info.class b/SeKeshedemo/target/classes/com/example/demo/pojo/info.class
new file mode 100644
index 0000000..663dba0
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/pojo/info.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/ArticleService.class b/SeKeshedemo/target/classes/com/example/demo/service/ArticleService.class
new file mode 100644
index 0000000..253f484
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/ArticleService.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/BorrowRankService.class b/SeKeshedemo/target/classes/com/example/demo/service/BorrowRankService.class
new file mode 100644
index 0000000..cca9ca5
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/BorrowRankService.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/BorrowService.class b/SeKeshedemo/target/classes/com/example/demo/service/BorrowService.class
new file mode 100644
index 0000000..da4698b
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/BorrowService.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/UserService.class b/SeKeshedemo/target/classes/com/example/demo/service/UserService.class
new file mode 100644
index 0000000..d0ded28
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/UserService.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/impl/ArticleServiceImpl.class b/SeKeshedemo/target/classes/com/example/demo/service/impl/ArticleServiceImpl.class
new file mode 100644
index 0000000..de68acf
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/impl/ArticleServiceImpl.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/impl/BorrowServiceImpl.class b/SeKeshedemo/target/classes/com/example/demo/service/impl/BorrowServiceImpl.class
new file mode 100644
index 0000000..7709993
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/impl/BorrowServiceImpl.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/service/impl/UserServiceImpl.class b/SeKeshedemo/target/classes/com/example/demo/service/impl/UserServiceImpl.class
new file mode 100644
index 0000000..23d6cb9
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/service/impl/UserServiceImpl.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/utils/JwtUtil.class b/SeKeshedemo/target/classes/com/example/demo/utils/JwtUtil.class
new file mode 100644
index 0000000..581445d
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/utils/JwtUtil.class differ
diff --git a/SeKeshedemo/target/classes/com/example/demo/utils/Md5Util.class b/SeKeshedemo/target/classes/com/example/demo/utils/Md5Util.class
new file mode 100644
index 0000000..1778082
Binary files /dev/null and b/SeKeshedemo/target/classes/com/example/demo/utils/Md5Util.class differ
diff --git a/article.sql b/article.sql
new file mode 100644
index 0000000..fe6d3b2
--- /dev/null
+++ b/article.sql
@@ -0,0 +1,43 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : mysql
+ Source Server Type : MySQL
+ Source Server Version : 50710 (5.7.10)
+ Source Host : 127.0.0.1:3306
+ Source Schema : big_event1
+
+ Target Server Type : MySQL
+ Target Server Version : 50710 (5.7.10)
+ File Encoding : 65001
+
+ Date: 25/07/2025 16:15:25
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for article
+-- ----------------------------
+DROP TABLE IF EXISTS `article`;
+CREATE TABLE `article` (
+ `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `title` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章标题',
+ `content` varchar(10000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文章内容',
+ `url` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文章封面',
+ `state` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '草稿' COMMENT '文章状态: 如果是被租走,就显示租的人名字',
+ `category_id` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '文章分类ID',
+ `create_user` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '创建人ID',
+ `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+ `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间',
+ `money` float NOT NULL COMMENT '租借书籍价格',
+ `number` int(11) NOT NULL COMMENT '被租数量',
+ PRIMARY KEY (`id`) USING BTREE,
+ INDEX `fk_article_category`(`category_id`) USING BTREE,
+ INDEX `fk_article_user`(`create_user`) USING BTREE,
+ CONSTRAINT `fk_article_category` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
+ CONSTRAINT `fk_article_user` FOREIGN KEY (`create_user`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
+) ENGINE = InnoDB AUTO_INCREMENT = 58 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/borrow.sql b/borrow.sql
new file mode 100644
index 0000000..7bd2237
--- /dev/null
+++ b/borrow.sql
@@ -0,0 +1,31 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : mysql
+ Source Server Type : MySQL
+ Source Server Version : 50710 (5.7.10)
+ Source Host : 127.0.0.1:3306
+ Source Schema : big_event1
+
+ Target Server Type : MySQL
+ Target Server Version : 50710 (5.7.10)
+ File Encoding : 65001
+
+ Date: 25/07/2025 16:15:36
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for borrow
+-- ----------------------------
+DROP TABLE IF EXISTS `borrow`;
+CREATE TABLE `borrow` (
+ `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `borrower` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
+ `borrow_time` datetime NULL DEFAULT NULL,
+ `return_time` datetime NULL DEFAULT NULL
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/user.sql b/user.sql
new file mode 100644
index 0000000..f040894
--- /dev/null
+++ b/user.sql
@@ -0,0 +1,38 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : mysql
+ Source Server Type : MySQL
+ Source Server Version : 50710 (5.7.10)
+ Source Host : 127.0.0.1:3306
+ Source Schema : big_event1
+
+ Target Server Type : MySQL
+ Target Server Version : 50710 (5.7.10)
+ File Encoding : 65001
+
+ Date: 25/07/2025 16:15:46
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for user
+-- ----------------------------
+DROP TABLE IF EXISTS `user`;
+CREATE TABLE `user` (
+ `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
+ `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
+ `vip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT 'VIP等级',
+ `pic` varchar(800) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '头像',
+ `create_time` datetime NOT NULL COMMENT '创建时间',
+ `update_time` datetime NOT NULL COMMENT '修改时间',
+ `admin` int(11) NOT NULL COMMENT '1是管理员,0是用户',
+ `balance` float NOT NULL COMMENT '余额',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `username`(`username`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/书籍租赁系统.pdf b/书籍租赁系统.pdf
new file mode 100644
index 0000000..ce974f1
Binary files /dev/null and b/书籍租赁系统.pdf differ