From 7ce222aa1d9bb97ff01c8ff40bfbeb9cf1c61c51 Mon Sep 17 00:00:00 2001 From: 19972076849 <3504229115@qq.com> Date: Mon, 1 Sep 2025 09:46:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9C=80=E7=BB=88=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SeKeshedemo(后端)/.idea/.gitignore | 8 + src/SeKeshedemo(后端)/.idea/compiler.xml | 19 + src/SeKeshedemo(后端)/.idea/encodings.xml | 6 + .../.idea/jarRepositories.xml | 20 + src/SeKeshedemo(后端)/.idea/misc.xml | 14 + src/SeKeshedemo(后端)/.idea/uiDesigner.xml | 124 + .../.mvn/wrapper/maven-wrapper.properties | 19 + src/SeKeshedemo(后端)/pom.xml | 109 + .../com/example/demo/Demo4Application.java | 13 + .../com/example/demo/config/MyFilter.java | 64 + .../demo/controller/ArticleController.java | 58 + .../demo/controller/BorrowController.java | 68 + .../demo/controller/BorrowRankController.java | 33 + .../demo/controller/UserController.java | 131 + .../example/demo/mapper/ArticleMapper.java | 42 + .../com/example/demo/mapper/BorrowMapper.java | 62 + .../example/demo/mapper/BorrowRankMapper.java | 44 + .../com/example/demo/mapper/UserMapper.java | 63 + .../java/com/example/demo/pojo/Article.java | 15 + .../example/demo/pojo/ArticleRentRankDTO.java | 11 + .../java/com/example/demo/pojo/Borrow.java | 13 + .../java/com/example/demo/pojo/Result.java | 31 + .../main/java/com/example/demo/pojo/User.java | 17 + .../main/java/com/example/demo/pojo/info.java | 9 + .../example/demo/service/ArticleService.java | 18 + .../demo/service/BorrowRankService.java | 28 + .../example/demo/service/BorrowService.java | 14 + .../com/example/demo/service/UserService.java | 20 + .../demo/service/impl/ArticleServiceImpl.java | 47 + .../demo/service/impl/BorrowServiceImpl.java | 35 + .../demo/service/impl/UserServiceImpl.java | 58 + .../java/com/example/demo/utils/JwtUtil.java | 30 + .../java/com/example/demo/utils/Md5Util.java | 73 + .../src/main/resources/application.properties | 25 + .../example/demo/Demo4ApplicationTests.java | 13 + .../target/classes/application.properties | 25 + .../com/example/demo/Demo4Application.class | Bin 0 -> 736 bytes .../com/example/demo/config/MyFilter.class | Bin 0 -> 3307 bytes .../demo/controller/ArticleController.class | Bin 0 -> 4040 bytes .../demo/controller/BorrowController.class | Bin 0 -> 3043 bytes .../controller/BorrowRankController.class | Bin 0 -> 1173 bytes .../demo/controller/UserController.class | Bin 0 -> 6886 bytes .../example/demo/mapper/ArticleMapper.class | Bin 0 -> 1553 bytes .../example/demo/mapper/BorrowMapper.class | Bin 0 -> 1756 bytes .../demo/mapper/BorrowRankMapper.class | Bin 0 -> 1142 bytes .../com/example/demo/mapper/UserMapper.class | Bin 0 -> 2260 bytes .../com/example/demo/pojo/Article.class | Bin 0 -> 4117 bytes .../demo/pojo/ArticleRentRankDTO.class | Bin 0 -> 3393 bytes .../com/example/demo/pojo/Borrow.class | Bin 0 -> 3499 bytes .../com/example/demo/pojo/Result.class | Bin 0 -> 4241 bytes .../classes/com/example/demo/pojo/User.class | Bin 0 -> 5784 bytes .../classes/com/example/demo/pojo/info.class | Bin 0 -> 2323 bytes .../example/demo/service/ArticleService.class | Bin 0 -> 700 bytes .../demo/service/BorrowRankService.class | Bin 0 -> 942 bytes .../example/demo/service/BorrowService.class | Bin 0 -> 247 bytes .../example/demo/service/UserService.class | Bin 0 -> 622 bytes .../service/impl/ArticleServiceImpl.class | Bin 0 -> 2292 bytes .../demo/service/impl/BorrowServiceImpl.class | Bin 0 -> 1223 bytes .../demo/service/impl/UserServiceImpl.class | Bin 0 -> 1917 bytes .../com/example/demo/utils/JwtUtil.class | Bin 0 -> 2193 bytes .../com/example/demo/utils/Md5Util.class | Bin 0 -> 2953 bytes src/library_system(前端)/.gitignore | 24 + .../.vscode/extensions.json | 3 + src/library_system(前端)/README.md | 5 + src/library_system(前端)/index.html | 13 + src/library_system(前端)/package-lock.json | 2498 +++++++++++++++++ src/library_system(前端)/package.json | 26 + src/library_system(前端)/public/vite.svg | 1 + src/library_system(前端)/src/App.vue | 71 + .../src/assets/style.css | 62 + src/library_system(前端)/src/assets/vue.svg | 1 + .../src/components/BookCard.vue | 88 + .../src/components/HeaderBar.vue | 249 ++ src/library_system(前端)/src/main.js | 25 + .../src/router/index.js | 131 + src/library_system(前端)/src/store/index.js | 370 +++ src/library_system(前端)/src/utils/date.js | 16 + .../src/utils/request.js | 73 + .../src/utils/storage.js | 43 + .../src/views/Admin/AllBorrowRecords.vue | 148 + .../src/views/Admin/BookManagement.vue | 188 ++ .../src/views/Auth/Login.vue | 133 + .../src/views/Auth/Register.vue | 156 + .../src/views/Books/AddBook.vue | 141 + .../src/views/Books/BookDetail.vue | 186 ++ .../src/views/Books/BookList.vue | 202 ++ .../src/views/Books/EditBook.vue | 3 + .../src/views/Borrow/BorrowBook.vue | 142 + .../src/views/Borrow/ReturnBook.vue | 155 + src/library_system(前端)/src/views/Home.vue | 164 ++ .../src/views/Ranking/MonthlyRank.vue | 114 + .../src/views/Ranking/WeeklyRank.vue | 113 + .../src/views/User/BorrowRecords.vue | 96 + .../src/views/User/Profile.vue | 122 + .../src/views/User/Recharge.vue | 135 + src/library_system(前端)/vite.config.js | 13 + src/library_system(前端)/文档.md | 170 ++ 97 files changed, 7459 insertions(+) create mode 100644 src/SeKeshedemo(后端)/.idea/.gitignore create mode 100644 src/SeKeshedemo(后端)/.idea/compiler.xml create mode 100644 src/SeKeshedemo(后端)/.idea/encodings.xml create mode 100644 src/SeKeshedemo(后端)/.idea/jarRepositories.xml create mode 100644 src/SeKeshedemo(后端)/.idea/misc.xml create mode 100644 src/SeKeshedemo(后端)/.idea/uiDesigner.xml create mode 100644 src/SeKeshedemo(后端)/.mvn/wrapper/maven-wrapper.properties create mode 100644 src/SeKeshedemo(后端)/pom.xml create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/Demo4Application.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/config/MyFilter.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/ArticleController.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/BorrowController.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/BorrowRankController.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/UserController.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/ArticleMapper.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/BorrowMapper.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/BorrowRankMapper.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/UserMapper.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Article.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/ArticleRentRankDTO.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Borrow.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Result.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/User.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/info.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/ArticleService.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/BorrowRankService.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/BorrowService.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/UserService.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/ArticleServiceImpl.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/BorrowServiceImpl.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/UserServiceImpl.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/utils/JwtUtil.java create mode 100644 src/SeKeshedemo(后端)/src/main/java/com/example/demo/utils/Md5Util.java create mode 100644 src/SeKeshedemo(后端)/src/main/resources/application.properties create mode 100644 src/SeKeshedemo(后端)/src/test/java/com/example/demo/Demo4ApplicationTests.java create mode 100644 src/SeKeshedemo(后端)/target/classes/application.properties create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/Demo4Application.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/config/MyFilter.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/ArticleController.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/BorrowController.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/BorrowRankController.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/UserController.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/ArticleMapper.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/BorrowMapper.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/BorrowRankMapper.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/UserMapper.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Article.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/ArticleRentRankDTO.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Borrow.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Result.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/User.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/info.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/ArticleService.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/BorrowRankService.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/BorrowService.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/UserService.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/impl/ArticleServiceImpl.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/impl/BorrowServiceImpl.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/service/impl/UserServiceImpl.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/utils/JwtUtil.class create mode 100644 src/SeKeshedemo(后端)/target/classes/com/example/demo/utils/Md5Util.class create mode 100644 src/library_system(前端)/.gitignore create mode 100644 src/library_system(前端)/.vscode/extensions.json create mode 100644 src/library_system(前端)/README.md create mode 100644 src/library_system(前端)/index.html create mode 100644 src/library_system(前端)/package-lock.json create mode 100644 src/library_system(前端)/package.json create mode 100644 src/library_system(前端)/public/vite.svg create mode 100644 src/library_system(前端)/src/App.vue create mode 100644 src/library_system(前端)/src/assets/style.css create mode 100644 src/library_system(前端)/src/assets/vue.svg create mode 100644 src/library_system(前端)/src/components/BookCard.vue create mode 100644 src/library_system(前端)/src/components/HeaderBar.vue create mode 100644 src/library_system(前端)/src/main.js create mode 100644 src/library_system(前端)/src/router/index.js create mode 100644 src/library_system(前端)/src/store/index.js create mode 100644 src/library_system(前端)/src/utils/date.js create mode 100644 src/library_system(前端)/src/utils/request.js create mode 100644 src/library_system(前端)/src/utils/storage.js create mode 100644 src/library_system(前端)/src/views/Admin/AllBorrowRecords.vue create mode 100644 src/library_system(前端)/src/views/Admin/BookManagement.vue create mode 100644 src/library_system(前端)/src/views/Auth/Login.vue create mode 100644 src/library_system(前端)/src/views/Auth/Register.vue create mode 100644 src/library_system(前端)/src/views/Books/AddBook.vue create mode 100644 src/library_system(前端)/src/views/Books/BookDetail.vue create mode 100644 src/library_system(前端)/src/views/Books/BookList.vue create mode 100644 src/library_system(前端)/src/views/Books/EditBook.vue create mode 100644 src/library_system(前端)/src/views/Borrow/BorrowBook.vue create mode 100644 src/library_system(前端)/src/views/Borrow/ReturnBook.vue create mode 100644 src/library_system(前端)/src/views/Home.vue create mode 100644 src/library_system(前端)/src/views/Ranking/MonthlyRank.vue create mode 100644 src/library_system(前端)/src/views/Ranking/WeeklyRank.vue create mode 100644 src/library_system(前端)/src/views/User/BorrowRecords.vue create mode 100644 src/library_system(前端)/src/views/User/Profile.vue create mode 100644 src/library_system(前端)/src/views/User/Recharge.vue create mode 100644 src/library_system(前端)/vite.config.js create mode 100644 src/library_system(前端)/文档.md diff --git a/src/SeKeshedemo(后端)/.idea/.gitignore b/src/SeKeshedemo(后端)/.idea/.gitignore new file mode 100644 index 0000000..463c03e --- /dev/null +++ b/src/SeKeshedemo(后端)/.idea/.gitignore @@ -0,0 +1,8 @@ +# ĬϺԵļ +/shelf/ +/workspace.xml +# ڱ༭ HTTP ͻ +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/src/SeKeshedemo(后端)/.idea/compiler.xml b/src/SeKeshedemo(后端)/.idea/compiler.xml new file mode 100644 index 0000000..bfc71e1 --- /dev/null +++ b/src/SeKeshedemo(后端)/.idea/compiler.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SeKeshedemo(后端)/.idea/encodings.xml b/src/SeKeshedemo(后端)/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/src/SeKeshedemo(后端)/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/SeKeshedemo(后端)/.idea/jarRepositories.xml b/src/SeKeshedemo(后端)/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/src/SeKeshedemo(后端)/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/SeKeshedemo(后端)/.idea/misc.xml b/src/SeKeshedemo(后端)/.idea/misc.xml new file mode 100644 index 0000000..88aa9a7 --- /dev/null +++ b/src/SeKeshedemo(后端)/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/SeKeshedemo(后端)/.idea/uiDesigner.xml b/src/SeKeshedemo(后端)/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/src/SeKeshedemo(后端)/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SeKeshedemo(后端)/.mvn/wrapper/maven-wrapper.properties b/src/SeKeshedemo(后端)/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..12fbe1e --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/pom.xml b/src/SeKeshedemo(后端)/pom.xml new file mode 100644 index 0000000..1c6089d --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/Demo4Application.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/Demo4Application.java new file mode 100644 index 0000000..0344102 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/config/MyFilter.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/config/MyFilter.java new file mode 100644 index 0000000..05a6e96 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/ArticleController.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/ArticleController.java new file mode 100644 index 0000000..a5b6da0 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/BorrowController.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/BorrowController.java new file mode 100644 index 0000000..bd6f248 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/BorrowRankController.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/BorrowRankController.java new file mode 100644 index 0000000..7b522bb --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/UserController.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/controller/UserController.java new file mode 100644 index 0000000..8d35b18 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/ArticleMapper.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/ArticleMapper.java new file mode 100644 index 0000000..134d6b1 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/BorrowMapper.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/BorrowMapper.java new file mode 100644 index 0000000..8560fec --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/BorrowRankMapper.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/BorrowRankMapper.java new file mode 100644 index 0000000..4e824eb --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/UserMapper.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/mapper/UserMapper.java new file mode 100644 index 0000000..9686fb8 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Article.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Article.java new file mode 100644 index 0000000..e39fcc3 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/ArticleRentRankDTO.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/ArticleRentRankDTO.java new file mode 100644 index 0000000..f40c651 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Borrow.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Borrow.java new file mode 100644 index 0000000..9db0a1d --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Result.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/Result.java new file mode 100644 index 0000000..9605aec --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/User.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/User.java new file mode 100644 index 0000000..820ce38 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/info.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/pojo/info.java new file mode 100644 index 0000000..8aa8d91 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/ArticleService.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/ArticleService.java new file mode 100644 index 0000000..32723d7 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/BorrowRankService.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/BorrowRankService.java new file mode 100644 index 0000000..6bce2d3 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/BorrowService.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/BorrowService.java new file mode 100644 index 0000000..2189cd0 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/UserService.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/UserService.java new file mode 100644 index 0000000..1443d55 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/ArticleServiceImpl.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..420d740 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/BorrowServiceImpl.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/BorrowServiceImpl.java new file mode 100644 index 0000000..38f3618 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/UserServiceImpl.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..3d3dd30 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/utils/JwtUtil.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/utils/JwtUtil.java new file mode 100644 index 0000000..425b01a --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/java/com/example/demo/utils/Md5Util.java b/src/SeKeshedemo(后端)/src/main/java/com/example/demo/utils/Md5Util.java new file mode 100644 index 0000000..002c882 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/main/resources/application.properties b/src/SeKeshedemo(后端)/src/main/resources/application.properties new file mode 100644 index 0000000..2ce5e24 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/src/test/java/com/example/demo/Demo4ApplicationTests.java b/src/SeKeshedemo(后端)/src/test/java/com/example/demo/Demo4ApplicationTests.java new file mode 100644 index 0000000..bf176f8 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/target/classes/application.properties b/src/SeKeshedemo(后端)/target/classes/application.properties new file mode 100644 index 0000000..2ce5e24 --- /dev/null +++ b/src/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/src/SeKeshedemo(后端)/target/classes/com/example/demo/Demo4Application.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/Demo4Application.class new file mode 100644 index 0000000000000000000000000000000000000000..9b3b9e9f60a5cf0f18d73c4ee286ad17390d3e26 GIT binary patch literal 736 zcmah{OHbQC5dJnKIE1u7coh0LATA*X_JX(skZ7u&+)_1Fdgy8GY|Mha8?D#C-{J(~ zzz^U@A!c19tSVA1c}Da4X7-zTe7b)CaD-1S)G!yI-bMrS49n-@Qt(vhgr7#|GIk8} zhe|7V%rMv89R+AIY{w?!@>*omRPwRR4F5u6|71E%RVN+q?ig=UDl;p-@aROEU8PsKBI9<09`&O(ljcJkWsfzcC{ z6jns3th6Av5BC}B12dKkOQF*8dyz%b{_?pDozTQ09SN(v{o<^!&Ir>MzDajx#y^B7%SlU#t)VGwEWav0-ul0M?|H5mwtg1csZ5Sk zuKb&|Hm=+U0UXbys$7C7oFUFiuH?%~KGSw8ob|DdfKJ7KH86iHB$vqIq#5Z(?-uN) z3@?-PVNl5m$@bp_bg)X+0@kojAinsZ1Ou9#pm&Fb->>!lEYnX8-#Pc@=ik5k z0l*G?oJ9gj4NW>yNDEw8GLM*sZ8}Bcz<5dK1A+8*%dvu;0?E#<(Pm`OtRbtT1^SZh zBQt&=%iQHwskCA!G-SEPLCP;oEftGAd3}9 zHlq!fXjr3TEiM&UpLffKoHol9TN(vfc8$F2Ojt#u7A*bA>AYPnNTwgT3#}@HOz<*+ z7NhD*&#>L1<+Pw38#G+5V)W2OIs8~qm8t*EmU)des^9Qx1wJp!9dQxFd6*oXZBSwc7>ecy8FXk&=q zQuB+77VaW>4l*Rg9mg!o77SxV!yP*A#3*@LA6>n=fKHDC0ihkQ1|(<4*_vTd6=R-h zxQjihSU+JZhE11kqh#i%eAh7wW?+t6P9dHJ`^-v3dRdGi*@8~oqvKxuTcDYK$2^O= z0;_67sdawzfw>*##$Vq4Omp1Yu=80cy-`96QA<*8~O;Nam z;V@;ZkgieM(Tc!2hPt#tmT0h{_DttxC15}K8Xh}KN5uWQu#F>UpA075!a>txLy@1% z!fcG}pZ58=0#!35%q(3F8%1DC2-)B4E26iIy{`s(JbIa9gRi<^S;PgMXbchjb1TJ@ zif2>|el!O!ZP19Z4^!e$^5O$Upu1t~qCpe~zu-mlqBBH59Un`p+o%?eSr$6h3QwLK z6>B$=xEDD{!n1Y4Hj4t{ZXQ=70Vfv6Q^;5iZ`96vPNBUA77;=#@SyYD89Etpt6p9* zPtv}%cDVN{X98`*RVT2@a@6uI_Q8PTxPcimPXXY1MZ;Hjj^c#k)lt`*GSuXhZZK1k z#-Ll~;VYeh1?^}^+gz|^jLGo`W^PO!QDcdBi|DxTW+xeDg+q%A727p=NzjaOmvita z(^sDi&vd5H&f7}@0zUsk-C+2xQcB zM;q`U9^x;7hw&dIL*)wJ39fDa5?Zcx4i|Kv#)?DVVAa=H-Tf6-=hn?*eF9^l+!4ut z`dG;@fYrP@w(%Z!2`V_DK);FCL-qWBjHPcodIQN(nBjkoMwA4)xxc7#$p zrCp)4iqb$RwNe_SGz)!8&*pjTN#YA-`!k!dx^{}mh<~l1f3Wy zz&nSh@eFZPYtQ1j5d1kD$McLPjnDA{UL@=~KEX@0oMJQ|;AOnRZ^!88RlEibC#by& z>ECf!L#Kvr4O=tIZxp}bBC$5CTbgEHk1N-jq({&f=tWiV&5&}6k=wXUMbfN5c_0QQ z5rU%rDgkyf_+4Q_5i^_PG!jfsQT!y{;(HyXxA}gD#@@XLDIf3oc;CkdK0fsE(H~Ge Bf-C?4 literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/ArticleController.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/ArticleController.class new file mode 100644 index 0000000000000000000000000000000000000000..bdf58c0116d6960dc94aa942557f73ea0a1faca2 GIT binary patch literal 4040 zcmcInX>%0E8Gd>t7_kf>i&!>bK*87+0(*=NiGwgiQozVrfuaSGgj}uN)@r2L>Ge#n zKsgieI`Z;LY*d|8x=E({ONk&~d()90nzD(MtdAD48+#n|ySNVn>$wfdY68x(44Uf7 zyuhQwsfe5{qsMYf6iJTJ0lM)K7x!aO;DNeaQWH9?NORpc3mnBph96m zpM(7_4&WhyyiyRs@R8SVdE^(NK}V(NYI@J=yZEwW&t?a8#hrvW2p)cH&Vy=3v;x zF^mWdEy^Vs8R>C*IZ(!1Fs9*M;$KmIDy9q|NO)7w7RwI>WHqbFY=>jFhn($Ap7VxwwFf0*`fg(VdUrkkx9YR^a4tr^3Yj3{~sOrKDLb zMO?z9gXdj*8YO{;I`k&&Gb(NdtYIf^Rw@LEz*G4&W%=*oZH}9uyvzdm*V`}s`>ogh zap#qP{{Ef6zj!30)3r^Rw>=Xz0|%Wh*w=)!>qurSOsiW?a&Mi zXZda#Kk!O^Y)JlDe9pn=UEIJI81oJ4A}N#^^+Hp{48tzMD4SfHVbu1wWG9^|wROBX zKc4{VL43(Jk1yZV99l7(wV9VL=1^h#OO4i{YTNyEKG2(lp_OHUeKXC__;oew$NpTP z#==k=X;|A#-7_T})x6mDtlE6UqPwZ1C2vm2F!ttU#pr0olWhiXtZDR3KT_3Ef!+yS zC9L<9{7_wP*5_1oRZ_gbKuK3*Fe@Y9&a=f{v*1&o*O|19`W@BC&0x%?zi|sA&^JOd zbvW$^AHE0aS~Q)w)fkU#u9*myX^Rn)gi6`S$`YG*7L($ITNTwvGU1>}lv^|BB@fEz zRz2_*NgV5t2STL0=Q)~=v@JNMs?A84OewRVtJBhEkDLthj?>8>cdsph;ncKkfRrgd!W>1NMv1}{182{n(6jfcp3Ah%s!hv=>A%Bpr;S68TO z($>~Jft0WLE#N6?bqCvLwkDK^NrpmZu%B$aXsxv;fx-1vwbE!+*2%kQw~~-kTTaMx zDwhw3*96;039)u_VwQ|=(z;(eA+zQrQ2r1tEA8A{vA>uZ!sf_RudJIn-Bl*1$r|#B_=Zm$jB9OT6Ujze z<#8W=#*62SswjV1RfjUfoEZ{(w&NE?{1R_Ec+1{*f5qG3S~~o2SuZIs%?f?v75HM> z-38vvXDA~~wOx{7HBj-EwvoR;{E>qKYW%m`zyKEb@1_LsvB;U=y>5y7miZ6pK`-AI z{siav9qjr5dx7`yz{sC*@WjBwt9YaUF0bNvfy*b~$H&hd?0pw|x&Q3(Rg4vIoovs& zH!yVvSKgzbo<#Y6iU$s24}BZKVcIx^GxX#%GA;M>`5+0~vsudz&ALs?q9<< zDc8Cmlc|UA1J<8alm(`2AXaf*(A_Vdu&!}Cb!vA)I)WmOW02n$HnKx0d)tu%_!eHI ziXy)uzm3}z{}QQe{L_{1aK)OwO^^_6bH7W1)ZFiJ^nJ|GOKaauW?z36@2?av)iNqg zv;9H_PVs~Hbk3muwn6=P89$)RokWa{aa;Y%WJ{y=!!Bn0hz9(a6a~DJ><-e;pK$&v fpV!*PzK%CI@8kUEe13{wb5`W&H~1~y#lHUm3!s;$ literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/BorrowController.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/BorrowController.class new file mode 100644 index 0000000000000000000000000000000000000000..c47d055d736ae35dc54a867a6c8c61c971be8186 GIT binary patch literal 3043 zcma)8$yOUj6ul)0nxXMPVuw;|tWDvTVygBM@&-PH3nT*pYGahP-R$=W^1>%DiLD zIWvwi;JB`{&;Si_^=Q$IQ>o-c9X8Uc;7Qju^Rf|} z(X8P)9nWKnz@8a%)^vT-;PQM<`o^^H&lwl^7?Yl7Iktd4CH;P%-qHo1AZ^t^%5cNH zQW{!Ur5lE$0^h1*n+m*0HAus^^3oV~GG^|)>C17BNRsU= z2yAaphKQ9WDFv}l$9^0T*ieGFr7THp6nvF^$%%Tj;gE)Q9Z7TubX6Qf#<6|Z$>pRQ z9mZg3f>@-{%H-r2iL^4rN)A^zP$YBB=wD@;YD5>hHT38(a9H5bGwvh5p3G51jx8f_ zfumKAr@~{Ps3;6l){CPWj_Ej#69PNewWgLRh!J8g2AUmGwDswD2`71`N@gVn+SX>^ z`idRXKZVm8&geLca{>n{;ES}CZ4#)TwCrp?3}cn>BLOCZzy@>-;=DjpI;fsfXzgo< z7HTrGWN<@xMZ*Oh7jcQ|Uo*H>+gR2ipupZLP-XSZ0#*4B>lndhZp+GSLA8aJ_Myt6 zN=`K3Dz0f5)iH+gHCx4~^a?pT(Y!(?!#Wn|Etf@+p-K*dz{1_BI!p*`eEi$De}Dho z<40frwe;gZzur^$uj{yhHw0=V8cAQzIvb2s2vg}A9w`!6`LuM$O}ZCo4*K4N=~`+WO(y(li+DYi+^*A^h|&=9 zrDzlwFIPfzT2$Klw?L{&Gb`5$#o&i`P;;4TBkxLw#mi*h)1d@*RVG+oG4xkzce~dx zEw(lW7WD`*#C>U#cdu&BO=G^9nWZu!YB!BYf7;1jHP!j~(k0Eus~+ouOdDx-p7ImD z>Uh2qnYwQYIB(_(glII%X>T-Ew9FG3a|&)o4q3sqJrMM!mCK|@U4Luos#*Z7Sbt?Z zV|e!12VKYWuDI5eWpiJ3DOZQQQy}U}+FFz@_OeoA{P&aKlf4%LGaS|OJ(zueuqgof^}<_*i(6vH2AS;7n5kFb3Sdpmx@!OmrL#&9yRHL-*veKnkV zv1q%DR1AH!t+lN+-`vMRF7DOpfkUW6 zJDT{{V+Xm|k51;-g%jxJz0-qh9NolWCUpcJjs?kG2os2sV=7$ngM=4Rz&x3*W5O4) zKpX>?aF-SddK|<%c$Yk0q`&w0Rg3qDzYXF)I?yzD(D!& zac&^chx~nX6T-tie%&r|i~9sj&@T0KZf{0xy&bS+E`xOwaK!DgfSp}ImZzA@X|i*M z?3^V#=g3Pxa~TMj=m_CTOr%Ooq)JR2jhJ|9E*}&4lK}qHAk!9R^BKpV^Y=w5<1haQ DL{&KE literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/BorrowRankController.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/controller/BorrowRankController.class new file mode 100644 index 0000000000000000000000000000000000000000..b7e56bbc460269124cfd3f28df1cdf42147c4067 GIT binary patch literal 1173 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 literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/ArticleMapper.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/ArticleMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..2199b40f6099351ae89bdb437b434f0a96b11a06 GIT binary patch literal 1553 zcma)+TT|0O6vxk^P$+_eq9R@v%cW&H%{V+_ohcBs8d9byIHM1`ZI%*9vYpKa>@fXe zKKST^AIkA0O)m&D<)KZo`#bml?w`Lue*r)daw!-iu-Xuw#(yxc<#NsDp3pqjYH_KR zq;eWA-;cjiaF@V?Q+CcYm-$VtQa|MlMIg;=n{`0~Z?eWUXDx9mdakx|#=wIi{N@(= z+~?{<*au89k1H+%0;#^k#cJp)$Kyv%;M84S@_nJ0a)gi6njvIUV=dM=;hIy&>nahNX-x2QQGnX;m$q`r|kyE7=Cm)p^2K+tuxx_&BC*BV3;7AC8sWaZ* z5pL-D1jZbjz%(u#NPz=UZ2~g^cd_sN2F+)amWIl4HNy#_f~PE}=`$5dEPC@A@OH$E z-l2z4y|v;j5L~cyL*J><4Z2sY?Dx8gdD=)QUg{}hHT(bMhow-)-Z#0tMd01oErKh% z7`Uci2}?hJ(5pIiY+A%QId%uz-0hd}dB0_w!>L$GIw-^3h@PN`VgV4?=ofq}h1V;X zUYu~rY0MORVj-|}?D+P!kWyT5e2TMRyM2hN^ik?q!i|Z<2V{7flch>jq@I9_z)FacwbioOU;;$sSb%ea(AZ2BvZ0PevI8q9uy`zSJ)gL(Wz z%ZKm?u?57(;Bjm=izZL{W>1k>gl7ZqbBXr|Tk2!a5qkkI2iU72Y~YO|whXT^ktEj) YV%^{?Hw0fre`|4S>+$Xc#>)cy1F12%l>h($ literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/BorrowMapper.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/BorrowMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..3afcca74b43f0bd18225b7fa47632490239c11ca GIT binary patch literal 1756 zcmb7ETTc@~6h4Erm5K@oDB@)h#4TbM@v%ZuU>j@7mULS*@qx^?Ls{HQGu;IZ;cxh3 zeDKi+f0Xg;>~32_1#GhE%$#q|H z4j1Z{CxmypD>oS!B`|T!PMB&lx2;yqW8U-$jGGc9c+(Rt0t-szg13%$?8UwcxqbAq z%l#v-wZ{Z=xX(qGKsxe5V6GOpzUAV)8=~Mm|PH;Q7V0s3}0AoTNa&??yfGP z(P=TCV-XvTy`5rRqb%}I4XsXH8H8>mi6^7|4*ASrmMv!61g4Z+)T6++ zY_(!_L(PmCR@-IB7*?`=0r2*6Rd1q$tJG<58wUn~(_OiuEA&u!PFz=7o?{jzSYa?zAz7Iq5kt!c#P`d`~ zUp&S`R0xUu8B2iWSE%fKG64)#qH8t!zKUvz$JwM+ow9r)e=}YU0K+nA5W>uSGRP># zAfMD9Ptd?YI7W%}oEG(+-c>mnv}{nlTBmxWQi-htb0e*2A&@n^Ks0&DvazX?5xvo4 znh(jlS~3y1kS2iBg%37B1|Q)Rq+tXyxJzN%@ox;jI|#|*ck2_7E{r4WHlFohcL!h- zJ=i3|rmpsO4`I_VgV&NseHXK6yAKaA(j0~ufrmZJd@sx+#5{&4{cN5NWYdRHge|}` ctTe7IghgH#hj?8=f6ryiWob=gycYm}07Vq$w*UYD literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/BorrowRankMapper.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/BorrowRankMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..0e4172097fc7f0b4e975661014ecb6f577e5badb GIT binary patch literal 1142 zcmd5+!EVz)5S=YFp#{=Xi37K}lsZzHZB880L~>$>2J9HwPNN8+Y8_Uo)3rBp>_UHy z10TRgA=XZ+RH;M}TsW+DJ@e+x?9)E~`1$QS0JPws3|j=WiHs=!%A&d8^fQknjo5t7 z6WWnUBEPsSzOsuz86FeZpRsF31&gQD31)nf5~zr9k&ZaO5;r-Rz=2k^3Rsqgf?6uu zB(UR!)0m}M!U?qR0Zy%ZQ_ST|Qawq-iQq1e)12Gzon~8+y>hcS4I_RYF2X=?J&t9{ z(on_=0%(N_}VI6McuVc5v z|D<@&ac$jS3tPjZ!}0N9bbQh{`V)PBTYpE*2HMWRKda)u>bdL5ESd0LD3q06Zo0Id zJMUo^EG^wE5g_nL{S5%Nl)JZ~1Y1zfzu*b%sJ)`{yJ|iC2xI}z6z2H@n2M_1D;V|* KhLWm&0q_en{z6Ou literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/UserMapper.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/mapper/UserMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..ae1983dbc9c7af51e9de55b40293b9ea5ac8815f GIT binary patch literal 2260 zcmb7FU2hXd6up~Zo0t|TCD72X0k?@A?5v#x2`RWzir2!D6QVc?4?NW4-HEfoyJPLH zlcHdWN`0x+^3=XmMTkFuDpf*NY2lsUk%asT#GTpoN0V4Kmc~0fd+xdSo;!2r_1k}5 z0zej~BQT`E6`flu`<`0$8dD8san+*rI&;)jmpKb^8i5lEoZX~bRIO3Fs@|?_GTl?) z^tx#q-`*F%MQSkx((z&kRq`CuuFfTjM;z4oCYSVcNV~wi4Q?z^2N^u(xC)$XAfYV@ z$CewmXIgB{bj?bQ&D%EjsAqB;VdF*aR8?B1`UX?Y3NE`U?Eusgt6`MrBD6(o4U8`3 z$`vw6)*WsU;e~8(Fo(&haF~tlw0t)e7^a4yz~nJG9nG>($S2k?^g4CjZSJ7m@RnIe z-_)>7TY*T0qI5b&(J$LTdn6}4dgz;8v$(ENS`bg>yqaOQC$dqiSU}+{WqZ+S@jK+`AC2>?31!hZH zQMtZp67o#1HbC3UNiIx1p2K#5Cq;G%>UgGJV`8geqmWeCqvaDD zbhN}9j?VI?aByZ7cdCD1O^HjW|Kaq(b72LrTjPxg5XE~g1YsD02)>1|pW|Z$$7zH_ zah$pfiVGhg>_c4hVWS}lJA<&ZI6lI04oA!E=PL42fKu@PvNrw zHZlaCqtotqzi2!D5}^bx_hY<*uvj;vNaJ|MuMqk*jQ3-lKv=w+v3HCKgigZM4r8)Q W!&Ez!DFmqaWeCzz;V^#50K5a)9BUZ> literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Article.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Article.class new file mode 100644 index 0000000000000000000000000000000000000000..6a1dd63ed3eab820ae808e536dc95ab0f5094dcb GIT binary patch literal 4117 zcmbVPYjYdb8GeqmH_7Y7F}WZTLI|dn?F6-?O&d7|CrU&_Z4+V>T469-p)8D{PDVOKnUCENH#-7etKJV>3=e?cx zNdNiz(|-Y&#p_w5kT#*&&|xTyU30EGg}UQkEj+by&8>zC#!1ij!p9WS`N@kJSjd>j z+8BYYaDO#u6xV8@F+fn3>hU4_!YL*&Z8vMV4M~)rG&;MlOPChfe56Acs*Y($5=nG z@k2QyL#)NFn?JJgW1NUjSdR0xJ3rauXOc0g-i(ct5|ZIcJZ*9CF&mG|_AEh5aUMl{ z%EoCC8x%j&s*C81jkBGDmL!`J#1l5op`x(kiuk=8RQ&L?7q%6&eB^ZsKd~_{UR$e9 zd$knQ+;Mi(qK&6;USVIuS#x=8)d`>VLaKe%$(Q|?@|Ddo{C|>iWk@>cp*X|b&wIWb zr*qj^iQ6rxI`xZA%M(5kYT>F!w;q_kYa7of?7y(?hhD?2_}9I*M}SklA23}WW0O{{ z2aT0rt?-2FyDcWM#w~g~ZW=9LnY_r0wcv)ULG8TLavE;vwz$orMN-_p9!zR0yRtM% z3dpjNVcFu1QL$n&X+bFtw`6D)N6u>y^xw0jyXjmIuDUJaO9Cd68#xjQJDeS~dZ zCL&m4A_1|&AWjc`UkcV+Rk!R(dF^E6JR+Bl**+ZvVLNO&%{c9C3oj|0NsRJdZB`vQ z6ooBBa+;7lO_u01A)Fo*{QJ z(LT#n$!y;Q^f#Eds7zr4$l4N!qk0I?=qCd}nJs}hw1)ug8U)I23B)l!1Zejl(8!iR zd>n=V?HdHLw*=yYIRxmwj|Xxzx+M@_%OOAq2dlPYOQ4_PXGlkVR3xDEr7^YtHq7CT zv^Ta$8cCW=I#}U3?$bHy*slHE^*nyQ34Z!EMz;$u7o!U=Oh5cDhQsgLF1*~gF1#@P z@V^`mzk9pza*ez2!t}#m8VzKd=dYWq9Wt z+%CM#vM&6gP4N6S7kjV%!loNxgMB$Y^=IhXt?AETy$?NoYx>`?7LH8a!GjS?;^8Cw zd?-3HlVm3Ufurvw{4w&!I?CgVlBoGv!T z=NP|<(VU($dW`0ZCXMEbR?ZY7D={*2R*zAsn4wXrn9XIxD4Q5%a@mfNCKor|Gj8L# z-HhYzUbin%MU6?@gD>E6mZz|Yw{V5BG;Q9%RZ<#Wz#3Lb>G&0`JW>YUK^fObnfL&6 z)Yte3{gY2oom2*&VLuwAvheB035=W8f3d@aW$(1V!d|{q{Ik?oxHl#<|AXwzf$Bgt zHTk)b^x_HnFJnfRG7iqGIP7@J=-se&h9O}mQ^p-YSMn{Km{0RLyUEog`rBhOC$-rF zV>7GL6_+~{+o9ZLj$NLm^7x`yu??)T>60%`;@7`;OpD_Rp)S$(cXcW#&zPR acqv}wYVnj`^K%2QlFO3%J^qN-koy*N?7mt6 literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/ArticleRentRankDTO.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/ArticleRentRankDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..736f03e287ee5db34b79c83941c581ba94cae603 GIT binary patch literal 3393 zcma)8-E$LF6#w01zmjfkDQzKw2omf^TH+Td2}Pi^P;CL*QWQ|xrk8fx&2HRm8JY3f z@yQvVbe!>3W*i=rQJmqy(HETYZxZp`y*KGLiMBJ@z31NhJHLCr?%DkH&*R?!Okh2W z6w)R%8#)Yz-gW1$Q}i5vwRmNDomV0Tt` zYaTDI@M=)31?xfaTo}0(kI!>Ins@w-3yW76^vI1o&d@izb;Lpxy8dcekUnRlM=+*0 zLr={2*yzJvQmY0&zsImAp*HOWP84em*cik7(SnZsQG{VAxl6Huz-VSDfg&8xhE_M~)xW8Ez#bpw3Bn*}fwEPCy!- zB!i>W7&K{5&#dcn8Hhz^S(ZRhal9obbj4gPYSEfYHjU2iwxr4o2j(~Z$gT1j|E^ni ziR+y22ayxGVsjR6 zH45IAdyT2oQ&&ytshJh)(e)x5rBW<+FGNmdW6r6mJm^>FXXd8J#2IosKY^nk|U zX1;NfkypH0KIXBaK*o@aUkEnC3ZHgGviG$&gX5wDP@K;PK~#@IrzQhlx9}muiFW*O ze9{CPJ4`2uA&!d>q%jk0q{qO=S=@$WVp-IEg(1JyXI%eou)&McK6w?Uok|ph)L6br z=12jhJ(nDR#pCt-Y!Ga0*2;;pSH+T8*`~O7uf{vTZzk}Kev?>I6qAnUEw~Ybk#2toXZ9a7})x;XZq5p?cPNiQsLY*Z={X(NRHFc6wq7}y@wcvQ9CQD;C zs6b)R{z;k@X~t;OM}GzTDTcjCZ$mEPEs|{|pF)XdWwm>nMkcym8_~}&f27S6wusCf ziKr!ZAnI-*2!#v-P9EF_!5_B zElpSJ3(SzD(ar|mAxXy^INl}6fJg6HdQ5~kOY76rO1`3oa+#zIzNQFXAt{TiWXDPL znAYET&V=<8gCW8uThGv-okyDG2ljJXW%DdSk0lGU6?xxkZ&gS_eBP?~=4dIg&;d?_r)C(J4I(B&8_a zcd$s#rE!!}a*ZU7?)ht2B1y*wRQ1-L6SJZn3S{V9X&nr@Xd^v$(t7hT7+*2;otkB(l!qOEv%?g-^x9esF?A>%7= zx@L_Saz2CD6zA-UQ9Wn4e2I1*QNNA>?~cRWrek?`(!_N@M-I=^3o3?n{*$IrW#}J? z*y6ibE?g7fyp9)ekicu)UGnYTH&Te81ItCk4(WJF5G!1;HpKNKI)=pc3|;sA=Z?@H z)$uY$81}UEflGrSd5lxy;;4?X@Zv($uLLG^97B;zT{jx*Q}!wah>|m##;Z84;x!$w zAUFQx%S_EJyXuXW5 z40k==QP^%o?w__5*$5!8Z*LS6=zLhD+ZX~^hpuPQH7c9)Mm*Z&*NXNycJ9QodzaC)-r&~l7P)r%s>Z0j# zDrtSzqWYey8jS{Ts4y9ZxA_!js)|kOv1damx4vIAEH#>%fJ9IFaFCP`qu*O;+IuTa za9Vpng$#wxOSCJ}j?pTQ{tEV!2P@N4@suh~lC1jx`j(xd-8;eQX=i7*WhWaBN zCeS8I?MOtEJ%*^Kn<%{_5q%0`h_c;8nH`Df(-1?nubW8Uk?0K0BIyOYM1&$q%IMfH zP~)RL;3I-)i%f`gGEC7unHmt;t`wY$r|;PzHRgu z;_3J8mR{6!i+*4mJ^hC8t!JN8Tr(8I2V*=fIq4x@3=xM*GC>ZPl$eK}N zSo#X@k}io+e2F=dBwWBI=1G$2$#ID!1yxGHWs+1lIE^bLY51B3%6lZGa2JDEASsPS zvg1wks@gx;qe6Rv0Tl`Q)7TRn@Ws^sh+*~4bR|d>y% zNgU*);6xLN_m754vUfx|_bzEUIXo(q6z@oB9Z@CFt$cj)W_()$N0O*v3Gb65GNosk zqy&ZgHm;I$NgSb6eL#{#Nj;7aNs{TgAJ<4yyrld9?I|fF6&hod2r%}PF1Ggxq3DMk z0z!<`sS0391lC4&YXh*_32x(K4(LkP?7H5X`qSi}_zvYoYD607fA}}NLQ8>`M^t&} o9=*}eQ$C1g^z)R&4X=zo!pF2~#Bb35O{~!_P0~6xsQ7dL0qqc&w*UYD literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Result.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/Result.class new file mode 100644 index 0000000000000000000000000000000000000000..74f881bdc885bd48c578f263255158d3a2ee8e95 GIT binary patch literal 4241 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 literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/info.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/pojo/info.class new file mode 100644 index 0000000000000000000000000000000000000000..663dba06ab8303e273ec216392917a9f292d0ec4 GIT binary patch literal 2323 zcma)7T~i!I6g|B=GdsHsu)#pG0V6R)`OGFJD%pi-Limb6s1UJAUmTW}9oU^&cV;Q` zPb`0cyzrn^idA{A^d(mL8~hnQ8sq7i0R~u&#j<_-_U+T>o_o9Z_rIV03}70oIi!%z zK(nC35Xf)ayLPc=yIaLa8{4uH2pCh2>jZZN(!(R`S(wOXkh9PMOW;z)s~6>0cD+%P z#Z6iFiVbhuD?08Mo`Bi%Wz)6mQlMw)78Iolg9*T9jEjcJPT4Fv#@-+YNky z$t2hK=(A+n@DtFYv$~fYSFW_`8?yPt-l&Djc@?|1ZZ{n@kDXdjb$H&u(!a}J7U+N6 zas#I>7u{XQcewkW>w1A5IAp9!QuFE?-cE5|y0U2pa+6y+{G^sAw2$){S!a_h%b@CQ zuG&o&H;_%D8Qe$-1q2J9tae;70o@C#vMJE1xDOq-Mpx)hILt7B9U+j7)C0a%*0zS&?&&5;m)v^tx(GCUoEP z0zYWljVLqU#0(3qB8Cr{PK)tD0#1vOZUeJ9%wax*1=SNIFm&ABj=Ssa$YOM6)FyLw zCGeV01-?!;NE{fQxL~`RHR%s6dEQQ|Q9j!>3D1d*Po6epoAA#P@rSo2;ff(<>{@Nj z2_!3TExK%jnVRkU($8Q?;M$p-+ELA5Md0#(hq6FXUbwN$m<3w| z2K{ewR^&`@)JK1U_&yAKo8Ly{#4v3uwns3^*;u?f&QYj$;SA6Z$b84e6pn#1uLR=r z&<3dUG?4j9pb1<@I!vuZKqY}OI`$(n?Q`pkA`s=K@>XIA%0fwaOOZd7@QwEHo&OhJ z)!+!e`wToE&Y1n5WR@X|>e%SF(6#-sUtxX&J-t8n3(V#5(F5eeDUI_henh3<_?cnW!04;igmKlBGyq=^&{3gxhmFiRd1a_7wVUYFzP=1 z!BOW}%9p3K=}_E(e7Q<#&HUING7|^5{JHY?mo&9d(Bc(S3C^W~_Cnr{P-9AIigE`f zQqn0|nN|up+`trRrg4>bVVaf}iuMrNOFA@)CIp3o5HA^YJWnY{FZ9EJ!x-(Pi(#jF z`R>u3n^dsOx=SUjl6!_Xfzy{S5;uAdy5dZd&p{d=gyr}U_c)qFe8B(vc*t3f)<
  • M#fT9TabvF?%ZU{%z1QI>fXwrD`wziYH*mlWwi~cqb{s4cJaZ0hp zV3gawnKy6V%+AN>+dBYUz_A4-2B)qHIlhW;8X)&DR6IsKlP>a+Hqs5y$)E+B44M-$ z6Fd-+&uU zWg|^MGt?cGXcw<#3fiL|S8$eoUxfjK4Z0zKG95)3Duk^RF{na%CpD;3Xp2H6*e2Y7 h9eOP&yA;k+O-k)StEg_zt2?k?gbs+!;BYQ=^acLL!6EUBR-jaaH7GOKnurU*L!rj}WH`aV zGAJKOC2fa6v3WSC!VRcaz^lPJ)EKk^9dZ09qBul8!btN3&4mn*zt+a+Sx=~G|I$P3 z;nH_3;usCp`#C_Ag;we>bKC1shs_FX)!-&H7&QO4kU>3^iT!{$4d?DX3>wWtKbteP zGUPr*Gy1I>+;-?qmw&94J^xd%+e?*|5e{S`haq;A(pFfhRl?wgP*^@6%|A=2Q@#9_Z^pgacuuvlq^i zJ(tw)S$<{L?wopTjPc6s)xI1nVN*kGI=MX@<>9fOXx=qe1|jxPS+~Nsrzh89Ap-N19Vb^3RIU0Gt$ptkcE`Ql{S@Py8-K!?gm(!r75A*)RK4(TFk zx>}NV$>O9L>9y8ZV4vxu0J|hz7{G%)k`6!#a1ZX2X7B(Sl;w(Fkd@`NzCh(0Y%usl l-c`c(3c*_t9%ea@sPgf3r0qOu?;oTBjqLh9T@Jbr@EcRg<{|(9 literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/service/BorrowService.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/service/BorrowService.class new file mode 100644 index 0000000000000000000000000000000000000000..da4698b8f38dbd9c1c4601539487f71b6302a67d GIT binary patch literal 247 zcmZXO%MQUn6o&snTWTZTz(&}Z2M`+zD?-x5e%hYUYI~aLg=e$y03J$AvBB~?=fB+_ z*BgKZ`VLwGl*+Fjon1WKk_FpQ2 z(PaIXlyl6VnE7;X{2MBd9PX4>DV3xP0asI5>C9(78SuE$0j;8h1cqPzv!>b>5NMn6 YK+DXrU>kM}Sq(G`yFVxM?=@<;PlGN!y8r+H literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/service/UserService.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..d0ded2833cbbff8d8dc50d176abe39471e180d58 GIT binary patch literal 622 zcmb7>O-=$q5QSf(!vHGc59k3*gpK2#xN*S>e-fhmcBUAb%yg5U0p)5gJb;HXRs#l< z*|@8IdG*!ns?V?Y4*)kf_fZnK2u&K$n@lGO1rent$jHuANWl{qgJtbwSD-PLGZ`dO z$HBwPn8IA3K2$ooojd2fOiAFn-Cw%~xm7yucKTZ*CT46F{4QhfC?A>VQCcSCWHW)v zl!1BytXPUw#vnnq<%puG+uv{6kAr_u85&$4`qJ){PH*}+^wppt)yznN!VM+`^EAB>VE-;XsiK83|MlHaq`!BisqJ+g%)f)rQ?wRyt0J!$I;Nx})fI-ecp}?{PIMWFndpYea6a#r zEODQg%C@iyqU2f?;jPQOup}K>GoF%pTV#T>6df`2@ZfNPm&?LqIFoL{DEU9tyaU5z zH+pf%z+n?d(8qB4KY204c%cwRWVjG-4OVtn-CC$*BE6q~+I5P4)BzKNI7-Yb!lsJU z(fZ<{c~wciz zNXfQEk=rv~v04(k=6O+8(sep9%P{!pi*Nq?Z2OPTA3WT7@Yg3lKit`S^zB{@(|AJ< z&Ky}Blv-BT<4qH9A;oZfSvrMT*Yn&BL94q~ncciYup-R?qJPSmAfH5QAkp~uek+cd?+m)aidzw3GX&1c!s{To9A|xds6Si!>C%36z^hd zn`^Y6a8*zwqpqCcR`;gCC1ETGwc-|Ta-ED49>wg+$fCnl)gx|`HFeahIrS9CD?}ii zn>vmD#xD66L}G~{A`2A%@rlxc3kHeiv*E|ubP;++@%$RyZ(*t0l~h3;_hlLCnB-j) zO3S55K{S9>ItwH;*GR5DT|U(RN;;Ntt6pAQmzvA5W>M)o{G5hlh##n+3YA{CYO^e? zP=`sn+dAo$VVI|X=!b*WG<|i@x)84P`q1tM?JQcgUHjNJ*bnp(!D46xa=l648h{M& z4sOv(Hxv5EN;^-}8lkm&>_-^myXcAFd)hWa4EPX71G5l9v&!H$LERzic19bGOV>V` zY1~V+(=lTjcNhJv1$L-`SuBLjl1BvZlIMH48zNQFMt{JF&u|OJcJTbCI~du;nFtmp zwlE(33P$v6MBBb2vo=3@{Yr!0ia`wfVNL`Pb@n4z!uvkqUVMNL$@(L*C$GP8(!j*k zdR|L(Ov6C=99*vpt@RpxLcQ+cV}c6nbYb;^1=>X* J>M~mf{sk92G7T#9egk-m-8?)@YM#o# zGGyPVSlM?B6Xi-{8dI3gA@8FApMeKD;_|DAI-%q(8EM{?=3E7mD@yVA+8BLtG)R4< z41?e7=MF@tBMrl5Erk&EUnRYRx@rM4DCRKh<1XeHHvXq+#ARflO^ac@oF?n&Q=L#% zD~&wnv5-T_$9*g^tfXkh${D8G($I-FLtI9CBuUjO# zSW|JLqb>-ZVXmeF5jKQT?m0Q{R48h$uTaEDWpZ=CMyfm9q!Zp6J$R z;gncui178T0<9r|B#%rOmsh_|i;(d01Jj#YpV7mS?wLS-P)=j%hR5zu@3=3|P`;I~ zOT$QQFFTSa_n?Y(x|>DU5guX&w(d N)Z&pFL#JK>{{V5#FveNkW>Iv?(OTCWcMZkI*;?C6O#48Pb&0@8jLU46%2t^*Skk zs%oW56@94s+#gl-%ZBX|4B!4CHV^An!z%F#%L0(UyO=wbX*9G7^ts<@0=8CM*9fCYi&{|*tje4qpW z*|A06lS3tNzur0HwI78#=(ieq^pQC-F?Ni4&B1jnlD71Hfwc=#RPp@`ny? z;v<1_Uqw1NF#oRx8xhyA(tXj;Hul$J@mC>M7xwf;nvCbKZ1#bQ@2_ijIT|L&lf!YoN z6Uj)MU@WlNF=5{wk8JY~Ldx>igsZC-0ewZ-s({KErFTm#wU?l zM+a(eGVH1Fm1KH>g^uy$pesXd_vztGbf}5v=Jh?T`J&k*OvMgo5D&~kzQqD!BCwRt zdNws|=&p(mjsLy01S1u)4ocV8V}1*)W|c_CFb~w|GH4{nV>XC`H#;zW9ncOsB&VV?@l3*Re&0+&Pqnq}; zZN_NdPSLiww`jR`tYmU?q~mtjLK7DD>pi*o_@qp>Xl+xfX~%99aMrJ+>Gc?8F>#xs zR8y359pY=0=G|k(wr0oXU1^@+<6^Eo>umH!hJrIq?%)wxEZ-__$xPexh)0PSkFlIW zy-VTK0)D1jc5WWLm%Gs7Y)@+pfNw)o%l S91AOI0pG>z_VhkH1O5e_@PK3h literal 0 HcmV?d00001 diff --git a/src/SeKeshedemo(后端)/target/classes/com/example/demo/utils/JwtUtil.class b/src/SeKeshedemo(后端)/target/classes/com/example/demo/utils/JwtUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..581445df53c450709c58d07a8aee3642f5aa3571 GIT binary patch literal 2193 zcma)7ZCevZ6g?A&OV$NKst70)3AVwuthHjbL0Sx0iHX`K#?soC$!17~Zg$h%jmYol zA8EfRw9nHY&>z*OcQ(P07d0PtXZFsWd(J(3@65md{q+xkJJ{C|!H9-Y15un|i0|{~ z+_bq`MR@5kOsFk3mvvu998($+2HwLthQ)VnW{4fgpq5da8Mafo z4*5dhNvE1_S(<^g%{*_Uhv1`OnqeXg6mHw1RCLT>R>Pcui@4OKQQ^=J1Yu8EP0tff zP?U9%m$ohaP_As0L`LNIRp>a6MWyj&hS5}32^mMyz%s5djH@iRUo@mA{7q8)Mmv+& z1coF2A;W@_OuXRrhAqsBsJo_$;hWim;0aB}u)?4bn2>d@<0E{m;S&R^Fd3G*)#i59 z^~kgCo0}(7+Iv60nYq4pli}6?wR`0q6eFz?|J1;Bd`3$6vg(Af-VII~^!;8{jcW#O z;&YN81#8(X6~~5XzsTwIwXKA}SP% zQrX5m4PP6$j~#|&H`>5G3}aOhv^(siF2m!Y-C=K$G2BI<50KN4H}DXT+7;S4F;0QD zL89EJR;89A;W}-ox|dq&!S*ggqQ4NRhcd3?2iyrt+-_14jAkfnhRK|C#KUI2EW9Ew z+hj@PT#MT!?n(9CHjV~0)v}9W;k>zjhyuys6y0A1m2L8Lo3@UZz6w(LycjkyU?i> z+P4s$8tr=sm+=AJgaE@F9^)Gtzg0&!QW&8*-Hr4vkj12t(HOn@3hd9&rATkJ48-t+ z-bTv-B|Hsn-(i=6sLd|4a4mTREir!eB_{vI`Q0O2IEQ)u3h%$fQX+K(TDbNHxsO1F zo+fl)k|5$3#}qChfhGFxKqWDO@5$!}dRpMh@{GQIq$f)E84W+t6T#2K@fYwmpJ!xI zyca^$BiuN~EvDc%6643%ir^So21O+jQkf$Xzy&&WXDH?@UDIc^HSBX!0HM=q+5TB7=Zo!kTKs41il}lnHS~VCt+R!fWl;xB&a^5UgOEOcG zWhYbj?2?-qD-Pzl5YVYVc6@Ldt}`{2>lRI>H7KevUb`z zCFj+CzuMm=u!YJaBkKgLVYfi%@Xxnbdic{Kk%J4;`< zQlWZo5(S*oFs0)ayehEC2U~5BfK_F_RC%oEmw90#PvQ4EUQ^dVt1mn0nbzFtnyI*q z4m(9ot)q5Dj@Qf6EJSm<#GUq0$1+Q2%$lvf!_BBSYcq!Jqd(v6Sph+@_BGYT17l2j zvrcistdRsy)+pCv%}Q%-g7jQ=YDIx(*U9f%sJ?S7%<3bhM7cOPak}^yMHQLK z(Gy-ig6S8`oFGfO>)&WW*RjpkAcuuW={fr5lQm{mLk1$#yekA@Bi0@+SgR3>y%s-W zmBQ;ZR&h-^FAxUts3L!=-pEOE(y7-hdD2$I>*1BTTVwmj{^TYc$KE3~sTmSj`v+uvTvFgV9_tHlXKKbIojd$2d>H@y^_Pedkct442_@jpF zs__0Kuydt6?aC!*PG*9#32O1AX?adz9}3FGg%E0ta})PAq?fR1Y*+sx zIzQ)UfTsQ$0BO42?;~yxL^08A9zOGvN41!N93K*iUG z+7&{5i6}Dw4Ez%Vg;>w*9c0G4dtN&j?LHXmh;>B&j<$41Z2!O#_PrMqH~;tDz#w;=Kmn=}jv@n3BAIcaGk4u}BiDsK3MhXGxoew2H?w{f_u4L@Aft{gb3 z)<)~q14I2iix@iFzg3MZCD`fvmSg!Hr>`f_&4+adUi2eK2WYsAd7={6_mRDYPAuRG zt#;7E*STt1E``e!bNP$o4ZpfoDcmEB3ig^|d=o1)8GG`DsIfO+h#C9xg=S-azMvTg z@`boDm@gR3#zBsn@f^pv@jSJMr3+^J* z_YPTqpW!Zd=tX|NiK~=X=}92+BdQusZ6?%P+=$?9ss!Et9u2*V5BQbj>O*{lKjX>& E1GCPj%K!iX literal 0 HcmV?d00001 diff --git a/src/library_system(前端)/.gitignore b/src/library_system(前端)/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/library_system(前端)/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/library_system(前端)/.vscode/extensions.json b/src/library_system(前端)/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/src/library_system(前端)/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/src/library_system(前端)/README.md b/src/library_system(前端)/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/src/library_system(前端)/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/src/library_system(前端)/package-lock.json b/src/library_system(前端)/package-lock.json new file mode 100644 index 0000000..f6fe63e --- /dev/null +++ b/src/library_system(前端)/package-lock.json @@ -0,0 +1,2498 @@ +{ + "name": "library_system", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "library_system", + "version": "0.0.0", + "dependencies": { + "axios": "^1.11.0", + "element-plus": "^2.10.4", + "pinia": "^3.0.3", + "vue": "^3.5.17", + "vue-router": "^4.5.1", + "vuex": "^4.1.0" + }, + "devDependencies": { + "@types/node": "^24.1.0", + "@vitejs/plugin-vue": "^6.0.0", + "unplugin-auto-import": "^19.3.0", + "unplugin-vue-components": "^28.8.0", + "vite": "^7.0.4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", + "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", + "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", + "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", + "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", + "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", + "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", + "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", + "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", + "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", + "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", + "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", + "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", + "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", + "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", + "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", + "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", + "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", + "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", + "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", + "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", + "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.19" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "vue": "3.5.18" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", + "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/element-plus": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.10.4.tgz", + "integrity": "sha512-UD4elWHrCnp1xlPhbXmVcaKFLCRaRAY6WWRwemGfGW3ceIjXm9fSYc9RNH3AiOEA6Ds1p9ZvhCs76CR9J8Vd+A==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.13", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/pkg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz", + "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", + "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.45.1", + "@rollup/rollup-android-arm64": "4.45.1", + "@rollup/rollup-darwin-arm64": "4.45.1", + "@rollup/rollup-darwin-x64": "4.45.1", + "@rollup/rollup-freebsd-arm64": "4.45.1", + "@rollup/rollup-freebsd-x64": "4.45.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", + "@rollup/rollup-linux-arm-musleabihf": "4.45.1", + "@rollup/rollup-linux-arm64-gnu": "4.45.1", + "@rollup/rollup-linux-arm64-musl": "4.45.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-musl": "4.45.1", + "@rollup/rollup-linux-s390x-gnu": "4.45.1", + "@rollup/rollup-linux-x64-gnu": "4.45.1", + "@rollup/rollup-linux-x64-musl": "4.45.1", + "@rollup/rollup-win32-arm64-msvc": "4.45.1", + "@rollup/rollup-win32-ia32-msvc": "4.45.1", + "@rollup/rollup-win32-x64-msvc": "4.45.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.2.0.tgz", + "integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.12", + "unplugin": "^2.2.2", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unplugin": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.5.tgz", + "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "picomatch": "^4.0.2", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz", + "integrity": "sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "picomatch": "^4.0.2", + "unimport": "^4.2.0", + "unplugin": "^2.3.4", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz", + "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "28.8.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz", + "integrity": "sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "tinyglobby": "^0.2.14", + "unplugin": "^2.3.5", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vuex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", + "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/src/library_system(前端)/package.json b/src/library_system(前端)/package.json new file mode 100644 index 0000000..f8dd95d --- /dev/null +++ b/src/library_system(前端)/package.json @@ -0,0 +1,26 @@ +{ + "name": "library_system", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "axios": "^1.11.0", + "element-plus": "^2.10.4", + "pinia": "^3.0.3", + "vue": "^3.5.17", + "vue-router": "^4.5.1", + "vuex": "^4.1.0" + }, + "devDependencies": { + "@types/node": "^24.1.0", + "@vitejs/plugin-vue": "^6.0.0", + "unplugin-auto-import": "^19.3.0", + "unplugin-vue-components": "^28.8.0", + "vite": "^7.0.4" + } +} diff --git a/src/library_system(前端)/public/vite.svg b/src/library_system(前端)/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/library_system(前端)/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/library_system(前端)/src/App.vue b/src/library_system(前端)/src/App.vue new file mode 100644 index 0000000..6427272 --- /dev/null +++ b/src/library_system(前端)/src/App.vue @@ -0,0 +1,71 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/assets/style.css b/src/library_system(前端)/src/assets/style.css new file mode 100644 index 0000000..92ac9fe --- /dev/null +++ b/src/library_system(前端)/src/assets/style.css @@ -0,0 +1,62 @@ +/* Element Plus 主题定制 */ +:root { + --el-color-primary: #165dff; + --el-color-primary-light-3: #3c8dff; + --el-color-primary-light-5: #6baaff; + --el-color-primary-light-7: #a3cfff; + --el-color-primary-light-8: #d6eaff; + --el-color-primary-light-9: #f4faff; +} + +body { + font-family: 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif; + background: #f6f8fa; + color: #222; + margin: 0; +} + +.el-header, .el-footer { + background: #fff; + box-shadow: 0 2px 8px 0 rgba(0,0,0,0.03); +} + +.el-menu { + border-right: none; +} + +.el-card { + border-radius: 12px; + box-shadow: 0 2px 12px 0 rgba(22,93,255,0.04); +} + +.el-main { + padding: 32px 24px 24px 24px; + min-height: 80vh; +} + +a { + color: var(--el-color-primary); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* 登录/注册页面居中 */ +.page-center { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, #e3f0ff 0%, #f6f8fa 100%); +} + +/* 头像样式 */ +.avatar { + width: 48px; + height: 48px; + border-radius: 50%; + object-fit: cover; + box-shadow: 0 2px 8px 0 rgba(22,93,255,0.08); +} diff --git a/src/library_system(前端)/src/assets/vue.svg b/src/library_system(前端)/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/library_system(前端)/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/library_system(前端)/src/components/BookCard.vue b/src/library_system(前端)/src/components/BookCard.vue new file mode 100644 index 0000000..8e01c96 --- /dev/null +++ b/src/library_system(前端)/src/components/BookCard.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/components/HeaderBar.vue b/src/library_system(前端)/src/components/HeaderBar.vue new file mode 100644 index 0000000..63f8f2f --- /dev/null +++ b/src/library_system(前端)/src/components/HeaderBar.vue @@ -0,0 +1,249 @@ + + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/main.js b/src/library_system(前端)/src/main.js new file mode 100644 index 0000000..2b9699b --- /dev/null +++ b/src/library_system(前端)/src/main.js @@ -0,0 +1,25 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +import store from './store' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' +import * as ElementPlusIconsVue from '@element-plus/icons-vue' + +const app = createApp(App) + +// 注册所有图标 +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) +} + +app.use(ElementPlus) +app.use(store) +app.use(router) + +// 初始化会话 +store.dispatch('initSession') + +app.mount('#app') + +window.store = store \ No newline at end of file diff --git a/src/library_system(前端)/src/router/index.js b/src/library_system(前端)/src/router/index.js new file mode 100644 index 0000000..6c4095f --- /dev/null +++ b/src/library_system(前端)/src/router/index.js @@ -0,0 +1,131 @@ +import { createRouter, createWebHistory } from 'vue-router' +import store from '../store' + + + +const routes = [ + { + path: '/', + name: 'Home', + component: () => import('../views/Home.vue'), + meta: { requiresAuth: false } + }, + { + path: '/login', + name: 'Login', + component: () => import('../views/Auth/Login.vue') + }, + { + path: '/register', + name: 'Register', + component: () => import('../views/Auth/Register.vue') + }, + + { + path: '/books', + name: 'Books', + component: () => import('../views/Books/BookList.vue'), + meta: { requiresAuth: true } + }, + { + path: '/books/:id', + name: 'BookDetail', + component: () => import('../views/Books/BookDetail.vue'), + meta: { requiresAuth: true } + }, + { + path: '/books/add', + name: 'AddBook', + component: () => import('../views/Books/AddBook.vue'), + meta: { requiresAuth: true, requiresAdmin: true } + }, + // { + // path: '/books/edit/:id', + // name: 'EditBook', + // component: () => import('../views/Books/EditBook.vue'), + // meta: { requiresAuth: true, requiresAdmin: true } + // }, + { + path: '/borrow', + name: 'BorrowBook', + component: () => import('../views/Borrow/BorrowBook.vue'), + meta: { requiresAuth: true } + }, + { + path: '/return', + name: 'ReturnBook', + component: () => import('../views/Borrow/ReturnBook.vue'), + meta: { requiresAuth: true } + }, + { + path: '/borrow-records', + name: 'BorrowRecords', + component: () => import('../views/User/BorrowRecords.vue'), + meta: { requiresAuth: true } + }, + { + path: '/recharge', + name: 'Recharge', + component: () => import('../views/User/Recharge.vue'), + meta: { requiresAuth: true } + }, + { + path: '/ranking/weekly', + name: 'WeeklyRank', + component: () => import('../views/Ranking/WeeklyRank.vue'), + meta: { requiresAuth: true } + }, + { + path: '/ranking/monthly', + name: 'MonthlyRank', + component: () => import('../views/Ranking/MonthlyRank.vue'), + meta: { requiresAuth: true } + }, + { + path: '/admin/borrow-records', + name: 'AllBorrowRecords', + component: () => import('../views/Admin/AllBorrowRecords.vue'), + meta: { requiresAdmin: true } + }, + { + path: '/admin/books', + name: 'BookManagement', + component: () => import('../views/Admin/BookManagement.vue'), + meta: { requiresAdmin: true } + } +] + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes +}) + +// 路由守卫 +router.beforeEach((to, from, next) => { + // 等待会话初始化完成 + if (!store.state.sessionInitialized) { + return next() + } + + const isAuthenticated = store.getters.isAuthenticated + const isAdmin = store.getters.isAdmin + + // 如果路由需要认证但用户未登录,跳转到登录页 + if (to.meta.requiresAuth && !isAuthenticated) { + return next('/login') + } + + // 如果路由需要管理员权限但用户不是管理员 + if (to.meta.requiresAdmin && !isAdmin) { + return next({ name: 'Home' }) + } + + // 如果用户已登录但访问登录/注册页,跳转到首页 + if ((to.name === 'Login' || to.name === 'Register') && isAuthenticated) { + return next({ name: 'Home' }) + } + + next() +}) + +export default router \ No newline at end of file diff --git a/src/library_system(前端)/src/store/index.js b/src/library_system(前端)/src/store/index.js new file mode 100644 index 0000000..38f5493 --- /dev/null +++ b/src/library_system(前端)/src/store/index.js @@ -0,0 +1,370 @@ +import { createStore } from 'vuex' +import service from '../utils/request' + +export default createStore({ + state: { + user: JSON.parse(sessionStorage.getItem('user')) || null, + balance: JSON.parse(sessionStorage.getItem('balance')) || 0, + vipLevel: JSON.parse(sessionStorage.getItem('vipLevel')) || 0, + borrowedBooks: JSON.parse(sessionStorage.getItem('borrowedBooks')) || [], + sessionInitialized: false + }, + getters: { + isAuthenticated: state => !!state.user, + isAdmin: state => state.user?.admin || false + }, + mutations: { + setUser(state, user) { + const admin = user.admin === 1; + const userData = { + ...user, + admin + }; + + state.user = user + console.log("user") + console.log(user) + console.log("state.user") + console.log(state.user) + sessionStorage.setItem('user', JSON.stringify(user)) + }, + setBalanceAndVip(state, { balance, vip }) { + state.balance = balance + state.vipLevel = vip + sessionStorage.setItem('balance', JSON.stringify(balance)) + sessionStorage.setItem('vipLevel', JSON.stringify(vip)) + }, + setBorrowedBooks(state, books) { + state.borrowedBooks = books + sessionStorage.setItem('borrowedBooks', JSON.stringify(books)) + }, + clearUser(state) { + state.user = null + state.balance = 0 + state.vipLevel = 0 + state.borrowedBooks = [] + sessionStorage.removeItem('user') + sessionStorage.removeItem('balance') + sessionStorage.removeItem('vipLevel') + sessionStorage.removeItem('borrowedBooks') + }, + removeBorrowedBook(state, title) { + state.borrowedBooks = state.borrowedBooks.filter(book => book.title !== title) + }, + setSessionInitialized(state, value) { + state.sessionInitialized = value + } + }, + actions: { + async initSession({ commit, dispatch }) { + try { + // 静默获取用户信息 + const userData = await service.get('/user/getinfo', { + silent: true // 避免未登录时显示错误 + }) + + if (userData && userData.username) { + const admin = userData.admin === 1; + + commit('setUser', { + username: userData.username, + pic: userData.pic || '', + admin + }) + + // 获取关联信息 + try { + await dispatch('fetchBalanceAndVip') + } catch (balanceError) { + console.warn('获取余额信息失败:', balanceError) + } + + try { + await dispatch('fetchBorrowedBooks') + } catch (booksError) { + console.warn('获取借阅书籍失败:', booksError) + } + } + } catch (error) { + console.log('未检测到有效会话,用户需要重新登录') + // 清除可能存在的无效数据 + commit('clearUser') + } finally { + commit('setSessionInitialized', true) + } + }, + + + // 用户登录 + async login({ dispatch }, { username, password }) { + const response = await service.post('/user/login', + `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`, + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + + // 登录成功后获取用户信息 + const userInfo = await dispatch('fetchUser') + return { + ...response.data, + user: userInfo + } + }, + + // 用户注册 + async register(_, { username, password }) { + const response = await service.post('/user/register', + `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`, + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + + return response.data + }, + + // 获取当前用户信息 - 符合接口文档 + async fetchUser({ commit, dispatch }) { + try { + const response = await service.get('/user/getinfo') + const userData = response.data + console.log("fetchUer userData") + console.log(userData) + const admin = userData.admin === 1; + // 用户信息接口直接返回用户对象 + commit('setUser', { + username: userData.username || '', + pic: userData.pic || '', + admin + }) + + // 获取关联信息 + try { + await dispatch('fetchBalanceAndVip') + } catch (balanceError) { + console.error('获取余额信息失败:', balanceError) + } + + try { + await dispatch('fetchBorrowedBooks') + } catch (booksError) { + console.error('获取借阅书籍失败:', booksError) + } + + return userData + } catch (error) { + commit('clearUser') + throw error + } + }, + + // 获取余额和VIP等级 - 符合接口文档1.5 + async fetchBalanceAndVip({ commit }) { + try { + const response = await service.post('/user/findmoney') + const resData = response.data || {} + if (resData.code === 200) { + console.log("fetchBalanceAndVip resData") + console.log(resData) + const balance = resData.data.balance + const vip = resData.data.vip + + // const message = resData.message || '' + // // 使用正则表达式解析余额和VIP等级 + // const balanceMatch = message.match(/余额为:(\d+\.?\d*)元/) + // const vipMatch = message.match(/当前VIP等级为:(\d+)/) + console.log("balance:"+balance+",vip:"+vip) + if (balance && vip) { + commit('setBalanceAndVip', { balance, vip }) + } else { + console.warn('无法解析余额或VIP信息:', message) + commit('setBalanceAndVip', { balance: 0, vip: 0 }) + } + } else { + throw new Error(resData.message || '获取余额信息失败') + } + + return resData + } catch (error) { + console.error('获取余额失败:', error) + // 不抛出错误,避免影响其他功能 + return { code: 500, message: '获取余额失败' } + } + }, + + + // 账户充值 + async recharge({ dispatch }, { money }) { // 添加 { dispatch } 解构 + const response = await service.post('/user/recharge', + `money=${money}`, + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + + // 充值后刷新余额 + await dispatch('fetchBalanceAndVip') + return response.data + }, + + // 退出登录 + async logout({ commit }) { + commit('clearUser') + return { code: 200, message: '已退出登录' } + }, + + // 查询个人借书记录 + async fetchBorrowRecords() { + const response = await service.get('/user/findone') + return response.data + }, + + // 获取当前用户已借书籍 + async fetchBorrowedBooks({ commit }) { + const response = await service.get('/user/borrow/books') + + // 按照接口文档处理响应 + if (response.data.code === 200) { + commit('setBorrowedBooks', response.data.data || []) + } else { + throw new Error(response.data.message || '获取已借书籍失败') + } + + return response.data +}, + + // 租借书籍 +async borrowBook({ dispatch }, { title }) { + const response = await service.post('/borrow/borrowbook', + `title=${encodeURIComponent(title)}`, + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + + // 借书后刷新用户信息 + await dispatch('fetchUser') + return response.data +}, + +// 归还书籍 - 符合接口文档3.2 +async returnBook({ dispatch }, { title }) { + try { + const response = await service.post('/borrow/returnbook', + `title=${encodeURIComponent(title)}`, + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + + // 还书成功后刷新借阅书籍列表 + await dispatch('fetchBorrowedBooks') + + return response.data + } catch (error) { + console.error('还书失败:', error) + throw error + } +}, + + // 查询全部书籍 - 符合接口文档 + async fetchBooks(_, params = {}) { + const config = { + params: { + page: params.page || 1, + pageSize: params.pageSize || 10, + title: params.keyword || '' + } + } + + const response = await service.get('/api/select', config) + const countResponse = await service.get('/api/countArticle') + + // console.log('请求书籍:', params.title) + // console.log('API响应:', response) + // 处理不同响应格式 + let list = [] + let total = countResponse.data.data + if (Array.isArray(response)) { + list = response + // total = response.length + } else if (Array.isArray(response.data)) { + list = response.data + // total = response.data.length + } else if (response.data && Array.isArray(response.data.data)) { + list = response.data.data + // total = response.data.total || response.data.data.length + } else if (response.data && Array.isArray(response.data.list)) { + list = response.data.list + // total = response.data.total || response.data.list.length + } + + return { + data: { + list, + total + } + } + }, + + // 根据书名查单本书 - 符合接口文档2.3 + async fetchBookByTitle(_, payload) { + const { title } = payload; + + try { + const response = await service.get('/api/selectone', { + params: { title } + }) + + // 根据接口文档处理响应 + if (response.data && response.data.code === 200) { + return { data: response.data.data } + } else { + throw new Error(response.data?.message || '获取书籍信息失败') + } + } catch (error) { + console.error('API请求失败:', error) + throw error + } + }, + async fetchBookById(_, payload) { + const { id } = payload; + + try { + const response = await service.get('/api/selectById/'+id) + + // 根据接口文档处理响应 + if (response.data && response.data.code === 200) { + return { data: response.data.data } + } else { + throw new Error(response.data?.message || '获取书籍信息失败') + } + } catch (error) { + console.error('API请求失败:', error) + throw error + } + }, + + // 新增书籍 + async addBook(_, bookData) { + const response = await service.post('/api/add', bookData, { + headers: { 'Content-Type': 'application/json' } + }) + + return response.data + }, + + // 管理员删除书籍 + async deleteBook(_, { title }) { + const response = await service.post('/user/delete', + `title=${encodeURIComponent(title)}`, + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ) + + return response.data + }, + + // 本周热租榜 - 符合接口文档 + async fetchWeeklyRank() { + const response = await service.get('/api/rank/weekly') + return { data: Array.isArray(response) ? response : response.data || [] } + }, + + // 本月热租榜 - 符合接口文档 + async fetchMonthlyRank() { + const response = await service.get('/api/rank/monthly') + return { data: Array.isArray(response) ? response : response.data || [] } + } + } +}) \ No newline at end of file diff --git a/src/library_system(前端)/src/utils/date.js b/src/library_system(前端)/src/utils/date.js new file mode 100644 index 0000000..3e8c5fc --- /dev/null +++ b/src/library_system(前端)/src/utils/date.js @@ -0,0 +1,16 @@ +export function formatDate(dateString) { + if (!dateString) return '未知时间' + + const date = new Date(dateString) + + // 处理无效日期 + if (isNaN(date.getTime())) return dateString + + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + + return `${year}-${month}-${day} ${hours}:${minutes}` +} \ No newline at end of file diff --git a/src/library_system(前端)/src/utils/request.js b/src/library_system(前端)/src/utils/request.js new file mode 100644 index 0000000..d24e273 --- /dev/null +++ b/src/library_system(前端)/src/utils/request.js @@ -0,0 +1,73 @@ +import axios from 'axios' +import { ElMessage } from 'element-plus' +import store from '../store/index' +import router from '../router/index' + +// 创建axios实例 +const service = axios.create({ + baseURL: 'http://localhost:8877', + timeout: 10000, + withCredentials: true // 允许携带cookie +}) + +// 请求拦截器 +service.interceptors.request.use( + config => { + + return config + }, + error => { + return Promise.reject(error) + } +) + +// 响应拦截器 +service.interceptors.response.use( + response => { + // 处理成功响应 + const res = response.data + + // 处理业务错误 (code !== 200) + if (res && typeof res === 'object' && res.code !== undefined && res.code !== 200) { + // 检查是否为静默请求 + if (!response.config.silent) { + ElMessage.error(res.message || '请求失败') + } + return Promise.reject(new Error(res.message || 'Error')) + } + + // 返回整个响应对象,确保组件可以访问响应头等信息 + return response + }, + error => { + // 处理HTTP错误 + if (error.response) { + switch (error.response.status) { + case 401: + // 只有在非静默请求时才显示错误信息 + if (!error.config?.silent) { + store.dispatch('logout') + router.push('/login') + ElMessage.error('请先登录') + } + break + case 403: + if (!error.config?.silent) { + ElMessage.error('没有操作权限') + } + break + default: + if (!error.config?.silent) { + ElMessage.error(error.response.data?.message || '请求失败') + } + } + } else { + if (!error.config?.silent) { + ElMessage.error('网络错误,请检查连接') + } + } + return Promise.reject(error) + } +) + +export default service \ No newline at end of file diff --git a/src/library_system(前端)/src/utils/storage.js b/src/library_system(前端)/src/utils/storage.js new file mode 100644 index 0000000..6e019e3 --- /dev/null +++ b/src/library_system(前端)/src/utils/storage.js @@ -0,0 +1,43 @@ +// 安全地解析JSON字符串 +export function safeParseJSON(str, defaultValue = null) { + if (!str) return defaultValue + try { + return JSON.parse(str) + } catch (error) { + console.error('JSON解析失败:', error) + return defaultValue + } +} + +// 安全地存储数据到sessionStorage +export function safeSetItem(key, value) { + try { + sessionStorage.setItem(key, JSON.stringify(value)) + return true + } catch (error) { + console.error('存储数据失败:', error) + return false + } +} + +// 安全地从sessionStorage获取数据 +export function safeGetItem(key, defaultValue = null) { + try { + const item = sessionStorage.getItem(key) + return item ? JSON.parse(item) : defaultValue + } catch (error) { + console.error('获取数据失败:', error) + return defaultValue + } +} + +// 安全地从sessionStorage删除数据 +export function safeRemoveItem(key) { + try { + sessionStorage.removeItem(key) + return true + } catch (error) { + console.error('删除数据失败:', error) + return false + } +} \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Admin/AllBorrowRecords.vue b/src/library_system(前端)/src/views/Admin/AllBorrowRecords.vue new file mode 100644 index 0000000..4c349b5 --- /dev/null +++ b/src/library_system(前端)/src/views/Admin/AllBorrowRecords.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/library_system(前端)/src/views/Admin/BookManagement.vue b/src/library_system(前端)/src/views/Admin/BookManagement.vue new file mode 100644 index 0000000..593064b --- /dev/null +++ b/src/library_system(前端)/src/views/Admin/BookManagement.vue @@ -0,0 +1,188 @@ + + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Auth/Login.vue b/src/library_system(前端)/src/views/Auth/Login.vue new file mode 100644 index 0000000..d5a5fa7 --- /dev/null +++ b/src/library_system(前端)/src/views/Auth/Login.vue @@ -0,0 +1,133 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Auth/Register.vue b/src/library_system(前端)/src/views/Auth/Register.vue new file mode 100644 index 0000000..817e739 --- /dev/null +++ b/src/library_system(前端)/src/views/Auth/Register.vue @@ -0,0 +1,156 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Books/AddBook.vue b/src/library_system(前端)/src/views/Books/AddBook.vue new file mode 100644 index 0000000..5d13af0 --- /dev/null +++ b/src/library_system(前端)/src/views/Books/AddBook.vue @@ -0,0 +1,141 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Books/BookDetail.vue b/src/library_system(前端)/src/views/Books/BookDetail.vue new file mode 100644 index 0000000..886041f --- /dev/null +++ b/src/library_system(前端)/src/views/Books/BookDetail.vue @@ -0,0 +1,186 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Books/BookList.vue b/src/library_system(前端)/src/views/Books/BookList.vue new file mode 100644 index 0000000..9ee4e05 --- /dev/null +++ b/src/library_system(前端)/src/views/Books/BookList.vue @@ -0,0 +1,202 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Books/EditBook.vue b/src/library_system(前端)/src/views/Books/EditBook.vue new file mode 100644 index 0000000..eeaf97a --- /dev/null +++ b/src/library_system(前端)/src/views/Books/EditBook.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Borrow/BorrowBook.vue b/src/library_system(前端)/src/views/Borrow/BorrowBook.vue new file mode 100644 index 0000000..e92d27b --- /dev/null +++ b/src/library_system(前端)/src/views/Borrow/BorrowBook.vue @@ -0,0 +1,142 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Borrow/ReturnBook.vue b/src/library_system(前端)/src/views/Borrow/ReturnBook.vue new file mode 100644 index 0000000..f597661 --- /dev/null +++ b/src/library_system(前端)/src/views/Borrow/ReturnBook.vue @@ -0,0 +1,155 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Home.vue b/src/library_system(前端)/src/views/Home.vue new file mode 100644 index 0000000..e75e16c --- /dev/null +++ b/src/library_system(前端)/src/views/Home.vue @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Ranking/MonthlyRank.vue b/src/library_system(前端)/src/views/Ranking/MonthlyRank.vue new file mode 100644 index 0000000..ff3ff3f --- /dev/null +++ b/src/library_system(前端)/src/views/Ranking/MonthlyRank.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/Ranking/WeeklyRank.vue b/src/library_system(前端)/src/views/Ranking/WeeklyRank.vue new file mode 100644 index 0000000..b719fb8 --- /dev/null +++ b/src/library_system(前端)/src/views/Ranking/WeeklyRank.vue @@ -0,0 +1,113 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/User/BorrowRecords.vue b/src/library_system(前端)/src/views/User/BorrowRecords.vue new file mode 100644 index 0000000..ffcad87 --- /dev/null +++ b/src/library_system(前端)/src/views/User/BorrowRecords.vue @@ -0,0 +1,96 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/User/Profile.vue b/src/library_system(前端)/src/views/User/Profile.vue new file mode 100644 index 0000000..b03de23 --- /dev/null +++ b/src/library_system(前端)/src/views/User/Profile.vue @@ -0,0 +1,122 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/src/views/User/Recharge.vue b/src/library_system(前端)/src/views/User/Recharge.vue new file mode 100644 index 0000000..cc1f495 --- /dev/null +++ b/src/library_system(前端)/src/views/User/Recharge.vue @@ -0,0 +1,135 @@ + + + + + \ No newline at end of file diff --git a/src/library_system(前端)/vite.config.js b/src/library_system(前端)/vite.config.js new file mode 100644 index 0000000..fc42a82 --- /dev/null +++ b/src/library_system(前端)/vite.config.js @@ -0,0 +1,13 @@ +// vite.config.js +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import path from 'path' // 确保引入 path 模块 + +export default defineConfig({ + plugins: [vue()], + resolve: { + alias: { + '@': path.resolve(__dirname, 'src') // 关键配置:@ 指向 src 目录 + } + } +}) \ No newline at end of file diff --git a/src/library_system(前端)/文档.md b/src/library_system(前端)/文档.md new file mode 100644 index 0000000..745b68f --- /dev/null +++ b/src/library_system(前端)/文档.md @@ -0,0 +1,170 @@ +书籍租赁系统 +前端对接后端接口文档(无 JWT · 纯 Session) + +--- + +### 一、通用信息 +| 项 | 值 | +| ---------------- | ----------------------------------------- | +| 基地址 | `http://localhost:8877` | +| 认证方式 | Cookie(Session) | +| 统一返回 | `{ code: 200/1, message: "", data: ... }` | +| 白名单(免登录) | `POST /user/login` `POST /user/register` | + +--- + +### 二、用户模块 +#### 1. 注册 +``` +POST /user/register +Content-Type: application/x-www-form-urlencoded + +username=xxx&password=xxx +``` +成功 → `{ code:200, message:"操作成功" }` + +#### 2. 登录 +``` +POST /user/login +Content-Type: application/x-www-form-urlencoded + +username=xxx&password=xxx +``` +成功 → `{ code:200, message:"登陆成功!" }` +失败 → `{ code:1, message:"账号或密码错误!" }` + +#### 3. 获取当前用户信息 +``` +GET /user/getinfo +``` +返回 +```json +{ + "username": "张三", + "pic": "http://xxx/avatar.png" +} +``` + +#### 4. 充值 +``` +POST /user/recharge +Content-Type: application/x-www-form-urlencoded + +money=50 +``` +返回 +```json +{ code:200, message:"成功充值:50.0元" } +``` + +#### 5. 余额 + VIP +``` +POST /user/findmoney +``` +返回 +```json +{ code:200, message:"余额为:100.0元 当前VIP等级为:2" } +``` + +#### 6. 借书记录 +``` +GET /user/findone +``` +- 普通用户:单条对象 +- 管理员:数组 + +--- + +### 三、书籍模块 +#### 1. 新增书籍(管理员) +``` +POST /api/add +Content-Type: application/json + +{ + "title":"三体", + "content":"科幻小说", + "url":"http://...jpg", + "state":"草稿", + "money":5.00, + "number":10 +} +``` +成功 → 返回完整书籍对象 + +#### 2. 查询全部书籍 +``` +GET /api/select +``` +返回数组 + +#### 3. 书名查单本 +``` +GET /api/selectone?title=三体 +``` +返回单条对象 + +#### 4. 删除书籍(管理员) +``` +POST /user/delete +Content-Type: application/x-www-form-urlencoded + +title=三体 +``` +返回 +```json +{ code:200, message:"该书本已删除!" } +``` + +#### 5. 当前用户已借书籍 +``` +GET /user/borrow/books +``` +返回书籍数组 + +--- + +### 四、租借模块 +#### 1. 借书 +``` +POST /borrow/borrowbook +Content-Type: application/x-www-form-urlencoded + +title=三体 +``` +- 余额不足 → `{ code:1, message:"余额不足!" }` +- 成功 → `{ code:200, data:{...} }` + +#### 2. 还书 +``` +POST /borrow/returnbook +Content-Type: application/x-www-form-urlencoded + +title=三体 +``` +返回 +```json +{ code:200, data:{..., return_time:"2025-07-25T16:35:00"} } +``` + +--- + +### 五、排行模块 +#### 1. 本周热租榜 +``` +GET /api/rank/weekly +``` +返回 +```json +[ + { "title":"三体", "url":"...", "money":5, "number":12 }, + ... +] +``` + +#### 2. 本月热租榜 +``` +GET /api/rank/monthly +``` +结构同上 +