From 9b6a8ed49fedd9ea931bd923ad05efcea6bf3bc9 Mon Sep 17 00:00:00 2001 From: aiShuiJiaoDeXioShou <2832294398@qq.com> Date: Thu, 12 Sep 2024 03:55:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- acdr-admin/pom.xml | 1 + acdr-admin/yskj-module-acdr/pom.xml | 26 ++ .../yskj-module-acdr-api/pom.xml | 33 +++ .../module/acdr/enums/ErrorCodeConstants.java | 60 +++++ .../yskj/linghe/module/acdr/package-info.java | 1 + .../yskj-module-acdr-biz/pom.xml | 74 ++++++ .../module/bpm/enums/ErrorCodeConstants.java | 2 + .../product/enums/ErrorCodeConstants.java | 2 + acdr-admin/yskj-server/pom.xml | 7 + .../src/main/resources/application.yaml | 2 +- acdr-admin/yskj-ui/yskj-ui-admin-vue3/.env | 2 +- .../api/acdr/petexpertcertification/index.ts | 45 ++++ .../PetExpertCertificationForm.vue | 116 +++++++++ .../acdr/petexpertcertification/index.vue | 233 ++++++++++++++++++ acdr-ui/src/pages.json | 8 + acdr-ui/src/types/uni-pages.d.ts | 1 + acdr-ui/tootls/example.png | Bin 31269 -> 0 bytes acdr-ui/tootls/imgtools.py | 150 ----------- acdr-ui/tootls/tools.py | 202 --------------- .../master/address/entity/ChinaAddress.java | 11 +- .../acdr/master/chat/entity/ChatMessage.java | 7 +- .../yskj/acdr/master/common/ExtendEntity.java | 39 +++ .../controller/CommunityController.java | 12 +- .../master/community/entity/Comments.java | 9 +- .../master/community/entity/Favorites.java | 6 +- .../acdr/master/community/entity/Follows.java | 6 +- .../acdr/master/community/entity/Likes.java | 61 ++--- .../acdr/master/community/entity/Photos.java | 6 +- .../acdr/master/community/entity/Posts.java | 9 +- .../acdr/master/config/entity/Config.java | 9 +- .../yskj/acdr/master/file/entity/FileMap.java | 11 +- .../mall/controller/MallController.java | 16 +- .../acdr/master/mall/entity/CartItems.java | 9 +- .../acdr/master/mall/entity/OrderItems.java | 6 +- .../yskj/acdr/master/mall/entity/Orders.java | 9 +- .../acdr/master/mall/entity/Products.java | 9 +- .../acdr/master/mall/entity/StoreTypes.java | 3 +- .../yskj/acdr/master/mall/entity/Stores.java | 9 +- .../notifications/entity/Notifications.java | 11 +- .../entity/NotificationsUser.java | 3 +- .../yskj/acdr/master/order/entity/Order.java | 13 +- .../acdr/master/order/entity/PayInfo.java | 7 +- .../yskj/acdr/master/order/entity/QrCode.java | 4 +- .../personal/entity/PersonalService.java | 11 +- .../master/personal/entity/ServiceName.java | 11 +- .../master/pet/entity/ExpandLocOrderInfo.java | 4 +- .../pet/entity/PetExpertCertification.java | 9 +- .../yskj/acdr/master/pet/entity/PetInfo.java | 12 +- .../pet/entity/PetSpecialistCertificate.java | 11 +- .../user/controller/UserController.java | 4 +- .../user/entity/UserIdentityVerification.java | 11 +- .../yskj/acdr/master/user/entity/Users.java | 42 ++-- .../user/service/impl/UsersServiceImpl.java | 24 +- acdr/src/main/resources/application-devp.yml | 4 + .../main/resources/application-production.yml | 4 + 55 files changed, 789 insertions(+), 608 deletions(-) create mode 100644 acdr-admin/yskj-module-acdr/pom.xml create mode 100644 acdr-admin/yskj-module-acdr/yskj-module-acdr-api/pom.xml create mode 100644 acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/enums/ErrorCodeConstants.java create mode 100644 acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/package-info.java create mode 100644 acdr-admin/yskj-module-acdr/yskj-module-acdr-biz/pom.xml create mode 100644 acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/api/acdr/petexpertcertification/index.ts create mode 100644 acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/PetExpertCertificationForm.vue create mode 100644 acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/index.vue delete mode 100644 acdr-ui/tootls/example.png delete mode 100644 acdr-ui/tootls/imgtools.py delete mode 100644 acdr-ui/tootls/tools.py create mode 100644 acdr/src/main/java/com/yskj/acdr/master/common/ExtendEntity.java diff --git a/acdr-admin/pom.xml b/acdr-admin/pom.xml index 917fdbb5..6e1c1f8a 100644 --- a/acdr-admin/pom.xml +++ b/acdr-admin/pom.xml @@ -24,6 +24,7 @@ yskj-module-crm + yskj-module-acdr ${project.artifactId} diff --git a/acdr-admin/yskj-module-acdr/pom.xml b/acdr-admin/yskj-module-acdr/pom.xml new file mode 100644 index 00000000..e7266541 --- /dev/null +++ b/acdr-admin/yskj-module-acdr/pom.xml @@ -0,0 +1,26 @@ + + + + cn.yskj.dev + yskj + ${revision} + + 4.0.0 + + yskj-module-acdr-api + yskj-module-acdr-biz + + pom + yskj-module-acdr + + ${project.artifactId} + + ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维脑图等功能。 + 目前已接入各种模型,不限于: + 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek + 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno + + + diff --git a/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/pom.xml b/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/pom.xml new file mode 100644 index 00000000..aa61a9e1 --- /dev/null +++ b/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/pom.xml @@ -0,0 +1,33 @@ + + + + cn.yskj.dev + yskj-module-acdr + ${revision} + + 4.0.0 + yskj-module-acdr-api + jar + + ${project.artifactId} + + ai 模块 API,暴露给其它模块调用 + + + + + cn.yskj.dev + yskj-common + + + + + org.springframework.boot + spring-boot-starter-validation + true + + + + diff --git a/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/enums/ErrorCodeConstants.java b/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/enums/ErrorCodeConstants.java new file mode 100644 index 00000000..d2d958d8 --- /dev/null +++ b/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/enums/ErrorCodeConstants.java @@ -0,0 +1,60 @@ +package cn.yskj.linghe.module.acdr.enums; + +import cn.yskj.linghe.framework.common.exception.ErrorCode; + +/** + * Product 错误码枚举类 + * + * product 系统,使用 1-008-000-000 段 + */ +public interface ErrorCodeConstants { + + // ========== 商品分类相关 1-008-001-000 ============ + ErrorCode CATEGORY_NOT_EXISTS = new ErrorCode(1_008_001_000, "商品分类不存在"); + ErrorCode CATEGORY_PARENT_NOT_EXISTS = new ErrorCode(1_008_001_001, "父分类不存在"); + ErrorCode CATEGORY_PARENT_NOT_FIRST_LEVEL = new ErrorCode(1_008_001_002, "父分类不能是二级分类"); + ErrorCode CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_008_001_003, "存在子分类,无法删除"); + ErrorCode CATEGORY_DISABLED = new ErrorCode(1_008_001_004, "商品分类({})已禁用,无法使用"); + ErrorCode CATEGORY_HAVE_BIND_SPU = new ErrorCode(1_008_001_005, "类别下存在商品,无法删除"); + + // ========== 商品品牌相关编号 1-008-002-000 ========== + ErrorCode BRAND_NOT_EXISTS = new ErrorCode(1_008_002_000, "品牌不存在"); + ErrorCode BRAND_DISABLED = new ErrorCode(1_008_002_001, "品牌已禁用"); + ErrorCode BRAND_NAME_EXISTS = new ErrorCode(1_008_002_002, "品牌名称已存在"); + + // ========== 商品属性项 1-008-003-000 ========== + ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1_008_003_000, "属性项不存在"); + ErrorCode PROPERTY_EXISTS = new ErrorCode(1_008_003_001, "属性项的名称已存在"); + ErrorCode PROPERTY_DELETE_FAIL_VALUE_EXISTS = new ErrorCode(1_008_003_002, "属性项下存在属性值,无法删除"); + + // ========== 商品属性值 1-008-004-000 ========== + ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1_008_004_000, "属性值不存在"); + ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1_008_004_001, "属性值的名称已存在"); + + // ========== 商品 SPU 1-008-005-000 ========== + ErrorCode SPU_NOT_EXISTS = new ErrorCode(1_008_005_000, "商品 SPU 不存在"); + ErrorCode SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR = new ErrorCode(1_008_005_001, "商品分类不正确,原因:必须使用第二级的商品分类及以下"); + ErrorCode SPU_SAVE_FAIL_COUPON_TEMPLATE_NOT_EXISTS = new ErrorCode(1_008_005_002, "商品 SPU 保存失败,原因:优惠卷不存在"); + ErrorCode SPU_NOT_ENABLE = new ErrorCode(1_008_005_003, "商品 SPU【{}】不处于上架状态"); + ErrorCode SPU_NOT_RECYCLE = new ErrorCode(1_008_005_004, "商品 SPU 不处于回收站状态"); + + // ========== 商品 SKU 1-008-006-000 ========== + ErrorCode SKU_NOT_EXISTS = new ErrorCode(1_008_006_000, "商品 SKU 不存在"); + ErrorCode SKU_PROPERTIES_DUPLICATED = new ErrorCode(1_008_006_001, "商品 SKU 的属性组合存在重复"); + ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1_008_006_002, "一个 SPU 下的每个 SKU,其属性项必须一致"); + ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1_008_006_003, "一个 SPU 下的每个 SKU,必须不重复"); + ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1_008_006_004, "商品 SKU 库存不足"); + + // ========== 商品 评价 1-008-007-000 ========== + ErrorCode COMMENT_NOT_EXISTS = new ErrorCode(1_008_007_000, "商品评价不存在"); + ErrorCode COMMENT_ORDER_EXISTS = new ErrorCode(1_008_007_001, "订单的商品评价已存在"); + + // ========== 商品 收藏 1-008-008-000 ========== + ErrorCode FAVORITE_EXISTS = new ErrorCode(1_008_008_000, "该商品已经被收藏"); + ErrorCode FAVORITE_NOT_EXISTS = new ErrorCode(1_008_008_001, "商品收藏不存在"); + + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_008_009_000, "宠物配置文件不存在"); + + ErrorCode PET_EXPERT_CERTIFICATION_NOT_EXISTS = new ErrorCode(1_008_009_001, "宠托师审核不存在"); + +} diff --git a/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/package-info.java b/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/package-info.java new file mode 100644 index 00000000..b9b0198c --- /dev/null +++ b/acdr-admin/yskj-module-acdr/yskj-module-acdr-api/src/main/java/cn/yskj/linghe/module/acdr/package-info.java @@ -0,0 +1 @@ +package cn.yskj.linghe.module.acdr; diff --git a/acdr-admin/yskj-module-acdr/yskj-module-acdr-biz/pom.xml b/acdr-admin/yskj-module-acdr/yskj-module-acdr-biz/pom.xml new file mode 100644 index 00000000..290d3c35 --- /dev/null +++ b/acdr-admin/yskj-module-acdr/yskj-module-acdr-biz/pom.xml @@ -0,0 +1,74 @@ + + + + cn.yskj.dev + yskj-module-acdr + ${revision} + + 4.0.0 + yskj-module-acdr-biz + + ${project.artifactId} + + ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维脑图等功能。 + 目前已接入各种模型,不限于: + 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek + 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno + + + + + cn.yskj.dev + yskj-module-acdr-api + ${revision} + + + + + cn.yskj.dev + yskj-spring-boot-starter-web + + + + org.projectlombok + lombok + provided + + + + cn.yskj.dev + yskj-spring-boot-starter-biz-tenant + + + + + cn.yskj.dev + yskj-spring-boot-starter-security + + + + + cn.yskj.dev + yskj-spring-boot-starter-mybatis + + + + + cn.yskj.dev + yskj-spring-boot-starter-job + + + + + cn.yskj.dev + yskj-spring-boot-starter-test + + + + cn.yskj.dev + yskj-spring-boot-starter-excel + + + diff --git a/acdr-admin/yskj-module-bpm/yskj-module-bpm-api/src/main/java/cn/yskj/linghe/module/bpm/enums/ErrorCodeConstants.java b/acdr-admin/yskj-module-bpm/yskj-module-bpm-api/src/main/java/cn/yskj/linghe/module/bpm/enums/ErrorCodeConstants.java index acd5dcd2..8d843488 100644 --- a/acdr-admin/yskj-module-bpm/yskj-module-bpm-api/src/main/java/cn/yskj/linghe/module/bpm/enums/ErrorCodeConstants.java +++ b/acdr-admin/yskj-module-bpm/yskj-module-bpm-api/src/main/java/cn/yskj/linghe/module/bpm/enums/ErrorCodeConstants.java @@ -75,4 +75,6 @@ public interface ErrorCodeConstants { // ========== BPM 流程表达式 1-009-014-000 ========== ErrorCode PROCESS_EXPRESSION_NOT_EXISTS = new ErrorCode(1_009_014_000, "流程表达式不存在"); + ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_009_015_000, "宠物配置文件不存在"); + } diff --git a/acdr-admin/yskj-module-mall/yskj-module-product-api/src/main/java/cn/yskj/linghe/module/product/enums/ErrorCodeConstants.java b/acdr-admin/yskj-module-mall/yskj-module-product-api/src/main/java/cn/yskj/linghe/module/product/enums/ErrorCodeConstants.java index 4e7c3441..642861d2 100644 --- a/acdr-admin/yskj-module-mall/yskj-module-product-api/src/main/java/cn/yskj/linghe/module/product/enums/ErrorCodeConstants.java +++ b/acdr-admin/yskj-module-mall/yskj-module-product-api/src/main/java/cn/yskj/linghe/module/product/enums/ErrorCodeConstants.java @@ -1,5 +1,7 @@ package cn.yskj.linghe.module.product.enums; + + import cn.yskj.linghe.framework.common.exception.ErrorCode; /** diff --git a/acdr-admin/yskj-server/pom.xml b/acdr-admin/yskj-server/pom.xml index 0d3871c3..42d6be9b 100644 --- a/acdr-admin/yskj-server/pom.xml +++ b/acdr-admin/yskj-server/pom.xml @@ -121,6 +121,13 @@ yskj-spring-boot-starter-protection + + + cn.yskj.dev + yskj-module-acdr-biz + ${revision} + + diff --git a/acdr-admin/yskj-server/src/main/resources/application.yaml b/acdr-admin/yskj-server/src/main/resources/application.yaml index 01e156d2..6240e756 100644 --- a/acdr-admin/yskj-server/src/main/resources/application.yaml +++ b/acdr-admin/yskj-server/src/main/resources/application.yaml @@ -239,7 +239,7 @@ yskj: db-schemas: ${spring.datasource.dynamic.datasource.master.name} front-type: 10 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 tenant: # 多租户相关配置项 - enable: true + enable: false ignore-urls: - /admin-api/system/tenant/get-id-by-name # 基于名字获取租户,不许带租户编号 - /admin-api/system/tenant/get-by-website # 基于域名获取租户,不许带租户编号 diff --git a/acdr-admin/yskj-ui/yskj-ui-admin-vue3/.env b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/.env index 3ae9bc77..7c22ae50 100644 --- a/acdr-admin/yskj-ui/yskj-ui-admin-vue3/.env +++ b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/.env @@ -8,7 +8,7 @@ VITE_PORT=80 VITE_OPEN=true # 租户开关 -VITE_APP_TENANT_ENABLE=true +VITE_APP_TENANT_ENABLE=false # 验证码的开关 VITE_APP_CAPTCHA_ENABLE=true diff --git a/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/api/acdr/petexpertcertification/index.ts b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/api/acdr/petexpertcertification/index.ts new file mode 100644 index 00000000..e9b3f83d --- /dev/null +++ b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/api/acdr/petexpertcertification/index.ts @@ -0,0 +1,45 @@ +import request from '@/config/axios' + +// 宠托师审核 VO +export interface PetExpertCertificationVO { + id: number // ID + content: string // 审核内容 + type: string // 申请职务 + imageUrls: string // 审核材料 + state: number // 审核状态 + verifyAdminId: number // 审核管理员 + userId: number // 创建人 +} + +// 宠托师审核 API +export const PetExpertCertificationApi = { + // 查询宠托师审核分页 + getPetExpertCertificationPage: async (params: any) => { + return await request.get({ url: `/acdr/pet-expert-certification/page`, params }) + }, + + // 查询宠托师审核详情 + getPetExpertCertification: async (id: number) => { + return await request.get({ url: `/acdr/pet-expert-certification/get?id=` + id }) + }, + + // 新增宠托师审核 + createPetExpertCertification: async (data: PetExpertCertificationVO) => { + return await request.post({ url: `/acdr/pet-expert-certification/create`, data }) + }, + + // 修改宠托师审核 + updatePetExpertCertification: async (data: PetExpertCertificationVO) => { + return await request.put({ url: `/acdr/pet-expert-certification/update`, data }) + }, + + // 删除宠托师审核 + deletePetExpertCertification: async (id: number) => { + return await request.delete({ url: `/acdr/pet-expert-certification/delete?id=` + id }) + }, + + // 导出宠托师审核 Excel + exportPetExpertCertification: async (params) => { + return await request.download({ url: `/acdr/pet-expert-certification/export-excel`, params }) + }, +} \ No newline at end of file diff --git a/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/PetExpertCertificationForm.vue b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/PetExpertCertificationForm.vue new file mode 100644 index 00000000..6897fade --- /dev/null +++ b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/PetExpertCertificationForm.vue @@ -0,0 +1,116 @@ + + \ No newline at end of file diff --git a/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/index.vue b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/index.vue new file mode 100644 index 00000000..ce412627 --- /dev/null +++ b/acdr-admin/yskj-ui/yskj-ui-admin-vue3/src/views/acdr/petexpertcertification/index.vue @@ -0,0 +1,233 @@ + + + \ No newline at end of file diff --git a/acdr-ui/src/pages.json b/acdr-ui/src/pages.json index 5010783b..e390e69e 100644 --- a/acdr-ui/src/pages.json +++ b/acdr-ui/src/pages.json @@ -117,6 +117,14 @@ "navigationBarTitleText": "消息列表" } }, + { + "path": "pages/message/privatechat", + "type": "page", + "layout": "default", + "style": { + "navigationBarTitleText": "聊天" + } + }, { "path": "pages/my/index", "type": "page", diff --git a/acdr-ui/src/types/uni-pages.d.ts b/acdr-ui/src/types/uni-pages.d.ts index e4e403cd..cf4be47d 100644 --- a/acdr-ui/src/types/uni-pages.d.ts +++ b/acdr-ui/src/types/uni-pages.d.ts @@ -17,6 +17,7 @@ interface NavigateToOptions { "/pages/message/chat" | "/pages/message/index" | "/pages/message/message-list" | + "/pages/message/privatechat" | "/pages/my/index" | "/pages/order/index" | "/pages/order/order-detail" | diff --git a/acdr-ui/tootls/example.png b/acdr-ui/tootls/example.png deleted file mode 100644 index 069683d2778a3e1fd9389d1a572b31d403924cc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31269 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¬W|!HiF|XXEoqQ5PY0=!1yD3g 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 diff --git a/acdr-ui/tootls/imgtools.py b/acdr-ui/tootls/imgtools.py deleted file mode 100644 index 5c004d54..00000000 --- a/acdr-ui/tootls/imgtools.py +++ /dev/null @@ -1,150 +0,0 @@ -import os -import cv2 -import numpy as np -import re -from tkinter import * -from tkinter import filedialog, messagebox, colorchooser -from PIL import Image -import tkinter as tk - -# 主应用类 -class ImageSplitterApp: - def __init__(self, root): - self.root = root - self.root.title("图像分割工具") - self.root.geometry("500x450") - - # 文件或文件夹路径 - self.file_path = None - self.folder_path = None - self.selected_color = (0, 0, 0) # 默认黑色 - - # 创建选择文件按钮 - Button(self.root, text="选择单个文件", command=self.select_file).pack(pady=10) - Button(self.root, text="选择文件夹", command=self.select_folder).pack(pady=10) - - # 选择颜色按钮 - Label(self.root, text="选择分割线颜色:").pack(pady=10) - Button(self.root, text="打开取色器", command=self.pick_color).pack(pady=5) - - # 当前选择的颜色显示 - self.color_label = Label(self.root, text=f"当前颜色: {self.selected_color}") - self.color_label.pack(pady=5) - - # 命名规则 - Label(self.root, text="请输入保存图片的命名规则(支持正则):").pack(pady=10) - self.naming_entry = Entry(self.root) - self.naming_entry.insert(0, r"sub_image_{idx}") # 默认命名规则 - self.naming_entry.pack(pady=5) - - # 分割按钮 - Button(self.root, text="开始分割", command=self.split_image).pack(pady=20) - - # 选择保存文件夹 - self.save_folder_path = None - Button(self.root, text="选择保存文件夹", command=self.select_save_folder).pack(pady=10) - - def select_file(self): - self.file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png *.jpg *.jpeg")]) - if self.file_path: - messagebox.showinfo("文件选择", f"已选择文件: {self.file_path}") - - def select_folder(self): - self.folder_path = filedialog.askdirectory() - if self.folder_path: - messagebox.showinfo("文件夹选择", f"已选择文件夹: {self.folder_path}") - - def select_save_folder(self): - self.save_folder_path = filedialog.askdirectory() - if self.save_folder_path: - messagebox.showinfo("保存文件夹选择", f"已选择保存文件夹: {self.save_folder_path}") - - # 颜色取色器 - def pick_color(self): - color = colorchooser.askcolor(title="选择分割线颜色") - if color: - self.selected_color = tuple(map(int, color[0])) # 颜色转换为整数的 (r, g, b) - self.color_label.config(text=f"当前颜色: {self.selected_color}") - - # 查找分割线的位置 (通过指定颜色) - def find_dividing_lines(self, image, line_color): - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将图像转换为灰度图 - _, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV) # 进行二值化 - - # 查找水平和垂直线条 - horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 1)) - vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 25)) - - # 水平线 - horizontal_lines = cv2.morphologyEx(binary, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) - - # 垂直线 - vertical_lines = cv2.morphologyEx(binary, cv2.MORPH_OPEN, vertical_kernel, iterations=2) - - return horizontal_lines, vertical_lines - - # 分割图像 - def split_image(self): - # 提取颜色 - line_color = self.selected_color - - # 读取命名规则 - naming_rule = self.naming_entry.get() - - # 处理单个文件 - if self.file_path: - self.process_file(self.file_path, line_color, naming_rule) - - # 处理文件夹中的所有文件 - if self.folder_path: - for file_name in os.listdir(self.folder_path): - if file_name.endswith(('.png', '.jpg', '.jpeg')): - file_path = os.path.join(self.folder_path, file_name) - self.process_file(file_path, line_color, naming_rule) - - # 处理单个文件的分割 - def process_file(self, file_path, line_color, naming_rule): - image = cv2.imread(file_path) - if image is None: - messagebox.showerror("错误", f"无法加载图像: {file_path}") - return - - horizontal_lines, vertical_lines = self.find_dividing_lines(image, line_color) - sub_images = self.split_image_by_lines(image, horizontal_lines, vertical_lines) - - # 保存分割后的图像 - self.save_sub_images(sub_images, naming_rule) - - # 根据分割线分割图像 - def split_image_by_lines(self, image, horizontal_lines, vertical_lines): - horizontal_coords = np.where(np.any(horizontal_lines > 0, axis=1))[0] - vertical_coords = np.where(np.any(vertical_lines > 0, axis=0))[0] - - sub_images = [] - for i in range(len(horizontal_coords) - 1): - for j in range(len(vertical_coords) - 1): - x1, x2 = vertical_coords[j], vertical_coords[j + 1] - y1, y2 = horizontal_coords[i], horizontal_coords[i + 1] - sub_image = image[y1:y2, x1:x2] - sub_images.append(sub_image) - - return sub_images - - # 保存分割后的图像,支持正则命名规则 - def save_sub_images(self, sub_images, naming_rule): - if not self.save_folder_path: - messagebox.showerror("错误", "请先选择保存文件夹") - return - - for idx, img in enumerate(sub_images): - filename = re.sub(r'{idx}', str(idx), naming_rule) # 使用正则表达式进行命名 - save_path = os.path.join(self.save_folder_path, f"{filename}.png") - cv2.imwrite(save_path, img) - - messagebox.showinfo("完成", f"图像已分割并保存到 {self.save_folder_path}") - -# 运行图形界面应用 -if __name__ == "__main__": - root = tk.Tk() - app = ImageSplitterApp(root) - root.mainloop() diff --git a/acdr-ui/tootls/tools.py b/acdr-ui/tootls/tools.py deleted file mode 100644 index 511ea7ef..00000000 --- a/acdr-ui/tootls/tools.py +++ /dev/null @@ -1,202 +0,0 @@ -import os -import tkinter as tk -from tkinter import filedialog, scrolledtext, ttk -from tkinter import Menu -from PIL import Image - -# 搜索指定关键字的函数 -def search_keyword_in_files(directory, keyword, output_text): - if not keyword: - output_text.insert(tk.END, "请输入要搜索的关键字。\n") - return - - for root, dirs, files in os.walk(directory): - for file in files: - if file.endswith(('.js', '.json', '.vue', '.ts', '.py', '.java', '.cpp')): - file_path = os.path.join(root, file) - try: - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - count = content.count(keyword) - if count > 0: - output_text.insert(tk.END, f"在 {file_path} 中找到 '{keyword}',共 {count} 次\n") - except Exception as e: - output_text.insert(tk.END, f"读取文件 {file_path} 出错: {e}\n") - output_text.insert(tk.END, "搜索完成。\n") - -# 找出不包含指定关键字的文件 -def find_files_without_keyword(directory, keyword, output_text): - if not keyword: - output_text.insert(tk.END, "请输入要搜索的关键字。\n") - return - - for root, dirs, files in os.walk(directory): - for file in files: - if file.endswith(('.js', '.json', '.vue', '.ts', '.py', '.java', '.cpp')): - file_path = os.path.join(root, file) - try: - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - if keyword not in content: - output_text.insert(tk.END, f"'{keyword}' 未在文件 {file_path} 中找到。\n") - except Exception as e: - output_text.insert(tk.END, f"读取文件 {file_path} 出错: {e}\n") - output_text.insert(tk.END, "查找未包含关键字的文件完成。\n") - -# 替换文件内容中的指定字符串 -def replace_in_files(directory, search_text, replace_text, output_text): - if not search_text or not replace_text: - output_text.insert(tk.END, "请输入要替换的文本和新文本。\n") - return - - for root, dirs, files in os.walk(directory): - for file in files: - if file.endswith(('.js', '.json', '.vue', '.ts', '.py', '.java', '.cpp')): - file_path = os.path.join(root, file) - try: - with open(file_path, 'r', encoding='utf-8') as f: - content = f.read() - if search_text in content: - new_content = content.replace(search_text, replace_text) - with open(file_path, 'w', encoding='utf-8') as f: - f.write(new_content) - output_text.insert(tk.END, f"在 {file_path} 中替换 '{search_text}' 为 '{replace_text}'\n") - except Exception as e: - output_text.insert(tk.END, f"处理文件 {file_path} 时出错: {e}\n") - output_text.insert(tk.END, "替换完成。\n") - -# 转换指定颜色为透明色的功能 -def convert_color_to_transparent(image_path, color, output_text): - img = Image.open(image_path) - img = img.convert("RGBA") - datas = img.getdata() - - newData = [] - for item in datas: - if item[0:3] == color: - newData.append((255, 255, 255, 0)) # 将指定颜色变为透明 - else: - newData.append(item) - - img.putdata(newData) - new_path = os.path.splitext(image_path)[0] + "_transparent.png" - img.save(new_path) - output_text.insert(tk.END, f"处理后的图片保存为 '{new_path}'\n") - -# 清空输出框的函数 -def clear_output(output_text): - output_text.delete(1.0, tk.END) - -# 添加右键菜单 -def add_right_click_menu(output_text): - menu = Menu(output_text, tearoff=0) - menu.add_command(label="清空输出", command=lambda: clear_output(output_text)) - - def show_menu(event): - menu.post(event.x_root, event.y_root) - - output_text.bind("", show_menu) - -# 创建GUI界面 -def create_gui(): - root = tk.Tk() - root.title("文件和图片处理工具") - root.geometry("800x500") - - notebook = ttk.Notebook(root) - notebook.pack(fill='both', expand=True) - - search_frame = ttk.Frame(notebook) - notebook.add(search_frame, text="搜索和替换") - image_frame = ttk.Frame(notebook) - notebook.add(image_frame, text="图片透明化") - note_frame = ttk.Frame(notebook) - notebook.add(note_frame, text="记事本") - - # 搜索和替换界面 - left_frame_search = ttk.Frame(search_frame) - left_frame_search.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10) - - keyword_entry = ttk.Entry(left_frame_search) - keyword_entry.pack(pady=5) - ttk.Label(left_frame_search, text="请输入要搜索的关键字:").pack(pady=5) - - search_button = ttk.Button(left_frame_search, text="搜索文件夹", - command=lambda: browse_directory_for_search(keyword_entry.get(), output_text_search)) - search_button.pack(pady=5) - - search_text_entry = ttk.Entry(left_frame_search) - search_text_entry.pack(pady=5) - ttk.Label(left_frame_search, text="请输入要替换的文本:").pack(pady=5) - - replace_text_entry = ttk.Entry(left_frame_search) - replace_text_entry.pack(pady=5) - ttk.Label(left_frame_search, text="请输入新文本:").pack(pady=5) - - replace_button = ttk.Button(left_frame_search, text="替换文件夹中的内容", - command=lambda: browse_directory_for_replace(search_text_entry.get(), replace_text_entry.get(), output_text_search)) - replace_button.pack(pady=5) - - search_missing_button = ttk.Button(left_frame_search, text="查找不包含关键字的文件", - command=lambda: browse_directory_for_missing(keyword_entry.get(), output_text_search)) - search_missing_button.pack(pady=5) - - output_text_search = scrolledtext.ScrolledText(search_frame, width=70) - output_text_search.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) - add_right_click_menu(output_text_search) # 为搜索输出框添加右键菜单 - - # 图像透明化界面 - color_entry = ttk.Entry(image_frame) - color_entry.pack(pady=5) - ttk.Label(image_frame, text="请输入要透明化的颜色 (r,g,b):").pack(pady=5) - - trans_button = ttk.Button(image_frame, text="使图片透明", - command=lambda: browse_image_for_transparency(tuple(map(int, color_entry.get().split(','))), output_text_image)) - trans_button.pack(pady=5) - - output_text_image = scrolledtext.ScrolledText(image_frame, width=70) - output_text_image.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) - add_right_click_menu(output_text_image) # 为图片处理输出框添加右键菜单 - - # 记事本界面 - note_text = scrolledtext.ScrolledText(note_frame, width=70) - note_text.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) - - save_button = ttk.Button(note_frame, text="保存记事本", command=lambda: save_notes(note_text)) - save_button.pack(pady=10) - - root.mainloop() - -# 辅助函数 -def browse_directory_for_search(keyword, output_text): - directory = filedialog.askdirectory() - if directory: - output_text.insert(tk.END, f"正在 {directory} 中搜索关键字: '{keyword}'\n") - search_keyword_in_files(directory, keyword, output_text) - -def browse_directory_for_replace(search_text, replace_text, output_text): - directory = filedialog.askdirectory() - if directory: - output_text.insert(tk.END, f"在 {directory} 中将 '{search_text}' 替换为 '{replace_text}'\n") - replace_in_files(directory, search_text, replace_text, output_text) - -def browse_directory_for_missing(keyword, output_text): - directory = filedialog.askdirectory() - if directory: - output_text.insert(tk.END, f"正在 {directory} 中查找未包含关键字 '{keyword}' 的文件。\n") - find_files_without_keyword(directory, keyword, output_text) - -def browse_image_for_transparency(color, output_text): - image_path = filedialog.askopenfilename() - if image_path: - convert_color_to_transparent(image_path, color, output_text) - -def save_notes(note_text): - file_path = filedialog.asksaveasfilename(defaultextension=".txt") - if file_path: - with open(file_path, 'w') as file: - file.write(note_text.get(1.0, tk.END)) - note_text.insert(tk.END, f"记事本已保存到 {file_path}\n") - -if __name__ == "__main__": - create_gui() diff --git a/acdr/src/main/java/com/yskj/acdr/master/address/entity/ChinaAddress.java b/acdr/src/main/java/com/yskj/acdr/master/address/entity/ChinaAddress.java index f68b64b5..25b9195a 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/address/entity/ChinaAddress.java +++ b/acdr/src/main/java/com/yskj/acdr/master/address/entity/ChinaAddress.java @@ -11,6 +11,7 @@ import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.yskj.acdr.common.verify.ValidPhone; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.Pattern; @@ -37,7 +38,7 @@ import jakarta.validation.constraints.Null; @TableName("acdr_china_address") @ApiModel(value = "ChinaAddress对象", description = "中国地址表") @JsonIgnoreProperties(ignoreUnknown = true) -public class ChinaAddress implements Serializable { +public class ChinaAddress extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -104,14 +105,6 @@ public class ChinaAddress implements Serializable { @TableField(value = "longitude") private Long longitude; - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @ApiModelProperty("是否为默认地址") @TableField("is_default") private Boolean isDefault; diff --git a/acdr/src/main/java/com/yskj/acdr/master/chat/entity/ChatMessage.java b/acdr/src/main/java/com/yskj/acdr/master/chat/entity/ChatMessage.java index bf5aab93..ce2d9944 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/chat/entity/ChatMessage.java +++ b/acdr/src/main/java/com/yskj/acdr/master/chat/entity/ChatMessage.java @@ -2,6 +2,7 @@ package com.yskj.acdr.master.chat.entity; import com.baomidou.mybatisplus.annotation.*; import com.yskj.acdr.master.chat.chatenum.ChatState; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -26,7 +27,7 @@ import java.time.LocalDateTime; @Accessors(chain = true) @TableName("acdr_chat_message") @ApiModel(value = "ChatMessage对象", description = "") -public class ChatMessage implements Serializable { +public class ChatMessage extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -46,10 +47,6 @@ public class ChatMessage implements Serializable { @TableField("be_user_id") private Long beUserId; - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - @ApiModelProperty("消息状态,0未读,1已读") @TableField(value = "state") private ChatState state; diff --git a/acdr/src/main/java/com/yskj/acdr/master/common/ExtendEntity.java b/acdr/src/main/java/com/yskj/acdr/master/common/ExtendEntity.java new file mode 100644 index 00000000..f9ef0419 --- /dev/null +++ b/acdr/src/main/java/com/yskj/acdr/master/common/ExtendEntity.java @@ -0,0 +1,39 @@ +package com.yskj.acdr.master.common; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.experimental.Accessors; +import org.apache.ibatis.type.JdbcType; + +import java.time.LocalDateTime; + +/** + * 这个类是一些公共字段的抽象类,比如创建时间、更新时间、逻辑删除等 + */ +@Data +@Accessors(chain = true) +@JsonIgnoreProperties(value = "transMap") +public class ExtendEntity { + + // 更新作者 + @TableField(fill = FieldFill.INSERT, jdbcType = JdbcType.VARCHAR) + private Long updater; + + // 创建作者 + @TableField(fill = FieldFill.INSERT_UPDATE, jdbcType = JdbcType.VARCHAR) + private Long creator; + + // 逻辑删除 + @TableLogic + private Boolean deleted; + + @TableField(value = "create_time", fill = FieldFill.INSERT) + private LocalDateTime createTime; + + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/controller/CommunityController.java b/acdr/src/main/java/com/yskj/acdr/master/community/controller/CommunityController.java index 346da9ae..4870b067 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/controller/CommunityController.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/controller/CommunityController.java @@ -74,7 +74,7 @@ public class CommunityController { @Transactional public GlobalResponse createPost(@Valid @RequestBody Posts post) { post.setUserId(StpUtil.getLoginIdAsLong()); - post.setCreatedTime(LocalDateTime.now()); + post.setCreateTime(LocalDateTime.now()); postsMapper.insert(post); for (String url : post.getImages()) { photosMapper.insert( @@ -207,7 +207,7 @@ public class CommunityController { } comment.setPostId(postId); comment.setUserId(StpUtil.getLoginIdAsLong()); - comment.setCreatedTime(LocalDateTime.now()); + comment.setCreateTime(LocalDateTime.now()); commentsMapper.insert(comment); return GlobalResponse.success(comment); } @@ -285,7 +285,7 @@ public class CommunityController { Follows follow = new Follows(); follow.setFollowerId(followerId); follow.setFollowingId(followingId); - follow.setCreatedTime(LocalDateTime.now()); + follow.setCreateTime(LocalDateTime.now()); followsMapper.insert(follow); return GlobalResponse.success("关注成功"); @@ -334,7 +334,7 @@ public class CommunityController { like.setUserId(userId); like.setPostId(postId); like.setCommentId(commentId); - like.setCreatedTime(LocalDateTime.now()); + like.setCreateTime(LocalDateTime.now()); likesMapper.insert(like); return GlobalResponse.success("点赞成功"); @@ -389,7 +389,7 @@ public class CommunityController { Favorites favorite = new Favorites(); favorite.setUserId(userId); favorite.setPostId(postId); - favorite.setCreatedTime(LocalDateTime.now()); + favorite.setCreateTime(LocalDateTime.now()); favoritesMapper.insert(favorite); return GlobalResponse.success("收藏成功"); @@ -470,7 +470,7 @@ public class CommunityController { // 设置图片所属的帖子ID和创建时间 photo.setPostId(postId); - photo.setCreatedTime(LocalDateTime.now()); + photo.setCreateTime(LocalDateTime.now()); // 将图片信息插入数据库 photosMapper.insert(photo); diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Comments.java b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Comments.java index 13caf95c..445160ad 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Comments.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Comments.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; @@ -33,7 +34,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_comments") @ApiModel(value = "Comments对象", description = "") -public class Comments implements Serializable { +public class Comments extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -52,12 +53,6 @@ public class Comments implements Serializable { @Size(min = 5, message = "评论内容不能少于五个字") private String content; - @TableField("created_time") - private LocalDateTime createdTime; - - @TableField("updated_time") - private LocalDateTime updatedTime; - @TableField("deleted_time") private LocalDateTime deletedTime; diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Favorites.java b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Favorites.java index 9ca3de34..f3c65885 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Favorites.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Favorites.java @@ -1,6 +1,7 @@ package com.yskj.acdr.master.community.entity; import com.baomidou.mybatisplus.annotation.*; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import lombok.Getter; import lombok.Setter; @@ -24,7 +25,7 @@ import java.time.LocalDateTime; @Accessors(chain = true) @TableName("acdr_favorites") @ApiModel(value = "Favorites对象", description = "") -public class Favorites implements Serializable { +public class Favorites extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -36,7 +37,4 @@ public class Favorites implements Serializable { @TableField("post_id") private Long postId; - - @TableField("created_time") - private LocalDateTime createdTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Follows.java b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Follows.java index b75b91d8..cb2a2c76 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Follows.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Follows.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotNull; @@ -30,7 +31,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_follows") @ApiModel(value = "Follows对象", description = "") -public class Follows implements Serializable { +public class Follows extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -44,7 +45,4 @@ public class Follows implements Serializable { @TableField("following_id") @NotNull(message = "被关注者ID不能为空") private Long followingId; - - @TableField("created_time") - private LocalDateTime createdTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Likes.java b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Likes.java index c3d5afbd..092837e5 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Likes.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Likes.java @@ -1,49 +1,42 @@ package com.yskj.acdr.master.community.entity; - import com.baomidou.mybatisplus.annotation.FieldFill; - import com.baomidou.mybatisplus.annotation.IdType; - import com.baomidou.mybatisplus.annotation.TableField; - import com.baomidou.mybatisplus.annotation.TableId; - import com.baomidou.mybatisplus.annotation.TableName; - import java.io.Serializable; - import java.time.LocalDateTime; - import io.swagger.annotations.ApiModel; - import io.swagger.annotations.ApiModelProperty; - import lombok.Getter; - import lombok.Setter; - import lombok.ToString; - import lombok.experimental.Accessors; +import com.baomidou.mybatisplus.annotation.*; +import com.yskj.acdr.master.common.ExtendEntity; +import io.swagger.annotations.ApiModel; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; /** -*

- * - *

-* -* @author 林河 -* @since 2024-08-12 -*/ - @Getter - @Setter - @ToString - @Accessors(chain = true) - @TableName("acdr_likes") - @ApiModel(value = "Likes对象", description = "") - public class Likes implements Serializable { + *

+ * + *

+ * + * @author 林河 + * @since 2024-08-12 + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("acdr_likes") +@ApiModel(value = "Likes对象", description = "") +public class Likes extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.AUTO) private Long id; - @TableField(value = "user_id", fill = FieldFill.INSERT) + @TableField(value = "user_id", fill = FieldFill.INSERT) private Long userId; - @TableField("post_id") + @TableField("post_id") private Long postId; - @TableField("comment_id") + @TableField("comment_id") private Long commentId; - - @TableField("created_time") - private LocalDateTime createdTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Photos.java b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Photos.java index 6dee5eca..0c74addd 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Photos.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Photos.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; @@ -32,7 +33,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_photos") @ApiModel(value = "Photos对象", description = "照片实体") -public class Photos implements Serializable { +public class Photos extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -47,8 +48,5 @@ public class Photos implements Serializable { @Size(max = 255, message = "图片URL不能超过255个字符") @TableField("photo_url") private String photoUrl; - - @TableField("created_time") - private LocalDateTime createdTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Posts.java b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Posts.java index f880f524..7d8ff817 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/community/entity/Posts.java +++ b/acdr/src/main/java/com/yskj/acdr/master/community/entity/Posts.java @@ -10,6 +10,7 @@ import java.io.Serializable; import java.time.LocalDateTime; import java.util.List; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; @@ -34,7 +35,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_posts") @ApiModel(value = "Posts对象", description = "帖子实体") -public class Posts implements Serializable { +public class Posts extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -66,12 +67,6 @@ public class Posts implements Serializable { @TableField("is_public") private Boolean isPublic; - @TableField("created_time") - private LocalDateTime createdTime; - - @TableField("updated_time") - private LocalDateTime updatedTime; - @TableField("deleted_at") private LocalDateTime deletedAt; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/config/entity/Config.java b/acdr/src/main/java/com/yskj/acdr/master/config/entity/Config.java index 30af0651..f9976605 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/config/entity/Config.java +++ b/acdr/src/main/java/com/yskj/acdr/master/config/entity/Config.java @@ -1,16 +1,16 @@ package com.yskj.acdr.master.config.entity; -import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -30,10 +30,13 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_config") @ApiModel(value = "Config对象") -public class Config implements Serializable { +public class Config extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; + @TableId + private Long id; + @ApiModelProperty("配置表key") @NotBlank(message = "key 不能为空") private String key; diff --git a/acdr/src/main/java/com/yskj/acdr/master/file/entity/FileMap.java b/acdr/src/main/java/com/yskj/acdr/master/file/entity/FileMap.java index 8564eba2..8f4a63e1 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/file/entity/FileMap.java +++ b/acdr/src/main/java/com/yskj/acdr/master/file/entity/FileMap.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.*; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; @@ -27,7 +28,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_file_map") @ApiModel(value = "FileMap对象", description = "") -public class FileMap implements Serializable { +public class FileMap extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -57,14 +58,6 @@ public class FileMap implements Serializable { @TableField("is_web") private Boolean isWeb; - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @ApiModelProperty("上传用户") @TableField(value = "user_id") private long userId; diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/controller/MallController.java b/acdr/src/main/java/com/yskj/acdr/master/mall/controller/MallController.java index ba39c990..7a9e72f8 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/controller/MallController.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/controller/MallController.java @@ -41,8 +41,8 @@ public class MallController { @PostMapping("/stores") public GlobalResponse createStores(@RequestBody Stores store) { try { - store.setCreatedTime(LocalDateTime.now()); - store.setUpdatedTime(LocalDateTime.now()); + store.setCreateTime(LocalDateTime.now()); + store.setUpdateTime(LocalDateTime.now()); storeMapper.insert(store); return GlobalResponse.success(store); } catch (Exception e) { @@ -74,8 +74,8 @@ public class MallController { @PostMapping("/products") public GlobalResponse addProducts(@RequestBody Products product) { try { - product.setCreatedTime(LocalDateTime.now()); - product.setUpdatedTime(LocalDateTime.now()); + product.setCreateTime(LocalDateTime.now()); + product.setUpdateTime(LocalDateTime.now()); productMapper.insert(product); return GlobalResponse.success(product); } catch (Exception e) { @@ -109,8 +109,8 @@ public class MallController { @Transactional(rollbackFor = Exception.class) public GlobalResponse createOrders(@RequestBody Orders order) { try { - order.setCreatedTime(LocalDateTime.now()); - order.setUpdatedTime(LocalDateTime.now()); + order.setCreateTime(LocalDateTime.now()); + order.setUpdateTime(LocalDateTime.now()); orderMapper.insert(order); return GlobalResponse.success(order); } catch (Exception e) { @@ -147,8 +147,8 @@ public class MallController { @PostMapping("/cart") public GlobalResponse addToCart(@RequestBody CartItems cartItem) { try { - cartItem.setCreatedTime(LocalDateTime.now()); - cartItem.setUpdatedTime(LocalDateTime.now()); + cartItem.setCreateTime(LocalDateTime.now()); + cartItem.setUpdateTime(LocalDateTime.now()); cartItemMapper.insert(cartItem); return GlobalResponse.success(cartItem); } catch (Exception e) { diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/CartItems.java b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/CartItems.java index e7893842..d0870547 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/CartItems.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/CartItems.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -30,7 +31,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_cart_items") @ApiModel(value = "CartItems对象", description = "") -public class CartItems implements Serializable { +public class CartItems extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -45,10 +46,4 @@ public class CartItems implements Serializable { @TableField("quantity") private Integer quantity; - - @TableField("created_time") - private LocalDateTime createdTime; - - @TableField("updated_time") - private LocalDateTime updatedTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/OrderItems.java b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/OrderItems.java index 674a7275..e4e8913d 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/OrderItems.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/OrderItems.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -30,7 +31,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_order_items") @ApiModel(value = "OrderItems对象", description = "") -public class OrderItems implements Serializable { +public class OrderItems extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -48,7 +49,4 @@ public class OrderItems implements Serializable { @TableField("price") private BigDecimal price; - - @TableField("created_time") - private LocalDateTime createdTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Orders.java b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Orders.java index 88aa4f19..d6ef5870 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Orders.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Orders.java @@ -10,6 +10,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -31,7 +32,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_orders") @ApiModel(value = "Orders对象", description = "") -public class Orders implements Serializable { +public class Orders extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -46,10 +47,4 @@ public class Orders implements Serializable { @TableField("status") private String status; - - @TableField("created_time") - private LocalDateTime createdTime; - - @TableField("updated_time") - private LocalDateTime updatedTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Products.java b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Products.java index 28efddaf..573fd4b0 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Products.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Products.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -30,7 +31,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_products") @ApiModel(value = "Products对象", description = "") -public class Products implements Serializable { +public class Products extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -51,10 +52,4 @@ public class Products implements Serializable { @TableField("stock") private Integer stock; - - @TableField("created_time") - private LocalDateTime createdTime; - - @TableField("updated_time") - private LocalDateTime updatedTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/StoreTypes.java b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/StoreTypes.java index 8256098c..408438cb 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/StoreTypes.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/StoreTypes.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -28,7 +29,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_store_types") @ApiModel(value = "StoreTypes对象", description = "") -public class StoreTypes implements Serializable { +public class StoreTypes extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; diff --git a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Stores.java b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Stores.java index 0483f74e..70583825 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Stores.java +++ b/acdr/src/main/java/com/yskj/acdr/master/mall/entity/Stores.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -29,7 +30,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_stores") @ApiModel(value = "Stores对象", description = "") -public class Stores implements Serializable { +public class Stores extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -50,10 +51,4 @@ public class Stores implements Serializable { @TableField("owner_id") private Long ownerId; - - @TableField("created_time") - private LocalDateTime createdTime; - - @TableField("updated_time") - private LocalDateTime updatedTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/Notifications.java b/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/Notifications.java index 6e247016..ed648f2b 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/Notifications.java +++ b/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/Notifications.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; @@ -31,7 +32,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_notifications") @ApiModel(value = "Notifications对象", description = "") -public class Notifications implements Serializable { +public class Notifications extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -53,10 +54,6 @@ public class Notifications implements Serializable { @TableField("url") private String url; - @ApiModelProperty("消息创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - @ApiModelProperty("消息创建状态") @TableField("status") private Integer status; @@ -72,8 +69,4 @@ public class Notifications implements Serializable { @ApiModelProperty("消息接受范围") @TableField("receiver_scope") private String receiverScope; - - @ApiModelProperty("消息更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/NotificationsUser.java b/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/NotificationsUser.java index 9772b189..4ced6ce0 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/NotificationsUser.java +++ b/acdr/src/main/java/com/yskj/acdr/master/notifications/entity/NotificationsUser.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -28,7 +29,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_notifications_user") @ApiModel(value = "NotificationsUser对象", description = "") -public class NotificationsUser implements Serializable { +public class NotificationsUser extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; diff --git a/acdr/src/main/java/com/yskj/acdr/master/order/entity/Order.java b/acdr/src/main/java/com/yskj/acdr/master/order/entity/Order.java index 38932a35..0286de40 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/order/entity/Order.java +++ b/acdr/src/main/java/com/yskj/acdr/master/order/entity/Order.java @@ -11,6 +11,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yskj.acdr.master.common.ExtendEntity; import com.yskj.acdr.master.order.orderenum.OrderState; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -35,7 +36,7 @@ import org.springframework.format.annotation.DateTimeFormat; @Accessors(chain = true) @TableName("acdr_order") @ApiModel(value = "Order对象", description = "订单实体类") -public class Order implements Serializable { +public class Order extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -104,16 +105,6 @@ public class Order implements Serializable { @TableField("qrcode") private String qrcode; - // 这个是默认为不为空的,由数据库插入的时候补全 - @ApiModelProperty("预约创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - // 这个是默认为不为空的,由数据库插入的时候补全 - @ApiModelProperty("预约更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @ApiModelProperty("客户下单地址") @TableField("address") @NotNull(message = "用户下单地址不能为空") diff --git a/acdr/src/main/java/com/yskj/acdr/master/order/entity/PayInfo.java b/acdr/src/main/java/com/yskj/acdr/master/order/entity/PayInfo.java index 79c054bc..174844a5 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/order/entity/PayInfo.java +++ b/acdr/src/main/java/com/yskj/acdr/master/order/entity/PayInfo.java @@ -10,6 +10,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import com.yskj.acdr.master.order.orderenum.PayType; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -32,7 +33,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_pay_info") @ApiModel(value = "PayInfo对象", description = "") -public class PayInfo implements Serializable { +public class PayInfo extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -75,8 +76,4 @@ public class PayInfo implements Serializable { @ApiModelProperty("被支付方") @TableField("payee") private Long payee; - - @ApiModelProperty("支付时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/order/entity/QrCode.java b/acdr/src/main/java/com/yskj/acdr/master/order/entity/QrCode.java index 42ff663d..173ab528 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/order/entity/QrCode.java +++ b/acdr/src/main/java/com/yskj/acdr/master/order/entity/QrCode.java @@ -4,16 +4,18 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; +import java.io.Serializable; import java.time.LocalDateTime; @Data @Accessors(chain = true) @TableName("acdr_qr_code") -public class QrCode { +public class QrCode extends ExtendEntity implements Serializable { @TableId(value = "id", type = IdType.ASSIGN_ID) @ApiModelProperty("二维码id") diff --git a/acdr/src/main/java/com/yskj/acdr/master/personal/entity/PersonalService.java b/acdr/src/main/java/com/yskj/acdr/master/personal/entity/PersonalService.java index 2a6728a0..f8dfd532 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/personal/entity/PersonalService.java +++ b/acdr/src/main/java/com/yskj/acdr/master/personal/entity/PersonalService.java @@ -10,6 +10,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.*; @@ -30,7 +31,7 @@ import org.springframework.web.bind.annotation.PutMapping; @Accessors(chain = true) @TableName("acdr_personal_service") @ApiModel(value = "PersonalService对象", description = "") -public class PersonalService implements Serializable { +public class PersonalService extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -82,14 +83,6 @@ public class PersonalService implements Serializable { @TableField(value = "user_id", fill = FieldFill.INSERT) private Long userId; - @ApiModelProperty("创建服务的时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("更新服务的时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @ApiModelProperty("发布地址") @NotBlank(message = "发布地址不能为空") @TableField(value = "address") diff --git a/acdr/src/main/java/com/yskj/acdr/master/personal/entity/ServiceName.java b/acdr/src/main/java/com/yskj/acdr/master/personal/entity/ServiceName.java index 0fd95ae2..99ad3dd1 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/personal/entity/ServiceName.java +++ b/acdr/src/main/java/com/yskj/acdr/master/personal/entity/ServiceName.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -30,7 +31,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_service_name") @ApiModel(value = "ServiceName对象", description = "") -public class ServiceName implements Serializable { +public class ServiceName extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -49,12 +50,4 @@ public class ServiceName implements Serializable { @ApiModelProperty("优先级") @TableField("number") private Integer number; - - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/ExpandLocOrderInfo.java b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/ExpandLocOrderInfo.java index 19e5c72d..5d2188c2 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/ExpandLocOrderInfo.java +++ b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/ExpandLocOrderInfo.java @@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.yskj.acdr.master.common.ExtendEntity; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; @@ -21,7 +23,7 @@ import java.util.Date; @Getter @Setter @Accessors(chain = true) -public class ExpandLocOrderInfo { +public class ExpandLocOrderInfo extends ExtendEntity implements Serializable { /** * 宠物拓展位主键(只记录支付成功的) */ diff --git a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetExpertCertification.java b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetExpertCertification.java index fad8ecb3..0e95cfbb 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetExpertCertification.java +++ b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetExpertCertification.java @@ -11,6 +11,7 @@ import java.time.LocalDateTime; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.yskj.acdr.master.common.ExtendEntity; import com.yskj.acdr.master.pet.status.PetExpertCertificationStatus; import com.yskj.acdr.serialization.handler.JsonTypeHandler; import com.yskj.acdr.serialization.handler.ListStringTypeHandler; @@ -37,7 +38,7 @@ import lombok.experimental.Accessors; @TableName("acdr_pet_expert_certification") @ApiModel(value = "PetExpertCertification对象", description = "") @JsonIgnoreProperties(ignoreUnknown = true) -public class PetExpertCertification implements Serializable { +public class PetExpertCertification extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -69,10 +70,4 @@ public class PetExpertCertification implements Serializable { @ApiModelProperty("创建人") @TableField("user_id") private Long userId; - - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetInfo.java b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetInfo.java index 15dd7348..54e7250b 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetInfo.java +++ b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetInfo.java @@ -3,6 +3,7 @@ package com.yskj.acdr.master.pet.entity; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.yskj.acdr.common.verify.ValidAgeRange; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -13,6 +14,7 @@ import lombok.experimental.Accessors; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.PutMapping; +import java.io.Serializable; import java.time.LocalDateTime; /** @@ -23,7 +25,7 @@ import java.time.LocalDateTime; @Getter @Setter @Accessors(chain = true) -public class PetInfo { +public class PetInfo extends ExtendEntity implements Serializable { /** * 宠物主键 @@ -106,12 +108,4 @@ public class PetInfo { @TableField(value = "`hair_color`") @NotNull(message = "毛发不能为空") private String hairColor; - - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; } diff --git a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetSpecialistCertificate.java b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetSpecialistCertificate.java index de7a5c1e..b75f91a4 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetSpecialistCertificate.java +++ b/acdr/src/main/java/com/yskj/acdr/master/pet/entity/PetSpecialistCertificate.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -30,21 +31,13 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_pet_specialist_certificate") @ApiModel(value = "PetSpecialistCertificate对象", description = "") -public class PetSpecialistCertificate implements Serializable { +public class PetSpecialistCertificate extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @ApiModelProperty("过期日期") @TableField("expired_time") private LocalDateTime expiredTime; diff --git a/acdr/src/main/java/com/yskj/acdr/master/user/controller/UserController.java b/acdr/src/main/java/com/yskj/acdr/master/user/controller/UserController.java index 8e073079..34a5d743 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/user/controller/UserController.java +++ b/acdr/src/main/java/com/yskj/acdr/master/user/controller/UserController.java @@ -109,9 +109,9 @@ public class UserController { public GlobalResponse userInfo() { Users userInfo = usersService.getById(StpUtil.getLoginIdAsLong()); userInfo.setTypeId("") + .setEmail("") .setCreateTime(null) - .setUpdateTime(null) - .setEmail(""); + .setUpdateTime(null); return GlobalResponse.success("获取用户信息成功!", userInfo); } diff --git a/acdr/src/main/java/com/yskj/acdr/master/user/entity/UserIdentityVerification.java b/acdr/src/main/java/com/yskj/acdr/master/user/entity/UserIdentityVerification.java index f16b0afa..ecac2a1f 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/user/entity/UserIdentityVerification.java +++ b/acdr/src/main/java/com/yskj/acdr/master/user/entity/UserIdentityVerification.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.*; import java.io.Serializable; import java.time.LocalDateTime; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -26,7 +27,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @TableName("acdr_user_identity_verification") @ApiModel(value = "UserIdentityVerification对象", description = "") -public class UserIdentityVerification implements Serializable { +public class UserIdentityVerification extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -50,14 +51,6 @@ public class UserIdentityVerification implements Serializable { @TableField("real_sex") private String realSex; - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - private LocalDateTime createTime; - - @ApiModelProperty("实名认证信息更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - @ApiModelProperty("身份证信息") @TableField("identity") private String identity; diff --git a/acdr/src/main/java/com/yskj/acdr/master/user/entity/Users.java b/acdr/src/main/java/com/yskj/acdr/master/user/entity/Users.java index 35e777e9..a959361e 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/user/entity/Users.java +++ b/acdr/src/main/java/com/yskj/acdr/master/user/entity/Users.java @@ -1,36 +1,34 @@ package com.yskj.acdr.master.user.entity; -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; -import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.yskj.acdr.master.common.ExtendEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Null; import lombok.Getter; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Null; + +import java.io.Serializable; +import java.time.LocalDateTime; /** -*

-* -*

-* -* @author 林河 -* @since 2024-08-08 -*/ + *

+ * + *

+ * + * @author 林河 + * @since 2024-08-08 + */ @Getter @Setter @ToString @Accessors(chain = true) @TableName("acdr_users") @ApiModel(value = "UserBase对象", description = "") - public class Users implements Serializable { +public class Users extends ExtendEntity implements Serializable { private static final long serialVersionUID = 1L; @@ -55,16 +53,6 @@ import jakarta.validation.constraints.Null; @TableField("type_id") private String typeId; - @ApiModelProperty("创建时间") - @TableField(value = "create_time", fill = FieldFill.INSERT) - @NotNull(message = "创建时间不能为空") - private LocalDateTime createTime; - - @ApiModelProperty("更新时间") - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - @NotNull(message = "更新时间不能为空") - private LocalDateTime updateTime; - @ApiModelProperty("用户头像") @TableField("avatar") private String avatar; diff --git a/acdr/src/main/java/com/yskj/acdr/master/user/service/impl/UsersServiceImpl.java b/acdr/src/main/java/com/yskj/acdr/master/user/service/impl/UsersServiceImpl.java index 6e21b870..c60e9c8d 100644 --- a/acdr/src/main/java/com/yskj/acdr/master/user/service/impl/UsersServiceImpl.java +++ b/acdr/src/main/java/com/yskj/acdr/master/user/service/impl/UsersServiceImpl.java @@ -128,14 +128,14 @@ public class UsersServiceImpl extends ServiceImpl implements // 检查手机号是否已注册 Users user = this.baseMapper.selectOne(new QueryWrapper().eq("phone", phone)); if (user == null) { - // 未注册,创建新用户 - user = new Users() + user = (Users) new Users() .setAvatar("/profile/avatar.jpg") .setName(phone) // 设置默认用户名 .setPhone(phone) + .setNickname(DEFAULT_NICK_NAME_PREFIX + phone.substring(phone.length() - 4)) .setCreateTime(LocalDateTime.now()) - .setUpdateTime(LocalDateTime.now()) - .setNickname(DEFAULT_NICK_NAME_PREFIX + phone.substring(phone.length() - 4)); + .setUpdateTime(LocalDateTime.now()); + // 未注册,创建新用户 this.baseMapper.insert(user); } @@ -154,13 +154,13 @@ public class UsersServiceImpl extends ServiceImpl implements @Override public Users getSafeUsers(Long userId) { Users users = baseMapper.selectById(userId); - return users.setOpenid("") - .setCreateTime(null) - .setUpdateTime(null) + return (Users) users.setOpenid("") .setEmail("") .setTypeId("") // 这个是创建用户的手机号信息隐藏中间几位 - .setPhone(PhoneValidator.hidePhoneNumber(users.getPhone())); + .setPhone(PhoneValidator.hidePhoneNumber(users.getPhone())) + .setCreateTime(null) + .setUpdateTime(null); } /** @@ -170,13 +170,13 @@ public class UsersServiceImpl extends ServiceImpl implements @Override public Users getSafeUsers() { Users users = baseMapper.selectById(StpUtil.getLoginIdAsLong()); - return users.setOpenid("") - .setCreateTime(null) - .setUpdateTime(null) + return (Users) users.setOpenid("") .setEmail("") .setTypeId("") // 这个是创建用户的手机号信息隐藏中间几位 - .setPhone(PhoneValidator.hidePhoneNumber(users.getPhone())); + .setPhone(PhoneValidator.hidePhoneNumber(users.getPhone())) + .setCreateTime(null) + .setUpdateTime(null); } @Override diff --git a/acdr/src/main/resources/application-devp.yml b/acdr/src/main/resources/application-devp.yml index 3226276f..e21b18f2 100644 --- a/acdr/src/main/resources/application-devp.yml +++ b/acdr/src/main/resources/application-devp.yml @@ -94,6 +94,10 @@ mybatis-plus: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 当使用非实体类接收返回数据时,字段值若为空则返回null(不设置此项会忽略为null的字段) call-setters-on-nulls: true + global-config: + db-config: + logic-delete-value: 1 # 逻辑删除时的值 + logic-not-delete-value: 0 # 逻辑未删除时的值 # 系统管理 management: diff --git a/acdr/src/main/resources/application-production.yml b/acdr/src/main/resources/application-production.yml index fcb66c69..697fed4c 100644 --- a/acdr/src/main/resources/application-production.yml +++ b/acdr/src/main/resources/application-production.yml @@ -91,6 +91,10 @@ mybatis-plus: #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 当使用非实体类接收返回数据时,字段值若为空则返回null(不设置此项会忽略为null的字段) call-setters-on-nulls: true + global-config: + db-config: + logic-delete-value: 1 # 逻辑删除时的值 + logic-not-delete-value: 0 # 逻辑未删除时的值 # 系统管理 management: