commit a2de21b09292329ecb5b5d6c4e71bc50f2bd8d52 Author: Cxx0822 <1556464090@qq.com> Date: Tue Jun 10 09:54:52 2025 +0800 feat: 移植工程 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea7f1ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +!**/logs/** diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..bf82ff0 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..ca5ab4b --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc59295 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +Ubuntu安装ftp服务器 +1. 安装 + sudo apt-get install vsftpd +2. 查看是否成功 + sudo systemctl status vsftpd +3. 编辑配置文件 + sudo gedit /etc/vsftpd.conf + + 启用本地用户:local_enable=YES + 允许上传文件:write_enable=YES + +4. 重启vsftpd + sudo systemctl restart vsftpd + +5. 如果需要 可以新增FTP用户,如ftp-user + sudo adduser ftp-user +6. 设置用户的访问目录权限 + // 是否设置用户的访问目录权限 + chroot_local_user=YES + // 是否指定用户列表文件 + chroot_list_enable=YES + // 用户列表文件 + chroot_list_file=/etc/vsftpd.chroot_list + 例如设置了YES YES,则除了vsftpd.chroot_list文件里面的用户都不能 + 切换目录访问其他文件。 +7. 设置/home/ftp-user的权限为555! 这里不能有写的权限,否则登录失败。 +8. 在/home/ftp-user下新建文件夹,注意要改成777的权限,否则会写失败。 + +中文乱码问题: +utf8_filesystem=YES +dirmessage_enable=YES +use_localtime=YES +xferlog_enable=YES +connect_from_port_20=YES +https://blog.csdn.net/u013345780/article/details/134325550?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-134325550-blog-51419630.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3 + +Logback、Fluency 和 OpenObserve 之间的关系如下: + +Logback:这是一个 Java 日志框架,负责在 Spring Boot 应用中生成和管理日志。它提供了灵活的配置选项,可以定义日志格式和输出目标。 +Fluency:这是一个轻量级的 Fluentd 客户端库,能够将日志数据从 Logback 发送到 Fluentd。它充当了中间层,将 Logback 生成的日志收集并转发给 Fluentd。 +OpenObserve:这是一个日志监控和分析平台,接收来自 Fluentd 的日志数据。OpenObserve 提供可视化界面,用于查看和分析这些日志。 + +工作流程 +Logback 生成日志。 +Fluency 将这些日志发送到 Fluency,并将其格式化为适合传输的形式。 +Fluency 将日志转发到 OpenObserve,允许用户在 OpenObserve 界面上查看和分析日志数据。 +这种组合提供了一个强大且灵活的日志管理和监控解决方案。 + + +安装在服务器的软件: +FTP文件服务器:vsftpd + diff --git a/admin-service/.gitignore b/admin-service/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/admin-service/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/admin-service/Dockerfile b/admin-service/Dockerfile new file mode 100644 index 0000000..94ced11 --- /dev/null +++ b/admin-service/Dockerfile @@ -0,0 +1,6 @@ +FROM docker-0.unsee.tech/openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY $JAR_FILE app.jar +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo 'Asia/Shanghai' > /etc/timezone +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/admin-service/pom.xml b/admin-service/pom.xml new file mode 100644 index 0000000..1f94e39 --- /dev/null +++ b/admin-service/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.cxx + sweet-hut-service + 2.0.0 + + + admin-service + 2.0.0 + + + 17 + 17 + UTF-8 + + + + + com.cxx + common + 2.0.0 + + + + + + + + + + + + com.github.oshi + oshi-core + 6.4.0 + + + + + com.influxdb + influxdb-client-java + 7.2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/AdminServiceApplication.java b/admin-service/src/main/java/com/cxx/admin/AdminServiceApplication.java new file mode 100644 index 0000000..0c9c2ed --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/AdminServiceApplication.java @@ -0,0 +1,15 @@ +package com.cxx.admin; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@MapperScan(basePackages = {"com.cxx.common.mapper", "com.cxx.admin.mapper", "com.cxx.admin.dao"}) +@EnableScheduling +public class AdminServiceApplication { + public static void main(String[] args) { + SpringApplication.run(AdminServiceApplication.class, args); + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/config/WebMvcConfig.java b/admin-service/src/main/java/com/cxx/admin/config/WebMvcConfig.java new file mode 100644 index 0000000..bb75df0 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/config/WebMvcConfig.java @@ -0,0 +1,31 @@ +package com.cxx.admin.config; + +import com.cxx.admin.constant.FileConstant; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @Author: Cxx + * @Date: 2024/9/22 10:57 + * @Description: + */ +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + @Value("${file.path}") + private String filePath; + + @Value("${file.log-path}") + private String logFilePath; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/" + FileConstant.FILE_URL_PREFIX + "/**") + .addResourceLocations("file:" + filePath); + + registry.addResourceHandler("/" + FileConstant.FILE_LOG_PREFIX + "/**") + .addResourceLocations("file:" + logFilePath); + } +} + diff --git a/admin-service/src/main/java/com/cxx/admin/constant/FileConstant.java b/admin-service/src/main/java/com/cxx/admin/constant/FileConstant.java new file mode 100644 index 0000000..6298a0c --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/constant/FileConstant.java @@ -0,0 +1,7 @@ +package com.cxx.admin.constant; + +public interface FileConstant { + String FILE_NAME_SPLIT = "_"; + String FILE_URL_PREFIX = "files"; + String FILE_LOG_PREFIX = "logs"; +} diff --git a/admin-service/src/main/java/com/cxx/admin/controller/AccountController.java b/admin-service/src/main/java/com/cxx/admin/controller/AccountController.java new file mode 100644 index 0000000..b0541a9 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/AccountController.java @@ -0,0 +1,48 @@ +package com.cxx.admin.controller; + +import com.cxx.admin.service.AccountService; +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.admin.dto.user.AccountDto; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/account") +@Tag(name = "账户管理") +public class AccountController { + @Resource + private AccountService accountService; + + @Operation(summary = "查询用户账号") + @GetMapping("") + public @JsonView(ReadView.class) List queryAccountList() { + return accountService.queryAccountList(); + } + + @Operation(summary = "注册账户") + @PostMapping("") + public Boolean registerAccount(@JsonView(WriteView.class) @Validated @RequestBody AccountDto accountDto) { + return accountService.registerAccount(accountDto); + } + + @Operation(summary = "注销账户") + @DeleteMapping("/{id}") + public Boolean deleteAccount(@PathVariable("id") Long id) { + return accountService.deleteAccount(id); + } + + @Operation(summary = "更改账户密码") + @PutMapping("/password/{id}") + public Boolean updateAccountPassword(@PathVariable("id") Long id, + @RequestParam String oldPassword, + @RequestParam String newPassword) { + return Boolean.TRUE; + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/controller/BillManageController.java b/admin-service/src/main/java/com/cxx/admin/controller/BillManageController.java new file mode 100644 index 0000000..994b929 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/BillManageController.java @@ -0,0 +1,58 @@ +package com.cxx.admin.controller; + +import com.cxx.admin.service.BillManageService; +import com.cxx.common.WriteView; +import com.cxx.common.dto.bill.BillCategoryDto; +import com.cxx.common.dto.bill.BillItemDto; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/bill-manage") +@Tag(name = "账单管理") +public class BillManageController { + @Resource + private BillManageService billManageService; + + @Operation(summary = "新增支付账户") + @PostMapping("/pay") + public Boolean addBillPay(@JsonView(WriteView.class) @RequestBody BillItemDto billItemDto) { + return billManageService.addBillPay(billItemDto); + } + + @Operation(summary = "更新支付账户") + @PutMapping("/pay/{id}") + public Boolean updateBillPay(@PathVariable("id") Long id, + @JsonView(WriteView.class) @RequestBody BillItemDto billItemDto) { + return billManageService.updateBillPay(id, billItemDto); + } + + @Operation(summary = "新增账本类型") + @PostMapping("/book") + public Boolean addBillBook(@JsonView(WriteView.class) @RequestBody BillItemDto billItemDto) { + return billManageService.addBillBook(billItemDto); + } + + @Operation(summary = "更新账本类型") + @PutMapping("/book/{id}") + public Boolean updateBillBook(@PathVariable("id") Long id, + @JsonView(WriteView.class) @RequestBody BillItemDto billItemDto) { + return billManageService.updateBillBook(id, billItemDto); + } + + @Operation(summary = "新增账单类型") + @PostMapping("/category") + public Boolean addBillCategory(@RequestBody BillCategoryDto billCategoryDto) { + return billManageService.addBillCategory(billCategoryDto); + } + + @Operation(summary = "更新账单类型") + @PutMapping("/category/{id}") + public Boolean updateBillCategory(@PathVariable("id") Long id, + @RequestBody BillCategoryDto billCategoryDto) { + return billManageService.updateBillCategory(id, billCategoryDto); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/controller/BlogManageController.java b/admin-service/src/main/java/com/cxx/admin/controller/BlogManageController.java new file mode 100644 index 0000000..3cdcfc6 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/BlogManageController.java @@ -0,0 +1,69 @@ +package com.cxx.admin.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.admin.service.BlogManageService; +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogVisitDto; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/blog-manage") +@Tag(name = "博客管理") +public class BlogManageController { + @Resource + private BlogManageService blogManageService; + + @Operation(summary = "分页查询博客") + @GetMapping("/page") + public IPage queryBlogByPage(@RequestParam("currentPage") Integer currentPage, + @RequestParam("pageSize") Integer pageSize) { + return blogManageService.queryBlogByPage(currentPage, pageSize); + } + + @Operation(summary = "查询博客内容") + @GetMapping("/content/{id}") + public @JsonView(ReadView.class) BlogDto queryBlogById(@PathVariable("id") long id) { + return blogManageService.queryBlogById(id); + } + + @Operation(summary = "查询博客分类") + @GetMapping("/category") + public List queryBlogCategory() { + return blogManageService.queryBlogCategory(); + } + + @Operation(summary = "增加博客") + @PostMapping("") + public Boolean addBlog(@JsonView(WriteView.class) @RequestBody BlogDto blog) { + return blogManageService.addBlog(blog); + } + + @Operation(summary = "更新博客") + @PutMapping("/{id}") + public Boolean updateBlog(@PathVariable("id") long id, + @JsonView(WriteView.class) @RequestBody BlogDto blog) { + return blogManageService.updateBlog(id, blog); + } + + @Operation(summary = "删除博客") + @DeleteMapping("/{id}") + public Boolean deleteBlog(@PathVariable("id") long id) { + return blogManageService.deleteBlog(id); + } + + @Operation(summary = "查询博客访问") + @GetMapping("/visit") + public IPage queryBlogVisit(@RequestParam("currentPage") Integer currentPage, + @RequestParam("pageSize") Integer pageSize) { + return blogManageService.queryBlogVisit(currentPage, pageSize); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/controller/BudgetManageController.java b/admin-service/src/main/java/com/cxx/admin/controller/BudgetManageController.java new file mode 100644 index 0000000..432f85c --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/BudgetManageController.java @@ -0,0 +1,27 @@ +package com.cxx.admin.controller; + +import com.cxx.admin.service.BudgetManageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/budget-manage") +@Tag(name = "预算管理") +public class BudgetManageController { + @Resource + private BudgetManageService budgetManageService; + + @Operation(summary = "新增预算类别") + @PostMapping("/category") + public Boolean addBudgetCategory(@RequestParam String category) { + return budgetManageService.addBudgetCategory(category); + } + + @Operation(summary = "更新预算类别") + @PutMapping("/category/{id}") + public Boolean updateBudgetCategory(@PathVariable("id") Long id, @RequestParam String category) { + return budgetManageService.updateBudgetCategory(id, category); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/controller/FileController.java b/admin-service/src/main/java/com/cxx/admin/controller/FileController.java new file mode 100644 index 0000000..92a9f53 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/FileController.java @@ -0,0 +1,65 @@ +package com.cxx.admin.controller; + +import com.cxx.admin.dto.file.ChunkInfoDto; +import com.cxx.admin.dto.file.ChunkResultDto; +import com.cxx.admin.dto.file.FileInfoDto; +import com.cxx.admin.service.FileService; +import com.cxx.admin.dto.file.FileRecordDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@RestController +@RequestMapping("/file") +@Tag(name = "文件管理") +public class FileController { + @Resource + private FileService fileService; + + @Operation(summary = "上传文件") + @PostMapping(value = "", headers = "content-type=multipart/form-data") + public FileRecordDto uploadFile(@RequestPart("file") MultipartFile file, + @RequestParam("path") String path, + @RequestParam("md5") String md5) { + return fileService.uploadFile(file, path, md5); + } + + @Operation(summary = "上传文件块") + @PostMapping("/chunk") + public Boolean uploadChunk(ChunkInfoDto chunkInfo, + String path) { + return fileService.uploadChunk(chunkInfo, path); + } + + @Operation(summary = "验证当前文件块是否上传") + @GetMapping("/chunk") + public ChunkResultDto checkChunk(@RequestParam String identifier, + @RequestParam String filename, + @RequestParam String path) { + return fileService.checkChunk(identifier, filename, path); + } + + @Operation(summary = "删除当前已上传的文件块") + @DeleteMapping("/chunk") + public Boolean deleteChunk(@RequestParam String identifier, + @RequestParam String path) { + return fileService.deleteChunk(identifier, path); + } + + @Operation(summary = "合并文件") + @PostMapping("/chunk/merge") + public FileRecordDto mergeFile(@RequestParam String filename, + @RequestParam String path) { + return fileService.mergeFile(filename, path); + } + + @Operation(summary = "获取文件夹目录") + @GetMapping("/catalog") + public List getFolderInfo(@RequestParam String folderName) { + return fileService.getFolderInfo(folderName); + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/controller/ServerMonitorController.java b/admin-service/src/main/java/com/cxx/admin/controller/ServerMonitorController.java new file mode 100644 index 0000000..baa27d5 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/ServerMonitorController.java @@ -0,0 +1,30 @@ +package com.cxx.admin.controller; + +import com.cxx.admin.dto.server.*; +import com.cxx.admin.service.ServerMonitorService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/server-monitor") +@Tag(name = "服务器监控") +public class ServerMonitorController { + @Resource + private ServerMonitorService serverMonitorService; + + @Operation(summary = "系统信息") + @GetMapping("/system/info") + public SystemInfoDto getSystemInfo() { + return serverMonitorService.getSystemInfo(); + } + + @Operation(summary = "系统指标") + @GetMapping("/system/metrics") + public List querySystemMetrics(@RequestParam String range) { + return serverMonitorService.querySystemMetrics(range); + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/controller/SessionController.java b/admin-service/src/main/java/com/cxx/admin/controller/SessionController.java new file mode 100644 index 0000000..f4a55c3 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/SessionController.java @@ -0,0 +1,23 @@ +package com.cxx.admin.controller; + +import com.cxx.common.dto.user.SessionDto; +import com.cxx.admin.service.SessionService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/session") +@Tag(name = "会话管理") +public class SessionController { + @Resource + private SessionService sessionService; + + @Operation(summary = "创建会话") + @PostMapping("") + public SessionDto createSession(@RequestParam String name, + @RequestParam String password) { + return sessionService.create(name, password); + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/controller/UserController.java b/admin-service/src/main/java/com/cxx/admin/controller/UserController.java new file mode 100644 index 0000000..7079633 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/UserController.java @@ -0,0 +1,33 @@ +package com.cxx.admin.controller; + +import com.cxx.admin.service.UserService; +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.common.dto.user.UserDto; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/user") +@Tag(name = "用户管理") +public class UserController { + @Resource + private UserService userService; + + @Operation(summary = "查询用户") + @GetMapping("/{id}") + public @JsonView(ReadView.class) UserDto queryUser(@PathVariable("id") Long id) { + return userService.queryUser(id); + } + + @Operation(summary = "更新用户") + @PutMapping("/{id}") + public Boolean updateUser(@PathVariable("id") Long id, + @JsonView(WriteView.class) @Validated @RequestBody UserDto userDto) { + return userService.updateUser(id, userDto); + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/controller/WeChatController.java b/admin-service/src/main/java/com/cxx/admin/controller/WeChatController.java new file mode 100644 index 0000000..119ff6f --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/controller/WeChatController.java @@ -0,0 +1,19 @@ +package com.cxx.admin.controller; + + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/wechat") +@Tag(name = "微信管理") +public class WeChatController { + + @Operation(summary = "获取code") + @GetMapping("/code") + public Boolean getWeChatAuthCode(@RequestParam("code") String code) { + System.out.println(code); + return Boolean.TRUE; + } +} \ No newline at end of file diff --git a/admin-service/src/main/java/com/cxx/admin/dao/AccountDao.java b/admin-service/src/main/java/com/cxx/admin/dao/AccountDao.java new file mode 100644 index 0000000..e46f282 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dao/AccountDao.java @@ -0,0 +1,12 @@ +package com.cxx.admin.dao; + +import com.cxx.admin.dto.user.AccountDto; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + + +@Mapper +public interface AccountDao { + List queryAccount(); +} diff --git a/admin-service/src/main/java/com/cxx/admin/dao/BlogDao.java b/admin-service/src/main/java/com/cxx/admin/dao/BlogDao.java new file mode 100644 index 0000000..6060e8f --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dao/BlogDao.java @@ -0,0 +1,24 @@ +package com.cxx.admin.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogVisitDto; +import com.cxx.common.entity.Blog; +import com.cxx.common.vo.blog.BlogQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + + +@Mapper +public interface BlogDao { + IPage queryBlogByPage(IPage page); + + BlogDto queryBlogById(@Param("id") Long id); + + List queryBlogCategory(); + + IPage queryBlogVisit(IPage page); +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/FtpInfo.java b/admin-service/src/main/java/com/cxx/admin/dto/FtpInfo.java new file mode 100644 index 0000000..26cbc0c --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/FtpInfo.java @@ -0,0 +1,23 @@ +package com.cxx.admin.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author: Cxx + * @Date: 2024/9/24 22:41 + * @Description: + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FtpInfo { + private String ftpIp; + + private Integer ftpPort; + + private String ftpUsername; + + private String ftpPassword; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/file/ChunkInfoDto.java b/admin-service/src/main/java/com/cxx/admin/dto/file/ChunkInfoDto.java new file mode 100644 index 0000000..955f901 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/file/ChunkInfoDto.java @@ -0,0 +1,22 @@ +package com.cxx.admin.dto.file; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.web.multipart.MultipartFile; + +@Getter +@Setter +public class ChunkInfoDto { + /** + * 当前文件块,从1开始 + */ + private Integer chunkNumber; + /** + * 文件名 + */ + private String filename; + /** + * 块内容 + */ + private transient MultipartFile multipartFile; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/file/ChunkResultDto.java b/admin-service/src/main/java/com/cxx/admin/dto/file/ChunkResultDto.java new file mode 100644 index 0000000..a44625a --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/file/ChunkResultDto.java @@ -0,0 +1,20 @@ +package com.cxx.admin.dto.file; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ChunkResultDto { + /** + * 是否跳过上传(已上传的可以直接跳过,达到秒传的效果) + */ + private boolean isSkipUpload; + + /** + * 已经上传的文件块编号,可以跳过,断点续传 + */ + private List uploadedChunkList; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/file/FileInfoDto.java b/admin-service/src/main/java/com/cxx/admin/dto/file/FileInfoDto.java new file mode 100644 index 0000000..a57d2f5 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/file/FileInfoDto.java @@ -0,0 +1,17 @@ +package com.cxx.admin.dto.file; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class FileInfoDto { + private String name; + private String type; + private String size; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createDate; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/file/FileRecordDto.java b/admin-service/src/main/java/com/cxx/admin/dto/file/FileRecordDto.java new file mode 100644 index 0000000..daa9548 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/file/FileRecordDto.java @@ -0,0 +1,14 @@ +package com.cxx.admin.dto.file; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class FileRecordDto { + private Long id; + private String name; + private String md5; + private String path; + private String url; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/server/CpuDto.java b/admin-service/src/main/java/com/cxx/admin/dto/server/CpuDto.java new file mode 100644 index 0000000..7abc32d --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/server/CpuDto.java @@ -0,0 +1,10 @@ +package com.cxx.admin.dto.server; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CpuDto { + private double usagePercent; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/server/DiskDto.java b/admin-service/src/main/java/com/cxx/admin/dto/server/DiskDto.java new file mode 100644 index 0000000..e99406b --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/server/DiskDto.java @@ -0,0 +1,13 @@ +package com.cxx.admin.dto.server; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class DiskDto { + private double total; + private double used; + private double free; + private double usagePercent; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/server/MemoryDto.java b/admin-service/src/main/java/com/cxx/admin/dto/server/MemoryDto.java new file mode 100644 index 0000000..4b5ef8d --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/server/MemoryDto.java @@ -0,0 +1,13 @@ +package com.cxx.admin.dto.server; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MemoryDto { + private double total; + private double used; + private double free; + private double usagePercent; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/server/SystemInfoDto.java b/admin-service/src/main/java/com/cxx/admin/dto/server/SystemInfoDto.java new file mode 100644 index 0000000..317ca4b --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/server/SystemInfoDto.java @@ -0,0 +1,24 @@ +package com.cxx.admin.dto.server; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class SystemInfoDto { + // CPU信息 + private String cpuName; + private String cpuVendor; + private int cpuLogicalCores; + private int cpuPhysicalCores; + private double cpuSystemLoad; + // 操作系统信息 + private String osFamily; + private String osVersion; + private String osManufacturer; + // 系统运行时间 + private long systemUptime; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/server/SystemMetricsDto.java b/admin-service/src/main/java/com/cxx/admin/dto/server/SystemMetricsDto.java new file mode 100644 index 0000000..9ac8396 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/server/SystemMetricsDto.java @@ -0,0 +1,24 @@ +package com.cxx.admin.dto.server; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class SystemMetricsDto { + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date time; + + private double cpuUsage; + private double memoryTotal; + private double memoryUsed; + private double memoryFree; + private double memoryUsage; + private double diskTotal; + private double diskUsed; + private double diskFree; + private double diskUsage; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/user/AccountDto.java b/admin-service/src/main/java/com/cxx/admin/dto/user/AccountDto.java new file mode 100644 index 0000000..07c9604 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/user/AccountDto.java @@ -0,0 +1,42 @@ +package com.cxx.admin.dto.user; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class AccountDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "账户名称") + @NotBlank(message = "账户名称不能为空") + private String accountName; + + @Schema(description = "密码") + @NotBlank(message = "密码不能为空") + private String password; + + @Schema(description = "用户名称") + @NotBlank(message = "用户名称不能为空") + private String username; + + @Schema(description = "账户状态") + @JsonView(ReadView.class) + private Integer state; + + @Schema(description = "创建日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + @JsonView(ReadView.class) + private Date date; +} diff --git a/admin-service/src/main/java/com/cxx/admin/dto/user/UserSummaryDto.java b/admin-service/src/main/java/com/cxx/admin/dto/user/UserSummaryDto.java new file mode 100644 index 0000000..14686a2 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/dto/user/UserSummaryDto.java @@ -0,0 +1,36 @@ +package com.cxx.admin.dto.user; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@JsonView(PlainView.class) +public class UserSummaryDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "id") + @JsonView(ReadView.class) + private String accountName; + + @Schema(description = "用户名称") + @NotBlank(message = "用户名称不能为空") + private String username; + + @Schema(description = "账户状态") + private Integer state; + + @Schema(description = "创建日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private LocalDateTime date; +} diff --git a/admin-service/src/main/java/com/cxx/admin/schedule/ServerMonitor.java b/admin-service/src/main/java/com/cxx/admin/schedule/ServerMonitor.java new file mode 100644 index 0000000..277a69f --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/schedule/ServerMonitor.java @@ -0,0 +1,21 @@ +package com.cxx.admin.schedule; + +import com.cxx.admin.service.ServerMonitorService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + + +@Component +@Slf4j +public class ServerMonitor { + @Resource + private ServerMonitorService serverMonitorService; + + // @Scheduled(fixedRate = 60000) + public void collectAndStoreMetrics() { + log.info("开始存储服务器状态"); + serverMonitorService.storeSystemMetrics(); + log.info("结束存储服务器状态"); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/AccountService.java b/admin-service/src/main/java/com/cxx/admin/service/AccountService.java new file mode 100644 index 0000000..c6a8f95 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/AccountService.java @@ -0,0 +1,17 @@ +package com.cxx.admin.service; + + +import com.cxx.admin.dto.user.AccountDto; +import com.cxx.common.entity.Account; + +import java.util.List; + +public interface AccountService { + List queryAccountList(); + + Account queryAccountByUserId(Long userId); + + Boolean registerAccount(AccountDto accountDto); + + Boolean deleteAccount(Long id); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/BillManageService.java b/admin-service/src/main/java/com/cxx/admin/service/BillManageService.java new file mode 100644 index 0000000..f981594 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/BillManageService.java @@ -0,0 +1,18 @@ +package com.cxx.admin.service; + +import com.cxx.common.dto.bill.BillCategoryDto; +import com.cxx.common.dto.bill.BillItemDto; + +public interface BillManageService { + Boolean addBillPay(BillItemDto billItemDto); + + Boolean updateBillPay(Long id, BillItemDto billItemDto); + + Boolean addBillBook(BillItemDto billItemDto); + + Boolean updateBillBook(Long id,BillItemDto billItemDto); + + Boolean addBillCategory(BillCategoryDto billCategoryDto); + + Boolean updateBillCategory(Long id, BillCategoryDto billCategoryDto); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/BlogManageService.java b/admin-service/src/main/java/com/cxx/admin/service/BlogManageService.java new file mode 100644 index 0000000..6d38c9b --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/BlogManageService.java @@ -0,0 +1,25 @@ +package com.cxx.admin.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogVisitDto; +import com.cxx.common.vo.blog.BlogQueryVo; + +import java.util.List; + +public interface BlogManageService { + IPage queryBlogByPage(Integer currentPage, Integer pageSize); + + BlogDto queryBlogById(Long id); + + List queryBlogCategory(); + + Boolean addBlog(BlogDto blog); + + Boolean updateBlog(Long id, BlogDto blog); + + Boolean deleteBlog(Long id); + + IPage queryBlogVisit(Integer currentPage, Integer pageSize); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/BudgetManageService.java b/admin-service/src/main/java/com/cxx/admin/service/BudgetManageService.java new file mode 100644 index 0000000..37c19f6 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/BudgetManageService.java @@ -0,0 +1,8 @@ +package com.cxx.admin.service; + + +public interface BudgetManageService { + Boolean addBudgetCategory(String category); + + Boolean updateBudgetCategory(Long id, String category); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/FileService.java b/admin-service/src/main/java/com/cxx/admin/service/FileService.java new file mode 100644 index 0000000..2bd9148 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/FileService.java @@ -0,0 +1,48 @@ +package com.cxx.admin.service; + +import com.cxx.admin.dto.file.ChunkInfoDto; +import com.cxx.admin.dto.file.ChunkResultDto; +import com.cxx.admin.dto.file.FileInfoDto; +import com.cxx.admin.dto.file.FileRecordDto; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +public interface FileService { + FileRecordDto uploadFile(MultipartFile file, String path, String md5); + + /** + * 上传文件块 + * @param chunkInfo 文件块信息 + * @param path 上传路径 + * @return 是否上传成功 + */ + Boolean uploadChunk(ChunkInfoDto chunkInfo, String path); + + /** + * 检查文件块信息 + * @param identifier 唯一标识 + * @param filename 文件名 + * @param path 上传文件夹路径 + * @return 检查结果 + */ + ChunkResultDto checkChunk(String identifier, String filename, String path); + + /** + * 删除文件块 + * @param identifier 唯一标识 + * @param path 上传文件夹路径 + * @return 是否删除成功 + */ + Boolean deleteChunk(String identifier, String path); + + /** + * 合并文件 + * @param filename 文件名 + * @param path 上传文件夹路径 + * @return 是否合并成功 + */ + FileRecordDto mergeFile(String filename, String path); + + List getFolderInfo(String folderName); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/ServerMonitorService.java b/admin-service/src/main/java/com/cxx/admin/service/ServerMonitorService.java new file mode 100644 index 0000000..fc571a8 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/ServerMonitorService.java @@ -0,0 +1,19 @@ +package com.cxx.admin.service; + +import com.cxx.admin.dto.server.*; + +import java.util.List; + +public interface ServerMonitorService { + CpuDto getCpuInfo(); + + MemoryDto getMemoryInfo(); + + DiskDto getDiskInfo(); + + SystemInfoDto getSystemInfo(); + + void storeSystemMetrics(); + + List querySystemMetrics(String range) ; +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/SessionService.java b/admin-service/src/main/java/com/cxx/admin/service/SessionService.java new file mode 100644 index 0000000..56db9fb --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/SessionService.java @@ -0,0 +1,7 @@ +package com.cxx.admin.service; + +import com.cxx.common.dto.user.SessionDto; + +public interface SessionService { + SessionDto create(String name, String password); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/UserService.java b/admin-service/src/main/java/com/cxx/admin/service/UserService.java new file mode 100644 index 0000000..4adaec8 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/UserService.java @@ -0,0 +1,10 @@ +package com.cxx.admin.service; + + +import com.cxx.common.dto.user.UserDto; + +public interface UserService { + UserDto queryUser(Long id); + + Boolean updateUser(Long id, UserDto userDto); +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/AccountServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/AccountServiceImpl.java new file mode 100644 index 0000000..331dd15 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/AccountServiceImpl.java @@ -0,0 +1,84 @@ +package com.cxx.admin.service.impl; + + +import cn.dev33.satoken.secure.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.admin.dao.AccountDao; +import com.cxx.admin.service.AccountService; +import com.cxx.admin.dto.user.AccountDto; +import com.cxx.common.entity.Account; +import com.cxx.common.entity.User; +import com.cxx.common.mapper.AccountMapper; +import com.cxx.common.mapper.UserMapper; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + + +@Service +public class AccountServiceImpl implements AccountService { + @Resource + private AccountDao accountDao; + + @Resource + private AccountMapper accountMapper; + + @Resource + private UserMapper userMapper; + + @Override + public List queryAccountList() { + return accountDao.queryAccount(); + } + + @Override + public Account queryAccountByUserId(Long userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + return accountMapper.selectOne(queryWrapper.eq(Account::getUserId, userId)); + } + + @Transactional + @Override + public Boolean registerAccount(AccountDto accountDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (accountMapper.exists(queryWrapper.eq(Account::getAccountName, accountDto.getAccountName()))) { + throw new CustomException("该账户已经存在"); + } + + LambdaQueryWrapper userQueryWrapper = new LambdaQueryWrapper<>(); + if (userMapper.exists(userQueryWrapper.eq(User::getUsername, accountDto.getUsername()))) { + throw new CustomException("该用户已注册"); + } + + List results = new ArrayList<>(); + User user = new User(); + BeanUtils.copyProperties(accountDto, user); + results.add(userMapper.insert(user)); + + Account account = new Account(); + account.setAccountName(accountDto.getAccountName()); + account.setPassword(BCrypt.hashpw(accountDto.getPassword(), BCrypt.gensalt())); + account.setUserId(user.getId()); + account.setState(0); + results.add(accountMapper.insert(account)); + + return results.stream().allMatch(x -> x > 0); + } + + @Override + public Boolean deleteAccount(Long id) { + Account account = accountMapper.selectById(id); + + if (account == null) { + throw new CustomException("该账号不存在"); + } + + accountMapper.deleteById(id); + return userMapper.deleteById(account.getUserId()) == 1; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/BillManageServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/BillManageServiceImpl.java new file mode 100644 index 0000000..905e2f5 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/BillManageServiceImpl.java @@ -0,0 +1,134 @@ +package com.cxx.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.admin.service.BillManageService; +import com.cxx.common.dto.bill.BillCategoryDto; +import com.cxx.common.dto.bill.BillItemDto; +import com.cxx.common.entity.BillBook; +import com.cxx.common.entity.BillCategory; +import com.cxx.common.entity.BillPay; +import com.cxx.common.mapper.BillBookMapper; +import com.cxx.common.mapper.BillCategoryMapper; +import com.cxx.common.mapper.BillPayMapper; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +@Service +public class BillManageServiceImpl implements BillManageService { + @Resource + private BillPayMapper billPayMapper; + + @Resource + private BillBookMapper billBookMapper; + + @Resource + private BillCategoryMapper billCategoryMapper; + + @Override + public Boolean addBillPay(BillItemDto billItemDto) { + // 1. 校验是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (billPayMapper.exists(queryWrapper.eq(BillPay::getName, billItemDto.getName()))) { + throw new CustomException("该账户已经存在"); + } + + // 2. 新增账户 + BillPay newbillPay = new BillPay(); + BeanUtils.copyProperties(billItemDto, newbillPay); + + return billPayMapper.insert(newbillPay) == 1; + } + + @Override + public Boolean updateBillPay(Long id, BillItemDto billItemDto) { + // 1. 校验是否存在 + if (Objects.isNull(billPayMapper.selectById(id))) { + throw new RuntimeException("该账户不存在"); + } + + // 2. 更新账户 + BillPay billPay = new BillPay(); + BeanUtils.copyProperties(billItemDto, billPay); + billPay.setId(id); + + return billPayMapper.updateById(billPay) == 1; + } + + @Override + public Boolean addBillBook(BillItemDto billItemDto) { + // 1. 校验是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (billBookMapper.exists(queryWrapper.eq(BillBook::getName, billItemDto.getName()))) { + throw new CustomException("该账本已经存在"); + } + + // 2. 新增账本 + BillBook billBook = new BillBook(); + BeanUtils.copyProperties(billItemDto, billBook); + + return billBookMapper.insert(billBook) == 1; + } + + @Override + public Boolean updateBillBook(Long id, BillItemDto billItemDto) { + // 1. 校验是否存在 + if (Objects.isNull(billBookMapper.selectById(id))) { + throw new CustomException("该账单不存在"); + } + + // 2. 更新账本 + BillBook billBook = new BillBook(); + BeanUtils.copyProperties(billItemDto, billBook); + billBook.setId(id); + + return billBookMapper.updateById(billBook) == 1; + } + + private Long getBillBook(String name) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BillBook::getName, name); + BillBook billBook = billBookMapper.selectOne(queryWrapper); + + if (Objects.isNull(billBook)) { + throw new CustomException("该账本类型不存在"); + } + + return billBook.getId(); + } + + @Override + public Boolean addBillCategory(BillCategoryDto billCategoryDto) { + // 1. 校验是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (billCategoryMapper.exists(queryWrapper.eq(BillCategory::getName, billCategoryDto.getName()))) { + throw new CustomException("该账单类型已经存在"); + } + + // 2. 新增账单类型 + BillCategory newBillCategory = new BillCategory(); + BeanUtils.copyProperties(billCategoryDto, newBillCategory); + newBillCategory.setBookId(getBillBook(billCategoryDto.getBookName())); + + return billCategoryMapper.insert(newBillCategory) == 1; + } + + @Override + public Boolean updateBillCategory(Long id, BillCategoryDto billCategoryDto) { + // 1. 校验是否存在 + if (Objects.isNull(billCategoryMapper.selectById(id))) { + throw new CustomException("该账单类型不存在"); + } + + // 2. 更新账单类型 + BillCategory billCategory = new BillCategory(); + BeanUtils.copyProperties(billCategoryDto, billCategory); + billCategory.setBookId(getBillBook(billCategoryDto.getBookName())); + billCategory.setId(id); + + return billCategoryMapper.updateById(billCategory) == 1; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/BlogManageServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/BlogManageServiceImpl.java new file mode 100644 index 0000000..6379228 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/BlogManageServiceImpl.java @@ -0,0 +1,193 @@ +package com.cxx.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cxx.admin.dao.BlogDao; +import com.cxx.admin.service.BlogManageService; +import com.cxx.admin.util.BlogUtils; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogVisitDto; +import com.cxx.common.entity.Blog; +import com.cxx.common.entity.BlogCategory; +import com.cxx.common.entity.BlogContent; +import com.cxx.common.mapper.BlogCategoryMapper; +import com.cxx.common.mapper.BlogContentMapper; +import com.cxx.common.mapper.BlogMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; + +@Service +public class BlogManageServiceImpl implements BlogManageService { + @Resource + private BlogDao blogDao; + + @Resource + private BlogMapper blogMapper; + + @Resource + private BlogCategoryMapper categoryMapper; + + @Resource + private BlogContentMapper contentMapper; + + @Override + public IPage queryBlogByPage(Integer currentPage, Integer pageSize) { + return blogDao.queryBlogByPage(new Page<>(currentPage, pageSize)); + } + + @Override + public BlogDto queryBlogById(Long id) { + return blogDao.queryBlogById(id); + } + + @Override + public List queryBlogCategory() { + return blogDao.queryBlogCategory(); + } + + @Transactional + @Override + public Boolean addBlog(BlogDto blogDto) { + // 1. 新增博客基本信息 + Blog blog = saveOrUpdateNewBlog(blogDto); + // 2. 新增博客内容信息 + blog.setContentId(addBlogContent(blogDto.getContent())); + // 3. 插入数据库 + return blogMapper.insert(blog) == 1; + } + + @Transactional + @Override + public Boolean updateBlog(Long id, BlogDto blogDto) { + Blog blog = saveOrUpdateNewBlog(blogDto); + blog.setId(id); + // 1. 更新博客内容信息 + updateBlogContent(getBlogById(id).getContentId(), blogDto.getContent()); + // 2. 校验是否删除博客类别 + deleteBlogCategory(getBlogById(id).getCategoryId()); + // 3. 更新数据库 + return blogMapper.updateById(blog) == 1; + } + + @Transactional + @Override + public Boolean deleteBlog(Long id) { + // 1. 删除博客类别 + deleteBlogCategory(getBlogById(id).getCategoryId()); + // 2. 删除博客内容 + contentMapper.deleteById(getBlogById(id).getContentId()); + // 3. 删除博客 + return blogMapper.deleteById(id) == 1; + } + + @Override + public IPage queryBlogVisit(Integer currentPage, Integer pageSize) { + return blogDao.queryBlogVisit(new Page<>(currentPage, pageSize)); + } + + /** + * 通过博客id获取博客 + * @param id id + * @return 博客 + */ + private Blog getBlogById(Long id) { + Blog blog = blogMapper.selectById(id); + + if (Objects.isNull(blog)) { + throw new RuntimeException("暂无该博客"); + } + + return blog; + } + + /** + * 增加/更新 博客 + * @param blogDto 前端传入的博客内容 + * @return 博客 + */ + private Blog saveOrUpdateNewBlog(BlogDto blogDto) { + Blog newBlog = new Blog(); + + // 设置博客基础信息 + newBlog.setTitle(blogDto.getTitle()); + newBlog.setTopValue(blogDto.getTopValue()); + newBlog.setIsGreat(blogDto.getIsGreat()); + + // 设置博客类别 + newBlog.setCategoryId(saveOrUpdateBlogCategory(blogDto.getCategory())); + + // 设置博客内容 + newBlog.setSummary(BlogUtils.getBlogSummary(blogDto.getContent())); + + // 设置博客字数统计 + Integer wordCount = BlogUtils.getWordCount(blogDto.getContent()); + newBlog.setWordCount(wordCount); + newBlog.setReadDuration(BlogUtils.getReadDuration(wordCount)); + + return newBlog; + } + + /** + * 设置博客类别 + * @param category 类别 + * @return 类别id + */ + private Long saveOrUpdateBlogCategory(String category) { + // 1. 查找类别是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + BlogCategory blogCategory = categoryMapper.selectOne(queryWrapper.eq(BlogCategory::getName, category)); + + // 2. 如果存在则返回id 否则需要新增类别 + if (Objects.isNull(blogCategory)) { + BlogCategory newBlogCategory = new BlogCategory(); + newBlogCategory.setName(category); + categoryMapper.insert(newBlogCategory); + return newBlogCategory.getId(); + } else { + return blogCategory.getId(); + } + } + + /** + * 判断是否需要删除博客类别 + * @param categoryId 博客类别id + */ + private void deleteBlogCategory(Long categoryId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (!blogMapper.exists(queryWrapper.eq(Blog::getCategoryId, categoryId))) { + // 如果没有该类别的博客 则删除博客类别 + categoryMapper.deleteById(categoryId); + } + } + + /** + * 新增博客内容 + * @param content 博客内容 + * @return 博客内容id + */ + private Long addBlogContent(String content) { + BlogContent blogContent = new BlogContent(); + blogContent.setContent(content); + contentMapper.insert(blogContent); + + return blogContent.getId(); + } + + /** + * 更新博客内容 + * @param contentId 博客内容id + * @param content 博客内容 + */ + private void updateBlogContent(Long contentId, String content) { + BlogContent blogContent = new BlogContent(); + blogContent.setContent(content); + blogContent.setId(contentId); + contentMapper.updateById(blogContent); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/BudgetManageServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/BudgetManageServiceImpl.java new file mode 100644 index 0000000..e858e4c --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/BudgetManageServiceImpl.java @@ -0,0 +1,43 @@ +package com.cxx.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.admin.service.BudgetManageService; +import com.cxx.common.entity.BudgetCategory; +import com.cxx.common.mapper.BudgetCategoryMapper; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +@Service +public class BudgetManageServiceImpl implements BudgetManageService { + @Resource + private BudgetCategoryMapper budgetCategoryMapper; + + + @Override + public Boolean addBudgetCategory(String category) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (budgetCategoryMapper.exists(queryWrapper.eq(BudgetCategory::getName, category))) { + throw new CustomException("该预算类别已存在"); + } + + BudgetCategory budgetCategory = new BudgetCategory(); + budgetCategory.setName(category); + return budgetCategoryMapper.insert(budgetCategory) == 1; + } + + @Override + public Boolean updateBudgetCategory(Long id, String category) { + if (Objects.isNull(budgetCategoryMapper.selectById(id))) { + throw new CustomException("该预算类别不存在"); + } + + BudgetCategory budgetCategory = new BudgetCategory(); + budgetCategory.setId(id); + budgetCategory.setName(category); + + return budgetCategoryMapper.updateById(budgetCategory) == 1; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/FileServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..804940f --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/FileServiceImpl.java @@ -0,0 +1,204 @@ +package com.cxx.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cxx.admin.constant.FileConstant; +import com.cxx.admin.dto.file.ChunkInfoDto; +import com.cxx.admin.dto.file.ChunkResultDto; +import com.cxx.admin.dto.file.FileInfoDto; +import com.cxx.admin.service.FileService; +import com.cxx.admin.dto.file.FileRecordDto; +import com.cxx.admin.util.FileUtils; +import com.cxx.admin.util.UploadFileUtil; +import com.cxx.common.entity.FileRecord; +import com.cxx.common.mapper.FileRecordMapper; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + + +@Service +@Slf4j +public class FileServiceImpl implements FileService { + @Value("${file.path}") + private String fileRootPath; + + @Resource + private FileRecordMapper fileRecordMapper; + + @Override + public FileRecordDto uploadFile(MultipartFile multipartFile, String path, String md5) { + UploadFileUtil.checkDirIsExist(getFilePath(path)); + + String filename = multipartFile.getOriginalFilename(); + String newPath = path + File.separator + md5 + "." + FilenameUtils.getExtension(filename); + File newFile = new File(getFilePath(newPath)); + + saveFile(multipartFile, newFile); + + // 这里的url需要加上 WebMvcConfig 中设置的前缀 + String url = FileConstant.FILE_URL_PREFIX + File.separator + newPath; + return getFileRecord(filename, md5, path, url); + } + + @Override + public Boolean uploadChunk(ChunkInfoDto chunkInfo, String path) { + MultipartFile file = chunkInfo.getMultipartFile(); + + try { + // 1. 校验路径是否存在 + UploadFileUtil.checkDirIsExist(getFilePath(path)); + // 2. 获取文件块路径 + Path chunkPath = Paths.get(UploadFileUtil.generateChunkPath(getFilePath(path), chunkInfo)); + // 3. 将文件块写入指定路径 + Files.write(chunkPath, file.getBytes()); + } catch (IOException exception) { + log.error("文件上传块失败: {}", exception.getMessage()); + throw new CustomException("文件上传块失败: " + exception.getMessage()); + } + + return true; + } + + @Override + public ChunkResultDto checkChunk(String identifier, String filename, String path) { + ChunkResultDto chunkResult = new ChunkResultDto(); + List uploadedChunkList = new ArrayList<>(); + + String folder = getFilePath(path) + File.separator + identifier; + String file = folder + File.separator + filename; + + // 判断文件夹是否存在 + if (UploadFileUtil.fileExists(folder)) { + // 先判断整个文件是否已经上传过了,如果是,则告诉前端跳过上传,实现秒传 + if (UploadFileUtil.fileExists(file)) { + chunkResult.setSkipUpload(true); + chunkResult.setUploadedChunkList(uploadedChunkList); + log.info("完整文件已存在,直接跳过上传,实现秒传"); + } else { + chunkResult.setSkipUpload(false); + // 获取已经上传的文件块 + chunkResult.setUploadedChunkList(UploadFileUtil.getUploadedChunkList(folder, filename)); + } + } else { + chunkResult.setSkipUpload(false); + chunkResult.setUploadedChunkList(uploadedChunkList); + } + + return chunkResult; + } + + @Override + public Boolean deleteChunk(String identifier, String path) { + String folder = getFilePath(path) + File.separator + identifier; + log.info("开始删除文件: " + folder); + + // 判断文件夹是否存在 + if (UploadFileUtil.fileExists(folder)) { + UploadFileUtil.deleteDirectory(folder); + } else { + throw new CustomException("文件: " + folder + "不存在"); + } + + return true; + } + + @Override + public FileRecordDto mergeFile(String filename, String path) { + String uuid = UUID.randomUUID().toString().replace("-", ""); + String newFilename = uuid + "." + FilenameUtils.getExtension(filename); + try { + UploadFileUtil.mergeFile(newFilename, getFilePath(path)); + } catch (IOException exception) { + throw new CustomException("合并文件: " + filename + " 失败"); + } + + String newPath = path + File.separator + newFilename; + String url = FileConstant.FILE_URL_PREFIX + File.separator + newPath; + return getFileRecord(filename, uuid, path, url); + } + + @Override + public List getFolderInfo(String folderName) { + File folder = new File(folderName); + List fileInfoList = new ArrayList<>(); + if (folder.exists() && folder.isDirectory()) { + File[] files = folder.listFiles(); + if (files != null) { + List folderInfoList = new ArrayList<>(); + List fileInfoSubList = new ArrayList<>(); + for (File file : files) { + FileInfoDto fileInfo = new FileInfoDto(); + fileInfo.setName(file.getName()); + if (file.isDirectory()) { + fileInfo.setType("文件夹"); + fileInfo.setSize("-"); + folderInfoList.add(fileInfo); + } else { + fileInfo.setType(FileUtils.getFileType(file.getName())); + fileInfo.setSize(FileUtils.formatSize(file.length())); + fileInfoSubList.add(fileInfo); + } + fileInfo.setCreateDate(new Date(file.lastModified())); + } + fileInfoList.addAll(folderInfoList); + fileInfoList.addAll(fileInfoSubList); + } + } + return fileInfoList; + } + + private void saveFile(MultipartFile multipartFile, File file) { + // 如果文件不存在 + if (!file.exists()) { + try { + // 3. 如果不存在则创建文件 + multipartFile.transferTo(file); + } catch (IOException e) { + throw new CustomException("文件上传失败:{}", e.getMessage()); + } + } + } + + private FileRecordDto getFileRecord(String filename, String md5, String path, String url) { + FileRecord fileRecord = new FileRecord(); + fileRecord.setName(filename); + fileRecord.setMd5(md5); + fileRecord.setPath(path); + fileRecord.setUrl(url); + fileRecord.setId(saveDatabase(fileRecord, md5)); + + // 4. 返回文件信息 + FileRecordDto fileRecordDto = new FileRecordDto(); + BeanUtils.copyProperties(fileRecord, fileRecordDto); + + return fileRecordDto; + } + + private Long saveDatabase(FileRecord fileRecord, String md5) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(FileRecord.class); + FileRecord dbFileRecord = fileRecordMapper.selectOne(queryWrapper.eq(FileRecord::getMd5, md5)); + if (Objects.isNull(dbFileRecord)) { + fileRecordMapper.insert(fileRecord); + return fileRecord.getId(); + } else { + return dbFileRecord.getId(); + } + } + + private String getFilePath(String path) { + return fileRootPath + path; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/ServerMonitorServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/ServerMonitorServiceImpl.java new file mode 100644 index 0000000..5528e96 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/ServerMonitorServiceImpl.java @@ -0,0 +1,214 @@ +package com.cxx.admin.service.impl; + +import com.cxx.admin.dto.server.*; +import com.cxx.admin.service.ServerMonitorService; +import com.influxdb.client.InfluxDBClient; +import com.influxdb.client.InfluxDBClientFactory; +import com.influxdb.client.QueryApi; +import com.influxdb.client.WriteApi; +import com.influxdb.client.domain.WritePrecision; +import com.influxdb.client.write.Point; +import com.influxdb.query.FluxTable; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HWDiskStore; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.OperatingSystem; + +import java.io.File; +import java.text.DecimalFormat; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Service +public class ServerMonitorServiceImpl implements ServerMonitorService { + private final SystemInfo systemInfo = new SystemInfo(); + private final HardwareAbstractionLayer hardware = systemInfo.getHardware(); + private final OperatingSystem os = systemInfo.getOperatingSystem(); + private final CentralProcessor processor = hardware.getProcessor(); + + private final InfluxDBClient client; + + private final QueryApi queryApi; + + private final String SYSTEM_METRICS = "system_metrics"; + + private final long GB = 1024 * 1024 * 1024; + private final DecimalFormat df = new DecimalFormat("0.00"); + + public ServerMonitorServiceImpl( + @Value("${influxdb.url}") String url, + @Value("${influxdb.token}") String token, + @Value("${influxdb.org}") String org, + @Value("${influxdb.bucket}") String bucket) { + this.client = InfluxDBClientFactory.create(url, token.toCharArray(), org, bucket); + this.queryApi = this.client.getQueryApi(); + } + + @Override + public CpuDto getCpuInfo() { + CpuDto cpuDto = new CpuDto(); + cpuDto.setUsagePercent(formatPercent(hardware.getProcessor().getSystemCpuLoad(500) * 100)); + + return cpuDto; + } + + @Override + public MemoryDto getMemoryInfo() { + GlobalMemory memory = hardware.getMemory(); + MemoryDto memoryDto = new MemoryDto(); + long total = memory.getTotal(); + long free = memory.getAvailable(); + long used = total - free; + + memoryDto.setTotal(bytesToGb(total)); + memoryDto.setUsed(bytesToGb(used)); + memoryDto.setFree(bytesToGb(free)); + memoryDto.setUsagePercent(formatPercent((used * 100.0) / total)); + + return memoryDto; + } + + @Override + public DiskDto getDiskInfo() { + List disks = hardware.getDiskStores(); + if (disks.isEmpty()) { + return null; + } + + // 获取根分区信息 + HWDiskStore rootDisk = disks.get(0); + DiskDto diskInfo = new DiskDto(); + diskInfo.setTotal(bytesToGb(rootDisk.getSize())); + + // 获取文件系统使用情况 + os.getFileSystem().getFileStores().stream() + .filter(fs -> fs.getMount().equals(File.separator)) + .findFirst() + .ifPresent(fs -> { + long total = fs.getTotalSpace(); + long free = fs.getFreeSpace(); + long used = total - free; + + diskInfo.setUsed(bytesToGb(used)); + diskInfo.setFree(bytesToGb(free)); + diskInfo.setUsagePercent(formatPercent((double) (used) * 100.0 / total)); + }); + + return diskInfo; + } + + @Override + public SystemInfoDto getSystemInfo() { + SystemInfoDto dto = new SystemInfoDto(); + + // 获取CPU信息 + dto.setCpuName(processor.getProcessorIdentifier().getName()); + dto.setCpuVendor(processor.getProcessorIdentifier().getVendor()); + dto.setCpuLogicalCores(processor.getLogicalProcessorCount()); + dto.setCpuPhysicalCores(processor.getPhysicalProcessorCount()); + + // 获取CPU负载 + double[] loadAverage = processor.getSystemLoadAverage(3); + dto.setCpuSystemLoad(loadAverage[0]); // 1分钟平均负载 + + // 获取操作系统信息 + dto.setOsFamily(os.getFamily()); + dto.setOsVersion(os.getVersionInfo().getVersion()); + dto.setOsManufacturer(os.getManufacturer()); + + // 获取系统运行时间(秒) + dto.setSystemUptime(TimeUnit.MILLISECONDS.toSeconds(systemInfo.getOperatingSystem().getSystemUptime())); + + return dto; + } + + @Override + public void storeSystemMetrics() { + try (WriteApi writeApi = client.getWriteApi()) { + CpuDto cpuDto = getCpuInfo(); + MemoryDto memoryDto = getMemoryInfo(); + DiskDto diskDto = getDiskInfo(); + + Point point = Point + .measurement(SYSTEM_METRICS) + .addTag("host", "localhost") + .addField("cpu_usage", cpuDto.getUsagePercent()) + .addField("memory_total", memoryDto.getTotal()) + .addField("memory_used", memoryDto.getUsed()) + .addField("memory_free", memoryDto.getFree()) + .addField("memory_usage", memoryDto.getUsagePercent()) + .addField("disk_total", diskDto.getTotal()) + .addField("disk_used", diskDto.getUsed()) + .addField("disk_free", diskDto.getFree()) + .addField("disk_usage", diskDto.getUsagePercent()) + .time(Instant.now(), WritePrecision.S); + + writeApi.writePoint(point); + } + } + + @Override + public List querySystemMetrics(String range) { + String fluxQuery = "from(bucket: \"server_metrics\")" + + "|> range(start: -" + range + ")" + // range 可以是 "1h", "24h" 等 + "|> filter(fn: (r) => r._measurement == \"system_metrics\")" + + "|> pivot(rowKey: [\"_time\"], columnKey: [\"_field\"], valueColumn: \"_value\")"; + + List> results = executeQuery(fluxQuery); + + List systemMetricsList = new ArrayList<>(); + + for (Map data : results) { + SystemMetricsDto systemMetrics = new SystemMetricsDto(); + systemMetrics.setCpuUsage((Double) data.get("cpu_usage")); + systemMetrics.setMemoryTotal((Double) data.get("memory_total")); + systemMetrics.setMemoryUsed((Double) data.get("memory_used")); + systemMetrics.setMemoryFree((Double) data.get("memory_free")); + systemMetrics.setMemoryUsage((Double) data.get("memory_usage")); + systemMetrics.setDiskTotal((Double) data.get("disk_total")); + systemMetrics.setDiskUsed((Double) data.get("disk_used")); + systemMetrics.setDiskFree((Double) data.get("disk_free")); + systemMetrics.setDiskUsage((Double) data.get("disk_usage")); + systemMetrics.setTime(Date.from((Instant) data.get("time"))); + + systemMetricsList.add(systemMetrics); + } + + return systemMetricsList; + } + + private List> executeQuery(String fluxQuery) { + List tables = queryApi.query(fluxQuery); + List> results = new ArrayList<>(); + + for (FluxTable table : tables) { + table.getRecords().forEach(record -> { + Map data = new HashMap<>(); + data.put("time", record.getTime()); + + record.getValues().forEach((key, value) -> { + if (!key.startsWith("_")) { // 过滤掉内部字段 + data.put(key, value); + } + }); + + results.add(data); + }); + } + return results; + } + + private double bytesToGb(long bytes) { + double gb = bytes / (double) GB; + return Double.parseDouble(df.format(gb)); + } + + public double formatPercent(double percent) { + return Double.parseDouble(df.format(percent)); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/SessionServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/SessionServiceImpl.java new file mode 100644 index 0000000..befcff1 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/SessionServiceImpl.java @@ -0,0 +1,56 @@ +package com.cxx.admin.service.impl; + + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cxx.common.dto.user.SessionDto; +import com.cxx.admin.service.SessionService; +import com.cxx.common.dto.user.UserDto; +import com.cxx.common.entity.Account; +import com.cxx.common.entity.User; +import com.cxx.common.mapper.AccountMapper; +import com.cxx.common.mapper.UserMapper; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + + +@Service +public class SessionServiceImpl implements SessionService { + @Resource + private AccountMapper accountMapper; + + @Resource + private UserMapper userMapper; + + @Override + public SessionDto create(String name, String password) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(Account.class).eq(Account::getAccountName, name); + Account account = accountMapper.selectOne(queryWrapper); + if (account == null) { + throw new CustomException("账户: " + name + " 不存在"); + } + + if (!BCrypt.checkpw(password, account.getPassword())) { + throw new CustomException("密码不正确"); + } + + User user = userMapper.selectById(account.getUserId()); + UserDto userDto = new UserDto(); + BeanUtils.copyProperties(user, userDto); + userDto.setAccountId(account.getId()); + userDto.setAccountName(name); + + SessionDto sessionDto = new SessionDto(); + StpUtil.login(account.getId()); + sessionDto.setSaToken(StpUtil.getTokenInfo()); + sessionDto.setUserInfo(userDto); + + StpUtil.getSession().set("username", name); + + return sessionDto; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/service/impl/UserServiceImpl.java b/admin-service/src/main/java/com/cxx/admin/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..cc9713e --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/service/impl/UserServiceImpl.java @@ -0,0 +1,53 @@ +package com.cxx.admin.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.admin.service.AccountService; +import com.cxx.admin.service.UserService; +import com.cxx.common.dto.user.UserDto; +import com.cxx.common.entity.User; +import com.cxx.common.mapper.UserMapper; +import com.cxx.framework.web.CustomException; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl implements UserService { + @Resource + private UserMapper userMapper; + + @Resource + private AccountService accountService; + + @Override + public UserDto queryUser(Long id) { + User user = userMapper.selectById(id); + if (user == null) { + throw new CustomException("未查询到该用户"); + } + + UserDto userDto = new UserDto(); + BeanUtils.copyProperties(user, userDto); + userDto.setAccountName(accountService.queryAccountByUserId(id).getAccountName()); + return userDto; + } + + @Override + public Boolean updateUser(Long id, UserDto userDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (!userMapper.exists(queryWrapper.eq(User::getId, id))) { + throw new CustomException("该用户不存在"); + } + + queryWrapper.clear(); + if (userMapper.exists(queryWrapper.eq(User::getUsername, userDto.getUsername()).ne(User::getId, id))) { + throw new CustomException("该用户已经存在"); + } + + User user = new User(); + BeanUtils.copyProperties(userDto, user); + user.setId(id); + return userMapper.updateById(user) == 1; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/util/BlogUtils.java b/admin-service/src/main/java/com/cxx/admin/util/BlogUtils.java new file mode 100644 index 0000000..52c8c9a --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/util/BlogUtils.java @@ -0,0 +1,73 @@ +package com.cxx.admin.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class BlogUtils { + /** + * 博客概要字数 + */ + private static final Integer BLOG_SUMMARY_COUNT = 100; + + /** + * 阅读速度 600 字/分钟 + */ + private static final Double READ_SPEED = 600.0; + + /** + * 博客非统计字符 + */ + private static final List excludeChart = new ArrayList<>(Arrays.asList(' ', '\n', '\t')); + + /** + * 获取文本字数 + * + * @param str 文本 + * @return 字数 + */ + public static Integer getWordCount(String str) { + Integer count = 0; + + if (null == str || str.isEmpty()) { + return count; + } + + for (int i = 0; i < str.length(); i++) { + char tmp = str.charAt(i); + if (!excludeChart.contains(tmp)) { + count++; + } + } + + return count; + } + + /** + * 获取阅读时长 单位:分钟 + * + * @param wordCount 文本字数 + * @return 阅读时长 + */ + public static Double getReadDuration(Integer wordCount) { + return wordCount / READ_SPEED; + } + + /** + * 获取简要信息 + * + * @param content 博客内容 + * @return 简要信息 + */ + public static String getBlogSummary(String content) { + if (content.length() > BLOG_SUMMARY_COUNT) { + return content.substring(0, BLOG_SUMMARY_COUNT); + } + + return content; + } + + public static String getHexTimeStamp() { + return Long.toHexString(System.currentTimeMillis()); + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/util/FileUtils.java b/admin-service/src/main/java/com/cxx/admin/util/FileUtils.java new file mode 100644 index 0000000..12c1759 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/util/FileUtils.java @@ -0,0 +1,28 @@ +package com.cxx.admin.util; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class FileUtils { + public static String getFileType(String fileName) { + int lastIndex = fileName.lastIndexOf('.'); + if (lastIndex != -1) { + return fileName.substring(lastIndex + 1); + } + return "未知类型"; + } + + public static String formatSize(long size) { + if (size < 1024) { + return size + " B"; + } else if (size < 1024 * 1024) { + return String.format("%.2f KB", (double) size / 1024); + } else if (size < 1024 * 1024 * 1024) { + return String.format("%.2f MB", (double) size / (1024 * 1024)); + } else { + return String.format("%.2f GB", (double) size / (1024 * 1024 * 1024)); + } + } + + +} diff --git a/admin-service/src/main/java/com/cxx/admin/util/FtpUtils.java b/admin-service/src/main/java/com/cxx/admin/util/FtpUtils.java new file mode 100644 index 0000000..b25a887 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/util/FtpUtils.java @@ -0,0 +1,125 @@ +package com.cxx.admin.util; + +import com.cxx.admin.dto.FtpInfo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.net.PrintCommandListener; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * @Author: Cxx + * @Date: 2024/9/24 21:49 + * @Description: + */ +@Slf4j +public class FtpUtils { + private static FTPClient ftpClient; + + /** + * 文件名分隔符 + */ + public static String FILE_NAME_SPLIT = "_"; + + private static boolean connectFtp(FtpInfo ftpInfo) { + try { + ftpClient = new FTPClient(); + // 设置utf-8 编码 否则中文文件名会乱码 + ftpClient.setControlEncoding("utf-8"); + ftpClient.connect(ftpInfo.getFtpIp(), ftpInfo.getFtpPort()); + ftpClient.login(ftpInfo.getFtpUsername(), ftpInfo.getFtpPassword()); + ftpClient.addProtocolCommandListener( + new PrintCommandListener( + new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8)), true)); + log.info("连接ftp服务器成功"); + } catch (IOException e) { + log.error("连接ftp服务器失败:", e); + throw new RuntimeException("连接ftp服务器失败"); + } + + return true; + } + + private static void disConnectFtp() { + try { + if (ftpClient != null) { + ftpClient.disconnect(); + } + log.info("关闭ftp服务器成功"); + } catch (IOException e) { + log.error("关闭ftp服务器失败:", e); + throw new RuntimeException("关闭ftp服务器失败"); + } + } + + private static void closeInputStream(FileInputStream fileInputStream) { + try { + if (fileInputStream != null) { + fileInputStream.close(); + } + } catch (IOException e) { + log.error("关闭文件流失败:", e); + throw new RuntimeException("关闭文件流失败"); + } + } + + public static void uploadFile(FtpInfo ftpInfo, String remotePath, String fileName, File file) { + FileInputStream fileInputStream = null; + + try { + if (connectFtp(ftpInfo)) { + ftpClient.changeWorkingDirectory(remotePath); + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + fileInputStream = new FileInputStream(file); + boolean uploadResult = ftpClient.storeFile(fileName, fileInputStream); + if (uploadResult) { + log.info("上传文件:{}成功", fileName); + } else { + throw new RuntimeException("上传ftp文件失败"); + } + } + } catch (IOException e) { + log.error("上传ftp文件异常:", e); + throw new RuntimeException("上传ftp文件异常"); + } finally { + disConnectFtp(); + closeInputStream(fileInputStream); + } + } + + /** + * 校验是否存在文件 + * + * @param ftpInfo ftp信息 + * @param remotePath 文件路径 + * @param md5 md5值 + * @return 校验结果 + */ + public static boolean checkIsExitFile(FtpInfo ftpInfo, String remotePath, String md5) { + boolean isExist = false; + try { + if (connectFtp(ftpInfo)) { + ftpClient.changeWorkingDirectory(remotePath); + FTPFile[] fileList = ftpClient.listFiles(); + if (fileList != null) { + for (FTPFile imageFile : fileList) { + String fileMd5 = imageFile.getName().split(FILE_NAME_SPLIT)[0]; + if (fileMd5.equals(md5)) { + log.info("文件{}已经存在", imageFile.getName()); + isExist = true; + } + } + } + } + } catch (IOException e) { + log.error("校验ftp文件异常:", e); + throw new RuntimeException("校验ftp文件异常"); + } finally { + disConnectFtp(); + } + + return isExist; + } +} diff --git a/admin-service/src/main/java/com/cxx/admin/util/UploadFileUtil.java b/admin-service/src/main/java/com/cxx/admin/util/UploadFileUtil.java new file mode 100644 index 0000000..4ce4f76 --- /dev/null +++ b/admin-service/src/main/java/com/cxx/admin/util/UploadFileUtil.java @@ -0,0 +1,173 @@ +package com.cxx.admin.util; + +import cn.hutool.core.io.file.FileNameUtil; +import com.cxx.admin.dto.file.ChunkInfoDto; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.IOException; +import java.nio.file.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; + +/** + * @Author: chenxiuxiang + * @Date: 2023/7/24 14:49 + * @Description: 上传文件工具类 + */ +@Slf4j +public class UploadFileUtil { + private static final String FILE_SEPARATOR = "_"; + + /** + * 校验文件夹是否存在 + * + * @param path 路径 + */ + public static void checkDirIsExist(String path) { + File dir = new File(path); + if (!dir.exists() && !dir.isDirectory()) { + boolean mkdir = dir.mkdirs(); + } + } + + /** + * 获取文件路径 + * + * @param path 上传文件夹路径 + * @param chunkInfo 分片文件信息 + * @return 文件路径 + */ + public static String generateChunkPath(String path, ChunkInfoDto chunkInfo) { + return path + File.separator + chunkInfo.getFilename() + FILE_SEPARATOR + chunkInfo.getChunkNumber(); + } + + public static List getUploadedChunkList(String folder, String filename) { + List uploadedChunkList = new ArrayList<>(); + + // 获取文件夹下所有的文件 + try (Stream list = Files.list(Paths.get(folder))) { + // 去除需要合并的文件 + list.filter(path -> !path.getFileName().toString().equals(filename)) + // 循环遍历文件 将已经上传的文件序号添加至列表中 + .forEach(path -> { + String chunkPath = path.getFileName().toString(); + int index = chunkPath.lastIndexOf(FILE_SEPARATOR); + uploadedChunkList.add(Integer.valueOf(chunkPath.substring(index + 1))); + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + + return uploadedChunkList; + } + + /** + * 文件合并 + */ + public static void mergeFile(String filename, String path) throws IOException { + // 判断文件是否存在 + String file = path + File.separator + filename; + if (fileExists(file)) { + deleteFile(file); + } + + // 不存在的话,进行合并 + Files.createFile(Paths.get(file)); + + // 获取文件夹下所有的文件 + try (Stream list = Files.list(Paths.get(path))) { + // 保留后缀包含分隔符的 + list.filter(chunkPath -> FileNameUtil.getSuffix(chunkPath.getFileName().toString()).contains(FILE_SEPARATOR)) + // 按照文件名排序 + .sorted((o1, o2) -> { + String p1 = o1.getFileName().toString(); + String p2 = o2.getFileName().toString(); + int i1 = p1.lastIndexOf(FILE_SEPARATOR); + int i2 = p2.lastIndexOf(FILE_SEPARATOR); + return Integer.valueOf(p1.substring(i1 + 1)) + .compareTo(Integer.valueOf(p2.substring(i2 + 1))); + }) + // 循环写入到文件中 + .forEach(chunkPath -> { + try { + // 以追加的形式写入文件 + Files.write(Paths.get(file), Files.readAllBytes(chunkPath), StandardOpenOption.APPEND); + // 合并后删除该块 + Files.delete(chunkPath); + } catch (IOException exception) { + log.error("写入文件失败: " + exception.getMessage()); + throw new RuntimeException(exception); + } + }); + } + } + + /** + * 根据文件的全路径名判断文件是否存在 + */ + public static boolean fileExists(String file) { + Path path = Paths.get(file); + return Files.exists(path, LinkOption.NOFOLLOW_LINKS); + } + + /** + * 删除目录(文件夹)以及目录下的文件 + * + * @param sPath 被删除目录的文件路径 + * @return 目录删除成功返回true,否则返回false + */ + public static boolean deleteDirectory(String sPath) { + // 如果sPath不以文件分隔符结尾,自动添加文件分隔符 + if (!sPath.endsWith(File.separator)) { + sPath = sPath + File.separator; + } + File dirFile = new File(sPath); + // 如果dir对应的文件不存在,或者不是一个目录,则退出 + if (!dirFile.exists() || !dirFile.isDirectory()) { + return false; + } + + boolean flag = true; + // 删除文件夹下的所有文件(包括子目录) + File[] files = dirFile.listFiles(); + for (File file : Objects.requireNonNull(files)) { + // 删除子文件 + if (file.isFile()) { + flag = deleteFile(file.getAbsolutePath()); + } + // 删除子目录 + else { + flag = deleteDirectory(file.getAbsolutePath()); + } + if (!flag) { + break; + } + } + if (!flag) { + return false; + } + + log.info("文件删除成功"); + // 删除当前目录 + return dirFile.delete(); + } + + /** + * 删除单个文件 + * + * @param sPath 被删除文件的文件名 + * @return 单个文件删除成功返回true,否则返回false + */ + public static boolean deleteFile(String sPath) { + boolean flag = false; + File file = new File(sPath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) { + flag = file.delete(); + } + return flag; + } +} \ No newline at end of file diff --git a/admin-service/src/main/resources/application-dev.yml b/admin-service/src/main/resources/application-dev.yml new file mode 100644 index 0000000..d85af55 --- /dev/null +++ b/admin-service/src/main/resources/application-dev.yml @@ -0,0 +1,15 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: root + password: 123456 + +logging: + level: + root: info + config: + +file: + path: D:\\temp\\ + log-path: D:\\temp\\ \ No newline at end of file diff --git a/admin-service/src/main/resources/application-docker.yml b/admin-service/src/main/resources/application-docker.yml new file mode 100644 index 0000000..141dfac --- /dev/null +++ b/admin-service/src/main/resources/application-docker.yml @@ -0,0 +1,16 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://mysql:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: docker + password: 19940822Cxx + +logging: + fluentd: + host: fluent-bit + port: 24224 + level: + root: info + +file: + path: /upload-file/ \ No newline at end of file diff --git a/admin-service/src/main/resources/application-prod.yml b/admin-service/src/main/resources/application-prod.yml new file mode 100644 index 0000000..b75d9df --- /dev/null +++ b/admin-service/src/main/resources/application-prod.yml @@ -0,0 +1,16 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: cxx + password: 19940822Cxx@1213 + +logging: + level: + root: info + config: + classpath:logback-spring-drop.xml + +file: + path: /root/docker/upload-file/ + log-path: /root/service/logs/ \ No newline at end of file diff --git a/admin-service/src/main/resources/application.yml b/admin-service/src/main/resources/application.yml new file mode 100644 index 0000000..46ea264 --- /dev/null +++ b/admin-service/src/main/resources/application.yml @@ -0,0 +1,36 @@ +server: + port: 8080 + +spring: + application: + name: @project.artifactId@ + version: @project.version@ + profiles: + active: dev + servlet: + multipart: + max-file-size: 10MB + max-request-size: 100MB + +# mybatis plus mapper路径 +mybatis-plus: + # mybatis plus + mapper-locations: classpath*:/mapper/**/*.xml + configuration: + log-impl: + org.apache.ibatis.logging.stdout.StdOutImpl + +ftp: + ip: 192.168.31.54 + port: 21 + username: ftp-cxx + password: 19940822cxx + +influxdb: + url: http://localhost:8086 + token: i3eja-5jMQBxxF29pvKBialZ_j4y3p8iAMI86Ht3YcMTXhitIeUfx30vAv79xfhckC5YExTKj91AribNwBZBOQ== + org: cxx + bucket: server_metrics + +web-starter: + base-package: com.cxx.service \ No newline at end of file diff --git a/admin-service/src/main/resources/logback-spring-drop.xml b/admin-service/src/main/resources/logback-spring-drop.xml new file mode 100644 index 0000000..d6f5043 --- /dev/null +++ b/admin-service/src/main/resources/logback-spring-drop.xml @@ -0,0 +1,120 @@ + + + + logback + + + + + + + + + + + + + + + + + + + + + + DEBUG + + + + ${CONSOLE_LOG_PATTERN} + + ${ENCODING} + + + + + + + + INFO + ACCEPT + DENY + + + ${log.path}/log_info.log + + ${FILE_LOG_PATTERN} + ${ENCODING} + + + + + ${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log + + 500MB + + + 15 + + + + + + + WARN + ACCEPT + DENY + + + ${log.path}/log_warn.log + + ${FILE_LOG_PATTERN} + ${ENCODING} + + + + ${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + + + + ERROR + ACCEPT + DENY + + + ${log.path}/log_error.log + + ${FILE_LOG_PATTERN} + ${ENCODING} + + + + ${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + + + + + + + + \ No newline at end of file diff --git a/admin-service/src/main/resources/mapper/AccountMapper.xml b/admin-service/src/main/resources/mapper/AccountMapper.xml new file mode 100644 index 0000000..e41b387 --- /dev/null +++ b/admin-service/src/main/resources/mapper/AccountMapper.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/admin-service/src/main/resources/mapper/BlogMapper.xml b/admin-service/src/main/resources/mapper/BlogMapper.xml new file mode 100644 index 0000000..5d14e22 --- /dev/null +++ b/admin-service/src/main/resources/mapper/BlogMapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/admin-service/src/test/java/com/cxx/admin/AdminServiceApplicationTests.java b/admin-service/src/test/java/com/cxx/admin/AdminServiceApplicationTests.java new file mode 100644 index 0000000..730e09e --- /dev/null +++ b/admin-service/src/test/java/com/cxx/admin/AdminServiceApplicationTests.java @@ -0,0 +1,21 @@ +package com.cxx.admin; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.Date; + +@SpringBootTest +public class AdminServiceApplicationTests { + @Test + public void contextLoads() { + + } + + @Test + public void TestEmail() { + + } +} + diff --git a/blog-service/Dockerfile b/blog-service/Dockerfile new file mode 100644 index 0000000..94ced11 --- /dev/null +++ b/blog-service/Dockerfile @@ -0,0 +1,6 @@ +FROM docker-0.unsee.tech/openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY $JAR_FILE app.jar +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo 'Asia/Shanghai' > /etc/timezone +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/blog-service/pom.xml b/blog-service/pom.xml new file mode 100644 index 0000000..4f785ae --- /dev/null +++ b/blog-service/pom.xml @@ -0,0 +1 @@ + 4.0.0 com.cxx sweet-hut-service 2.0.0 blog-service 2.0.0 17 17 UTF-8 com.cxx common 2.0.0 eu.bitwalker UserAgentUtils 1.21 \ No newline at end of file diff --git a/blog-service/src/main/java/com/cxx/blog/BlogServiceApplication.java b/blog-service/src/main/java/com/cxx/blog/BlogServiceApplication.java new file mode 100644 index 0000000..218b40a --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/BlogServiceApplication.java @@ -0,0 +1,13 @@ +package com.cxx.blog; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan(basePackages = {"com.cxx.common.mapper", "com.cxx.blog.dao"}) +public class BlogServiceApplication { + public static void main(String[] args) { + SpringApplication.run(BlogServiceApplication.class, args); + } +} \ No newline at end of file diff --git a/blog-service/src/main/java/com/cxx/blog/config/BlogVisitMonitor.java b/blog-service/src/main/java/com/cxx/blog/config/BlogVisitMonitor.java new file mode 100644 index 0000000..1c12f74 --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/config/BlogVisitMonitor.java @@ -0,0 +1,71 @@ +package com.cxx.blog.config; + +import com.cxx.blog.service.BlogService; +import com.cxx.common.entity.BlogVisit; +import com.cxx.blog.util.IpUtils; +import eu.bitwalker.useragentutils.Browser; +import eu.bitwalker.useragentutils.OperatingSystem; +import eu.bitwalker.useragentutils.UserAgent; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + + +/** + * 利用AOP监控博客访问 + * 1. @Before:前置通知,在方法执行之前执行 + * 2. @After:后置通知,在方法执行之后执行 + * 3. @AfterRunning:返回通知,在方法返回结果之后执行 + * 4. @AfterThrowing:异常通知,在方法抛出异常之后执行 + * 5. @Around:环绕通知,围绕着方法执行 + */ +@Component +@Aspect +@Slf4j +public class BlogVisitMonitor { + @Resource + private BlogService blogService; + + /** + * 定义切面 + * 指定需要统计的包 + */ + @Pointcut("execution(* com.cxx.blog.controller.BlogController.*(..))") + public void pointCut() { + + } + + /** + * 只有正常返回才会执行此方法 + * 如果程序执行失败,则不执行此方法 + */ + @AfterReturning(returning = "returnVal", pointcut = "pointCut()") + public void doAfterReturning(JoinPoint joinPoint, Object returnVal) { + // 获取接收到的HTTP请求信息 + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + + String agent = request.getHeader("User-Agent"); + UserAgent userAgent = UserAgent.parseUserAgentString(agent); + OperatingSystem os = userAgent.getOperatingSystem(); + Browser browser = userAgent.getBrowser(); + String uri = request.getRequestURI(); + + BlogVisit blogVisit = new BlogVisit(); + blogVisit.setIp(IpUtils.getIpAddress(request)); + blogVisit.setOs(os.getName()); + blogVisit.setBrowser(browser.getName() + "-" + userAgent.getBrowserVersion()); + blogVisit.setUri(uri); + blogVisit.setBlogId(0L); + + if (blogVisit.getUri().contains("content")) { + blogVisit.setBlogId(Long.valueOf(uri.split("/")[3])); + } + + blogService.addBlogVisit(blogVisit); + } +} diff --git a/blog-service/src/main/java/com/cxx/blog/controller/BlogController.java b/blog-service/src/main/java/com/cxx/blog/controller/BlogController.java new file mode 100644 index 0000000..5c5af84 --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/controller/BlogController.java @@ -0,0 +1,62 @@ +package com.cxx.blog.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.blog.service.BlogService; +import com.cxx.common.ReadView; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogLatestDto; +import com.cxx.common.dto.blog.BlogStatsDto; +import com.cxx.common.vo.blog.BlogQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/blog") +@Tag(name = "查看博客") +public class BlogController { + @Resource + private BlogService blogService; + + @Operation(summary = "分页查询博客") + @GetMapping("/page") + public IPage queryBlogByPage(@RequestParam("currentPage") Integer currentPage, + @RequestParam("pageSize") Integer pageSize) { + return blogService.queryBlogByPage(currentPage, pageSize); + } + + @Operation(summary = "条件查询博客") + @GetMapping("/condition") + public @JsonView(ReadView.class) List queryBlogByCondition(BlogQueryVo query) { + return blogService.queryBlogByCondition(query); + } + + @Operation(summary = "查询博客内容") + @GetMapping("/content/{id}") + public @JsonView(ReadView.class) BlogDto queryBlogById(@PathVariable("id") long id) { + return blogService.queryBlogById(id); + } + + @Operation(summary = "查询博客分类") + @GetMapping("/category") + public List queryBlogCategory() { + return blogService.queryBlogCategory(); + } + + @Operation(summary = "查询博客统计信息") + @GetMapping("/stats") + public BlogStatsDto queryBlogStats() { + return blogService.queryBlogStats(); + } + + @Operation(summary = "查询近期博客") + @GetMapping("/latest") + public List queryLatestBlog() { + return blogService.queryLatestBlog(); + } +} \ No newline at end of file diff --git a/blog-service/src/main/java/com/cxx/blog/dao/BlogDao.java b/blog-service/src/main/java/com/cxx/blog/dao/BlogDao.java new file mode 100644 index 0000000..2914937 --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/dao/BlogDao.java @@ -0,0 +1,25 @@ +package com.cxx.blog.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogLatestDto; +import com.cxx.common.entity.Blog; +import com.cxx.common.vo.blog.BlogQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface BlogDao { + IPage queryBlogByPage(IPage page); + + List queryBlogByCondition(@Param("query") BlogQueryVo query); + + BlogDto queryBlogById(@Param("id") Long id); + + List queryBlogCategory(); + + List queryLatestBlog(); +} diff --git a/blog-service/src/main/java/com/cxx/blog/service/BlogService.java b/blog-service/src/main/java/com/cxx/blog/service/BlogService.java new file mode 100644 index 0000000..c42b96d --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/service/BlogService.java @@ -0,0 +1,28 @@ +package com.cxx.blog.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogLatestDto; +import com.cxx.common.dto.blog.BlogStatsDto; +import com.cxx.common.entity.BlogVisit; +import com.cxx.common.vo.blog.BlogQueryVo; + +import java.util.List; + + +public interface BlogService { + IPage queryBlogByPage(Integer currentPage, Integer pageSize); + + List queryBlogByCondition(BlogQueryVo query); + + BlogDto queryBlogById(Long id); + + List queryBlogCategory(); + + BlogStatsDto queryBlogStats(); + + List queryLatestBlog(); + + void addBlogVisit(BlogVisit blogVisit); +} diff --git a/blog-service/src/main/java/com/cxx/blog/service/impl/BlogServiceImpl.java b/blog-service/src/main/java/com/cxx/blog/service/impl/BlogServiceImpl.java new file mode 100644 index 0000000..e7101b3 --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/service/impl/BlogServiceImpl.java @@ -0,0 +1,73 @@ +package com.cxx.blog.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cxx.blog.dao.BlogDao; +import com.cxx.blog.service.BlogService; +import com.cxx.common.dto.blog.BlogCategoryDto; +import com.cxx.common.dto.blog.BlogDto; +import com.cxx.common.dto.blog.BlogLatestDto; +import com.cxx.common.dto.blog.BlogStatsDto; +import com.cxx.common.entity.BlogVisit; +import com.cxx.common.mapper.BlogCategoryMapper; +import com.cxx.common.mapper.BlogMapper; +import com.cxx.common.mapper.BlogVisitMapper; +import com.cxx.common.vo.blog.BlogQueryVo; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BlogServiceImpl implements BlogService { + @Resource + private BlogDao blogDao; + + @Resource + private BlogMapper blogMapper; + + @Resource + private BlogCategoryMapper categoryMapper; + + @Resource + private BlogVisitMapper visitMapper; + + @Override + public IPage queryBlogByPage(Integer currentPage, Integer pageSize) { + return blogDao.queryBlogByPage(new Page<>(currentPage, pageSize)); + } + + @Override + public List queryBlogByCondition(BlogQueryVo query) { + return blogDao.queryBlogByCondition(query); + } + + @Override + public BlogDto queryBlogById(Long id) { + return blogDao.queryBlogById(id); + } + + @Override + public List queryBlogCategory() { + return blogDao.queryBlogCategory(); + } + + @Override + public BlogStatsDto queryBlogStats() { + BlogStatsDto blogStats = new BlogStatsDto(); + blogStats.setBlogCount(blogMapper.selectCount(null)); + blogStats.setCategoryCount(categoryMapper.selectCount(null)); + + return blogStats; + } + + @Override + public List queryLatestBlog() { + return blogDao.queryLatestBlog(); + } + + @Override + public void addBlogVisit(BlogVisit blogVisit) { + visitMapper.insert(blogVisit); + } +} \ No newline at end of file diff --git a/blog-service/src/main/java/com/cxx/blog/util/BlogUtils.java b/blog-service/src/main/java/com/cxx/blog/util/BlogUtils.java new file mode 100644 index 0000000..e091b24 --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/util/BlogUtils.java @@ -0,0 +1,36 @@ +package com.cxx.blog.util; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class BlogUtils { + public static File multipartFileToFile(MultipartFile multipartFile) { + if (multipartFile.getOriginalFilename() == null) { + return null; + } + + File file = new File(multipartFile.getOriginalFilename()); + try { + InputStream ins = multipartFile.getInputStream(); + OutputStream os = new FileOutputStream(file); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.close(); + ins.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + return file; + } +} diff --git a/blog-service/src/main/java/com/cxx/blog/util/IpUtils.java b/blog-service/src/main/java/com/cxx/blog/util/IpUtils.java new file mode 100644 index 0000000..36544ab --- /dev/null +++ b/blog-service/src/main/java/com/cxx/blog/util/IpUtils.java @@ -0,0 +1,59 @@ +package com.cxx.blog.util; + +import jakarta.servlet.http.HttpServletRequest; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class IpUtils { + private static final String UNKNOWN = "unknown"; + private static final String LOCALHOST_IP = "127.0.0.1"; + // 客户端与服务器同为一台机器,获取的 ip 有时候是 ipv6 格式 + private static final String LOCALHOST_IPV6 = "0:0:0:0:0:0:0:1"; + private static final String SEPARATOR = ","; + + /** + * 根据 HttpServletRequest 获取 IP + * @param request 请求 + * @return ip + */ + public static String getIpAddress(HttpServletRequest request) { + if (request == null) { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } + if (ip == null || ip.isEmpty() || UNKNOWN.equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + if (LOCALHOST_IP.equalsIgnoreCase(ip) || LOCALHOST_IPV6.equalsIgnoreCase(ip)) { + // 根据网卡取本机配置的 IP + InetAddress iNet = null; + try { + iNet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + if (iNet != null) + ip = iNet.getHostAddress(); + } + } + // 对于通过多个代理的情况,分割出第一个 IP + if (ip != null && ip.length() > 15) { + if (ip.indexOf(SEPARATOR) > 0) { + ip = ip.substring(0, ip.indexOf(SEPARATOR)); + } + } + return LOCALHOST_IPV6.equals(ip) ? LOCALHOST_IP : ip; + } +} diff --git a/blog-service/src/main/resources/application-dev.yml b/blog-service/src/main/resources/application-dev.yml new file mode 100644 index 0000000..e680bf2 --- /dev/null +++ b/blog-service/src/main/resources/application-dev.yml @@ -0,0 +1,11 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: root + password: 123456 + +logging: + level: + root: info + config: diff --git a/blog-service/src/main/resources/application-docker.yml b/blog-service/src/main/resources/application-docker.yml new file mode 100644 index 0000000..21f5ae1 --- /dev/null +++ b/blog-service/src/main/resources/application-docker.yml @@ -0,0 +1,13 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://mysql:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: docker + password: 19940822Cxx + +logging: + fluentd: + host: fluent-bit + port: 24224 + level: + root: info diff --git a/blog-service/src/main/resources/application-prod.yml b/blog-service/src/main/resources/application-prod.yml new file mode 100644 index 0000000..e8be661 --- /dev/null +++ b/blog-service/src/main/resources/application-prod.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: cxx + password: 19940822Cxx@1213 + +logging: + level: + root: info + config: + classpath:logback-spring-drop.xml \ No newline at end of file diff --git a/blog-service/src/main/resources/application.yml b/blog-service/src/main/resources/application.yml new file mode 100644 index 0000000..8bd6ff3 --- /dev/null +++ b/blog-service/src/main/resources/application.yml @@ -0,0 +1,20 @@ +server: + port: 8082 + +spring: + application: + name: @project.artifactId@ + version: @project.version@ + profiles: + active: dev + +# mybatis plus mapper路径 +mybatis-plus: + # mybatis plus + mapper-locations: classpath*:/mapper/**/*.xml + configuration: + log-impl: + org.apache.ibatis.logging.stdout.StdOutImpl + +web-starter: + base-package: com.cxx.blog \ No newline at end of file diff --git a/blog-service/src/main/resources/logback-spring-drop.xml b/blog-service/src/main/resources/logback-spring-drop.xml new file mode 100644 index 0000000..1a73420 --- /dev/null +++ b/blog-service/src/main/resources/logback-spring-drop.xml @@ -0,0 +1,120 @@ + + + + logback + + + + + + + + + + + + + + + + + + + + + + DEBUG + + + + ${CONSOLE_LOG_PATTERN} + + ${ENCODING} + + + + + + + + INFO + ACCEPT + DENY + + + ${log.path}/log_info.log + + ${FILE_LOG_PATTERN} + ${ENCODING} + + + + + ${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log + + 500MB + + + 15 + + + + + + + WARN + ACCEPT + DENY + + + ${log.path}/log_warn.log + + ${FILE_LOG_PATTERN} + ${ENCODING} + + + + ${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + + + + ERROR + ACCEPT + DENY + + + ${log.path}/log_error.log + + ${FILE_LOG_PATTERN} + ${ENCODING} + + + + ${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + + + + + + + + \ No newline at end of file diff --git a/blog-service/src/main/resources/mapper/blogMapper.xml b/blog-service/src/main/resources/mapper/blogMapper.xml new file mode 100644 index 0000000..a848ae3 --- /dev/null +++ b/blog-service/src/main/resources/mapper/blogMapper.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog-service/src/test/java/com/cxx/blog/BlogServiceTest.java b/blog-service/src/test/java/com/cxx/blog/BlogServiceTest.java new file mode 100644 index 0000000..78081b5 --- /dev/null +++ b/blog-service/src/test/java/com/cxx/blog/BlogServiceTest.java @@ -0,0 +1,18 @@ +package com.cxx.blog; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @Author: Cxx + * @Date: 2024/9/22 0:17 + * @Description: + */ +@SpringBootTest +public class BlogServiceTest { + + @Test + public void test() { + + } +} diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 0000000..c9e8d75 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + com.cxx + sweet-hut-service + 2.0.0 + + + common + 2.0.0 + + jar + + + 17 + 17 + UTF-8 + + + + + com.cxx + starter-web + 2.0.0 + + + com.cxx + starter-jdbc + 2.0.0 + + + com.cxx + starter-logging + 2.0.0 + + + \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/PlainView.java b/common/src/main/java/com/cxx/common/PlainView.java new file mode 100644 index 0000000..90cf6e2 --- /dev/null +++ b/common/src/main/java/com/cxx/common/PlainView.java @@ -0,0 +1,4 @@ +package com.cxx.common; + +public interface PlainView { +} diff --git a/common/src/main/java/com/cxx/common/ReadView.java b/common/src/main/java/com/cxx/common/ReadView.java new file mode 100644 index 0000000..8fd71de --- /dev/null +++ b/common/src/main/java/com/cxx/common/ReadView.java @@ -0,0 +1,4 @@ +package com.cxx.common; + +public interface ReadView extends PlainView { +} diff --git a/common/src/main/java/com/cxx/common/WriteView.java b/common/src/main/java/com/cxx/common/WriteView.java new file mode 100644 index 0000000..92a9858 --- /dev/null +++ b/common/src/main/java/com/cxx/common/WriteView.java @@ -0,0 +1,4 @@ +package com.cxx.common; + +public interface WriteView extends PlainView { +} diff --git a/common/src/main/java/com/cxx/common/dto/StatsChartDto.java b/common/src/main/java/com/cxx/common/dto/StatsChartDto.java new file mode 100644 index 0000000..d5bdb8e --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/StatsChartDto.java @@ -0,0 +1,11 @@ +package com.cxx.common.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class StatsChartDto { + private String name; + private Double value; +} diff --git a/common/src/main/java/com/cxx/common/dto/bill/BillCategoryDto.java b/common/src/main/java/com/cxx/common/dto/bill/BillCategoryDto.java new file mode 100644 index 0000000..f5c912c --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/bill/BillCategoryDto.java @@ -0,0 +1,18 @@ +package com.cxx.common.dto.bill; + +import com.cxx.common.PlainView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class BillCategoryDto extends BillItemDto{ + @Schema(description = "账本名称") + private String bookName; + + @Schema(description = "账本类型") + private String type; +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/dto/bill/BillItemDto.java b/common/src/main/java/com/cxx/common/dto/bill/BillItemDto.java new file mode 100644 index 0000000..6d2012b --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/bill/BillItemDto.java @@ -0,0 +1,26 @@ +package com.cxx.common.dto.bill; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class BillItemDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "图标") + private String icon; + + @Schema(description = "颜色") + private String color; +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/dto/bill/BillRecordDto.java b/common/src/main/java/com/cxx/common/dto/bill/BillRecordDto.java new file mode 100644 index 0000000..0fb23c0 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/bill/BillRecordDto.java @@ -0,0 +1,52 @@ +package com.cxx.common.dto.bill; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +@Getter +@Setter +@JsonView(PlainView.class) +public class BillRecordDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "账本名称") + private String bookName; + + @Schema(description = "账单类型") + private String type; + + @Schema(description = "账单类别") + private String category; + + @Schema(description = "账单地点") + private String location; + + @Schema(description = "账单账户") + private String payAccount; + + @Schema(description = "账单金额") + private Double amount; + + @Schema(description = "账单内容") + private String content; + + @Schema(description = "账单备注") + private String remark; + + @Schema(description = "账单图片") + private List imageList; + + @Schema(description = "账单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/dto/bill/BillSummaryDto.java b/common/src/main/java/com/cxx/common/dto/bill/BillSummaryDto.java new file mode 100644 index 0000000..163d507 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/bill/BillSummaryDto.java @@ -0,0 +1,49 @@ +package com.cxx.common.dto.bill; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +@Getter +@Setter +@JsonView(PlainView.class) +public class BillSummaryDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "账本名称") + private String bookName; + + @Schema(description = "账单类型") + private String type; + + @Schema(description = "账单类别") + private String category; + + @Schema(description = "账单地点") + private String location; + + @Schema(description = "账单账户") + private String payAccount; + + @Schema(description = "账单金额") + private Double amount; + + @Schema(description = "账单内容") + private String content; + + @Schema(description = "账单备注") + private String remark; + + @Schema(description = "账单日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/dto/blog/BlogCategoryDto.java b/common/src/main/java/com/cxx/common/dto/blog/BlogCategoryDto.java new file mode 100644 index 0000000..36bb833 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/blog/BlogCategoryDto.java @@ -0,0 +1,15 @@ +package com.cxx.common.dto.blog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BlogCategoryDto { + @Schema(description = "类别名称") + private String name; + + @Schema(description = "类别数量") + private Integer count; +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/dto/blog/BlogDto.java b/common/src/main/java/com/cxx/common/dto/blog/BlogDto.java new file mode 100644 index 0000000..67904d2 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/blog/BlogDto.java @@ -0,0 +1 @@ +package com.cxx.common.dto.blog; import com.cxx.common.PlainView; import com.cxx.common.ReadView; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonView; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import java.util.Date; @Getter @Setter @JsonView(PlainView.class) public class BlogDto { @Schema(description = "id") @JsonView(ReadView.class) private Long id; @Schema(description = "博客标题") private String title; @Schema(description = "置顶值") private Integer topValue; @Schema(description = "是否是精品") private Boolean isGreat; @Schema(description = "博客类别") private String category; @Schema(description = "博客简介") @JsonView(ReadView.class) private String summary; @Schema(description = "博客内容") private String content; @Schema(description = "博客字数") @JsonView(ReadView.class) private Integer wordCount; @Schema(description = "博客时长") @JsonView(ReadView.class) private Double readDuration; @Schema(description = "博客访问人数") @JsonView(ReadView.class) private Integer visitCount; @Schema(description = "创建时间") @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonView(ReadView.class) private Date createTime; @Schema(description = "更新时间") @JsonFormat(pattern = "YYYY-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonView(ReadView.class) private Date updateTime; } \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/dto/blog/BlogLatestDto.java b/common/src/main/java/com/cxx/common/dto/blog/BlogLatestDto.java new file mode 100644 index 0000000..60ac2c0 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/blog/BlogLatestDto.java @@ -0,0 +1,20 @@ +package com.cxx.common.dto.blog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * @Author: Cxx + * @Date: 2024/9/16 19:47 + * @Description: + */ +@Getter +@Setter +public class BlogLatestDto { + @Schema(description = "id") + private Long id; + + @Schema(description = "博客标题") + private String title; +} diff --git a/common/src/main/java/com/cxx/common/dto/blog/BlogStatsDto.java b/common/src/main/java/com/cxx/common/dto/blog/BlogStatsDto.java new file mode 100644 index 0000000..5a03072 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/blog/BlogStatsDto.java @@ -0,0 +1,20 @@ +package com.cxx.common.dto.blog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * @Author: Cxx + * @Date: 2024/9/16 19:47 + * @Description: + */ +@Getter +@Setter +public class BlogStatsDto { + @Schema(description = "博客数量") + private Long blogCount; + + @Schema(description = "博客类别数量") + private Long categoryCount; +} diff --git a/common/src/main/java/com/cxx/common/dto/blog/BlogVisitDto.java b/common/src/main/java/com/cxx/common/dto/blog/BlogVisitDto.java new file mode 100644 index 0000000..fd8346b --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/blog/BlogVisitDto.java @@ -0,0 +1,31 @@ +package com.cxx.common.dto.blog; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class BlogVisitDto { + @Schema(description = "访问ip") + private String ip; + + @Schema(description = "访问系统") + private String os; + + @Schema(description = "访问浏览器") + private String browser; + + @Schema(description = "访问路径") + private String uri; + + @Schema(description = "博客标题") + private String title; + + @Schema(description = "访问时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date visitTime; +} diff --git a/common/src/main/java/com/cxx/common/dto/budget/BudgetDto.java b/common/src/main/java/com/cxx/common/dto/budget/BudgetDto.java new file mode 100644 index 0000000..bbed016 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/budget/BudgetDto.java @@ -0,0 +1,51 @@ +package com.cxx.common.dto.budget; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class BudgetDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "预算类别") + @NotBlank(message = "类别不能为空") + private String category; + + @Schema(description = "预算项目") + @NotBlank(message = "项目不能为空") + private String project; + + @Schema(description = "预算内容") + private String content; + + @Schema(description = "供应商") + private String vendor; + + @Schema(description = "预算支出") + @PositiveOrZero(message = "预算支出支出必须大于等于0") + private Double budget; + + @Schema(description = "实际支出") + @PositiveOrZero(message = "实际支出支出必须大于等于0") + private Double actual; + + @Schema(description = "支付时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date payTime; + + @Schema(description = "备注") + private String remake; +} diff --git a/common/src/main/java/com/cxx/common/dto/message/MailMessageDto.java b/common/src/main/java/com/cxx/common/dto/message/MailMessageDto.java new file mode 100644 index 0000000..23d199f --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/message/MailMessageDto.java @@ -0,0 +1,10 @@ +package com.cxx.common.dto.message; + +import lombok.Data; + +@Data +public class MailMessageDto { + private String to; + private String subject; + private String body; +} diff --git a/common/src/main/java/com/cxx/common/dto/plan/PlanDto.java b/common/src/main/java/com/cxx/common/dto/plan/PlanDto.java new file mode 100644 index 0000000..a8b6047 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/plan/PlanDto.java @@ -0,0 +1,62 @@ +package com.cxx.common.dto.plan; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class PlanDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "标题") + @NotBlank(message = "标题不能为空") + private String title; + + @Schema(description = "内容") + private String content; + + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; + + @Schema(description = "开始时间") + @JsonFormat(pattern = "HH:mm", timezone = "GMT+8") + private Date startTime; + + @Schema(description = "结束时间") + @JsonFormat(pattern = "HH:mm", timezone = "GMT+8") + private Date endTime; + + @Schema(description = "提醒时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date alterTime; + + @Schema(description = "邮箱地址") + private String email; + + @Schema(description = "任务id") + private Long taskId; + + @Schema(description = "标签") + private String tag; + + @Schema(description = "是否置顶") + private Integer isTop; + + @Schema(description = "优先级") + private Integer priority; + + @Schema(description = "是否完成") + private Integer completed; +} diff --git a/common/src/main/java/com/cxx/common/dto/plan/PlanStatsDto.java b/common/src/main/java/com/cxx/common/dto/plan/PlanStatsDto.java new file mode 100644 index 0000000..8bb37f8 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/plan/PlanStatsDto.java @@ -0,0 +1,21 @@ +package com.cxx.common.dto.plan; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PlanStatsDto { + @Schema(description = "计划总数") + private Integer totalCount; + + @Schema(description = "完成总数") + private Integer completedCount; + + @Schema(description = "当前计划") + private Integer currentCount; + + @Schema(description = "过期计划") + private Integer remainCount; +} diff --git a/common/src/main/java/com/cxx/common/dto/task/TaskDto.java b/common/src/main/java/com/cxx/common/dto/task/TaskDto.java new file mode 100644 index 0000000..17e94cf --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/task/TaskDto.java @@ -0,0 +1,25 @@ +package com.cxx.common.dto.task; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +public class TaskDto { + @Schema(description = "任务类型") + private String type; + + @Schema(description = "任务内容") + private String content; + + @Schema(description = "执行时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date executeTime; + + @Schema(description = "定时任务表达式") + private String cronExpression; +} diff --git a/common/src/main/java/com/cxx/common/dto/user/SessionDto.java b/common/src/main/java/com/cxx/common/dto/user/SessionDto.java new file mode 100644 index 0000000..aa221ce --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/user/SessionDto.java @@ -0,0 +1,17 @@ +package com.cxx.common.dto.user; + +import cn.dev33.satoken.stp.SaTokenInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SessionDto { + @Schema(description = "令牌") + private SaTokenInfo saToken; + + @Schema(description = "用户信息") + private UserDto userInfo; +} + diff --git a/common/src/main/java/com/cxx/common/dto/user/UserDto.java b/common/src/main/java/com/cxx/common/dto/user/UserDto.java new file mode 100644 index 0000000..ff4b802 --- /dev/null +++ b/common/src/main/java/com/cxx/common/dto/user/UserDto.java @@ -0,0 +1,68 @@ +package com.cxx.common.dto.user; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +@Getter +@Setter +@JsonView(PlainView.class) +public class UserDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "账号id") + @JsonView(ReadView.class) + private Long accountId; + + @Schema(description = "账号名称") + @JsonView(ReadView.class) + private String accountName; + + @Schema(description = "用户名称") + @NotBlank(message = "用户名称不能为空") + private String username; + + @Schema(description = "性别") + private Integer gender; + + @Schema(description = "身份证号") + private String idNumber; + + @Schema(description = "手机号码") + private String phoneNumber; + + @Schema(description = "电子邮件") + private String email; + + @Schema(description = "生日") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date birthDate; + + @Schema(description = "头像") + private String avatar; + + @Schema(description = "地区") + private List area; + + @Schema(description = "地址") + private String address; + + @Schema(description = "职业") + private String job; + + @Schema(description = "标签") + private List tags; + + @Schema(description = "描述") + private String description; +} diff --git a/common/src/main/java/com/cxx/common/entity/Account.java b/common/src/main/java/com/cxx/common/entity/Account.java new file mode 100644 index 0000000..b89efd9 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/Account.java @@ -0,0 +1,24 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("account") +public class Account extends AbstractEntity { + @TableField("account_name") + private String accountName; + + @TableField("password") + private String password; + + @TableField("user_id") + private Long userId; + + @TableField("state") + private Integer state; +} diff --git a/common/src/main/java/com/cxx/common/entity/BillBook.java b/common/src/main/java/com/cxx/common/entity/BillBook.java new file mode 100644 index 0000000..8a5f29b --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BillBook.java @@ -0,0 +1,21 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bill_book") +public class BillBook extends AbstractEntity { + @TableField("name") + private String name; + + @TableField("icon") + private String icon; + + @TableField("color") + private String color; +} diff --git a/common/src/main/java/com/cxx/common/entity/BillCategory.java b/common/src/main/java/com/cxx/common/entity/BillCategory.java new file mode 100644 index 0000000..1cb537d --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BillCategory.java @@ -0,0 +1,27 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bill_category") +public class BillCategory extends AbstractEntity { + @TableField("book_id") + private Long bookId; + + @TableField("name") + private String name; + + @TableField("type") + private String type; + + @TableField("icon") + private String icon; + + @TableField("color") + private String color; +} diff --git a/common/src/main/java/com/cxx/common/entity/BillImage.java b/common/src/main/java/com/cxx/common/entity/BillImage.java new file mode 100644 index 0000000..a005e9f --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BillImage.java @@ -0,0 +1,15 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("bill_image") +public class BillImage { + @TableField("bill_id") + private Long billId; + + @TableField("image_url") + private String imageUrl; +} diff --git a/common/src/main/java/com/cxx/common/entity/BillPay.java b/common/src/main/java/com/cxx/common/entity/BillPay.java new file mode 100644 index 0000000..96f97d6 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BillPay.java @@ -0,0 +1,21 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bill_pay") +public class BillPay extends AbstractEntity { + @TableField("name") + private String name; + + @TableField("icon") + private String icon; + + @TableField("color") + private String color; +} diff --git a/common/src/main/java/com/cxx/common/entity/BillRecord.java b/common/src/main/java/com/cxx/common/entity/BillRecord.java new file mode 100644 index 0000000..36dd7b5 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BillRecord.java @@ -0,0 +1,41 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bill_record") +public class BillRecord extends AbstractEntity { + @TableField("book_id") + private Long bookId; + + @TableField("type") + private String type; + + @TableField("category_id") + private Long categoryId; + + @TableField("location") + private String location; + + @TableField("date") + private Date date; + + @TableField("amount") + private Double amount; + + @TableField("content") + private String content; + + @TableField("pay_id") + private Long payId; + + @TableField("remark") + private String remark; +} diff --git a/common/src/main/java/com/cxx/common/entity/Blog.java b/common/src/main/java/com/cxx/common/entity/Blog.java new file mode 100644 index 0000000..4aa6e27 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/Blog.java @@ -0,0 +1,36 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("blog") +public class Blog extends AbstractEntity { + @TableField("title") + private String title; + + @TableField("top_value") + private Integer topValue; + + @TableField("is_great") + private Boolean isGreat; + + @TableField("category_id") + private Long categoryId; + + @TableField("summary") + private String summary; + + @TableField("content_id") + private Long contentId; + + @TableField("word_count") + private Integer wordCount; + + @TableField("read_duration") + private Double readDuration; +} diff --git a/common/src/main/java/com/cxx/common/entity/BlogCategory.java b/common/src/main/java/com/cxx/common/entity/BlogCategory.java new file mode 100644 index 0000000..e6734f6 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BlogCategory.java @@ -0,0 +1,20 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: Cxx + * @Date: 2024/9/15 10:11 + * @Description: 博客分类 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("blog_category") +public class BlogCategory extends AbstractEntity { + @TableField("name") + private String name; +} diff --git a/common/src/main/java/com/cxx/common/entity/BlogContent.java b/common/src/main/java/com/cxx/common/entity/BlogContent.java new file mode 100644 index 0000000..cc88b57 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BlogContent.java @@ -0,0 +1,20 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractIdEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @Author: Cxx + * @Date: 2024/9/15 10:09 + * @Description: 博客内容 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("blog_content") +public class BlogContent extends AbstractIdEntity { + @TableField("content") + private String content; +} diff --git a/common/src/main/java/com/cxx/common/entity/BlogVisit.java b/common/src/main/java/com/cxx/common/entity/BlogVisit.java new file mode 100644 index 0000000..70b3a81 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BlogVisit.java @@ -0,0 +1,27 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("blog_visit") +public class BlogVisit extends AbstractEntity { + @TableField("ip") + private String ip; + + @TableField("os") + private String os; + + @TableField("browser") + private String browser; + + @TableField("uri") + private String uri; + + @TableField("blog_id") + private Long blogId; +} diff --git a/common/src/main/java/com/cxx/common/entity/Budget.java b/common/src/main/java/com/cxx/common/entity/Budget.java new file mode 100644 index 0000000..e6643be --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/Budget.java @@ -0,0 +1,38 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("budget") +public class Budget extends AbstractEntity { + @TableField("category_id") + private Long categoryId; + + @TableField("project") + private String project; + + @TableField("content") + private String content; + + @TableField("vendor") + private String vendor; + + @TableField("budget") + private Double budget; + + @TableField("actual") + private Double actual; + + @TableField("pay_time") + private Date payTime; + + @TableField("remake") + private String remake; +} diff --git a/common/src/main/java/com/cxx/common/entity/BudgetCategory.java b/common/src/main/java/com/cxx/common/entity/BudgetCategory.java new file mode 100644 index 0000000..d16ff08 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/BudgetCategory.java @@ -0,0 +1,15 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("budget_category") +public class BudgetCategory extends AbstractEntity { + @TableField("name") + private String name; +} diff --git a/common/src/main/java/com/cxx/common/entity/FileRecord.java b/common/src/main/java/com/cxx/common/entity/FileRecord.java new file mode 100644 index 0000000..75e4bbd --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/FileRecord.java @@ -0,0 +1,24 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("file_record") +public class FileRecord extends AbstractEntity { + @TableField("name") + private String name; + + @TableField("md5") + private String md5; + + @TableField("path") + private String path; + + @TableField("url") + private String url; +} diff --git a/common/src/main/java/com/cxx/common/entity/Plan.java b/common/src/main/java/com/cxx/common/entity/Plan.java new file mode 100644 index 0000000..bec12df --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/Plan.java @@ -0,0 +1,48 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("plan") +public class Plan extends AbstractEntity { + @TableField("title") + private String title; + + @TableField("content") + private String content; + + @TableField(value = "date", updateStrategy = FieldStrategy.ALWAYS) + private Date date; + + @TableField(value = "start_time", updateStrategy = FieldStrategy.ALWAYS) + private Date startTime; + + @TableField(value = "end_time", updateStrategy = FieldStrategy.ALWAYS) + private Date endTime; + + @TableField(value = "alter_time", updateStrategy = FieldStrategy.ALWAYS) + private Date alterTime; + + @TableField(value = "task_id", updateStrategy = FieldStrategy.ALWAYS) + private Long taskId; + + @TableField("tag") + private String tag; + + @TableField("is_top") + private Integer isTop; + + @TableField("priority") + private Integer priority; + + @TableField("completed") + private Integer completed; +} diff --git a/common/src/main/java/com/cxx/common/entity/Task.java b/common/src/main/java/com/cxx/common/entity/Task.java new file mode 100644 index 0000000..df7db43 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/Task.java @@ -0,0 +1,27 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import com.cxx.framework.data.AbstractIdEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("task") +public class Task extends AbstractIdEntity { + @TableField("type") + private String type; + + @TableField("content") + private String content; + + @TableField("execute_time") + private Date executeTime; + + @TableField("cron_expression") + private String cronExpression; +} diff --git a/common/src/main/java/com/cxx/common/entity/User.java b/common/src/main/java/com/cxx/common/entity/User.java new file mode 100644 index 0000000..54cd5a3 --- /dev/null +++ b/common/src/main/java/com/cxx/common/entity/User.java @@ -0,0 +1,52 @@ +package com.cxx.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "user", autoResultMap = true) +public class User extends AbstractEntity { + @TableField("username") + private String username; + + @TableField("gender") + private Integer gender; + + @TableField("id_number") + private String idNumber; + + @TableField("phone_number") + private String phoneNumber; + + @TableField("email") + private String email; + + @TableField("birth_date") + private Date birthDate; + + @TableField("avatar") + private String avatar; + + @TableField(value = "area", typeHandler = JacksonTypeHandler.class) + private List area; + + @TableField("address") + private String address; + + @TableField("job") + private String job; + + @TableField(value = "tags", typeHandler = JacksonTypeHandler.class) + private List tags; + + @TableField("description") + private String description; +} diff --git a/common/src/main/java/com/cxx/common/mapper/AccountMapper.java b/common/src/main/java/com/cxx/common/mapper/AccountMapper.java new file mode 100644 index 0000000..98e02ad --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/AccountMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.Account; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AccountMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BillBookMapper.java b/common/src/main/java/com/cxx/common/mapper/BillBookMapper.java new file mode 100644 index 0000000..52451a0 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BillBookMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BillBook; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BillBookMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BillCategoryMapper.java b/common/src/main/java/com/cxx/common/mapper/BillCategoryMapper.java new file mode 100644 index 0000000..13d1a2b --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BillCategoryMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BillCategory; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BillCategoryMapper extends BaseMapper { +} diff --git a/common/src/main/java/com/cxx/common/mapper/BillImageMapper.java b/common/src/main/java/com/cxx/common/mapper/BillImageMapper.java new file mode 100644 index 0000000..5809400 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BillImageMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BillImage; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BillImageMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BillPayMapper.java b/common/src/main/java/com/cxx/common/mapper/BillPayMapper.java new file mode 100644 index 0000000..11a8e4d --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BillPayMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BillPay; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BillPayMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BillRecordMapper.java b/common/src/main/java/com/cxx/common/mapper/BillRecordMapper.java new file mode 100644 index 0000000..014d9cc --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BillRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BillRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BillRecordMapper extends BaseMapper { +} diff --git a/common/src/main/java/com/cxx/common/mapper/BlogCategoryMapper.java b/common/src/main/java/com/cxx/common/mapper/BlogCategoryMapper.java new file mode 100644 index 0000000..907a07c --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BlogCategoryMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BlogCategory; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BlogCategoryMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BlogContentMapper.java b/common/src/main/java/com/cxx/common/mapper/BlogContentMapper.java new file mode 100644 index 0000000..b349799 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BlogContentMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BlogContent; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BlogContentMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BlogMapper.java b/common/src/main/java/com/cxx/common/mapper/BlogMapper.java new file mode 100644 index 0000000..865077d --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BlogMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.Blog; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BlogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BlogVisitMapper.java b/common/src/main/java/com/cxx/common/mapper/BlogVisitMapper.java new file mode 100644 index 0000000..3e1f101 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BlogVisitMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BlogVisit; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BlogVisitMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BudgetCategoryMapper.java b/common/src/main/java/com/cxx/common/mapper/BudgetCategoryMapper.java new file mode 100644 index 0000000..a9bf043 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BudgetCategoryMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.BudgetCategory; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BudgetCategoryMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/BudgetMapper.java b/common/src/main/java/com/cxx/common/mapper/BudgetMapper.java new file mode 100644 index 0000000..93ced54 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/BudgetMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.Budget; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BudgetMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/FileRecordMapper.java b/common/src/main/java/com/cxx/common/mapper/FileRecordMapper.java new file mode 100644 index 0000000..1ba2e3d --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/FileRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.FileRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FileRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/PlanMapper.java b/common/src/main/java/com/cxx/common/mapper/PlanMapper.java new file mode 100644 index 0000000..bcf5e82 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/PlanMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.Plan; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PlanMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/mapper/TaskMapper.java b/common/src/main/java/com/cxx/common/mapper/TaskMapper.java new file mode 100644 index 0000000..e24bedb --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/TaskMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.Task; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TaskMapper extends BaseMapper { +} diff --git a/common/src/main/java/com/cxx/common/mapper/UserMapper.java b/common/src/main/java/com/cxx/common/mapper/UserMapper.java new file mode 100644 index 0000000..d700d55 --- /dev/null +++ b/common/src/main/java/com/cxx/common/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package com.cxx.common.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.common.entity.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/vo/bill/BillQueryVo.java b/common/src/main/java/com/cxx/common/vo/bill/BillQueryVo.java new file mode 100644 index 0000000..a58e888 --- /dev/null +++ b/common/src/main/java/com/cxx/common/vo/bill/BillQueryVo.java @@ -0,0 +1,21 @@ +package com.cxx.common.vo.bill; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class BillQueryVo { + @Schema(description = "账本名称") + private String bookName; + + @Schema(description = "账单类型") + private String type; + + @Schema(description = "开始日期") + private String startDate; + + @Schema(description = "结束日期") + private String endDate; +} \ No newline at end of file diff --git a/common/src/main/java/com/cxx/common/vo/blog/BlogQueryVo.java b/common/src/main/java/com/cxx/common/vo/blog/BlogQueryVo.java new file mode 100644 index 0000000..303f03c --- /dev/null +++ b/common/src/main/java/com/cxx/common/vo/blog/BlogQueryVo.java @@ -0,0 +1,23 @@ +package com.cxx.common.vo.blog; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +/** + * @Author: Cxx + * @Date: 2024/9/16 19:52 + * @Description: + */ +@Getter +@Setter +public class BlogQueryVo { + @Schema(description = "博客类别") + private String category; + + @Schema(description = "博客标题") + private String title; + + @Schema(description = "博客年份") + private Integer year; +} diff --git a/common/src/main/java/com/cxx/common/vo/plan/PlanQueryVo.java b/common/src/main/java/com/cxx/common/vo/plan/PlanQueryVo.java new file mode 100644 index 0000000..63fac64 --- /dev/null +++ b/common/src/main/java/com/cxx/common/vo/plan/PlanQueryVo.java @@ -0,0 +1,15 @@ +package com.cxx.common.vo.plan; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PlanQueryVo { + @Schema(description = "数据类型") + private String planType; + + @Schema(description = "排序类型") + private String orderType; +} diff --git a/home-service/Dockerfile b/home-service/Dockerfile new file mode 100644 index 0000000..94ced11 --- /dev/null +++ b/home-service/Dockerfile @@ -0,0 +1,6 @@ +FROM docker-0.unsee.tech/openjdk:11-jdk-slim +ARG JAR_FILE=target/*.jar +COPY $JAR_FILE app.jar +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo 'Asia/Shanghai' > /etc/timezone +ENTRYPOINT ["java","-jar","/app.jar"] \ No newline at end of file diff --git a/home-service/pom.xml b/home-service/pom.xml new file mode 100644 index 0000000..86734e4 --- /dev/null +++ b/home-service/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + com.cxx + sweet-hut-service + 2.0.0 + + + home-service + 2.0.0 + + + 17 + 17 + UTF-8 + + + + + com.cxx + common + 2.0.0 + + + + + com.github.binarywang + weixin-java-mp + 4.7.5.B + + + + + + + org.graalvm.buildtools + native-maven-plugin + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/HomeServiceApplication.java b/home-service/src/main/java/com/cxx/home/HomeServiceApplication.java new file mode 100644 index 0000000..49ebf21 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/HomeServiceApplication.java @@ -0,0 +1,15 @@ +package com.cxx.home; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@MapperScan(basePackages = {"com.cxx.common.mapper", "com.cxx.home.mapper", "com.cxx.home.dao"}, sqlSessionTemplateRef = "sqlSessionTemplate") +@EnableScheduling +public class HomeServiceApplication { + public static void main(String[] args) { + SpringApplication.run(HomeServiceApplication.class, args); + } +} diff --git a/home-service/src/main/java/com/cxx/home/controller/AnniversaryController.java b/home-service/src/main/java/com/cxx/home/controller/AnniversaryController.java new file mode 100644 index 0000000..dbcb121 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/AnniversaryController.java @@ -0,0 +1,55 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.common.dto.StatsChartDto; +import com.cxx.home.dto.anniversary.AnniversaryDto; +import com.cxx.home.service.AnniversaryService; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/anniversary") +@Tag(name = "纪念日") +public class AnniversaryController { + @Resource + private AnniversaryService anniversaryService; + + @Operation(summary = "查询纪念日") + @GetMapping("") + public @JsonView(ReadView.class) List queryAnniversary(@RequestParam("category") String category) { + return anniversaryService.queryAnniversary(category); + } + + @Operation(summary = "新增纪念日") + @PostMapping("") + public Boolean addAnniversary(@RequestBody @JsonView(WriteView.class) @Validated AnniversaryDto anniversaryDto) { + return anniversaryService.addAnniversary(anniversaryDto); + } + + @Operation(summary = "更新纪念日") + @PutMapping("/{id}") + public Boolean updateAnniversary(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) AnniversaryDto anniversaryDto) { + return anniversaryService.updateAnniversary(id, anniversaryDto); + } + + @Operation(summary = "删除纪念日") + @DeleteMapping("/{id}") + public Boolean deleteAnniversary(@PathVariable("id") long id) { + return anniversaryService.deleteAnniversary(id); + } + + @Operation(summary = "查询纪念日类别") + @GetMapping("/category") + public List queryAnniversaryCategory() { + return anniversaryService.queryAnniversaryCategory(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/AssetController.java b/home-service/src/main/java/com/cxx/home/controller/AssetController.java new file mode 100644 index 0000000..9e53354 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/AssetController.java @@ -0,0 +1,54 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.asset.AssetDto; +import com.cxx.home.service.AssetService; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/asset") +@Tag(name = "资产") +public class AssetController { + @Resource + private AssetService assetService; + + @Operation(summary = "查询资产") + @GetMapping("") + public @JsonView(ReadView.class) List queryAsset(@RequestParam("category") String category) { + return assetService.queryAsset(category); + } + + @Operation(summary = "新增资产") + @PostMapping("") + public Boolean addAsset(@RequestBody @JsonView(WriteView.class) @Validated AssetDto assetDto) { + return assetService.addAsset(assetDto); + } + + @Operation(summary = "更新资产") + @PutMapping("/{id}") + public Boolean updateAsset(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) AssetDto assetDto) { + return assetService.updateAsset(id, assetDto); + } + + @Operation(summary = "删除资产") + @DeleteMapping("/{id}") + public Boolean deleteAsset(@PathVariable("id") long id) { + return assetService.deleteAsset(id); + } + + @Operation(summary = "查询资产类别") + @GetMapping("/category") + public List queryAssetCategory() { + return assetService.queryAssetCategory(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/BillController.java b/home-service/src/main/java/com/cxx/home/controller/BillController.java new file mode 100644 index 0000000..f846df7 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/BillController.java @@ -0,0 +1,82 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.bill.BillCategoryDto; +import com.cxx.common.dto.bill.BillItemDto; +import com.cxx.common.dto.bill.BillRecordDto; +import com.cxx.common.dto.bill.BillSummaryDto; +import com.cxx.home.service.BillRecordService; +import com.cxx.common.vo.bill.BillQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/bill") +@Tag(name = "账单记录") +public class BillController { + @Resource + private BillRecordService billRecordService; + + @Operation(summary = "新增账单") + @PostMapping("") + public Boolean addBillRecord(@RequestBody @JsonView(WriteView.class) BillRecordDto billRecordDto) { + return billRecordService.saveOrUpdateBillRecord(0L, billRecordDto); + } + + @Operation(summary = "更新账单") + @PutMapping("/{id}") + public Boolean updateBillRecord(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) BillRecordDto billRecordDto) { + return billRecordService.saveOrUpdateBillRecord(id, billRecordDto); + } + + @Operation(summary = "删除账单") + @DeleteMapping("/{id}") + public Boolean deleteBillRecord(@PathVariable("id") long id) { + return billRecordService.deleteBillRecord(id); + } + + @Operation(summary = "查询账单记录") + @GetMapping("/{id}") + public @JsonView(ReadView.class) BillRecordDto queryBillRecord(@PathVariable("id") long id) { + return billRecordService.queryBillRecord(id); + } + + @Operation(summary = "查询账单概要") + @GetMapping("/summary") + public @JsonView(ReadView.class) List queryBillSummary(BillQueryVo billQueryVo) { + return billRecordService.queryBillSummary(billQueryVo); + } + + @Operation(summary = "查询账单统计") + @GetMapping("/stats/{type}") + public List queryBillStats(@PathVariable("type") String type, BillQueryVo billQueryVo) { + return billRecordService.queryBillStats(type, billQueryVo); + } + + @Operation(summary = "查询账户") + @GetMapping("/pay") + public @JsonView(ReadView.class) List queryBillPay() { + return billRecordService.queryBillPay(); + } + + @Operation(summary = "查询账本") + @GetMapping("/book") + public @JsonView(ReadView.class) List queryBillBook() { + return billRecordService.queryBillBook(); + } + + @Operation(summary = "查询账单类型") + @GetMapping("/category") + public List queryBillCategory() { + return billRecordService.queryBillCategory(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/BudgetController.java b/home-service/src/main/java/com/cxx/home/controller/BudgetController.java new file mode 100644 index 0000000..ed20b2f --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/BudgetController.java @@ -0,0 +1,67 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.budget.BudgetDto; +import com.cxx.home.service.BudgetService; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/budget") +@Tag(name = "预算统计") +public class BudgetController { + @Resource + private BudgetService budgetService; + + @Operation(summary = "查询预算类别") + @GetMapping("/category") + public List queryBudgetCategory() { + return budgetService.queryBudgetCategory(); + } + + @Operation(summary = "新增预算") + @PostMapping("") + public Boolean addBudget(@RequestBody @JsonView(WriteView.class) @Validated BudgetDto budgetDto) { + return budgetService.addBudget(budgetDto); + } + + @Operation(summary = "更新预算") + @PutMapping("/{id}") + public Boolean updateBudget(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) BudgetDto budgetDto) { + return budgetService.updateBudget(id, budgetDto); + } + + @Operation(summary = "删除预算") + @DeleteMapping("/{id}") + public Boolean deleteBudget(@PathVariable("id") long id) { + return budgetService.deleteBudget(id); + } + + @Operation(summary = "查询预算") + @GetMapping("") + public @JsonView(ReadView.class) List queryBudget(@RequestParam("category") String category) { + return budgetService.queryBudget(category); + } + + @Operation(summary = "预算排行统计") + @GetMapping("stats/rank") + public List queryBudgetRankStats(@RequestParam("category") String category) { + return budgetService.queryBudgetRankStats(category); + } + + @Operation(summary = "预算项目统计") + @GetMapping("stats/project") + public List queryBudgetProjectStats(@RequestParam("category") String category) { + return budgetService.queryBudgetProjectStats(category); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/FoodController.java b/home-service/src/main/java/com/cxx/home/controller/FoodController.java new file mode 100644 index 0000000..c3229c0 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/FoodController.java @@ -0,0 +1,105 @@ +package com.cxx.home.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.food.FoodRecipeDto; +import com.cxx.home.dto.food.FoodRecordDto; +import com.cxx.home.dto.food.FoodStatsDto; +import com.cxx.home.dto.food.FoodSummaryDto; +import com.cxx.home.service.FoodService; +import com.cxx.home.vo.FoodQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/food") +@Tag(name = "美食记录") +public class FoodController { + @Resource + private FoodService foodService; + + @Operation(summary = "新增美食菜谱") + @PostMapping("/recipe") + public Boolean addFoodRecipe(@RequestBody @JsonView(WriteView.class) @Validated FoodRecipeDto foodRecipeDto) { + return foodService.addFoodRecipe(foodRecipeDto); + } + + @Operation(summary = "更新美食菜谱") + @PutMapping("/recipe/{id}") + public Boolean updateFoodRecipe(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) FoodRecipeDto foodRecipeDto) { + return foodService.updateFoodRecipe(id, foodRecipeDto); + } + + @Operation(summary = "删除美食菜谱") + @DeleteMapping("/recipe/{id}") + public Boolean deleteFoodRecipe(@PathVariable("id") long id) { + return foodService.deleteFoodRecipe(id); + } + + @Operation(summary = "分页查询美食菜谱") + @GetMapping("/recipe/page") + public IPage queryFoodSummary(@RequestParam("currentPage") Integer currentPage, + @RequestParam("pageSize") Integer pageSize, + FoodQueryVo foodQueryVo) { + return foodService.queryFoodSummary(currentPage, pageSize, foodQueryVo); + } + + @Operation(summary = "查询美食") + @GetMapping("/recipe/{id}") + public @JsonView(ReadView.class) FoodRecipeDto queryFoodRecipe(@PathVariable("id") long id) { + return foodService.queryFoodRecipe(id); + } + + @Operation(summary = "查询所有美食名称") + @GetMapping("/recipe/name") + public List queryFoodName() { + return foodService.queryFoodName(); + } + + @Operation(summary = "新增美食成果") + @PostMapping("/record") + public Boolean addFoodRecord(@RequestBody @JsonView(WriteView.class) @Validated FoodRecordDto foodRecordDto) { + return foodService.addFoodRecord(foodRecordDto); + } + + @Operation(summary = "更新美食成果") + @PutMapping("/record/{id}") + public Boolean updateFoodRecord(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) FoodRecordDto foodRecordDto) { + return foodService.updateFoodRecord(id, foodRecordDto); + } + + @Operation(summary = "删除美食成果") + @DeleteMapping("/record/{id}") + public Boolean deleteFoodRecord(@PathVariable("id") long id) { + return foodService.deleteFoodRecord(id); + } + + @Operation(summary = "查询美食记录") + @GetMapping("/record") + public @JsonView(ReadView.class) List queryFoodRecord(@RequestParam("startDate") String startDate, + @RequestParam("endDate") String endDate) { + return foodService.queryFoodRecord(startDate, endDate); + } + + @Operation(summary = "查询美食类别") + @GetMapping("/category") + public List queryFoodCategory() { + return foodService.queryFoodCategory(); + } + + @Operation(summary = "查询美食统计") + @GetMapping("/stats") + public FoodStatsDto queryFoodStats() { + return foodService.queryFoodStats(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/JournalController.java b/home-service/src/main/java/com/cxx/home/controller/JournalController.java new file mode 100644 index 0000000..e98ae09 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/JournalController.java @@ -0,0 +1,50 @@ + +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.journal.JournalDto; +import com.cxx.home.service.JournalService; +import com.cxx.home.vo.JournalQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/journal") +@Tag(name = "日记") +public class JournalController { + @Resource + private JournalService journalService; + + @Operation(summary = "查询日记") + @GetMapping("") + public @JsonView(ReadView.class) List queryJournal(JournalQueryVo queryVo) { + return journalService.queryJournal(queryVo); + } + + @Operation(summary = "新增日记") + @PostMapping("") + public Boolean addAnniversary(@RequestBody @JsonView(WriteView.class) @Validated JournalDto journalDto) { + return journalService.addJournal(journalDto); + } + + @Operation(summary = "更新日记") + @PutMapping("/{id}") + public Boolean updateAnniversary(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) JournalDto journalDto) { + return journalService.updateJournal(id, journalDto); + } + + @Operation(summary = "删除日记") + @DeleteMapping("/{id}") + public Boolean deleteAnniversary(@PathVariable("id") long id) { + return journalService.deleteJournal(id); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/KpiController.java b/home-service/src/main/java/com/cxx/home/controller/KpiController.java new file mode 100644 index 0000000..cf2193f --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/KpiController.java @@ -0,0 +1,49 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.kpi.KpiDto; +import com.cxx.home.service.KpiService; +import com.cxx.home.vo.KpiQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/kpi") +@Tag(name = "绩效") +public class KpiController { + @Resource + private KpiService kpiService; + + @Operation(summary = "查询绩效") + @GetMapping("") + public @JsonView(ReadView.class) List queryKpi(KpiQueryVo queryVo) { + return kpiService.queryKpi(queryVo); + } + + @Operation(summary = "新增绩效") + @PostMapping("") + public Boolean addKpi(@RequestBody @JsonView(WriteView.class) @Validated KpiDto kpiDto) { + return kpiService.addKpi(kpiDto); + } + + @Operation(summary = "更新绩效") + @PutMapping("/{id}") + public Boolean updateKpi(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) KpiDto kpiDto) { + return kpiService.updateKpi(id, kpiDto); + } + + @Operation(summary = "删除绩效") + @DeleteMapping("/{id}") + public Boolean deleteKpi(@PathVariable("id") long id) { + return kpiService.deleteKpi(id); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/LedgerController.java b/home-service/src/main/java/com/cxx/home/controller/LedgerController.java new file mode 100644 index 0000000..a15d17d --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/LedgerController.java @@ -0,0 +1,54 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.ledger.LedgerDto; +import com.cxx.home.service.LedgerService; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/ledger") +@Tag(name = "账本") +public class LedgerController { + @Resource + private LedgerService ledgerService; + + @Operation(summary = "查询账本内容") + @GetMapping("") + public @JsonView(ReadView.class) List queryLedger(@RequestParam("book") String book) { + return ledgerService.queryLedger(book); + } + + @Operation(summary = "新增账本内容") + @PostMapping("") + public Boolean addLedger(@RequestBody @JsonView(WriteView.class) @Validated LedgerDto ledgerDto) { + return ledgerService.addLedger(ledgerDto); + } + + @Operation(summary = "更新账本内容") + @PutMapping("/{id}") + public Boolean updateLedger(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) LedgerDto ledgerDto) { + return ledgerService.updateLedger(id, ledgerDto); + } + + @Operation(summary = "删除账本内容") + @DeleteMapping("/{id}") + public Boolean deleteLedger(@PathVariable("id") long id) { + return ledgerService.deleteLedger(id); + } + + @Operation(summary = "查询账本") + @GetMapping("/book") + public List queryLedgerBook() { + return ledgerService.queryLedgerBook(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/PeriodController.java b/home-service/src/main/java/com/cxx/home/controller/PeriodController.java new file mode 100644 index 0000000..62ec578 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/PeriodController.java @@ -0,0 +1,55 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.period.PeriodDayDto; +import com.cxx.home.dto.period.PeriodSettingDto; +import com.cxx.home.service.PeriodService; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/period") +@Tag(name = "月经记录") +public class PeriodController { + @Resource + private PeriodService periodService; + + @Operation(summary = "查询月经天") + @GetMapping("/day") + public @JsonView(ReadView.class) List queryPeriodDay(@RequestParam("month") String month) { + return periodService.queryPeriodDay(month); + } + + @Operation(summary = "更新月经天") + @PutMapping("/day/{id}") + public Boolean updatePeriodDay(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) PeriodDayDto periodDayDto) { + return periodService.updatePeriodDay(id, periodDayDto); + } + + @Operation(summary = "获取当月月经初始天") + @GetMapping("/menstruate") + public String getMenstruateFirstDate(@RequestParam("month") String month) { + return periodService.getMenstruateFirstDate(month); + } + + @Operation(summary = "查询月经设置") + @GetMapping("/setting") + public @JsonView(ReadView.class) PeriodSettingDto queryPeriodSetting() { + return periodService.queryPeriodSetting(); + } + + @Operation(summary = "更新月经设置") + @PutMapping("/setting/{id}") + public Boolean updatePeriodSetting(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) PeriodSettingDto periodSettingDto) { + return periodService.updatePeriodSetting(id, periodSettingDto); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/PlanController.java b/home-service/src/main/java/com/cxx/home/controller/PlanController.java new file mode 100644 index 0000000..bdf21c2 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/PlanController.java @@ -0,0 +1,62 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.common.dto.plan.PlanDto; +import com.cxx.common.dto.plan.PlanStatsDto; +import com.cxx.common.vo.plan.PlanQueryVo; +import com.cxx.home.service.PlanService; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/plan") +@Tag(name = "日程安排") +public class PlanController { + @Resource + private PlanService planService; + + @Operation(summary = "查询日程安排") + @GetMapping("") + public @JsonView(ReadView.class) List queryPlan(PlanQueryVo query) { + return planService.queryPlan(query); + } + + @Operation(summary = "新增日程安排") + @PostMapping("") + public Boolean addPlan(@RequestBody @JsonView(WriteView.class) @Validated PlanDto planDto) { + return planService.addPlan(planDto); + } + + @Operation(summary = "更新日程安排") + @PutMapping("/{id}") + public Boolean updatePlan(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) PlanDto planDto) { + return planService.updatePlan(id, planDto); + } + + @Operation(summary = "删除日程安排") + @DeleteMapping("/{id}") + public Boolean deletePlan(@PathVariable("id") long id) { + return planService.deletePlan(id); + } + + @Operation(summary = "更新日程状态") + @PutMapping("/{id}/status") + public Boolean setPlanStatus(@PathVariable("id") long id, @RequestParam("status") boolean status) { + return planService.setPlanStatus(id, status); + } + + @Operation(summary = "查看日程统计") + @GetMapping("/stats") + public PlanStatsDto queryPlanStats() { + return planService.queryPlanStats(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/ProductController.java b/home-service/src/main/java/com/cxx/home/controller/ProductController.java new file mode 100644 index 0000000..b33a38a --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/ProductController.java @@ -0,0 +1,62 @@ + +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.product.ProductDto; +import com.cxx.home.service.ProductService; +import com.cxx.home.vo.ProductQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/product") +@Tag(name = "商品清单") +public class ProductController { + @Resource + private ProductService productService; + + @Operation(summary = "新增商品清单") + @PostMapping("") + public Boolean addProduct(@RequestBody @JsonView(WriteView.class) @Validated ProductDto productDto) { + return productService.addProduct(productDto); + } + + @Operation(summary = "更新商品清单") + @PutMapping("/{id}") + public Boolean updateProduct(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) @Validated ProductDto productDto) { + return productService.updateProduct(id, productDto); + } + + @Operation(summary = "删除商品清单") + @DeleteMapping("/{id}") + public Boolean deleteProduct(@PathVariable("id") long id) { + return productService.deleteProduct(id); + } + + @Operation(summary = "查询所有商品清单") + @GetMapping("") + public @JsonView(ReadView.class) List queryProductList(ProductQueryVo queryVo) { + return productService.queryProductList(queryVo); + } + + @Operation(summary = "查询商品清单") + @GetMapping("/{id}") + public @JsonView(ReadView.class) ProductDto queryProduct(@PathVariable("id") long id) { + return productService.queryProduct(id); + } + + @Operation(summary = "查询商品类别") + @GetMapping("/category") + public List queryProductCategory() { + return productService.queryProductCategory(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/QuartzController.java b/home-service/src/main/java/com/cxx/home/controller/QuartzController.java new file mode 100644 index 0000000..4aa59ef --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/QuartzController.java @@ -0,0 +1,26 @@ +package com.cxx.home.controller; + + +import com.cxx.home.schedule.QuartzDto; +import com.cxx.home.service.QuartzService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/quartz") +@Tag(name = "定时任务") +public class QuartzController { + @Resource + private QuartzService quartzService; + + @Operation(summary = "查询所有任务") + @GetMapping("") + public List queryQuartz() { + return quartzService.queryQuartzTask(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/SessionController.java b/home-service/src/main/java/com/cxx/home/controller/SessionController.java new file mode 100644 index 0000000..9a5c293 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/SessionController.java @@ -0,0 +1,28 @@ +package com.cxx.home.controller; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.cxx.home.service.SessionService; +import com.cxx.common.dto.user.SessionDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/session") +@Tag(name = "会话管理") +public class SessionController { + @Resource + private SessionService sessionService; + + @Operation(summary = "创建会话") + @PostMapping("") + @SaIgnore + public SessionDto createSession(@RequestParam("name") String name, + @RequestParam("password") String password) { + return sessionService.create(name, password); + } +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/controller/TravelController.java b/home-service/src/main/java/com/cxx/home/controller/TravelController.java new file mode 100644 index 0000000..08654ff --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/TravelController.java @@ -0,0 +1,105 @@ +package com.cxx.home.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.travel.TravelRecordDto; +import com.cxx.home.dto.travel.TravelSpotDto; +import com.cxx.home.dto.travel.TravelStatsDto; +import com.cxx.home.dto.travel.TravelSummaryDto; +import com.cxx.home.service.TravelService; +import com.cxx.home.vo.TravelQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/travel") +@Tag(name = "旅行记录") +public class TravelController { + @Resource + private TravelService travelService; + + @Operation(summary = "新增旅行景点") + @PostMapping("/spot") + public Boolean addTravelSpot(@RequestBody @JsonView(WriteView.class) @Validated TravelSpotDto travelSpotDto) { + return travelService.addTravelSpot(travelSpotDto); + } + + @Operation(summary = "更新旅行景点") + @PutMapping("/spot/{id}") + public Boolean updateTravelSpot(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) TravelSpotDto travelSpotDto) { + return travelService.updateTravelSpot(id, travelSpotDto); + } + + @Operation(summary = "删除旅行景点") + @DeleteMapping("/spot/{id}") + public Boolean deleteTravelSpot(@PathVariable("id") long id) { + return travelService.deleteTravelRecord(id); + } + + @Operation(summary = "分页查询旅行景点") + @GetMapping("/spot/page") + public IPage queryTravelSummary(@RequestParam("currentPage") Integer currentPage, + @RequestParam("pageSize") Integer pageSize, + TravelQueryVo travelQueryVo) { + return travelService.queryTravelSummary(currentPage, pageSize, travelQueryVo); + } + + @Operation(summary = "查询旅行景点") + @GetMapping("/spot/{id}") + public @JsonView(ReadView.class) TravelSpotDto queryTravelSpot(@PathVariable("id") long id) { + return travelService.queryTravelSpot(id); + } + + @Operation(summary = "查询所有旅行景点") + @GetMapping("/spot/name") + public List queryFoodName() { + return travelService.queryTravelSpotName(); + } + + @Operation(summary = "新增旅行记录") + @PostMapping("/record") + public Boolean addTravelRecord(@RequestBody @JsonView(WriteView.class) @Validated TravelRecordDto travelRecordDto) { + return travelService.addTravelRecord(travelRecordDto); + } + + @Operation(summary = "更新旅行记录") + @PutMapping("/record/{id}") + public Boolean updateTravelRecord(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) TravelRecordDto travelRecordDto) { + return travelService.updateTravelRecord(id, travelRecordDto); + } + + @Operation(summary = "删除旅行记录") + @DeleteMapping("/record/{id}") + public Boolean deleteTravelRecord(@PathVariable("id") long id) { + return travelService.deleteTravelRecord(id); + } + + @Operation(summary = "查询旅行记录") + @GetMapping("/record") + public @JsonView(ReadView.class) List queryTravelRecord(@RequestParam("startDate") String startDate, + @RequestParam("endDate") String endDate) { + return travelService.queryTravelRecord(startDate, endDate); + } + + @Operation(summary = "查询旅行类别") + @GetMapping("/category") + public List queryTravelCategory() { + return travelService.queryTravelCategory(); + } + + @Operation(summary = "查询旅行统计") + @GetMapping("/stats") + public TravelStatsDto queryTravelStats() { + return travelService.queryTravelStats(); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/dao/AnniversaryDao.java b/home-service/src/main/java/com/cxx/home/dao/AnniversaryDao.java new file mode 100644 index 0000000..e148add --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/AnniversaryDao.java @@ -0,0 +1,15 @@ +package com.cxx.home.dao; + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.home.dto.anniversary.AnniversaryDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface AnniversaryDao { + List queryAnniversary(@Param("category") String category); + + List queryAnniversaryCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/AssetDao.java b/home-service/src/main/java/com/cxx/home/dao/AssetDao.java new file mode 100644 index 0000000..b222e02 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/AssetDao.java @@ -0,0 +1,14 @@ +package com.cxx.home.dao; + +import com.cxx.home.dto.asset.AssetDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface AssetDao { + List queryAsset(@Param("category") String category); + + List queryAssetCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/BillDao.java b/home-service/src/main/java/com/cxx/home/dao/BillDao.java new file mode 100644 index 0000000..6364ba9 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/BillDao.java @@ -0,0 +1,27 @@ +package com.cxx.home.dao; + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.bill.*; +import com.cxx.common.vo.bill.BillQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface BillDao { + BillRecordDto queryBillRecord(@Param("id") Long id); + + List queryBillSummary(@Param("query") BillQueryVo query); + + void insertBillImage(@Param("billId") Long billId, + @Param("list") List imageFiles); + + List queryBillStats(@Param("type") String type, @Param("query") BillQueryVo query); + + List queryBillPay(); + + List queryBillBook(); + + List queryBillCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/BudgetDao.java b/home-service/src/main/java/com/cxx/home/dao/BudgetDao.java new file mode 100644 index 0000000..5f0a0cc --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/BudgetDao.java @@ -0,0 +1,17 @@ +package com.cxx.home.dao; + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.budget.BudgetDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface BudgetDao { + List queryBudget(@Param("category") String category); + + List queryBudgetRankStats(@Param("category") String category); + + List queryBudgetProjectStats(@Param("category") String category); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/FoodDao.java b/home-service/src/main/java/com/cxx/home/dao/FoodDao.java new file mode 100644 index 0000000..a6c3343 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/FoodDao.java @@ -0,0 +1,33 @@ +package com.cxx.home.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.home.dto.food.*; +import com.cxx.home.vo.FoodQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface FoodDao { + FoodRecipeDto queryFoodRecipe(@Param("id") Long id); + + IPage queryFoodSummary(IPage page, + @Param("query") FoodQueryVo foodQueryVo); + + List queryFoodRecordById(@Param("id") Long id); + + List queryFoodRecord(@Param("startDate") String startDate, + @Param("endDate") String endDate); + + FoodStatsDto queryFoodStats(); + + List queryFoodCategory(); + + void insertFoodMaterial(@Param("foodId") Long foodId, + @Param("list") List list); + + void insertFoodStep(@Param("foodId") Long foodId, + @Param("list") List list); + +} diff --git a/home-service/src/main/java/com/cxx/home/dao/JournalDao.java b/home-service/src/main/java/com/cxx/home/dao/JournalDao.java new file mode 100644 index 0000000..72f2349 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/JournalDao.java @@ -0,0 +1,13 @@ +package com.cxx.home.dao; + +import com.cxx.home.dto.journal.JournalDto; +import com.cxx.home.vo.JournalQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface JournalDao { + List queryJournal(@Param("query") JournalQueryVo queryVo); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/KpiDao.java b/home-service/src/main/java/com/cxx/home/dao/KpiDao.java new file mode 100644 index 0000000..9190241 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/KpiDao.java @@ -0,0 +1,13 @@ +package com.cxx.home.dao; + +import com.cxx.home.dto.kpi.KpiDto; +import com.cxx.home.vo.KpiQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface KpiDao { + List queryKpi(@Param("query") KpiQueryVo queryVo); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/LedgerDao.java b/home-service/src/main/java/com/cxx/home/dao/LedgerDao.java new file mode 100644 index 0000000..badb22a --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/LedgerDao.java @@ -0,0 +1,14 @@ +package com.cxx.home.dao; + +import com.cxx.home.dto.ledger.LedgerDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface LedgerDao { + List queryLedger(@Param("book") String book); + + List queryLedgerBook(); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/PeriodDao.java b/home-service/src/main/java/com/cxx/home/dao/PeriodDao.java new file mode 100644 index 0000000..3d7cad9 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/PeriodDao.java @@ -0,0 +1,14 @@ +package com.cxx.home.dao; + +import com.cxx.home.dto.period.PeriodDayDto; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface PeriodDao { + List queryPeriodDay(@Param("month") String month); + + String getMenstruateFirstDate(@Param("month") String month); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/PlanDao.java b/home-service/src/main/java/com/cxx/home/dao/PlanDao.java new file mode 100644 index 0000000..9be6573 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/PlanDao.java @@ -0,0 +1,16 @@ +package com.cxx.home.dao; + +import com.cxx.common.dto.plan.PlanDto; +import com.cxx.common.dto.plan.PlanStatsDto; +import com.cxx.common.vo.plan.PlanQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface PlanDao { + List queryPlan(@Param("query") PlanQueryVo query); + + PlanStatsDto queryPlanStats(); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/ProductDao.java b/home-service/src/main/java/com/cxx/home/dao/ProductDao.java new file mode 100644 index 0000000..8a6747b --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/ProductDao.java @@ -0,0 +1,17 @@ +package com.cxx.home.dao; + +import com.cxx.home.dto.product.ProductDto; +import com.cxx.home.vo.ProductQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ProductDao { + ProductDto queryProduct(@Param("id") Long id); + + List queryProductList(@Param("query") ProductQueryVo queryVo); + + List queryProductCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/dao/TravelDao.java b/home-service/src/main/java/com/cxx/home/dao/TravelDao.java new file mode 100644 index 0000000..034beb9 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dao/TravelDao.java @@ -0,0 +1,35 @@ +package com.cxx.home.dao; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.home.dto.travel.TravelRecordDto; +import com.cxx.home.dto.travel.TravelSpotDto; +import com.cxx.home.dto.travel.TravelStatsDto; +import com.cxx.home.dto.travel.TravelSummaryDto; +import com.cxx.home.vo.TravelQueryVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface TravelDao { + TravelSpotDto queryTravelSpot(@Param("id") Long id); + + IPage queryTravelSummary(IPage page, + @Param("query") TravelQueryVo travelQueryVo); + + List queryTravelRecordById(@Param("id") Long id); + + List queryTravelRecord(@Param("startDate") String startDate, + @Param("endDate") String endDate); + + TravelStatsDto queryTravelStats(); + + List queryTravelCategory(); + + void insertTravelImage(@Param("recordId") Long recordId, + @Param("list") List imageFiles); + + void insertTravelVideo(@Param("recordId") Long recordId, + @Param("list") List videoFiles); +} diff --git a/home-service/src/main/java/com/cxx/home/dto/anniversary/AnniversaryDto.java b/home-service/src/main/java/com/cxx/home/dto/anniversary/AnniversaryDto.java new file mode 100644 index 0000000..5bbbff6 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/anniversary/AnniversaryDto.java @@ -0,0 +1,36 @@ +package com.cxx.home.dto.anniversary; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class AnniversaryDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "标题") + private String title; + + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; + + @Schema(description = "是否重复") + private Boolean recurring; + + @Schema(description = "纪念日类型") + private String type; + + @Schema(description = "纪念日类别") + private String category; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/asset/AssetDto.java b/home-service/src/main/java/com/cxx/home/dto/asset/AssetDto.java new file mode 100644 index 0000000..ca8c888 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/asset/AssetDto.java @@ -0,0 +1,32 @@ +package com.cxx.home.dto.asset; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class AssetDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "类别") + private String category; + + @Schema(description = "名称") + private String name; + + @Schema(description = "金额") + private Double amount; + + @Schema(description = "所属人") + private String owner; + + @Schema(description = "备注") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/food/FoodMaterialDto.java b/home-service/src/main/java/com/cxx/home/dto/food/FoodMaterialDto.java new file mode 100644 index 0000000..c81ceda --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/food/FoodMaterialDto.java @@ -0,0 +1,24 @@ +package com.cxx.home.dto.food; + +import com.cxx.common.PlainView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class FoodMaterialDto { + @Schema(description = "id") + private Long id; + + @Schema(description = "食材类型") + private String type; + + @Schema(description = "食材名称") + private String name; + + @Schema(description = "食材分量") + private String amount; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/food/FoodRecipeDto.java b/home-service/src/main/java/com/cxx/home/dto/food/FoodRecipeDto.java new file mode 100644 index 0000000..20a0c0d --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/food/FoodRecipeDto.java @@ -0,0 +1,45 @@ +package com.cxx.home.dto.food; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.validator.constraints.Range; + +import java.util.List; + +@Getter +@Setter +@JsonView(PlainView.class) +public class FoodRecipeDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "美食名称") + @NotBlank(message = "名称不能为空") + private String name; + + @Schema(description = "美食菜系") + private String category; + + @Schema(description = "推荐指数") + @Range(min = 0, max = 5, message = "推荐指数在0-5之间") + private Integer recommendRate; + + @Schema(description = "美食食材") + private List materialList; + + @Schema(description = "美食步骤") + private List stepList; + + @Schema(description = "美食成果") + @JsonView(ReadView.class) + private List recordList; + + @Schema(description = "备注") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/food/FoodRecordDto.java b/home-service/src/main/java/com/cxx/home/dto/food/FoodRecordDto.java new file mode 100644 index 0000000..90951d0 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/food/FoodRecordDto.java @@ -0,0 +1,37 @@ +package com.cxx.home.dto.food; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class FoodRecordDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "分类") + @JsonView(ReadView.class) + private String category; + + @Schema(description = "完成时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; + + @Schema(description = "完成人") + private String person; + + @Schema(description = "成果图片") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/food/FoodStatsDto.java b/home-service/src/main/java/com/cxx/home/dto/food/FoodStatsDto.java new file mode 100644 index 0000000..88658a1 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/food/FoodStatsDto.java @@ -0,0 +1,19 @@ +package com.cxx.home.dto.food; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class FoodStatsDto { + @Schema(description = "菜谱总数") + private Integer recipeCount; + + @Schema(description = "菜谱类别") + private Integer categoryCount; + + @Schema(description = "做菜次数") + private Integer workCount; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/food/FoodStepDto.java b/home-service/src/main/java/com/cxx/home/dto/food/FoodStepDto.java new file mode 100644 index 0000000..645da10 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/food/FoodStepDto.java @@ -0,0 +1,24 @@ +package com.cxx.home.dto.food; + +import com.cxx.common.PlainView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class FoodStepDto { + @Schema(description = "id") + private Long id; + + @Schema(description = "顺序") + private Integer sort; + + @Schema(description = "步骤内容") + private String content; + + @Schema(description = "步骤图片") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/food/FoodSummaryDto.java b/home-service/src/main/java/com/cxx/home/dto/food/FoodSummaryDto.java new file mode 100644 index 0000000..c712178 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/food/FoodSummaryDto.java @@ -0,0 +1,26 @@ +package com.cxx.home.dto.food; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class FoodSummaryDto { + @Schema(description = "id") + private Long id; + + @Schema(description = "美食名称") + private String name; + + @Schema(description = "美食类型") + private String category; + + @Schema(description = "推荐指数") + private Integer recommendRate; + + @Schema(description = "美食记录") + private List recordList; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/journal/JournalDto.java b/home-service/src/main/java/com/cxx/home/dto/journal/JournalDto.java new file mode 100644 index 0000000..c776e71 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/journal/JournalDto.java @@ -0,0 +1,47 @@ +package com.cxx.home.dto.journal; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class JournalDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date date; + + @Schema(description = "地点") + private String location; + + @Schema(description = "类别") + private String category; + + @Schema(description = "天气") + private String weather; + + @Schema(description = "心情") + private String mood; + + @Schema(description = "内容") + @NotBlank(message = "内容不能为空") + private String content; + + @Schema(description = "图片地址") + private String imageUrl; + + @Schema(description = "视频地址") + private String videoUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/kpi/KpiDto.java b/home-service/src/main/java/com/cxx/home/dto/kpi/KpiDto.java new file mode 100644 index 0000000..72ca337 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/kpi/KpiDto.java @@ -0,0 +1,33 @@ +package com.cxx.home.dto.kpi; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class KpiDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; + + @Schema(description = "患者姓名") + private String patientName; + + @Schema(description = "项目") + private String project; + + @Schema(description = "价格") + private Integer price; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/ledger/LedgerDto.java b/home-service/src/main/java/com/cxx/home/dto/ledger/LedgerDto.java new file mode 100644 index 0000000..ea8e126 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/ledger/LedgerDto.java @@ -0,0 +1,51 @@ +package com.cxx.home.dto.ledger; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class LedgerDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "账本") + private String book; + + @Schema(description = "类别") + private String category; + + @Schema(description = "内容") + private String content; + + @Schema(description = "价格") + private Double price; + + @Schema(description = "数量") + private Integer number; + + @Schema(description = "总价") + @JsonView(ReadView.class) + private Double totalPrice; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "付款人") + private String payer; + + @Schema(description = "供应商") + private String provider; + + @Schema(description = "图片") + private String imagerUrl; + + @Schema(description = "备注") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java b/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java new file mode 100644 index 0000000..301a871 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/period/PeriodDayDto.java @@ -0,0 +1,39 @@ +package com.cxx.home.dto.period; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class PeriodDayDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; + + @Schema(description = "是否吃药") + private Boolean isDrug; + + @Schema(description = "是否来月经") + private Boolean isMenstruate; + + @Schema(description = "流量") + private String flowLevel; + + @Schema(description = "症状") + private String crampLevel; + + @Schema(description = "爱爱") + private String sexActivity; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/period/PeriodSettingDto.java b/home-service/src/main/java/com/cxx/home/dto/period/PeriodSettingDto.java new file mode 100644 index 0000000..b241c94 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/period/PeriodSettingDto.java @@ -0,0 +1,26 @@ +package com.cxx.home.dto.period; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@JsonView(PlainView.class) +public class PeriodSettingDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "月经周期") + private Integer cycleLength; + + @Schema(description = "持续天数") + private Integer duration; + + @Schema(description = "是否计算") + private Boolean isCalculate; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/product/ProductDto.java b/home-service/src/main/java/com/cxx/home/dto/product/ProductDto.java new file mode 100644 index 0000000..d70a3ad --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/product/ProductDto.java @@ -0,0 +1,58 @@ +package com.cxx.home.dto.product; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; + +@Getter +@Setter +@JsonView(PlainView.class) +public class ProductDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "名称") + @NotBlank(message = "商品名称不能为空") + private String name; + + @Schema(description = "购买日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date purchaseDate; + + @Schema(description = "过期日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date expiryDate; + + @Schema(description = "总天数") + @JsonView(ReadView.class) + private Integer totalDay; + + @Schema(description = "价格") + @PositiveOrZero(message = "商品价格必须大于等于0") + private Double price; + + @Schema(description = "日均价格") + @JsonView(ReadView.class) + private Double averagePrice; + + @Schema(description = "类别") + private String category; + + @Schema(description = "购买人") + private String purchaser; + + @Schema(description = "购买渠道") + private String channel; + + @Schema(description = "图片路径") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/travel/TravelRecordDto.java b/home-service/src/main/java/com/cxx/home/dto/travel/TravelRecordDto.java new file mode 100644 index 0000000..02174d9 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/travel/TravelRecordDto.java @@ -0,0 +1,41 @@ +package com.cxx.home.dto.travel; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +@Getter +@Setter +@JsonView(PlainView.class) +public class TravelRecordDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "地址") + @JsonView(ReadView.class) + private List area; + + @Schema(description = "完成时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date date; + + @Schema(description = "完成人") + private List persons; + + @Schema(description = "旅行图片") + private List imageList; + + @Schema(description = "旅行视频") + private List videoList; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/travel/TravelSpotDto.java b/home-service/src/main/java/com/cxx/home/dto/travel/TravelSpotDto.java new file mode 100644 index 0000000..a0fcbd3 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/travel/TravelSpotDto.java @@ -0,0 +1,57 @@ +package com.cxx.home.dto.travel; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.validator.constraints.Range; + +import java.util.List; + +@Getter +@Setter +@JsonView(PlainView.class) +public class TravelSpotDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "景点名称") + @NotBlank(message = "名称不能为空") + private String name; + + @Schema(description = "景点地区") + private List area; + + @Schema(description = "景点地址") + private String address; + + @Schema(description = "门票价格") + private Double price; + + @Schema(description = "推荐指数") + @Range(min = 0, max = 5, message = "推荐指数在0-5之间") + private Integer recommendRate; + + @Schema(description = "交通") + private String traffic; + + @Schema(description = "旅游路线") + private String router; + + @Schema(description = "美食推荐") + private List foods; + + @Schema(description = "项目推荐") + private List projects; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "旅游记录") + @JsonView(ReadView.class) + private List recordList; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/travel/TravelStatsDto.java b/home-service/src/main/java/com/cxx/home/dto/travel/TravelStatsDto.java new file mode 100644 index 0000000..7b574b2 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/travel/TravelStatsDto.java @@ -0,0 +1,18 @@ +package com.cxx.home.dto.travel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TravelStatsDto { + @Schema(description = "景点总数") + private Integer spotCount; + + @Schema(description = "城市总数") + private Integer cityCount; + + @Schema(description = "记录次数") + private Integer recordCount; +} diff --git a/home-service/src/main/java/com/cxx/home/dto/travel/TravelSummaryDto.java b/home-service/src/main/java/com/cxx/home/dto/travel/TravelSummaryDto.java new file mode 100644 index 0000000..96ddb50 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/travel/TravelSummaryDto.java @@ -0,0 +1,26 @@ +package com.cxx.home.dto.travel; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class TravelSummaryDto { + @Schema(description = "id") + private Long id; + + @Schema(description = "景点名称") + private String name; + + @Schema(description = "景点地区") + private List area; + + @Schema(description = "推荐指数") + private Integer recommendRate; + + @Schema(description = "美食成果") + private List recordList; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/Anniversary.java b/home-service/src/main/java/com/cxx/home/entity/Anniversary.java new file mode 100644 index 0000000..8f23cb3 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/Anniversary.java @@ -0,0 +1,31 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("anniversary") +public class Anniversary extends AbstractEntity { + @TableField(value = "title") + private String title; + + @TableField("date") + private Date date; + + @TableField("recurring") + private Integer recurring; + + @TableField("type") + private String type; + + @TableField("category") + private String category; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/Asset.java b/home-service/src/main/java/com/cxx/home/entity/Asset.java new file mode 100644 index 0000000..6e9b8e7 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/Asset.java @@ -0,0 +1,29 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("asset") +public class Asset extends AbstractEntity { + @TableField(value = "category") + private String category; + + @TableField("name") + private String name; + + @TableField("amount") + private Double amount; + + @TableField("owner") + private String owner; + + @TableField("remark") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/FoodMaterial.java b/home-service/src/main/java/com/cxx/home/entity/FoodMaterial.java new file mode 100644 index 0000000..8f11b97 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/FoodMaterial.java @@ -0,0 +1,24 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractIdEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("food_material") +public class FoodMaterial extends AbstractIdEntity { + @TableField("food_id") + private Long foodId; + + @TableField("type") + private String type; + + @TableField("name") + private String name; + + @TableField("amount") + private String amount; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/FoodRecipe.java b/home-service/src/main/java/com/cxx/home/entity/FoodRecipe.java new file mode 100644 index 0000000..abac1d5 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/FoodRecipe.java @@ -0,0 +1,24 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("food_recipe") +public class FoodRecipe extends AbstractEntity { + @TableField("name") + private String name; + + @TableField("category") + private String category; + + @TableField("recommend_rate") + private Integer recommendRate; + + @TableField("remark") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/FoodRecord.java b/home-service/src/main/java/com/cxx/home/entity/FoodRecord.java new file mode 100644 index 0000000..8b0e7d2 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/FoodRecord.java @@ -0,0 +1,26 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractIdEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("food_record") +public class FoodRecord extends AbstractIdEntity { + @TableField("food_id") + private Long foodId; + + @TableField("date") + private Date date; + + @TableField("person") + private String person; + + @TableField("image_url") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/FoodStep.java b/home-service/src/main/java/com/cxx/home/entity/FoodStep.java new file mode 100644 index 0000000..15886d6 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/FoodStep.java @@ -0,0 +1,24 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractIdEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("food_step") +public class FoodStep extends AbstractIdEntity { + @TableField("food_id") + private Long foodId; + + @TableField("sort") + private Integer sort; + + @TableField("content") + private String content; + + @TableField("image_url") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/Journal.java b/home-service/src/main/java/com/cxx/home/entity/Journal.java new file mode 100644 index 0000000..1d6ee41 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/Journal.java @@ -0,0 +1,38 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("journal") +public class Journal extends AbstractEntity { + @TableField("date") + private Date date; + + @TableField(value = "location") + private String location; + + @TableField(value = "category") + private String category; + + @TableField(value = "weather") + private String weather; + + @TableField("mood") + private String mood; + + @TableField("content") + private String content; + + @TableField("image_url") + private String imageUrl; + + @TableField("video_url") + private String videoUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/Kpi.java b/home-service/src/main/java/com/cxx/home/entity/Kpi.java new file mode 100644 index 0000000..d9246af --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/Kpi.java @@ -0,0 +1,26 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("kpi") +public class Kpi extends AbstractEntity { + @TableField("date") + private Date date; + + @TableField("patient_name") + private String patientName; + + @TableField("project") + private String project; + + @TableField("price") + private Integer price; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/Ledger.java b/home-service/src/main/java/com/cxx/home/entity/Ledger.java new file mode 100644 index 0000000..c283e20 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/Ledger.java @@ -0,0 +1,42 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("ledger") +public class Ledger extends AbstractEntity { + @TableField(value = "book") + private String book; + + @TableField("category") + private String category; + + @TableField("content") + private String content; + + @TableField("price") + private Double price; + + @TableField("number") + private Integer number; + + @TableField("unit") + private String unit; + + @TableField("payer") + private String payer; + + @TableField("provider") + private String provider; + + @TableField("imager_url") + private String imagerUrl; + + @TableField("remark") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java b/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java new file mode 100644 index 0000000..82e0cf1 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/PeriodDay.java @@ -0,0 +1,32 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("period_day") +public class PeriodDay extends AbstractEntity { + @TableField("date") + private Date date; + + @TableField("is_drug") + private Integer isDrug; + + @TableField("is_menstruate") + private Integer isMenstruate; + + @TableField("flow_level") + private String flowLevel; + + @TableField("cramp_level") + private String crampLevel; + + @TableField("sex_activity") + private String sexActivity; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/PeriodSetting.java b/home-service/src/main/java/com/cxx/home/entity/PeriodSetting.java new file mode 100644 index 0000000..e718150 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/PeriodSetting.java @@ -0,0 +1,23 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("period_setting") +public class PeriodSetting extends AbstractEntity { + @TableField("cycle_length") + private Integer cycleLength; + + @TableField("duration") + private Integer duration; + + @TableField("is_calculate") + private Integer isCalculate; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/Product.java b/home-service/src/main/java/com/cxx/home/entity/Product.java new file mode 100644 index 0000000..c69aaa8 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/Product.java @@ -0,0 +1,40 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("product") +public class Product extends AbstractEntity { + @TableField("name") + private String name; + + @TableField("purchase_date") + private Date purchaseDate; + + @TableField("expiry_date") + private Date expiryDate; + + @TableField("price") + private Double price; + + @TableField("category") + private String category; + + @TableField("purchaser") + private String purchaser; + + @TableField("channel") + private String channel; + + @TableField("image_url") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/TravelImage.java b/home-service/src/main/java/com/cxx/home/entity/TravelImage.java new file mode 100644 index 0000000..9198451 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/TravelImage.java @@ -0,0 +1,15 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("travel_image") +public class TravelImage { + @TableField("record_id") + private Long recordId; + + @TableField("image_url") + private String imageUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/TravelRecord.java b/home-service/src/main/java/com/cxx/home/entity/TravelRecord.java new file mode 100644 index 0000000..24e35a0 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/TravelRecord.java @@ -0,0 +1,25 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.cxx.framework.data.AbstractIdEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("travel_record") +public class TravelRecord extends AbstractIdEntity { + @TableField("travel_id") + private Long travelId; + + @TableField("date") + private Date date; + + @TableField(value = "persons", typeHandler = JacksonTypeHandler.class) + private List persons; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/TravelSpot.java b/home-service/src/main/java/com/cxx/home/entity/TravelSpot.java new file mode 100644 index 0000000..4009195 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/TravelSpot.java @@ -0,0 +1,48 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("travel_spot") +public class TravelSpot extends AbstractEntity { + @TableField("name") + private String name; + + @TableField("city") + private String city; + + @TableField(value = "area", typeHandler = JacksonTypeHandler.class) + private List area; + + @TableField("address") + private String address; + + @TableField("price") + private Double price; + + @TableField("recommend_rate") + private Integer recommendRate; + + @TableField("traffic") + private String traffic; + + @TableField("router") + private String router; + + @TableField(value = "foods", typeHandler = JacksonTypeHandler.class) + private List foods; + + @TableField(value = "projects", typeHandler = JacksonTypeHandler.class) + private List projects; + + @TableField("remark") + private String remark; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/TravelVideo.java b/home-service/src/main/java/com/cxx/home/entity/TravelVideo.java new file mode 100644 index 0000000..79aa09b --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/TravelVideo.java @@ -0,0 +1,15 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("travel_video") +public class TravelVideo { + @TableField("record_id") + private Long recordId; + + @TableField("video_url") + private String videoUrl; +} diff --git a/home-service/src/main/java/com/cxx/home/mapper/AnniversaryMapper.java b/home-service/src/main/java/com/cxx/home/mapper/AnniversaryMapper.java new file mode 100644 index 0000000..60ab2a9 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/AnniversaryMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.Anniversary; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AnniversaryMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/AssetMapper.java b/home-service/src/main/java/com/cxx/home/mapper/AssetMapper.java new file mode 100644 index 0000000..263262f --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/AssetMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.Asset; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AssetMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/FoodMaterialMapper.java b/home-service/src/main/java/com/cxx/home/mapper/FoodMaterialMapper.java new file mode 100644 index 0000000..eb3b972 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/FoodMaterialMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.FoodMaterial; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FoodMaterialMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/FoodRecipeMapper.java b/home-service/src/main/java/com/cxx/home/mapper/FoodRecipeMapper.java new file mode 100644 index 0000000..ec145a2 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/FoodRecipeMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.FoodRecipe; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FoodRecipeMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/FoodRecordMapper.java b/home-service/src/main/java/com/cxx/home/mapper/FoodRecordMapper.java new file mode 100644 index 0000000..2fb9441 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/FoodRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.FoodRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FoodRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/FoodStepMapper.java b/home-service/src/main/java/com/cxx/home/mapper/FoodStepMapper.java new file mode 100644 index 0000000..fa741fa --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/FoodStepMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.FoodStep; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface FoodStepMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/JournalMapper.java b/home-service/src/main/java/com/cxx/home/mapper/JournalMapper.java new file mode 100644 index 0000000..b53d878 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/JournalMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.Journal; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface JournalMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/KpiMapper.java b/home-service/src/main/java/com/cxx/home/mapper/KpiMapper.java new file mode 100644 index 0000000..b7c6b32 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/KpiMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.Kpi; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface KpiMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/LedgerMapper.java b/home-service/src/main/java/com/cxx/home/mapper/LedgerMapper.java new file mode 100644 index 0000000..5236584 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/LedgerMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.Ledger; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface LedgerMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/PeriodDayMapper.java b/home-service/src/main/java/com/cxx/home/mapper/PeriodDayMapper.java new file mode 100644 index 0000000..79ba9da --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/PeriodDayMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.PeriodDay; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PeriodDayMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/PeriodSettingMapper.java b/home-service/src/main/java/com/cxx/home/mapper/PeriodSettingMapper.java new file mode 100644 index 0000000..d148c93 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/PeriodSettingMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.PeriodSetting; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PeriodSettingMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/ProductMapper.java b/home-service/src/main/java/com/cxx/home/mapper/ProductMapper.java new file mode 100644 index 0000000..39b1878 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/ProductMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.Product; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProductMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/TravelImageMapper.java b/home-service/src/main/java/com/cxx/home/mapper/TravelImageMapper.java new file mode 100644 index 0000000..a82446f --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/TravelImageMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.TravelImage; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TravelImageMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/TravelRecordMapper.java b/home-service/src/main/java/com/cxx/home/mapper/TravelRecordMapper.java new file mode 100644 index 0000000..9487a7a --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/TravelRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.TravelRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TravelRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/TravelSpotMapper.java b/home-service/src/main/java/com/cxx/home/mapper/TravelSpotMapper.java new file mode 100644 index 0000000..0b69712 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/TravelSpotMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.TravelSpot; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TravelSpotMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/TravelVideoMapper.java b/home-service/src/main/java/com/cxx/home/mapper/TravelVideoMapper.java new file mode 100644 index 0000000..f0a4a3d --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/TravelVideoMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.TravelVideo; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface TravelVideoMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/schedule/QuartzDto.java b/home-service/src/main/java/com/cxx/home/schedule/QuartzDto.java new file mode 100644 index 0000000..4c06f7b --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/schedule/QuartzDto.java @@ -0,0 +1,20 @@ +package com.cxx.home.schedule; + + +import com.cxx.common.dto.task.TaskDto; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class QuartzDto extends TaskDto { + @Schema(description = "任务名称/id") + private String name; + + @Schema(description = "任务组别") + private String group; + + @Schema(description = "任务状态") + private String status; +} diff --git a/home-service/src/main/java/com/cxx/home/schedule/QuartzJob.java b/home-service/src/main/java/com/cxx/home/schedule/QuartzJob.java new file mode 100644 index 0000000..97cb78a --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/schedule/QuartzJob.java @@ -0,0 +1,55 @@ +package com.cxx.home.schedule; + +import com.cxx.common.dto.message.MailMessageDto; +import com.cxx.common.entity.Task; +import com.cxx.framework.web.CustomException; +import com.cxx.common.mapper.TaskMapper; +import com.cxx.home.service.MessageService; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; + +@Slf4j +public class QuartzJob implements Job { + @Resource + private TaskMapper taskMapper; + + @Resource + private MessageService messageService; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void execute(JobExecutionContext context) { + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + Long taskId = jobDataMap.getLong("id"); + + Task task = taskMapper.selectById(taskId); + try { + JsonNode taskContent = objectMapper.readTree(task.getContent()); + + switch (task.getType()) { + case TaskType.EMAIL: + handleEmailTask(taskContent); + break; + case TaskType.SMS: + break; + } + } catch (Exception e) { + throw new CustomException("执行任务错误:", e.getMessage()); + } + } + + private void handleEmailTask(JsonNode taskContent) { + MailMessageDto mailMessageDto = new MailMessageDto(); + mailMessageDto.setTo(taskContent.get("to").asText()); + mailMessageDto.setSubject(taskContent.get("subject").asText()); + mailMessageDto.setBody(taskContent.get("body").asText()); + + messageService.sendMailMessage(mailMessageDto); + } +} diff --git a/home-service/src/main/java/com/cxx/home/schedule/QuartzUtils.java b/home-service/src/main/java/com/cxx/home/schedule/QuartzUtils.java new file mode 100644 index 0000000..8f4e998 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/schedule/QuartzUtils.java @@ -0,0 +1,47 @@ +package com.cxx.home.schedule; + +import com.cxx.common.entity.Task; +import com.cxx.framework.web.CustomException; +import org.quartz.*; +import org.springframework.stereotype.Component; + +@Component +public class QuartzUtils { + public static JobDetail getJobDetail(Task task, JobKey jobKey) { + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("id", task.getId()); + jobDataMap.put("type", task.getType()); + jobDataMap.put("content", task.getContent()); + + return JobBuilder.newJob(QuartzJob.class) + .withIdentity(jobKey) // 使用 id 作为唯一标识 + .usingJobData(jobDataMap) + .build(); + } + + public static Trigger getTrigger(Task task, JobKey jobKey) { + Trigger trigger; + // 判断任务类型:Cron 任务或者一次性任务 + if (task.getCronExpression() != null && !task.getCronExpression().isEmpty()) { + // 定时任务:使用 Cron 表达式 + trigger = TriggerBuilder.newTrigger() + .withIdentity(jobKey.getName() + "Trigger") + .withSchedule(CronScheduleBuilder.cronSchedule(task.getCronExpression())) + .forJob(jobKey) + .build(); + } else if (task.getExecuteTime() != null) { + // 一次性任务:使用 executeTime + trigger = TriggerBuilder.newTrigger() + .withIdentity(jobKey.getName() + "Trigger") + .startAt(task.getExecuteTime()) + .forJob(jobKey) + .build(); + } else { + // 如果没有 Cron 表达式和 executeTime,任务不能调度,抛出异常 + throw new CustomException("任务没有有效的 Cron 表达式或执行时间"); + } + + return trigger; + } +} + diff --git a/home-service/src/main/java/com/cxx/home/schedule/TaskType.java b/home-service/src/main/java/com/cxx/home/schedule/TaskType.java new file mode 100644 index 0000000..d6ab4df --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/schedule/TaskType.java @@ -0,0 +1,6 @@ +package com.cxx.home.schedule; + +public interface TaskType { + String EMAIL = "EMAIL"; + String SMS = "SMS"; +} diff --git a/home-service/src/main/java/com/cxx/home/service/AnniversaryService.java b/home-service/src/main/java/com/cxx/home/service/AnniversaryService.java new file mode 100644 index 0000000..446a374 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/AnniversaryService.java @@ -0,0 +1,18 @@ +package com.cxx.home.service; + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.home.dto.anniversary.AnniversaryDto; + +import java.util.List; + +public interface AnniversaryService { + Boolean addAnniversary(AnniversaryDto anniversaryDto); + + Boolean updateAnniversary(Long id, AnniversaryDto anniversaryDto); + + Boolean deleteAnniversary(Long id); + + List queryAnniversary(String category); + + List queryAnniversaryCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/AssetService.java b/home-service/src/main/java/com/cxx/home/service/AssetService.java new file mode 100644 index 0000000..739e03e --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/AssetService.java @@ -0,0 +1,17 @@ +package com.cxx.home.service; + +import com.cxx.home.dto.asset.AssetDto; + +import java.util.List; + +public interface AssetService { + Boolean addAsset(AssetDto assetDto); + + Boolean updateAsset(Long id, AssetDto assetDto); + + Boolean deleteAsset(Long id); + + List queryAsset(String category); + + List queryAssetCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/BillRecordService.java b/home-service/src/main/java/com/cxx/home/service/BillRecordService.java new file mode 100644 index 0000000..8565ded --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/BillRecordService.java @@ -0,0 +1,28 @@ +package com.cxx.home.service; + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.bill.BillCategoryDto; +import com.cxx.common.dto.bill.BillItemDto; +import com.cxx.common.dto.bill.BillRecordDto; +import com.cxx.common.dto.bill.BillSummaryDto; +import com.cxx.common.vo.bill.BillQueryVo; + +import java.util.List; + +public interface BillRecordService { + Boolean saveOrUpdateBillRecord(Long id, BillRecordDto billRecordDto); + + Boolean deleteBillRecord(Long id); + + BillRecordDto queryBillRecord(Long id); + + List queryBillSummary(BillQueryVo billQueryVo); + + List queryBillStats(String type, BillQueryVo billQueryVo); + + List queryBillPay(); + + List queryBillBook(); + + List queryBillCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/BudgetService.java b/home-service/src/main/java/com/cxx/home/service/BudgetService.java new file mode 100644 index 0000000..74b4a40 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/BudgetService.java @@ -0,0 +1,23 @@ +package com.cxx.home.service; + + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.budget.BudgetDto; + +import java.util.List; + +public interface BudgetService { + List queryBudgetCategory(); + + Boolean addBudget(BudgetDto budgetDto); + + Boolean updateBudget(Long id, BudgetDto budgetDto); + + Boolean deleteBudget(Long id); + + List queryBudget(String category); + + List queryBudgetRankStats(String category); + + List queryBudgetProjectStats(String category); +} diff --git a/home-service/src/main/java/com/cxx/home/service/FoodService.java b/home-service/src/main/java/com/cxx/home/service/FoodService.java new file mode 100644 index 0000000..9ea1fd5 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/FoodService.java @@ -0,0 +1,37 @@ +package com.cxx.home.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.home.dto.food.FoodRecipeDto; +import com.cxx.home.dto.food.FoodRecordDto; +import com.cxx.home.dto.food.FoodStatsDto; +import com.cxx.home.dto.food.FoodSummaryDto; +import com.cxx.home.vo.FoodQueryVo; + +import java.util.List; + +public interface FoodService { + Boolean addFoodRecipe(FoodRecipeDto foodRecipeDto); + + Boolean updateFoodRecipe(Long id, FoodRecipeDto foodRecipeDto); + + Boolean deleteFoodRecipe(Long id); + + Boolean addFoodRecord(FoodRecordDto foodRecordDto); + + Boolean updateFoodRecord(Long id, FoodRecordDto foodRecordDto); + + Boolean deleteFoodRecord(Long id); + + FoodRecipeDto queryFoodRecipe(Long id); + + IPage queryFoodSummary(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo); + + List queryFoodRecord(String startDate, String endDate); + + List queryFoodName(); + + List queryFoodCategory(); + + FoodStatsDto queryFoodStats(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/JournalService.java b/home-service/src/main/java/com/cxx/home/service/JournalService.java new file mode 100644 index 0000000..be3f293 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/JournalService.java @@ -0,0 +1,16 @@ +package com.cxx.home.service; + +import com.cxx.home.dto.journal.JournalDto; +import com.cxx.home.vo.JournalQueryVo; + +import java.util.List; + +public interface JournalService { + Boolean addJournal(JournalDto journalDto); + + Boolean updateJournal(Long id, JournalDto journalDto); + + Boolean deleteJournal(Long id); + + List queryJournal(JournalQueryVo queryVo); +} diff --git a/home-service/src/main/java/com/cxx/home/service/KpiService.java b/home-service/src/main/java/com/cxx/home/service/KpiService.java new file mode 100644 index 0000000..7a4b534 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/KpiService.java @@ -0,0 +1,16 @@ +package com.cxx.home.service; + +import com.cxx.home.dto.kpi.KpiDto; +import com.cxx.home.vo.KpiQueryVo; + +import java.util.List; + +public interface KpiService { + Boolean addKpi(KpiDto kpiDto); + + Boolean updateKpi(Long id, KpiDto kpiDto); + + Boolean deleteKpi(Long id); + + List queryKpi(KpiQueryVo queryVo); +} diff --git a/home-service/src/main/java/com/cxx/home/service/LedgerService.java b/home-service/src/main/java/com/cxx/home/service/LedgerService.java new file mode 100644 index 0000000..8afbcf1 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/LedgerService.java @@ -0,0 +1,17 @@ +package com.cxx.home.service; + +import com.cxx.home.dto.ledger.LedgerDto; + +import java.util.List; + +public interface LedgerService { + Boolean addLedger(LedgerDto ledgerDto); + + Boolean updateLedger(Long id, LedgerDto ledgerDto); + + Boolean deleteLedger(Long id); + + List queryLedger(String book); + + List queryLedgerBook(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/MessageService.java b/home-service/src/main/java/com/cxx/home/service/MessageService.java new file mode 100644 index 0000000..f1fd264 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/MessageService.java @@ -0,0 +1,9 @@ +package com.cxx.home.service; + +import com.cxx.common.dto.message.MailMessageDto; + +public interface MessageService { + void sendMailMessage(MailMessageDto mailMessageDto); + + void sendWxMessage(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/PeriodService.java b/home-service/src/main/java/com/cxx/home/service/PeriodService.java new file mode 100644 index 0000000..ad6d6ea --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/PeriodService.java @@ -0,0 +1,18 @@ +package com.cxx.home.service; + +import com.cxx.home.dto.period.PeriodDayDto; +import com.cxx.home.dto.period.PeriodSettingDto; + +import java.util.List; + +public interface PeriodService { + Boolean updatePeriodDay(Long id, PeriodDayDto periodDayDto); + + List queryPeriodDay(String month); + + String getMenstruateFirstDate(String month); + + Boolean updatePeriodSetting(Long id, PeriodSettingDto periodSettingDto); + + PeriodSettingDto queryPeriodSetting(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/PlanService.java b/home-service/src/main/java/com/cxx/home/service/PlanService.java new file mode 100644 index 0000000..aa6aefa --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/PlanService.java @@ -0,0 +1,21 @@ +package com.cxx.home.service; + +import com.cxx.common.dto.plan.PlanDto; +import com.cxx.common.dto.plan.PlanStatsDto; +import com.cxx.common.vo.plan.PlanQueryVo; + +import java.util.List; + +public interface PlanService { + Boolean addPlan(PlanDto planDto); + + Boolean updatePlan(Long id, PlanDto planDto); + + Boolean deletePlan(Long id); + + List queryPlan(PlanQueryVo query); + + Boolean setPlanStatus(Long id, Boolean status); + + PlanStatsDto queryPlanStats(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/ProductService.java b/home-service/src/main/java/com/cxx/home/service/ProductService.java new file mode 100644 index 0000000..956dbd4 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/ProductService.java @@ -0,0 +1,21 @@ +package com.cxx.home.service; + + +import com.cxx.home.dto.product.ProductDto; +import com.cxx.home.vo.ProductQueryVo; + +import java.util.List; + +public interface ProductService { + Boolean addProduct(ProductDto productDto); + + Boolean updateProduct(Long id, ProductDto productDto); + + Boolean deleteProduct(Long id); + + ProductDto queryProduct(Long id); + + List queryProductList(ProductQueryVo queryVo); + + List queryProductCategory(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/QuartzService.java b/home-service/src/main/java/com/cxx/home/service/QuartzService.java new file mode 100644 index 0000000..ea52d67 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/QuartzService.java @@ -0,0 +1,18 @@ +package com.cxx.home.service; + +import com.cxx.common.entity.Task; +import com.cxx.home.schedule.QuartzDto; +import org.quartz.JobKey; + +import java.util.List; + + +public interface QuartzService { + List queryQuartzTask(); + + void createQuartzTask(Task task); + + void updateQuartzTask(Task task); + + void deleteQuartzTask(JobKey jobKey); +} diff --git a/home-service/src/main/java/com/cxx/home/service/SessionService.java b/home-service/src/main/java/com/cxx/home/service/SessionService.java new file mode 100644 index 0000000..52998bd --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/SessionService.java @@ -0,0 +1,7 @@ +package com.cxx.home.service; + +import com.cxx.common.dto.user.SessionDto; + +public interface SessionService { + SessionDto create(String name, String password); +} diff --git a/home-service/src/main/java/com/cxx/home/service/TaskService.java b/home-service/src/main/java/com/cxx/home/service/TaskService.java new file mode 100644 index 0000000..a1386ab --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/TaskService.java @@ -0,0 +1,14 @@ +package com.cxx.home.service; + +import com.cxx.common.dto.task.TaskDto; + + +public interface TaskService { + TaskDto queryTaskById(Long id); + + Long addTask(TaskDto taskDto); + + Boolean updateTask(Long id, TaskDto taskDto); + + Boolean deleteTask(Long id); +} diff --git a/home-service/src/main/java/com/cxx/home/service/TravelService.java b/home-service/src/main/java/com/cxx/home/service/TravelService.java new file mode 100644 index 0000000..87a6e51 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/TravelService.java @@ -0,0 +1,37 @@ +package com.cxx.home.service; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.cxx.home.dto.travel.TravelRecordDto; +import com.cxx.home.dto.travel.TravelSpotDto; +import com.cxx.home.dto.travel.TravelStatsDto; +import com.cxx.home.dto.travel.TravelSummaryDto; +import com.cxx.home.vo.TravelQueryVo; + +import java.util.List; + +public interface TravelService { + Boolean addTravelSpot(TravelSpotDto travelSpotDto); + + Boolean updateTravelSpot(Long id, TravelSpotDto travelSpotDto); + + Boolean deleteTravelSpot(Long id); + + Boolean addTravelRecord(TravelRecordDto travelRecordDto); + + Boolean updateTravelRecord(Long id, TravelRecordDto travelRecordDto); + + Boolean deleteTravelRecord(Long id); + + TravelSpotDto queryTravelSpot(Long id); + + IPage queryTravelSummary(Integer currentPage, Integer pageSize, TravelQueryVo travelQueryVo); + + List queryTravelRecord(String startDate, String endDate); + + List queryTravelSpotName(); + + List queryTravelCategory(); + + TravelStatsDto queryTravelStats(); +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/AnniversaryServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/AnniversaryServiceImpl.java new file mode 100644 index 0000000..9245af1 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/AnniversaryServiceImpl.java @@ -0,0 +1,65 @@ +package com.cxx.home.service.impl; + +import com.cxx.common.dto.StatsChartDto; +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.AnniversaryDao; +import com.cxx.home.dto.anniversary.AnniversaryDto; +import com.cxx.home.entity.Anniversary; +import com.cxx.home.mapper.AnniversaryMapper; +import com.cxx.home.service.AnniversaryService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AnniversaryServiceImpl implements AnniversaryService { + @Resource + private AnniversaryDao anniversaryDao; + + @Resource + private AnniversaryMapper anniversaryMapper; + + + @Override + public Boolean addAnniversary(AnniversaryDto anniversaryDto) { + Anniversary anniversary = new Anniversary(); + BeanUtils.copyProperties(anniversaryDto, anniversary); + anniversary.setRecurring(anniversaryDto.getRecurring() ? 1 : 0); + + return anniversaryMapper.insert(anniversary) == 1; + } + + @Override + public Boolean updateAnniversary(Long id, AnniversaryDto anniversaryDto) { + if (anniversaryMapper.selectById(id) == null) { + throw new CustomException("该纪念日不存在"); + } + + Anniversary anniversary = new Anniversary(); + BeanUtils.copyProperties(anniversaryDto, anniversary); + anniversary.setId(id); + anniversary.setRecurring(anniversaryDto.getRecurring() ? 1 : 0); + return anniversaryMapper.updateById(anniversary) == 1; + } + + @Override + public Boolean deleteAnniversary(Long id) { + if (anniversaryMapper.selectById(id) == null) { + throw new CustomException("该纪念日不存在"); + } + + return anniversaryMapper.deleteById(id) == 1; + } + + @Override + public List queryAnniversary(String category) { + return anniversaryDao.queryAnniversary(category); + } + + @Override + public List queryAnniversaryCategory() { + return anniversaryDao.queryAnniversaryCategory(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/AssetServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/AssetServiceImpl.java new file mode 100644 index 0000000..ede95af --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/AssetServiceImpl.java @@ -0,0 +1,62 @@ +package com.cxx.home.service.impl; + +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.AssetDao; +import com.cxx.home.dto.asset.AssetDto; +import com.cxx.home.entity.Asset; +import com.cxx.home.mapper.AssetMapper; +import com.cxx.home.service.AssetService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class AssetServiceImpl implements AssetService { + @Resource + private AssetDao assetDao; + + @Resource + private AssetMapper assetMapper; + + + @Override + public Boolean addAsset(AssetDto assetDto) { + Asset asset = new Asset(); + BeanUtils.copyProperties(assetDto, asset); + + return assetMapper.insert(asset) == 1; + } + + @Override + public Boolean updateAsset(Long id, AssetDto assetDto) { + if (assetMapper.selectById(id) == null) { + throw new CustomException("该资产不存在"); + } + + Asset asset = new Asset(); + BeanUtils.copyProperties(assetDto, asset); + asset.setId(id); + return assetMapper.updateById(asset) == 1; + } + + @Override + public Boolean deleteAsset(Long id) { + if (assetMapper.selectById(id) == null) { + throw new CustomException("该资产不存在"); + } + + return assetMapper.deleteById(id) == 1; + } + + @Override + public List queryAsset(String category) { + return assetDao.queryAsset(category); + } + + @Override + public List queryAssetCategory() { + return assetDao.queryAssetCategory(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/BillRecordServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/BillRecordServiceImpl.java new file mode 100644 index 0000000..af1924c --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/BillRecordServiceImpl.java @@ -0,0 +1,158 @@ +package com.cxx.home.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.bill.*; +import com.cxx.common.entity.*; +import com.cxx.common.mapper.*; +import com.cxx.common.entity.BillBook; +import com.cxx.common.entity.BillCategory; +import com.cxx.common.entity.BillPay; +import com.cxx.common.entity.BillRecord; +import com.cxx.common.mapper.BillBookMapper; +import com.cxx.common.mapper.BillCategoryMapper; +import com.cxx.common.mapper.BillPayMapper; +import com.cxx.common.mapper.BillRecordMapper; +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.BillDao; +import com.cxx.home.service.BillRecordService; +import com.cxx.common.vo.bill.BillQueryVo; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class BillRecordServiceImpl implements BillRecordService { + @Resource + private BillDao billDao; + + @Resource + private BillRecordMapper billRecordMapper; + + @Resource + private BillPayMapper billPayMapper; + + @Resource + private BillBookMapper billBookMapper; + + @Resource + private BillCategoryMapper billCategoryMapper; + + @Resource + private BillImageMapper billImageMapper; + + @Override + public Boolean saveOrUpdateBillRecord(Long id, BillRecordDto billRecord) { + // 1. 如果是更新 查询账单是否存在 + boolean isUpdate = id > 0; + if (isUpdate && Objects.isNull(billRecordMapper.selectById(id))) { + throw new CustomException("该账单不存在"); + } + + // 2. 新增/更新账单 + BillRecord newBillRecord = new BillRecord(); + BeanUtils.copyProperties(billRecord, newBillRecord); + newBillRecord.setPayId(getBillPayId(billRecord.getPayAccount())); + newBillRecord.setBookId(getBillBook(billRecord.getBookName())); + newBillRecord.setCategoryId(getBillCategory(billRecord.getCategory())); + + if (isUpdate) { + newBillRecord.setId(id); + billRecordMapper.updateById(newBillRecord); + } else { + billRecordMapper.insert(newBillRecord); + } + + // 6. 新增/更新账单图片 + if (isUpdate) { + // 如果是更新先删除所有的账单图片记录 + deleteBillImage(id); + } + + // 新增账单图片 + insertBillImage(newBillRecord.getId(), billRecord.getImageList()); + + return Boolean.TRUE; + } + + private Long getBillPayId(String payAccount) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(BillPay.class); + BillPay billPay = billPayMapper.selectOne(queryWrapper.eq(BillPay::getName, payAccount)); + if (Objects.isNull(billPay)) { + throw new CustomException("暂无该账户类型"); + } + + return billPay.getId(); + } + + private Long getBillBook(String bookName) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(BillBook.class); + BillBook billBook = billBookMapper.selectOne(queryWrapper.eq(BillBook::getName, bookName)); + if (Objects.isNull(billBook)) { + throw new CustomException("暂无该账本类型"); + } + + return billBook.getId(); + } + + private Long getBillCategory(String categoryName) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(BillCategory.class); + BillCategory billCategory = billCategoryMapper.selectOne(queryWrapper.eq(BillCategory::getName, categoryName)); + if (Objects.isNull(billCategory)) { + throw new CustomException("暂无该账单类型"); + } + + return billCategory.getId(); + } + + private void insertBillImage(Long billId, List imageDtoList) { + if (imageDtoList.isEmpty()) { + return; + } + billDao.insertBillImage(billId, imageDtoList); + } + + private void deleteBillImage(Long id) { + billImageMapper.delete(Wrappers.lambdaQuery(BillImage.class).eq(BillImage::getBillId, id)); + } + + @Override + public Boolean deleteBillRecord(Long id) { + deleteBillImage(id); + return billRecordMapper.deleteById(id) == 1; + } + + @Override + public BillRecordDto queryBillRecord(Long id) { + return billDao.queryBillRecord(id); + } + + @Override + public List queryBillSummary(BillQueryVo billQuery) { + return billDao.queryBillSummary(billQuery); + } + + @Override + public List queryBillStats(String type, BillQueryVo billQuery) { + return billDao.queryBillStats(type, billQuery); + } + + @Override + public List queryBillPay() { + return billDao.queryBillPay(); + } + + @Override + public List queryBillBook() { + return billDao.queryBillBook(); + } + + @Override + public List queryBillCategory() { + return billDao.queryBillCategory(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/BudgetServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/BudgetServiceImpl.java new file mode 100644 index 0000000..e15d893 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/BudgetServiceImpl.java @@ -0,0 +1,88 @@ +package com.cxx.home.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.toolkit.SimpleQuery; +import com.cxx.common.dto.StatsChartDto; +import com.cxx.common.dto.budget.BudgetDto; +import com.cxx.common.entity.Budget; +import com.cxx.common.entity.BudgetCategory; +import com.cxx.common.mapper.BudgetCategoryMapper; +import com.cxx.common.mapper.BudgetMapper; +import com.cxx.home.dao.BudgetDao; +import com.cxx.home.service.BudgetService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class BudgetServiceImpl implements BudgetService { + @Resource + private BudgetDao budgetDao; + + @Resource + private BudgetMapper budgetMapper; + + @Resource + private BudgetCategoryMapper budgetCategoryMapper; + + @Override + public List queryBudgetCategory() { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(BudgetCategory.class); + return SimpleQuery.list(queryWrapper.select(BudgetCategory::getName), BudgetCategory::getName); + } + + @Override + public Boolean addBudget(BudgetDto budgetDto) { + Budget budge = new Budget(); + BeanUtils.copyProperties(budgetDto, budge); + budge.setCategoryId(getBudgetCategory(budgetDto.getCategory())); + + return budgetMapper.insert(budge) == 1; + } + + @Override + public Boolean updateBudget(Long id, BudgetDto budgetDto) { + Budget budge = new Budget(); + BeanUtils.copyProperties(budgetDto, budge); + budge.setCategoryId(getBudgetCategory(budgetDto.getCategory())); + budge.setId(id); + return budgetMapper.updateById(budge) == 1; + } + + private Long getBudgetCategory(String category) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + BudgetCategory budgetCategory = budgetCategoryMapper.selectOne(queryWrapper.eq(BudgetCategory::getName, category)); + if (Objects.isNull(budgetCategory)) { + BudgetCategory newBudgetCategory = new BudgetCategory(); + newBudgetCategory.setName(category); + budgetCategoryMapper.insert(newBudgetCategory); + return newBudgetCategory.getId(); + } else { + return budgetCategory.getId(); + } + } + + @Override + public Boolean deleteBudget(Long id) { + return budgetMapper.deleteById(id) == 1; + } + + @Override + public List queryBudget(String category) { + return budgetDao.queryBudget(category); + } + + @Override + public List queryBudgetRankStats(String category) { + return budgetDao.queryBudgetRankStats(category); + } + + @Override + public List queryBudgetProjectStats(String category) { + return budgetDao.queryBudgetProjectStats(category); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java new file mode 100644 index 0000000..4b67a04 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/FoodServiceImpl.java @@ -0,0 +1,200 @@ +package com.cxx.home.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cxx.home.dto.food.*; +import com.cxx.home.mapper.FoodMaterialMapper; +import com.cxx.home.mapper.FoodStepMapper; +import com.cxx.home.mapper.FoodRecipeMapper; +import com.cxx.home.mapper.FoodRecordMapper; +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.FoodDao; +import com.cxx.home.entity.FoodMaterial; +import com.cxx.home.entity.FoodRecipe; +import com.cxx.home.entity.FoodRecord; +import com.cxx.home.entity.FoodStep; +import com.cxx.home.service.FoodService; +import com.cxx.home.vo.FoodQueryVo; +import com.github.yitter.idgen.YitIdHelper; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class FoodServiceImpl implements FoodService { + @Resource + private FoodDao foodDao; + + @Resource + private FoodRecipeMapper foodRecipeMapper; + + @Resource + private FoodMaterialMapper foodMaterialMapper; + + @Resource + private FoodStepMapper foodStepMapper; + + @Resource + private FoodRecordMapper foodRecordMapper; + + @Override + @Transactional + public Boolean addFoodRecipe(FoodRecipeDto foodRecipeDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (foodRecipeMapper.exists(queryWrapper.eq(FoodRecipe::getName, foodRecipeDto.getName()))) { + throw new CustomException("该菜谱已经存在"); + } + + FoodRecipe foodRecipe = new FoodRecipe(); + BeanUtils.copyProperties(foodRecipeDto, foodRecipe); + foodRecipeMapper.insert(foodRecipe); + resetFoodRecipe(foodRecipe.getId(), foodRecipeDto); + + return Boolean.TRUE; + } + + @Override + @Transactional + public Boolean updateFoodRecipe(Long id, FoodRecipeDto foodRecipeDto) { + if (foodRecipeMapper.selectById(id) == null) { + throw new CustomException("该菜谱不存在"); + } + + FoodRecipe foodRecipe = new FoodRecipe(); + BeanUtils.copyProperties(foodRecipeDto, foodRecipe); + foodRecipe.setId(id); + foodRecipeMapper.updateById(foodRecipe); + resetFoodRecipe(foodRecipe.getId(), foodRecipeDto); + + return Boolean.TRUE; + } + + @Override + @Transactional + public Boolean deleteFoodRecipe(Long id) { + foodRecipeMapper.deleteById(id); + foodMaterialMapper.delete(Wrappers.lambdaQuery(FoodMaterial.class).eq(FoodMaterial::getFoodId, id)); + foodStepMapper.delete(Wrappers.lambdaQuery(FoodStep.class).eq(FoodStep::getFoodId, id)); + foodRecordMapper.delete(Wrappers.lambdaQuery(FoodRecord.class).eq(FoodRecord::getFoodId, id)); + + return Boolean.TRUE; + } + + @Override + public Boolean addFoodRecord(FoodRecordDto foodRecordDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + FoodRecipe foodRecipe = foodRecipeMapper.selectOne(queryWrapper.eq(FoodRecipe::getName, foodRecordDto.getName())); + if (foodRecipe == null) { + throw new CustomException("该菜谱不存在"); + } + + FoodRecord foodRecord = new FoodRecord(); + foodRecord.setFoodId(foodRecipe.getId()); + BeanUtils.copyProperties(foodRecordDto, foodRecord); + foodRecordMapper.insert(foodRecord); + + return Boolean.TRUE; + } + + @Override + public Boolean updateFoodRecord(Long id, FoodRecordDto foodRecordDto) { + if (foodRecordMapper.selectById(id) == null) { + throw new CustomException("该成果不存在"); + } + + FoodRecord foodRecord = new FoodRecord(); + BeanUtils.copyProperties(foodRecordDto, foodRecord); + foodRecord.setId(id); + foodRecordMapper.updateById(foodRecord); + + return Boolean.TRUE; + } + + @Override + public Boolean deleteFoodRecord(Long id) { + foodRecordMapper.deleteById(id); + + return Boolean.TRUE; + } + + private void resetFoodRecipe(Long id, FoodRecipeDto foodRecipeDto) { + foodMaterialMapper.delete(Wrappers.lambdaQuery(FoodMaterial.class).eq(FoodMaterial::getFoodId, id)); + foodStepMapper.delete(Wrappers.lambdaQuery(FoodStep.class).eq(FoodStep::getFoodId, id)); + + insertFoodMaterial(id, foodRecipeDto.getMaterialList()); + insertFoodStep(id, foodRecipeDto.getStepList()); + } + + private void insertFoodMaterial(Long foodId, List foodMaterialList) { + if (foodMaterialList.isEmpty()) { + return; + } + + foodMaterialList.forEach((item) -> { + item.setId(YitIdHelper.nextId()); + }); + foodDao.insertFoodMaterial(foodId, foodMaterialList); + } + + private void insertFoodStep(Long foodId, List foodStepList) { + if (foodStepList.isEmpty()) { + return; + } + + foodStepList.forEach((item) -> { + item.setId(YitIdHelper.nextId()); + }); + foodDao.insertFoodStep(foodId, foodStepList); + } + + @Override + public FoodRecipeDto queryFoodRecipe(Long id) { + if (foodRecipeMapper.selectById(id) == null) { + throw new CustomException("该美食不存在"); + } + + return foodDao.queryFoodRecipe(id); + } + + @Override + public IPage queryFoodSummary(Integer currentPage, Integer pageSize, FoodQueryVo foodQueryVo) { + // 这里只能先对主表进行分页 然后在查询子表信息 + // 不能使用Left Join关联表查询,因为这里是一对多数据,关联查询会导致数据有重复 + // 从而导致page计算错误(会把重复的数据当成多条记录,实际上只有1条记录) + IPage foodSummaryPage = foodDao.queryFoodSummary(new Page<>(currentPage, pageSize), foodQueryVo); + List foodSummaryList = foodSummaryPage.getRecords(); + for (FoodSummaryDto foodSummary : foodSummaryList) { + foodSummary.setRecordList(foodDao.queryFoodRecordById(foodSummary.getId())); + } + + foodSummaryPage.setRecords(foodSummaryList); + return foodSummaryPage; + } + + @Override + public List queryFoodRecord(String startDate, String endDate) { + return foodDao.queryFoodRecord(startDate, endDate); + } + + @Override + public List queryFoodName() { + return foodRecipeMapper.selectList(null) + .stream().map(FoodRecipe::getName).collect(Collectors.toList()); + } + + @Override + public List queryFoodCategory() { + return foodDao.queryFoodCategory(); + } + + @Override + public FoodStatsDto queryFoodStats() { + return foodDao.queryFoodStats(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java new file mode 100644 index 0000000..cc1c4ea --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/JournalServiceImpl.java @@ -0,0 +1,57 @@ +package com.cxx.home.service.impl; + +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.JournalDao; +import com.cxx.home.dto.journal.JournalDto; +import com.cxx.home.entity.Journal; +import com.cxx.home.mapper.JournalMapper; +import com.cxx.home.service.JournalService; +import com.cxx.home.vo.JournalQueryVo; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class JournalServiceImpl implements JournalService { + @Resource + private JournalDao journalDao; + + @Resource + private JournalMapper journalMapper; + + @Override + public Boolean addJournal(JournalDto journalDto) { + Journal journal = new Journal(); + BeanUtils.copyProperties(journalDto, journal); + + return journalMapper.insert(journal) == 1; + } + + @Override + public Boolean updateJournal(Long id, JournalDto journalDto) { + if (journalMapper.selectById(id) == null) { + throw new CustomException("该日记不存在"); + } + + Journal journal = new Journal(); + BeanUtils.copyProperties(journalDto, journal); + journal.setId(id); + return journalMapper.updateById(journal) == 1; + } + + @Override + public Boolean deleteJournal(Long id) { + if (journalMapper.selectById(id) == null) { + throw new CustomException("该纪念日不存在"); + } + + return journalMapper.deleteById(id) == 1; + } + + @Override + public List queryJournal(JournalQueryVo queryVo) { + return journalDao.queryJournal(queryVo); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java new file mode 100644 index 0000000..584461d --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/KpiServiceImpl.java @@ -0,0 +1,58 @@ +package com.cxx.home.service.impl; + +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.KpiDao; +import com.cxx.home.dto.kpi.KpiDto; +import com.cxx.home.entity.Kpi; +import com.cxx.home.mapper.KpiMapper; +import com.cxx.home.service.KpiService; +import com.cxx.home.vo.KpiQueryVo; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class KpiServiceImpl implements KpiService { + @Resource + private KpiDao kpiDao; + + @Resource + private KpiMapper kpiMapper; + + + @Override + public Boolean addKpi(KpiDto kpiDto) { + Kpi kpi = new Kpi(); + BeanUtils.copyProperties(kpiDto, kpi); + + return kpiMapper.insert(kpi) == 1; + } + + @Override + public Boolean updateKpi(Long id, KpiDto kpiDto) { + if (kpiMapper.selectById(id) == null) { + throw new CustomException("该绩效不存在"); + } + + Kpi kpi = new Kpi(); + BeanUtils.copyProperties(kpiDto, kpi); + kpi.setId(id); + return kpiMapper.updateById(kpi) == 1; + } + + @Override + public Boolean deleteKpi(Long id) { + if (kpiMapper.selectById(id) == null) { + throw new CustomException("该绩效不存在"); + } + + return kpiMapper.deleteById(id) == 1; + } + + @Override + public List queryKpi(KpiQueryVo queryVo) { + return kpiDao.queryKpi(queryVo); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/LedgerServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/LedgerServiceImpl.java new file mode 100644 index 0000000..7a063dc --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/LedgerServiceImpl.java @@ -0,0 +1,61 @@ +package com.cxx.home.service.impl; + +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.LedgerDao; +import com.cxx.home.dto.ledger.LedgerDto; +import com.cxx.home.entity.Ledger; +import com.cxx.home.mapper.LedgerMapper; +import com.cxx.home.service.LedgerService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class LedgerServiceImpl implements LedgerService { + @Resource + private LedgerDao ledgerDao; + + @Resource + private LedgerMapper ledgerMapper; + + @Override + public Boolean addLedger(LedgerDto ledgerDto) { + Ledger ledger = new Ledger(); + BeanUtils.copyProperties(ledgerDto, ledger); + + return ledgerMapper.insert(ledger) == 1; + } + + @Override + public Boolean updateLedger(Long id, LedgerDto ledgerDto) { + if (ledgerMapper.selectById(id) == null) { + throw new CustomException("该账本内容不存在"); + } + + Ledger ledger = new Ledger(); + BeanUtils.copyProperties(ledgerDto, ledger); + ledger.setId(id); + return ledgerMapper.updateById(ledger) == 1; + } + + @Override + public Boolean deleteLedger(Long id) { + if (ledgerMapper.selectById(id) == null) { + throw new CustomException("该绩效不存在"); + } + + return ledgerMapper.deleteById(id) == 1; + } + + @Override + public List queryLedger(String book) { + return ledgerDao.queryLedger(book); + } + + @Override + public List queryLedgerBook() { + return ledgerDao.queryLedgerBook(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/MessageServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..b81a805 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/MessageServiceImpl.java @@ -0,0 +1,70 @@ +package com.cxx.home.service.impl; + +import com.cxx.common.dto.message.MailMessageDto; +import com.cxx.home.service.MessageService; +import jakarta.annotation.Resource; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.mp.api.WxMpService; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; +import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@Slf4j +public class MessageServiceImpl implements MessageService { + @Resource + private JavaMailSender javaMailSender; + + @Override + public void sendMailMessage(MailMessageDto mailMessageDto) { + try { + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom("njcxx0822@163.com"); + helper.setTo(mailMessageDto.getTo()); + helper.setSubject(mailMessageDto.getSubject()); + helper.setText(mailMessageDto.getBody(), true); + + // 发送邮件 + javaMailSender.send(mimeMessage); + log.info("邮件发送成功"); + } catch (MessagingException e) { + log.error("邮件发送失败: {}", e.getMessage()); + } + } + + @Override + public void sendWxMessage() { + WxMpDefaultConfigImpl wxStorage = new WxMpDefaultConfigImpl(); + wxStorage.setAppId("wxdf137d1a34489880"); + wxStorage.setSecret("25b73681c66a480e726d67bb38aeb71e"); + + WxMpService wxMpService = new WxMpServiceImpl(); + wxMpService.setWxMpConfigStorage(wxStorage); + // 此处的 key/value 需和模板消息对应 + List wxMpTemplateDataList = List.of( + new WxMpTemplateData("test", "Hello World") + ); + + WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder() + .toUser("ol1ZM7PJvNZ4MXWglwz68GtQCppI") // openId为1.3步骤中得到的微信号 + .templateId("JoY6-AmAxLLU7N-tG0-Bl2o0P3_j7gTI4O-L2nZ0R8g") + .data(wxMpTemplateDataList) + .build(); + + try { + wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage); + log.info("推送消息成功"); + } catch (Exception e) { + log.error("推送失败:{}", e.getMessage()); + } + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java new file mode 100644 index 0000000..9d32b9e --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/PeriodServiceImpl.java @@ -0,0 +1,104 @@ +package com.cxx.home.service.impl; + +import com.cxx.home.dao.PeriodDao; +import com.cxx.home.dto.period.PeriodDayDto; +import com.cxx.home.dto.period.PeriodSettingDto; +import com.cxx.home.entity.PeriodDay; +import com.cxx.home.entity.PeriodSetting; +import com.cxx.home.mapper.PeriodDayMapper; +import com.cxx.home.mapper.PeriodSettingMapper; +import com.cxx.home.service.PeriodService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class PeriodServiceImpl implements PeriodService { + @Resource + private PeriodDao periodDao; + + @Resource + private PeriodDayMapper periodDayMapper; + + @Resource + private PeriodSettingMapper periodSettingMapper; + + @Transactional + @Override + public Boolean updatePeriodDay(Long id, PeriodDayDto periodDayDto) { + if (id == 0) { + // 非月经天 + if (!periodDayDto.getIsMenstruate() && periodDayDto.getSexActivity().isEmpty() + && !periodDayDto.getIsDrug()) { + return Boolean.TRUE; + } else { + PeriodDay periodDay = new PeriodDay(); + BeanUtils.copyProperties(periodDayDto, periodDay); + periodDay.setIsDrug(periodDayDto.getIsDrug() ? 1 : 0); + periodDay.setIsMenstruate(periodDayDto.getIsMenstruate() ? 1 : 0); + return periodDayMapper.insert(periodDay) == 1; + } + } else { + PeriodDay periodDay = new PeriodDay(); + + // 非月经天 + if (!periodDayDto.getIsMenstruate() && periodDayDto.getSexActivity().isEmpty() + && !periodDayDto.getIsDrug()) { + return periodDayMapper.deleteById(id) == 1; + } else { + BeanUtils.copyProperties(periodDayDto, periodDay); + periodDay.setId(id); + periodDay.setIsDrug(periodDayDto.getIsDrug() ? 1 : 0); + periodDay.setIsMenstruate(periodDayDto.getIsMenstruate() ? 1 : 0); + return periodDayMapper.updateById(periodDay) == 1; + } + } + } + + @Override + public List queryPeriodDay(String month) { + return periodDao.queryPeriodDay(month); + } + + @Override + public String getMenstruateFirstDate(String month) { + return periodDao.getMenstruateFirstDate(month); + } + + @Override + public Boolean updatePeriodSetting(Long id, PeriodSettingDto periodSettingDto) { + if (id == 0) { + PeriodSetting periodSetting = new PeriodSetting(); + BeanUtils.copyProperties(periodSettingDto, periodSetting); + periodSetting.setIsCalculate(periodSettingDto.getIsCalculate() ? 1 : 0); + return periodSettingMapper.insert(periodSetting) == 1; + } else { + PeriodSetting periodSetting = new PeriodSetting(); + BeanUtils.copyProperties(periodSettingDto, periodSetting); + periodSetting.setId(id); + periodSetting.setIsCalculate(periodSettingDto.getIsCalculate() ? 1 : 0); + return periodSettingMapper.updateById(periodSetting) == 1; + } + } + + @Override + public PeriodSettingDto queryPeriodSetting() { + List periodSettingList = periodSettingMapper.selectList(null); + PeriodSettingDto periodSettingDto = new PeriodSettingDto(); + + if (periodSettingList.size() > 0) { + BeanUtils.copyProperties(periodSettingList.get(0), periodSettingDto); + periodSettingDto.setIsCalculate(periodSettingList.get(0).getIsCalculate() == 1); + } else { + periodSettingDto.setId(0L); + periodSettingDto.setCycleLength(0); + periodSettingDto.setDuration(0); + periodSettingDto.setIsCalculate(false); + } + + return periodSettingDto; + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/PlanServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/PlanServiceImpl.java new file mode 100644 index 0000000..387e257 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/PlanServiceImpl.java @@ -0,0 +1,136 @@ +package com.cxx.home.service.impl; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.cxx.common.dto.message.MailMessageDto; +import com.cxx.common.dto.plan.PlanDto; +import com.cxx.common.dto.plan.PlanStatsDto; +import com.cxx.common.dto.task.TaskDto; +import com.cxx.common.entity.Plan; +import com.cxx.common.mapper.PlanMapper; +import com.cxx.common.vo.plan.PlanQueryVo; +import com.cxx.home.dao.PlanDao; +import com.cxx.home.schedule.TaskType; +import com.cxx.home.service.PlanService; +import com.cxx.home.service.TaskService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PlanServiceImpl implements PlanService { + @Resource + private PlanDao planDao; + + @Resource + private PlanMapper planMapper; + + @Resource + private TaskService taskService; + + @Override + public Boolean addPlan(PlanDto planDto) { + Plan plan = new Plan(); + BeanUtils.copyProperties(planDto, plan); + + // 如果存在提醒时间,则新建定时任务 + if (planDto.getAlterTime() != null) { + plan.setTaskId(addPlanTask(planDto)); + } + + return planMapper.insert(plan) == 1; + } + + @Override + public Boolean updatePlan(Long id, PlanDto planDto) { + Plan plan = new Plan(); + BeanUtils.copyProperties(planDto, plan); + plan.setId(id); + planMapper.updateById(plan); + + // 如果存在定时任务,则更新 + if (planDto.getTaskId() != null) { + updatePlanTask(id, plan.getTaskId(), planDto); + } else { + // 如果不存在定时任务,但存在提醒时间,则新建 + if (planDto.getAlterTime() != null) { + plan.setTaskId(addPlanTask(planDto)); + planMapper.updateById(plan); + } + } + + return Boolean.TRUE; + } + + @Override + public Boolean deletePlan(Long id) { + Plan plan = planMapper.selectById(id); + + // 如果存在定时任务 + if (plan != null && plan.getTaskId() != null) { + Long taskId = plan.getTaskId(); + + // 如果存在提醒时间,则删除 + if (plan.getAlterTime() != null) { + taskService.deleteTask(taskId); + } + } + + return planMapper.deleteById(id) == 1; + } + + @Override + public List queryPlan(PlanQueryVo query) { + return planDao.queryPlan(query); + } + + @Override + public Boolean setPlanStatus(Long id, Boolean status) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", id).set("completed", status ? 1 : 0); + + return planMapper.update(null, updateWrapper) > 0; + } + + @Override + public PlanStatsDto queryPlanStats() { + return planDao.queryPlanStats(); + } + + private Long addPlanTask(PlanDto planDto) { + TaskDto taskDto = new TaskDto(); + taskDto.setType(TaskType.EMAIL); + taskDto.setContent(getPlanContent(planDto)); + taskDto.setExecuteTime(planDto.getAlterTime()); + return taskService.addTask(taskDto); + } + + private void updatePlanTask(Long planId, Long taskId, PlanDto planDto) { + TaskDto taskDto = taskService.queryTaskById(taskId); + + // 如果存在提醒时间,则更新 + if (planDto.getAlterTime() != null) { + taskDto.setContent(getPlanContent(planDto)); + taskDto.setExecuteTime(planDto.getAlterTime()); + taskService.updateTask(taskId, taskDto); + } else { + // 如果不存在,则删除 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Plan::getId, planId).set(Plan::getTaskId, null); + planMapper.update(updateWrapper); + taskService.deleteTask(taskId); + } + } + + private String getPlanContent(PlanDto planDto) { + MailMessageDto messageDto = new MailMessageDto(); + messageDto.setTo(planDto.getEmail()); + messageDto.setSubject("日程提醒"); + messageDto.setBody("

" + planDto.getTitle() + "


" + planDto.getContent() + "

"); + + return JSONUtil.toJsonStr(messageDto); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..cb6c567 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/ProductServiceImpl.java @@ -0,0 +1,76 @@ +package com.cxx.home.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.ProductDao; +import com.cxx.home.dto.product.ProductDto; +import com.cxx.home.entity.*; +import com.cxx.home.mapper.*; +import com.cxx.home.service.ProductService; +import com.cxx.home.vo.ProductQueryVo; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class ProductServiceImpl implements ProductService { + @Resource + private ProductDao productDao; + + @Resource + private ProductMapper productMapper; + + @Override + @Transactional + public Boolean addProduct(ProductDto productDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (productMapper.exists(queryWrapper.eq(Product::getName, productDto.getName()))) { + throw new CustomException("该商品已经存在"); + } + + Product product = new Product(); + BeanUtils.copyProperties(productDto, product); + return productMapper.insert(product) == 1; + } + + @Override + @Transactional + public Boolean updateProduct(Long id, ProductDto productDto) { + if (productMapper.selectById(id) == null) { + throw new CustomException("该商品不存在"); + } + + Product product = new Product(); + BeanUtils.copyProperties(productDto, product); + product.setId(id); + return productMapper.updateById(product) == 1; + } + + @Override + @Transactional + public Boolean deleteProduct(Long id) { + return productMapper.deleteById(id) == 1; + } + + @Override + public ProductDto queryProduct(Long id) { + if (productMapper.selectById(id) == null) { + throw new CustomException("该商品不存在"); + } + + return productDao.queryProduct(id); + } + + @Override + public List queryProductList(ProductQueryVo queryVo) { + return productDao.queryProductList(queryVo); + } + + @Override + public List queryProductCategory() { + return productDao.queryProductCategory(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/QuartzServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/QuartzServiceImpl.java new file mode 100644 index 0000000..706268c --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/QuartzServiceImpl.java @@ -0,0 +1,112 @@ +package com.cxx.home.service.impl; + +import com.cxx.common.entity.Task; +import com.cxx.common.mapper.TaskMapper; +import com.cxx.framework.web.CustomException; +import com.cxx.home.schedule.QuartzDto; +import com.cxx.home.schedule.QuartzUtils; +import com.cxx.home.service.QuartzService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; + +@Service +@Slf4j +public class QuartzServiceImpl implements QuartzService { + @Resource + private Scheduler scheduler; + + @Resource + private TaskMapper taskMapper; + + @Override + public List queryQuartzTask() { + GroupMatcher matcher = GroupMatcher.anyJobGroup(); + List quartzDtoList = new ArrayList<>(); + + try { + Set jobKeys = scheduler.getJobKeys(matcher); + for (JobKey jobKey : jobKeys) { + List triggers = scheduler.getTriggersOfJob(jobKey); + for (Trigger trigger : triggers) { + QuartzDto quartzDto = new QuartzDto(); + // 获取名称和组别 + quartzDto.setName(jobKey.getName()); + quartzDto.setGroup(jobKey.getGroup()); + + // 获取类型和内容 + Task task = taskMapper.selectById(jobKey.getName()); + quartzDto.setType(task.getType()); + quartzDto.setContent(task.getContent()); + + // 获取状态 + // NONE(触发器不存在)NORMAL(正常执行) PAUSED(暂停) + // COMPLETE(完成) ERROR(执行出错) BLOCKED(阻塞) + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + quartzDto.setStatus(triggerState.name()); + + // 获取执行时间 + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger) trigger; + String cronExpression = cronTrigger.getCronExpression(); + quartzDto.setCronExpression(cronExpression); + } + if (trigger instanceof SimpleTrigger) { + SimpleTrigger simpleTrigger = (SimpleTrigger) trigger; + Date startTime = simpleTrigger.getStartTime(); + quartzDto.setExecuteTime(startTime); + } + quartzDtoList.add(quartzDto); + } + } + } catch (SchedulerException e) { + throw new CustomException("获取任务列表失败: " + e.getMessage()); + } + + return quartzDtoList; + } + + @Override + public void createQuartzTask(Task task) { + try { + JobKey jobKey = new JobKey(task.getId().toString()); + scheduler.scheduleJob(QuartzUtils.getJobDetail(task, jobKey), QuartzUtils.getTrigger(task, jobKey)); + } catch (SchedulerException e) { + throw new CustomException("创建任务: {} " + task.getId() + "失败: {}" + e.getMessage()); + } + } + + @Override + public void updateQuartzTask(Task task) { + try { + JobKey jobKey = new JobKey(task.getId().toString()); + + // 此时并未执行,则更新 + if (scheduler.getJobDetail(jobKey) != null) { + Trigger oldTrigger = scheduler.getTriggersOfJob(jobKey).get(0); + scheduler.rescheduleJob(oldTrigger.getKey(), QuartzUtils.getTrigger(task, jobKey)); + } else { + // 如果已经执行,则新建 + scheduler.scheduleJob(QuartzUtils.getJobDetail(task, jobKey), QuartzUtils.getTrigger(task, jobKey)); + } + } catch (SchedulerException e) { + throw new CustomException("更新任务: {} " + task.getId() + "失败: {}" + e.getMessage()); + } + } + + @Override + public void deleteQuartzTask(JobKey jobKey) { + try { + scheduler.deleteJob(jobKey); + } catch (SchedulerException e) { + throw new CustomException("删除任务: {} " + jobKey.getName() + "失败: {}" + e.getMessage()); + } + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/SessionServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/SessionServiceImpl.java new file mode 100644 index 0000000..4657dcd --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/SessionServiceImpl.java @@ -0,0 +1,57 @@ +package com.cxx.home.service.impl; + + +import cn.dev33.satoken.secure.BCrypt; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; + +import com.cxx.common.dto.user.SessionDto; +import com.cxx.common.dto.user.UserDto; +import com.cxx.common.entity.Account; +import com.cxx.common.entity.User; +import com.cxx.common.mapper.AccountMapper; +import com.cxx.common.mapper.UserMapper; +import com.cxx.framework.web.CustomException; +import com.cxx.home.service.SessionService; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + + +@Service +public class SessionServiceImpl implements SessionService { + @Resource + private AccountMapper accountMapper; + + @Resource + private UserMapper userMapper; + + @Override + public SessionDto create(String name, String password) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(Account.class).eq(Account::getAccountName, name); + Account account = accountMapper.selectOne(queryWrapper); + if (account == null) { + throw new CustomException("账户: " + name + " 不存在"); + } + + if (!BCrypt.checkpw(password, account.getPassword())) { + throw new CustomException("密码不正确"); + } + + User user = userMapper.selectById(account.getUserId()); + UserDto userDto = new UserDto(); + BeanUtils.copyProperties(user, userDto); + userDto.setAccountId(account.getId()); + userDto.setAccountName(name); + + SessionDto sessionDto = new SessionDto(); + StpUtil.login(account.getId()); + sessionDto.setSaToken(StpUtil.getTokenInfo()); + sessionDto.setUserInfo(userDto); + + StpUtil.getSession().set("username", name); + + return sessionDto; + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/TaskServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/TaskServiceImpl.java new file mode 100644 index 0000000..c34341f --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/TaskServiceImpl.java @@ -0,0 +1,58 @@ +package com.cxx.home.service.impl; + +import com.cxx.common.dto.task.TaskDto; +import com.cxx.common.entity.Task; +import com.cxx.common.mapper.TaskMapper; +import com.cxx.home.service.QuartzService; +import com.cxx.home.service.TaskService; +import jakarta.annotation.Resource; +import org.quartz.JobKey; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +@Service +public class TaskServiceImpl implements TaskService { + @Resource + private TaskMapper taskMapper; + + @Resource + private QuartzService quartzService; + + @Override + public TaskDto queryTaskById(Long id) { + Task task = taskMapper.selectById(id); + TaskDto taskDto = new TaskDto(); + taskDto.setType(task.getType()); + taskDto.setContent(task.getContent()); + taskDto.setExecuteTime(task.getExecuteTime()); + taskDto.setCronExpression(task.getCronExpression()); + + return taskDto; + } + + @Override + public Long addTask(TaskDto taskDto) { + Task newTask = new Task(); + BeanUtils.copyProperties(taskDto, newTask); + + taskMapper.insert(newTask); + quartzService.createQuartzTask(newTask); + return newTask.getId(); + } + + @Override + public Boolean updateTask(Long id, TaskDto taskDto) { + Task newTask = new Task(); + BeanUtils.copyProperties(taskDto, newTask); + + newTask.setId(id); + quartzService.updateQuartzTask(newTask); + return taskMapper.updateById(newTask) == 1; + } + + @Override + public Boolean deleteTask(Long id) { + quartzService.deleteQuartzTask(new JobKey(id.toString())); + return taskMapper.deleteById(id) == 1; + } +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/TravelServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/TravelServiceImpl.java new file mode 100644 index 0000000..0b143e2 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/TravelServiceImpl.java @@ -0,0 +1,197 @@ +package com.cxx.home.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.cxx.home.dto.travel.TravelRecordDto; +import com.cxx.home.dto.travel.TravelSpotDto; +import com.cxx.home.dto.travel.TravelStatsDto; +import com.cxx.home.dto.travel.TravelSummaryDto; +import com.cxx.framework.web.CustomException; +import com.cxx.home.dao.TravelDao; +import com.cxx.home.entity.TravelImage; +import com.cxx.home.entity.TravelRecord; +import com.cxx.home.entity.TravelSpot; +import com.cxx.home.entity.TravelVideo; +import com.cxx.home.mapper.TravelImageMapper; +import com.cxx.home.mapper.TravelRecordMapper; +import com.cxx.home.mapper.TravelSpotMapper; +import com.cxx.home.mapper.TravelVideoMapper; +import com.cxx.home.service.TravelService; +import com.cxx.home.vo.TravelQueryVo; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class TravelServiceImpl implements TravelService { + @Resource + private TravelDao travelDao; + + @Resource + private TravelSpotMapper travelSpotMapper; + + @Resource + private TravelRecordMapper travelRecordMapper; + + @Resource + private TravelImageMapper travelImageMapper; + + @Resource + private TravelVideoMapper travelVideoMapper; + + @Override + @Transactional + public Boolean addTravelSpot(TravelSpotDto travelSpotDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (travelSpotMapper.exists(queryWrapper.eq(TravelSpot::getName, travelSpotDto.getName()))) { + throw new CustomException("该景点已经存在"); + } + + TravelSpot travelSpot = new TravelSpot(); + BeanUtils.copyProperties(travelSpotDto, travelSpot); + travelSpot.setCity(travelSpotDto.getArea().get(1)); + travelSpotMapper.insert(travelSpot); + + return Boolean.TRUE; + } + + @Override + @Transactional + public Boolean updateTravelSpot(Long id, TravelSpotDto travelSpotDto) { + if (travelSpotMapper.selectById(id) == null) { + throw new CustomException("该景点不存在"); + } + + TravelSpot travelSpot = new TravelSpot(); + BeanUtils.copyProperties(travelSpotDto, travelSpot); + travelSpot.setId(id); + travelSpot.setCity(travelSpotDto.getArea().get(1)); + travelSpotMapper.updateById(travelSpot); + + return Boolean.TRUE; + } + + @Override + @Transactional + public Boolean deleteTravelSpot(Long id) { + travelSpotMapper.deleteById(id); + travelRecordMapper.delete(Wrappers.lambdaQuery(TravelRecord.class).eq(TravelRecord::getTravelId, id)); + + return Boolean.TRUE; + } + + @Override + public Boolean addTravelRecord(TravelRecordDto travelRecordDto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + TravelSpot travelSpot = travelSpotMapper.selectOne(queryWrapper.eq(TravelSpot::getName, travelRecordDto.getName())); + if (travelSpot == null) { + throw new CustomException("该景点不存在"); + } + + TravelRecord travelRecord = new TravelRecord(); + travelRecord.setTravelId(travelSpot.getId()); + BeanUtils.copyProperties(travelRecordDto, travelRecord); + travelRecordMapper.insert(travelRecord); + + insertTravelImage(travelRecord.getTravelId(), travelRecordDto.getImageList()); + insertTravelVideo(travelRecord.getTravelId(), travelRecordDto.getVideoList()); + return Boolean.TRUE; + } + + @Override + public Boolean updateTravelRecord(Long id, TravelRecordDto travelRecordDto) { + if (travelRecordMapper.selectById(id) == null) { + throw new CustomException("该记录不存在"); + } + + TravelRecord travelRecord = new TravelRecord(); + BeanUtils.copyProperties(travelRecordDto, travelRecord); + travelRecord.setId(id); + travelRecordMapper.updateById(travelRecord); + + deleteTravelImage(id); + deleteTravelVideo(id); + + insertTravelImage(id, travelRecordDto.getImageList()); + insertTravelVideo(id, travelRecordDto.getVideoList()); + return Boolean.TRUE; + } + + @Override + public Boolean deleteTravelRecord(Long id) { + travelRecordMapper.deleteById(id); + + return Boolean.TRUE; + } + + private void insertTravelImage(Long travelId, List imageList) { + if (!imageList.isEmpty()) { + travelDao.insertTravelImage(travelId, imageList); + } + } + + private void insertTravelVideo(Long travelId, List videoList) { + if (!videoList.isEmpty()) { + travelDao.insertTravelVideo(travelId, videoList); + } + } + + private void deleteTravelImage(Long id) { + travelImageMapper.delete(Wrappers.lambdaQuery(TravelImage.class).eq(TravelImage::getRecordId, id)); + } + + private void deleteTravelVideo(Long id) { + travelVideoMapper.delete(Wrappers.lambdaQuery(TravelVideo.class).eq(TravelVideo::getRecordId, id)); + } + + @Override + public TravelSpotDto queryTravelSpot(Long id) { + if (travelSpotMapper.selectById(id) == null) { + throw new CustomException("该景点不存在"); + } + + return travelDao.queryTravelSpot(id); + } + + @Override + public IPage queryTravelSummary(Integer currentPage, Integer pageSize, TravelQueryVo travelQueryVo) { + // 这里只能先对主表进行分页 然后在查询子表信息 + // 不能使用Left Join关联表查询,因为这里是一对多数据,关联查询会导致数据有重复 + // 从而导致page计算错误(会把重复的数据当成多条记录,实际上只有1条记录) + IPage travelSummaryPage = travelDao.queryTravelSummary(new Page<>(currentPage, pageSize), travelQueryVo); + List travelSummaryList = travelSummaryPage.getRecords(); + for (TravelSummaryDto travelSummary : travelSummaryList) { + travelSummary.setRecordList(travelDao.queryTravelRecordById(travelSummary.getId())); + } + + travelSummaryPage.setRecords(travelSummaryList); + return travelSummaryPage; + } + + @Override + public List queryTravelRecord(String startDate, String endDate) { + return travelDao.queryTravelRecord(startDate, endDate); + } + + @Override + public List queryTravelSpotName() { + return travelSpotMapper.selectList(null) + .stream().map(TravelSpot::getName).collect(Collectors.toList()); + } + + @Override + public List queryTravelCategory() { + return travelDao.queryTravelCategory(); + } + + @Override + public TravelStatsDto queryTravelStats() { + return travelDao.queryTravelStats(); + } +} diff --git a/home-service/src/main/java/com/cxx/home/vo/FoodQueryVo.java b/home-service/src/main/java/com/cxx/home/vo/FoodQueryVo.java new file mode 100644 index 0000000..e4f6bd8 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/vo/FoodQueryVo.java @@ -0,0 +1,13 @@ + +package com.cxx.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class FoodQueryVo { + @Schema(description = "美食类别") + private String category; +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/vo/JournalQueryVo.java b/home-service/src/main/java/com/cxx/home/vo/JournalQueryVo.java new file mode 100644 index 0000000..42c0d2a --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/vo/JournalQueryVo.java @@ -0,0 +1,15 @@ +package com.cxx.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class JournalQueryVo { + @Schema(description = "开始日期") + private String startDate; + + @Schema(description = "结束日期") + private String endDate; +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/vo/KpiQueryVo.java b/home-service/src/main/java/com/cxx/home/vo/KpiQueryVo.java new file mode 100644 index 0000000..b22848b --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/vo/KpiQueryVo.java @@ -0,0 +1,15 @@ +package com.cxx.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class KpiQueryVo { + @Schema(description = "开始日期") + private String startDate; + + @Schema(description = "结束日期") + private String endDate; +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/vo/ProductQueryVo.java b/home-service/src/main/java/com/cxx/home/vo/ProductQueryVo.java new file mode 100644 index 0000000..aa88cf8 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/vo/ProductQueryVo.java @@ -0,0 +1,16 @@ + +package com.cxx.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ProductQueryVo { + @Schema(description = "物品类别") + private String category; + + @Schema(description = "排序规则") + private String order; +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/vo/TravelQueryVo.java b/home-service/src/main/java/com/cxx/home/vo/TravelQueryVo.java new file mode 100644 index 0000000..f168739 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/vo/TravelQueryVo.java @@ -0,0 +1,13 @@ + +package com.cxx.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TravelQueryVo { + @Schema(description = "旅行类别") + private String category; +} \ No newline at end of file diff --git a/home-service/src/main/resources/application-dev.yml b/home-service/src/main/resources/application-dev.yml new file mode 100644 index 0000000..56c58fe --- /dev/null +++ b/home-service/src/main/resources/application-dev.yml @@ -0,0 +1,6 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: root + password: 123456 diff --git a/home-service/src/main/resources/application-docker.yml b/home-service/src/main/resources/application-docker.yml new file mode 100644 index 0000000..5a6d0ab --- /dev/null +++ b/home-service/src/main/resources/application-docker.yml @@ -0,0 +1,6 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://mysql:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: docker + password: 19940822Cxx diff --git a/home-service/src/main/resources/application-prod.yml b/home-service/src/main/resources/application-prod.yml new file mode 100644 index 0000000..42635cf --- /dev/null +++ b/home-service/src/main/resources/application-prod.yml @@ -0,0 +1,6 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/sweet_hut?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: cxx + password: 19940822Cxx@1213 \ No newline at end of file diff --git a/home-service/src/main/resources/application.yml b/home-service/src/main/resources/application.yml new file mode 100644 index 0000000..eeb4a86 --- /dev/null +++ b/home-service/src/main/resources/application.yml @@ -0,0 +1,36 @@ +server: + port: 8081 + +spring: + application: + name: @project.artifactId@ + version: @project.version@ + profiles: + active: dev + mail: + host: smtp.163.com + port: 465 + username: njcxx0822@163.com + password: CDfsF386Y2FWKHHm + protocol: smtps + properties: + mail: + smtp: + auth: true + starttls: + enable: true + default-encoding: UTF-8 + quartz: + job-store-type: jdbc + + +# mybatis plus mapper路径 +mybatis-plus: + # mybatis plus + mapper-locations: classpath*:/mapper/**/*.xml + configuration: + log-impl: + org.apache.ibatis.logging.stdout.StdOutImpl + +web-starter: + base-package: com.cxx.home \ No newline at end of file diff --git a/home-service/src/main/resources/mapper/AnniversaryMapper.xml b/home-service/src/main/resources/mapper/AnniversaryMapper.xml new file mode 100644 index 0000000..f84c702 --- /dev/null +++ b/home-service/src/main/resources/mapper/AnniversaryMapper.xml @@ -0,0 +1,41 @@ + + + + + + + diff --git a/home-service/src/main/resources/mapper/AssetMapper.xml b/home-service/src/main/resources/mapper/AssetMapper.xml new file mode 100644 index 0000000..7a7b14b --- /dev/null +++ b/home-service/src/main/resources/mapper/AssetMapper.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/home-service/src/main/resources/mapper/BillMapper.xml b/home-service/src/main/resources/mapper/BillMapper.xml new file mode 100644 index 0000000..abf2cd4 --- /dev/null +++ b/home-service/src/main/resources/mapper/BillMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO bill_image (bill_id, image_url) VALUES + + (#{billId}, #{item}) + + + + + + + + + + + diff --git a/home-service/src/main/resources/mapper/BudgetMapper.xml b/home-service/src/main/resources/mapper/BudgetMapper.xml new file mode 100644 index 0000000..802367d --- /dev/null +++ b/home-service/src/main/resources/mapper/BudgetMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/home-service/src/main/resources/mapper/FoodMapper.xml b/home-service/src/main/resources/mapper/FoodMapper.xml new file mode 100644 index 0000000..f681063 --- /dev/null +++ b/home-service/src/main/resources/mapper/FoodMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO food_material (id, food_id, type, name, amount) VALUES + + (#{item.id}, #{foodId}, #{item.type}, #{item.name}, #{item.amount}) + + + + + INSERT INTO food_step (id, food_id, sort, content, image_url) VALUES + + (#{item.id}, #{foodId}, #{item.sort}, #{item.content}, #{item.imageUrl}) + + + diff --git a/home-service/src/main/resources/mapper/JournalMapper.xml b/home-service/src/main/resources/mapper/JournalMapper.xml new file mode 100644 index 0000000..489d51f --- /dev/null +++ b/home-service/src/main/resources/mapper/JournalMapper.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/home-service/src/main/resources/mapper/KpiMapper.xml b/home-service/src/main/resources/mapper/KpiMapper.xml new file mode 100644 index 0000000..8c40553 --- /dev/null +++ b/home-service/src/main/resources/mapper/KpiMapper.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/home-service/src/main/resources/mapper/LedgerMapper.xml b/home-service/src/main/resources/mapper/LedgerMapper.xml new file mode 100644 index 0000000..c47fca7 --- /dev/null +++ b/home-service/src/main/resources/mapper/LedgerMapper.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/home-service/src/main/resources/mapper/PeriodMapper.xml b/home-service/src/main/resources/mapper/PeriodMapper.xml new file mode 100644 index 0000000..dd61010 --- /dev/null +++ b/home-service/src/main/resources/mapper/PeriodMapper.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/home-service/src/main/resources/mapper/PlanMapper.xml b/home-service/src/main/resources/mapper/PlanMapper.xml new file mode 100644 index 0000000..7df7ce2 --- /dev/null +++ b/home-service/src/main/resources/mapper/PlanMapper.xml @@ -0,0 +1,42 @@ + + + + + + + diff --git a/home-service/src/main/resources/mapper/ProductMapper.xml b/home-service/src/main/resources/mapper/ProductMapper.xml new file mode 100644 index 0000000..5062aae --- /dev/null +++ b/home-service/src/main/resources/mapper/ProductMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + diff --git a/home-service/src/main/resources/mapper/TravelMapper.xml b/home-service/src/main/resources/mapper/TravelMapper.xml new file mode 100644 index 0000000..2a300d3 --- /dev/null +++ b/home-service/src/main/resources/mapper/TravelMapper.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO travel_image (record_id, image_url) VALUES + + (#{recordId}, #{item}) + + + + + INSERT INTO travel_video (record_id, video_url) VALUES + + (#{recordId}, #{item}) + + + diff --git a/home-service/src/test/java/com/cxx/home/HomeServiceApplicationTests.java b/home-service/src/test/java/com/cxx/home/HomeServiceApplicationTests.java new file mode 100644 index 0000000..992f06d --- /dev/null +++ b/home-service/src/test/java/com/cxx/home/HomeServiceApplicationTests.java @@ -0,0 +1,11 @@ +package com.cxx.home; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +@Slf4j +public class HomeServiceApplicationTests { + +} + diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..8a8fb22 --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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 +# +# https://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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..1d8ab01 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..04bb870 --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + + + com.cxx + starter-parent + 2.0.0 + + + + sweet-hut-service + 2.0.0 + pom + + + 2.0.0 + + + + blog-service + home-service + admin-service + common + + + + + temp + file:///D:/temp/maven + + + diff --git a/sweet_hut.sql b/sweet_hut.sql new file mode 100644 index 0000000..390d863 --- /dev/null +++ b/sweet_hut.sql @@ -0,0 +1,625 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost + Source Server Type : MySQL + Source Server Version : 80027 + Source Host : localhost:3306 + Source Schema : sweet_hut + + Target Server Type : MySQL + Target Server Version : 80027 + File Encoding : 65001 + + Date: 16/02/2025 22:04:44 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for account +-- ---------------------------- +DROP TABLE IF EXISTS `account`; +CREATE TABLE `account` ( + `id` bigint NOT NULL, + `account_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码', + `user_id` bigint NULL DEFAULT NULL COMMENT '用户id', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '家庭账户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for bill_book +-- ---------------------------- +DROP TABLE IF EXISTS `bill_book`; +CREATE TABLE `bill_book` ( + `id` bigint NOT NULL, + `name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账本名称', + `icon` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账本图标', + `color` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标颜色', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '账本类型' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for bill_category +-- ---------------------------- +DROP TABLE IF EXISTS `bill_category`; +CREATE TABLE `bill_category` ( + `id` bigint NOT NULL, + `book_id` bigint NULL DEFAULT NULL COMMENT '账本id', + `name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单类别名称', + `type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单类型', + `icon` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单类别图标', + `color` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标颜色', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '账单类型' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for bill_image +-- ---------------------------- +DROP TABLE IF EXISTS `bill_image`; +CREATE TABLE `bill_image` ( + `bill_id` bigint NOT NULL COMMENT '账单id', + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '图片路径', + PRIMARY KEY (`bill_id`, `image_url`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '账单图片' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for bill_pay +-- ---------------------------- +DROP TABLE IF EXISTS `bill_pay`; +CREATE TABLE `bill_pay` ( + `id` bigint NOT NULL, + `name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账户名称', + `icon` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标', + `color` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '颜色', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '账单账户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for bill_record +-- ---------------------------- +DROP TABLE IF EXISTS `bill_record`; +CREATE TABLE `bill_record` ( + `id` bigint NOT NULL, + `book_id` bigint NULL DEFAULT NULL COMMENT '账本id', + `type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单类型 支出/收入', + `category_id` bigint NULL DEFAULT NULL COMMENT '账单类别id', + `location` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单地点', + `date` datetime NULL DEFAULT NULL COMMENT '账单日期', + `pay_id` bigint NULL DEFAULT NULL COMMENT '支付账户', + `amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '账单金额', + `content` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单内容', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账单备注', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '账单记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for blog +-- ---------------------------- +DROP TABLE IF EXISTS `blog`; +CREATE TABLE `blog` ( + `id` bigint NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '博客标题', + `top_value` int NULL DEFAULT NULL COMMENT '置顶值 越大越靠前', + `is_great` tinyint NULL DEFAULT NULL COMMENT '是否是精品 0否1是', + `category_id` bigint NULL DEFAULT NULL COMMENT '博客类别', + `summary` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '博客内容概要', + `content_id` bigint NULL DEFAULT NULL COMMENT '博客内容', + `word_count` int NULL DEFAULT NULL COMMENT '字数统计', + `read_duration` decimal(10, 2) NULL DEFAULT NULL COMMENT '阅读时长', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '发布时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '发布人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '博客记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for blog_category +-- ---------------------------- +DROP TABLE IF EXISTS `blog_category`; +CREATE TABLE `blog_category` ( + `id` bigint NOT NULL, + `name` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '类别名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '博客类别' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for blog_comment +-- ---------------------------- +DROP TABLE IF EXISTS `blog_comment`; +CREATE TABLE `blog_comment` ( + `id` bigint NOT NULL COMMENT 'id', + `parent_id` bigint NULL DEFAULT NULL COMMENT '父评论id', + `user_id` bigint NULL DEFAULT NULL COMMENT '评论人id', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '评论内容', + `create_time` datetime NULL DEFAULT NULL COMMENT '评论时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '博客评论' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for blog_content +-- ---------------------------- +DROP TABLE IF EXISTS `blog_content`; +CREATE TABLE `blog_content` ( + `id` bigint NOT NULL, + `content` mediumblob NULL COMMENT '博客内容', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '博客内容' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for blog_like +-- ---------------------------- +DROP TABLE IF EXISTS `blog_like`; +CREATE TABLE `blog_like` ( + `id` bigint NOT NULL COMMENT 'id', + `user_id` bigint NULL DEFAULT NULL COMMENT '点赞人', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '点赞类型(博客、评论)', + `target_id` bigint NULL DEFAULT NULL COMMENT '点赞目标的id', + `status` tinyint NULL DEFAULT NULL COMMENT '点赞状态 0取消点赞/1点赞', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '博客点赞' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for blog_visit +-- ---------------------------- +DROP TABLE IF EXISTS `blog_visit`; +CREATE TABLE `blog_visit` ( + `id` bigint NOT NULL, + `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'ip地址', + `os` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', + `browser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '浏览器', + `uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路径', + `blog_id` bigint NULL DEFAULT NULL COMMENT '博客id', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '博客访问记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for budget +-- ---------------------------- +DROP TABLE IF EXISTS `budget`; +CREATE TABLE `budget` ( + `id` bigint NOT NULL, + `category_id` bigint NULL DEFAULT NULL COMMENT '类别id', + `project` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '项目', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容', + `vendor` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '供应商', + `budget` decimal(10, 2) NULL DEFAULT NULL COMMENT '预算支出', + `actual` decimal(10, 2) NULL DEFAULT NULL COMMENT '实际支出', + `pay_time` datetime NULL DEFAULT NULL COMMENT '支付时间', + `remake` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '预算支出' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for budget_category +-- ---------------------------- +DROP TABLE IF EXISTS `budget_category`; +CREATE TABLE `budget_category` ( + `id` bigint NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类别名称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '预算支出' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for file_record +-- ---------------------------- +DROP TABLE IF EXISTS `file_record`; +CREATE TABLE `file_record` ( + `id` bigint NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件名称', + `md5` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件md5', + `path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件路径', + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '文件' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for food_material +-- ---------------------------- +DROP TABLE IF EXISTS `food_material`; +CREATE TABLE `food_material` ( + `id` bigint NOT NULL, + `food_id` bigint NULL DEFAULT NULL COMMENT '美食id', + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '类型', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '名称', + `amount` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '分量', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '美食食材' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for food_recipe +-- ---------------------------- +DROP TABLE IF EXISTS `food_recipe`; +CREATE TABLE `food_recipe` ( + `id` bigint NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '美食名称', + `category` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '美食菜系', + `recommend_rate` int NULL DEFAULT NULL COMMENT '推荐指数', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '美食记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for food_record +-- ---------------------------- +DROP TABLE IF EXISTS `food_record`; +CREATE TABLE `food_record` ( + `id` bigint NOT NULL, + `food_id` bigint NULL DEFAULT NULL COMMENT '美食id', + `date` date NULL DEFAULT NULL COMMENT '完成时间', + `person` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '完成人', + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片路径', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '美食成果' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for food_step +-- ---------------------------- +DROP TABLE IF EXISTS `food_step`; +CREATE TABLE `food_step` ( + `id` bigint NOT NULL, + `food_id` bigint NULL DEFAULT NULL COMMENT '美食id', + `sort` int NULL DEFAULT NULL COMMENT '顺序', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容', + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图片地址', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '美食步骤' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for home_account +-- ---------------------------- +DROP TABLE IF EXISTS `home_account`; +CREATE TABLE `home_account` ( + `id` bigint NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账户名', + `nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '家庭账户' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for plan +-- ---------------------------- +DROP TABLE IF EXISTS `plan`; +CREATE TABLE `plan` ( + `id` bigint NOT NULL, + `title` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标题', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容', + `date` date NULL DEFAULT NULL COMMENT '日期', + `start_time` time NULL DEFAULT NULL COMMENT '开始时间', + `end_time` time NULL DEFAULT NULL COMMENT '结束时间', + `alter_time` datetime NULL DEFAULT NULL COMMENT '提醒时间', + `task_id` bigint NULL DEFAULT NULL COMMENT '任务id', + `tag` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标签', + `is_top` tinyint NULL DEFAULT NULL COMMENT '是否置顶1是0否', + `priority` tinyint NULL DEFAULT NULL COMMENT '优先级 0高1中2低3正常', + `completed` tinyint NULL DEFAULT NULL COMMENT '是否完成1完成0未完成', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `update_by` datetime NULL DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '日程计划' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for property_record +-- ---------------------------- +DROP TABLE IF EXISTS `property_record`; +CREATE TABLE `property_record` ( + `id` int NOT NULL AUTO_INCREMENT, + `date` date NULL DEFAULT NULL, + `role` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `amount` int NULL DEFAULT NULL, + `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `BLOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CALENDAR_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CALENDAR` blob NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `CALENDAR_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `CRON_EXPRESSION` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TIME_ZONE_ID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `ENTRY_ID` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `INSTANCE_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `FIRED_TIME` bigint NOT NULL, + `SCHED_TIME` bigint NOT NULL, + `PRIORITY` int NOT NULL, + `STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `ENTRY_ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_DURABLE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_NONCONCURRENT` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `IS_UPDATE_DATA` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REQUESTS_RECOVERY` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `LOCK_NAME` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `LOCK_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_GROUP`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `INSTANCE_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `LAST_CHECKIN_TIME` bigint NOT NULL, + `CHECKIN_INTERVAL` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `INSTANCE_NAME`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `REPEAT_COUNT` bigint NOT NULL, + `REPEAT_INTERVAL` bigint NOT NULL, + `TIMES_TRIGGERED` bigint NOT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `STR_PROP_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STR_PROP_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `STR_PROP_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `INT_PROP_1` int NULL DEFAULT NULL, + `INT_PROP_2` int NULL DEFAULT NULL, + `LONG_PROP_1` bigint NULL DEFAULT NULL, + `LONG_PROP_2` bigint NULL DEFAULT NULL, + `DEC_PROP_1` decimal(13, 4) NULL DEFAULT NULL, + `DEC_PROP_2` decimal(13, 4) NULL DEFAULT NULL, + `BOOL_PROP_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `BOOL_PROP_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `SCHED_NAME` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `JOB_GROUP` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `DESCRIPTION` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `NEXT_FIRE_TIME` bigint NULL DEFAULT NULL, + `PREV_FIRE_TIME` bigint NULL DEFAULT NULL, + `PRIORITY` int NULL DEFAULT NULL, + `TRIGGER_STATE` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `TRIGGER_TYPE` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `START_TIME` bigint NOT NULL, + `END_TIME` bigint NULL DEFAULT NULL, + `CALENDAR_NAME` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + `MISFIRE_INSTR` smallint NULL DEFAULT NULL, + `JOB_DATA` blob NULL, + PRIMARY KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) USING BTREE, + INDEX `SCHED_NAME`(`SCHED_NAME` ASC, `JOB_NAME` ASC, `JOB_GROUP` ASC) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for task +-- ---------------------------- +DROP TABLE IF EXISTS `task`; +CREATE TABLE `task` ( + `id` bigint NOT NULL, + `type` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务类型', + `content` json NULL COMMENT '任务内容', + `execute_time` datetime NULL DEFAULT NULL COMMENT '执行时间', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '定时时间', + `is_scheduled` tinyint(1) NULL DEFAULT NULL COMMENT '是否执行', + `is_updated` tinyint(1) NULL DEFAULT NULL COMMENT '是否更新', + `is_deleted` tinyint(1) NULL DEFAULT NULL COMMENT '是否删除', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '任务' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for travel_image +-- ---------------------------- +DROP TABLE IF EXISTS `travel_image`; +CREATE TABLE `travel_image` ( + `record_id` bigint NOT NULL COMMENT '记录id', + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '图片路径', + PRIMARY KEY (`record_id`, `image_url`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '旅行记录图片' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for travel_record +-- ---------------------------- +DROP TABLE IF EXISTS `travel_record`; +CREATE TABLE `travel_record` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `travel_id` bigint NULL DEFAULT NULL, + `date` date NULL DEFAULT NULL, + `persons` json NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 643681849069638 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '旅行记录' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for travel_spot +-- ---------------------------- +DROP TABLE IF EXISTS `travel_spot`; +CREATE TABLE `travel_spot` ( + `id` bigint NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '景点名称', + `area` json NULL COMMENT '景点地区', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '景点地址', + `price` decimal(10, 2) NULL DEFAULT NULL COMMENT '景点价格', + `recommend_rate` int NULL DEFAULT NULL COMMENT '推荐指数', + `traffic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '交通', + `router` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '游戏路线', + `foods` json NULL COMMENT '美食推荐', + `projects` json NULL COMMENT '项目推荐', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '旅游景点' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Table structure for user +-- ---------------------------- +DROP TABLE IF EXISTS `user`; +CREATE TABLE `user` ( + `id` bigint NOT NULL, + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名', + `gender` tinyint NULL DEFAULT NULL COMMENT '性别', + `id_number` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '身份证号', + `phone_number` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号', + `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `birth_date` date NULL DEFAULT NULL COMMENT '生日', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像', + `create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新人', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC; + +SET FOREIGN_KEY_CHECKS = 1;