commit 0822f8fa5c658fbfb9da44396687ff6ab4fe9ab4 Author: tsukiyalo <2450026988@qq.com> Date: Mon Aug 18 09:07:54 2025 +0800 上传代码 diff --git a/school_lend_back_end/.gitignore b/school_lend_back_end/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/school_lend_back_end/.gitignore @@ -0,0 +1,33 @@ +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/ diff --git a/school_lend_back_end/deps.txt b/school_lend_back_end/deps.txt new file mode 100644 index 0000000..7bdfb56 Binary files /dev/null and b/school_lend_back_end/deps.txt differ diff --git a/school_lend_back_end/pom.xml b/school_lend_back_end/pom.xml new file mode 100644 index 0000000..adf5997 --- /dev/null +++ b/school_lend_back_end/pom.xml @@ -0,0 +1,289 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.2.5 + + + + com.bsz + school_send_back_end + 0.0.1-SNAPSHOT + school_send_back_end + school_send_back_end + + + 17 + 1.0.0-M2 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 3.0.3 + + + + com.baomidou + mybatis-plus-boot-starter + 3.5.5 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + + com.alipay.sdk + alipay-sdk-java + 4.38.0.ALL + + + + cn.hutool + hutool-all + 5.8.16 + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + + mysql + mysql-connector-java + 8.0.16 + runtime + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.aliyun.oss + aliyun-sdk-oss + 3.15.1 + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + + + junit + junit + 4.13.2 + test + + + + org.aspectj + aspectjtools + 1.9.21 + + + + org.projectlombok + lombok + 1.18.30 + + + + com.alibaba + easyexcel + 3.3.3 + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.session + spring-session-data-redis + + + + org.springframework.boot + spring-boot-starter-websocket + + + + org.springframework.boot + spring-boot-starter-amqp + + + + io.projectreactor + reactor-core + 3.5.12 + + + + io.netty + netty-all + 4.1.109.Final + + + + io.projectreactor.netty + reactor-netty + 1.1.13 + + + + com.aliyun + aliyun-java-sdk-core + 4.5.16 + + + + com.aliyun + aliyun-java-sdk-dysmsapi + 2.1.0 + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.5 + + + + com.github.houbb + sensitive-word + 0.23.0 + + + + commons-net + commons-net + 3.3 + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + provided + + + + jakarta.websocket + jakarta.websocket-api + 2.1.0 + provided + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.5.0 + + + + org.springframework + spring-core + + + + io.swagger.core.v3 + swagger-core + 2.2.20 + + + + + com.alibaba.cloud.ai + spring-ai-alibaba-starter + 1.0.0-M2.1 + + + + + + + + + spring-releases + https://repo.spring.io/release + + + knife4j + https://s01.oss.sonatype.org/content/repositories/releases/ + + + central + https://repo.maven.apache.org/maven2 + + + spring-milestones + Spring Milestone Repository + https://repo.spring.io/milestone + + + + + + + org.springframework.ai + spring-ai-bom + ${spring-ai.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + + + + diff --git a/school_lend_back_end/sql/create_table.sql b/school_lend_back_end/sql/create_table.sql new file mode 100644 index 0000000..906dadc --- /dev/null +++ b/school_lend_back_end/sql/create_table.sql @@ -0,0 +1,391 @@ +create database school_send; + +use school_send; + +create table user +( + username varchar(256) null comment '用户昵称', + id bigint auto_increment comment 'id' + primary key, + unionId varchar(256) null comment '支付宝开放平台id', + openId varchar(256) null comment 'openId', + userAccount varchar(256) null comment '账号', + avatarUrl varchar(256) null comment '用户头像', + gender tinyint null comment '性别', + userPassword varchar(512) not null comment '密码', + phone varchar(128) null comment '电话', + email varchar(512) null comment '邮箱', + userStatus int default 0 not null comment '状态 0 -正常', + createTime datetime default CURRENT_TIMESTAMP null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP, + isDelete tinyint default 0 not null comment '是否删除', + userRole varchar(256) default 'user' not null comment 'user-普通用户,business-商家,admin-管理员', + index idx_openId (openId) +) comment '用户' collate = utf8mb4_unicode_ci; + +-- 商家表 +create table if not exists business +( + id bigint auto_increment comment 'id' primary key, + userId bigint not null comment '用户id', + businessName varchar(512) not null comment '门店名称', + businessAvatar varchar(1024) not null comment '门店头像', + businessPhone varchar(64) not null comment '门店手机号', + address varchar(512) not null comment '店铺详细地址', + businessProfile varchar(512) null comment '门店简介', + businessImages varchar(1024) null comment '商家相册', + categoryId bigint null comment '分类id', + startBusiness varchar(64) not null comment '开始营业时间', + endBusiness varchar(64) not null comment '结束营业时间', + state tinyint default 0 not null comment '状态:0审核中,1启用,2禁用', + storeStatus tinyint default 0 not null comment '店铺状态:0休业,1营业', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_businessId (id), + index idx_userId (userId) +) comment '商家' collate = utf8mb4_unicode_ci; + +-- 商家认证表 +create table if not exists business_auth +( + id bigint auto_increment comment 'id' primary key, + businessId bigint not null comment '店铺id', + shopkeeper varchar(64) not null comment '店主名', + license varchar(1024) not null comment '营业执照', + frontIdCard varchar(1024) not null comment '身份证正面', + backIdCard varchar(1024) not null comment '身份证反面', + bankCard varchar(64) not null comment '银行卡号', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_businessId (businessId) +) comment '商家认证' collate = utf8mb4_unicode_ci; + +-- 系统 +-- 分类表 +create table if not exists category +( + id bigint auto_increment comment 'id' primary key, + name varchar(256) not null comment '分类名', + image varchar(512) not null comment '分类图片', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + index idx_categoryId (id) +) comment '分类表' collate = utf8mb4_unicode_ci; + +-- 系统信息表 +create table if not exists systemInfo +( + id bigint auto_increment comment 'id' primary key, + type tinyint not null comment '类型:0公告,1轮播图', + content varchar(256) not null comment '功能内容', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) comment '系统信息' collate = utf8mb4_unicode_ci; + +-- 操作日志表 +create table if not exists systemLog +( + id bigint auto_increment comment 'id' primary key, + userId bigint not null comment '用户id', + content varchar(256) not null comment '操作内容', + ip varchar(64) not null comment 'ip地址', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + index idx_businessId (userId) +) comment '系统信息' collate = utf8mb4_unicode_ci; + +-- 菜品 +-- 菜品分组表 +create table if not exists dishes_group +( + id bigint auto_increment comment 'id' primary key, + businessId bigint not null comment '商家id', + groupName varchar(128) not null comment '菜品分组名称', + isTopping tinyint default 0 not null comment '是否置顶:0不置顶,1置顶', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_businessId (businessId) +) comment '菜品分组表' collate = utf8mb4_unicode_ci; + +-- 菜品表 +create table if not exists dishes +( + id bigint auto_increment comment 'id' primary key, + businessId bigint not null comment '商家id', + dishesGroupId bigint not null comment '菜品分组id', + dishesName varchar(128) not null comment '菜品名称', + dishesImage varchar(1024) null comment '菜品图片', + dishesPrice double not null comment '菜品价格', + packPrice double not null comment '打包费', + inventoryStatus int not null comment '库存数量', + status varchar(20) default '上架' not null comment '菜品状态:上架,下架', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_businessId (businessId) +) comment '菜品表' collate = utf8mb4_unicode_ci; + +-- 菜品和规格的中间表 +create table if not exists specifications_dishes +( + id bigint auto_increment comment 'id' primary key, + dishesId bigint not null comment '菜品id', + specificationsId bigint not null comment '规格id', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_dishesId (dishesId), + index idx_specificationsId (specificationsId) +) comment '菜品和规格的中间表' collate = utf8mb4_unicode_ci; + +-- 规格表 +create table if not exists specifications +( + id bigint auto_increment comment 'id' primary key, + businessId bigint not null comment '商家id', + specificationsName varchar(128) not null comment '规格名称', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_businessId (businessId) +) comment '规格表' collate = utf8mb4_unicode_ci; + +-- 属性表 +create table if not exists attribute +( + id bigint auto_increment comment 'id' primary key, + businessId bigint not null comment '商家id', + specificationsId bigint not null comment '规格id', + attributeName varchar(128) not null comment '属性名称', + attributeStatus tinyint default 0 not null comment '属性状态:0在售,1停售', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + index idx_businessId (businessId) +) comment '属性表' collate = utf8mb4_unicode_ci; + +-- 订单 +-- 订单表 +create table if not exists orders +( + id bigint auto_increment comment 'id' primary key, + pickupCode varchar(64) null comment '取餐码', + userName varchar(256) not null comment '姓名', + phone varchar(64) not null comment '手机号', + userId bigint not null comment '下单用户id', + businessId bigint not null comment '商家id', + errandId bigint null comment '跑腿id', + location varchar(256) null comment '配送地址', + totalPrice decimal(10, 2) not null comment '订单实际总价', + pickupMethod tinyint not null comment '取餐方式(0堂食 1自提)', + payMethod tinyint not null comment '支付方式:0微信支付', + pickupTime datetime null comment '取餐时间', + notes varchar(128) null comment '备注', + state tinyint default 0 not null comment '订单状态: 0未支付 1已完成 2已退款 3已取消 4已出餐 5已完成', + createTime datetime default CURRENT_TIMESTAMP not null comment '下单时间', + updateTime datetime default CURRENT_TIMESTAMP not null comment '支付时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_businessId (businessId), + index idx_stateId (state) +) comment '订单表' collate = utf8mb4_unicode_ci; + +-- 订单详情表 +create table if not exists order_details +( + id bigint auto_increment comment 'id' primary key, + orderId bigint not null comment '关联的订单id', + dishesId bigint not null comment '关联的菜品id', + quantity int not null comment '购买数量', + price decimal(10, 2) not null comment '单价', + subtotal decimal(10, 2) not null comment '小计(单价 * 数量)', + attributeNames varchar(512) null comment '规格属性列表', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除', + index idx_orderId (orderId) +) comment '订单详情表' collate = utf8mb4_unicode_ci; +-- 购物车表 +create table if not exists cart +( + id bigint auto_increment comment 'id' primary key, + userId bigint not null comment '用户id', + businessId bigint not null comment '商家id', + createTime datetime default CURRENT_TIMESTAMP not null comment '加入购物车时间', + updateTime datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间', + dishesId bigint null comment '菜品id', + quantity int default 1 not null comment '商品数量', + price decimal(10, 2) not null comment '当前选择规格的价格', + subtotal decimal(10, 2) as ((`price` * `quantity`)) stored comment '小计(单价 * 数量)', + selectedOptions varchar(512) default '' not null comment '已选规格属性列表', + isDelete tinyint default 0 not null comment '是否删除', + index idx_userId (userId), + index idx_businessId (businessId) +) comment '购物车表' collate = utf8mb4_unicode_ci; + + +create table demo +( + id int auto_increment primary key, + name varchar(30) comment '姓名', + detail varchar(256) comment '详情' +); + +-- 系统信息表 +create table if not exists systemInfo +( + id bigint auto_increment comment 'id' primary key, + type tinyint not null comment '类型:0公告,1轮播图', + content varchar(256) not null comment '功能内容', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) comment '系统信息' collate = utf8mb4_unicode_ci; + +-- 聊天记录表 +create table private_message +( + id bigint auto_increment comment 'id' primary key, + from_userAccount varchar(255) not null comment '发消息者', + to_userAccount varchar(255) not null comment '接收消息者', + orderId bigint null comment '订单id', + message varchar(255) null comment '消息内容', + from_user_deleted tinyint default false comment '发消息者是否删除', + to_user_deleted tinyint default false comment '接收消息者是否删除' +) + comment '聊天记录' collate = utf8mb4_unicode_ci; + +# 收藏表 +create table collect +( + id bigint auto_increment comment 'id' primary key, + userId bigint not null comment '用户id', + businessId bigint not null comment '商家id' +) comment '收藏'; + +-- 用户评分表 +create table user_rating +( + id bigint auto_increment comment 'id' primary key, + ratedEntityId bigint not null comment '评分对象的ID:商家 跑腿', + userId bigint not null comment '用户id', + orderId bigint not null comment '订单id', + rating tinyint not null comment '评分', + review varchar(512) null comment '评论', + businessReview varchar(512) null comment '商家回复', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) comment '用户评分' collate = utf8mb4_unicode_ci; + +-- 商家等级表 +create table business_level +( + id bigint auto_increment primary key comment 'id', + businessId bigint not null comment '商家id', + averageScore DECIMAL(3, 2) not null default 0 comment '综合评分', + level tinyint not null comment '等级', + createTime DATETIME default CURRENT_TIMESTAMP comment '创建时间', + updateTime DATETIME default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间' +); + +-- 系统信息表 +create table if not exists businessInfo +( + id bigint auto_increment comment 'id' primary key, + businessId bigint not null comment '商家id', + content varchar(256) not null comment '功能内容', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间' +) comment '系统信息' collate = utf8mb4_unicode_ci; + +-- 跑腿表 +create table if not exists errand +( + id bigint auto_increment comment 'id' primary key, + userId bigint not null comment '用户id', + errandName varchar(256) not null comment '跑腿姓名', + errandAvatarUrl varchar(256) default 'http://154.8.193.216:9494/system/0/MRiFcIbr-R.jpg' comment '跑腿头像', + gender tinyint not null comment '性别', + phone varchar(128) not null comment '手机号', + distributionScope tinyint not null comment '配送范围', + totalOrders tinyint default 0 not null comment '接单量', + maxOrders tinyint default 15 not null comment '最大接单量', + totalPrice decimal(10, 2) default 0.00 not null comment '总金额', + state tinyint default 0 not null comment '审核状态 0-未审核 1-审核通过', + createTime DATETIME default CURRENT_TIMESTAMP comment '创建时间', + updateTime DATETIME default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间', + isDelete tinyint default 0 not null comment '是否删除' +) comment '跑腿' collate = utf8mb4_unicode_ci; + +-- 跑腿认证表 +create table if not exists errand_auth +( + id bigint auto_increment primary key comment 'id', + errandId bigint not null comment '跑腿id', + bankCard varchar(64) not null comment '银行卡号', + frontIdCard varchar(1024) not null comment '身份证正面', + backIdCard varchar(1024) not null comment '身份证反面', + healthCertificate varchar(1024) null comment '健康证', + certificateStartTime datetime null comment '健康证开始时间', + certificateEndTime datetime null comment '健康证结束时间', + createTime datetime default CURRENT_TIMESTAMP not null comment '创建时间', + isDelete tinyint default 0 not null comment '逻辑删除' +) comment '跑腿认证' collate = utf8mb4_unicode_ci; + +-- 跑腿等级表 +create table if not exists errand_level +( + id bigint auto_increment primary key comment 'id', + errandId bigint not null comment '跑腿Id', + averageScore DECIMAL(3, 2) not null default 0 comment '综合评分', + level tinyint not null comment '等级', + createTime DATETIME default CURRENT_TIMESTAMP comment '创建时间', + updateTime DATETIME default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP comment '更新时间' +) comment '跑腿等级' collate = utf8mb4_unicode_ci; + +create table if not exists errand_income +( + id bigint auto_increment primary key comment 'id', + errandId bigint not null comment '跑腿id', + orderId bigint not null comment '订单id', + income decimal(10, 2) default 0 comment '综合评分', + state tinyint default 0 not null comment '0未结算 1已结算 2已提现', + createTime datetime default CURRENT_TIMESTAMP comment '创建时间' +) comment '跑腿收入' collate = utf8mb4_unicode_ci; + +create table if not exists errand_order +( + id bigint auto_increment primary key comment 'id', + orderId bigint not null comment '订单ID', + errandState tinyint default 0 null comment '跑腿状态: 0无跑腿 1待抢单 2待取货 3待送达 4已送达 5再次抢单', + startTime datetime null comment '送餐开始时间', + endTime datetime null comment '送餐结束时间', + errandId bigint null comment '跑腿员ID', + createTime datetime default current_timestamp not null comment '任务创建时间', + updateTime datetime default current_timestamp not null on update current_timestamp comment '任务更新时间', + isDelete tinyint default 0 not null comment '是否删除' +) comment '跑腿任务表' collate = utf8mb4_unicode_ci; + +create table if not exists order_image +( + orderId bigint auto_increment primary key comment 'id', + imageAddress varchar(256) not null comment '外卖地址' +) comment '外卖图片' collate = utf8mb4_unicode_ci; + +create table if not exists errand_bill +( + id bigint auto_increment primary key comment 'id', + orderId bigint not null comment '订单Id', + userPhone varchar(128) not null comment '用户手机号', + income decimal(3, 2) default 0 comment '综合评分', + errandState tinyint default 0 comment '收入状态:0-待结算 1-已结算', + orderStartTime Date not null comment '订单创建时间' +) comment '跑腿账单表' collate = utf8mb4_unicode_ci; + +create table order_refunds ( + id bigint auto_increment primary key comment '退款申请ID', + orderId bigint not null unique comment '订单号,唯一标识', + userId bigint not null comment '用户ID', + reason varchar(255) default null comment '退款原因', + amount decimal(10,2) not null comment '退款金额', + status tinyint not null default 0 comment '退款状态:0-待审核, 1-已同意, 2-已拒绝', + createTime timestamp default current_timestamp comment '申请时间', + updateTime timestamp default current_timestamp on update current_timestamp comment '更新时间', + index idx_order_id (orderId), + index idx_user_id (userId) +) comment='退款申请表' collate = utf8mb4_unicode_ci; diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/UserCenterApplication.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/UserCenterApplication.java new file mode 100644 index 0000000..3e8b72d --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/UserCenterApplication.java @@ -0,0 +1,31 @@ +package com.bsz.school_send_back_end; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.ai.chat.memory.ChatMemory; +import org.springframework.ai.chat.memory.InMemoryChatMemory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.filter.ForwardedHeaderFilter; + + +@MapperScan("com.bsz.school_send_back_end.mapper") +@SpringBootApplication +@EnableScheduling +public class UserCenterApplication { + + public static void main(String[] args) { + SpringApplication.run(UserCenterApplication.class, args); + } + + @Bean + public ChatMemory chatMemory(){ + return new InMemoryChatMemory(); + } + + @Bean + public ForwardedHeaderFilter forwardedHeaderFilter() { + return new ForwardedHeaderFilter(); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/annotation/AuthCheck.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/annotation/AuthCheck.java new file mode 100644 index 0000000..793da80 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/annotation/AuthCheck.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 权限校验 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface AuthCheck { + + /** + * 必须有某个角色 + * @return + */ + String mustRole() default ""; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/annotation/SystemLog.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/annotation/SystemLog.java new file mode 100644 index 0000000..892175e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/annotation/SystemLog.java @@ -0,0 +1,19 @@ +package com.bsz.school_send_back_end.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 系统日志 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface SystemLog { + + /** + * 操作步骤 + */ + String executeStep() default ""; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/aop/AuthInterceptor.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/aop/AuthInterceptor.java new file mode 100644 index 0000000..9b879cd --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/aop/AuthInterceptor.java @@ -0,0 +1,92 @@ +package com.bsz.school_send_back_end.aop; + +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.enums.UserRoleEnum; +import com.bsz.school_send_back_end.service.UserService; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Arrays; + +/** + * 权限校验 AOP + */ +@Aspect +@Component +public class AuthInterceptor { + + @Resource + private UserService userService; + + /** + * 执行拦截 + */ + @Around("@annotation(authCheck)") + public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable { + + String mustRole = authCheck.mustRole(); + RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); + HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); + String uri = request.getRequestURI(); + // ✅ 如果是 Swagger 或 OpenAPI 相关请求,直接放行 + if (uri.startsWith("/v3/api-docs") || uri.contains("/swagger") || uri.contains("/swagger-ui")) { + return joinPoint.proceed(); // 直接放行 + } + // 当前登录用户 + User loginUser = userService.getLoginUser(request); + // 必须有该权限才通过 + UserRoleEnum mustUserRoleEnum = UserRoleEnum.getEnumByValue(mustRole); + + String userRole = loginUser.getUserRole(); + // 如果被封号,直接拒绝 + if (UserRoleEnum.BAN.equals(UserRoleEnum.getEnumByValue(userRole))) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + + // 必须有Boss权限 + if (UserRoleEnum.BOSS.equals(mustUserRoleEnum)) { + if (!mustRole.equals(userRole)) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + } + + // 必须有管理员权限 + if (UserRoleEnum.ADMIN.equals(mustUserRoleEnum)) { + if (!mustRole.equals(userRole) && !UserConstant.BOSS_ROLE.equals(userRole)) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + } + // 必须有商家或管理员权限 + if (UserRoleEnum.BUSINESS.equals(mustUserRoleEnum)) { + if (!Arrays.asList(mustRole, UserConstant.ADMIN_ROLE, UserConstant.BOSS_ROLE).contains(userRole)) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + } + + // + if (UserRoleEnum.ERRAND.equals(mustUserRoleEnum)) { + if (!Arrays.asList(mustRole, UserConstant.ADMIN_ROLE, UserConstant.BOSS_ROLE).contains(userRole)) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + } + + if (UserRoleEnum.USER.equals(mustUserRoleEnum)) { + if (!Arrays.asList(mustRole, UserConstant.ADMIN_ROLE, UserConstant.BOSS_ROLE).contains(userRole)) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + } + // 通过权限校验,放行 + return joinPoint.proceed(); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/aop/SystemLogInterceptor.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/aop/SystemLogInterceptor.java new file mode 100644 index 0000000..f973e24 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/aop/SystemLogInterceptor.java @@ -0,0 +1,73 @@ +package com.bsz.school_send_back_end.aop; + + +import com.bsz.school_send_back_end.annotation.SystemLog; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Systemlog; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.service.SystemlogService; +import com.bsz.school_send_back_end.service.UserService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; + +/** + * 日志AOP + */ +@Slf4j +@Aspect +@Component +public class SystemLogInterceptor { + + @Resource + private UserService userService; + + @Resource + private SystemlogService systemlogService; + + /** + * 执行拦截 + */ + @Around("@annotation(systemLog)") + public Object doInterceptor(ProceedingJoinPoint joinPoint, SystemLog systemLog) throws Throwable { + + // 获取执行操作 + String executeStep = systemLog.executeStep(); + ThrowUtils.throwIf(StringUtils.isEmpty(executeStep), ErrorCode.PARAMS_ERROR); + //获取请求 + RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); + HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest(); + String uri = httpServletRequest.getRequestURI(); + // ✅ 如果是 Swagger 或 OpenAPI 相关请求,直接放行 + if (uri.startsWith("/v3/api-docs") || uri.contains("/swagger") || uri.contains("/swagger-ui")) { + return joinPoint.proceed(); // 直接放行 + } + //获取登录用户 + User loginUser = userService.getLoginUser(httpServletRequest); + //写入系统日志 + Systemlog systemlog = new Systemlog(); + systemlog.setUserId(loginUser.getId()); + systemlog.setContent(executeStep); + systemlog.setIp(httpServletRequest.getRemoteHost()); + boolean save = systemlogService.save(systemlog); + if (!save) { + log.error("操作日志写入失败,执行操作:" + executeStep); + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "操作日志写入失败"); + } + + // 放行 + return joinPoint.proceed(); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/BaseResponse.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/BaseResponse.java new file mode 100644 index 0000000..fc88d5f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/BaseResponse.java @@ -0,0 +1,42 @@ +package com.bsz.school_send_back_end.common; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +@Schema(description = "通用返回对象") +public class BaseResponse implements Serializable { + + @Schema(description = "状态码,例如:200 表示成功") + private int code; + + @Schema(description = "返回的数据内容") + private T data; + + @Schema(description = "提示消息") + private String message; + + @Schema(description = "错误描述") + private String description; + + public BaseResponse(int code, T data, String message, String description) { + this.code = code; + this.data = data; + this.message = message; + this.description = description; + } + + public BaseResponse(int code, T data, String message) { + this(code, data, message, ""); + } + + public BaseResponse(int code, T data) { + this(code, data, "", ""); + } + + public BaseResponse(ErrorCode errorCode) { + this(errorCode.getCode(), null , errorCode.getMessage(), errorCode.getDescription()); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/ErrorCode.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/ErrorCode.java new file mode 100644 index 0000000..186a988 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/ErrorCode.java @@ -0,0 +1,49 @@ +package com.bsz.school_send_back_end.common; + + +/** + * 错误码 + */ +public enum ErrorCode { + + SUCCESS(0, "ok", ""), + PARAMS_ERROR(40000, "请求参数错误", ""), + NULL_ERROR(40001, "请求数据为空", ""), + NOT_LOGIN(40100, "未登录", ""), + NO_AUTH(40101, "无权限", ""), + NOT_FOUND_ERROR(40400,"请求数据不存在",""), + FORBIDDEN_ERROR(40300, "禁止访问",""), + SYSTEM_ERROR(50000, "系统内部异常", ""), + OPERATION_ERROR(50001, "操作失败", ""); + + /** + * 状态码 + */ + private final int code; + /** + * 状态码信息 + */ + private final String message; + /** + * 状态码的详细描述 + */ + private final String description; + + ErrorCode(int code, String message, String description) { + this.code = code; + this.message = message; + this.description = description; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + public String getDescription() { + return description; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/ResultUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/ResultUtils.java new file mode 100644 index 0000000..2c7b69b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/common/ResultUtils.java @@ -0,0 +1,68 @@ +package com.bsz.school_send_back_end.common; + +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; + +/** + * 返回工具类 + */ +public class ResultUtils { + /** + * 成功 + * + * @param data + * @param + * @return + */ + public static BaseResponse success(T data) { + return new BaseResponse<>(0, data, "ok"); + } + + public static BaseResponse success(T data, String message) { + return new BaseResponse<>(0, data, message); + } + + /** + * 失败 + * + * @param errorCode + * @return + */ + public static BaseResponse error(ErrorCode errorCode) { + return new BaseResponse<>(errorCode); + } + + /** + * 失败 + * + * @param code + * @param message + * @param description + * @return + */ + public static BaseResponse error(int code, String message, String description) { + return new BaseResponse(code, null, message, description); + } + + /** + * 失败 + * + * @param errorCode + * @return + */ + public static BaseResponse error(ErrorCode errorCode, String message, String description) { + return new BaseResponse(errorCode.getCode(), null, message, description); + } + + + /** + * 失败 + * + * @param errorCode + * @return + */ + public static BaseResponse error(ErrorCode errorCode, String description) { + return new BaseResponse(errorCode.getCode(), errorCode.getMessage(), description); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AIConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AIConfig.java new file mode 100644 index 0000000..3ac4276 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AIConfig.java @@ -0,0 +1,66 @@ +package com.bsz.school_send_back_end.config; + +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.vo.BusinessVO; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.DishesService; +import com.bsz.school_send_back_end.service.LoggingService; +import com.bsz.school_send_back_end.service.OrdersService; +import jakarta.annotation.Resource; +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor; +import org.springframework.ai.chat.memory.ChatMemory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Description; + +import java.util.List; +import java.util.function.Function; + +@Configuration +public class AIConfig { + + @Resource + private BusinessService businessService; + + @Resource + private DishesService dishesService; + + @Resource + private OrdersService ordersService; + + @Bean + ChatClient chatClient(ChatClient.Builder builder, ChatMemory chatMemory) { + return builder.defaultSystem( + """ + 你是食刻必达校快送小程序的助手,情谊轻松切愉快的语气与用户交流。 + 你可以给用户推荐一些商家和菜品 + 今天的日期是{current_date}。 + 请讲中文。 + """ + ) + .defaultAdvisors( + new PromptChatMemoryAdvisor(chatMemory), + new LoggingService() + ) + .defaultFunctions("getBusinessByAI") + .build(); + } + + + @Bean + @Description("推荐商家") + public Function> getBusinessByAI() { + List allBusiness = businessService.findAllBusiness(); + return unused -> allBusiness.stream() + .filter(businessVO -> businessVO.getLevel() == 5) + .toList(); + } + +// @Bean +// @Description("推荐菜品") +// public Function> getDishesByAI() { +// new LocalTime +// } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AliPayNotifyHandler.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AliPayNotifyHandler.java new file mode 100644 index 0000000..7124d34 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AliPayNotifyHandler.java @@ -0,0 +1,42 @@ +package com.bsz.school_send_back_end.config; + +import com.alipay.api.internal.util.AlipaySignature; +import org.springframework.context.annotation.Configuration; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class AliPayNotifyHandler { + + public void aliPayNotifyUrl(HttpServletRequest request) { + // 将 HttpServletRequest 的参数转换为 Map + Map params = new HashMap<>(); + Enumeration parameterNames = request.getParameterNames(); + + while (parameterNames.hasMoreElements()) { + String paramName = parameterNames.nextElement(); + params.put(paramName, request.getParameter(paramName)); + } + + // 之后可以使用 params 进行业务处理 + // 例如: + String alipayrsaPublicKey = "MIIBIjANBgKGhKiG9WOBAOEFAAOCAQ8AMIIBCgKCAOEAUQWP3y7DHD0Z+/K+TcGlki0/acP8"; + try { + // 验证签名 + boolean flag = AlipaySignature.rsaCheckV1(params, alipayrsaPublicKey, "UTF-8", "RSA2"); + + if (flag && "TRADE_SUCCESS".equals(params.get("trade_status"))) { + // 业务处理 + System.out.println("success"); + } else { + System.out.println("fail"); + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("fail"); + } + } +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AlipayClients.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AlipayClients.java new file mode 100644 index 0000000..42593be --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/AlipayClients.java @@ -0,0 +1,39 @@ +package com.bsz.school_send_back_end.config; + + +import com.alipay.api.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; + +public class AlipayClients { + //appid + public String appId = "2021004151684053"; + //私钥 + //上:沙箱公钥 下:支付宝公钥 +// public String PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3JKMG3clg/1MqewlIK/koEhiQiSLagckb/2/Dyvg+rJ2snGiAgzNvhvvc1GdVC+Xnn/P+U+2tAytyuvbOuhmGgNZjeObczJXpo/0D6LBdYDrg4PVMDxpStCxLUpaShHbc/l/IquaorBwd94UJxIPAbUQkUBCbo94mGbhDX+yU4FQ6k1yeUtn03jvZ3AY0BEHpenCxWKgr5S/CUAYEitMbi/r7extBy6f4FCR120NM7VaNEK1xpHbGHo6rDpyiAOR1lWFuiqOJ1hv14UL/SfOLlzvUZiiPysIxdNjycZyiyRvFRHP3n8GBAaJDm9vVHwDfgQ5s3Ig2ggBeYXkFHZqWwIDAQAB"; + public String PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1WYUUWEH+kW2pdYoBJa6j5G3iWe3uL/3L1QXPenzrp/NC1M9W/yvniJnAiYR4pdopZmlWfEm7FpHxbLaxxcXe0jTkspq9vv9vDldyXgKr13QZBJu4hD3w4QZNa+85paANXkfcVKXCpIh6sWTaW78lBE5p7Q0M6O26OCj/K3iPD7x4+KagqS5w9YYS8AXlQdsZPBh99bO3+KuQzcK4o4bFGI+ut4HLvd2IxdF5LwfjucloN6SRbU06vsDtpjtA+Oeoet5Y0CNfkpgbh7wvvNIbM6XEqMtfKCzevPaqRxwrFkS8WUQTMOaQbJXATbPQDt7MoWGujFd37lYz7ESQZed2wIDAQAB"; + //公钥appPrivateKey + //上:沙箱私钥 下:支付宝私钥 +// public String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCc1rWOaCHl7KnDDMctWIgFJqerq9ZU8QsxSA+wQC4nrTfoQVSVZn8fDNosilCHda7yv910A9aJYqZKx0+NOXY9YvMbKYifWtO8TtzAQ9Q0EQXce85gnVQ3yn9evE1MVwfmMIiXJ2jx/dmGrxuADrLcsNB/U4xsusKcNQaA76vALtAYTnKwOODaDt5Qd2OC25PRcGtKupKIbir/f62tNquBkCX+Z5URBpy0rZY2hCu30v3uPv8I3OlpxegFwNDHpKMIY3+wjQtqsogQTn20E5wzeV3VNabNxbORq6B6nh8mvxlo9q14XvmMJDPUoWiJgyUUpaAPZFWSpRCrLvWQY/klAgMBAAECggEAZJ/Ahig7L2gClriZBXfadOuTAapS7dZkpu6j2iGjOyOATgu0N9I11vcI9zCab/5KC0abzzYzK5vWMv3jBSmLueDFNnUUSaEdXaB/Mv+RowIU75ujEgt+n/jUdTR8p3DjCYWz7L6FL1T9fdLU4vkLOlpauoYg/xVnjI7cqFacq8SWr3jiGj/I31O18y02/eDiyAb5RMlSlNGnzvDuRwJ3h2Sn1u7znbMCi6CydG3hx+I0GE2iJqVPymc1f0T0vm7Jy3l/zL84oNKLTgPCqG9k+eriC7RaMkbvPQFjWCDCuWxgYM2pi1L9ZDG+FkReTFsZw6r/TWc4sl2xtj3GDSrHYQKBgQD1NwFBMQwsUQ/aJP63R0gILWSFR0+yQ314vfRRVKoZTujbQr7RBAzgQff97DirINIxXCBeV0zifpc2IaAPaY29YjDnQU+xGqIO91EWPjMkQ6XUvGGesKnKDYkA5yBMyD3/BH8BwJruidW2DwtC2rGTW1hatkXNtYccEI79/00UOQKBgQCjvKIySZdRolOYUfSPHHipOygWClFy1DlI54XDnj0gRBoOrFkeqrXr+G8dYeXP6UnMqLWX8V3RuEJB8klwKGLkMtUWdqMQUFM5yvjuX2d1Y9R2ESw0ch70B/6aItMVv6aN4GjGwCJWD1XD54IpWxtAKJsUxbDiN+343cVqSQQETQKBgQDq9JBcMa3TTLyerbHuVPt88lmNpr2DNk2kAoZ142S0qTpO1M5XIcVgn3UKNWw69FDSgM529rkxkFA8ys0910q7erkW7Cp6rOU459onMOP5zGO5yeLTlbyqYHu0hMEbMQbOMjWrrSwGgcVnE1Ub8sYRRoYLLPkHWPcjee45C4WEaQKBgHkUUeDb+JD+d9DIsg9uH3ANdcwunyJJ+36E7q7EgjEtCxPUsSZzWIoBsbFJppbDzbYRABA3BYjDOAPqNhJBWzeiu16cJmM28wRmqwQi+q+dPgx9EHJL/cW5b7XtkKihi3mY/AIVLI71UhfHR8JrQ9CC9oM62V2/vDNvU8AP9G91AoGANdvRubukeWgvWryBTaPuUTpjkP1mOuJuHiHEW5/XePsURwS6gGP/qJ9bSbhYhQ6iDaMOQ8vahfYM3Q4jvDxgcKS/N1fxFTohcN4bVdvekq62YdTNqcGhNzaxMNboFZYt2dPeDm8PRRMP+abddrS2NqgVSOC3Ru5Kh9iRIs2LOgE="; + public String appPrivateKey ="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOoaURczOevheVDeG9tmdCZ+PSInYwCY+ak3Jcy5CG4wrbHHy30ejMv5jNnyX/iSyC3MYIfHQ2I5uxh7pO3QSiB8GpeM9Oy3bUCOtPVM8o7FJ+/pa6o0s25jmj+Lx6/Q4sAaDxhQPY8vUZdIitQyqNS4IVhDuIWAS1w3ngZWHhcbtCPrCk3wIJPCYbhHi8eTgCXTJ0TbJ/QR+Pj0SAiL46rwSRc9KB1alxL5RoTK4VWvdHlqbfowen6teQ6bo2W5UkUEP8kew6MH9a3QQZ3YdLKFHufSGMWk19Wh26CEsvnf/Mb6dnv6YzbmzZLtCHiKKvFN516peW8Exd9/EtJCu1AgMBAAECggEAPghReVhoL/cu3HXQIylsmXYDoIW6b0QJP8o25+Lk9bVTKF6oY24Y2MvPkkZQSWYIhNWuD0zJYi50bW7BecEoXawP7zwKtZNKGAfVB4i0HHFDo9XoCj4w3SyeDxGEL91VR5Bhxgj61mU8chi7xNc8b31SkzcSiUb2rXLZ091kB58/xtzQk2nZAhKhwms7gbX7qxm8+TWLRK9g4vWmsGVqbgFNj/sutqBURSeU/pHmW9PMqgcWvx6AwWWi+VgBUSoIgMnX7r7s6ZlgeDIgioii3JdCcr1nq39sVYPwFpwIe7a1DOCB58B+v2un1XoThC7ZNEcbwP5oYpUdFhSoxClrNQKBgQDJc/A1nz2yYiLUHUMJn2DhyTrOnCSclmowuzJVkyuo5gQPfZ3dTmjdPkM/fg09J3+zi3UCSwZd6dGMzJVHWooMniSiomZ/rY+o9SVTAJOjxt29N8jFN92b3fB43hbAWyBOuy4NMZMcr+4cADuqRHz2pKAeaALiZdpTbrTCzVXtqwKBgQC1QGS0sv8VU9fyBCyrYU4kQh8Fcvz0g6ObgUnHZi6UIL+Cy0/3JIGeIyvB/n47RF1wLUz4wykwW70e1qlMz7w21HM+DB8fVuzbO7SmQI3gDo024kQkWWGUhe3/w9ztzLF9ezleSN6wnrPeDbeMV+pURbsxIXA9xg7DYpZZ76ksHwKBgHQnF/oi7bTbpo88q/lxXq/wkaqtFuL+Sw378UKsD4Fb1j2ERTBj1Ey0aJvENyfqjVPddcKztWESvtL65pt0laI+0IrBLm4xiWJ2rmWUMIw+zn0aG/Wyh2Emb0+RZfbU0+TxQdUzn0nsGlMkw0IiKRcgxn2hpQAaj+6JJ0omkIPvAoGAZ2eGTKT17Cf6QgNprJiF6R+j7QruD11uoJABFHZSSoXoXGk7hMbZ/+sW0sUrJQrat93QVPeabxFXctmKmtzFBw7rdFGcC9gepvCIHnUju9jxbYdm0sn/ZqmF323RhAVMmUcMsqKmEWNpQFzZA4NAl7V0lxH5o/RzhbqgBk05WYcCgYEAny/umQs7+NYgwL/FztMJVljfQsGY81mhgrQyPhmg/7NiWmLodJtwQgSj3UitDVtUGhZRnuidO8P1XW0sUyDwc8xMLb+0qVxX4gMpM4J1B0UaIp+oPg7hCXeFGxkWQl8bPY0RFa3GOfT2/D63NpXqYw8Fe1lZWoIMz+PBdx0YN90="; + //应用证书 + private String appCertPath; + //支付宝证书 + private String alipayCertPath; + //支付宝根证书 + private String alipayRootCertPath; + //回调地址 + private String notify; + //字符集 签名 + private String gateway = "https://openapi.alipay.com/gateway.do"; + + + // 公私钥模式 + @Bean + public AlipayClient alipayClient() throws AlipayApiException { + AlipayClient client = new DefaultAlipayClient(this.gateway, this.appId, this.appPrivateKey, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, PublicKey, AlipayConstants.SIGN_TYPE_RSA2); + return client; + } + +} + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/CorsConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/CorsConfig.java new file mode 100644 index 0000000..c9c2bec --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/CorsConfig.java @@ -0,0 +1,28 @@ +package com.bsz.school_send_back_end.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 全局跨域配置 + * + * + * @author bsz + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + // 覆盖所有请求 + registry.addMapping("/**") + // 允许发送 Cookie + .allowCredentials(true) + // 放行哪些域名(必须用 patterns,否则 * 会和 allowCredentials 冲突) + .allowedOriginPatterns("*") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .exposedHeaders("*"); + } +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/JsonConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/JsonConfig.java new file mode 100644 index 0000000..29d4503 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/JsonConfig.java @@ -0,0 +1,28 @@ +package com.bsz.school_send_back_end.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.boot.jackson.JsonComponent; +import org.springframework.context.annotation.Bean; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; + +/** + * Spring MVC Json 配置 + */ +@JsonComponent +public class JsonConfig { + + /** + * 添加 Long 转 json 精度丢失的配置 + */ + @Bean + public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + SimpleModule module = new SimpleModule(); + module.addSerializer(Long.class, ToStringSerializer.instance); + module.addSerializer(Long.TYPE, ToStringSerializer.instance); + objectMapper.registerModule(module); + return objectMapper; + } +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/Knife4jConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/Knife4jConfig.java new file mode 100644 index 0000000..2428ecb --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/Knife4jConfig.java @@ -0,0 +1,25 @@ +package com.bsz.school_send_back_end.config; + +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +/** + * @author xy + * Springdoc OpenAPI 配置 + * + * http://localhost:6448/swagger-ui/index.html 接口文档地址 + */ +@Configuration +@Profile({"dev", "test"}) // 版本控制访问 +public class Knife4jConfig { + + @Bean + public GroupedOpenApi defaultApi() { + return GroupedOpenApi.builder() + .group("xiaokuaisong") + .packagesToScan("com.bsz.school_send_back_end.controller") // 指定扫描的包路径 + .build(); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/MyBatisPlusConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/MyBatisPlusConfig.java new file mode 100644 index 0000000..450f301 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/MyBatisPlusConfig.java @@ -0,0 +1,27 @@ +package com.bsz.school_send_back_end.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatis Plus 配置 + */ +@Configuration +@MapperScan("com.bsz.school_send_back_end.mapper") +public class MyBatisPlusConfig { + + /** + * 拦截器配置 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 分页插件 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RabbitMQConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RabbitMQConfig.java new file mode 100644 index 0000000..954c0da --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RabbitMQConfig.java @@ -0,0 +1,98 @@ +package com.bsz.school_send_back_end.config; + +import com.bsz.school_send_back_end.contant.RabbitMQConstant; +import org.springframework.amqp.core.*; +import org.springframework.amqp.support.converter.DefaultClassMapper; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class RabbitMQConfig { + + @Bean + public Queue topicQueue1() { + return QueueBuilder.durable(RabbitMQConstant.TOPIC_QUEUE1).build(); + } + + @Bean + public Queue topicQueue2() { + return QueueBuilder.durable(RabbitMQConstant.TOPIC_QUEUE2).build(); + } + @Bean + public Queue orderReplyQueue() { + return QueueBuilder.durable(RabbitMQConstant.ORDER_REPLY_QUEUE).build(); + } + + @Bean + public Exchange topicExchange() { + return ExchangeBuilder.topicExchange(RabbitMQConstant.TOPIC_EXCHANGE).build(); + } + + @Bean + public Exchange responseExchange() { + return ExchangeBuilder.topicExchange(RabbitMQConstant.RESPONSE_EXCHANGE).build(); + } + + @Bean + public Binding topicBinding1() { + return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with("topic.chat").noargs(); + } + + @Bean + public Binding topicBinding2() { + return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with("topic.#").noargs(); + } + + @Bean + public Binding responseBinding() { + return BindingBuilder.bind(orderReplyQueue()).to(responseExchange()).with("response.#").noargs(); + } + + + +// /** +// * 声明一个 **延迟交换机**,类型必须为 `x-delayed-message` +// */ +// @Bean +// public CustomExchange delayedExchange() { +// Map args = new HashMap<>(); +// args.put("x-delayed-type", "direct"); // 交换机类型 +// return new CustomExchange(RabbitMQConstant.DELAYED_EXCHANGE, "x-delayed-message", true, false, args); +// } +// +// /** +// * 声明队列 +// */ +// @Bean +// public Queue delayedQueue() { +// return new Queue(RabbitMQConstant.DELAYED_QUEUE, true); +// } +// +// /** +// * 绑定队列到延迟交换机 +// */ +// @Bean +// public Binding binding(Queue delayedQueue, CustomExchange delayedExchange) { +// return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(RabbitMQConstant.DELAYED_ROUTING_KEY).noargs(); +// } + + @Bean + public MessageConverter jsonToMapMessageConverter() { + DefaultClassMapper defaultClassMapper = new DefaultClassMapper(); + defaultClassMapper.setTrustedPackages("com.bsz.school_send_back_end.utils.MultiDelayMessage"); // trusted packages + Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter(); + jackson2JsonMessageConverter.setClassMapper(defaultClassMapper); + return jackson2JsonMessageConverter; + } + + @Bean + public MessageConverter messageConverter(){ + return new Jackson2JsonMessageConverter(); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RabbitMQConfigProperties.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RabbitMQConfigProperties.java new file mode 100644 index 0000000..89f11ea --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RabbitMQConfigProperties.java @@ -0,0 +1,16 @@ +package com.bsz.school_send_back_end.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "spring.rabbitmq") +@Data +public class RabbitMQConfigProperties { + private String host; + private int port; + private String username; + private String password; + private String virtualHost; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RedisSessionRepositoryConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RedisSessionRepositoryConfig.java new file mode 100644 index 0000000..1097b53 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/RedisSessionRepositoryConfig.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisSessionRepositoryConfig { + + @Bean("springSessionRedisSerializer") + public RedisSerializer getRedisSerializer() + { + return new GenericJackson2JsonRedisSerializer(); + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ + RedisTemplate redisTemplate = new RedisTemplate<>(); + //设置redis的连接工厂对象 + redisTemplate.setConnectionFactory(redisConnectionFactory); + //设置redis key的序列化器 + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new StringRedisSerializer()); + return redisTemplate; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/WebsocketConfig.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/WebsocketConfig.java new file mode 100644 index 0000000..9dbdd41 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/config/WebsocketConfig.java @@ -0,0 +1,31 @@ +package com.bsz.school_send_back_end.config; + + +import com.bsz.school_send_back_end.contant.WebsocketConstant; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@Slf4j +@EnableWebSocketMessageBroker +public class WebsocketConfig implements WebSocketMessageBrokerConfigurer { + + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint(WebsocketConstant.ENDPOINT).setAllowedOriginPatterns(WebsocketConstant.ALLOWED_ORIGINS).withSockJS(); + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + + //基于内存的消息代理 + registry.enableSimpleBroker(WebsocketConstant.SIMPLE_BROKER); + registry.setApplicationDestinationPrefixes(WebsocketConstant.DESTINATION_PREFIXES); + + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/CommonConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/CommonConstant.java new file mode 100644 index 0000000..284fe81 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/CommonConstant.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.contant; + +/** + * 通用常量 + */ +public interface CommonConstant { + + /** + * 升序 + */ + String SORT_ORDER_ASC = "ascend"; + + /** + * 降序 + */ + String SORT_ORDER_DESC = " descend"; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/FileConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/FileConstant.java new file mode 100644 index 0000000..68d5eeb --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/FileConstant.java @@ -0,0 +1,24 @@ +package com.bsz.school_send_back_end.contant; + +/** + * 文件常量 + */ +@SuppressWarnings("all") +public interface FileConstant { + + /** + * COS 访问地址 + */ + String COS_HOST = "xxxxxxxxxxxxxxxxxxxx"; + + /** + * 服务器访问地址 + */ + String SERVER_HOST = "https://xiaoshitong.xyz"; + + /** + * 服务器上传路径 + */ + String SERVER_UPLOAD_DIR = "/www/wwwroot/images"; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RabbitMQConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RabbitMQConstant.java new file mode 100644 index 0000000..cfe684d --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RabbitMQConstant.java @@ -0,0 +1,84 @@ +package com.bsz.school_send_back_end.contant; + +import java.util.List; + +public interface RabbitMQConstant { + + /** + * 聊天 + */ + String TOPIC_QUEUE1 = "topic.chat"; + + /** + * 商家 + */ + String TOPIC_QUEUE2 = "topic.order"; + + /** + * 跑腿 + */ + String TOPIC_QUEUE3 = "topic.errand"; + + /** + * 交换机 + */ + String TOPIC_EXCHANGE = "topicExchage"; + + /** + * 请求响应交换机,用于处理用户和商家之间的异步响应 + */ + String RESPONSE_EXCHANGE = "responseExchange"; + + /** + * 订单响应队列,商家处理完成订单后,可以发送响应消息到这个队列 + */ + String ORDER_REPLY_QUEUE = "orderReplyQueue"; + +// // 交换机名称 +// String DELAYED_EXCHANGE = "delayed.exchange"; +// // 队列名称 +// String DELAYED_QUEUE = "delayed.queue"; +// // 路由键 +// String DELAYED_ROUTING_KEY = "delayed.routingKey"; + + // List DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 300000L, 600000L, 600000L)); + + // 堂食订单取消(3分钟) + List DINE_IN_DELAY_MILLIS = List.of(30000L, 30000L, 30000L, 30000L, 30000L, 30000L); + + // 外卖订单退款(30分钟,多次检查) + List DELIVERY_DELAY_MILLIS = List.of(600000L, 1200000L, 1800000L); + + // 取消订单相关常量 + String CANCEL_ORDER_EXCHANGE = "cancel_order_exchange"; // 取消订单交换机 + String CANCEL_ORDER_QUEUE = "cancel_order_queue"; // 取消订单队列 + String CANCEL_ORDER_ROUTING_KEY = "cancel_order_key"; // 取消订单路由键 + // 外卖单相关常量 + String DELIVERY_DELAY_EXCHANGE = "delivery_exchange"; // 外卖单交换机 + String DELIVERY_ORDER_QUEUE = "delivery_queue"; // 外卖单队列 + String DELIVERY_ORDER_ROUTING_KEY = "delivery_key"; // 外卖单路由键 + + +// String DELAY_COUPON_QUEUE = "coupon.delay.queue"; +// +// String DELAY_COUPON_ROUTING_KEY = "coupon.key"; +// +// String DELAY_USER_COUPON_QUEUE = "userCoupon.delay.queue"; +// +// String DELAY_USER_COUPON_ROUTING_KEY = "userCoupon.key"; +// +// String DELAY_ADVANCE_ORDER_QUEUE = "advanceOrder.delay.queue"; +// +// String DELAY_ADVANCE_ROUTING_KEY = "advanceOrder.key"; +// +// String DELAY_CLOTHES_RENT_ORDER_QUEUE = "clothesRentOrder.delay.queue"; +// +// String DELAY_CLOTHES_RENT_ORDER_ROUTING_KEY = "clothesRentOrder.key"; +// +// String DELAY_CLOTHES_RENT_PERIOD_QUEUE = "clothesRentPeriod.delay.queue"; +// +// String DELAY_CLOTHES_RENT_PERIOD_ROUTING_KEY = "clothesRentPeriod.key"; +// + + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RedisKeyConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RedisKeyConstant.java new file mode 100644 index 0000000..638f00e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RedisKeyConstant.java @@ -0,0 +1,17 @@ +package com.bsz.school_send_back_end.contant; + +public interface RedisKeyConstant { + // IP 和 sessionId 的 key 前缀 + String USER_EXTRA_INFO = "user:extra:"; + // Spring Session 中 session 信息的后缀(sessionId 前面) + String SESSION_KEY_POSTFIX = "sessions"; + // session 中保存的属性的前缀 + String SESSION_ATTRIBUTE_PREFIX = "sessionAttr"; + /** + * 用户登录态键 + */ + String USER_LOGIN_STATE = "xiaokuaisong_user"; + String IP = "ip"; + String SESSION_ID = "sessionId"; + String APPNAME = "appName"; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RegexConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RegexConstant.java new file mode 100644 index 0000000..19dd907 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/RegexConstant.java @@ -0,0 +1,32 @@ +package com.bsz.school_send_back_end.contant; + +/** + * 正则表达式常量 + */ +@SuppressWarnings("all") +public interface RegexConstant { + /** + * 手机号正则 + */ + String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$"; + + /** + * 邮箱正则 + */ + String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"; + + /** + * 18位身份证号正则 + */ + String ID_CARD_REGEX = "^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9xX]$"; + + /** + * 验证码正则, 6位数字或字母 + */ + String VERIFY_CODE_REGEX = "^[a-zA-Z\\d]{6}$"; + + /** + * 密码正则。4~32位的字母、数字、下划线 + */ + String PASSWORD_REGEX = "^\\w{4,32}$"; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/SystemLogConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/SystemLogConstant.java new file mode 100644 index 0000000..53e0c41 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/SystemLogConstant.java @@ -0,0 +1,37 @@ +package com.bsz.school_send_back_end.contant; + +/** + * 系统日志通用常量 + */ +public interface SystemLogConstant { + + /** + * 添加菜品 + */ + String ADD_DISHES = "添加菜品"; + + /** + * 删除菜品 + */ + String DELETE_DISHES = "删除菜品"; + + /** + * 修改菜品 + */ + String UPDATE_DISHES = "修改菜品"; + + /** + * 删除菜品分组 + */ + String ADD_DISHES_GROUP = "添加菜品分组"; + + /** + * 删除菜品分组 + */ + String DELETE_DISHES_GROUP = "删除菜品分组"; + + /** + * 修改菜品分组 + */ + String UPDATE_DISHES_GROUP = "修改菜品分组"; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/UserConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/UserConstant.java new file mode 100644 index 0000000..b06e30e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/UserConstant.java @@ -0,0 +1,84 @@ +package com.bsz.school_send_back_end.contant; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.Set; + +import static java.util.Map.entry; + +/** + * 用户常量 + */ +public interface UserConstant { + + /** + * 盐值 + */ + String USER_SALT = "bsz"; + + // ------- 权限 -------- + + /** + * 默认角色 + */ + String DEFAULT_ROLE = "user"; + + /** + * 商家角色 + */ + String BUSINESS_ROLE = "business"; + + /** + * 管理员角色 + */ + String ADMIN_ROLE = "admin"; + + /** + * 跑腿角色 + */ + String ERRAND_ROLE = "errand"; + /** + * Boss + */ + String BOSS_ROLE = "boss"; + + /** + * 被封号 + */ + String BAN_ROLE = "ban"; + + /** + * 配送地址 + */ + Set VALID_LOCATIONS = Set.of("1公寓", "2公寓", "3公寓","4公寓","5公寓","6公寓", + "7公寓","8公寓","9公寓","10公寓","11公寓","12公寓","育才大厦"); + + /** + * 公寓配送费 + */ + Map DELIVERY_FEE_MAP = Map.ofEntries( + entry("1公寓", new BigDecimal("1.7")), + entry("2公寓", new BigDecimal("1.7")), + entry("11公寓", new BigDecimal("1.7")), + entry("12公寓", new BigDecimal("1.7")), + entry("5公寓", new BigDecimal("1.2")), + entry("6公寓", new BigDecimal("1.2")), + entry("7公寓", new BigDecimal("1.2")), + entry("3公寓", new BigDecimal("2.3")), + entry("4公寓", new BigDecimal("2.3")), + entry("9公寓", new BigDecimal("2.3")), + entry("10公寓", new BigDecimal("2.3")), + entry("8公寓", new BigDecimal("2.3")), + entry("育才大厦", new BigDecimal("2.5")) + ); + + /** + * 默认等级 + */ + int DEFAULT_LEVEL = 1; + + /** + * 默认平均分 + */ + double DEFAULT_AVG_SCORE = 1.0; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/WebsocketConstant.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/WebsocketConstant.java new file mode 100644 index 0000000..cd9f688 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/contant/WebsocketConstant.java @@ -0,0 +1,10 @@ +package com.bsz.school_send_back_end.contant; + +public interface WebsocketConstant { + + //websocket + public static final String ENDPOINT = "/ws/xiaokuaisong"; + public static final String ALLOWED_ORIGINS = "*"; + public static final String SIMPLE_BROKER = "/topic"; + public static final String DESTINATION_PREFIXES = "/ClientToServer"; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/AIController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/AIController.java new file mode 100644 index 0000000..a342343 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/AIController.java @@ -0,0 +1,34 @@ +package com.bsz.school_send_back_end.controller; + +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; + +import java.time.LocalDate; + +@Tag(name = "ai接口") +@RestController +@RequestMapping("/ai") +public class AIController { + + @Resource + private ChatClient chatClient; + + @GetMapping(value = "/chat/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public Flux generateStreamAsString(@RequestParam(value = "message", defaultValue = "介绍自己") String message) { + Flux content = this.chatClient.prompt() + .system(promptSystemSpec -> promptSystemSpec.param("current_date", LocalDate.now().toString())) + .advisors(advisorSpec -> advisorSpec.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY,100)) + .user(message) + .stream() + .content(); + return content.concatWith(Flux.just("[complete]")); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BillController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BillController.java new file mode 100644 index 0000000..7455a21 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BillController.java @@ -0,0 +1,72 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.model.domain.Errand; +import com.bsz.school_send_back_end.model.domain.ErrandBill; +import com.bsz.school_send_back_end.model.domain.OrderRefunds; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.service.ErrandBillService; +import com.bsz.school_send_back_end.service.ErrandService; +import com.bsz.school_send_back_end.service.OrdersService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.*; +import java.util.stream.Collectors; + +@Tag(name = "跑腿流水接口") +@RestController +@RequestMapping("/bill") +@Slf4j +public class BillController { + + @Resource + private ErrandService errandService; + + @Resource + private ErrandBillService billService; + + @Resource + private OrdersService ordersService; + + /** + * 跑腿查询自己的账单 + * @param request 网路请求 + * @return 账单列表 + */ + @PostMapping("/list") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse> listBillByErrand(HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Orders::getErrandId, loginErrand.getId()); + List ordersList = ordersService.list(wrapper); + + // 如果订单列表为空,直接返回空结果 + if (ordersList.isEmpty()) { + return ResultUtils.success(Collections.emptyList()); + } + List orderIds = ordersList.stream() + .map(Orders::getId) + .collect(Collectors.toList()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(ErrandBill::getOrderId, orderIds); + queryWrapper.orderByDesc(ErrandBill::getOrderStartTime);// 按 orderStartTime 降序排序 + + List bills = billService.list(queryWrapper); + + return ResultUtils.success(bills); + } + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BusinessController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BusinessController.java new file mode 100644 index 0000000..821f463 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BusinessController.java @@ -0,0 +1,246 @@ +package com.bsz.school_send_back_end.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.BusinessAuth; +import com.bsz.school_send_back_end.model.domain.Collect; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.business.BusinessAddRequest; +import com.bsz.school_send_back_end.model.dto.business.BusinessQueryRequest; +import com.bsz.school_send_back_end.model.dto.business.BusinessUpdateMyRequest; +import com.bsz.school_send_back_end.model.dto.business.BusinessUpdateRequest; +import com.bsz.school_send_back_end.model.vo.BusinessAdminVO; +import com.bsz.school_send_back_end.model.vo.BusinessVO; +import com.bsz.school_send_back_end.service.BusinessAuthService; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.CollectService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jdk.jfr.Timestamp; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.util.DigestUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.List; + +import static com.bsz.school_send_back_end.contant.UserConstant.DEFAULT_ROLE; +import static com.bsz.school_send_back_end.contant.UserConstant.USER_SALT; + +/** + * 商家接口 + */ +@Tag(name = "商家接口") +@Slf4j +@RestController +@RequestMapping("/business") +public class BusinessController { + + @Resource + private BusinessService businessService; + + @Resource + private BusinessAuthService businessAuthService; + + @Resource + private UserService userService; + + @Resource + private CollectService collectService; + + @PostMapping("/add") + public BaseResponse addBusiness(@RequestBody BusinessAddRequest businessAddRequest) { + + ThrowUtils.throwIf(businessAddRequest == null,ErrorCode.PARAMS_ERROR); + + User user = new User(); + BeanUtils.copyProperties(businessAddRequest, user); + Business business = new Business(); + BeanUtils.copyProperties(businessAddRequest, business); + BusinessAuth businessAuth = new BusinessAuth(); + BeanUtils.copyProperties(businessAddRequest, businessAuth); + + //对每个应该校验的业务进行校验 + userService.validUser(user, true); + businessService.validBusiness(business, true); + businessService.validBusinessAuth(businessAuth, true); + + //加密 + String encryptPassword = DigestUtils.md5DigestAsHex((USER_SALT + user.getUserPassword()).getBytes()); + user.setUserPassword(encryptPassword); + + //更改用户权限为商家 + user.setUserRole("business"); + + //往user表中补充商家信息 + user.setUsername(business.getBusinessName()); + user.setAvatarUrl(business.getBusinessAvatar()); + user.setPhone(business.getBusinessPhone()); + + //插入到表中 + businessService.addBusiness(user, business, businessAuth); + + return ResultUtils.success(business.getId(),"添加商家成功"); + + } + + /** + * 管理员更新商家 + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse updateBusiness (@RequestBody BusinessUpdateRequest businessUpdateRequest) { + if (businessUpdateRequest == null || businessUpdateRequest.getId() == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "传入参数为空"); + } + + Business business = new Business(); + + BeanUtils.copyProperties(businessUpdateRequest, business); + //更新不添加 只需要判断修改符不符合逻辑 + businessService.validBusiness(business, false); + + boolean updateById = businessService.updateById(business); + + ThrowUtils.throwIf(!updateById, ErrorCode.OPERATION_ERROR); + + return ResultUtils.success(true); + } + + /** + * 商家更新个人信息 + */ + @PostMapping("/update/my") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse updateMyBusiness (@RequestBody BusinessUpdateMyRequest businessUpdateMyRequest, HttpServletRequest request) { + + if (businessUpdateMyRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + // 获取当前登录商家信息 + Business loginBusiness = businessService.getLoginBusiness(request); + ThrowUtils.throwIf(loginBusiness == null, ErrorCode.NOT_FOUND_ERROR); + Business business = new Business(); + business.setId(loginBusiness.getId()); + business.setUserId(loginBusiness.getUserId()); + BeanUtils.copyProperties(businessUpdateMyRequest, business); + // 校验 + businessService.validBusiness(business, false); + // 修改商家信息 + boolean updateBusiness = businessService.updateById(business); + ThrowUtils.throwIf(!updateBusiness, ErrorCode.OPERATION_ERROR, "修改商家信息失败"); + // 修改用户信息 + User loginUser = userService.getById(loginBusiness.getUserId()); + if (StringUtils.isNotBlank(business.getBusinessName())) { + loginUser.setUsername(business.getBusinessName()); + } + if (StringUtils.isNotBlank(business.getBusinessPhone())) { + loginUser.setPhone(business.getBusinessPhone()); + } + boolean updateUser = userService.updateById(loginUser); + ThrowUtils.throwIf(!updateUser, ErrorCode.OPERATION_ERROR, "修改用户信息失败"); + return ResultUtils.success(true); + } + + /** + * 根据id查询 + */ + @GetMapping("/getById") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse getBusinessById(@RequestParam Long id) { + if (id <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Business business = businessService.getById(id); + + ThrowUtils.throwIf(business == null , ErrorCode.NULL_ERROR); + + BusinessAdminVO businessAdminVO = businessAuthService.getBusinessAdminVO(business); + + return ResultUtils.success(businessAdminVO); + } + + /** + * 根据当前登录用户获取商家信息 + */ + @PostMapping("/get/current") + public BaseResponse getByBusiness (HttpServletRequest request) { + Business loginBusiness = businessService.getLoginBusiness(request); + BusinessVO businessVO = businessService.getBusinessVO(loginBusiness); + return ResultUtils.success(businessVO); + } + /** + * 查询所有商家 + */ + @PostMapping("/list") + public BaseResponse> listBusinessAll(){ + List business = businessService.findAllBusiness(); + return new BaseResponse<>(0,business,"查询成功"); + } + + + /** + * 分页查询 + */ + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> listBusinessByPage (@RequestBody BusinessQueryRequest businessQueryRequest) { + Page businessPage = businessService.page(new Page<>(businessQueryRequest.getCurrent(), businessQueryRequest.getPageSize()), + businessService.getQueryWrapper(businessQueryRequest)); + return ResultUtils.success(businessPage); + + } + + /** + * 分页获取商家列表(用户视图) + */ + @PostMapping("/list/page/vo") + public BaseResponse> listBusinessVOByPage(@RequestBody BusinessQueryRequest businessQueryRequest) { + long current = businessQueryRequest.getCurrent(); + long size = businessQueryRequest.getPageSize(); + + ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); + QueryWrapper queryWrapper = businessService.getQueryWrapper(businessQueryRequest); + Page businessPage = businessService.page(new Page<>(current, size), queryWrapper); + Page businessVOPage = new Page<>(current, size, businessPage.getTotal()); + List businessVOList = businessService.getBusinessVO(businessPage.getRecords()); + businessVOPage.setRecords(businessVOList); + return ResultUtils.success(businessVOPage); + } + + @GetMapping("/my/getById") + @AuthCheck(mustRole = DEFAULT_ROLE) + public BaseResponse getBusinessVO (@RequestParam Long businessId, HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Business::getId, businessId); + long count = businessService.count(queryWrapper); + ThrowUtils.throwIf(count != 1, ErrorCode.PARAMS_ERROR, "商家id不正确"); + Business business = businessService.getOne(queryWrapper); + BusinessVO businessVO = businessService.getBusinessVO(business); + long collect = collectService.count(Wrappers.lambdaQuery() + .eq(Collect::getUserId, loginUser.getId()) + .eq(Collect::getBusinessId, businessId)); + businessVO.setIsCollected(collect > 0); + return ResultUtils.success(businessVO); + } + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BusinessInfoController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BusinessInfoController.java new file mode 100644 index 0000000..7f0e155 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/BusinessInfoController.java @@ -0,0 +1,150 @@ +package com.bsz.school_send_back_end.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Businessinfo; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.businessinfo.InfoAddRequest; +import com.bsz.school_send_back_end.model.dto.businessinfo.InfoQueryRequest; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.BusinessinfoService; +import com.github.houbb.sensitive.word.core.SensitiveWordHelper; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +@Tag(name = "商家公告接口") +@RestController +@Slf4j +@RequestMapping("/businessInfo") +public class BusinessInfoController { + + @Resource + private BusinessinfoService businessinfoService; + + @Resource + private BusinessService businessService; + + /** + * 添加公告 + * @param addRequest 添加请求体 + * @param request 网络请求 + * @return 是否添加成功 + */ + @PostMapping("/add") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse addInfo (@RequestBody InfoAddRequest addRequest, HttpServletRequest request) { + if ( addRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Business loginBusiness = businessService.getLoginBusiness(request); + Businessinfo businessinfo = new Businessinfo(); + String content = addRequest.getContent(); + boolean contains = SensitiveWordHelper.contains(content); + ThrowUtils.throwIf(contains, ErrorCode.PARAMS_ERROR, "公告含有违禁词"); + BeanUtils.copyProperties(addRequest, businessinfo); + businessinfo.setBusinessId(loginBusiness.getId()); + boolean save = businessinfoService.save(businessinfo); + ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR, "添加公告失败"); + return ResultUtils.success(true); + } + + /** + * 删除公告 + * @param commonRequest 删除请求体 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/delete") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse deleteInfo (@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + Long id = commonRequest.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Businessinfo::getId, id); + queryWrapper.eq(Businessinfo::getBusinessId, businessId); + long count = businessinfoService.count(queryWrapper); + ThrowUtils.throwIf(count != 1, ErrorCode.SYSTEM_ERROR, "当前公告未找到"); + boolean remove = businessinfoService.remove(queryWrapper); + ThrowUtils.throwIf(!remove, ErrorCode.SYSTEM_ERROR, "删除失败"); + return ResultUtils.success(true); + } + + /** + * 查询公告列表 (仅商家) + * @param request 网络请求 + * @return 查询列表 + */ + @PostMapping("/list/my") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse> selectMyInfo (HttpServletRequest request) { + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Businessinfo::getBusinessId, businessId); + queryWrapper.orderByDesc(Businessinfo::getCreateTime); + List list = businessinfoService.list(queryWrapper); + + return ResultUtils.success(list, "查询成功"); + } + + /** + * 查询公列表(仅管理员, 分页) + * @param infoQueryRequest 查询请求体 + * @return 查询列表 + */ + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> selectInfoByPage (@RequestBody InfoQueryRequest infoQueryRequest) { + if (infoQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + long current = infoQueryRequest.getCurrent(); + long pageSize = infoQueryRequest.getPageSize(); + + QueryWrapper queryWrapper = businessinfoService.getQueryWrapper(infoQueryRequest); + Page page = businessinfoService.page(new Page<>(current, pageSize), queryWrapper); + return ResultUtils.success(page, "查询成功"); + } + + + /** + * 用户查询商家最新公告 + * @return 查询列表 + */ + @PostMapping("/list") + public BaseResponse selectInfo (@RequestBody CommonRequest commonRequest) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long businessId = commonRequest.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Businessinfo::getBusinessId, businessId); + queryWrapper.orderByDesc(Businessinfo::getCreateTime); + queryWrapper.last("LIMIT 1"); + Businessinfo businessinfo = businessinfoService.getOne(queryWrapper); + return ResultUtils.success(businessinfo, "查询成功"); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CartController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CartController.java new file mode 100644 index 0000000..26b1834 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CartController.java @@ -0,0 +1,184 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Cart; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.cart.CartAddRequest; +import com.bsz.school_send_back_end.model.dto.cart.CartDeleteRequest; +import com.bsz.school_send_back_end.model.dto.cart.CartQueryRequest; +import com.bsz.school_send_back_end.model.dto.cart.CartUpdateRequest; +import com.bsz.school_send_back_end.model.vo.CartVO; +import com.bsz.school_send_back_end.service.CartService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +@Tag(name = "购物车接口") +@RestController +@Slf4j +@RequestMapping("/cart") +public class CartController { + + @Resource + private CartService cartService; + + @Resource + private UserService userService; + + /** + * 添加剂购物车 + * @param cartAddRequest 添加请求 + * @param request 网络请求 + * @return 购物车id + */ + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + public BaseResponse addCart (@RequestBody CartAddRequest cartAddRequest, HttpServletRequest request) { + if (cartAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + //校验 + cartService.validCart(cartAddRequest); + //添加菜品到购物车 + Long cart = cartService.addCart(cartAddRequest, request); + return ResultUtils.success(cart); + } + + /** + * 更新购物车 + * @param cartUpdateRequest 更新请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/update") + @Transactional(rollbackFor = Exception.class) + public BaseResponse updateCart (@RequestBody CartUpdateRequest cartUpdateRequest, HttpServletRequest request){ + if (cartUpdateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + //校验 + CartAddRequest cartAddRequest = new CartAddRequest(); + BeanUtils.copyProperties(cartUpdateRequest,cartAddRequest); + cartService.validCart(cartAddRequest); + + Boolean cart = cartService.updateCart(cartUpdateRequest, request); + return ResultUtils.success(cart); + } + + /** + * 删除购物车 + * @param cartDeleteRequest 删除请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/delete") + @Transactional(rollbackFor = Exception.class) + public BaseResponse deleteCart (@RequestBody CartDeleteRequest cartDeleteRequest, HttpServletRequest request) { + if (cartDeleteRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Long id = cartDeleteRequest.getId(); + Boolean cart = cartService.deleteCart(id, request); + ThrowUtils.throwIf(!cart, ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true); + } + + /** + * 根据商户id获取购物车脱敏列表 + * @param cartQueryRequest 商户id + * @param request 网络请求 + * @return 脱敏列表 + */ + @PostMapping("/selectByBusinessId") + public BaseResponse> selectByBusinessId (@RequestBody CartQueryRequest cartQueryRequest, HttpServletRequest request) { + if (cartQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Long businessId = cartQueryRequest.getId(); + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Cart::getBusinessId, businessId); + queryWrapper.eq(Cart::getUserId, userId); + List cartList = cartService.list(queryWrapper); + List cartVOList = cartService.getCartVOList(cartList); + return ResultUtils.success(cartVOList); + } + + /** + * 根据用户查找购物车列表 + * @param request 网络请求 + * @return 脱敏列表 + */ + @PostMapping("/selectByUserId") + public BaseResponse> selectByUserId (HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Cart::getUserId, userId); + + List cartList = cartService.list(wrapper); + List cartVOList = cartService.getCartVOList(cartList); + return ResultUtils.success(cartVOList); + } + + /** + * 清空商家内的购物车 + * @param cartQueryRequest 商家id + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/empty/business") + public BaseResponse emptyBusinessCart(@RequestBody CartQueryRequest cartQueryRequest, HttpServletRequest request) { + if (cartQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Long businessId = cartQueryRequest.getId(); + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Cart::getBusinessId, businessId); + queryWrapper.eq(Cart::getUserId, userId); + boolean remove = cartService.remove(queryWrapper); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR); + + return ResultUtils.success(true); + } + + /** + * 清空用户购物车 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/empty/user") + public BaseResponse emptyUserCart(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Cart::getUserId, userId); + boolean remove = cartService.remove(queryWrapper); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR); + + return ResultUtils.success(true); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CategoryController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CategoryController.java new file mode 100644 index 0000000..d3fee30 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CategoryController.java @@ -0,0 +1,120 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Category; +import com.bsz.school_send_back_end.model.dto.category.CategoryAddRequest; +import com.bsz.school_send_back_end.model.dto.category.CategoryDeleteRequest; +import com.bsz.school_send_back_end.model.dto.category.CategoryUpdateRequest; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.CategoryService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.util.List; + +@Tag(name = "餐厅接口") +@Slf4j +@RestController +@RequestMapping("/category") +public class CategoryController { + + @Resource + private CategoryService categoryService; + + @Resource + private BusinessService businessService; + + /** + * 添加类别 + * @param categoryAddRequest 添加请求体 + * @return 是否成功 + */ + @PostMapping("/add") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse addCategory (@RequestBody CategoryAddRequest categoryAddRequest) { + if (categoryAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Category category = new Category(); + BeanUtils.copyProperties(categoryAddRequest, category); + categoryService.validCategory(category, true); + boolean save = categoryService.save(category); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR); + Long id = category.getId(); + return ResultUtils.success(id,"添加成功"); + } + + /** + * 修改类别 + * @param categoryUpdateRequest 修改请求体 + * @return 返回修改后类别 + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse updateCategory (@RequestBody CategoryUpdateRequest categoryUpdateRequest) { + if (categoryUpdateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Category category = new Category(); + BeanUtils.copyProperties(categoryUpdateRequest, category); + categoryService.validCategory(category, false); + boolean update = categoryService.updateById(category); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "操作失败"); + + return new BaseResponse<>(0,category,"修改成功"); + } + + /** + * 根据id删除 + * @param categoryDeleteRequest 删除请求体 + * @return 是否成功 + */ + @PostMapping("/delete") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse deleteCategory (@RequestBody CategoryDeleteRequest categoryDeleteRequest) { + if (categoryDeleteRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Business::getCategoryId, categoryDeleteRequest.getId()); + long count = businessService.count(wrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "该分类下拥有商家"); + boolean remove = categoryService.removeById(categoryDeleteRequest.getId()); + return ResultUtils.success(remove); + } + + /** + * 根据id查询分类 + */ + @GetMapping("/getById") + public BaseResponse getCategoryById (long id) { + if (id <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Category category = categoryService.getById(id); + ThrowUtils.throwIf(category == null, ErrorCode.NOT_FOUND_ERROR); + return ResultUtils.success(category); + } + + /** + * 查询类别 + */ + @GetMapping("/list") + public BaseResponse> listCategoryAll() { + List categoryList = categoryService.list(); + return ResultUtils.success(categoryList); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CollectController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CollectController.java new file mode 100644 index 0000000..c53336c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/CollectController.java @@ -0,0 +1,102 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Collect; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.collect.CollectAddRequest; +import com.bsz.school_send_back_end.model.vo.CollectVO; +import com.bsz.school_send_back_end.service.CollectService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; + +@Tag(name = "收藏接口") +@RestController +@Slf4j +@RequestMapping("/collect") +public class CollectController { + + @Resource + private CollectService collectService; + + @Resource + private UserService userService; + + /** + * 添加收藏 + */ + @PostMapping("/add") + public BaseResponse addCollect(@RequestBody CollectAddRequest collectAddRequest, HttpServletRequest request) { + if (collectAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + collectService.validCollect(collectAddRequest); + Collect collect = new Collect(); + BeanUtils.copyProperties(collectAddRequest, collect); + Boolean result = collectService.addCollect(collect, request); + ThrowUtils.throwIf(!result, ErrorCode.SYSTEM_ERROR); + return ResultUtils.success(true); + } + + /** + * 删除一条收藏 + */ + @PostMapping("/delete") + public BaseResponse deleteCollect(@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long id = commonRequest.getId(); + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Collect::getUserId, userId); + wrapper.eq(Collect::getBusinessId, id); + boolean remove = collectService.remove(wrapper); + ThrowUtils.throwIf(!remove, ErrorCode.SYSTEM_ERROR); + return ResultUtils.success(true); + } + + /** + * 删除所有收藏 + */ + @PostMapping("/delete/all") + public BaseResponse deleteCollectAll(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long loginUserId = loginUser.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Collect::getUserId, loginUserId); + boolean remove = collectService.remove(wrapper); + ThrowUtils.throwIf(!remove, ErrorCode.SYSTEM_ERROR); + return ResultUtils.success(true); + } + + /** + * 查询所有收藏 + */ + @PostMapping("/list") + public BaseResponse> listCollect(HttpServletRequest request) { + List collectList = collectService.getCollectList(request); + + if (collectList == null) { + collectList = new ArrayList<>(); + } + return ResultUtils.success(collectList); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/DishesController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/DishesController.java new file mode 100644 index 0000000..6ac1396 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/DishesController.java @@ -0,0 +1,209 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.annotation.SystemLog; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.SystemLogConstant; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.dto.Dishes.DishesAddRequest; +import com.bsz.school_send_back_end.model.dto.Dishes.DishesDeleteRequest; +import com.bsz.school_send_back_end.model.dto.Dishes.DishesQueryRequest; +import com.bsz.school_send_back_end.model.dto.Dishes.DishesUpdateRequest; +import com.bsz.school_send_back_end.model.vo.DishesVO; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.DishesService; +import com.bsz.school_send_back_end.service.SpecificationsDishesService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +@Tag(name = "菜品接口") +@Slf4j +@RestController +@RequestMapping("/dishes") +public class DishesController { + @Resource + private DishesService dishesService; + + @Resource + private BusinessService businessService; + + @Resource + private SpecificationsDishesService specificationsDishesService; + + /** + *添加菜品 + * @param dishesAddRequest 添加菜品请求体 + * @return 是否成功 + */ + @PostMapping("/add") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @Transactional(rollbackFor = Exception.class) + @SystemLog(executeStep = SystemLogConstant.ADD_DISHES) + public BaseResponse addDishes (@RequestBody DishesAddRequest dishesAddRequest, HttpServletRequest request) { + if (dishesAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Dishes dishes = new Dishes(); + BeanUtils.copyProperties(dishesAddRequest,dishes); + //校验 + dishesService.validDishes(dishes,false); + //添加商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + dishes.setBusinessId(businessId); + //保存菜品信息 + Long dishesId = dishesService.addDishes(dishes); + //中间表中添加数据 + List specificationsIds = dishesAddRequest.getSpecificationsIds(); + specificationsDishesService.add(dishesId,specificationsIds); + return ResultUtils.success(true); + } + + /** + * 删除菜品 + * @param dishesDeleteRequest 删除请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/delete") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @Transactional(rollbackFor = Exception.class) + @SystemLog(executeStep = SystemLogConstant.DELETE_DISHES) + public BaseResponse deleteDishes(@RequestBody DishesDeleteRequest dishesDeleteRequest,HttpServletRequest request) { + if (dishesDeleteRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long dishesId = dishesDeleteRequest.getId(); + //获取商家id + Business business = businessService.getLoginBusiness(request); + Long businessId = business.getId(); + //校验菜品是不是当前登录商家的 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Dishes::getId, dishesId); + wrapper.eq(Dishes::getBusinessId, businessId); + Dishes dishes = dishesService.getOne(wrapper); + ThrowUtils.throwIf(dishes == null, ErrorCode.OPERATION_ERROR, "当前商家无权限删除该菜品"); + //删除菜品 + boolean dishesRemove = dishesService.removeById(dishesId); + ThrowUtils.throwIf(!dishesRemove, ErrorCode.OPERATION_ERROR); + //删除中间表信息 + specificationsDishesService.deleteByDishesId(dishesId); + return ResultUtils.success(true); + } + + /** + * 更新菜品 + * @param dishesUpdateRequest 更新请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @Transactional(rollbackFor = Exception.class) + @SystemLog(executeStep = SystemLogConstant.UPDATE_DISHES) + public BaseResponse updateDishes (@RequestBody DishesUpdateRequest dishesUpdateRequest, HttpServletRequest request) { + if (dishesUpdateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Dishes dishes = new Dishes(); + BeanUtils.copyProperties(dishesUpdateRequest, dishes); + //校验 + dishesService.validDishes(dishes, true); + //添加商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + dishes.setBusinessId(businessId); + //更新菜品 + Boolean updateDishes = dishesService.updateDishes(dishes); + ThrowUtils.throwIf(!updateDishes, ErrorCode.OPERATION_ERROR); + //更新中间表的信息 + Long dishesId = dishes.getId(); + List specificationsIds = dishesUpdateRequest.getSpecificationsIds(); + return ResultUtils.success(specificationsDishesService.updateByDishesId(dishesId, specificationsIds)); + } + + /** + * 更新菜品状态 + * @param dishesUpdateRequest 菜品请求体 + * @param request 前端请求 + * @return 是否成功 + */ + @PostMapping("/update/status") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @SystemLog(executeStep = SystemLogConstant.UPDATE_DISHES) + public BaseResponse updateDishesStatus (@RequestBody DishesUpdateRequest dishesUpdateRequest, HttpServletRequest request) { + Long id = dishesUpdateRequest.getId(); + String status = dishesUpdateRequest.getStatus(); + if (id == null || StringUtils.isBlank(status)) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "请补全参数"); + } + //获取商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + //更新状态 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(Dishes::getId, id); + wrapper.eq(Dishes::getBusinessId, businessId); + wrapper.set(Dishes::getStatus, status); + return ResultUtils.success(dishesService.update(wrapper)); + } + + /** + *获取菜品脱敏列表 + * @param dishesQueryRequest 查询请求体 + * @return 脱敏列表 + */ + @PostMapping("/list/dishes") + public BaseResponse> dishesList(@RequestBody DishesQueryRequest dishesQueryRequest) { + Long businessId = dishesQueryRequest.getBusinessId(); + if (businessId == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + //获取查询条件 + QueryWrapper wrapper = dishesService.getWrapper(dishesQueryRequest); + //根据查询条件该商家的所有菜品 + List list = dishesService.list(wrapper); + //获取菜品脱敏列表 + return ResultUtils.success(list); + } + + /** + *获取菜品脱敏列表 + * @param dishesQueryRequest 查询请求体 + * @return 分页列表 + */ + @PostMapping("/list/page/dishesVO") + public BaseResponse> dishesVOPage(@RequestBody DishesQueryRequest dishesQueryRequest) { + long current = dishesQueryRequest.getCurrent(); + long pageSize = dishesQueryRequest.getPageSize(); + //获取查询条件 + QueryWrapper wrapper = dishesService.getWrapper(dishesQueryRequest); + //获取商家多有菜品 + Page dishesPage = dishesService.page(new Page<>(current, pageSize), wrapper); + //获取脱敏信息列表 + List dishesList = dishesPage.getRecords(); + long total = dishesPage.getTotal(); + List dishesVOList = dishesService.getDishesVOList(dishesList); + Page dishesVOPage = new Page<>(current, pageSize, total); + dishesVOPage.setRecords(dishesVOList); + return ResultUtils.success(dishesVOPage); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/DishesGroupController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/DishesGroupController.java new file mode 100644 index 0000000..2b7bf3b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/DishesGroupController.java @@ -0,0 +1,158 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.annotation.SystemLog; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.SystemLogConstant; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.domain.DishesGroup; +import com.bsz.school_send_back_end.model.dto.DishesGroup.DishesGroupAddRequest; +import com.bsz.school_send_back_end.model.dto.DishesGroup.DishesGroupDeleteRequest; +import com.bsz.school_send_back_end.model.dto.DishesGroup.DishesGroupQueryRequest; +import com.bsz.school_send_back_end.model.dto.DishesGroup.DishesGroupUpdateRequest; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.DishesGroupService; +import com.bsz.school_send_back_end.service.DishesService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +@Tag(name = "菜品分组接口") +@Slf4j +@RestController +@RequestMapping("/dishesGroup") +public class DishesGroupController { + @Resource + private BusinessService businessService; + + @Resource + private DishesGroupService dishesGroupService; + + @Resource + private DishesService dishesService; + + /** + * 添加菜品分组 + * @param dishesGroupAddRequest 添加请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/add") + @Transactional(rollbackFor = Exception.class) + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @SystemLog(executeStep = SystemLogConstant.ADD_DISHES_GROUP) + public BaseResponse addDishesGroup(@RequestBody DishesGroupAddRequest dishesGroupAddRequest, HttpServletRequest request) { + if (dishesGroupAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + + DishesGroup dishesGroup = new DishesGroup(); + BeanUtils.copyProperties(dishesGroupAddRequest,dishesGroup); + //校验请求体 + dishesGroupService.validDishesGroup(dishesGroup,false); + //添加分组 + Boolean result = dishesGroupService.addDishesGroup(dishesGroup, request); + ThrowUtils.throwIf(!result,ErrorCode.OPERATION_ERROR); + + return ResultUtils.success(true); + } + + /** + * 删除菜品分组 + * @param dishesGroupDeleteRequest 删除请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/delete") + @Transactional(rollbackFor = Exception.class) + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @SystemLog(executeStep = SystemLogConstant.DELETE_DISHES_GROUP) + public BaseResponse deleteDishesGroup (@RequestBody DishesGroupDeleteRequest dishesGroupDeleteRequest, HttpServletRequest request) { + if (dishesGroupDeleteRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long id = dishesGroupDeleteRequest.getId(); + //获取商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + + // 校验分组是否为当前商家的分组 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id",id); + queryWrapper.eq("businessId",businessId); + DishesGroup dishesGroup = dishesGroupService.getOne(queryWrapper); + ThrowUtils.throwIf(dishesGroup == null,ErrorCode.OPERATION_ERROR,"当前商家无权删除该分组"); + //删除分组 + boolean byId = dishesGroupService.removeById(id); + ThrowUtils.throwIf(!byId,ErrorCode.OPERATION_ERROR); + //检查分组下是否有菜品 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Dishes::getDishesGroupId, id); + long count = dishesService.count(wrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "该分组下还有菜品"); + //删除该分组的菜品以及中检表 + dishesService.removeByDishesGroupId(id); + return ResultUtils.success(true); + } + + /** + * 更行菜品分组 + * @param dishesGroupUpdateRequest 更新请求 + * @param request 网轮廓请求 + * @return 是否成功 + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @SystemLog(executeStep = SystemLogConstant.UPDATE_DISHES_GROUP) + public BaseResponse updateDishesGroup (@RequestBody DishesGroupUpdateRequest dishesGroupUpdateRequest,HttpServletRequest request){ + if (dishesGroupUpdateRequest == null) { + throw new BusinessException(ErrorCode.OPERATION_ERROR); + } + DishesGroup dishesGroup = new DishesGroup(); + BeanUtils.copyProperties(dishesGroupUpdateRequest,dishesGroup); + //校验 + dishesGroupService.validDishesGroup(dishesGroup,true); + //更新菜品分组信息 + Boolean result = dishesGroupService.updateDishesGroupById(dishesGroup, request); + ThrowUtils.throwIf(!result,ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true); + } + + /** + * 查询菜品分组脱敏列表 + * @param dishesGroupQueryRequest 菜品分组请求体 + * @return 脱敏列表 + */ + @PostMapping("/list/dishesGroup") + public BaseResponse> dishesGroupList (@RequestBody DishesGroupQueryRequest dishesGroupQueryRequest){ + //获取商家id + Long businessId = dishesGroupQueryRequest.getBusinessId(); + Business business = businessService.getById(businessId); + if (business == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"该商家不存在"); + } + //查询商家菜品分组信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("businessId",businessId); + List list = dishesGroupService.list(queryWrapper); + // 获取菜品分组脱敏列表 + return ResultUtils.success(list); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandAuthController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandAuthController.java new file mode 100644 index 0000000..bca0a2f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandAuthController.java @@ -0,0 +1,108 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Errand; +import com.bsz.school_send_back_end.model.domain.ErrandAuth; +import com.bsz.school_send_back_end.model.dto.errandAtuh.ErrandAuthAddRequest; +import com.bsz.school_send_back_end.model.dto.errandAtuh.ErrandAuthQueryRequest; +import com.bsz.school_send_back_end.service.ErrandAuthService; +import com.bsz.school_send_back_end.service.ErrandService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; + +@Tag(name = "快送员认证接口") +@Slf4j +@RestController +@RequestMapping("/errandAuth") +public class ErrandAuthController { + + @Resource + private ErrandAuthService errandAuthService; + + @Resource + private ErrandService errandService; + + @PostMapping("/add") + public BaseResponse addErrandAuth(@RequestBody ErrandAuthAddRequest addRequest) { + if (addRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long errandId = addRequest.getErrandId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandAuth::getErrandId, errandId); + long count = errandAuthService.count(queryWrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.PARAMS_ERROR, "当前跑腿已认证"); + ErrandAuth errandAuth = new ErrandAuth(); + BeanUtils.copyProperties(addRequest, errandAuth); + errandAuthService.validErrandAuth(errandAuth,true); + + boolean save = errandAuthService.save(errandAuth); + ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR, "添加跑腿认证失败"); + + return ResultUtils.success(true); + } + + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse updateErrandAuth (@RequestBody ErrandAuthAddRequest updateRequest) { + if (updateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + ErrandAuth errandAuth = new ErrandAuth(); + BeanUtils.copyProperties(updateRequest, errandAuth); + errandAuthService.validErrandAuth(errandAuth, false); + LambdaUpdateWrapper wrapper = errandAuthService.getUpdateWrapper(errandAuth); + boolean update = errandAuthService.update(wrapper); + ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR, "更新跑腿认证信息失败"); + + return ResultUtils.success(true); + } + + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> listErrandAuthByPage(@RequestBody ErrandAuthQueryRequest errandAuthQueryRequest) { + if (errandAuthQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + long pageSize = errandAuthQueryRequest.getPageSize(); + long current = errandAuthQueryRequest.getCurrent(); + QueryWrapper queryWrapper = errandAuthService.getQueryWrapper(errandAuthQueryRequest); + Page page = errandAuthService.page(new Page<>(current, pageSize),queryWrapper); + + return ResultUtils.success(page); + } + + @GetMapping("/getErrandAuthById") + public BaseResponse getErrandAuthById (String errandId) { + Long errandId1 = Long.valueOf(errandId); + ErrandAuth errandAuth = errandAuthService.getErrandAuth(errandId1); + + return ResultUtils.success(errandAuth); + } + + @PostMapping("/get/my") + public BaseResponse getMyErrandAuth (HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + Long id = loginErrand.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandAuth::getErrandId, id); + ErrandAuth errandAuth = errandAuthService.getOne(queryWrapper); + ThrowUtils.throwIf(errandAuth == null, ErrorCode.OPERATION_ERROR, "当前跑腿为认证"); + return ResultUtils.success(errandAuth); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandController.java new file mode 100644 index 0000000..19a99af --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandController.java @@ -0,0 +1,325 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.*; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandAddRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandQueryRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandStateRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandUpdateRequest; +import com.bsz.school_send_back_end.model.vo.ErrandVO; +import com.bsz.school_send_back_end.model.vo.OrdersVO; +import com.bsz.school_send_back_end.service.*; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.DigestUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.bsz.school_send_back_end.contant.UserConstant.*; + +@Tag(name = "快送员接口") +@Slf4j +@RestController +@RequestMapping("/errand") +public class ErrandController { + @Resource + private ErrandService errandService; + + @Resource + private UserService userService; + + @Resource + private OrdersService ordersService; + + @Resource + private ErrandAuthService errandAuthService; + + @Resource + private ErrandOrderService errandOrderService; + + /** + * 注册跑腿 + * @param addRequest 注册请求体 + * @return 是否成功 + */ + @PostMapping("/add") + public BaseResponse addErrand(@RequestBody ErrandAddRequest addRequest) { + if (addRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + User user = new User(); + Errand errand = new Errand(); + BeanUtils.copyProperties(addRequest, user); + System.out.println("User account: " + user.getUserAccount()); + BeanUtils.copyProperties(addRequest, errand); + + userService.validUser(user, true); + errandService.validErrand(errand, true); + + //加密 + String encryptPassword = DigestUtils.md5DigestAsHex((USER_SALT + user.getUserPassword()).getBytes()); + user.setUserPassword(encryptPassword); + + //更改用户权限为跑腿 + user.setUserRole("errand"); + + //往user表中补充跑腿信息 + user.setUsername(errand.getErrandName()); + user.setPhone(errand.getErrandPhone()); + + errandService.addErrand(user, errand); + return ResultUtils.success(true); + } + + /** + * 删除跑腿信息 + * @param request 当前登录用户 + * @return 是否成功 + */ + @PostMapping("/delete") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + @Transactional(rollbackFor = Exception.class) + public BaseResponse deleteErrand (HttpServletRequest request){ + errandService.deleteErrand(request); + return ResultUtils.success(true); + } + + /** + * 修改跑腿信息(管理员) + * @param updateRequest 修改请求体 + * @return 是否修改成功 + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse updateErrand(@RequestBody ErrandUpdateRequest updateRequest) { + if (updateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Boolean update = errandService.updateErrand(updateRequest); + ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR,"更新跑腿失败"); + + return ResultUtils.success(true); + } + + /** + * 修改跑腿信息(个人) + * @param updateRequest 修改请求体 + * @param request 当前登录用户 + * @return 是否修改成功 + */ + @PostMapping("/update/my") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse updateErrandByUser (@RequestBody ErrandUpdateRequest updateRequest, HttpServletRequest request ) { + if (updateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Errand loginErrand = errandService.getLoginErrand(request); + + Integer totalOrders = loginErrand.getTotalOrders(); + ThrowUtils.throwIf(totalOrders > 0, ErrorCode.OPERATION_ERROR, "当前跑腿还有订单未送"); + Boolean update = errandService.updateErrand(updateRequest); + Long errandId = loginErrand.getId(); + Long id = updateRequest.getId(); + ThrowUtils.throwIf(!id.equals(errandId), ErrorCode.PARAMS_ERROR, "修改的跑腿信息不是当前跑腿"); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "更新跑腿失败"); + return ResultUtils.success(true); + } + + /** + * 获取当前跑腿信息列表 + * @return 跑腿信息列表 + */ + @PostMapping("/list") + @AuthCheck(mustRole = ADMIN_ROLE) + public BaseResponse> listErrand() { + List list = errandService.list(); + return ResultUtils.success(list); + } + + /** + * 分页获取跑腿信息列表 + * @param queryRequest 查询请求体 + * @return 跑腿信息(分页) + */ + @PostMapping("/page") + @AuthCheck(mustRole = ADMIN_ROLE) + public BaseResponse> listErrandByPage (@RequestBody ErrandQueryRequest queryRequest) { + if (queryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + long pageSize = queryRequest.getPageSize(); + long current = queryRequest.getCurrent(); + QueryWrapper queryWrapper = errandService.getQueryWrapper(queryRequest); + Page errandPage = errandService.page(new Page<>(current, pageSize), queryWrapper); + return ResultUtils.success(errandPage); + } + + /** + * 抢单 + * @param commonRequest 订单id + * @param request 当前登录用户 + * @return 是否抢单成功 + */ + @PostMapping("/get/order") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + @Transactional(rollbackFor = Exception.class) + public BaseResponse getOrder(@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long ordersId = commonRequest.getId(); + Errand loginErrand = errandService.getLoginErrand(request); + Long loginErrandId = loginErrand.getId(); + ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, ordersId)); + Integer state = loginErrand.getState(); + if (state != 1) { + throw new BusinessException(ErrorCode.FORBIDDEN_ERROR, "当前跑腿不可抢单"); + } + + errandService.updateTotal(loginErrand, true); + + // 开始事务 + Orders orders = ordersService.getOrderWithPessimisticLock(ordersId); + + // 判断订单是否已被抢 + if (orders == null || orders.getErrandId() != null) { + return ResultUtils.success(false); // 订单已经被抢或不存在 + } + + // 更新订单的 errandId 和状态 + orders.setErrandId(loginErrandId); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "抢单失败"); + + + errandOrder.setErrandId(loginErrandId); + errandOrder.setErrandState(2); // 2待取货 + boolean update1 = errandOrderService.updateById(errandOrder); + ThrowUtils.throwIf(!update1, ErrorCode.OPERATION_ERROR, "更新跑腿订单关联失败"); + + return ResultUtils.success(true); + } + + /** + * 修改订单 + * @param errandStateRequest 订单id + * @param request 当前登录用户 + * @return 是否修改成功 + */ + @PostMapping("/update/state") + @AuthCheck(mustRole = ERRAND_ROLE) + public BaseResponse updateOrdersStateByErrand (@RequestBody ErrandStateRequest errandStateRequest, HttpServletRequest request) { + if (errandStateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + errandService.orderToErrand(errandStateRequest, request); + return ResultUtils.success(true); + } + + /** + * 根据当前登录用户获取跑腿信息 + */ + @PostMapping("/get/current") + @AuthCheck(mustRole = ERRAND_ROLE) + public BaseResponse getByErrand (HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + ErrandVO errandVO = errandService.getErrandVO(loginErrand); + + return ResultUtils.success(errandVO); + } + + /** + * 当前跑腿获取订单 + */ + @PostMapping("/list/order") + @AuthCheck(mustRole = ERRAND_ROLE) + public BaseResponse> listOrdersByErrand(Integer errandState, HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + String distributionScope = loginErrand.getDistributionScope(); + + // 创建 errand_order 表的查询条件 + LambdaQueryWrapper errandOrderQueryWrapper = new LambdaQueryWrapper<>(); + errandOrderQueryWrapper.eq(ErrandOrder::getErrandState, errandState); + + // 根据 errandState 的不同情况调整查询 + if (errandState != 1) { + errandOrderQueryWrapper.eq(ErrandOrder::getErrandId, loginErrand.getId()); + } else { + errandOrderQueryWrapper.isNull(ErrandOrder::getErrandId); + errandOrderQueryWrapper.ge(ErrandOrder::getEndTime, new Date()); + } + + // 查询符合条件的 errand_order 数据 + List errandOrderList = errandOrderService.list(errandOrderQueryWrapper); + + // 获取符合条件的 orderId 列表 + List orderIds = errandOrderList.stream().map(ErrandOrder::getOrderId).collect(Collectors.toList()); + + // 如果没有符合条件的订单,则返回空 + if (orderIds.isEmpty()) { + return ResultUtils.success(Collections.emptyList()); + } + + // 查询 orders 表,获取相关订单信息 + LambdaQueryWrapper ordersQueryWrapper = new LambdaQueryWrapper<>(); + ordersQueryWrapper.in(Orders::getId, orderIds); + ordersQueryWrapper.eq(Orders::getLocation, distributionScope); + + // 获取订单数据 + List ordersList = ordersService.list(ordersQueryWrapper); + List ordersVO = ordersService.getOrdersVO(ordersList); + + // 如果转换后的订单VO为空,也返回空响应 + if (CollectionUtils.isEmpty(ordersVO)) { + return ResultUtils.success(Collections.emptyList()); + } + + return ResultUtils.success(ordersVO); + } + + /** + * 根据Id获取跑腿信息 + * @return 跑腿信息 + */ + @PostMapping("/get/id") + @AuthCheck(mustRole = ADMIN_ROLE) + public BaseResponse getErrandById (String errandId1) { + Long errandId = Long.valueOf(errandId1); + Errand errand = errandService.getOne(Wrappers.lambdaQuery().eq(Errand::getId, errandId)); + ThrowUtils.throwIf(errand == null, ErrorCode.PARAMS_ERROR, "当前跑腿id不正确"); + ErrandVO errandVO = errandService.getErrandVO(errand); + ErrandAuth errandAuth = errandAuthService.getErrandAuth(errandId); + errandVO.setBackIdCard(errandAuth.getBackIdCard()); + errandVO.setBankCard(errandAuth.getBankCard()); + errandVO.setFrontIdCard(errandAuth.getFrontIdCard()); + return ResultUtils.success(errandVO); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandIncomeController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandIncomeController.java new file mode 100644 index 0000000..de12b34 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/ErrandIncomeController.java @@ -0,0 +1,137 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Errand; +import com.bsz.school_send_back_end.model.domain.ErrandIncome; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.erradnIncome.ErrandIncomeQueryRequest; +import com.bsz.school_send_back_end.service.ErrandIncomeService; +import com.bsz.school_send_back_end.service.ErrandService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Tag(name = "快送员收入接口") +@RestController +@Slf4j +@RequestMapping("/errandIncome") +public class ErrandIncomeController { + + @Resource + private ErrandService errandService; + + @Resource + private ErrandIncomeService errandIncomeService; + + @Resource + private UserService userService; + + @PostMapping("/count/number") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse countIncomeNumber(HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + + LambdaQueryWrapper queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId()); + + long count = errandIncomeService.count(queryWrapper); + return ResultUtils.success(count); + } + + @PostMapping("/count/money") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse countIncomeMoney(HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + + LambdaQueryWrapper queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId()); + queryWrapper.eq(ErrandIncome::getState, 1); + List list = errandIncomeService.list(queryWrapper); + BigDecimal price = list.stream().map(ErrandIncome::getIncome).reduce(BigDecimal.ZERO, BigDecimal::add); + + return ResultUtils.success(price); + } + + @PostMapping("/count/total-money") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse countTotalIncome(HttpServletRequest request) { + // 获取登录跑腿信息 + Errand loginErrand = errandService.getLoginErrand(request); + + // 从跑腿表直接获取总收入字段值 + BigDecimal totalIncome = loginErrand.getTotalPrice(); + + // 返回结果 + return ResultUtils.success(totalIncome); + } + + @PostMapping("/list") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse> listErrandIncome(@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long errandId = commonRequest.getId(); + User loginUser = userService.getLoginUser(request); + String userRole = loginUser.getUserRole(); + if (userRole.equals(UserConstant.ERRAND_ROLE)) { + Errand loginErrand = errandService.getLoginErrand(request); + Long id = loginErrand.getId(); + ThrowUtils.throwIf(!id.equals(errandId), ErrorCode.PARAMS_ERROR, "传输的跑腿id不正确"); + } + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandIncome::getErrandId, errandId); + List list = errandIncomeService.list(queryWrapper); + + if (list == null) { + list = new ArrayList<>(); + } + return ResultUtils.success(list); + } + + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse> listErrandIncomeByPage(@RequestBody ErrandIncomeQueryRequest queryRequest) { + if (queryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + long pageSize = queryRequest.getPageSize(); + long current = queryRequest.getCurrent(); + QueryWrapper queryWrapper = errandIncomeService.getWrapper(queryRequest); + Page page = errandIncomeService.page(new Page<>(current, pageSize), queryWrapper); + if (page == null) { + page = new Page<>(); + } + + return ResultUtils.success(page); + } + + + @PostMapping("/count/money/no") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse countIncomeMoneyNo(HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + + LambdaQueryWrapper queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId()); + queryWrapper.eq(ErrandIncome::getState, 0); + List list = errandIncomeService.list(queryWrapper); + BigDecimal price = list.stream().map(ErrandIncome::getIncome).reduce(BigDecimal.ZERO, BigDecimal::add); + + return ResultUtils.success(price); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/FileController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/FileController.java new file mode 100644 index 0000000..71e259c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/FileController.java @@ -0,0 +1,130 @@ +package com.bsz.school_send_back_end.controller; + +import cn.hutool.core.io.FileUtil; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.FileConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.file.UploadFileRequest; +import com.bsz.school_send_back_end.model.enums.FileUploadBizEnum; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; + +/** + * 文件上传 + */ +@Tag(name = "文件上传接口") +@Slf4j +@RestController +@RequestMapping("/file") +public class FileController { + + @Resource + private UserService userService; + @PostMapping("/upload/server/not_login") + public BaseResponse uploadServerNotLogin (@RequestPart("file")MultipartFile multipartFile, UploadFileRequest uploadFileRequest) { + //获取业务名称 + String biz = uploadFileRequest.getBiz(); + FileUploadBizEnum fileUploadBizEnum = FileUploadBizEnum.getEnumByValue(biz); + if (fileUploadBizEnum == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + //校验文件 + validfile(multipartFile, fileUploadBizEnum); + //文件目录:根据业务,用户来划分 + String uuid = RandomStringUtils.randomAlphabetic(8); + String fileName = uuid + "-" + multipartFile.getOriginalFilename(); + String filePath = String.format("/%s/%s/%s", fileUploadBizEnum.getValue(), 0, fileName); + try { + //判断目录是否存在 + File file = new File(FileConstant.SERVER_UPLOAD_DIR, filePath); + log.info("filepath:{}",file); + if (!file.exists()) { + boolean mkdirs = file.mkdirs(); + if (!mkdirs) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"创建目录失败"); + } + } + multipartFile.transferTo(new File(FileConstant.SERVER_UPLOAD_DIR, filePath)); + // 返回可访问地址 + return ResultUtils.success(FileConstant.SERVER_HOST + filePath); + } + catch (IOException e) { + log.error("file upload error, filePath = " + filePath, e); + throw new BusinessException(ErrorCode.SYSTEM_ERROR,"上传失败"); + } + + } + + @PostMapping("/upload/server") + public BaseResponse uploadServerFile(@RequestPart("file") MultipartFile multipartFile, UploadFileRequest uploadFileRequest, HttpServletRequest request) { + // 获取业务名称 + String biz = uploadFileRequest.getBiz(); + FileUploadBizEnum fileUploadBizEnum = FileUploadBizEnum.getEnumByValue(biz); + if (fileUploadBizEnum == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "业务名称错误"); + } + //校验文件 + validfile(multipartFile,fileUploadBizEnum); + //校验用户是否登录 + User loginUser = userService.getLoginUser(request); + if (loginUser == null) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "未登录"); + } + // 文件目录:根据业务、用户来划分 + String uuid = RandomStringUtils.randomAlphabetic(8); + String fileName = uuid + "-" + multipartFile.getOriginalFilename(); + String filePath = String.format("/%s/%s/%s", fileUploadBizEnum.getValue(), loginUser.getId(), fileName); + try { + File file = new File(FileConstant.SERVER_UPLOAD_DIR, filePath); + if (!file.exists()) { + //创建目录 + boolean mkdirs = file.mkdirs(); + + if (!mkdirs) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "创建目录失败"); + } + } + multipartFile.transferTo(new File(FileConstant.SERVER_UPLOAD_DIR,filePath)); + //返回可访问的地址 + return ResultUtils.success(FileConstant.SERVER_HOST + filePath); + } + catch (IOException e) { + log.error("file upload error, filepath = " + filePath, e); + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "上传失败"); + } + } + + /** + * 校验文件 + */ + private void validfile(MultipartFile multipartFile, FileUploadBizEnum fileUploadBizEnum) { + //文件大小 + long fileSize = multipartFile.getSize(); + //文件后缀 + String fileSuffix = FileUtil.getSuffix(multipartFile.getOriginalFilename()); + final long TWO_M = 2*1024*1024L; + if (FileUploadBizEnum.USER_AVATAR.equals(fileUploadBizEnum)) { + if (fileSize > TWO_M) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件大小不能超过 2M"); + } + if (!Arrays.asList("jpeg", "jpg", "svg", "png", "webp").contains(fileSuffix)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件类型错误"); + } + } + } + + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/OrdersController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/OrdersController.java new file mode 100644 index 0000000..eb66a9f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/OrdersController.java @@ -0,0 +1,629 @@ +package com.bsz.school_send_back_end.controller; + + +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.listener.RabbitMQSender; +import com.bsz.school_send_back_end.model.domain.*; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.order.*; +import com.bsz.school_send_back_end.model.vo.*; +import com.bsz.school_send_back_end.service.*; +import com.bsz.school_send_back_end.utils.ExcelUtils; +import com.bsz.school_send_back_end.utils.SqlUtils; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 订单相关接口 + **/ +@Tag(name = "订单相关接口") +@Slf4j +@RestController +@Tag(name = "订单接口") +@RequestMapping("/orders") +public class OrdersController { + + @Resource + private UserService userService; + + @Resource + private DishesService dishesService; + + @Resource + private OrdersService ordersService; + + @Resource + private BusinessService businessService; + + @Resource + private OrderDetailsService orderDetailsService; + + @Resource + private WebsocketService websocketService; + + @Resource + private ErrandService errandService; + + @Resource + private ErrandIncomeService errandIncomeService; + + @Resource + private ErrandOrderService errandOrderService; + + @Resource + private ErrandBillService billService; + + @Resource + private RabbitMQSender rabbitMQSender; + + /** + * 创建订单 + * + * @return 订单id + */ + @PostMapping("/add") + public BaseResponse addOrders(@RequestBody OrderAddRequest orderAddRequest, HttpServletRequest request) { + if (orderAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + // 提取订单 + Orders orders = new Orders(); + User loginUser = userService.getLoginUser(request); + BeanUtils.copyProperties(orderAddRequest, orders); + orders.setUserId(loginUser.getId()); + ordersService.validOrder(orders); + // 提取订单详情 + List detailAddRequest = orderAddRequest.getOrderDetailAddRequest(); + List orderDetailsList = detailAddRequest.stream().map(item -> { + OrderDetails orderDetails = new OrderDetails(); + BeanUtils.copyProperties(item, orderDetails); + orderDetailsService.validOrderDetail(orderDetails); + Long dishesId = orderDetails.getDishesId(); + // 根据菜品设置价格 + Dishes dishes = dishesService.getById(dishesId); + BigDecimal dishesPrice = BigDecimal.valueOf(dishes.getDishesPrice()); + orderDetails.setPrice(dishesPrice); + double subtotal = dishes.getDishesPrice() * orderDetails.getQuantity(); + orderDetails.setSubtotal(BigDecimal.valueOf(subtotal)); + return orderDetails; + }).toList(); + // 创建订单 + long orderId = ordersService.addOrder(orders, orderDetailsList); + rabbitMQSender.sendCreateOrderMessage(orderId); + return ResultUtils.success(orderId, "订单创建成功"); + } + + /** + * 取消订单 + */ + @PostMapping("/cancel") + public BaseResponse cancelOrder(@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + Long orderId = commonRequest.getId(); + if (orderId == null || orderId <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + // 校验订单 + Orders orders = ordersService.getById(orderId); + ThrowUtils.throwIf(orders == null, ErrorCode.NOT_FOUND_ERROR); + ThrowUtils.throwIf(orders.getState() != 0, ErrorCode.OPERATION_ERROR, "订单状态错误"); + // 判断是否为自己的订单 + User loginUser = userService.getLoginUser(request); + if (!orders.getUserId().equals(loginUser.getId())) { + throw new BusinessException(ErrorCode.NO_AUTH); + } + // 修改订单状态 + orders.setState(3); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR); + return ResultUtils.success(true); + } + + /** + * 根据 id 获取订单信息(仅管理员) + */ + @GetMapping("/get") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse getOrderVOById(@RequestParam Long id) { + if (id <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Orders orders = ordersService.getById(id); + ThrowUtils.throwIf(orders == null, ErrorCode.NOT_FOUND_ERROR); + return ResultUtils.success(ordersService.getOrdersVO(orders)); + } + + /** + * 根据 id 获取订单信息 + */ + @GetMapping("/get/my") + public BaseResponse getOrderVOByMyId(@RequestParam Long id, HttpServletRequest request) { + if (id <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + User loginUser = userService.getLoginUser(request); + Orders orders = ordersService.getOne(Wrappers.lambdaQuery().eq(Orders::getId, id) + .eq(Orders::getUserId, loginUser.getId())); + ThrowUtils.throwIf(orders == null, ErrorCode.NOT_FOUND_ERROR); + return ResultUtils.success(ordersService.getOrdersVO(orders)); + } + + /** + * 分页获取订单列表(管理员) + */ + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> listOrdersByPage(@RequestBody OrderQueryRequest orderQueryRequest) { + long current = orderQueryRequest.getCurrent(); + long size = orderQueryRequest.getPageSize(); + Page ordersPage = ordersService.page(new Page<>(current, size), + ordersService.getQueryWrapper(orderQueryRequest)); + return ResultUtils.success(ordersPage); + } + + /** + * 获取我的订单 + */ + @PostMapping("/my/page") + public BaseResponse> getMyOrders(@RequestBody MyOrderQueryRequest myOrderQueryRequest, HttpServletRequest request) { + if (myOrderQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + long current = myOrderQueryRequest.getCurrent(); + long size = myOrderQueryRequest.getPageSize(); + User loginUser = userService.getLoginUser(request); + OrderQueryRequest orderQueryRequest = new OrderQueryRequest(); + BeanUtils.copyProperties(myOrderQueryRequest, orderQueryRequest); + QueryWrapper queryWrapper = ordersService.getQueryWrapper(orderQueryRequest); + if (loginUser.getUserRole().equals(UserConstant.BUSINESS_ROLE)) { + // 商家获取订单 + Business loginBusiness = businessService.getLoginBusiness(request); + queryWrapper.eq("businessId", loginBusiness.getId()); + } else { + // 用户获取订单 + queryWrapper.eq("userId", loginUser.getId()); + } + Page ordersPage = ordersService.page(new Page<>(current, size), + queryWrapper); + Page ordersVOPage = new Page<>(current, size, ordersPage.getTotal()); + List ordersVOList = ordersService.getOrdersVO(ordersPage.getRecords()); + ordersVOPage.setRecords(ordersVOList); + return ResultUtils.success(ordersVOPage); + } + + /** + * 订单统计 + */ + @PostMapping("/count") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse ordersCount(@RequestBody OrderCountRequest orderCountRequest) { + String type = orderCountRequest.getType(); + Integer state = orderCountRequest.getState(); + Long businessId = orderCountRequest.getBusinessId(); + String startTime = orderCountRequest.getStartTime(); + String endTime = orderCountRequest.getEndTime(); + ThrowUtils.throwIf(StringUtils.isBlank(type), ErrorCode.PARAMS_ERROR); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(state != null, "state", state); + queryWrapper.eq(businessId != null, "businessId", businessId); + return getStringBaseResponse(type, startTime, endTime, queryWrapper); + } + + /** + * 订单金额统计 + */ + @PostMapping("/count/money") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse> ordersCountMoney(@RequestBody OrderCountRequest orderCountRequest) { + // 获取查询类型 + String type = orderCountRequest.getType(); + ThrowUtils.throwIf(StringUtils.isBlank(type), ErrorCode.PARAMS_ERROR); + OrderQueryRequest orderQueryRequest = new OrderQueryRequest(); + BeanUtils.copyProperties(orderCountRequest, orderQueryRequest); + List moneyCountList = new ArrayList<>(); + if (type.equals("week")) { + LocalDate today = LocalDate.now(); + DateTimeFormatter startFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00:00"); + DateTimeFormatter endFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 23:59:59"); + // 遍历查询7天数据,放入数组 + for (int i = 0; i <= 6; i++) { + LocalDate date = today.minusDays(i); + orderQueryRequest.setStartTime(date.format(startFormatter)); + orderQueryRequest.setEndTime(date.format(endFormatter)); + QueryWrapper queryWrapper = ordersService.getQueryWrapper(orderQueryRequest); + List orderList = ordersService.list(queryWrapper); + BigDecimal money = new BigDecimal("0"); + for (Orders order : orderList) { + money = money.add(order.getTotalPrice()); + } + moneyCountList.add(money); + } + } else { + QueryWrapper queryWrapper = ordersService.getQueryWrapper(orderQueryRequest); + List orderList = ordersService.list(queryWrapper); + BigDecimal money = new BigDecimal("0"); + for (Orders order : orderList) { + money = money.add(order.getTotalPrice()); + } + moneyCountList.add(money); + } + return ResultUtils.success(moneyCountList); + } + + /** + * 订单数量统计 + */ + @PostMapping("/count/number") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse> ordersCountNumber(@RequestBody OrderCountRequest orderCountRequest) { + // 获取查询类型 + String type = orderCountRequest.getType(); + ThrowUtils.throwIf(StringUtils.isBlank(type), ErrorCode.PARAMS_ERROR); + OrderQueryRequest orderQueryRequest = new OrderQueryRequest(); + BeanUtils.copyProperties(orderCountRequest, orderQueryRequest); + List numberCountList = new ArrayList<>(); + if (type.equals("week")) { + LocalDate today = LocalDate.now(); + DateTimeFormatter startFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00:00"); + DateTimeFormatter endFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 23:59:59"); + // 遍历查询7天数据,放入数组 + for (int i = 0; i <= 6; i++) { + LocalDate date = today.minusDays(i); + orderQueryRequest.setStartTime(date.format(startFormatter)); + orderQueryRequest.setEndTime(date.format(endFormatter)); + QueryWrapper queryWrapper = ordersService.getQueryWrapper(orderQueryRequest); + long count = ordersService.count(queryWrapper ); + numberCountList.add(count); + } + } else { + QueryWrapper queryWrapper = ordersService.getQueryWrapper(orderQueryRequest); + long count = ordersService.count(queryWrapper); + numberCountList.add(count); + } + return ResultUtils.success(numberCountList); + } + + /** + * 订单统计(web端) + */ + @PostMapping("/count/web") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse ordersCountByWeb(@RequestBody OrderCountRequest orderCountRequest) { + String type = orderCountRequest.getType(); + Integer state = orderCountRequest.getState(); + String businessName = orderCountRequest.getBusinessName(); + Long businessState = orderCountRequest.getBusinessState(); + String startTime = orderCountRequest.getStartTime(); + String endTime = orderCountRequest.getEndTime(); + Long categoryId = orderCountRequest.getCategoryId(); + List businessIdList = new ArrayList<>(); + ThrowUtils.throwIf(StringUtils.isBlank(type), ErrorCode.PARAMS_ERROR); + if (categoryId != null || businessName != null || businessState != null) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(StringUtils.isNotBlank(businessName), "businessName", businessName); + wrapper.eq(businessState != null, "state", businessState); + wrapper.eq(categoryId != null, "categoryId", categoryId); + List businessList = businessService.list(wrapper); + if (CollectionUtils.isEmpty(businessList)) { + return ResultUtils.success("0"); + } + businessIdList = businessList.stream().map(Business::getId).collect(Collectors.toList()); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(state != null, "state", state); + queryWrapper.in(!CollectionUtils.isEmpty(businessIdList), "businessId", businessIdList); + return getStringBaseResponse(type, startTime, endTime, queryWrapper); + } + + @PostMapping("/download") + public void download(@RequestBody OrderQueryRequest orderQueryRequest, HttpServletResponse response) throws IOException { + String startTime = orderQueryRequest.getStartTime(); + String endTime = orderQueryRequest.getEndTime(); + Long businessId = orderQueryRequest.getBusinessId(); + String sortOrder = orderQueryRequest.getSortOrder(); + String sortField = orderQueryRequest.getSortField(); + // 获取数据 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime); + wrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime); + wrapper.eq("businessId", businessId); + wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + List ordersList = ordersService.list(wrapper); + log.info("ordersList:" + ordersList); + List ordersExcelVOList = ordersList.stream().map(item -> { + OrdersExcelVO ordersExcelVO = new OrdersExcelVO(); + BeanUtils.copyProperties(item, ordersExcelVO); + //改变订单支付状态 + String stateText = ExcelUtils.getStateText(item.getState()); + ordersExcelVO.setState(stateText); + log.info("修改订单状态:" + ordersExcelVO.getState()); + // Date转字符串 + ordersExcelVO.setCreateTime(ExcelUtils.dateToString(item.getCreateTime())); + return ordersExcelVO; + }).collect(Collectors.toList()); + // 设置导出名称 + ExcelUtils.setExcelResponseProp(response, "订单信息"); + log.info("响应头 Content-Type: {}", response.getContentType()); + // 获取输出流名称 + try (OutputStream outputStream = response.getOutputStream()) { + EasyExcel.write(outputStream, OrdersExcelVO.class) + .sheet("订单数据") + .doWrite(ordersExcelVOList); + response.flushBuffer(); + } catch (Exception e) { + log.error("Excel 导出失败", e); + } + + } + + @PostMapping("/delete") + @AuthCheck(mustRole = UserConstant.DEFAULT_ROLE) + public BaseResponse deleteOrder (@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long orderId = commonRequest.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Orders::getId, orderId); + Orders orders = ordersService.getOne(wrapper); + User loginUser = userService.getLoginUser(request); + Long loginUserId = loginUser.getId(); + ThrowUtils.throwIf(!orders.getUserId().equals(loginUserId), ErrorCode.OPERATION_ERROR, + "当前用户不是该订单所有者"); + log.info("oldOrders:" + orders); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(Orders::getIsDelete,1); + updateWrapper.eq(Orders::getId, orderId); + boolean update = ordersService.update(updateWrapper); + log.info("orders:" + orders); + ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR); + + return ResultUtils.success(true); + } + + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse updateOrderState(@RequestBody CommonRequest commonRequest,HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long id = commonRequest.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Orders::getId, id); + Orders orders = ordersService.getOne(queryWrapper); + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + ThrowUtils.throwIf(!businessId.equals(orders.getBusinessId()), ErrorCode.FORBIDDEN_ERROR, "当前订单不属于当前登录用户"); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(Orders::getState,4); + updateWrapper.eq(Orders::getId, id); + String location = orders.getLocation(); + ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, orders.getId())); + + if (errandOrder != null) { + if (StringUtils.isNotBlank(location)) { + websocketService.sendOrderToErrand(orders); + errandOrder.setErrandState(1);//1待抢单 + boolean update1 = errandOrderService.updateById(errandOrder); + ThrowUtils.throwIf(!update1, ErrorCode.OPERATION_ERROR, "更新跑腿关联失败"); + } + + boolean update = ordersService.update(updateWrapper); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR,"修改订单状态失败"); + + } + + return ResultUtils.success(true); + } + + @PostMapping("/updateOrder") + public BaseResponse updateOrder(@RequestBody OrderUpdateRequest orderUpdateRequest, HttpServletRequest request) { + return ResultUtils.success(ordersService.OrderToUpdate(orderUpdateRequest, request)); + } + + @PostMapping("/update/state/user") + public BaseResponse updateStateByUser(@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long orderId = commonRequest.getId(); + User loginUser = userService.getLoginUser(request); + Orders orders = ordersService.getById(orderId); + ThrowUtils.throwIf(orders.getState().equals(5), ErrorCode.OPERATION_ERROR, "订单已完成"); + ThrowUtils.throwIf(!orders.getUserId().equals(loginUser.getId()), ErrorCode.PARAMS_ERROR, + "当前传送的订单id不正确或不属于当前用户"); + Long errandId = orders.getErrandId(); + if (errandId != null) { + Errand errand = errandService.getById(errandId); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandIncome::getOrderId, orderId); + ErrandIncome errandIncome = errandIncomeService.getOne(queryWrapper); + errandIncome.setState(1); // 收入已结算 + boolean update = errandIncomeService.updateById(errandIncome); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR,"修改跑腿收入失败"); + BigDecimal totalPrice = errand.getTotalPrice(); + BigDecimal income = errandIncome.getIncome(); + totalPrice = totalPrice.add(income); + errand.setTotalPrice(totalPrice); + boolean update1 = errandService.updateById(errand); + ThrowUtils.throwIf(!update1, ErrorCode.OPERATION_ERROR, "修改跑腿总金额失败"); + + ErrandBill errandBill = new ErrandBill(); + errandBill.setOrderId(orderId); + errandBill.setErrandState(errandIncome.getState()); + errandBill.setIncome(errandIncome.getIncome()); + errandBill.setUsername(loginUser.getUsername()); + errandBill.setOrderStartTime(orders.getCreateTime()); + boolean save = billService.save(errandBill); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "添加跑腿账单失败"); + } + orders.setState(5); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败"); + return ResultUtils.success(true); + } + + @PostMapping("/list/errand") + @AuthCheck(mustRole = UserConstant.ERRAND_ROLE) + public BaseResponse> listOrderErrandVO (HttpServletRequest request) { + Errand loginErrand = errandService.getLoginErrand(request); + Long errandId = loginErrand.getId(); + List errandOrders = errandOrderService.list(Wrappers.lambdaQuery() + .eq(ErrandOrder::getErrandId, errandId) + .eq(ErrandOrder::getErrandState, 4)); + List orderIds = errandOrders.stream() + .map(ErrandOrder::getOrderId) + .collect(Collectors.toList()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(Orders::getId, orderIds); + List ordersList = ordersService.list(wrapper); + List listOrderErrandVO = ordersService.getListOrderErrandVO(ordersList); + return ResultUtils.success(listOrderErrandVO); + } + + @PostMapping("/list/status") + @AuthCheck(mustRole = UserConstant.DEFAULT_ROLE) + public BaseResponse> listOrderStatus (HttpServletRequest request) { + List liststatus = ordersService.liststatus(request); + return ResultUtils.success(liststatus); + } + + @PostMapping("/list/numnber") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> getPickUpNum () { + List ordernumbers = ordersService.getOrdernumber(); + ThrowUtils.throwIf(ordernumbers == null, ErrorCode.OPERATION_ERROR, "获取单量失败"); + return ResultUtils.success(ordernumbers); + } + + @PostMapping("/download/errand") + public void downloadByErrand(@RequestBody OrderQueryRequest orderQueryRequest, HttpServletResponse response) throws IOException { + String startTime = orderQueryRequest.getStartTime(); + String endTime = orderQueryRequest.getEndTime(); + Long errandId = orderQueryRequest.getErrandId(); + String sortOrder = orderQueryRequest.getSortOrder(); + String sortField = orderQueryRequest.getSortField(); + // 获取数据 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime); + wrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime); + wrapper.eq("errandId", errandId); + wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + List ordersList = ordersService.list(wrapper); + Collection orderIds = ordersList.stream() + .map(Orders::getId) + .collect(Collectors.toList()); + //获取errandState + LambdaQueryWrapper wrapper1 = new LambdaQueryWrapper<>(); + wrapper1.in(ErrandOrder::getOrderId, orderIds); + List errandOrders = errandOrderService.list(wrapper1); + //先将errandOrder数据变成MAP,提高查询效率 + Map map = errandOrders.stream() + .collect(Collectors.toMap(ErrandOrder::getOrderId, ErrandOrder::getErrandState)); + //获取跑腿收入 + LambdaQueryWrapper wrapper2 = new LambdaQueryWrapper<>(); + wrapper2.in(ErrandIncome::getOrderId, orderIds); + List errandIncomes = errandIncomeService.list(wrapper2); + Map decimalMap = errandIncomes.stream() + .collect(Collectors.toMap(ErrandIncome::getOrderId, ErrandIncome::getIncome)); + Collection excelByErrandVOS = ordersList.stream() + .map(orders -> { + OrdersExcelByErrandVO ordersExcelByErrandVO = new OrdersExcelByErrandVO(); + BeanUtils.copyProperties(orders, ordersExcelByErrandVO); + //改变订单支付状态 + String stateText = ExcelUtils.getStateText(orders.getState()); + ordersExcelByErrandVO.setState(stateText); + //改变跑腿订单状态 + String errandStateText = ExcelUtils.getErrandStateText(map.getOrDefault(orders.getId(), 0)); + ordersExcelByErrandVO.setErrandState(errandStateText); + ordersExcelByErrandVO.setErrandIncome(decimalMap.getOrDefault(orders.getId(), new BigDecimal("0.00"))); + return ordersExcelByErrandVO; + }).collect(Collectors.toList()); + // 设置导出名称 + ExcelUtils.setExcelResponseProp(response, "跑腿订单信息"); + // 获取输出流名称 + try (OutputStream outputStream = response.getOutputStream()) { + EasyExcel.write(outputStream, OrdersExcelByErrandVO.class) + .sheet("订单数据") + .doWrite(excelByErrandVOS); + response.flushBuffer(); + } catch (Exception e) { + log.error("Excel 导出失败", e); + } + } + + @PostMapping("/count/errand") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse countErrand (@RequestBody OrdersCountByErrandRequest errandRequest) { + if (errandRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long errandId = errandRequest.getErrandId(); + Integer state = errandRequest.getState(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandIncome::getErrandId, errandId); + queryWrapper.eq(ObjectUtils.isNotEmpty(state), ErrandIncome::getState, state); + List errandIncomes = errandIncomeService.list(queryWrapper); + // 计算 income 总和 + BigDecimal totalIncome = errandIncomes.stream() + .map(ErrandIncome::getIncome) // 获取 income + .filter(Objects::nonNull) // 过滤掉 null 值 + .reduce(BigDecimal.ZERO, BigDecimal::add); // 求和 + return ResultUtils.success(totalIncome); + } + + private BaseResponse getStringBaseResponse(String type, String startTime, String endTime, QueryWrapper queryWrapper) { + queryWrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime); + queryWrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime); + if (type.equals("money")) { + List orderList = ordersService.list(queryWrapper); + BigDecimal money = new BigDecimal("0"); + for (Orders order : orderList) { + money = money.add(order.getTotalPrice()); + } + String strMoney = String.valueOf(money); + return ResultUtils.success(strMoney); + } else if (type.equals("number")) { + long count = ordersService.count(queryWrapper); + String strNumber = String.valueOf(count); + return ResultUtils.success(strNumber); + } else { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "type不正确"); + } + } +} + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/OssController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/OssController.java new file mode 100644 index 0000000..0f8f2e1 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/OssController.java @@ -0,0 +1,42 @@ +package com.bsz.school_send_back_end.controller; + + +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.service.OssService; + +import com.bsz.school_send_back_end.common.ResultUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.annotation.Resource; + +@Tag(name = "阿里云文件上传接口") +@RestController +@RequestMapping("/fileOss") +public class OssController { + + @Resource + private OssService ossService; + + /** + * 上传头像 + * + * @param file + * @return + */ + @ApiOperation(value = "文件上传") + @PostMapping("/upload") + public BaseResponse uploadOssFile(@RequestParam(required = false) MultipartFile file) { + //获取上传的文件 + if (file.isEmpty()) { + return null; + } + //返回上传到oss的路径 + String url = ossService.uploadFileAvatar(file); + //返回r对象 + return ResultUtils.success(url); + } +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/PrivateChatController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/PrivateChatController.java new file mode 100644 index 0000000..ce7152b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/PrivateChatController.java @@ -0,0 +1,22 @@ +package com.bsz.school_send_back_end.controller; + +import com.bsz.school_send_back_end.model.domain.PrivateMessage; +import com.bsz.school_send_back_end.service.WebsocketService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; + +@Tag(name = "聊天接口") +@RestController +public class PrivateChatController { + + @Resource + private WebsocketService ws; + + @MessageMapping("/privateChat") + public void singleChat (PrivateMessage message) { + ws.sendChatMessage(message); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/PrivateMessageController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/PrivateMessageController.java new file mode 100644 index 0000000..0402754 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/PrivateMessageController.java @@ -0,0 +1,96 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.service.PrivateMessageService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "私聊") +@RestController +@RequestMapping("/PrivateMessage") +public class PrivateMessageController { + + @Resource + private PrivateMessageService privateMessageService; + + @Resource + private UserService userService; + + @Resource + private SimpMessagingTemplate template; + + /** + * 添加一条消息 + */ + @PostMapping("/save") + public BaseResponse saveOneMessage (@RequestBody PrivateMessage message) { + boolean save = privateMessageService.save(message); + ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR); + return ResultUtils.success(true); + } + + /** + * 查询私聊记录 + */ + @GetMapping("/list/{fromUserAccount}/{toUserAccount}") + public BaseResponse> listPrivateMessage( + @PathVariable("fromUserAccount") String fromUserAccount, + @PathVariable("toUserAccount") String toUserAccount) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.and(q -> q + .eq(PrivateMessage::getFrom_userAccount, fromUserAccount) + .eq(PrivateMessage::getTo_userAccount, toUserAccount) + ) + .or(q -> q + .eq(PrivateMessage::getFrom_userAccount, toUserAccount) + .eq(PrivateMessage::getTo_userAccount, fromUserAccount) + ); + List list = privateMessageService.list(queryWrapper); + List collect = list.stream().map(PrivateMessage::getMessage).collect(Collectors.toList()); + + return ResultUtils.success(collect); + } + + /** + * 删除所有私聊聊天记录 + */ + @PostMapping("/delete/{fromUserAccount}/{toUserAccount}") + public BaseResponse deleteAllMessage( + @PathVariable("fromUserAccount") String fromUserAccount, + @PathVariable("toUserAccount") String toUserAccount) { + + // 更新当前用户的删除标志,不影响另一个用户的查看状态 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper + .and(q -> q.eq("from_userAccount", fromUserAccount) + .eq("to_userAccount", toUserAccount) + .set("from_user_deleted", 1)) // 更新发消息者的删除标志 + .or(q -> q.eq("from_userAccount", toUserAccount) + .eq("to_userAccount", fromUserAccount) + .set("to_user_deleted", 1)); // 更新接收消息者的删除标志 + + boolean update = privateMessageService.update(updateWrapper); + ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR); + + // 只发送当前用户的删除消息通知,不发送给另一方 + User fromUser = userService.getOne(Wrappers.lambdaQuery().eq(User::getUserAccount, fromUserAccount)); + template.convertAndSend("/topic/ServerToClient.deleteMsg", fromUser); + + return ResultUtils.success(true); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/RefundController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/RefundController.java new file mode 100644 index 0000000..3344a02 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/RefundController.java @@ -0,0 +1,142 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.OrderRefunds; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.refund.RefundAddRequest; +import com.bsz.school_send_back_end.model.dto.refund.RefundUpdateRequest; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.OrderRefundsService; +import com.bsz.school_send_back_end.service.OrdersService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "退款接口") +@RestController +@RequestMapping("/refund") +public class RefundController { + @Resource + private UserService userService; + + @Resource + private OrderRefundsService refundsService; + + @Resource + private OrdersService ordersService; + + @Resource + private BusinessService businessService; + + /** + * 用户申请退款 + * @param refundAddRequest 退款请求 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/add") + public BaseResponse addRefund(@RequestBody RefundAddRequest refundAddRequest, HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long orderId = refundAddRequest.getOrderId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Orders::getId, orderId); + Orders orders = ordersService.getOne(queryWrapper); + ThrowUtils.throwIf(orders == null, ErrorCode.NOT_FOUND_ERROR, "未找到退款申请"); + ThrowUtils.throwIf(orders.getState() != 1, ErrorCode.SYSTEM_ERROR, "该订单未支付"); + + OrderRefunds orderRefunds = new OrderRefunds(); + BeanUtils.copyProperties(refundAddRequest, orderRefunds); + orderRefunds.setUserId(loginUser.getId()); + + boolean save = refundsService.save(orderRefunds); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建退款单失败"); + return ResultUtils.success(true, "申请退款成功,等待商家确认"); + } + + /** + * 商家查询退款单 + * @param status 退款单的状态 + * @param request 网络请求 + * @return 退款列表 + */ + @GetMapping("/list/business") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse> listRefundByBusiness(@RequestParam Integer status, HttpServletRequest request) { + Business loginBusiness = businessService.getLoginBusiness(request); + Long id = loginBusiness.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(OrderRefunds::getStatus, status) + .inSql(OrderRefunds::getOrderId, "SELECT id FROM orders WHERE businessId = " + id); // 根据商家ID过滤订单 + List list = refundsService.list(queryWrapper); + return ResultUtils.success(list); + } + + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse updateRefundByBusiness (@RequestBody RefundUpdateRequest updateRequest, HttpServletRequest request) { + if (updateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long orderId = updateRequest.getOrderId(); + Integer status = updateRequest.getStatus(); + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + Orders orders = ordersService.getOne(Wrappers.lambdaQuery() + .eq(Orders::getId, orderId)); + ThrowUtils.throwIf(orders == null, ErrorCode.PARAMS_ERROR, "传入的订单id不正确"); + ThrowUtils.throwIf(businessId.equals(orders.getBusinessId()), ErrorCode.PARAMS_ERROR, "当前订单不属于该商家"); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(OrderRefunds::getOrderId, orderId); + OrderRefunds refunds = refundsService.getOne(queryWrapper); + refunds.setStatus(status); // 1-已同意 2 - 已拒绝 + ThrowUtils.throwIf(status == 2 && updateRequest.getRefuseReason() == null, ErrorCode.PARAMS_ERROR, "请填写退款原因"); + boolean updateById = refundsService.updateById(refunds); + ThrowUtils.throwIf(!updateById, ErrorCode.OPERATION_ERROR, "修改退款单状态失败"); + return ResultUtils.success(true); + } + + @PostMapping("/list/reson") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> getReasonByAdmin() { + // 获取今天的开始和结束时间 + LocalDate today = LocalDate.now(); + LocalDateTime startOfDay = today.atStartOfDay(); // 今天的00:00:00 + LocalDateTime endOfDay = today.atTime(LocalTime.MAX); // 今天的23:59:59.999999999 + + // 将 LocalDateTime 转换为 Date + Date startOfDayDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); + Date endOfDayDate = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(OrderRefunds::getCreateTime, startOfDayDate); + queryWrapper.le(OrderRefunds::getCreateTime, endOfDayDate); + List refunds = refundsService.list(queryWrapper); + List collect = refunds.stream() + .map(OrderRefunds::getReason) + .collect(Collectors.toList()); + return ResultUtils.success(collect); + } + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SmsController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SmsController.java new file mode 100644 index 0000000..3c4031f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SmsController.java @@ -0,0 +1,53 @@ +package com.bsz.school_send_back_end.controller; + +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.utils.AliyunSmsUtils; +import com.bsz.school_send_back_end.utils.RandomNumberGenerator; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import java.util.HashMap; +import java.util.concurrent.TimeUnit; + +@Tag(name = "阿里云短信接口") +@RestController +@Slf4j +@RequestMapping("/sms") +public class SmsController { + + @Resource + private RedisTemplate redisTemplate; + + @Resource + private RandomNumberGenerator randomNumberGenerator; + + @Resource + private AliyunSmsUtils aliyunSmsUtils; + + @GetMapping("/send/{phone}") + public BaseResponse sendCode (@PathVariable String phone) { + String code = (String) redisTemplate.opsForValue().get(phone); + log.info("获取验证码:{}", code); + + if (code == null) { + String fourBitRandom = randomNumberGenerator.getFourBitRandom(); + HashMap hashMap = new HashMap<>(); + hashMap.put("code", fourBitRandom); + log.info("生成的验证码:" + fourBitRandom); + redisTemplate.opsForValue().set(phone, fourBitRandom, 5, TimeUnit.MINUTES); + boolean b = aliyunSmsUtils.sendSms(phone, hashMap); + log.info("短信发送状态,{}", b); + return ResultUtils.success("发送成功"); + } else { + return ResultUtils.success("请勿重复发送验证码"); + } + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SpecificationsController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SpecificationsController.java new file mode 100644 index 0000000..58e88dd --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SpecificationsController.java @@ -0,0 +1,149 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Specifications; +import com.bsz.school_send_back_end.model.domain.SpecificationsDishes; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeAddRequest; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeUpdateRequest; +import com.bsz.school_send_back_end.model.dto.specifications.SpecificationsAddRequest; +import com.bsz.school_send_back_end.model.dto.specifications.SpecificationsMyQueryRequest; +import com.bsz.school_send_back_end.model.dto.specifications.SpecificationsQueryRequest; +import com.bsz.school_send_back_end.model.dto.specifications.SpecificationsUpdateRequest; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; +import com.bsz.school_send_back_end.service.AttributeService; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.SpecificationsDishesService; +import com.bsz.school_send_back_end.service.SpecificationsService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +@Slf4j +@RestController +@Tag(name = "规格接口") +@RequestMapping("/specifications") +public class SpecificationsController { + + @Resource + private SpecificationsService specificationsService; + + @Resource + private SpecificationsDishesService specificationsDishesService; + + @Resource + private BusinessService businessService; + + @Resource + private AttributeService attributeService; + + /** + * 添加规格 + * @param specificationsAddRequest 添加请求体 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/add") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @Transactional(rollbackFor = Exception.class) + public BaseResponse addSpecifications(@RequestBody SpecificationsAddRequest specificationsAddRequest, HttpServletRequest request){ + if (specificationsAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Specifications specifications = new Specifications(); + BeanUtils.copyProperties(specificationsAddRequest,specifications); + //校验请求体 + specificationsService.validSpecifications(specifications, false); + //添加规格和属性 + List attributeAddRequests = specificationsAddRequest.getAttributeAddRequests(); + Boolean aBoolean = specificationsService.addSpecifications(specifications, attributeAddRequests, request); + ThrowUtils.throwIf(!aBoolean, ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true); + } + + /**· + * 更新规格 + * @param specificationsUpdateRequest 更新请求体 + * @param request 网络请求 + * @return 是否成功 + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + @Transactional(rollbackFor = Exception.class) + public BaseResponse updateSpecifications(@RequestBody SpecificationsUpdateRequest specificationsUpdateRequest, HttpServletRequest request) { + if (specificationsUpdateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Specifications specifications = new Specifications(); + BeanUtils.copyProperties(specificationsUpdateRequest,specifications); + //校验 + specificationsService.validSpecifications(specifications,true); + + //更新规格和属性 + List attributeUpdateRequests = specificationsUpdateRequest.getAttributeUpdateRequests(); + Boolean aBoolean = specificationsService.updateSpecifications(specifications, attributeUpdateRequests, request); + ThrowUtils.throwIf(!aBoolean, ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true); + } + + /** + * 根据菜品id获取规格脱敏信息 + * @param specificationsMyQueryRequest 请求体 + * @return 脱敏列表 + */ + @PostMapping("/list/specificationsVOByDishesId") + public BaseResponse> specificationsVOByDishesId(@RequestBody SpecificationsMyQueryRequest specificationsMyQueryRequest) { + if (specificationsMyQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long dishesId = specificationsMyQueryRequest.getId(); + //根据id获取中间表数据 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("dishesId",dishesId); + List list = specificationsDishesService.list(queryWrapper); + //根据中间表数据中的规格获取规格信息和属性 + return ResultUtils.success(specificationsDishesService.getSpecificationsAddAttribute(list)); + } + + /** + * 获取脱敏列表 + * @param specificationsQueryRequest 前端请求 + * @param request 网络请求 + * @return 脱敏列表 + */ + @PostMapping("/list/specificationsVO") + public BaseResponse> specificationsVOList(@RequestBody SpecificationsQueryRequest specificationsQueryRequest, HttpServletRequest request) { + //获取商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + //获取商家的规格表 + String specificationsName = specificationsQueryRequest.getSpecificationsName(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(StringUtils.isNotBlank(specificationsName), "specificationsName", specificationsName); + queryWrapper.eq("businessId",businessId); + List list = specificationsService.list(queryWrapper); + //对规格信息脱敏 + List specificationsVO = specificationsService.getSpecificationsVO(list); + //获取各规格的属性脱敏信息 + return ResultUtils.success(attributeService.getBySpecificationsVoId(specificationsVO)); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SystemInfoController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SystemInfoController.java new file mode 100644 index 0000000..9082c9f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SystemInfoController.java @@ -0,0 +1,79 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Systeminfo; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.system.SystemAddRequest; +import com.bsz.school_send_back_end.model.dto.system.SystemQueryRequest; +import com.bsz.school_send_back_end.service.SysteminfoService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import java.util.List; + +@Tag(name = "公告与轮播图接口") +@RestController +@Slf4j +@RequestMapping("/system") +public class SystemInfoController { + + @Resource + private SysteminfoService systeminfoService; + + /** + * 添加功能 + */ + @PostMapping("/add") + public BaseResponse addInfo (@RequestBody SystemAddRequest systemAddRequest) { + if (systemAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Systeminfo systeminfo = new Systeminfo(); + BeanUtils.copyProperties(systemAddRequest, systeminfo); + ThrowUtils.throwIf(systeminfo.getContent() == null, ErrorCode.PARAMS_ERROR, "内容为空"); + boolean save = systeminfoService.save(systeminfo); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true, "添加成功"); + } + + /** + * 删除功能 + */ + @PostMapping("/delete") + public BaseResponse deleteInfo (@RequestBody CommonRequest commonRequest) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + boolean remove = systeminfoService.removeById(commonRequest.getId()); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR, "添加失败"); + return ResultUtils.success(true,"删除成功"); + } + + /** + *查询列表 + */ + @PostMapping("/list") + public BaseResponse> selectInfo (@RequestBody SystemQueryRequest common) { + if (common == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Systeminfo::getType, common.getType()); + List list = systeminfoService.list(queryWrapper); + + return ResultUtils.success(list,"查询成功"); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SystemLogController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SystemLogController.java new file mode 100644 index 0000000..e6e5247 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/SystemLogController.java @@ -0,0 +1,88 @@ +package com.bsz.school_send_back_end.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Systemlog; +import com.bsz.school_send_back_end.model.dto.log.LogQueryRequest; +import com.bsz.school_send_back_end.model.vo.BusinessLogVO; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.SystemlogService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "系统日志接口") +@RestController +@RequestMapping("/log") +@Slf4j +public class SystemLogController { + + @Resource + private BusinessService businessService; + + @Resource + private SystemlogService systemlogService; + /** + * 分页获取商家系统日志列表 + */ + @PostMapping("/business/logs") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> getLogByPage(@RequestBody LogQueryRequest logQueryRequest) { + if (logQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + long current = logQueryRequest.getCurrent(); + long pageSize = logQueryRequest.getPageSize(); + + //根据手机号获取用户id + String businessPhone = logQueryRequest.getBusinessPhone(); + if (StringUtils.isNotBlank(businessPhone)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Business::getBusinessPhone, businessPhone); + Business business = businessService.getOne(wrapper); + if (business == null) { + logQueryRequest.setUserId((long) -1); + } + else { + logQueryRequest.setUserId(business.getUserId()); + } + } + Page systemlogPage = systemlogService.page(new Page<>(current, pageSize), + systemlogService.getQueryWrapper(logQueryRequest)); + List systemlogList = systemlogPage.getRecords(); + List businessLogVOList = systemlogList.stream().map(item -> { + BusinessLogVO businessLogVO = new BusinessLogVO(); + BeanUtils.copyProperties(item, businessLogVO); + //查询商家信息 + Long userId = item.getUserId(); + Business business = null; + if (userId != null && userId > -1) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userId", userId); + business = businessService.getOne(queryWrapper); + } + businessLogVO.setBusiness(business); + return businessLogVO; + }).collect(Collectors.toList()); + Page businessLogVOPage = new Page<>(current, pageSize, systemlogPage.getTotal()); + businessLogVOPage.setRecords(businessLogVOList); + return ResultUtils.success(businessLogVOPage); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/TestAlipayController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/TestAlipayController.java new file mode 100644 index 0000000..6843542 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/TestAlipayController.java @@ -0,0 +1,319 @@ +package com.bsz.school_send_back_end.controller; + +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.*; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.request.*; +import com.alipay.api.response.*; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.config.AlipayClients; +import com.bsz.school_send_back_end.contant.RedisKeyConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.listener.RabbitMQSender; +import com.bsz.school_send_back_end.mapper.UserMapper; +import com.bsz.school_send_back_end.model.domain.OrderRefunds; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.vo.UserVO; +import com.bsz.school_send_back_end.service.*; +import com.bsz.school_send_back_end.utils.RandomNumberGenerator; +import com.bsz.school_send_back_end.utils.UniqueNumberGenerator; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.util.*; + +@Tag(name = "支付宝支付相关接口") +@RestController +@Slf4j +@RequestMapping("/Alipay") +public class TestAlipayController { + + @Resource + private UserService userService; + + @Resource + private OrdersService ordersService; + + @Resource + private AliPayService aliPayService; + + @Resource + private WebsocketService websocketService; + + @Resource + private OrderRefundsService refundsService; + + @Resource + private RabbitMQSender rabbitMQSender; + + + + + @Value("${alipay.appId}") + public String appId; + + @Value("${alipay.appPrivateKey}") + public String appPrivateKey; + + @Value("${alipay.alipayPublicKey}") + public String PublicKey; + + @Resource + private UserMapper userMapper; + + @Resource + private RandomNumberGenerator randomNumberGenerator; + + private static String authToken; + + public static final String NOURL = "https://xiaokuaisong.shop/api/Alipay/notifyUrl"; + + /** + * 解析code获取open_id和token + * @return aaa + * @throws AlipayApiException 支付宝api异常 + */ + @GetMapping("/parseCode") + public BaseResponse login(String authcode, HttpServletRequest req) throws AlipayApiException { + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId(appId); + alipayConfig.setPrivateKey(appPrivateKey); + alipayConfig.setFormat("json"); + alipayConfig.setAlipayPublicKey(PublicKey); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setSignType("RSA2"); + log.info("网关地址:" + alipayConfig.getServerUrl()); + AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig); + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + request.setCode(authcode); + request.setGrantType("authorization_code"); + AlipaySystemOauthTokenResponse response = alipayClient.execute(request); + System.out.println( "AlipaySystemOauthTokenResponse返回数据:" + response.getBody()); //打印所有响应 + authToken = response.getAccessToken(); + if (!response.isSuccess()) { + return ResultUtils.error(ErrorCode.PARAMS_ERROR); + } + AlipayUserInfoShareRequest request1 = new AlipayUserInfoShareRequest(); + AlipayUserInfoShareResponse response1 = alipayClient.execute(request1, authToken); + System.out.println( "AlipayUserInfoShareResponse返回数据:" + response1.getBody()); + User oid = userMapper.selectOne(new LambdaQueryWrapper().eq(User::getOpenId, response.getOpenId())); + UserVO userVO = new UserVO(); + if (response1.isSuccess()) { + if (oid == null) { + User user = new User(); + user.setOpenId(response.getOpenId()); + user.setUsername(StringUtils.isAnyBlank(response1.getNickName()) ? "RandomName" + randomNumberGenerator.generateRandomNumber() : response1.getNickName()); + user.setUserPassword("123456"); + user.setUserAccount("yonghu" + randomNumberGenerator.generateRandomNumber()); + user.setAvatarUrl(StringUtils.isAnyBlank(response1.getAvatar()) ? "https://tfs.alipayobjects.com/images/partner/ATuihpR50zu7UAAAAAAAAAAAAADtl2AA" : response1.getAvatar()); + userMapper.insert(user); + req.getSession().setAttribute(RedisKeyConstant.USER_LOGIN_STATE,user); + BeanUtils.copyProperties(user, userVO); + userVO.setSessionId(req.getSession().getId()); + return ResultUtils.success(userVO,"注册成功"); + } + req.getSession().setAttribute(RedisKeyConstant.USER_LOGIN_STATE, oid); + BeanUtils.copyProperties(oid, userVO); + userVO.setSessionId(req.getSession().getId()); + return ResultUtils.success(userVO,"登录成功"); + } + req.getSession().setAttribute(RedisKeyConstant.USER_LOGIN_STATE,oid); + BeanUtils.copyProperties(oid, userVO); + userVO.setSessionId(req.getSession().getId()); + return ResultUtils.success(userVO,"登录成功"); + } + + + @GetMapping("/payment/create") + public BaseResponse AlipayTradeCreate(@RequestParam Long id, HttpServletRequest request) throws AlipayApiException { + User loginUser = userService.getLoginUser(request); + String miniOpenId = loginUser.getOpenId(); + ThrowUtils.throwIf(miniOpenId == null, ErrorCode.NOT_FOUND_ERROR, "不是小程序用户"); + Long orderId = id; + Orders order = ordersService.getById(orderId); + ThrowUtils.throwIf(order == null, ErrorCode.NOT_FOUND_ERROR, "订单不存在"); + ThrowUtils.throwIf(order.getState() != 0, ErrorCode.OPERATION_ERROR, "订单状态错误"); + + if (!loginUser.getId().equals(order.getUserId())) { + throw new BusinessException(ErrorCode.NO_AUTH, "你不是该订单用户!"); + } + + String tradeNo = aliPayService.createPayment(String.valueOf(orderId), miniOpenId, order.getTotalPrice()); + log.info("tradeNo:" + tradeNo); + return ResultUtils.success(tradeNo); + } + + @GetMapping("/test/close") + public String closeOrder(String out_trade_no, Long orderId) throws AlipayApiException { + + log.info("out_trade_no:" + out_trade_no); + AlipayClients clients = new AlipayClients(); + AlipayTradeCloseRequest request = new AlipayTradeCloseRequest(); + AlipayTradeCloseModel model = new AlipayTradeCloseModel(); + + //model.setTradeNo(); 这是订单项 + //订单项可能会有多个支付单 + model.setTradeNo(out_trade_no); + + request.setBizModel(model); +// request.setNotifyUrl(NOURL + "/close"); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Orders::getId, orderId); + Orders orders = ordersService.getOne(queryWrapper); + log.info("orders:" + orders); + ThrowUtils.throwIf(!orders.getState().equals(0),ErrorCode.SYSTEM_ERROR,"当前订单已支付或已退款"); + orders.setState(3); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败"); + AlipayTradeCloseResponse response = clients.alipayClient().execute(request); + if (!response.isSuccess()) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "支付宝修改订单失败"); + } + //这里应该写进日志 + log.info("订单已取消"); + + return response.getBody(); + } + + @GetMapping("/test/refund") + @Transactional(rollbackFor = Exception.class) + public String test_refund(String orderNo) throws AlipayApiException { + AlipayClients clients = new AlipayClients(); + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + AlipayTradeRefundModel model = new AlipayTradeRefundModel(); + + + QueryWrapper ordersQueryWrapper = new QueryWrapper<>(); + ordersQueryWrapper.eq("pickupCode", orderNo); + Orders orders = ordersService.getOne(ordersQueryWrapper); + model.setOutTradeNo(orderNo); + model.setRefundAmount(String.valueOf(orders.getTotalPrice())); + //退款请求单号 要求唯一 需改 + String number = UniqueNumberGenerator.generateNumber(); + model.setOutRequestNo(number); + log.info("outRequestNo:" + number); + request.setBizModel(model); + ThrowUtils.throwIf(!orders.getState().equals(1),ErrorCode.SYSTEM_ERROR,"当前订单未支付"); + orders.setState(2); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败"); + log.info("orderState:" + orders.getState()); + OrderRefunds refunds = refundsService.getOne(Wrappers.lambdaQuery() + .eq(OrderRefunds::getOrderId, orders.getId())); + ThrowUtils.throwIf(refunds == null, ErrorCode.OPERATION_ERROR, "没有退款"); + refunds.setStatus(1); // 1-已同意 + boolean updateById = refundsService.updateById(refunds); + ThrowUtils.throwIf(!updateById, ErrorCode.OPERATION_ERROR, "修改退款单失败"); + AlipayTradeRefundResponse response = clients.alipayClient().execute(request); + String body = response.getBody(); + if (!response.isSuccess()) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "支付宝退款失败"); + } + log.info("退款成功"); + return body; + } + + @GetMapping("/test/query") + public String test_query (String orderNo) throws AlipayApiException { + AlipayClients clients = new AlipayClients(); + AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); + AlipayTradeQueryModel model = new AlipayTradeQueryModel(); + + model.setOutTradeNo(orderNo); + + request.setBizModel(model); + request.setNotifyUrl(NOURL); + + AlipayTradeQueryResponse response = clients.alipayClient().execute(request); + String body = response.getBody(); + if (!response.isSuccess()) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "支付宝查询订单失败"); + } + return body; + } + + @PostMapping("/notifyUrl") + @Transactional(rollbackFor = Exception.class) + public synchronized void aliPayNotifyUrl(HttpServletRequest request, HttpServletResponse response) { + + // 将 HttpServletRequest 的参数转换为 Map + Map params = new HashMap<>();Map requestParams = request.getParameterMap(); + for(String name : requestParams.keySet()) { + params.put(name, request.getParameter(name)); + } + //修改订单信息 + String out_trade_no = params.get("out_trade_no"); + QueryWrapper ordersQueryWrapper = new QueryWrapper<>(); + ordersQueryWrapper.eq("pickupCode", out_trade_no); + Orders orders = ordersService.getOne(ordersQueryWrapper); + if (orders.getPickupMethod() == 2) { + rabbitMQSender.sendCreateDeliveryOrderMessage(orders.getId()); + } + orders.setState(1); + Date date = new Date(); + orders.setUpdateTime(date); + boolean update = ordersService.updateById(orders); + log.info("修改前orders:" + orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败"); + log.info("修改后orders:" + orders); + //TODO 商家通知 + websocketService.sendOrderMessage(orders); + + String resultInfo = "buyer_id=208****42&total_amount=0.01&body=***试&trade_no=20190329**941025940236¬ify_time=2019-03-29 19:42:04&subject=**电脑网站支付&sign_type=RSA2&charset=UTF-8&auth_app_id=201****222¬ify_type=trade_status_sync&invoice_amount=0.01&out_trade_no=20190329ygyg45484544100003&trade_status=TRADE_SUCCESS&gmt_payment=2019-03-29 19:42:03&version=1.0&point_amount=0.00&sign=LDDUIGQmc+1qNtk3oyoAKVeMUKTngdX3ZjVeZOK0EjiPDJ/+Nk+0WSqcE6J7/5xb96Z/vP0yY3pVhZUiFVJ1G45/ys/HAleHh+EERZ1lkCkule1sSyaGFTKQGKx4uHpTyqIgRB1bouf19RPbSx1EkA0VkCarSy9G/OEG5Qmg8UdL2dRulMhlbOHS7tdMJJycDA8vOspOUMeQmk/H6IK9R2Kou5hN2T3KR1GWLYFK+z1jeZhQB3q52lZynO0OFjSzU4aQUBMW5QskQppBYd/ghtY/2YP+2H6YVGNgVmaheZMQ3PVTBALEV+8rZa91salH9DkKN2UCYGvNSNDT1VGCTQ==&gmt_create=2019-03-29 19:42:00&buyer_pay_amount=0.01&receipt_amount=0.01&fund_bill_list=[{\"amount\":\"0.01\",\"fundChannel\":\"PCREDIT\"}]&seller_id=208****5&app_id=2014100***22¬ify_id=20190329002221942040**8"; + //编码格式 + String charset="utf-8"; + //签名方式 + String sign_type="RSA2"; + //对待签名字符串数据通过&进行拆分 + String [] temp = resultInfo.split("&"); + LinkedHashMap map = new LinkedHashMap(); + //把拆分数据放在map集合内 + for (int i = 0; i < temp.length; i++) { + String[] arr = temp[i].split("=", 2); //通过"="号分割成2个数据 + String[] tempAagin = new String[arr.length]; //再开辟一个数组用来接收分割后的数据 + for (int j = 0; j < arr.length; j++) { + tempAagin[j] = arr[j]; + } + map.put(tempAagin[0], tempAagin[1]); + } + System.out.println(map); + + + try { + //验签方法 + boolean signVerified = AlipaySignature.rsaCheckV1(params,PublicKey,charset,sign_type); + response.setContentType("text/html;charset=utf-8"); + PrintWriter writer = response.getWriter(); + if (signVerified && "TRADE_SUCCESS".equals(params.get("trade_status"))) { + // 业务处理 + writer.println("success"); + } else { + writer.println("fail"); + + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/UserController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/UserController.java new file mode 100644 index 0000000..e3760fa --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/UserController.java @@ -0,0 +1,384 @@ +package com.bsz.school_send_back_end.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.vo.LoginUserVO; +import com.bsz.school_send_back_end.model.dto.user.*; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.mapper.UserMapper; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.annotations.ApiOperation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.util.DigestUtils; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.bsz.school_send_back_end.contant.UserConstant.*; + +/** + * 用户接口 + */ +@Tag(name = "用户接口") +@RestController +@RequestMapping("/user") +public class UserController { + + @Resource + private UserService userService; + + @Resource + private UserMapper userMapper; + + /** + * 用户注册请求接口 + * + * @param userRegisterRequest + * @return + */ + @PostMapping("/register") + public BaseResponse userRegister(@RequestBody UserRegisterRequest userRegisterRequest) { + if (userRegisterRequest == null){ + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + + String userAccount = userRegisterRequest.getUserAccount(); + String userPassword = userRegisterRequest.getUserPassword(); + String checkPassword = userRegisterRequest.getCheckPassword(); + + if (StringUtils.isAllBlank(userAccount, userPassword, checkPassword)) { + return ResultUtils.error(ErrorCode.PARAMS_ERROR); + } + + long result = userService.userRegister(userAccount, userPassword, checkPassword); + return ResultUtils.success(result); + } + + + /** + * 用户登录请求接口 + * + * @param userLoginRequest + * @param request 前端请求对象 + * @return + */ + @PostMapping("/login") + public BaseResponse userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) { + if (userLoginRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + + String userAccount = userLoginRequest.getUserAccount(); + String userPassword = userLoginRequest.getUserPassword(); + String appName = userLoginRequest.getAppName(); + + if (StringUtils.isAllBlank(userAccount, userPassword)){ + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + + String message = userService.userLogin(userAccount, userPassword, appName, request); + return ResultUtils.success(message); + } + + /* + @GetMapping("/search") + public BaseResponse> searchUsers( String username, HttpServletRequest request) { + if (!isAdmin(request)){ + throw new BusinessException(ErrorCode.NO_AUTH, "缺少管理员权限"); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(username)) { + queryWrapper.like("userAccount", username); + } + + List userList = userService.list(queryWrapper); + + List list = userList.stream().map(user -> userService.getSafetyUser(user)).collect(Collectors.toList()); + return ResultUtils.success(list); + }*/ + + /** + * 查询用户 + * + * @param searchRequest + * @param request + * @return + */ + @GetMapping("/search") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> searchUsers(UserSearchRequest searchRequest, HttpServletRequest request) { + String username = searchRequest.getUsername(); + String userAccount = searchRequest.getUserAccount(); + Integer gender = searchRequest.getGender(); + String phone = searchRequest.getPhone(); + String email = searchRequest.getEmail(); + Integer userStatus = searchRequest.getUserStatus(); + String userRole = searchRequest.getUserRole(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + Date updateTime = searchRequest.getUpdateTime(); + Date createTime = searchRequest.getCreateTime(); + + //校验 + // username + if (StringUtils.isNotBlank(username)) { + queryWrapper.like("username", username); + } + // userAccount + if (StringUtils.isNotBlank(userAccount)) { + queryWrapper.like("userAccount", userAccount); + } + // gender + if (gender != null) { + queryWrapper.eq("gender", gender); + } + // phone + if (StringUtils.isNotBlank(phone)) { + queryWrapper.like("phone", phone); + } + // email + if (StringUtils.isNotBlank(email)) { + queryWrapper.like("email", email); + } + // userStatus + if (userStatus != null) { + queryWrapper.eq("userStatus", userStatus); + } + + //userRole + if (userRole != null) { + queryWrapper.eq("userRole", userRole); + } + + + if (updateTime != null) { + queryWrapper.like("updateTime", updateTime); + } + if (createTime != null) { + queryWrapper.like("createTime", createTime); + } + List userList = userService.list(queryWrapper); + List users = userList.stream().map(userService::getSafetyUser).collect(Collectors.toList()); + return ResultUtils.success(users); + } + + /** + * 用户注销的接口 + * + * @param request + * @return + */ + @PostMapping("/logout") + public BaseResponse userLogout(HttpServletRequest request) { + if (request == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + int logoutResult = userService.userLogout(request); + return ResultUtils.success(logoutResult); + } + + /** + * 获取当前的用户 + * @param request + * @return + */ + @GetMapping("/current") + public BaseResponse getCurrenUser(HttpServletRequest request) { + //获取登录态 + User user = userService.getLoginUser(request); + return ResultUtils.success(userService.getLoginUserVO(user)); + } + + /** + * 新增用户 + * + * @param userAddRequest + * @param request + * @return + */ + @PostMapping("/add") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse addUser(@RequestBody UserAddRequest userAddRequest, HttpServletRequest request) { + if (userAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + User user = new User(); + String userAccount = userAddRequest.getUserAccount(); + String userPassword = userAddRequest.getUserPassword(); + if (StringUtils.isAllEmpty(userAccount,userPassword)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"未输入账号和密码"); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userAccount", userAccount); + Long count = userMapper.selectCount(queryWrapper); + if (count > 0){ + throw new BusinessException(ErrorCode.PARAMS_ERROR, "存在相同用户"); + } + + BeanUtils.copyProperties(userAddRequest, user); + String encryptPassword = DigestUtils.md5DigestAsHex((USER_SALT + userPassword).getBytes()); + user.setUserPassword(encryptPassword); + boolean result = userService.save(user); + if (!result) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "操作失败"); + } + return ResultUtils.success(user.getId()); + } + + /** + * 删除用户 + * + * @param deleteRequest + * @param request + * @return + */ + @PostMapping("delete") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse deleteUser(@RequestBody UserDeleteRequest deleteRequest, HttpServletRequest request) { + if (deleteRequest == null || deleteRequest.getId() <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + boolean removeUser = userService.removeById(deleteRequest.getId()); + return ResultUtils.success(removeUser); + } + /** + * 更新用户 + * + * @param userUpdateRequest + * @param request + * @return + */ + @PostMapping("/update") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse updateUser(@RequestBody UserUpdateRequest userUpdateRequest , HttpServletRequest request) { + if (userUpdateRequest == null || userUpdateRequest.getId() == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数错误"); + } + + + User user = new User(); + BeanUtils.copyProperties(userUpdateRequest, user); + boolean result = userService.updateById(user); + if (!result) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "未找到该用户"); + } + return ResultUtils.success(true); + } + + /** + * 根据 id 获取用户(仅管理员) + * + * @param id id + * @return 用户信息 + */ + @GetMapping("/getById") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse getUserById(@RequestParam long id) { + if (id <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + User user = userService.getById(id); + ThrowUtils.throwIf(user == null, ErrorCode.PARAMS_ERROR); + return ResultUtils.success(user); + } + + /** + * 分页获取用户列表(仅管理员) + * + * @return 用户列表 + */ + @PostMapping("/list/page") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse> listUserByPage(@RequestBody UserSearchRequest userSearchRequest, HttpServletRequest request) { + long current = userSearchRequest.getCurrent(); + long size = userSearchRequest.getPageSize(); + Page userPage = userService.page(new Page<>(current, size), + userService.getQueryWrapper(userSearchRequest)); + return ResultUtils.success(userPage); + } + + + /** + * 用户自己更新个人信息 + * + * @param userUpdateMyRequest + * @param request + * @return + */ + @PostMapping("/update/my") + @ApiOperation(value = "用户更新信息") + public BaseResponse updateMyUser(@RequestBody UserUpdateMyRequest userUpdateMyRequest, + HttpServletRequest request) { + if (userUpdateMyRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + User loginUser = userService.getLoginUser(request); + User user = new User(); + BeanUtils.copyProperties(userUpdateMyRequest, user); + user.setId(loginUser.getId()); + boolean result = userService.updateById(user); + ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true); + } + + /** + * 修改密码 + * + * @param updatePasswordRequest + * @param request + * @return + */ + @PostMapping("/update/password") + @ApiOperation(value = "用户密码更改") + @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse updateUserPassword(@RequestBody UserUpdatePasswordRequest updatePasswordRequest, + HttpServletRequest request) { + boolean updateUserPassword = userService.updateUserPassword(updatePasswordRequest, request); + if (updateUserPassword) { + return ResultUtils.success(true); + } else { + return ResultUtils.error(ErrorCode.OPERATION_ERROR); + } + } + + + +// /** +// * 用户登录(支付宝) +// */ +// /** +// * 用户登录(支付宝) +// */ +// @GetMapping("/login/alipay") +// public BaseResponse userLoginByAlipay(HttpServletRequest request, @RequestParam("authCode") String authCode) { +// AlipaySystemOauthTokenResponse oauthTokenResponse; +// try { +// // 获取access_token 和 openId +// oauthTokenResponse = Factory.Base.OAuth().getToken(authCode); +// String accessToken = oauthTokenResponse.getAccessToken(); +// // 获取用户信息 +// JSONObject userInfo = AlipayUtils.getUserInfo(accessToken); +// String openId = userInfo.getStr("open_id"); +// return ResultUtils.success(userService.userLoginByAlipay(openId, userInfo, request)); +// } catch (Exception e) { +// throw new BusinessException(ErrorCode.SYSTEM_ERROR, "登录失败,系统错误"); +// } +// } + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/UserRatingController.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/UserRatingController.java new file mode 100644 index 0000000..29260c4 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/controller/UserRatingController.java @@ -0,0 +1,138 @@ +package com.bsz.school_send_back_end.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsz.school_send_back_end.annotation.AuthCheck; +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.domain.UserRating; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.userRating.UserRatingAddRequest; +import com.bsz.school_send_back_end.model.dto.userRating.UserRatingReviewRequest; +import com.bsz.school_send_back_end.service.UserRatingService; +import com.bsz.school_send_back_end.service.UserService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +@Tag(name = "用户评分接口") +@RestController +@Slf4j +@RequestMapping("/level") +public class UserRatingController { + + @Resource + private UserRatingService userRatingService; + + @Resource + private UserService userService; + + /** + * 添加用户评分 + * @param userRatingAddRequest 用户评分请求 + * @param request 当期那登录用户 + * @return 是否添加成功 + */ + @PostMapping("/add") + public BaseResponse addRating (@RequestBody UserRatingAddRequest userRatingAddRequest, HttpServletRequest request) { + if (userRatingAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + UserRating userRating = new UserRating(); + BeanUtils.copyProperties(userRatingAddRequest, userRating); + userRatingService.validUserRating(userRating, request); + boolean save = userRatingService.save(userRating); + ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR, "添加失败"); + return ResultUtils.success(true); + } + + /** + * 删除用户评分 + * @param commonRequest 用户评分id + * @return 是否删除成功 + */ + @PostMapping("/delete") + public BaseResponse deleteUserRating (@RequestBody CommonRequest commonRequest) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + boolean remove = userRatingService.removeById(commonRequest.getId()); + ThrowUtils.throwIf(!remove, ErrorCode.SYSTEM_ERROR, "删除失败"); + + return ResultUtils.success(true); + } + + /** + * 展示当前用户评分 + * @param request 当前用户 + * @return 评分列表 + */ + @PostMapping("/list") + public BaseResponse> listUserRating (@RequestBody CommonRequest commonRequest, HttpServletRequest request) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long ratedEntityType = commonRequest.getId(); + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + List list = userRatingService.list(Wrappers.lambdaQuery() + .eq(UserRating::getUserId, userId).eq(UserRating::getRatedEntityType, ratedEntityType) ); + return ResultUtils.success(list); + } + + /** + * 展示当前用户评分 + * @param request 当前用户 + * @return 评分列表 + */ + @PostMapping("/list/user") + public BaseResponse> listUserRatingByUser (HttpServletRequest request) { + List userRatings = userRatingService.listUserRatingByUser(request); + return ResultUtils.success(userRatings); + } + + @PostMapping("/business/reply") + @AuthCheck(mustRole = UserConstant.BUSINESS_ROLE) + public BaseResponse businessReply (@RequestBody UserRatingReviewRequest userRatingReviewRequest, HttpServletRequest request) { + if (userRatingReviewRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long id = userRatingReviewRequest.getId(); + String businessReview = userRatingReviewRequest.getBusinessReview(); + userRatingService.validUserRatingByBusiness(id, request); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserRating::getId, id); + UserRating userRating = userRatingService.getOne(wrapper); + userRating.setBusinessReview(businessReview); + boolean update = userRatingService.updateById(userRating); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR); + return ResultUtils.success(true); + } + + @PostMapping("/list/business") + public BaseResponse> listUserRatingByBusiness (@RequestBody CommonRequest commonRequest) { + if (commonRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + Long businessId = commonRequest.getId(); + + List list = userRatingService.list(Wrappers.lambdaQuery() + .eq(UserRating::getRatedEntityId, businessId)); + return ResultUtils.success(list); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/BusinessException.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/BusinessException.java new file mode 100644 index 0000000..c72a984 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/BusinessException.java @@ -0,0 +1,49 @@ +package com.bsz.school_send_back_end.exception; + + +import com.bsz.school_send_back_end.common.ErrorCode; + +/** + * 自定义异常类 + * + */ +public class BusinessException extends RuntimeException { + + /** + * 异常码 + */ + private final int code; + + /** + * 描述 + */ + private final String description; + + public BusinessException(String message, int code, String description) { + super(message); + this.code = code; + this.description = description; + } + + public BusinessException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.code = errorCode.getCode(); + this.description = errorCode.getDescription(); + } + + public BusinessException(ErrorCode errorCode, String description) { + super(errorCode.getMessage()); + this.code = errorCode.getCode(); + this.description = description; + } + + public int getCode() { + return code; + } + + + + public String getDescription() { + return description; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/GlobalExceptionHandler.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..0965f8b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/GlobalExceptionHandler.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.exception; + + +import com.bsz.school_send_back_end.common.BaseResponse; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.common.ResultUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * 全局异常处理器 + * + */ +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(BusinessException.class) + public BaseResponse businessExceptionHandler(BusinessException e) { + log.error("businessException: " + e.getMessage(), e); + return ResultUtils.error(e.getCode(), e.getMessage(), e.getDescription()); + } + + @ExceptionHandler(RuntimeException.class) + public BaseResponse runtimeExceptionHandler(RuntimeException e) { + log.error("runtimeException", e); + return ResultUtils.error(ErrorCode.SYSTEM_ERROR, e.getMessage(), ""); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/ThrowUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/ThrowUtils.java new file mode 100644 index 0000000..65b901e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/exception/ThrowUtils.java @@ -0,0 +1,44 @@ +package com.bsz.school_send_back_end.exception; + + +import com.bsz.school_send_back_end.common.ErrorCode; + +/** + * 抛异常工具类 + */ +@SuppressWarnings("all") +public class ThrowUtils { + + /** + * 条件成立则抛异常 + * + * @param condition 条件 + * @param runtimeException 运行时异常 + */ + public static void throwIf(boolean condition, RuntimeException runtimeException) { + if (condition) { + throw runtimeException; + } + } + + /** + * 条件成立则抛异常 + * + * @param condition 条件 + * @param errorCode 自定义异常 + */ + public static void throwIf(boolean condition, ErrorCode errorCode) { + throwIf(condition, new BusinessException(errorCode)); + } + + /** + * 条件成立则抛异常 + * + * @param condition 条件 + * @param errorCode 自定义异常 + * @param message 报错信息 + */ + public static void throwIf(boolean condition, ErrorCode errorCode, String message) { + throwIf(condition, new BusinessException(errorCode, message)); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/RabbitMQReceiver.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/RabbitMQReceiver.java new file mode 100644 index 0000000..1b60351 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/RabbitMQReceiver.java @@ -0,0 +1,142 @@ +package com.bsz.school_send_back_end.listener; + + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.RabbitMQConstant; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; +import com.bsz.school_send_back_end.service.OrdersService; +import com.bsz.school_send_back_end.utils.MultiDelayMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.rabbit.annotation.Exchange; +import org.springframework.amqp.rabbit.annotation.Queue; +import org.springframework.amqp.rabbit.annotation.QueueBinding; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; + + +@Component +@Slf4j +public class RabbitMQReceiver { + @Resource + private OrdersService ordersService; + + @Resource + private RabbitTemplate rabbitTemplate; + + @RabbitListener(queues = RabbitMQConstant.TOPIC_QUEUE2) + public Orders receiveOrder (Orders message) { + log.info("接收数据:" + message); + return message; + } + + + + @RabbitListener(queues = RabbitMQConstant.TOPIC_QUEUE1) + public PrivateMessage receive (PrivateMessage message) { + log.info("接收数据:" + message); + return message; + + } + + /** + * 过三分钟未支付自动取消 + * @param msg + */ + @RabbitListener(bindings = @QueueBinding( + value = @Queue(RabbitMQConstant.CANCEL_ORDER_QUEUE), + exchange = @Exchange(name = RabbitMQConstant.CANCEL_ORDER_EXCHANGE, delayed = "true"), + key = RabbitMQConstant.CANCEL_ORDER_ROUTING_KEY + )) + public void handleExpiredOrder(MultiDelayMessage msg) { + Long orderId = msg.getData(); + log.info("订单超时检查,订单ID:{}", orderId); + + // 查询订单 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Orders::getId, orderId); + Orders orders = ordersService.getOne(queryWrapper); + + if (orders == null) { + log.warn("订单不存在,订单ID:{}", orderId); + return; + } + + if (orders.getState() == 0) { // 订单仍未支付 + if (msg.hasNextDelay()) { + // 还有下一个检查点,继续发送延迟消息 + int nextDelay = msg.removeNextDelay().intValue(); + rabbitTemplate.convertAndSend(RabbitMQConstant.CANCEL_ORDER_EXCHANGE, + RabbitMQConstant.CANCEL_ORDER_ROUTING_KEY, msg, message -> { + message.getMessageProperties().setDelay(nextDelay); + return message; + }); + log.info("订单未支付,下一次检查延迟 {} 毫秒,订单ID:{}", nextDelay, orderId); + } else { + // **所有检查点都执行完,才执行订单取消** + log.info("订单超时未支付,自动取消,订单ID:{}", orderId); + orders.setState(3); // 订单状态修改为已取消(假设 3 代表“已取消”) + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "订单取消失败"); + log.info("订单超时,已取消,订单ID:{}", orderId); + } + } else { + log.info("订单已支付,无需取消,订单ID:{}", orderId); + } + } + + /** + * 过三十分钟无人接单自动退款 + * @param msg + */ + @RabbitListener(bindings = @QueueBinding( + value = @Queue(RabbitMQConstant.DELIVERY_ORDER_QUEUE), + exchange = @Exchange(name = RabbitMQConstant.DELIVERY_DELAY_EXCHANGE, delayed = "true"), + key = RabbitMQConstant.DELIVERY_ORDER_ROUTING_KEY + )) + public void handleExpiredDeliveryOrder(MultiDelayMessage msg) { + Long orderId = msg.getData(); + log.info("外卖单超时检查,订单ID:{}", orderId); + + // 查询订单 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Orders::getId, orderId); + Orders orders = ordersService.getOne(queryWrapper); + + if (orders == null) { + log.warn("外卖订单不存在,订单ID:{}", orderId); + return; + } + + if (orders.getState() == 1) { // 外卖单仍未支付 + // 外卖单超时退款逻辑 + if (msg.hasNextDelay()) { + int nextDelay = msg.removeNextDelay().intValue(); + rabbitTemplate.convertAndSend(RabbitMQConstant.DELIVERY_DELAY_EXCHANGE, + RabbitMQConstant.DELIVERY_ORDER_ROUTING_KEY, msg, message -> { + message.getMessageProperties().setDelay(nextDelay); + return message; + }); + log.info("外卖单未接单,下一次检查延迟 {} 毫秒,订单ID:{}", nextDelay, orderId); + } else { + // 超过30分钟,未接单,自动退款 + log.info("外卖单超时未接单,自动退款,订单ID:{}", orderId); + orders.setState(2); // 订单状态修改为已退款 + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "外卖单退款修改失败"); + log.info("外卖单超时,退款成功,订单ID:{}", orderId); + } + } else { + log.info("外卖单已支付,无需退款,订单ID:{}", orderId); + } + } + + + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/RabbitMQSender.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/RabbitMQSender.java new file mode 100644 index 0000000..ab15bc0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/RabbitMQSender.java @@ -0,0 +1,109 @@ +package com.bsz.school_send_back_end.listener; + +import com.bsz.school_send_back_end.contant.RabbitMQConstant; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; +import com.bsz.school_send_back_end.utils.MultiDelayMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.*; + +@Component +@Slf4j +public class RabbitMQSender { + + @Resource + private AmqpTemplate amqpTemplate; + + @Resource + private RabbitTemplate rabbitTemplate; + + public void sendOrderMessage (Orders message) { + log.info("消息队列 MQSender 业务消息发送 send OrderMessage:" + message); + amqpTemplate.convertAndSend(RabbitMQConstant.TOPIC_QUEUE2,message, msg->{ + msg.getMessageProperties().setReplyTo(RabbitMQConstant.ORDER_REPLY_QUEUE); + return msg; + }); + } + + + public void sendPrivateMessage(PrivateMessage message) { + log.info("消息队列 MQSender 业务消息发送 send message:" + message); + amqpTemplate.convertAndSend(RabbitMQConstant.TOPIC_QUEUE1,message, msg->{ + msg.getMessageProperties().setReplyTo(RabbitMQConstant.TOPIC_QUEUE1); + return msg; + }); + } + +// public void sendDelayedOrderMessage(long orderId, long delayMillis) { +// Map headers = new HashMap<>(); +// headers.put("x-delay", delayMillis); // 设置延迟时间(毫秒) +// +// amqpTemplate.convertAndSend( +// RabbitMQConstant.DELAYED_EXCHANGE, // 交换机 +// RabbitMQConstant.DELAYED_ROUTING_KEY, // 路由键 +// orderId, // 消息内容(订单 ID) +// message -> { +// message.getMessageProperties().getHeaders().putAll(headers); // 将延迟时间添加到消息头部 +// return message; +// }); +// log.info("发送延迟订单取消消息,订单ID: " + orderId + ",延迟时间: " + delayMillis + "ms"); +// } +// +// +// public void sendDelayedMessage() { +// // 设置延迟时间为 5 秒 +// MessageProperties messageProperties = new MessageProperties(); +// messageProperties.setHeader("x-delay", 5000); // 延迟时间(单位:毫秒) +// Message message = new Message("Hello, delayed world!".getBytes(), messageProperties); +// +// // 发送到延迟交换机 +// amqpTemplate.send(RabbitMQConstant.DELAYED_EXCHANGE, RabbitMQConstant.DELAYED_ROUTING_KEY, message); +// log.info("发送延迟成功:" + new Date()); +// } + + public void sendCreateOrderMessage(Long orderId) { + // 复制 DELAY_MILLIS 到一个新的 ArrayList + List newDelayMillis = new ArrayList<>(RabbitMQConstant.DINE_IN_DELAY_MILLIS); + // 延迟检查订单状态信息 + MultiDelayMessage msg = new MultiDelayMessage<>(orderId, newDelayMillis); + int delayValue = msg.removeNextDelay().intValue(); + rabbitTemplate.convertAndSend( + RabbitMQConstant.CANCEL_ORDER_EXCHANGE, + RabbitMQConstant.CANCEL_ORDER_ROUTING_KEY, + msg, + message -> { + // 新版本设置延迟时间的方式 + message.getMessageProperties() + .setHeader("x-delay", delayValue); // 单位:毫秒 + return message; + } + ); + log.info("发送成功,orderID:{}", orderId); + } + //自动退款30分钟未接单的 + public void sendCreateDeliveryOrderMessage (Long orderId) { + List newDelayMillis = new ArrayList<>(RabbitMQConstant.DELIVERY_DELAY_MILLIS); // 假设延迟时间在此列表中 + MultiDelayMessage msg = new MultiDelayMessage<>(orderId, newDelayMillis); + int delayValue = msg.removeNextDelay().intValue(); + + rabbitTemplate.convertAndSend( + RabbitMQConstant.DELIVERY_DELAY_EXCHANGE, + RabbitMQConstant.DELIVERY_ORDER_ROUTING_KEY, + msg, + message -> { + // 新版使用x-delay头设置延迟 + message.getMessageProperties() + .setHeader("x-delay", delayValue); // 单位毫秒 + return message; + } + ); + + log.info("外卖单延迟消息发送成功,订单ID:{}", orderId); + } + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/WebSocketEventListener.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/WebSocketEventListener.java new file mode 100644 index 0000000..5f7d222 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/listener/WebSocketEventListener.java @@ -0,0 +1,31 @@ +package com.bsz.school_send_back_end.listener; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.messaging.SessionConnectedEvent; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; + +@Component +public class WebSocketEventListener { + + @Autowired + private SimpMessageSendingOperations messagingTemplate; + + public static Integer userNumber = 0; + + @EventListener + public void handleWebSocketConnectListener(SessionConnectedEvent event) { + userNumber++; + messagingTemplate.convertAndSend("/topic/ServerToClient.showUserNumber", userNumber); + System.out.println("我来了哦~"); + } + + @EventListener + public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) { + userNumber--; + messagingTemplate.convertAndSend("/topic/ServerToClient.showUserNumber", userNumber); + System.out.println("我走了哦~"); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/manager/SessionManager.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/manager/SessionManager.java new file mode 100644 index 0000000..02f7ab0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/manager/SessionManager.java @@ -0,0 +1,155 @@ +package com.bsz.school_send_back_end.manager; + +import cn.hutool.core.util.StrUtil; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.domain.UserLoginRedisInfo; +import com.bsz.school_send_back_end.service.UserService; +import com.bsz.school_send_back_end.utils.NetUtils; +import com.bsz.school_send_back_end.utils.RedisKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.session.data.redis.RedisSessionRepository; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; + +import java.util.concurrent.TimeUnit; + +import static com.bsz.school_send_back_end.contant.RedisKeyConstant.*; + +@Slf4j +@Component +public class SessionManager { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private RedisSessionRepository sessionRepository; // 正确,类型匹配 + + @Value("${spring.session.timeout}") + private long sessionTimeout; + + @Lazy + @Resource + private UserService userService; + + /** + * 登录 + */ + public String login (User user, String appName, HttpServletRequest request) { + String message = "登录成功"; + String ipAddress = NetUtils.getIpAddress(request); + String oldSessionId = this.checkOtherLogin(user.getId(), ipAddress, request); + //不为空,表示在其他端以登录 + if (StrUtil.isNotBlank(oldSessionId)) { + //删除其他端的登录态 + this.removeOtherSessionAttribute(oldSessionId, user.getId()); + message += ",已移除其他设备的登录"; + } + + UserLoginRedisInfo build = UserLoginRedisInfo.builder() + .user(user) + .ip(ipAddress) + .appName(appName). + build(); + this.setLoginAttribute(request, USER_LOGIN_STATE, build); + return message; + } + + /** + * 退出登录 + */ + public void logout (HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + removeAttribute(request, USER_LOGIN_STATE); + stringRedisTemplate.delete(RedisKeyUtils.getUserExtraInfoKey(loginUser.getId())); + } + /** + * 检查是否在其他端登录 + */ + public String checkOtherLogin(Long userId, String currentIp, HttpServletRequest request) { + //校验sessionId + Object oldSessionIdObj = stringRedisTemplate.opsForHash().get(RedisKeyUtils.getUserExtraInfoKey(userId), SESSION_ID); + String oldSessionId = null; + if (oldSessionIdObj != null) { + oldSessionId = (String) oldSessionIdObj; + } + //校验ip + Object oldIpObj = stringRedisTemplate.opsForHash().get(RedisKeyUtils.getUserExtraInfoKey(userId), IP); + String oldIP = null; + if (oldIpObj != null) { + oldIP = (String) oldIpObj; + } + + // 判断sessionId如果为空或相等,返回null;不等,判断ip + // 如果ip为空或相等,返回null,不等,返回oldSessionId + if (StrUtil.isBlank(oldSessionId) || oldSessionId.equals(request.getSession().getId())) { + return null; + } + else { + if (StrUtil.isBlank(oldIP) || oldIP.equals(currentIp)) { + return null; + } + } + + return oldSessionId; + } + + /** + * 删除其他设备登录态 + */ + public void removeOtherSessionAttribute (String sessionId, Long userId) { + String sessionKey = RedisKeyUtils.getSessionKey(sessionId); + String sessionAttrKey = RedisKeyUtils.getSessionAttrKey(USER_LOGIN_STATE); + //删除用户的额外信息 + Boolean userExtraDelete = stringRedisTemplate.delete(RedisKeyUtils.getUserExtraInfoKey(userId)); + Long delete = sessionRepository.getSessionRedisOperations().opsForHash().delete(sessionKey, sessionAttrKey); + log.info("oldSessionId: {},user extra info delete result: {},user login state delete result: {}", + sessionId, userExtraDelete, delete); + } + + /** + * 设置登录属性 + */ + public void setLoginAttribute(HttpServletRequest request, String loginKey, UserLoginRedisInfo userLoginRedisInfo) { + setAttribute(request, loginKey, userLoginRedisInfo, true); + } + + /** + * 设置属性 + */ + + public void setAttribute(HttpServletRequest request, String key, Object value, boolean login) { + HttpSession session = request.getSession(); + if (login) { + UserLoginRedisInfo userLoginRedisInfo = (UserLoginRedisInfo) value; + User user = userLoginRedisInfo.getUser(); + // 存储登录状态 + session.setAttribute(key, user); + //存储sessionId和ip信息 + String sessionId = session.getId(); + String userExtraInfoKey = RedisKeyUtils.getUserExtraInfoKey(user.getId()); + stringRedisTemplate.opsForHash().put(userExtraInfoKey, SESSION_ID, sessionId); + stringRedisTemplate.opsForHash().put(userExtraInfoKey, IP, userLoginRedisInfo.getIp()); + stringRedisTemplate.opsForHash().put(userExtraInfoKey, APPNAME,userLoginRedisInfo.getAppName()); + stringRedisTemplate.expire(userExtraInfoKey, sessionTimeout, TimeUnit.SECONDS); + } + else { + session.setAttribute(key, value); + } + } + + /** + * 删除属性 + */ + public void removeAttribute(HttpServletRequest request, String key) { + HttpSession session = request.getSession(); + session.removeAttribute(key); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/AttributeMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/AttributeMapper.java new file mode 100644 index 0000000..639529c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/AttributeMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Attribute; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface AttributeMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessAuthMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessAuthMapper.java new file mode 100644 index 0000000..d6ac042 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessAuthMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.BusinessAuth; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface BusinessAuthMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessLevelMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessLevelMapper.java new file mode 100644 index 0000000..93aeaaa --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessLevelMapper.java @@ -0,0 +1,17 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.BusinessLevel; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** +* @author xy +*/ +public interface BusinessLevelMapper extends BaseMapper { +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessMapper.java new file mode 100644 index 0000000..b532edc --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Business; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface BusinessMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessinfoMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessinfoMapper.java new file mode 100644 index 0000000..281bc73 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/BusinessinfoMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bsz.school_send_back_end.model.domain.Businessinfo; + +/** +* @author xy +*/ +public interface BusinessinfoMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CartMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CartMapper.java new file mode 100644 index 0000000..13264c2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CartMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Cart; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface CartMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CategoryMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CategoryMapper.java new file mode 100644 index 0000000..5e9212b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CategoryMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Category; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface CategoryMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CollectMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CollectMapper.java new file mode 100644 index 0000000..a9d598c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/CollectMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Collect; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface CollectMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/DishesGroupMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/DishesGroupMapper.java new file mode 100644 index 0000000..73a8376 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/DishesGroupMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bsz.school_send_back_end.model.domain.DishesGroup; + +/** +* @author xy +*/ +public interface DishesGroupMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/DishesMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/DishesMapper.java new file mode 100644 index 0000000..5902032 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/DishesMapper.java @@ -0,0 +1,16 @@ +package com.bsz.school_send_back_end.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bsz.school_send_back_end.model.domain.Dishes; + +/** +* @author xy +*/ +public interface DishesMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandAuthMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandAuthMapper.java new file mode 100644 index 0000000..b90ac3a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandAuthMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.ErrandAuth; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface ErrandAuthMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandBillMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandBillMapper.java new file mode 100644 index 0000000..0681113 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandBillMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.ErrandBill; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface ErrandBillMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandIncomeMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandIncomeMapper.java new file mode 100644 index 0000000..d963a61 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandIncomeMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.ErrandIncome; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface ErrandIncomeMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandLevelMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandLevelMapper.java new file mode 100644 index 0000000..60860a2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandLevelMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.ErrandLevel; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface ErrandLevelMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandMapper.java new file mode 100644 index 0000000..bdf61c0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Errand; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface ErrandMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandOrderMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandOrderMapper.java new file mode 100644 index 0000000..9f15c6f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/ErrandOrderMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.ErrandOrder; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface ErrandOrderMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderDetailsMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderDetailsMapper.java new file mode 100644 index 0000000..db9fb3b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderDetailsMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.OrderDetails; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface OrderDetailsMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderImageMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderImageMapper.java new file mode 100644 index 0000000..a8cd83e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderImageMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.OrderImage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface OrderImageMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderRefundsMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderRefundsMapper.java new file mode 100644 index 0000000..be5006b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrderRefundsMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.OrderRefunds; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface OrderRefundsMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrdersMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrdersMapper.java new file mode 100644 index 0000000..9ca72ca --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/OrdersMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Orders; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface OrdersMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/PrivateMessageMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/PrivateMessageMapper.java new file mode 100644 index 0000000..4fa4859 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/PrivateMessageMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; + +/** +* @author xy +*/ +public interface PrivateMessageMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SpecificationsDishesMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SpecificationsDishesMapper.java new file mode 100644 index 0000000..8258790 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SpecificationsDishesMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.SpecificationsDishes; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface SpecificationsDishesMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SpecificationsMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SpecificationsMapper.java new file mode 100644 index 0000000..fd69693 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SpecificationsMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bsz.school_send_back_end.model.domain.Specifications; + +/** +* @author xy +*/ +public interface SpecificationsMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SysteminfoMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SysteminfoMapper.java new file mode 100644 index 0000000..f916520 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SysteminfoMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Systeminfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface SysteminfoMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SystemlogMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SystemlogMapper.java new file mode 100644 index 0000000..8ca7f06 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/SystemlogMapper.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.Systemlog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author xy +*/ +public interface SystemlogMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/UserMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/UserMapper.java new file mode 100644 index 0000000..2ee2d6c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bsz.school_send_back_end.model.domain.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +/** +* @author xy +*/ +@Mapper +public interface UserMapper extends BaseMapper { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/UserRatingMapper.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/UserRatingMapper.java new file mode 100644 index 0000000..1a581b8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/mapper/UserRatingMapper.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.mapper; + +import com.bsz.school_send_back_end.model.domain.UserRating; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** +* @author xy +*/ +public interface UserRatingMapper extends BaseMapper { + @Select("select avg(rating) from school_send.user_rating where ratedEntityId = #{ratedEntityId}") +// @Select("select avg(rating) from xiaokuaisong.user_rating where ratedEntityId = #{ratedEntityId}") + Double findAvgByRatedEntityId(@Param("ratedEntityId") Long ratedEntityId); + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Attribute.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Attribute.java new file mode 100644 index 0000000..722d7e5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Attribute.java @@ -0,0 +1,59 @@ +package com.bsz.school_send_back_end.model.domain; + +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.Serial; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 属性表 + * @TableName attribute + */ +@TableName(value ="attribute") +@Data +public class Attribute implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 规格id + */ + private Long specificationsId; + + /** + * 属性名称 + */ + private String attributeName; + + /** + * 属性状态:0在售,1停售 + */ + private Integer attributeStatus; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Business.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Business.java new file mode 100644 index 0000000..35fa7d3 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Business.java @@ -0,0 +1,106 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家 + * + * @TableName business + */ +@TableName(value = "business") +@Data +public class Business implements Serializable { + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 门店名称 + */ + private String businessName; + + /** + * 门店头像 + */ + private String businessAvatar; + + /** + * 门店手机号 + */ + private String businessPhone; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 商家相册 + */ + private String businessImages; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 开始营业时间 + */ + private String startBusiness; + + /** + * 结束营业时间 + */ + private String endBusiness; + + /** + * 状态:0禁用,1启用 + */ + private Integer state; + + /** + * 店铺状态:0休业,1营业 + */ + private Integer storeStatus; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/BusinessAuth.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/BusinessAuth.java new file mode 100644 index 0000000..14903a1 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/BusinessAuth.java @@ -0,0 +1,72 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家 + * @TableName business_auth + */ +@TableName(value ="business_auth") +@Data +public class BusinessAuth implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 店铺id + */ + private Long businessId; + + /** + * 店主名 + */ + private String shopkeeper; + + /** + * 营业执照 + */ + private String license; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/BusinessLevel.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/BusinessLevel.java new file mode 100644 index 0000000..93711c8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/BusinessLevel.java @@ -0,0 +1,55 @@ +package com.bsz.school_send_back_end.model.domain; + +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.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * + * @TableName business_level + */ +@TableName(value ="business_level") +@Data +public class BusinessLevel implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 综合评分 + */ + private BigDecimal averageScore; + + /** + * 等级 + */ + private Integer level; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + @TableField(exist = false) + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Businessinfo.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Businessinfo.java new file mode 100644 index 0000000..33c8bbf --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Businessinfo.java @@ -0,0 +1,41 @@ +package com.bsz.school_send_back_end.model.domain; + +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.util.Date; +import lombok.Data; + +/** + * 系统信息 + * @TableName businessinfo + */ +@TableName(value ="businessinfo") +@Data +public class Businessinfo implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 功能内容 + */ + private String content; + + /** + * 创建时间 + */ + private Date createTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Cart.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Cart.java new file mode 100644 index 0000000..8c0f9f8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Cart.java @@ -0,0 +1,78 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 购物车表 + * @TableName cart + */ +@TableName(value ="cart") +@Data +public class Cart implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 商家id + */ + private Long businessId; + + /** + * 加入购物车时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 菜品id + */ + private Long dishesId; + + /** + * 商品数量 + */ + private Integer quantity; + + /** + * 当前选择规格的价格 + */ + private BigDecimal price; + + /** + * 小计(单价 * 数量) + */ + private BigDecimal subtotal; + + /** + * 已选规格属性列表 + */ + private String selectedOptions; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Category.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Category.java new file mode 100644 index 0000000..1071624 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Category.java @@ -0,0 +1,46 @@ +package com.bsz.school_send_back_end.model.domain; + +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.util.Date; +import lombok.Data; + +/** + * 分类表 + * @TableName category + */ +@TableName(value ="category") +@Data +public class Category implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 分类名 + */ + private String name; + + /** + * 分类图片 + */ + private String image; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Collect.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Collect.java new file mode 100644 index 0000000..3fb7821 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Collect.java @@ -0,0 +1,35 @@ +package com.bsz.school_send_back_end.model.domain; + +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 lombok.Data; + +/** + * + * @TableName collect + */ +@TableName(value ="collect") +@Data +public class Collect implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 商家id + */ + private Long businessId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Dishes.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Dishes.java new file mode 100644 index 0000000..1fac082 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Dishes.java @@ -0,0 +1,83 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 菜品表 + * @TableName dishes + */ +@TableName(value ="dishes") +@Data +public class Dishes implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 菜品分组id + */ + private Long dishesGroupId; + + /** + * 菜品名称 + */ + private String dishesName; + + /** + * 菜品图片 + */ + private String dishesImage; + + /** + * 菜品价格 + */ + private Double dishesPrice; + + /** + * 打包费 + */ + private Double packPrice; + + /** + * 库存数量 + */ + private Integer inventoryStatus; + + /** + * 菜品状态:上架,下架 + */ + private String status; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/DishesGroup.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/DishesGroup.java new file mode 100644 index 0000000..7dd8546 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/DishesGroup.java @@ -0,0 +1,57 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 菜品分组表 + * @TableName dishes_group + */ +@TableName(value ="dishes_group") +@Data +public class DishesGroup implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 菜品分组名称 + */ + private String groupName; + + /** + * 是否置顶:0不置顶,1置顶 + */ + private Integer isTopping; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Errand.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Errand.java new file mode 100644 index 0000000..daa24ff --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Errand.java @@ -0,0 +1,93 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 跑腿 + * @TableName errand + */ +@TableName(value ="errand") +@Data +public class Errand implements Serializable { + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 跑腿姓名 + */ + private String errandName; + + /** + * 跑腿姓名 + */ + private String errandAvatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String errandPhone; + + /** + * 配送范围 + */ + private String distributionScope; + + /** + * 审核状态 0-未审核 1-审核通过 + */ + private Integer state; + + /** + * 接单量 + */ + private Integer totalOrders; + + /** + * 最大接单量 + */ + private Integer maxOrders; + + /** + * 总金额 + */ + private BigDecimal totalPrice; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @TableField(exist = false) + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandAuth.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandAuth.java new file mode 100644 index 0000000..3ff763f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandAuth.java @@ -0,0 +1,72 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 跑腿认证 + * @TableName errand_auth + */ +@TableName(value ="errand_auth") +@Data +public class ErrandAuth implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 跑腿id + */ + private Long errandId; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; + + /** + * 健康证 + */ + private String healthCertificate; + + /** + * 健康证开始时间 + */ + private Date certificateStartTime; + + /** + * 健康证结束时间 + */ + private Date certificateEndTime; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 逻辑删除 + */ + @TableLogic + private Integer isDelete; + + @TableField(exist = false) + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandBill.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandBill.java new file mode 100644 index 0000000..5158714 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandBill.java @@ -0,0 +1,57 @@ +package com.bsz.school_send_back_end.model.domain; + +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.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 跑腿账单表 + * @TableName errand_bill + */ +@TableName(value ="errand_bill") +@Data +@Schema(description = "跑腿账单响应体") +public class ErrandBill implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 订单Id + */ + private Long orderId; + + /** + * 用户手机号 + */ + private String username; + + /** + * 综合评分 + */ + private BigDecimal income; + + /** + * 收入状态:0-待结算 1-已结算 + */ + private Integer errandState; + + /** + * 订单创建时间 + */ + private LocalDateTime orderStartTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandIncome.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandIncome.java new file mode 100644 index 0000000..fe01219 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandIncome.java @@ -0,0 +1,55 @@ +package com.bsz.school_send_back_end.model.domain; + +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.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 跑腿收入 + * @TableName errand_income + */ +@TableName(value ="errand_income") +@Data +public class ErrandIncome implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 跑腿id + */ + private Long errandId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 综合评分 + */ + private BigDecimal income; + + /** + * 0未结算 1已结算 2已提现 + */ + private Integer state; + + /** + * 创建时间 + */ + private Date createTime; + + @TableField(exist = false) + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandLevel.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandLevel.java new file mode 100644 index 0000000..7f653e9 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandLevel.java @@ -0,0 +1,52 @@ +package com.bsz.school_send_back_end.model.domain; + +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.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 跑腿等级 + * @TableName errand_level + */ +@TableName(value ="errand_level") +@Data +public class ErrandLevel implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 跑腿Id + */ + private Long errandId; + + /** + * 综合评分 + */ + private BigDecimal averageScore; + + /** + * 等级 + */ + private Integer level; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandOrder.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandOrder.java new file mode 100644 index 0000000..5599b72 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/ErrandOrder.java @@ -0,0 +1,72 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import lombok.Data; + +/** + * 跑腿任务表 + * @TableName errand_order + */ +@TableName(value ="errand_order") +@Data +public class ErrandOrder implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 订单ID + */ + private Long orderId; + + /** + * 跑腿状态: 0无跑腿 1待抢单 2待取货 3待送达 4已送达 5再次抢单 + */ + private Integer errandState; + + /** + * 送餐开始时间 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private LocalDateTime startTime; + + /** + * 送餐结束时间 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private LocalDateTime endTime; + + /** + * 跑腿员ID + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Long errandId; + + /** + * 任务创建时间 + */ + private Date createTime; + + /** + * 任务更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @TableField(exist = false) + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderDetails.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderDetails.java new file mode 100644 index 0000000..f40a559 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderDetails.java @@ -0,0 +1,72 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 订单详情表 + * @TableName order_details + */ +@TableName(value ="order_details") +@Data +public class OrderDetails implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 关联的订单id + */ + private Long orderId; + + /** + * 关联的菜品id + */ + private Long dishesId; + + /** + * 购买数量 + */ + private Integer quantity; + + /** + * 单价 + */ + private BigDecimal price; + + /** + * 小计(单价 * 数量) + */ + private BigDecimal subtotal; + + /** + * 规格属性列表 + */ + private String attributeNames; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间OrderDetailsServiceImpl + * OrdersServiceImpl + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderImage.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderImage.java new file mode 100644 index 0000000..42aa87c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderImage.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.model.domain; + +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 lombok.Data; + +/** + * 外卖图片 + * @TableName order_image + */ +@TableName(value ="order_image") +@Data +public class OrderImage implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long orderId; + + /** + * 外卖地址 + */ + private String imageAddress; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderRefunds.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderRefunds.java new file mode 100644 index 0000000..c647914 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/OrderRefunds.java @@ -0,0 +1,62 @@ +package com.bsz.school_send_back_end.model.domain; + +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.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** + * 退款申请表 + * @TableName order_refunds + */ +@TableName(value ="order_refunds") +@Data +public class OrderRefunds implements Serializable { + /** + * 退款申请ID + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 订单号,唯一标识 + */ + private Long orderId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 退款原因 + */ + private String reason; + + /** + * 退款金额 + */ + private BigDecimal amount; + + /** + * 退款状态:0-待审核, 1-已同意, 2-已拒绝 + */ + private Integer status; + + /** + * 申请时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Orders.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Orders.java new file mode 100644 index 0000000..92539a8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Orders.java @@ -0,0 +1,115 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 订单表 + * @TableName orders + */ +@TableName(value ="orders") +@Data +public class Orders implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 取餐码 + */ + private String pickupCode; + + /** + * 姓名 + */ + private String userName; + + /** + * 手机号 + */ + private String phone; + + /** + * 下单用户id + */ + private Long userId; + + /** + * 商家id + */ + private Long businessId; + + /** + * 跑腿id + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Long errandId; + + /** + * 配送地址 + */ + @TableField(updateStrategy = FieldStrategy.IGNORED) + private String location; + + /** + * 订单实际总价 + */ + private BigDecimal totalPrice; + + /** + * 取餐方式(0堂食 1自提) + */ + private Integer pickupMethod; + + /** + * 支付方式:0微信支付 + */ + private Integer payMethod; + + /** + * 取餐时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime pickupTime; + + /** + * 备注 + */ + private String notes; + + /** + * 订单状态:0未支付 1已完成 2已退款 3已取消 + */ + private Integer state; + + /** + * 下单时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private LocalDateTime createTime; + + /** + * 支付时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @TableField(exist = false) + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/PrivateMessage.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/PrivateMessage.java new file mode 100644 index 0000000..8a54578 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/PrivateMessage.java @@ -0,0 +1,55 @@ +package com.bsz.school_send_back_end.model.domain; + +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 lombok.Data; + +/** + * 聊天记录 + * @TableName private_message + */ +@TableName(value ="private_message") +@Data +public class PrivateMessage implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 发消息者 + */ + private String from_userAccount; + + /** + * 接收消息者 + */ + private String to_userAccount; + + /** + * 订单id + */ + private Long orderId; + + /** + * 消息内容 + */ + private String message; + + /** + * 发消息者是否删除 + */ + private Integer from_user_deleted; + + /** + * 接收消息者是否删除 + */ + private Integer to_user_deleted; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Specifications.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Specifications.java new file mode 100644 index 0000000..42247ea --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Specifications.java @@ -0,0 +1,52 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 规格表 + * @TableName specifications + */ +@Data +@TableName(value ="specifications") +public class Specifications implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 规格名称 + */ + private String specificationsName; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/SpecificationsDishes.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/SpecificationsDishes.java new file mode 100644 index 0000000..7b99859 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/SpecificationsDishes.java @@ -0,0 +1,53 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 菜品和规格的中间表 + * @TableName specifications_dishes + */ +@TableName(value ="specifications_dishes") +@Data +public class SpecificationsDishes implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 菜品id + */ + private Long dishesId; + + /** + * 规格id + */ + private Long specificationsId; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Systeminfo.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Systeminfo.java new file mode 100644 index 0000000..0db2840 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Systeminfo.java @@ -0,0 +1,45 @@ +package com.bsz.school_send_back_end.model.domain; + +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 java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +/** + * 系统信息 + * @TableName systeminfo + */ +@TableName(value ="systeminfo") +@Data +public class Systeminfo implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 类型:0公告,1轮播图 + */ + private Integer type; + + /** + * 功能内容 + */ + private String content; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") + private LocalDateTime createTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Systemlog.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Systemlog.java new file mode 100644 index 0000000..9ef90df --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/Systemlog.java @@ -0,0 +1,46 @@ +package com.bsz.school_send_back_end.model.domain; + +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.util.Date; +import lombok.Data; + +/** + * 系统信息 + * @TableName systemlog + */ +@TableName(value ="systemlog") +@Data +public class Systemlog implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 操作内容 + */ + private String content; + + /** + * ip地址 + */ + private String ip; + + /** + * 创建时间 + */ + private Date createTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/User.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/User.java new file mode 100644 index 0000000..c7407d5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/User.java @@ -0,0 +1,96 @@ +package com.bsz.school_send_back_end.model.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 用户 + * @TableName user + */ +@TableName(value ="user") +@Data +public class User implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + + /** + * 支付宝开放平台id + */ + private String unionId; + + /** + * openId + */ + private String openId; + /** + * 用户昵称 + */ + private String username; + + /** + * 账号 + */ + private String userAccount; + + /** + * 用户头像 + */ + private String avatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 密码 + */ + private String userPassword; + + /** + * 电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 状态 0 -正常 + */ + private Integer userStatus; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * + */ + private Date updateTime; + + /** + * 是否删除 + */ + @TableLogic + private Integer isDelete; + + /** + * 用户角色 0 - 普通用户 1 - 管理员 2 - 商家 + */ + private String userRole; + + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/UserLoginRedisInfo.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/UserLoginRedisInfo.java new file mode 100644 index 0000000..a4d9487 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/UserLoginRedisInfo.java @@ -0,0 +1,24 @@ +package com.bsz.school_send_back_end.model.domain; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class UserLoginRedisInfo { + + /** + * 登录用户 + */ + private User user; + + /** + * 登录ip + */ + private String ip; + + /** + * 登录app + */ + private String appName; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/UserRating.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/UserRating.java new file mode 100644 index 0000000..bc6c4c8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/domain/UserRating.java @@ -0,0 +1,66 @@ +package com.bsz.school_send_back_end.model.domain; + +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.util.Date; +import lombok.Data; + +/** + * 用户评分 + * @TableName user_rating + */ +@TableName(value ="user_rating") +@Data +public class UserRating implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 商家id + */ + private Long ratedEntityId; + + /** + * 评分对象类型:0=商家,1=跑腿 + */ + private Integer ratedEntityType; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 评分 + */ + private Integer rating; + + /** + * 评论 + */ + private String review; + + /** + * 商家回复 + */ + private String businessReview; + + /** + * 创建时间 + */ + private Date createTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/CommonRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/CommonRequest.java new file mode 100644 index 0000000..3f97f72 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/CommonRequest.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.model.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 通用请求 + */ +@Data +@SuppressWarnings("all") +public class CommonRequest implements Serializable { + + /** + * id + */ + private Long id; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesAddRequest.java new file mode 100644 index 0000000..ceacf14 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesAddRequest.java @@ -0,0 +1,61 @@ +package com.bsz.school_send_back_end.model.dto.Dishes; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +public class DishesAddRequest implements Serializable { + + + + /** + * 该菜品的规格id列表 + */ + private List specificationsIds; + + /** + * 商家id + */ + private Long businessId; + + /** + * 菜品分组id + */ + private Long dishesGroupId; + + /** + * 菜品名称 + */ + private String dishesName; + + /** + * 菜品图片 + */ + private String dishesImage; + + /** + * 菜品价格 + */ + private Double dishesPrice; + + /** + * 打包费 + */ + private Double packPrice; + + /** + * 库存数量 + */ + private Integer inventoryStatus; + + /** + * 菜品状态:上架,下架 + */ + private String status; + + @Serial + private static final long serialVersionUID = 4275284130550579408L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesDeleteRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesDeleteRequest.java new file mode 100644 index 0000000..b8a63c2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesDeleteRequest.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.model.dto.Dishes; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class DishesDeleteRequest implements Serializable { + + /** + * id + */ + private Long id; + + @Serial + private static final long serialVersionUID = 3490090832442230078L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesQueryRequest.java new file mode 100644 index 0000000..3681b3f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesQueryRequest.java @@ -0,0 +1,33 @@ +package com.bsz.school_send_back_end.model.dto.Dishes; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class DishesQueryRequest extends PageRequest implements Serializable { + + /** + * 商家id + */ + private Long businessId; + + /** + * 菜品分组id + */ + private Long dishesGroupId; + + /** + * 菜品名称 + */ + private String dishesName; + + /** + * 菜品状态:上架,下架 + */ + private String status; + @Serial + private static final long serialVersionUID = 7657901721509360225L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesUpdateRequest.java new file mode 100644 index 0000000..d483d6f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/Dishes/DishesUpdateRequest.java @@ -0,0 +1,64 @@ +package com.bsz.school_send_back_end.model.dto.Dishes; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +public class DishesUpdateRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 该菜品的规格id列表 + */ + private List specificationsIds; + + /** + * 商家id + */ + private Long businessId; + + /** + * 菜品分组id + */ + private Long dishesGroupId; + + /** + * 菜品名称 + */ + private String dishesName; + + /** + * 菜品图片 + */ + private String dishesImage; + + /** + * 菜品价格 + */ + private Double dishesPrice; + + /** + * 打包费 + */ + private Double packPrice; + + /** + * 库存数量 + */ + private Integer inventoryStatus; + + /** + * 菜品状态:上架,下架 + */ + private String status; + + @Serial + private static final long serialVersionUID = 692981642677866302L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupAddRequest.java new file mode 100644 index 0000000..9884be1 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupAddRequest.java @@ -0,0 +1,23 @@ +package com.bsz.school_send_back_end.model.dto.DishesGroup; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class DishesGroupAddRequest implements Serializable { + + /** + * 菜品分组名称 + */ + private String groupName; + + /** + * 是否置顶:0不置顶,1置顶 + */ + private Integer isTopping; + + @Serial + private static final long serialVersionUID = -3305541981600216983L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupDeleteRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupDeleteRequest.java new file mode 100644 index 0000000..4bde669 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupDeleteRequest.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.model.dto.DishesGroup; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class DishesGroupDeleteRequest implements Serializable { + + /** + * id + */ + private Long id; + + @Serial + private static final long serialVersionUID = 1451141219473984015L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupQueryRequest.java new file mode 100644 index 0000000..5a9dc15 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupQueryRequest.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.model.dto.DishesGroup; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class DishesGroupQueryRequest implements Serializable { + + /** + * 商家id + */ + private Long businessId; + + @Serial + private static final long serialVersionUID = -5330731551871723003L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupUpdateRequest.java new file mode 100644 index 0000000..3c307b1 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/DishesGroup/DishesGroupUpdateRequest.java @@ -0,0 +1,28 @@ +package com.bsz.school_send_back_end.model.dto.DishesGroup; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class DishesGroupUpdateRequest implements Serializable { + + + /** + * id + */ + private Long id; + /** + * 菜品分组名称 + */ + private String groupName; + + /** + * 是否置顶:0不置顶,1置顶 + */ + private Integer isTopping; + + @Serial + private static final long serialVersionUID = 96052001253631145L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/PageRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/PageRequest.java new file mode 100644 index 0000000..519a894 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/PageRequest.java @@ -0,0 +1,32 @@ +package com.bsz.school_send_back_end.model.dto; + +import com.bsz.school_send_back_end.contant.CommonConstant; +import lombok.Data; + +/** + * 分页请求 + * + */ +@Data +public class PageRequest { + + /** + * 当前页号 + */ + private long current = 1; + + /** + * 页面大小 + */ + private long pageSize = 10; + + /** + * 排序字段 + */ + private String sortField; + + /** + * 排序顺序(默认升序) + */ + private String sortOrder = CommonConstant.SORT_ORDER_ASC; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/attribute/AttributeAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/attribute/AttributeAddRequest.java new file mode 100644 index 0000000..e327432 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/attribute/AttributeAddRequest.java @@ -0,0 +1,29 @@ +package com.bsz.school_send_back_end.model.dto.attribute; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 属性添加请求体 + * + * @author xy + */ +@Data +public class AttributeAddRequest implements Serializable { + + /** + * 属性名称 + */ + private String attributeName; + + /** + * 属性状态:0在售,1停售 + */ + private Integer attributeStatus; + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/attribute/AttributeUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/attribute/AttributeUpdateRequest.java new file mode 100644 index 0000000..6ef65ee --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/attribute/AttributeUpdateRequest.java @@ -0,0 +1,31 @@ +package com.bsz.school_send_back_end.model.dto.attribute; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xy + */ +@Data +public class AttributeUpdateRequest implements Serializable { + + /** + * 属性id + */ + private Long id; + + /** + * 属性名称 + */ + private String attributeName; + + /** + * 属性状态:0在售,1停售 + */ + private Integer attributeStatus; + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessAddRequest.java new file mode 100644 index 0000000..6d9389c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessAddRequest.java @@ -0,0 +1,98 @@ +package com.bsz.school_send_back_end.model.dto.business; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家添加请求 + * + * @TableName business + */ +@Data +public class BusinessAddRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -923925091426442746L; + + /** + * 账号 + */ + private String userAccount; + + /** + * 密码 + */ + private String userPassword; + + /** + * 门店名 + */ + private String businessName; + + /** + * 门店头像 + */ + private String businessAvatar; + + /** + * 门店手机号 + */ + private String businessPhone; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 商家相册 + */ + private String businessImages; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 店主名 + */ + private String shopkeeper; + + /** + * 营业执照 + */ + private String license; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 开始营业时间 + */ + private String startBusiness; + + /** + * 结束营业时间 + */ + private String endBusiness; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessQueryRequest.java new file mode 100644 index 0000000..21aa0bc --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessQueryRequest.java @@ -0,0 +1,61 @@ +package com.bsz.school_send_back_end.model.dto.business; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家查询请求体 + * + * @TableName business + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class BusinessQueryRequest extends PageRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 门店名称 + */ + private String businessName; + + /** + * 门店地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 状态:0禁用,1启用 + */ + private Integer state; + + /** + * 店铺状态:0休业,1营业 + */ + private Integer storeStatus; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessUpdateMyRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessUpdateMyRequest.java new file mode 100644 index 0000000..ede1007 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessUpdateMyRequest.java @@ -0,0 +1,66 @@ +package com.bsz.school_send_back_end.model.dto.business; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家添加请求 + */ +@Data +public class BusinessUpdateMyRequest implements Serializable { + + /** + * 门店昵称 + */ + private String businessName; + + /** + * 门店头像 + */ + private String businessAvatar; + + /** + * 手机号 + */ + private String businessPhone; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 商家相册 + */ + private String businessImages; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 开始营业时间 + */ + private String startBusiness; + + /** + * 结束营业时间 + */ + private String endBusiness; + + /** + * 店铺状态:0休业,1营业 + */ + private Integer storeStatus; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessUpdateRequest.java new file mode 100644 index 0000000..145e1d3 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/business/BusinessUpdateRequest.java @@ -0,0 +1,83 @@ +package com.bsz.school_send_back_end.model.dto.business; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 商家更新请求 + * + */ +@Data +public class BusinessUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -3591512809067116995L; + + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 门店昵称 + */ + private String businessName; + + /** + * 门店头像 + */ + private String businessAvatar; + + /** + * 门店手机号 + */ + private String businessPhone; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 商家相册 + */ + private String businessImages; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 开始营业时间 + */ + private String startBusiness; + + /** + * 结束营业时间 + */ + private String endBusiness; + + /** + * 状态:0禁用,1启用 + */ + private Integer state; + + /** + * 店铺状态:0休业,1营业 + */ + private Integer storeStatus; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/businessinfo/InfoAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/businessinfo/InfoAddRequest.java new file mode 100644 index 0000000..4bb8bf2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/businessinfo/InfoAddRequest.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.model.dto.businessinfo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class InfoAddRequest implements Serializable { + + /** + * 功能内容 + */ + private String content; + + @Serial + private static final long serialVersionUID = 8089646587314575974L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/businessinfo/InfoQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/businessinfo/InfoQueryRequest.java new file mode 100644 index 0000000..5db5992 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/businessinfo/InfoQueryRequest.java @@ -0,0 +1,27 @@ +package com.bsz.school_send_back_end.model.dto.businessinfo; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +public class InfoQueryRequest extends PageRequest implements Serializable { + + /** + * 商家id + */ + private Long businessId; + + /** + * 创建时间 + */ + private Date createTime; + + @Serial + private static final long serialVersionUID = -1976825924815005032L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartAddRequest.java new file mode 100644 index 0000000..9cfcdc5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartAddRequest.java @@ -0,0 +1,36 @@ +package com.bsz.school_send_back_end.model.dto.cart; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xy + */ +@Data +public class CartAddRequest implements Serializable { + + /** + * 商家id + */ + private Long businessId; + + /** + * 关联的菜品id + */ + private Long dishesId; + + /** + * 菜品数量 + */ + private Integer quantity; + + /** + * 已选规格属性列表 + */ + private String selectedOptions = ""; + + @Serial + private static final long serialVersionUID = 4086381861303093101L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartDeleteRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartDeleteRequest.java new file mode 100644 index 0000000..55323c4 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartDeleteRequest.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.dto.cart; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xy + */ +@Data +public class CartDeleteRequest implements Serializable { + + /** + * id + */ + private Long id; + + @Serial + private static final long serialVersionUID = 4086381861303093101L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartQueryRequest.java new file mode 100644 index 0000000..cda368e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartQueryRequest.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.dto.cart; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xy + */ +@Data +public class CartQueryRequest implements Serializable { + + /** + * id + */ + private Long id; + + @Serial + private static final long serialVersionUID = 4086381861303093101L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartUpdateRequest.java new file mode 100644 index 0000000..5c1858a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/cart/CartUpdateRequest.java @@ -0,0 +1,47 @@ +package com.bsz.school_send_back_end.model.dto.cart; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xy + */ +@Data +public class CartUpdateRequest implements Serializable { + + /** + * 商家id + */ + private Long businessId; + + /** + * id + */ + private Long id; + + /** + * 关联的菜品id + */ + private Long dishesId; + + /** + * 菜品数量 + */ + private Integer quantity; + + /** + * 是否加入有规格的菜品 + */ + private Boolean isSelectedOptions = false; + + /** + * 已选规格属性列表 + */ + private String selectedOptions = ""; + + @Serial + private static final long serialVersionUID = 4086381861303093101L; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryAddRequest.java new file mode 100644 index 0000000..94963d2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryAddRequest.java @@ -0,0 +1,23 @@ +package com.bsz.school_send_back_end.model.dto.category; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class CategoryAddRequest implements Serializable { + + /** + * 分类名 + */ + private String name; + + /** + * 分类图片 + */ + private String image; + + @Serial + private static final long serialVersionUID = -8266948446201272634L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryDeleteRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryDeleteRequest.java new file mode 100644 index 0000000..b3362d2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryDeleteRequest.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.model.dto.category; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class CategoryDeleteRequest implements Serializable { + + /** + * id + */ + private Long id; + + @Serial + private static final long serialVersionUID = -8266948446201272634L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryUpdateRequest.java new file mode 100644 index 0000000..8b69250 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/category/CategoryUpdateRequest.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.model.dto.category; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class CategoryUpdateRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 分类名 + */ + private String name; + + /** + * 分类图片 + */ + private String image; + + @Serial + private static final long serialVersionUID = -8266948446201272634L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/collect/CollectAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/collect/CollectAddRequest.java new file mode 100644 index 0000000..03a4396 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/collect/CollectAddRequest.java @@ -0,0 +1,14 @@ +package com.bsz.school_send_back_end.model.dto.collect; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class CollectAddRequest implements Serializable { + + /** + * 商家id + */ + private Long businessId; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/erradnIncome/ErrandIncomeQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/erradnIncome/ErrandIncomeQueryRequest.java new file mode 100644 index 0000000..cde6ff8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/erradnIncome/ErrandIncomeQueryRequest.java @@ -0,0 +1,31 @@ +package com.bsz.school_send_back_end.model.dto.erradnIncome; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class ErrandIncomeQueryRequest extends PageRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 跑腿id + */ + private Long errandId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 0未结算 1已结算 2已提现 + */ + private Integer state; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandAddRequest.java new file mode 100644 index 0000000..bcb82b0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandAddRequest.java @@ -0,0 +1,48 @@ +package com.bsz.school_send_back_end.model.dto.errand; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class ErrandAddRequest implements Serializable { + + /** + * 账号 + */ + private String userAccount; + + /** + * 密码 + */ + private String userPassword; + + /** + * 密码 + */ + private String checkPassword; + + /** + * 跑腿姓名 + */ + private String errandName; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String errandPhone; + + /** + * 配送范围 + */ + private String distributionScope; + + @Serial + private static final long serialVersionUID = 1429991098597318147L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandQueryRequest.java new file mode 100644 index 0000000..62d26ad --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandQueryRequest.java @@ -0,0 +1,44 @@ +package com.bsz.school_send_back_end.model.dto.errand; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class ErrandQueryRequest extends PageRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 跑腿姓名 + */ + private String errandName; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String errandPhone; + + /** + * 配送范围 + */ + private String distributionScope; + + /** + * 审核状态 0-未审核 1-审核通过 + */ + private Integer state; + + @Serial + private static final long serialVersionUID = -1612139663948514866L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandStateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandStateRequest.java new file mode 100644 index 0000000..5e1e643 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandStateRequest.java @@ -0,0 +1,23 @@ +package com.bsz.school_send_back_end.model.dto.errand; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ErrandStateRequest implements Serializable { + /** + * 订单id + */ + private Long orderId; + + /** + * 需要修改的订单状态 + */ + private Integer errandsState; + + /** + * 外卖图片地址 + */ + private String imageAddress; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandUpdateRequest.java new file mode 100644 index 0000000..9e9c6a5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errand/ErrandUpdateRequest.java @@ -0,0 +1,43 @@ +package com.bsz.school_send_back_end.model.dto.errand; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class ErrandUpdateRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 跑腿姓名 + */ + private String errandName; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String errandPhone; + + /** + * 配送范围 + */ + private String distributionScope; + + /** + * 审核状态 0-未审核 1-审核通过 + */ + private Integer state; + + @Serial + private static final long serialVersionUID = -1612139663948514866L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errandAtuh/ErrandAuthAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errandAtuh/ErrandAuthAddRequest.java new file mode 100644 index 0000000..04c61d7 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errandAtuh/ErrandAuthAddRequest.java @@ -0,0 +1,33 @@ +package com.bsz.school_send_back_end.model.dto.errandAtuh; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class ErrandAuthAddRequest implements Serializable { + + /** + * 跑腿id + */ + private Long errandId; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; + + @Serial + private static final long serialVersionUID = -7134209258589017758L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errandAtuh/ErrandAuthQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errandAtuh/ErrandAuthQueryRequest.java new file mode 100644 index 0000000..3fe5259 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/errandAtuh/ErrandAuthQueryRequest.java @@ -0,0 +1,35 @@ +package com.bsz.school_send_back_end.model.dto.errandAtuh; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ErrandAuthQueryRequest extends PageRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 跑腿id + */ + private Long errandId; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/file/UploadFileRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/file/UploadFileRequest.java new file mode 100644 index 0000000..30c54ef --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/file/UploadFileRequest.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.dto.file; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class UploadFileRequest implements Serializable { + + /** + * 业务 + */ + @Schema(description = "业务标识,例如:user_avatar,dishes,card,system, takeout") + private String biz; + + @Serial + private static final long serialVersionUID = 5633491538829896175L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/log/LogQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/log/LogQueryRequest.java new file mode 100644 index 0000000..edd4378 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/log/LogQueryRequest.java @@ -0,0 +1,47 @@ +package com.bsz.school_send_back_end.model.dto.log; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + *系统信息查询请求 + */ +@Data +public class LogQueryRequest extends PageRequest implements Serializable{ + + /** + * 用户id + */ + private Long userId; + + /** + * 手机号 + */ + private String businessPhone; + + /** + * 操作内容 + */ + private String content; + + /** + * ip + */ + private String ip; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + + @Serial + private static final long serialVersionUID = 2952253938605974287L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/MyOrderQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/MyOrderQueryRequest.java new file mode 100644 index 0000000..0b9be4a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/MyOrderQueryRequest.java @@ -0,0 +1,44 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 我的订单查询请求 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MyOrderQueryRequest extends PageRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 取餐方式(0堂食 1自提) + */ + private Integer pickupMethod; + + /** + * 订单状态:0未支付 1已完成 2已取消 + */ + private Integer state; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderAddRequest.java new file mode 100644 index 0000000..6ae2da0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderAddRequest.java @@ -0,0 +1,68 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 订单创建请求 + */ +@Data +public class OrderAddRequest implements Serializable { + + /** + * 姓名 + */ + private String userName; + + /** + * 手机号 + */ + private String phone; + + /** + * 商家id + */ + private Long businessId; + + /** + * 订单实际总价 + */ + private BigDecimal totalPrice; + + /** + * 取餐方式(0堂食 1自提) + */ + private Integer pickupMethod; + + /** + * 配送地址 + */ + private String location; + + /** + * 支付方式 + */ + private Integer payMethod; + + /** + * 取餐时间 + */ + private String pickupTime; + + /** + * 备注 + */ + private String notes; + + /** + * 订单详情 + */ + private List orderDetailAddRequest; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderCountRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderCountRequest.java new file mode 100644 index 0000000..d6121a8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderCountRequest.java @@ -0,0 +1,48 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import lombok.Data; + +@Data +public class OrderCountRequest { + + /** + * 商家id + */ + private Long businessId; + + /** + * 商家名称 + */ + private String businessName; + + /** + * 商家状态 + */ + private Long businessState; + + /** + * 餐厅分类 + */ + private Long categoryId; + + /** + * 类型 + */ + private String type; + + /** + * 支付状态 + */ + private Integer state; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderDetailAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderDetailAddRequest.java new file mode 100644 index 0000000..c2d6b55 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderDetailAddRequest.java @@ -0,0 +1,33 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单详情创建请求 + */ +@Data +public class OrderDetailAddRequest implements Serializable { + + /** + * 关联的菜品id + */ + private Long dishesId; + + /** + * 购买数量 + */ + private Integer quantity; + + /** + * 规格属性列表 + */ + private String attributeNames; + + @Serial + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderQueryRequest.java new file mode 100644 index 0000000..08e2aae --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderQueryRequest.java @@ -0,0 +1,65 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 订单查询请求 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class OrderQueryRequest extends PageRequest implements Serializable { + /** + * id + */ + private Long id; + + /** + * 下单用户id + */ + private Long userId; + + /** + * 商家id + */ + private Long businessId; + + /** + * 跑腿id + */ + private Long errandId = null; + + /** + * 取餐码 + */ + private String pickupCode; + + /** + * 取餐方式(0堂食 1自提) + */ + private Integer pickupMethod; + + /** + * 订单状态:0未支付 1已完成 2已取消 + */ + private Integer state; + + /** + * 开始时间 + */ + private String startTime; + + /** + * 结束时间 + */ + private String endTime; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderUpdateRequest.java new file mode 100644 index 0000000..6166d74 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrderUpdateRequest.java @@ -0,0 +1,41 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class OrderUpdateRequest { + + /** + * id + */ + private Long orderId; + + /** + * 取餐方式(0堂食 1自提 2外卖) + */ + private Integer pickupMethod; + + /** + * 配送地址 + */ + private String location; + + /** + * 取餐开始时间 + */ + private LocalDateTime pickupStartTime; + + /** + * 取餐开始时间 + */ + private LocalDateTime pickupEndTime; + + /** + * 备注 + */ + private String notes; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrdersCountByErrandRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrdersCountByErrandRequest.java new file mode 100644 index 0000000..6b4ec76 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/order/OrdersCountByErrandRequest.java @@ -0,0 +1,16 @@ +package com.bsz.school_send_back_end.model.dto.order; + +import lombok.Data; + +@Data +public class OrdersCountByErrandRequest { + /** + * 跑腿id + */ + private Long errandId; + + /** + * 审核状态 0-未审核 1-审核通过 + */ + private Integer state; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/refund/RefundAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/refund/RefundAddRequest.java new file mode 100644 index 0000000..fd72794 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/refund/RefundAddRequest.java @@ -0,0 +1,28 @@ +package com.bsz.school_send_back_end.model.dto.refund; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RefundAddRequest { + /** + * 订单号,唯一标识 + */ + private Long orderId; + + /** + * 退款原因 + */ + private String reason; + + /** + * 退款金额 + */ + private BigDecimal amount; + + /** + * 退款状态:0-待审核, 1-已同意, 2-已拒绝 + */ + private Integer status; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/refund/RefundUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/refund/RefundUpdateRequest.java new file mode 100644 index 0000000..aa1a96c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/refund/RefundUpdateRequest.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.dto.refund; + +import lombok.Data; + +@Data +public class RefundUpdateRequest { + /* + 订单id + */ + private Long orderId; + + /* + 需要修改的状态 + */ + private Integer status; + + /* + 拒绝原因 + */ + private String RefuseReason; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsAddRequest.java new file mode 100644 index 0000000..9e0386c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsAddRequest.java @@ -0,0 +1,25 @@ +package com.bsz.school_send_back_end.model.dto.specifications; + +import com.bsz.school_send_back_end.model.dto.attribute.AttributeAddRequest; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +public class SpecificationsAddRequest implements Serializable { + + /** + * 规格名称 + */ + private String specificationsName; + + /** + * 属性请求体列表 + */ + private List attributeAddRequests; + + @Serial + private static final long serialVersionUID = -2573217224030065261L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsMyQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsMyQueryRequest.java new file mode 100644 index 0000000..8059f15 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsMyQueryRequest.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.dto.specifications; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户删除请求 + * + * @author xy + */ +@Data +public class SpecificationsMyQueryRequest implements Serializable { + + /** + * id + */ + private Long id; + + private static final long serialVersionUID = 1L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsQueryRequest.java new file mode 100644 index 0000000..272cc46 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsQueryRequest.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.dto.specifications; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author xy + */ +@Data +public class SpecificationsQueryRequest implements Serializable { + + /** + * 规格名称 + */ + private String specificationsName; + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsUpdateRequest.java new file mode 100644 index 0000000..e673702 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/specifications/SpecificationsUpdateRequest.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.model.dto.specifications; + +import com.bsz.school_send_back_end.model.dto.attribute.AttributeUpdateRequest; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +public class SpecificationsUpdateRequest implements Serializable { + + /** + * 规格id + */ + private Long id; + + /** + * 规格名称 + */ + private String specificationsName; + + /** + * 属性请求体列表 + */ + private List attributeUpdateRequests; + + @Serial + private static final long serialVersionUID = -2573217224030065261L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/system/SystemAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/system/SystemAddRequest.java new file mode 100644 index 0000000..2ac1e5e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/system/SystemAddRequest.java @@ -0,0 +1,23 @@ +package com.bsz.school_send_back_end.model.dto.system; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class SystemAddRequest implements Serializable { + + /** + * 类型:0公告,1轮播图 + */ + private Integer type; + + /** + * 功能内容 + */ + private String content; + + @Serial + private static final long serialVersionUID = 8089646587314575974L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/system/SystemQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/system/SystemQueryRequest.java new file mode 100644 index 0000000..f7d0e46 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/system/SystemQueryRequest.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.model.dto.system; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class SystemQueryRequest implements Serializable { + + /** + * type 0公告,1轮播图 + */ + private Integer type; + + @Serial + private static final long serialVersionUID = 8089646587314575974L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserAddRequest.java new file mode 100644 index 0000000..395bdc0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserAddRequest.java @@ -0,0 +1,44 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * + * 用户创建请求 + * + */ +@Data +public class UserAddRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -8848430212953827391L; + + /** + * 用户昵称 + */ + private String username; + + /** + * 用户账号 + */ + private String userAccount; + + /** + * 用户密码 + */ + private String userPassword; + + /** + * 用户头像 + */ + private String avatarUrl; + + + + +} + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserDeleteRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserDeleteRequest.java new file mode 100644 index 0000000..ec90e3b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserDeleteRequest.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户删除请求 + * + */ +@Data +public class UserDeleteRequest implements Serializable { + + /** + * id + */ + private Long id; + + private static final long serialVersionUID = 1L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserLoginRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserLoginRequest.java new file mode 100644 index 0000000..fa2a0a6 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserLoginRequest.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import lombok.Data; +import java.io.Serializable; + +/** + * 用户登录请求体 + */ +@Data +public class UserLoginRequest implements Serializable { + + private static final long serialVersionUID = 3191241716373120793L; + + /** + * 用户账号 + */ + private String userAccount; + + /** + * 用户密码 + */ + private String userPassword; + + /** + * 登录app + */ + private String appName; + +} + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserQueryRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserQueryRequest.java new file mode 100644 index 0000000..aeb254f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserQueryRequest.java @@ -0,0 +1,45 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户查询请求 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class UserQueryRequest extends PageRequest implements Serializable { + + /** + * id + */ + private Long id; + + + /** + * openId + */ + private String openId; + + /** + * 用户昵称 + */ + private String username; + + /** + * 手机号 + */ + private String phone; + + /** + * 用户角色:user/admin/ban + */ + private String userRole; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserRegisterRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserRegisterRequest.java new file mode 100644 index 0000000..df6e9c5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserRegisterRequest.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.model.dto.user; + + +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户注册请求体参数 + * + */ +@Data +public class UserRegisterRequest implements Serializable { + /** + * 防止序列化出现冲突 + */ + private static final long serialVersionUID = 3553317334228624372L; + /** + * 用户账号 + */ + private String userAccount; + /** + * 用户密码 + */ + private String userPassword; + /** + * 校验密码 + */ + private String checkPassword; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserSearchRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserSearchRequest.java new file mode 100644 index 0000000..80a47ee --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserSearchRequest.java @@ -0,0 +1,66 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import com.bsz.school_send_back_end.model.dto.PageRequest; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** +* 用户查询请求 +* +*/ +@Data +public class UserSearchRequest extends PageRequest implements Serializable { + + /** + * 用户昵称 + */ + private String username; + + /** + * 账号 + */ + private String userAccount; + + + /** + * 性别 男 女 + */ + private Integer gender; + + + /** + * 电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 状态 0-正常 1-注销 2-封号 + */ + private Integer userStatus; + + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * + */ + private String userRole; + + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdateMyRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdateMyRequest.java new file mode 100644 index 0000000..17a46f3 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdateMyRequest.java @@ -0,0 +1,42 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 用户更新个人信息请求 + * + */ +@Data +public class UserUpdateMyRequest implements Serializable { + + /** + * 用户名 + */ + private String username; + + + /** + * 用户头像 + */ + private String avatarUrl; + + /** + * 性别 男 女 + */ + private String gender; + + /** + * 电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdatePasswordRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdatePasswordRequest.java new file mode 100644 index 0000000..56f9110 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdatePasswordRequest.java @@ -0,0 +1,24 @@ +package com.bsz.school_send_back_end.model.dto.user; + +import lombok.Data; + +import java.io.Serializable; + +/** + * + */ +@Data +public class UserUpdatePasswordRequest implements Serializable { + + private static final long serialVersionUID = -5996345129538944393L; + + /** + * 原密码 + */ + private String userPassword; + + /** + * 新密码 + */ + private String newPassword; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdateRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdateRequest.java new file mode 100644 index 0000000..18584ae --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/user/UserUpdateRequest.java @@ -0,0 +1,68 @@ +package com.bsz.school_send_back_end.model.dto.user; + + +import com.baomidou.mybatisplus.annotation.TableLogic; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户更新请求 + * + */ +@Data +public class UserUpdateRequest implements Serializable { + + private Long id; + /** + * 用户昵称 + */ + private String username; + + /** + * 账号 + */ + private String userAccount; + + /** + * 密码 + */ + private String userPassword; + + /** + * 用户头像 + */ + private String avatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 状态 0 - 正常 1 - 注销 2 - 封号 + */ + private Integer userStates; + + /** + * 更新时间 + */ + private Date updateTime; + + + /** + * 用户 or 管理员 + */ + private String userRole; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/userRating/UserRatingAddRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/userRating/UserRatingAddRequest.java new file mode 100644 index 0000000..e384931 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/userRating/UserRatingAddRequest.java @@ -0,0 +1,39 @@ +package com.bsz.school_send_back_end.model.dto.userRating; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UserRatingAddRequest implements Serializable { + + /** + * 商家id + */ + private Long ratedEntityId; + + /** + * 评分对象类型:1=商家,2=跑腿 + */ + private Integer ratedEntityType; + + /** + * 用户id + */ + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 评分 + */ + private Integer rating; + + /** + * 评论 + */ + private String review; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/userRating/UserRatingReviewRequest.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/userRating/UserRatingReviewRequest.java new file mode 100644 index 0000000..dd326b0 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/dto/userRating/UserRatingReviewRequest.java @@ -0,0 +1,24 @@ +package com.bsz.school_send_back_end.model.dto.userRating; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class UserRatingReviewRequest implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 商家回复内容 + */ + private String businessReview; + + @Serial + private static final long serialVersionUID = -2254826620684237034L; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/enums/FileUploadBizEnum.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/enums/FileUploadBizEnum.java new file mode 100644 index 0000000..5b285a5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/enums/FileUploadBizEnum.java @@ -0,0 +1,55 @@ +package com.bsz.school_send_back_end.model.enums; + +import lombok.Getter; +import org.apache.commons.lang3.ObjectUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Getter +public enum FileUploadBizEnum { + USER_AVATAR("头像", "user_avatar"), + + DISHES_IMAGE("菜品", "dishes"), + + CARD_IMAGE("证件", "card"), + + SYSTEM_IMAGE("系统", "system"), + + TAKEOUT_IMAGE("外卖", "takeout"); + + + private final String text; + + private final String value; + + FileUploadBizEnum(String text, String value) { + this.text = text; + this.value = value; + } + + /** + * 获取值列表 + */ + public static List getValues() { + return Arrays.stream(values()).map(item -> item.value).collect(Collectors.toList()); + } + + /** + * 根据 value获取枚举 + */ + public static FileUploadBizEnum getEnumByValue(String value) { + if (ObjectUtils.isEmpty(value)) { + return null; + } + + for (FileUploadBizEnum fileEnum : FileUploadBizEnum.values()) { + if (fileEnum.value.equals(value)) { + return fileEnum; + } + } + + return null; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/enums/UserRoleEnum.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/enums/UserRoleEnum.java new file mode 100644 index 0000000..41e8d3c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/enums/UserRoleEnum.java @@ -0,0 +1,52 @@ +package com.bsz.school_send_back_end.model.enums; + +import lombok.Getter; +import org.apache.commons.lang3.ObjectUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户角色枚举 + */ +@Getter +public enum UserRoleEnum { + + USER("用户", "user"), + BUSINESS("商家", "business"), + ERRAND("跑腿", "errand"), + ADMIN("管理员", "admin"), + BOSS("Boss", "boss"), + BAN("被封号", "ban"); + + private final String text; + private final String value; + + UserRoleEnum(String text, String value) { + this.text = text; + this.value = value; + } + + /** + * 获取值列表 + */ + public static List getValues() { + return Arrays.stream(values()).map(item -> item.value).collect(Collectors.toList()); + } + + /** + * 根据 value 获取枚举 + */ + public static UserRoleEnum getEnumByValue(String value) { + if (ObjectUtils.isEmpty(value)) { + return null; + } + for (UserRoleEnum anEnum : UserRoleEnum.values()) { + if (anEnum.value.equals(value)) { + return anEnum; + } + } + return null; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/AttributeVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/AttributeVO.java new file mode 100644 index 0000000..64e6f3f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/AttributeVO.java @@ -0,0 +1,28 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class AttributeVO implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 属性名称 + */ + private String attributeName; + + /** + * 属性状态:0在售,1停售 + */ + private Integer attributeStatus; + + @Serial + private static final long serialVersionUID = 1542187317375164514L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BillVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BillVO.java new file mode 100644 index 0000000..b63d534 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BillVO.java @@ -0,0 +1,31 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class BillVO { + + /** + * 电话 + */ + private String phone; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 综合评分 + */ + private BigDecimal income; + + /** + * 0未结算 1已结算 2已提现 + */ + private Integer state; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessAdminVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessAdminVO.java new file mode 100644 index 0000000..93ee027 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessAdminVO.java @@ -0,0 +1,119 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家视图(管理员视角) + */ +@Data +public class BusinessAdminVO implements Serializable { + + + @Serial + private static final long serialVersionUID = 1250238798844609277L; + /** + * id + */ + private Long id; + + /** + * 商家id + */ + private Long businessId; + + /** + * 用户id + */ + private Long userId; + + /** + * 门店名称 + */ + private String businessName; + + /** + * 门店头像 + */ + private String businessAvatar; + + /** + * 门店手机号 + */ + private String businessPhone; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 商家相册 + */ + private String businessImages; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 店主名 + */ + private String shopkeeper; + + /** + * 营业执照 + */ + private String license; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 开始营业时间 + */ + private String startBusiness; + + /** + * 结束营业时间 + */ + private String endBusiness; + + /** + * 状态:0禁用,1启用 + */ + private Integer state; + + /** + * 店铺状态:0休业,1营业 + */ + private Integer storeStatus; + + /** + * 创建时间 + */ + private Date createTime; + + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessLogVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessLogVO.java new file mode 100644 index 0000000..1a15799 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessLogVO.java @@ -0,0 +1,43 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.bsz.school_send_back_end.model.domain.Business; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家日志视图 + */ +@Data +public class BusinessLogVO implements Serializable { + + /** + * 用户id + */ + private Long userId; + + /** + * 商家信息 + */ + private Business business; + + /** + * 操作内容 + */ + private String content; + + /** + * ip地址 + */ + private String ip; + + /** + * 创建时间 + */ + private Date createTime; + + @Serial + private static final long serialVersionUID = 3150374624339085749L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessVO.java new file mode 100644 index 0000000..9c4b8e1 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/BusinessVO.java @@ -0,0 +1,104 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 商家视图 (用户视角) + * + * + */ +@Data +public class BusinessVO implements Serializable { + + @Serial + private static final long serialVersionUID = -3905934050752996111L; + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 门店名称 + */ + private String businessName; + + /** + * 门店头像 + */ + private String businessAvatar; + + /** + * 门店手机号 + */ + private String businessPhone; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 门店简介 + */ + private String businessProfile; + + /** + * 商家相册 + */ + private String businessImages; + + /** + * 开始营业时间 + */ + private String startBusiness; + + /** + * 结束营业时间 + */ + private String endBusiness; + + /** + * 月售 + */ + private Long monthlySales; + + /** + * 分类id + */ + private Long categoryId; + + /** + * 店铺状态:0休业,1营业 + */ + private Integer storeStatus; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 状态:0禁用,1启用 + */ + private Integer state; + + /** + * 等级 + */ + private Integer level; + + /** + * 是否被收藏 + */ + private Boolean isCollected; + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/CartVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/CartVO.java new file mode 100644 index 0000000..d3a1661 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/CartVO.java @@ -0,0 +1,57 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Dishes; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 购物车表 + * @TableName cart + */ +@TableName(value ="cart") +@Data +public class CartVO implements Serializable { + /** + * id + */ + private Long id; + + /** + * 商家id + */ + private Business business; + + /** + * 菜品id + */ + private Dishes dishes; + + /** + * 商品数量 + */ + private Integer quantity; + + /** + * 当前选择规格的价格 + */ + private BigDecimal price; + + /** + * 小计(单价 * 数量) + */ + private BigDecimal subtotal; + + /** + * 已选规格属性列表 + */ + private String selectedOptions; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/CollectVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/CollectVO.java new file mode 100644 index 0000000..2bbec22 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/CollectVO.java @@ -0,0 +1,30 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.bsz.school_send_back_end.model.domain.Business; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +@Data +public class CollectVO implements Serializable { + + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 商家列表 + */ + private Business business; + + @Serial + private static final long serialVersionUID = 3261824681080618286L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/DishesGroupVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/DishesGroupVO.java new file mode 100644 index 0000000..8a2c11b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/DishesGroupVO.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +@Data +public class DishesGroupVO { + /** + * 商家id + */ + private Long businessId; + + /** + * 菜品分组名称 + */ + private String groupName; + + /** + * 是否置顶:0不置顶,1置顶 + */ + private Integer isTopping; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/DishesVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/DishesVO.java new file mode 100644 index 0000000..33e5edf --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/DishesVO.java @@ -0,0 +1,40 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +@Data +public class DishesVO { + /** + * 菜品名称 + */ + private String dishesName; + + /** + * 菜品图片 + */ + private String dishesImage; + + /** + * 菜品价格 + */ + private Double dishesPrice; + + /** + * 打包费 + */ + private Double packPrice; + + /** + * 库存数量 + */ + private Integer inventoryStatus; + + /** + * 菜品状态:上架,下架 + */ + private String status; + /** + * 是否有规格(0:没有,1:有) + */ + private Integer isSpecification = 0; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/ErrandAuthVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/ErrandAuthVO.java new file mode 100644 index 0000000..e0619d7 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/ErrandAuthVO.java @@ -0,0 +1,76 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +@Data +public class ErrandAuthVO { + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 跑腿姓名 + */ + private String errandName; + + /** + * 跑腿头像 + */ + private String errandAvatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String errandPhone; + + /** + * 配送范围 + */ + private String distributionScope; + + /** + * 审核状态 0-未审核 1-审核通过 + */ + private Integer state; + + /** + * 接单量 + */ + private Integer totalOrders; + + /** + * 最大接单量 + */ + private Integer maxOrders; + + /** + * 等级 + */ + private Integer level; + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/ErrandVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/ErrandVO.java new file mode 100644 index 0000000..a4a2c02 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/ErrandVO.java @@ -0,0 +1,78 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +@Data +public class ErrandVO { + /** + * id + */ + private Long id; + + /** + * 用户id + */ + private Long userId; + + /** + * 跑腿姓名 + */ + private String errandName; + + /** + * 跑腿头像 + */ + private String errandAvatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String errandPhone; + + /** + * 配送范围 + */ + private String distributionScope; + + /** + * 审核状态 0-未审核 1-审核通过 + */ + private Integer state; + + /** + * 接单量 + */ + private Integer totalOrders; + + /** + * 最大接单量 + */ + private Integer maxOrders; + + /** + * 等级 + */ + private Integer level; + + + + /** + * 银行卡号 + */ + private String bankCard; + + /** + * 身份证正面 + */ + private String frontIdCard; + + /** + * 身份证反面 + */ + private String backIdCard; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/LoginUserVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/LoginUserVO.java new file mode 100644 index 0000000..5344d0b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/LoginUserVO.java @@ -0,0 +1,59 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 已登录用户视图(脱敏) + */ +@Data +public class LoginUserVO implements Serializable { + + + /** + * 用户 id + */ + private Long id; + + /** + * 用户昵称 + */ + private String username; + + /** + * 用户头像 + */ + private String avatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 手机号 + */ + private String phone; + + /** + * 用户角色:user/admin + */ + private String userRole; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + @Serial + private static final long serialVersionUID = 6304492672093490894L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderDetailsVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderDetailsVO.java new file mode 100644 index 0000000..446c06b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderDetailsVO.java @@ -0,0 +1,69 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单详情表 + * + * @TableName order_details + */ +@TableName(value = "order_details") +@Data +public class OrderDetailsVO implements Serializable { + /** + * id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 关联的订单id + */ + private Long orderId; + + /** + * 关联的菜品id + */ + private Long dishesId; + + /** + * 菜品信息 + */ + private DishesVO dishesVO; + + /** + * 购买数量 + */ + private Integer quantity; + + /** + * 单价 + */ + private BigDecimal price; + + /** + * 小计(单价 * 数量) + */ + private BigDecimal subtotal; + + /** + * 规格属性列表 + */ + private String attributeNames; + + /** + * 创建时间 + */ + private Date createTime; + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderErrandVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderErrandVO.java new file mode 100644 index 0000000..be841fd --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderErrandVO.java @@ -0,0 +1,36 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.Date; + +@Data +public class OrderErrandVO { + + /** + * 取餐码 + */ + private String pickupCode; + + /** + * 送达时间 + */ + private Date deliveryTime; + + /** + * 门店名称 + */ + private String businessName; + + /** + * 配送地址 + */ + private String location; + + /** + * 外卖图片 + */ + private String imageAddress; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderStatusVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderStatusVO.java new file mode 100644 index 0000000..0c3aca4 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrderStatusVO.java @@ -0,0 +1,37 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +@Data +public class OrderStatusVO { + /** + * 订单Id + */ + private Long id; + + /** + * 订单状态 + */ + private Integer orderState; + + /** + * 跑腿状态 + */ + private Integer errandState; + + /** + * 图片地址 + */ + private String imageAddress; + + /** + * 取餐方式(0堂食 1自提 2外卖) + */ + private Integer pickupMethod; + + /** + * 取餐码 + */ + private String pickupCode; + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersExcelByErrandVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersExcelByErrandVO.java new file mode 100644 index 0000000..6257986 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersExcelByErrandVO.java @@ -0,0 +1,80 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.NumberFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Objects; + +/** + * Excel订单信息导出 + * + * @author xy + */ +@Data +public class OrdersExcelByErrandVO { + + /** + * 订单编号 + */ + @ColumnWidth(20) + @NumberFormat("#") + @ExcelProperty(value = "订单编号", index = 0) + private Long id; + + /** + * 下单时间 + */ + @ColumnWidth(20) + @ExcelProperty(value = "下单时间", index = 1) + private String createTime; + + /** + * 手机号 + */ + @ColumnWidth(20) + @ExcelProperty(value = "手机号", index = 2) + private String phone; + + /** + * 订单状态 + */ + @ExcelProperty(value = "订单状态", index = 3) + private String state; + + /** + * 跑腿订单状态 + */ + @ExcelProperty(value = "跑腿订单状态", index = 4) + private String errandState; + + /** + * 订单金额 + */ + @NumberFormat("0.00") + @ExcelProperty(value = "跑腿收入", index = 5) + private BigDecimal errandIncome; + + /** + * 解决 EasyExcel "Duplicate key" 问题 + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrdersExcelByErrandVO that = (OrdersExcelByErrandVO) o; + return Objects.equals(id, that.id) && + Objects.equals(createTime, that.createTime) && + Objects.equals(phone, that.phone) && + Objects.equals(state, that.state) && + Objects.equals(errandState, that.errandState) && + Objects.equals(errandIncome.stripTrailingZeros(), that.errandIncome.stripTrailingZeros()); + } + + @Override + public int hashCode() { + return Objects.hash(id, createTime, phone, state, errandState, errandIncome.stripTrailingZeros()); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersExcelVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersExcelVO.java new file mode 100644 index 0000000..fd34eba --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersExcelVO.java @@ -0,0 +1,71 @@ +package com.bsz.school_send_back_end.model.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.NumberFormat; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Objects; + +/** + * Excel订单信息导出 + * + * @author xy + */ +@Data +public class OrdersExcelVO { + + /** + * 订单编号 + */ + @ColumnWidth(20) + @NumberFormat("#") + @ExcelProperty(value = "订单编号", index = 0) + private Long id; + + /** + * 下单时间 + */ + @ColumnWidth(20) + @ExcelProperty(value = "下单时间", index = 1) + private String createTime; + + /** + * 手机号 + */ + @ColumnWidth(20) + @ExcelProperty(value = "手机号", index = 2) + private String phone; + + /** + * 支付状态 + */ + @ExcelProperty(value = "支付状态", index = 3) + private String state; + + /** + * 订单金额 + */ + @NumberFormat("0.00") + @ExcelProperty(value = "订单金额", index = 4) + private BigDecimal totalPrice; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrdersExcelVO that = (OrdersExcelVO) o; + return Objects.equals(id, that.getId()) && + Objects.equals(createTime, that.getCreateTime()) && + Objects.equals(phone, that.getPhone()) && + Objects.equals(state, that.getState()) && + Objects.equals(totalPrice.stripTrailingZeros(), that.getTotalPrice().stripTrailingZeros()); // 避免浮点精度误差 + } + + @Override + public int hashCode() { + return Objects.hash(id, createTime, phone, state, totalPrice.stripTrailingZeros()); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersPickVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersPickVO.java new file mode 100644 index 0000000..89eb416 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersPickVO.java @@ -0,0 +1,27 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +@Data +public class OrdersPickVO { + + /** + * 日期 + */ + private String date; + + /** + * 外卖单 + */ + private Long takeOutNum; + + /** + * 自提单量 + */ + private Long selfLiftNum; + + /** + * 堂食单量 + */ + private Long eatInNum; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersVO.java new file mode 100644 index 0000000..de65e69 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/OrdersVO.java @@ -0,0 +1,137 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * 订单视图 + */ +@Data +public class OrdersVO implements Serializable { + /** + * id + */ + private Long id; + + /** + * 取餐码 + */ + private String pickupCode; + + /** + * 姓名 + */ + private String userName; + + /** + * 手机号 + */ + private String phone; + + /** + * 下单用户id + */ + private Long userId; + + /** + * 商家id + */ + private Long businessId; + + /** + * 跑腿id + */ + private Long errandId; + + /** + * 配送地址 + */ + private String location; + + /** + * 商家信息 + */ + private BusinessVO businessVO; + + /** + * 订单实际总价 + */ + private BigDecimal totalPrice; + + /** + * 取餐方式(0堂食 1自提) + */ + private Integer pickupMethod; + + /** + * 支付方式 + */ + private Integer payMethod; + + /** + * 取餐时间 + */ + private String pickupTime; + + /** + * 备注 + */ + private String notes; + + /** + * 订单状态:0未支付 1已完成 2已取消 + */ + private Integer state; + + /** + * 下单时间 + */ + private LocalDateTime createTime; + + /** + * 支付时间 + */ + private Date updateTime; + + /** + * 商品数量 + */ + private Integer number; + + /** + * 店铺详细地址 + */ + private String address; + + /** + * 取餐开始时间 + */ + private LocalDateTime pickupStartTime; + + /** + * 取餐结束时间 + */ + private LocalDateTime pickupEndTime; + + /** + * 外卖图片 + */ + private String imageAddress; + + /** + * 订单详情 + */ + private List orderDetailsVOList; + + + + @Serial + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/SpecificationsVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/SpecificationsVO.java new file mode 100644 index 0000000..3c0d195 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/SpecificationsVO.java @@ -0,0 +1,29 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + +@Data +public class SpecificationsVO implements Serializable { + + /** + * 规格id + */ + private Long id; + + /** + * 规格名称 + */ + private String specificationsName; + + /** + * 该规格的所有属性 + */ + private List attributeVOList; + + @Serial + private static final long serialVersionUID = 8473325711571994982L; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/UserVO.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/UserVO.java new file mode 100644 index 0000000..be8bdec --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/model/vo/UserVO.java @@ -0,0 +1,63 @@ +package com.bsz.school_send_back_end.model.vo; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UserVO implements Serializable { + + /** + * id + */ + private Long id; + + /** + * openId + */ + private String openId; + /** + * 用户昵称 + */ + private String username; + + /** + * 账号 + */ + private String userAccount; + + /** + * 用户头像 + */ + private String avatarUrl; + + /** + * 性别 + */ + private Integer gender; + + /** + * 密码 + */ + private String userPassword; + + /** + * 电话 + */ + private String phone; + + /** + * 状态 0 -正常 + */ + private Integer userStatus; + + /** + * 登录态 + */ + private String sessionId; + + /** + * 用户角色 0 - 普通用户 1 - 管理员 2 - 商家 + */ + private String userRole; +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/CancelOrder.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/CancelOrder.java new file mode 100644 index 0000000..7047dc9 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/CancelOrder.java @@ -0,0 +1,94 @@ +package com.bsz.school_send_back_end.scheduler; + +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradeRefundModel; +import com.alipay.api.request.AlipayTradeRefundRequest; +import com.alipay.api.response.AlipayTradeRefundResponse; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.config.AlipayClients; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.service.OrdersService; +import com.bsz.school_send_back_end.utils.UniqueNumberGenerator; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +@Slf4j +@Component +public class CancelOrder { + + @Resource + private OrdersService ordersService; + + @Scheduled(cron = "0 0/30 * * * *") // 每30分钟执行一次 + public void cancelOrder() throws AlipayApiException { + log.info("定时任务开始执行"); + + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.MINUTE, -30); + Date halfHourAgo = calendar.getTime(); + + // 查询超时订单 + List cancelOrders = ordersService.findCancelOrders(halfHourAgo); + log.info("查询到的超时订单数量:{}", cancelOrders.size()); + + if (CollectionUtils.isEmpty(cancelOrders)) { + log.info("当前没有订单超时"); + return; + } + + // 遍历每个订单进行处理 + for (Orders orders : cancelOrders) { + try { + log.info("正在处理超时订单,订单ID:{}", orders.getId()); + this.closeOrder(orders.getPickupCode()); // 关闭订单或退款 + log.info("订单超时取消成功,订单ID:{}", orders.getId()); + } catch (Exception e) { + log.error("处理订单超时取消失败,订单ID:{}", orders.getId(), e); + } + } + + log.info("所有超时订单处理完成!"); + } + + public void closeOrder(String orderNo) throws AlipayApiException { + + AlipayClients clients = new AlipayClients(); + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + AlipayTradeRefundModel model = new AlipayTradeRefundModel(); + + + QueryWrapper ordersQueryWrapper = new QueryWrapper<>(); + ordersQueryWrapper.eq("pickupCode", orderNo); + log.info("orderNo:" + orderNo); + Orders orders = ordersService.getOne(ordersQueryWrapper); + model.setOutTradeNo(orderNo); + model.setRefundAmount(String.valueOf(orders.getTotalPrice())); + ThrowUtils.throwIf(!orders.getState().equals(1) || orders.getState().equals(2),ErrorCode.SYSTEM_ERROR,"当前订单未支付"); + //退款请求单号 要求唯一 需改 + String number = UniqueNumberGenerator.generateNumber(); + model.setOutRequestNo(number); + log.info("outRequestNo:" + number); + request.setBizModel(model); + orders.setState(2); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败"); + log.info("orderState:" + orders.getState()); + AlipayTradeRefundResponse response = clients.alipayClient().execute(request); + if (!response.isSuccess()) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "退款失败"); + } + log.info("退款成功"); + + log.info(response.getBody()); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/UpdateBusinessErrand.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/UpdateBusinessErrand.java new file mode 100644 index 0000000..1871216 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/UpdateBusinessErrand.java @@ -0,0 +1,44 @@ +package com.bsz.school_send_back_end.scheduler; + +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Errand; +import com.bsz.school_send_back_end.service.BusinessLevelService; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.ErrandLevelService; +import com.bsz.school_send_back_end.service.ErrandService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Component +@Slf4j +public class UpdateBusinessErrand { + @Resource + private BusinessService businessService; + + @Resource + private BusinessLevelService businessLevelService; + + @Resource + private ErrandService errandService; + + @Resource + private ErrandLevelService errandLevelService; + + @Scheduled(cron = "0 0 0 * * ?") + public void updateBusinessLevels() { + List list = businessService.list(); + for (Business business : list) { + businessLevelService.updateBusinessLevel(business.getId()); + } + List errandList = errandService.list(); + for (Errand errand : errandList) { + errandLevelService.updateErrandLevel(errand.getId()); + } + log.info("更新商家和跑腿时间:" + new Date()); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/UpdateOrder.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/UpdateOrder.java new file mode 100644 index 0000000..3dc8e87 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/scheduler/UpdateOrder.java @@ -0,0 +1,102 @@ +package com.bsz.school_send_back_end.scheduler; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.*; +import com.bsz.school_send_back_end.service.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class UpdateOrder { + + @Resource + private OrdersService ordersService; + + @Resource + private ErrandIncomeService errandIncomeService; + + @Resource + private ErrandService errandService; + + @Resource + private ErrandBillService billService; + + @Resource + private UserService userService; + + @Scheduled(cron = "0 0 * * * ?") // 1小时执行一次 + public void completeExpiredOrders() { + // 获取当前时间的 24 小时前 + LocalDateTime deadline = LocalDateTime.now().minusHours(24); + + // 查询已出餐且超过 24 小时的订单 + List expiredOrders = ordersService.findExpiredOrders(deadline); + + if (CollectionUtils.isEmpty(expiredOrders)) { + return; + } + + // 订单 ID 列表 + List expiredOrderIds = expiredOrders.stream() + .filter(order -> order.getLocation() != null && !order.getLocation().isEmpty()) + .map(Orders::getId) + .collect(Collectors.toList()); + // **如果存在需要结算的订单** + if (!CollectionUtils.isEmpty(expiredOrderIds)) { + // 查询 `ErrandIncome` 中相关的收入记录 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(ErrandIncome::getOrderId, expiredOrderIds); + List errandIncomes = errandIncomeService.list(queryWrapper); + + // 更新收入状态 + errandIncomes.forEach(income -> { + income.setState(1); + Errand errand = errandService.getById(income.getErrandId()); + Orders orders = ordersService.getById(income.getOrderId()); + User user = userService.getById(orders.getUserId()); + if (errand != null) { + BigDecimal totalPrice = errand.getTotalPrice(); + totalPrice = totalPrice.add(income.getIncome()); + errand.setTotalPrice(totalPrice); + + boolean update = errandService.updateById(errand); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "收入加入总金额失败"); + + ErrandBill errandBill = new ErrandBill(); + errandBill.setOrderId(orders.getId()); + errandBill.setErrandState(income.getState()); + errandBill.setIncome(income.getIncome()); + errandBill.setUsername(user.getUsername()); + errandBill.setOrderStartTime(orders.getCreateTime()); + boolean save = billService.save(errandBill); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "添加跑腿账单失败"); + } + }); // 1 = 已结算 将收入加入总金额 + boolean updatedIncome = errandIncomeService.updateBatchById(errandIncomes); + ThrowUtils.throwIf(!updatedIncome, ErrorCode.OPERATION_ERROR, "修改订单收入状态失败"); + } + + // 更新订单状态 + for (Orders order : expiredOrders) { + order.setState(5); + } + + boolean updated = ordersService.updateBatchById(expiredOrders); + if (updated) { + log.info("成功完成 {} 个超时订单", expiredOrders.size()); + } else { + log.warn("自动完成订单时发生错误"); + } + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/AliPayService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/AliPayService.java new file mode 100644 index 0000000..da6aa9c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/AliPayService.java @@ -0,0 +1,8 @@ +package com.bsz.school_send_back_end.service; + +import java.math.BigDecimal; + +public interface AliPayService { + + String createPayment(String orderId, String miniOpenId, BigDecimal amount); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/AttributeService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/AttributeService.java new file mode 100644 index 0000000..389c328 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/AttributeService.java @@ -0,0 +1,37 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Attribute; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeAddRequest; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeUpdateRequest; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; + +import java.util.List; + +/** +* @author xy +*/ +public interface AttributeService extends IService { + + /** + * 根据规格id获取属性脱敏列表 + */ + List getBySpecificationsVoId(List specificationsVOList); + + /** + * 添加规格的属性 + */ + Boolean addAttribute(List attributeAddRequest, Long businessId, Long specificationsId); + + /** + * 校验 + */ + void validAttribute(Attribute attribute); + + /** + * 更新规格的属性信息 + */ + Boolean updateAttribute(List attributeUpdateRequests, Long businessId, Long specificationsId); + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessAuthService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessAuthService.java new file mode 100644 index 0000000..7e6c9d9 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessAuthService.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.BusinessAuth; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.vo.BusinessAdminVO; + +import java.util.List; + +/** +* @author Lenovo +* @description 针对表【business_auth(商家认证)】的数据库操作Service +*/ +public interface BusinessAuthService extends IService { + + /** + * 获取脱敏的商家信息 + */ + BusinessAdminVO getBusinessAdminVO(Business business); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessLevelService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessLevelService.java new file mode 100644 index 0000000..ff5275a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessLevelService.java @@ -0,0 +1,22 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.BusinessLevel; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author xy +*/ +public interface BusinessLevelService extends IService { + + /** + * 更新商家等级 + */ + void updateBusinessLevel(Long businessId); + + /** + * 查询所有商家 + */ + List findAllOrdered(); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessService.java new file mode 100644 index 0000000..23360c3 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessService.java @@ -0,0 +1,54 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.model.domain.Business; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.BusinessAuth; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.business.BusinessQueryRequest; +import com.bsz.school_send_back_end.model.vo.BusinessVO; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +/** +* @author xy +*/ +public interface BusinessService extends IService { + + /** + * 添加商户和商家的账户以及填充认证信息 + * @param user + * @param business + * @param businessAuth + */ + void addBusiness(User user, Business business, BusinessAuth businessAuth); + + + + void validBusiness(Business business, boolean add); + + void validBusinessAuth(BusinessAuth businessAuth, boolean add); + + /** + * 获取查询条件 + */ + QueryWrapper getQueryWrapper(BusinessQueryRequest businessQueryRequest); + + BusinessVO getBusinessVO(Business business); + /** + * 获取脱敏的商家信息 + */ + List getBusinessVO(List businessList); + + + /** + * 获取当前登录商家 + */ + Business getLoginBusiness(HttpServletRequest request); + + /** + * 查询所有商家 + */ + List findAllBusiness(); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessinfoService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessinfoService.java new file mode 100644 index 0000000..f1e9a73 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/BusinessinfoService.java @@ -0,0 +1,17 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.Businessinfo; +import com.bsz.school_send_back_end.model.dto.businessinfo.InfoQueryRequest; + +import java.util.List; + +/** +* @author xy +*/ +public interface BusinessinfoService extends IService { + + QueryWrapper getQueryWrapper (InfoQueryRequest infoQueryRequest); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CartService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CartService.java new file mode 100644 index 0000000..6b899ef --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CartService.java @@ -0,0 +1,46 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Cart; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.dto.cart.CartAddRequest; +import com.bsz.school_send_back_end.model.dto.cart.CartUpdateRequest; +import com.bsz.school_send_back_end.model.vo.CartVO; +import org.springframework.beans.BeanUtils; +import org.springframework.util.CollectionUtils; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +public interface CartService extends IService { + + /** + * 校验 + */ + void validCart(CartAddRequest cartAddRequest); + + /** + * 添加菜品 + */ + Long addCart (CartAddRequest cartAddRequest, HttpServletRequest request); + + /** + * 更新购物车菜品 + */ + Boolean updateCart(CartUpdateRequest cartUpdateRequest, HttpServletRequest request); + + /** + * 删除购物车菜品 + */ + Boolean deleteCart(Long cartId, HttpServletRequest request); + + /** + * 获取购物车脱敏列表 + */ + List getCartVOList(List cartList); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CategoryService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CategoryService.java new file mode 100644 index 0000000..ecc5371 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CategoryService.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Category; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author xy +*/ +public interface CategoryService extends IService { + /** + * 校验 + */ + void validCategory(Category category, boolean add); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CollectService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CollectService.java new file mode 100644 index 0000000..1604ffe --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/CollectService.java @@ -0,0 +1,34 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Collect; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.dto.cart.CartAddRequest; +import com.bsz.school_send_back_end.model.dto.collect.CollectAddRequest; +import com.bsz.school_send_back_end.model.vo.BusinessVO; +import com.bsz.school_send_back_end.model.vo.CollectVO; + +import jakarta.servlet.http.HttpServletRequest; +import java.net.http.HttpClient; +import java.util.List; + +/** +* @author xy +*/ +public interface CollectService extends IService { + + /** + * 校验 + */ + void validCollect(CollectAddRequest collectAddRequest); + + /** + * 添加收藏 + */ + Boolean addCollect(Collect collect, HttpServletRequest request); + + /** + * 根据收藏获取商家信息列表 + */ + List getCollectList(HttpServletRequest request); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/DishesGroupService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/DishesGroupService.java new file mode 100644 index 0000000..cf869ff --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/DishesGroupService.java @@ -0,0 +1,34 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.DishesGroup; +import com.bsz.school_send_back_end.model.vo.DishesGroupVO; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +/** +* @author xy +*/ +public interface DishesGroupService extends IService { + + /** + * 校验菜品分组 + */ + void validDishesGroup(DishesGroup dishesGroup,boolean update); + + /** + * 添加菜品分组 + */ + Boolean addDishesGroup(DishesGroup dishesGroup, HttpServletRequest request); + + /** + * 获取菜品分组 + */ + List getDishGroupVOList(List dishesGroupList); + + /** + * 更新 + */ + Boolean updateDishesGroupById(DishesGroup dishesGroup, HttpServletRequest request); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/DishesService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/DishesService.java new file mode 100644 index 0000000..d17a186 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/DishesService.java @@ -0,0 +1,51 @@ +package com.bsz.school_send_back_end.service; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.dto.Dishes.DishesQueryRequest; +import com.bsz.school_send_back_end.model.vo.DishesVO; +import java.util.List; + +/** +* @author xy +*/ +public interface DishesService extends IService { + + /** + * 根据分组id删除菜品 + */ + void removeByDishesGroupId(Long dishesGroupId); + + /** + * 校验 + */ + void validDishes(Dishes dishes, Boolean update); + + /** + * 添加菜品 + */ + Long addDishes(Dishes dishes); + + /** + * 更新菜品 + */ + Boolean updateDishes(Dishes dishes); + + /** + * 获取菜品脱敏信信息 + */ + List getDishesVOList(List dishesList); + + /** + * 获取菜品脱敏信息 + */ + DishesVO getDishesVO(Dishes dishes); + + + /** + * 获取菜品查询条件 + */ + QueryWrapper getWrapper(DishesQueryRequest dishesQueryRequest); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandAuthService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandAuthService.java new file mode 100644 index 0000000..39370ff --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandAuthService.java @@ -0,0 +1,34 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.bsz.school_send_back_end.model.domain.ErrandAuth; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.dto.errandAtuh.ErrandAuthQueryRequest; + +/** +* @author xy +*/ +public interface ErrandAuthService extends IService { + + /** + * 校验跑腿认证 + */ + void validErrandAuth (ErrandAuth errandAuth, boolean add); + + /** + * 获取修改对象 + */ + LambdaUpdateWrapper getUpdateWrapper (ErrandAuth errandAuth); + + /** + * 获取查询对象 + */ + QueryWrapper getQueryWrapper (ErrandAuthQueryRequest errandAuthQueryRequest); + + /** + * 根据id获取跑腿认证信息 + */ + ErrandAuth getErrandAuth(Long errandId); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandBillService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandBillService.java new file mode 100644 index 0000000..d67edb4 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandBillService.java @@ -0,0 +1,11 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.ErrandBill; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author xy +*/ +public interface ErrandBillService extends IService { + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandIncomeService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandIncomeService.java new file mode 100644 index 0000000..e904fe8 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandIncomeService.java @@ -0,0 +1,28 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.model.domain.ErrandIncome; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.dto.erradnIncome.ErrandIncomeQueryRequest; + +/** +* @author xy +*/ +public interface ErrandIncomeService extends IService { + /** + * 添加跑腿收入 + */ + void addErrandIncome(Orders orders); + + /** + * 分页查询 + */ + QueryWrapper getWrapper(ErrandIncomeQueryRequest queryRequest); + + /** + * 获取当日跑腿定案查询条件 + */ + LambdaQueryWrapper getQueryWrapper (Long errandId); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandLevelService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandLevelService.java new file mode 100644 index 0000000..802c069 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandLevelService.java @@ -0,0 +1,15 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.ErrandLevel; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author xy +*/ +public interface ErrandLevelService extends IService { + + /** + * 更新跑腿等级 + */ + void updateErrandLevel(Long errandId); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandOrderService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandOrderService.java new file mode 100644 index 0000000..3289437 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandOrderService.java @@ -0,0 +1,11 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.ErrandOrder; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author xy +*/ +public interface ErrandOrderService extends IService { + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandService.java new file mode 100644 index 0000000..ceb2606 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/ErrandService.java @@ -0,0 +1,68 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.model.domain.Errand; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.ErrandIncome; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.CommonRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandQueryRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandStateRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandUpdateRequest; +import com.bsz.school_send_back_end.model.vo.ErrandVO; + +import jakarta.servlet.http.HttpServletRequest; + +/** +* @author xy +*/ +public interface ErrandService extends IService { + /** + * 校验跑腿 + */ + void validErrand (Errand errand, boolean add); + + /** + * 添加跑腿 + */ + void addErrand (User user, Errand errand); + + /** + * 删除跑腿 + */ + void deleteErrand (HttpServletRequest request); + + /** + * 获取当前登录跑腿 + */ + Errand getLoginErrand(HttpServletRequest request); + + /** + * 获取查询对象 + */ + QueryWrapper getQueryWrapper(ErrandQueryRequest queryRequest); + + /** + * 修改订单状态 + */ + void orderToErrand (ErrandStateRequest errandStateRequest, HttpServletRequest request); + + /** + * 修改跑腿 + */ + Boolean updateErrand (ErrandUpdateRequest updateRequest); + + /** + * 修改跑腿接单量 + */ + void updateTotal (Errand errand, boolean add); + + /** + * 获取跑腿视图 + */ + ErrandVO getErrandVO(Errand errand); + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/LoggingService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/LoggingService.java new file mode 100644 index 0000000..5cc766b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/LoggingService.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.service; + +import org.springframework.ai.chat.client.AdvisedRequest; +import org.springframework.ai.chat.client.RequestResponseAdvisor; + +import java.util.Map; + +/** + * @author xy + */ +public class LoggingService implements RequestResponseAdvisor { + + @Override + public AdvisedRequest adviseRequest(AdvisedRequest request, Map context) { + System.out.println("Request"+request); + return request; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderDetailsService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderDetailsService.java new file mode 100644 index 0000000..e190fd9 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderDetailsService.java @@ -0,0 +1,32 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.OrderDetails; +import com.bsz.school_send_back_end.model.vo.OrderDetailsVO; + + +import java.util.List; + +/** + * @author xy + */ +public interface OrderDetailsService extends IService { + + /** + * 校验订单菜品 + */ + void validOrderDetail(OrderDetails orderDetails); + + /** + * 获取订单详情视图信息 + */ + OrderDetailsVO getOrderDetailsVO(OrderDetails orderDetails); + + /** + * 获取订单详情视图信息 + */ + List getOrderDetailsVO(List orderDetailsList); + + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderImageService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderImageService.java new file mode 100644 index 0000000..24a5c95 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderImageService.java @@ -0,0 +1,11 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.OrderImage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author xy +*/ +public interface OrderImageService extends IService { + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderRefundsService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderRefundsService.java new file mode 100644 index 0000000..f89969f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrderRefundsService.java @@ -0,0 +1,11 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.OrderRefunds; + +/** +* @author xy +*/ +public interface OrderRefundsService extends IService { + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrdersService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrdersService.java new file mode 100644 index 0000000..62062e4 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OrdersService.java @@ -0,0 +1,90 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.OrderDetails; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.dto.order.OrderQueryRequest; +import com.bsz.school_send_back_end.model.dto.order.OrderUpdateRequest; +import com.bsz.school_send_back_end.model.vo.OrderErrandVO; +import com.bsz.school_send_back_end.model.vo.OrderStatusVO; +import com.bsz.school_send_back_end.model.vo.OrdersPickVO; +import com.bsz.school_send_back_end.model.vo.OrdersVO; + + +import jakarta.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + +/** + * @author xy + */ +public interface OrdersService extends IService { + + /** + * 创建订单 + * + * @return 订单id + */ + long addOrder(Orders orders, List orderDetailsList); + + /** + * 校验订单 + */ + void validOrder(Orders orders); + + /** + * 获取订单视图信息 + */ + OrdersVO getOrdersVO(Orders orders); + + List getOrdersVO(List ordersList); + + /** + * 获取查询条件 + */ + QueryWrapper getQueryWrapper(OrderQueryRequest orderQueryRequest); + + /** + * 悲观锁 + */ + Orders getOrderWithPessimisticLock(Long ordersId); + + /** + * 修改未支付订单内容 + */ + Boolean OrderToUpdate(OrderUpdateRequest orderUpdateRequest, HttpServletRequest request); + + /** + * 修改超时订单 + */ + List findExpiredOrders(LocalDateTime deadline); + + + /** + * 查询超过半个小时无人抢单的订单 + */ + List findCancelOrders(Date halfHourAgo); + + /** + * 跑腿查看订单详情 + */ + OrderErrandVO getOrderErrandVO(Orders orders); + + /** + * 跑腿查看订单详情列表 + */ + List getListOrderErrandVO(List list); + + /** + * 获取订单状态列表 + */ + List liststatus(HttpServletRequest request); + + /** + * 获取七天内的订单数量 + */ + List getOrdernumber(); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OssService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OssService.java new file mode 100644 index 0000000..0d9695f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/OssService.java @@ -0,0 +1,17 @@ +package com.bsz.school_send_back_end.service; + +import org.springframework.web.multipart.MultipartFile; + +/** + * @author xy + */ +public interface OssService { + /** + * 上传头像到OSS + * + * @param file + * @return + */ + String uploadFileAvatar(MultipartFile file); + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/PrivateMessageService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/PrivateMessageService.java new file mode 100644 index 0000000..50196d2 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/PrivateMessageService.java @@ -0,0 +1,11 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; + +/** +* @author xy +*/ +public interface PrivateMessageService extends IService { + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SpecificationsDishesService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SpecificationsDishesService.java new file mode 100644 index 0000000..edfc20f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SpecificationsDishesService.java @@ -0,0 +1,33 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.SpecificationsDishes; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; + +import java.util.List; + +/** +* @author xy +*/ +public interface SpecificationsDishesService extends IService { + + /** + * 删除中间表信息 + */ + void deleteByDishesId(Long dishesId); + + /** + * 添加中间表信息 + */ + Boolean add(Long dishesId, List specificationsIds); + + /** + * 更新中间表信息 + */ + Boolean updateByDishesId(Long dishesId, List specificationsIds); + + /** + * 根据中间表数据中的规格id获取规格信息和属性 + */ + List getSpecificationsAddAttribute(List specificationsDishesList); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SpecificationsService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SpecificationsService.java new file mode 100644 index 0000000..77ccd7b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SpecificationsService.java @@ -0,0 +1,36 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Specifications; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeAddRequest; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeUpdateRequest; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +/** +* @author xy +*/ +public interface SpecificationsService extends IService { + + /** + * 校验 + */ + void validSpecifications(Specifications specifications, boolean add); + + /** + * 添加规格 + */ + Boolean addSpecifications(Specifications specifications, List attributeAddRequests, HttpServletRequest request); + + /** + * 更新规格 + */ + Boolean updateSpecifications(Specifications specifications, List attributeUpdateRequests, HttpServletRequest request); + + /** + * 获取规格脱敏列表 + */ + List getSpecificationsVO(List specificationsList); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SysteminfoService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SysteminfoService.java new file mode 100644 index 0000000..581e540 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SysteminfoService.java @@ -0,0 +1,11 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.Systeminfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author xy +*/ +public interface SysteminfoService extends IService { + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SystemlogService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SystemlogService.java new file mode 100644 index 0000000..ae9d549 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/SystemlogService.java @@ -0,0 +1,18 @@ +package com.bsz.school_send_back_end.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.bsz.school_send_back_end.model.domain.Systemlog; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.dto.log.LogQueryRequest; + +/** +* @author xy +*/ +public interface SystemlogService extends IService { + + /** + * 获取查询条件 + */ + QueryWrapper getQueryWrapper(LogQueryRequest logQueryRequest); + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/UserRatingService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/UserRatingService.java new file mode 100644 index 0000000..4d4247c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/UserRatingService.java @@ -0,0 +1,37 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.model.domain.UserRating; +import com.baomidou.mybatisplus.extension.service.IService; + +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +/** +* @author xy +*/ +public interface UserRatingService extends IService { + + /** + * 校验 + */ + void validUserRating(UserRating userRating, HttpServletRequest request); + + /** + * 校验商家是否能够回复用户评分 + */ + void validUserRatingByBusiness(Long userRatingId, HttpServletRequest request); + + /** + * 根据当前用户获取评分 + * @param request 当前用户 + * @return 评分列表 + */ + List listUserRatingByUser(HttpServletRequest request); + + /** + * 获取等级 + * @param averageScore + * @return + */ + int calculateLevel(Double averageScore); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/UserService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/UserService.java new file mode 100644 index 0000000..2778e70 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/UserService.java @@ -0,0 +1,96 @@ +package com.bsz.school_send_back_end.service; + +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsz.school_send_back_end.model.vo.LoginUserVO; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.user.UserSearchRequest; +import com.bsz.school_send_back_end.model.dto.user.UserUpdatePasswordRequest; +import org.springframework.stereotype.Service; + +import jakarta.servlet.http.HttpServletRequest; + +/** +* @author xy +*/ +@Service +public interface UserService extends IService { + + /** + * 用户注册 + * + * @param userAccount 登陆账号 + * @param userPassword 登录密码 + * @param checkPassword 校验密码 + * @return 新用户id + */ + long userRegister(String userAccount, String userPassword, String checkPassword); + + /** + * + * @param userAccount 登陆账号 + * @param userPassword 登陆密码 + * @param request 返回请求 + * @return 脱敏后的用户信息 + */ + + String userLogin(String userAccount, String userPassword, String appName, HttpServletRequest request); + + + /** + * 用户脱敏 + * + * @param originUser + * @return + */ + User getSafetyUser(User originUser); + + /** + * 用户注销 + * + * + * @param request + * @return 1 表示成功 + */ + int userLogout(HttpServletRequest request); + + /** + * 获取当前用户登录信息 + * + * @param request + * @return + */ + User getLoginUser(HttpServletRequest request); + + /** + * 修改密码 + * + * @param updatePasswordRequest + * @param request + */ + boolean updateUserPassword(UserUpdatePasswordRequest updatePasswordRequest, HttpServletRequest request); + + /** + * 分页条件 + * @param searchRequest + * @return + */ + QueryWrapper getQueryWrapper(UserSearchRequest searchRequest); + + /** + * 用户登录(支付宝) + * @param openId + * @param userInfo + * @param request + * @return 返回脱敏后的用户信息 + */ + LoginUserVO userLoginByAlipay(String openId, JSONObject userInfo, HttpServletRequest request); + + public LoginUserVO getLoginUserVO(User user); + + /** + *校验 + */ + void validUser(User user, boolean add); +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/WebsocketService.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/WebsocketService.java new file mode 100644 index 0000000..8211a9c --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/WebsocketService.java @@ -0,0 +1,105 @@ +package com.bsz.school_send_back_end.service; + +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; + +@Service +@Slf4j +public class WebsocketService { + + @Resource + private SimpMessagingTemplate template; + + @Resource + private PrivateMessageService privateMessageService; + + @Resource + private BusinessService businessService; + + private static final String ERRAND_TOPIC_PREFIX = "/topic/ServerToClient.errand."; + /** + * 简单点对点聊天 + */ + public void sendChatMessage(PrivateMessage message) { + if (message == null || message.getTo_userAccount() == null || message.getMessage() == null) { + log.error("发送消息失败,消息内容不完整: {}", message); + throw new BusinessException(ErrorCode.PARAMS_ERROR, "消息内容不完整"); + } + + log.info("正在发送消息: {}", message); + message.setMessage(message.getFrom_userAccount() + "发送:" + message.getMessage()); + + // 推送消息 + String destination = "/topic/ServerToClient.private." + message.getTo_userAccount(); + template.convertAndSend(destination, message); + + // 存储消息到数据库 + boolean save = privateMessageService.save(message); + if (!save) { + log.error("消息存储失败: {}", message); + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "消息存储失败"); + } + log.info("消息发送成功并存储: {}", message); + } + + /** + * 给商家传送订单信息 + */ + public void sendOrderMessage(Orders orders) { + if (orders == null || orders.getBusinessId() == null) { + log.error("订单信息不完整,无法推送: {}", orders); + throw new BusinessException(ErrorCode.PARAMS_ERROR, "订单信息不完整"); + } + + log.info("正在推送订单信息: {}", orders); + Long businessId = orders.getBusinessId(); + Business business = businessService.getById(businessId); + + if (business == null || business.getUserId() == null) { + log.error("商家信息未找到,商家ID: {}", businessId); + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "商家信息未找到"); + } + + Long userId = business.getUserId(); + String destination = "/topic/ServerToClient.order." + userId; + template.convertAndSend(destination, orders); + + log.info("订单信息推送成功,目标用户ID: {}", userId); + } + + /** + * 商家将订单发送给跑腿 + */ + @Async + public void sendOrderToErrand(Orders orders) { + if (orders == null || orders.getLocation() == null || orders.getLocation().trim().isEmpty()) { + log.error("订单信息或跑腿位置不完整,无法推送: {}", orders); + throw new BusinessException(ErrorCode.PARAMS_ERROR, "订单信息或位置信息不完整"); + } + + String location = orders.getLocation(); + + // 校验位置是否有效 + if (!UserConstant.VALID_LOCATIONS.contains(location)) { + log.error("非法位置,无法推送订单: 位置 = {}", location); + throw new BusinessException(ErrorCode.PARAMS_ERROR, "位置不合法"); + } + + log.info("正在向跑腿推送订单信息, 订单ID: {}, 位置: {}", orders.getId(), location); + String destination = ERRAND_TOPIC_PREFIX + location; + template.convertAndSend(destination, orders); + + log.info("订单推送成功,位置: {}", location); + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/AlipayServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/AlipayServiceImpl.java new file mode 100644 index 0000000..e92a975 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/AlipayServiceImpl.java @@ -0,0 +1,97 @@ +package com.bsz.school_send_back_end.service.impl; + + +import com.alipay.api.AlipayApiException; +import com.alipay.api.domain.AlipayTradeCreateModel; +import com.alipay.api.request.AlipayTradeCreateRequest; +import com.alipay.api.response.AlipayTradeCreateResponse; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.config.AlipayClients; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.OrderDetails; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.service.AliPayService; +import com.bsz.school_send_back_end.service.OrderDetailsService; +import com.bsz.school_send_back_end.service.OrdersService; +import com.bsz.school_send_back_end.utils.UniqueNumberGenerator; +import lombok.extern.slf4j.Slf4j; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class AlipayServiceImpl implements AliPayService { + + @Resource + private OrdersService ordersService; + + @Resource + private OrderDetailsService orderDetailsService; + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized String createPayment(String orderId, String miniOpenId, BigDecimal amount) { + //创建客户 + AlipayClients clients = new AlipayClients(); + //AlipayClient client = clients.alipayClient(); + //创建交易请求 + AlipayTradeCreateRequest aliRequest = new AlipayTradeCreateRequest(); + // 构造 JSON 字符串作为 biz_content + JSONObject bizContent = new JSONObject(); + //请求参数 沙箱内部参数 + + String outTradeNo = UniqueNumberGenerator.generateNumber(); + + Orders order = ordersService.getById(orderId); + if (order == null) { + log.error("订单不存在"); + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "订单不存在,订单号:" + outTradeNo); + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderDetails::getOrderId, orderId); + List orderDetailsList = orderDetailsService.list(wrapper); + String subject = orderDetailsList.stream() + .map(OrderDetails::getAttributeNames) + .collect(Collectors.joining(", ")); + //给支付宝的订单号设置成取餐码 + order.setPickupCode(outTradeNo); + boolean update = ordersService.updateById(order); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "修改订单状态失败"); + + try { + bizContent.put("out_trade_no", outTradeNo); + bizContent.put("total_amount", amount.toString()); + bizContent.put("subject", subject); + bizContent.put("product_code", "JSAPI_PAY"); + bizContent.put("seller_id", "2088932829893612"); + bizContent.put("buyer_open_id", miniOpenId); // ✅ 关键字段,放进 biz_content 中 + } catch (JSONException e) { + throw new RuntimeException(e); + } + ///回调地址 + aliRequest.setBizContent(bizContent.toString()); + aliRequest.setNotifyUrl("https://xiaokuaisong.shop:6448/api/Alipay/notifyUrl"); + String trade_no = null; + try { + AlipayTradeCreateResponse response = clients.alipayClient().execute(aliRequest); + trade_no = response.getTradeNo(); + if (trade_no == null) { + throw new BusinessException(ErrorCode.NULL_ERROR, "未获取到trade_no"); + } + } catch (AlipayApiException e) { + e.printStackTrace(); + } + log.info("trade_no:" + trade_no); + return trade_no; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/AttributeServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/AttributeServiceImpl.java new file mode 100644 index 0000000..7ea31a5 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/AttributeServiceImpl.java @@ -0,0 +1,136 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.AttributeMapper; +import com.bsz.school_send_back_end.model.domain.Attribute; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeAddRequest; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeUpdateRequest; +import com.bsz.school_send_back_end.model.vo.AttributeVO; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; +import com.bsz.school_send_back_end.service.AttributeService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class AttributeServiceImpl extends ServiceImpl + implements AttributeService { + + @Override + public List getBySpecificationsVoId(List specificationsVOList) { + if (CollectionUtils.isEmpty(specificationsVOList)) { + return specificationsVOList; + } + return specificationsVOList.stream().peek(item ->{ + Long specificationsId = item.getId(); + //根据规格id获取属性 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("specificationsId",specificationsId); + List attributeList = this.list(queryWrapper); + //获取属性脱敏信息 + List attributeVOList = getAttributeVOList(attributeList); + item.setAttributeVOList(attributeVOList); + }).collect(Collectors.toList()); + } + + @Override + public Boolean addAttribute(List attributeAddRequests, Long businessId, Long specificationsId) { + if (attributeAddRequests.isEmpty()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + //保存每个规格属性 + for (AttributeAddRequest attributeAddRequest: attributeAddRequests) { + Attribute attribute = new Attribute(); + BeanUtils.copyProperties(attributeAddRequest, attribute); + //校验 + validAttribute(attribute); + //添加保存 + saveAttribute(businessId, specificationsId, attribute); + } + + return true; + } + + @Override + public void validAttribute(Attribute attribute) { + if (attribute == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + String attributeName = attribute.getAttributeName(); + Integer attributeStatus = attribute.getAttributeStatus(); + + if (attributeStatus == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请填写属性状态"); + } + + if (StringUtils.isBlank(attributeName)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请填写属性名称"); + } + } + + @Override + public Boolean updateAttribute(List attributeUpdateRequests, Long businessId, Long specificationsId) { + if (attributeUpdateRequests.isEmpty()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"请补全属性参数"); + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("specificationsId",specificationsId); + boolean remove = this.remove(queryWrapper); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR); + //更新 + for (AttributeUpdateRequest attributeUpdateRequest : attributeUpdateRequests) { + Attribute attribute = new Attribute(); + BeanUtils.copyProperties(attributeUpdateRequest,attribute); + //校验 + validAttribute(attribute); + //更新 + saveAttribute(businessId,specificationsId,attribute); + } + + return true; + } + + /** + * 获取脱敏属性列表 + * @param attributes 为脱敏列表 + * @return 脱敏列表 + */ + private List getAttributeVOList (List attributes) { + if (CollectionUtils.isEmpty(attributes)) { + return new ArrayList<>(); + } + return attributes.stream().map(item -> { + AttributeVO attributeVO = new AttributeVO(); + BeanUtils.copyProperties(item,attributeVO); + return attributeVO; + }).collect(Collectors.toList()); + } + + /** + * 保存属性信息 + */ + private void saveAttribute(Long businessId, Long specificationsId, Attribute attribute) { + attribute.setBusinessId(businessId); + attribute.setSpecificationsId(specificationsId); + boolean result = this.save(attribute); + ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessAuthServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessAuthServiceImpl.java new file mode 100644 index 0000000..4f86f81 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessAuthServiceImpl.java @@ -0,0 +1,52 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.BusinessAuth; +import com.bsz.school_send_back_end.model.vo.BusinessAdminVO; +import com.bsz.school_send_back_end.service.BusinessAuthService; +import com.bsz.school_send_back_end.mapper.BusinessAuthMapper; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class BusinessAuthServiceImpl extends ServiceImpl + implements BusinessAuthService{ + + @Override + public BusinessAdminVO getBusinessAdminVO(Business business) { + if (business == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + BusinessAdminVO businessAdminVO = new BusinessAdminVO(); + + //关联认证信息 传入到视图中 + BusinessAuth businessAuth = new BusinessAuth(); + Long id = business.getId(); + if (id != null && id > 0) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("businessId", id); + businessAuth = this.getOne(queryWrapper); + } + + BeanUtils.copyProperties(business, businessAdminVO); + + if (businessAuth == null) { + throw new BusinessException(ErrorCode.NULL_ERROR); + } + + BeanUtils.copyProperties(businessAuth, businessAdminVO); + + return businessAdminVO; + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessLevelServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessLevelServiceImpl.java new file mode 100644 index 0000000..beae797 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessLevelServiceImpl.java @@ -0,0 +1,81 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.mapper.UserRatingMapper; +import com.bsz.school_send_back_end.model.domain.BusinessLevel; +import com.bsz.school_send_back_end.service.BusinessLevelService; +import com.bsz.school_send_back_end.mapper.BusinessLevelMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + +/** +* @author xy +*/ +@Service +@Slf4j +public class BusinessLevelServiceImpl extends ServiceImpl + implements BusinessLevelService{ + + @Resource + private BusinessLevelMapper businessLevelMapper; + + @Resource + private UserRatingMapper userRatingMapper; + + @Override + public void updateBusinessLevel(Long businessId) { + Double avg = userRatingMapper.findAvgByRatedEntityId(businessId); + if (avg == null) { + avg = UserConstant.DEFAULT_AVG_SCORE; + log.info("warn: avg没有值,将赋初始值1:" + avg); + log.info("当前商家id:" + businessId); + } + int level = calculateLevel(avg); + BusinessLevel businessLevel = businessLevelMapper.selectOne(Wrappers.lambdaQuery() + .eq(BusinessLevel::getBusinessId, businessId)); + + if (businessLevel == null) { + businessLevel = new BusinessLevel(); + businessLevel.setBusinessId(businessId); + businessLevel.setLevel(UserConstant.DEFAULT_LEVEL); + businessLevel.setAverageScore(BigDecimal.valueOf(1)); + } + businessLevel.setAverageScore(BigDecimal.valueOf(avg)); + businessLevel.setLevel(level); + + this.saveOrUpdate(businessLevel); + } + + @Override + public List findAllOrdered() { + List list = businessLevelMapper.selectList(Wrappers.lambdaQuery() + .orderByDesc(BusinessLevel::getLevel,BusinessLevel::getAverageScore) + .orderByAsc(BusinessLevel::getCreateTime)); + return list; + } + + + private int calculateLevel(Double averageScore) { + if (averageScore >= 4.5) { + return 5; + } else if (averageScore >= 4.0) { + return 4; + } else if (averageScore >= 3.0) { + return 3; + } else if (averageScore >= 2.0) { + return 2; + } else { + return 1; + } + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessServiceImpl.java new file mode 100644 index 0000000..f44cc46 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessServiceImpl.java @@ -0,0 +1,230 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.BusinessAuth; +import com.bsz.school_send_back_end.model.domain.BusinessLevel; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.business.BusinessQueryRequest; +import com.bsz.school_send_back_end.model.vo.BusinessVO; +import com.bsz.school_send_back_end.service.BusinessAuthService; +import com.bsz.school_send_back_end.service.BusinessLevelService; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.mapper.BusinessMapper; +import com.bsz.school_send_back_end.service.UserService; +import com.bsz.school_send_back_end.utils.RegexUtils; +import com.bsz.school_send_back_end.utils.SqlUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class BusinessServiceImpl extends ServiceImpl + implements BusinessService{ + + @Resource + private UserService userService; + + + @Resource + private BusinessAuthService businessAuthService; + + @Resource + private BusinessLevelService businessLevelService; + + @Resource + private BusinessMapper businessMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized void addBusiness(User user, Business business, BusinessAuth businessAuth) { + boolean save = userService.save(user); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建商家失败"); + + //商家绑定user + business.setUserId(user.getId()); + boolean save1 = this.save(business); + ThrowUtils.throwIf(!save1, ErrorCode.OPERATION_ERROR, "绑定id失败"); + //添加认证信息 + businessAuth.setBusinessId(business.getId()); + boolean save2 = businessAuthService.save(businessAuth); + ThrowUtils.throwIf(!save2, ErrorCode.OPERATION_ERROR, "商家认证信息失败"); + + businessLevelService.updateBusinessLevel(business.getId()); + + } + + @Override + public void validBusiness(Business business, boolean add) { + String businessName = business.getBusinessName(); + String businessAvatar = business.getBusinessAvatar(); + String businessPhone = business.getBusinessPhone(); + String address = business.getAddress(); + String startBusiness = business.getStartBusiness(); + String endBusiness = business.getEndBusiness(); + + //只在添加时严格校验 保证商家信息是全的 + if (add) { + if (StringUtils.isAnyBlank(businessName, businessAvatar, businessPhone, address, startBusiness, endBusiness)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "商家信息不全"); + } + } + + // 有参数可以校验参数 保证商家名字唯一 + if (StringUtils.isNotBlank(businessName)) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("businessName", businessName); + long count = this.count(queryWrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "门店名称重复"); + } + + //校验手机号格式 + if (StringUtils.isNotBlank(businessPhone)) { + boolean phoneInvalid = RegexUtils.isPhoneInvalid(businessPhone); + ThrowUtils.throwIf(phoneInvalid, ErrorCode.PARAMS_ERROR, "手机号格式错误"); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("businessPhone", businessPhone); + long count = this.count(queryWrapper); + ThrowUtils.throwIf(count > 0 , ErrorCode.OPERATION_ERROR, "手机号重复"); + } + } + + @Override + public void validBusinessAuth(BusinessAuth businessAuth, boolean add) { + //只在添加时严格校验 保证商家认证信息是全的 + if (add) { + String shopkeeper = businessAuth.getShopkeeper(); + String license = businessAuth.getLicense(); + String frontIdCard = businessAuth.getFrontIdCard(); + String backIdCard = businessAuth.getBackIdCard(); + String bankCard = businessAuth.getBankCard(); + if (StringUtils.isAnyBlank(shopkeeper, license, frontIdCard, bankCard, backIdCard)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "商家认证信息不全"); + } + } + } + + @Override + public QueryWrapper getQueryWrapper(BusinessQueryRequest businessQueryRequest) { + + if (businessQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + + Long id = businessQueryRequest.getId(); + Long userId = businessQueryRequest.getUserId(); + Long categoryId = businessQueryRequest.getCategoryId(); + Integer state = businessQueryRequest.getState(); + Integer storeStatus = businessQueryRequest.getStoreStatus(); + String businessName = businessQueryRequest.getBusinessName(); + String address = businessQueryRequest.getAddress(); + String businessProfile = businessQueryRequest.getBusinessProfile(); + String sortField = businessQueryRequest.getSortField(); + String sortOrder = businessQueryRequest.getSortOrder(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id); + queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId); + queryWrapper.eq(ObjectUtils.isNotEmpty(categoryId), "categoryId", categoryId); + queryWrapper.eq(ObjectUtils.isNotEmpty(state), "state", state); + queryWrapper.eq(ObjectUtils.isNotEmpty(storeStatus), "storeStatus", storeStatus); + queryWrapper.like(StringUtils.isNotBlank(businessName), "businessName", businessName); + queryWrapper.like(StringUtils.isNotBlank(address), "address", address); + queryWrapper.like(StringUtils.isNotBlank(businessProfile), "businessProfile", businessProfile); + queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + return queryWrapper; + } + + @Override + public BusinessVO getBusinessVO(Business business) { + BusinessVO businessVO = new BusinessVO(); + if (business == null) { + return null; + } + BeanUtils.copyProperties(business,businessVO); + BusinessLevel businessLevel = businessLevelService.getOne(Wrappers.lambdaQuery() + .eq(BusinessLevel::getBusinessId, business.getId())); + if (businessLevel == null) { + throw new BusinessException(ErrorCode.OPERATION_ERROR,"当前商家没有等级"); + } + Integer level = businessLevel.getLevel(); + businessVO.setLevel(level); + return businessVO; + } + + @Override + public List getBusinessVO(List businessList) { + if (CollectionUtils.isEmpty(businessList)) { + return new ArrayList<>(); + } + return businessList.stream().map(business -> { + BusinessVO businessVO = new BusinessVO(); + BeanUtils.copyProperties(business, businessVO); + BusinessLevel businessLevel = businessLevelService.getOne(Wrappers.lambdaQuery() + .eq(BusinessLevel::getBusinessId, business.getId())); + businessVO.setLevel(businessLevel.getLevel()); + return businessVO; + }).collect(Collectors.toList()); + } + + @Override + public Business getLoginBusiness(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userId",loginUser.getId()); + Business business = this.baseMapper.selectOne(queryWrapper); + ThrowUtils.throwIf(business == null,ErrorCode.NOT_FOUND_ERROR,"当前用户没有关联商家"); + return business; + } + + @Override + public List findAllBusiness() { + List businessLevels = businessLevelService.findAllOrdered(); + // 获取商家 ID 列表 + List businessIds = businessLevels.stream() + .map(BusinessLevel::getBusinessId) + .distinct() + .collect(Collectors.toList()); + List businesses = businessMapper.selectBatchIds(businessIds); + + //将商家等级信息映射到商家实体 + Map levelMap = businessLevels.stream() + .collect(Collectors.toMap(BusinessLevel::getBusinessId, BusinessLevel::getLevel)); + // Step 5: 构建 BusinessVO 并将等级添加到商家数据中 + List businessVOs = businesses.stream() + .map(business -> { + BusinessVO vo = new BusinessVO(); + BeanUtils.copyProperties(business, vo); // 自动复制 Business 到 BusinessVO + vo.setLevel(levelMap.getOrDefault(business.getId(), 1)); // 设置等级 + return vo; + }) + // Step 6: 按等级排序 + .sorted(Comparator.comparingLong(BusinessVO::getLevel).reversed()) // 按等级降序排序 + .collect(Collectors.toList()); + + return businessVOs; + } + + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessinfoServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessinfoServiceImpl.java new file mode 100644 index 0000000..64a46aa --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/BusinessinfoServiceImpl.java @@ -0,0 +1,41 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.mapper.BusinessinfoMapper; +import com.bsz.school_send_back_end.model.domain.Businessinfo; +import com.bsz.school_send_back_end.model.dto.businessinfo.InfoQueryRequest; +import com.bsz.school_send_back_end.service.BusinessinfoService; +import com.bsz.school_send_back_end.utils.SqlUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** +* @author xy +*/ +@Service +public class BusinessinfoServiceImpl extends ServiceImpl + implements BusinessinfoService { + + @Override + public QueryWrapper getQueryWrapper(InfoQueryRequest infoQueryRequest) { + Long businessId = infoQueryRequest.getBusinessId(); + Date createTime = infoQueryRequest.getCreateTime(); + String sortField = infoQueryRequest.getSortField(); + String sortOrder = infoQueryRequest.getSortOrder(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(ObjectUtils.isNotEmpty(businessId), "businessId", businessId); + queryWrapper.le(ObjectUtils.isNotEmpty(createTime), "createTime", createTime); + queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC ), sortField); + return queryWrapper; + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CartServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CartServiceImpl.java new file mode 100644 index 0000000..5d39ff6 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CartServiceImpl.java @@ -0,0 +1,161 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Cart; +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.cart.CartAddRequest; +import com.bsz.school_send_back_end.model.dto.cart.CartUpdateRequest; +import com.bsz.school_send_back_end.model.vo.CartVO; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.CartService; +import com.bsz.school_send_back_end.mapper.CartMapper; +import com.bsz.school_send_back_end.service.DishesService; +import com.bsz.school_send_back_end.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class CartServiceImpl extends ServiceImpl + implements CartService{ + + @Resource + private BusinessService businessService; + + @Resource + private DishesService dishesService; + + @Resource + private UserService userService; + + @Override + public void validCart(CartAddRequest cartAddRequest) { + if (cartAddRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Long businessId = cartAddRequest.getBusinessId(); + Long dishesId = cartAddRequest.getDishesId(); + Integer quantity = cartAddRequest.getQuantity(); + + if (quantity == null || quantity < 1) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR,"菜品数量错误"); + } + + Business business = businessService.getById(businessId); + if (business == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"不存在改商家"); + } + + Dishes dishes = dishesService.getById(dishesId); + if (dishes == null || dishes.getStatus().equals("下架")){ + throw new BusinessException(ErrorCode.PARAMS_ERROR,"不存在改菜品"); + } + } + + @Override + public Long addCart(CartAddRequest cartAddRequest, HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + Long businessId = cartAddRequest.getBusinessId(); + Long dishesId = cartAddRequest.getDishesId(); + //计算菜品价格 + Dishes dishes = dishesService.getById(dishesId); + BigDecimal price = new BigDecimal(String.valueOf(dishes.getDishesPrice())); + //保存购物车菜品 + Cart cart = new Cart(); + cart.setBusinessId(businessId); + cart.setUserId(userId); + cart.setPrice(price); + cart.setDishesId(dishesId); + boolean save = this.save(cart); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR); + + return cart.getId(); + } + + @Override + public Boolean updateCart(CartUpdateRequest cartUpdateRequest, HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + Long dishesId = cartUpdateRequest.getDishesId(); + String selectedOptions = cartUpdateRequest.getSelectedOptions(); + Long id = cartUpdateRequest.getId(); + ThrowUtils.throwIf(id == null,ErrorCode.OPERATION_ERROR,"购物车id不存在"); + //检验该购物车是否为登录用户的 + Cart cartId =this.getById(id); + Long cartUserId = cartId.getUserId(); + if (userId.equals(cartUserId)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"无法操作该购物车"); + } + Dishes dishes = dishesService.getById(dishesId); + BigDecimal price = new BigDecimal(String.valueOf(dishes.getDishesPrice())); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Cart::getId, id); + Cart cart = this.getOne(wrapper); + Integer quantity = cartUpdateRequest.getQuantity(); + if (cartUpdateRequest.getIsSelectedOptions()) { + cart.setQuantity(cart.getQuantity() + quantity); + } else { + cart.setQuantity(quantity); + } + cart.setPrice(price); + cart.setSubtotal(null); + cart.setSelectedOptions(selectedOptions); + + return this.updateById(cart); + } + + @Override + public Boolean deleteCart(Long cartId, HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + Cart cart = this.getById(cartId); + Long cartUserId = cart.getUserId(); + + if (!userId.equals(cartUserId)) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "该用户无权删除该购物车"); + } + boolean remove = this.removeById(cartId); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR); + + return true; + } + + @Override + public List getCartVOList(List cartList) { + if (CollectionUtils.isEmpty(cartList)) { + return new ArrayList<>(); + } + + return cartList.stream().map(item ->{ + CartVO cartVO = new CartVO(); + BeanUtils.copyProperties(item, cartVO); + Business business = businessService.getById(item.getBusinessId()); + Dishes dishes = dishesService.getById(item.getDishesId()); + cartVO.setBusiness(business); + cartVO.setDishes(dishes); + return cartVO; + }).collect(Collectors.toList()); + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CategoryServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..e3fc00a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CategoryServiceImpl.java @@ -0,0 +1,46 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Category; +import com.bsz.school_send_back_end.service.CategoryService; +import com.bsz.school_send_back_end.mapper.CategoryMapper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; + +/** +* @author xy +*/ +@Service +public class CategoryServiceImpl extends ServiceImpl + implements CategoryService{ + + @Resource + private CategoryMapper categoryMapper; + + @Override + public void validCategory(Category category, boolean add) { + String name = category.getName(); + String image = category.getImage(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Category::getName, name); + if (add) { + ThrowUtils.throwIf(name == null, ErrorCode.PARAMS_ERROR, "请传入名称!"); + } + + if (StringUtils.isAnyBlank(image)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"请传入图片"); + } + Long count = categoryMapper.selectCount(wrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.PARAMS_ERROR, "名称重复"); + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CollectServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CollectServiceImpl.java new file mode 100644 index 0000000..db8993d --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/CollectServiceImpl.java @@ -0,0 +1,82 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Collect; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.collect.CollectAddRequest; +import com.bsz.school_send_back_end.model.vo.CollectVO; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.CollectService; +import com.bsz.school_send_back_end.mapper.CollectMapper; +import com.bsz.school_send_back_end.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class CollectServiceImpl extends ServiceImpl + implements CollectService{ + + @Resource + private UserService userService; + + @Resource + private BusinessService businessService; + @Override + public void validCollect(CollectAddRequest collectAddRequest) { + Long businessId = collectAddRequest.getBusinessId(); + ThrowUtils.throwIf(businessId == null, ErrorCode.PARAMS_ERROR, "参数不全"); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Business::getId, businessId); + long count = businessService.count(wrapper); + ThrowUtils.throwIf(count != 1, ErrorCode.PARAMS_ERROR, "填写的商家id不存在"); + } + + @Override + public Boolean addCollect(Collect collect, HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long loginUserId = loginUser.getId(); + Long businessId = collect.getBusinessId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Collect::getBusinessId, businessId); + wrapper.eq(Collect::getUserId, loginUserId); + long count = this.count(wrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.OPERATION_ERROR, "该商家已收藏"); + collect.setUserId(loginUserId); + return this.save(collect); + } + + @Override + public List getCollectList(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long loginUserId = loginUser.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Collect::getUserId, loginUserId); + List collectList = this.list(wrapper); + + return collectList.stream().map(item -> { + CollectVO collectVO = new CollectVO(); + BeanUtils.copyProperties(item, collectVO); + Business business = businessService.getOne(Wrappers.lambdaQuery() + .eq(Business::getId, item.getBusinessId())); + collectVO.setBusiness(business); + return collectVO; + }).collect(Collectors.toList()); + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/DishesGroupServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/DishesGroupServiceImpl.java new file mode 100644 index 0000000..fca9118 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/DishesGroupServiceImpl.java @@ -0,0 +1,137 @@ +package com.bsz.school_send_back_end.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.DishesGroupMapper; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.DishesGroup; +import com.bsz.school_send_back_end.model.vo.DishesGroupVO; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.DishesGroupService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +* +*/ +@Service +public class DishesGroupServiceImpl extends ServiceImpl + implements DishesGroupService { + + @Resource + private BusinessService businessService; + + @Override + public void validDishesGroup(DishesGroup dishesGroup, boolean update) { + if (dishesGroup == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + String groupName = dishesGroup.getGroupName(); + Integer isTopping = dishesGroup.getIsTopping(); + Long dishesGroupId = dishesGroup.getId(); + + if (update) { + if (dishesGroupId == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"未填写分组id"); + } + } + + if (isTopping == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"请选择是否置顶"); + } + + if (StringUtils.isBlank(groupName)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"未填写分组名称"); + } + } + + @Override + public Boolean addDishesGroup(DishesGroup dishesGroup, HttpServletRequest request) { + String groupName = dishesGroup.getGroupName(); + Integer isTopping = dishesGroup.getIsTopping(); + + //获取商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + dishesGroup.setBusinessId(businessId); + + //判断更新的分组是否置顶,并将组内数据更改为非置顶 + changeTopping(businessId,isTopping); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("businessId",businessId); + queryWrapper.eq("groupName",groupName); + long count = this.count(queryWrapper); + if (count > 0) { + throw new BusinessException(ErrorCode.OPERATION_ERROR,"存在相同的分组"); + } + + return this.save(dishesGroup); + } + + + + @Override + public List getDishGroupVOList(List dishesGroupList) { + if (CollectionUtils.isEmpty(dishesGroupList)) { + return new ArrayList<>(); + } + + return dishesGroupList.stream().map(item -> { + DishesGroupVO dishesGroupVO = new DishesGroupVO(); + BeanUtils.copyProperties(item, dishesGroupVO); + return dishesGroupVO; + }).collect(Collectors.toList()); + } + + @Override + public Boolean updateDishesGroupById(DishesGroup dishesGroup, HttpServletRequest request) { + //获取当前商家id + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + Long dishesGroupId = dishesGroup.getId(); + String groupName = dishesGroup.getGroupName(); + Integer isTopping = dishesGroup.getIsTopping(); + //判断更新的分组是否置顶,并将组内数据更改为非置顶 + changeTopping(businessId,isTopping); + //更新分组信息 + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("id",dishesGroupId); + wrapper.eq("businessId",businessId); + wrapper.set("groupName",groupName); + wrapper.set("isTopping",isTopping); + return this.update(wrapper); + } + + + private void changeTopping(Long businessId, Integer isTopping) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("businessId",businessId); + List list = this.list(); + + if (isTopping == 1 && list.size() > 0) { + List collect = list.stream().peek(item -> { + item.setIsTopping(0); + }).collect(Collectors.toList()); + boolean updateTopping = this.updateBatchById(collect); + ThrowUtils.throwIf(!updateTopping,ErrorCode.OPERATION_ERROR); + } + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/DishesServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/DishesServiceImpl.java new file mode 100644 index 0000000..06989a7 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/DishesServiceImpl.java @@ -0,0 +1,167 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.DishesMapper; +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.domain.SpecificationsDishes; +import com.bsz.school_send_back_end.model.dto.Dishes.DishesQueryRequest; +import com.bsz.school_send_back_end.model.vo.DishesVO; +import com.bsz.school_send_back_end.service.DishesService; +import com.bsz.school_send_back_end.service.SpecificationsDishesService; +import com.bsz.school_send_back_end.utils.SqlUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import jakarta.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class DishesServiceImpl extends ServiceImpl + implements DishesService { + + @Resource + private SpecificationsDishesService specificationsDishesService; + + @Override + public void removeByDishesGroupId(Long dishesGroupId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("dishesGroupId",dishesGroupId); + List list = this.list(queryWrapper); + //判断该分组是否有菜品 + if (list.isEmpty()) { + return; + } + boolean remove = this.remove(queryWrapper); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR); + //删除中间表数据 + for (Dishes dishes : list) { + Long dishesId = dishes.getId(); + specificationsDishesService.deleteByDishesId(dishesId); + } + } + + @Override + public void validDishes(Dishes dishes, Boolean update) { + Long id = dishes.getId(); + Long dishesGroupId = dishes.getDishesGroupId(); + String dishesName = dishes.getDishesName(); + Double dishesPrice = dishes.getDishesPrice(); + String status = dishes.getStatus(); + Integer inventoryStatus = dishes.getInventoryStatus(); + + if (update) { + if (id == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + } + + if (StringUtils.isAnyBlank(dishesName,status)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + if (dishesGroupId == null || dishesPrice == null || inventoryStatus == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + } + + @Override + public Long addDishes(Dishes dishes) { + //判断菜品是否存在 + validDishesName(dishes); + //保存代码 + boolean save = this.save(dishes); + ThrowUtils.throwIf(!save,ErrorCode.OPERATION_ERROR); + return dishes.getId(); + } + + @Override + public Boolean updateDishes(Dishes dishes) { + //判断菜品是否存在 + validDishesName(dishes); + //更新菜品 + return this.updateById(dishes); + } + + @Override + public List getDishesVOList(List dishesList) { + if (CollectionUtils.isEmpty(dishesList)) { + return new ArrayList<>(); + } + return dishesList.stream().map(item->{ + long count = getCount(item); + DishesVO dishesVO = new DishesVO(); + BeanUtils.copyProperties(item,dishesVO); + if (count > 0) { + dishesVO.setIsSpecification(1); + } + return dishesVO; + }).collect(Collectors.toList()); + } + + @Override + public DishesVO getDishesVO(Dishes dishes) { + if (dishes == null) { + return null; + } + long count = getCount(dishes); + DishesVO dishesVO = new DishesVO(); + BeanUtils.copyProperties(dishes, dishesVO); + if (count > 0) { + dishesVO.setIsSpecification(1); + } + return dishesVO; + } + + @Override + public QueryWrapper getWrapper(DishesQueryRequest dishesQueryRequest) { + Long businessId = dishesQueryRequest.getBusinessId(); + Long dishesGroupId = dishesQueryRequest.getDishesGroupId(); + String status = dishesQueryRequest.getStatus(); + String dishesName = dishesQueryRequest.getDishesName(); + String sortField = dishesQueryRequest.getSortField(); + String sortOrder = dishesQueryRequest.getSortOrder(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(businessId != null, "businessId", businessId); + wrapper.eq(dishesGroupId != null, "dishesGroupId", dishesGroupId); + wrapper.eq(StringUtils.isNotBlank(status), "status", status); + wrapper.like(StringUtils.isNotBlank(dishesName), "dishesName", dishesName); + wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), sortField); + return wrapper; + } + + private void validDishesName(Dishes dishes) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("dishesName",dishes.getDishesName()); + queryWrapper.eq("businessId",dishes.getBusinessId()); + long count = this.count(queryWrapper); + if (dishes.getId() == null) { + ThrowUtils.throwIf(count > 0,ErrorCode.PARAMS_ERROR,"已存在该菜品"); + } + else { + ThrowUtils.throwIf(count > 1,ErrorCode.PARAMS_ERROR,"已存在该菜品"); + } + } + + private long getCount(Dishes dishes) { + Long dishesId = dishes.getId(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("dishesId",dishesId); + return specificationsDishesService.count(queryWrapper); + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandAuthServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandAuthServiceImpl.java new file mode 100644 index 0000000..bb23914 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandAuthServiceImpl.java @@ -0,0 +1,88 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.ErrandAuth; +import com.bsz.school_send_back_end.model.dto.errandAtuh.ErrandAuthQueryRequest; +import com.bsz.school_send_back_end.service.ErrandAuthService; +import com.bsz.school_send_back_end.mapper.ErrandAuthMapper; +import com.bsz.school_send_back_end.utils.SqlUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class ErrandAuthServiceImpl extends ServiceImpl + implements ErrandAuthService{ + + @Override + public void validErrandAuth(ErrandAuth errandAuth, boolean add) { + Long errandId = errandAuth.getErrandId(); + String bankCard = errandAuth.getBankCard(); + String frontIdCard = errandAuth.getFrontIdCard(); + String backIdCard = errandAuth.getBackIdCard(); + if (add) { + if (StringUtils.isAnyBlank(backIdCard,frontIdCard,bankCard)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "信息不全"); + } + } + else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandAuth::getErrandId, errandId); + long count = this.count(queryWrapper); + ThrowUtils.throwIf(count == 0, ErrorCode.PARAMS_ERROR, "该用户未关联跑腿"); + } + } + + @Override + public LambdaUpdateWrapper getUpdateWrapper(ErrandAuth errandAuth) { + Long errandId = errandAuth.getErrandId(); + String bankCard = errandAuth.getBankCard(); + String backIdCard = errandAuth.getBackIdCard(); + String frontIdCard = errandAuth.getFrontIdCard(); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(StringUtils.isNotBlank(bankCard), ErrandAuth::getBankCard, bankCard); + updateWrapper.set(StringUtils.isNotBlank(backIdCard), ErrandAuth::getBackIdCard, backIdCard); + updateWrapper.set(StringUtils.isNotBlank(frontIdCard), ErrandAuth::getFrontIdCard, frontIdCard); + updateWrapper.eq(ErrandAuth::getErrandId, errandId); + return updateWrapper; + } + + @Override + public QueryWrapper getQueryWrapper(ErrandAuthQueryRequest errandAuthQueryRequest) { + Long id = errandAuthQueryRequest.getId(); + Long errandId = errandAuthQueryRequest.getErrandId(); + String sortField = errandAuthQueryRequest.getSortField(); + String sortOrder = errandAuthQueryRequest.getSortOrder(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(ObjectUtils.isNotEmpty(id), "id", id); + wrapper.eq(ObjectUtils.isNotEmpty(errandId), "errandId", errandId); + wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + + return wrapper; + } + + @Override + public ErrandAuth getErrandAuth(Long errandId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandAuth::getErrandId, errandId); + ErrandAuth errandAuth = this.getOne(queryWrapper); + ThrowUtils.throwIf(errandAuth == null, ErrorCode.PARAMS_ERROR, "当前跑腿id没有认证"); + + return errandAuth; + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandBillServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandBillServiceImpl.java new file mode 100644 index 0000000..82c6e98 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandBillServiceImpl.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.model.domain.ErrandBill; +import com.bsz.school_send_back_end.service.ErrandBillService; +import com.bsz.school_send_back_end.mapper.ErrandBillMapper; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class ErrandBillServiceImpl extends ServiceImpl + implements ErrandBillService{ + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandIncomeServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandIncomeServiceImpl.java new file mode 100644 index 0000000..4681f90 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandIncomeServiceImpl.java @@ -0,0 +1,88 @@ +package com.bsz.school_send_back_end.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.ErrandIncome; +import com.bsz.school_send_back_end.model.domain.Orders; +import com.bsz.school_send_back_end.model.dto.erradnIncome.ErrandIncomeQueryRequest; +import com.bsz.school_send_back_end.service.ErrandIncomeService; +import com.bsz.school_send_back_end.mapper.ErrandIncomeMapper; +import com.bsz.school_send_back_end.utils.SqlUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +/** +* @author xy +*/ +@Service +public class ErrandIncomeServiceImpl extends ServiceImpl + implements ErrandIncomeService{ + + @Override + @Transactional(rollbackFor = Exception.class) + public void addErrandIncome(Orders orders) { + String location = orders.getLocation(); + Long errandId = orders.getErrandId(); + Long ordersId = orders.getId(); + ErrandIncome errandIncome = new ErrandIncome(); + errandIncome.setErrandId(errandId); + errandIncome.setOrderId(ordersId); + errandIncome.setIncome(UserConstant.DELIVERY_FEE_MAP.get(location)); + boolean save = this.save(errandIncome); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "添加配送费失败"); + } + + + @Override + public QueryWrapper getWrapper(ErrandIncomeQueryRequest queryRequest) { + Long id = queryRequest.getId(); + Long orderId = queryRequest.getOrderId(); + Long errandId = queryRequest.getErrandId(); + Integer state = queryRequest.getState(); + String sortField = queryRequest.getSortField(); + String sortOrder = queryRequest.getSortOrder(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq(ObjectUtils.isNotEmpty(id),"id", id); + wrapper.eq(ObjectUtils.isNotEmpty(orderId), "orderId", orderId); + wrapper.eq(ObjectUtils.isNotEmpty(errandId), "errandId",errandId); + wrapper.eq(ObjectUtils.isNotEmpty(state), "state", state); + wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + + return wrapper; + } + + @Override + public LambdaQueryWrapper getQueryWrapper(Long errandId) { + + // 获取当前日期的开始和结束时间 + LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); + LocalDateTime endOfDay = LocalDate.now().atTime(23, 59, 59, 999999999); + + // 转换为 Date 对象 + Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()); + Date endDate = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ErrandIncome::getErrandId, errandId); + queryWrapper.ge(ErrandIncome::getCreateTime, startDate); // 大于等于当天的 00:00:00 + queryWrapper.le(ErrandIncome::getCreateTime, endDate); // 小于等于当天的 23:59:59 + return queryWrapper; + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandLevelServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandLevelServiceImpl.java new file mode 100644 index 0000000..6ce80ca --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandLevelServiceImpl.java @@ -0,0 +1,72 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.mapper.UserRatingMapper; +import com.bsz.school_send_back_end.model.domain.ErrandLevel; +import com.bsz.school_send_back_end.service.ErrandLevelService; +import com.bsz.school_send_back_end.mapper.ErrandLevelMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.math.BigDecimal; + +/** +* @author xy +*/ +@Service +@Slf4j +public class ErrandLevelServiceImpl extends ServiceImpl + implements ErrandLevelService{ + + @Resource + private ErrandLevelMapper errandLevelMapper; + + @Resource + private UserRatingMapper userRatingMapper; + + @Override + public void updateErrandLevel(Long errandId) { + Double avg = userRatingMapper.findAvgByRatedEntityId(errandId); + if (avg == null) { + avg = UserConstant.DEFAULT_AVG_SCORE; + log.info("warn: avg没有值,将赋初始值1:" + avg); + log.info("当前跑腿id:" + errandId); + } + int level = calculateLevel(avg); + ErrandLevel errandLevel = errandLevelMapper.selectOne(Wrappers.lambdaQuery() + .eq(ErrandLevel::getErrandId, errandId)); + + if (errandLevel == null) { + errandLevel = new ErrandLevel(); + errandLevel.setErrandId(errandId); + errandLevel.setLevel(UserConstant.DEFAULT_LEVEL); + errandLevel.setAverageScore(BigDecimal.valueOf(1)); + + } + errandLevel.setAverageScore(BigDecimal.valueOf(avg)); + errandLevel.setLevel(level); + + this.saveOrUpdate(errandLevel); + } + + private int calculateLevel(Double averageScore) { + if (averageScore >= 4.5) { + return 5; + } else if (averageScore >= 4.0) { + return 4; + } else if (averageScore >= 3.0) { + return 3; + } else if (averageScore >= 2.0) { + return 2; + } else { + return 1; + } + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandOrderServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandOrderServiceImpl.java new file mode 100644 index 0000000..9e18205 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandOrderServiceImpl.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.model.domain.ErrandOrder; +import com.bsz.school_send_back_end.service.ErrandOrderService; +import com.bsz.school_send_back_end.mapper.ErrandOrderMapper; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class ErrandOrderServiceImpl extends ServiceImpl + implements ErrandOrderService{ + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandServiceImpl.java new file mode 100644 index 0000000..6066667 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/ErrandServiceImpl.java @@ -0,0 +1,284 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.*; +import com.bsz.school_send_back_end.model.dto.errand.ErrandQueryRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandStateRequest; +import com.bsz.school_send_back_end.model.dto.errand.ErrandUpdateRequest; +import com.bsz.school_send_back_end.model.vo.ErrandVO; +import com.bsz.school_send_back_end.service.*; +import com.bsz.school_send_back_end.mapper.ErrandMapper; +import com.bsz.school_send_back_end.utils.RegexUtils; +import com.bsz.school_send_back_end.utils.SqlUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** +* @author xy +*/ +@Service +@Slf4j +public class ErrandServiceImpl extends ServiceImpl + implements ErrandService{ + + @Resource + private UserService userService; + + @Resource + private ErrandAuthService errandAuthService; + + @Resource + private OrdersService ordersService; + + @Resource + private ErrandIncomeService errandIncomeService; + + @Resource + private WebsocketService websocketService; + + @Resource + private ErrandLevelService errandLevelService; + + @Resource + private ErrandOrderService errandOrderService; + + @Resource + private OrderImageService orderImageService; + + @Override + public void validErrand(Errand errand, boolean add) { + String errandName = errand.getErrandName(); + Integer gender = errand.getGender(); + String distributionScope = errand.getDistributionScope(); + Long userId = errand.getUserId(); + String phone = errand.getErrandPhone(); + if (add) { + if (StringUtils.isAnyBlank(errandName, phone) || ObjectUtils.isEmpty(gender) || ObjectUtils.isEmpty(distributionScope)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "信息不全"); + } + } + //校验手机号 + if (StringUtils.isNotBlank(phone)) { + boolean phoneInvalid = RegexUtils.isPhoneInvalid(phone); + ThrowUtils.throwIf(phoneInvalid, ErrorCode.PARAMS_ERROR, "手机格式不正确"); + } + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getPhone, phone); + long count1 = userService.count(wrapper); + ThrowUtils.throwIf(count1 > 0, ErrorCode.PARAMS_ERROR, "当前手机号已被使用过"); + //校验跑腿名 + if (StringUtils.isNotBlank(errandName)) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Errand::getUserId, userId); + long count = this.count(queryWrapper); + ThrowUtils.throwIf(count > 0, ErrorCode.PARAMS_ERROR, "跑腿名字重复"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized void addErrand(User user, Errand errand) { + boolean save = userService.save(user); + ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR,"用户添加失败"); + errand.setUserId(user.getId()); + boolean save1 = this.save(errand); + ThrowUtils.throwIf(!save1, ErrorCode.SYSTEM_ERROR,"跑腿添加失败"); + + errandLevelService.updateErrandLevel(errand.getId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized void deleteErrand(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Errand::getUserId, userId); + Errand errand = this.getOne(queryWrapper); + ThrowUtils.throwIf(errand == null, ErrorCode.NOT_FOUND_ERROR, "该用户没有关联跑腿"); + Long errandId = errand.getId(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ErrandAuth::getErrandId, errandId); + ErrandAuth errandAuth = errandAuthService.getOne(wrapper); + if (errandAuth != null){ + boolean remove2 = errandAuthService.removeById(errandAuth.getId()); + ThrowUtils.throwIf(!remove2, ErrorCode.SYSTEM_ERROR, "删除跑腿认证失败"); + } + boolean remove = userService.removeById(userId); + boolean remove1 = this.removeById(errandId); + ThrowUtils.throwIf(!remove || !remove1, ErrorCode.SYSTEM_ERROR, "删除用户或跑腿失败"); + } + + @Override + public Errand getLoginErrand(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Errand::getUserId, userId); + Errand errand = this.getOne(queryWrapper); + ThrowUtils.throwIf(errand == null, ErrorCode.NOT_FOUND_ERROR, "当前用户没有关联跑腿"); + + return errand; + } + + @Override + public QueryWrapper getQueryWrapper(ErrandQueryRequest queryRequest) { + Long id = queryRequest.getId(); + String errandName = queryRequest.getErrandName(); + Integer gender = queryRequest.getGender(); + String errandPhone = queryRequest.getErrandPhone(); + String distributionScope = queryRequest.getDistributionScope(); + Integer state = queryRequest.getState(); + String sortOrder = queryRequest.getSortOrder(); + String sortField = queryRequest.getSortField(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(ObjectUtils.isNotEmpty(id),"id", id); + queryWrapper.eq(StringUtils.isNotBlank(errandName), "errandName",errandName); + queryWrapper.eq(ObjectUtils.isNotEmpty(gender), "gender", gender); + queryWrapper.eq(StringUtils.isNotBlank(errandPhone), "errandPhone", errandPhone); + queryWrapper.eq(StringUtils.isNotBlank(distributionScope), "distributionScope", distributionScope); + queryWrapper.eq(ObjectUtils.isNotEmpty(state), "state", state); + queryWrapper.orderBy(SqlUtils.validSortField(sortField),sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + + return queryWrapper; + } + + @Override + public void orderToErrand(ErrandStateRequest errandStateRequest, HttpServletRequest request) { + Long ordersId = errandStateRequest.getOrderId(); + Integer errandsState = errandStateRequest.getErrandsState(); + String imageAddress = errandStateRequest.getImageAddress(); + Errand loginErrand = this.getLoginErrand(request); + Long loginErrandId = loginErrand.getId(); + Orders orders = ordersService.getOrderWithPessimisticLock(ordersId); + ThrowUtils.throwIf(orders == null, ErrorCode.PARAMS_ERROR, "订单不存在"); + Long errandId = orders.getErrandId(); + ThrowUtils.throwIf(!Objects.equals(loginErrandId, errandId), ErrorCode.PARAMS_ERROR, "当前订单不属于该跑腿"); + + ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, ordersId)); + + if (errandsState == 5) { + orders.setErrandId(null); + errandOrder.setErrandState(errandsState);//再次抢单 + errandOrder.setErrandId(null); + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "取消订单失败"); + log.info("跑腿取消接单,订单ID: {}", ordersId); + websocketService.sendOrderToErrand(orders); + }else if (errandsState == 3) { + ThrowUtils.throwIf(orders.getState() != 4, ErrorCode.OPERATION_ERROR, "当前商家未出餐"); //商家未出餐,不允许取货 + errandOrder.setErrandState(errandsState);// 已取餐 + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "取餐失败"); + log.info("订单已取餐,订单id:" + ordersId); + } else if (errandsState == 4) { + ThrowUtils.throwIf(errandOrder.getErrandState() != 3, ErrorCode.OPERATION_ERROR, "商家未取货"); + errandOrder.setErrandState(errandsState);// 订单已送达 + boolean update = ordersService.updateById(orders); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "订单送达失败"); + + if (imageAddress == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请先上传图片"); + } + OrderImage orderImage = new OrderImage(); + orderImage.setOrderId(ordersId); + orderImage.setImageAddress(imageAddress); + orderImageService.save(orderImage); + log.info("订单已送达,订单id:" + ordersId); + errandIncomeService.addErrandIncome(orders); + this.updateTotal(loginErrand, false); + } + + boolean update = errandOrderService.updateById(errandOrder); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "更新跑腿关联失败"); + } + + @Override + public Boolean updateErrand(ErrandUpdateRequest updateRequest) { + Long id = updateRequest.getId(); + String errandName = updateRequest.getErrandName(); + String errandPhone = updateRequest.getErrandPhone(); + String distributionScope = updateRequest.getDistributionScope(); + Integer gender = updateRequest.getGender(); + Integer state = updateRequest.getState(); + + Errand errand = this.getOne(Wrappers.lambdaQuery().eq(Errand::getId, id)); + ThrowUtils.throwIf(errand == null, ErrorCode.PARAMS_ERROR, "当前跑腿id不正确"); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Errand::getId, id); + updateWrapper.set(StringUtils.isNotBlank(errandName), Errand::getErrandName, errandName); + updateWrapper.set(StringUtils.isNotBlank(errandPhone), Errand::getErrandPhone, errandPhone); + updateWrapper.set(StringUtils.isNotBlank(distributionScope), Errand::getDistributionScope, distributionScope); + updateWrapper.set(ObjectUtils.isNotEmpty(gender), Errand::getGender, gender); + updateWrapper.set(ObjectUtils.isNotEmpty(state), Errand::getState, state); + boolean update = this.update(updateWrapper); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "更新跑腿失败"); + + Long userId = errand.getUserId(); + User user = userService.getById(userId); + if (StringUtils.isNotBlank(errand.getErrandPhone())) { + user.setPhone(errand.getErrandPhone()); + } + if ((StringUtils.isNotBlank(errand.getErrandName()))) { + user.setUsername(errand.getErrandName()); + } + + return true; + } + + @Override + public void updateTotal(Errand errand, boolean add) { + Integer totalOrders = errand.getTotalOrders(); + Integer maxOrders = errand.getMaxOrders(); + + if (add) { + if (totalOrders >= maxOrders) { + throw new BusinessException(ErrorCode.FORBIDDEN_ERROR, "跑腿员已达到最大接单量,无法接单"); + } + errand.setTotalOrders(totalOrders + 1); + } else { + errand.setTotalOrders(totalOrders - 1); + } + boolean update = this.updateById(errand); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "更新跑腿订单量失败"); + } + + @Override + public ErrandVO getErrandVO(Errand errand) { + + if (errand == null) { + return null; + } + ErrandVO errandVO = new ErrandVO(); + BeanUtils.copyProperties(errand, errandVO); + ErrandLevel level = errandLevelService.getOne(Wrappers.lambdaQuery() + .eq(ErrandLevel::getErrandId, errand.getId())); + errandVO.setLevel(level.getLevel()); + + return errandVO; + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderDetailsServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderDetailsServiceImpl.java new file mode 100644 index 0000000..bf6b649 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderDetailsServiceImpl.java @@ -0,0 +1,80 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.OrderDetailsMapper; +import com.bsz.school_send_back_end.model.domain.Dishes; +import com.bsz.school_send_back_end.model.domain.OrderDetails; +import com.bsz.school_send_back_end.model.vo.DishesVO; +import com.bsz.school_send_back_end.model.vo.OrderDetailsVO; +import com.bsz.school_send_back_end.service.DishesService; +import com.bsz.school_send_back_end.service.OrderDetailsService; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author xy + */ +@Service +public class OrderDetailsServiceImpl extends ServiceImpl + implements OrderDetailsService { + + @Resource + private DishesService dishesService; + + @Override + public void validOrderDetail(OrderDetails orderDetails) { + Long dishesId = orderDetails.getDishesId(); + Integer quantity = orderDetails.getQuantity(); + BigDecimal price = orderDetails.getPrice(); + // 校验菜品是否存在 + Dishes dishes = dishesService.getById(dishesId); + ThrowUtils.throwIf(dishes == null, ErrorCode.NOT_FOUND_ERROR, "菜品不存在"); + // 有参数则校验 + if (ObjectUtils.allNotNull(dishesId, quantity, price)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "菜品错误"); + } + } + + @Override + public OrderDetailsVO getOrderDetailsVO(OrderDetails orderDetails) { + if (orderDetails == null) { + return null; + } + OrderDetailsVO orderDetailsVO = new OrderDetailsVO(); + BeanUtils.copyProperties(orderDetails, orderDetailsVO); + // 关联查询菜品信息 + Long dishesId = orderDetails.getDishesId(); + Dishes dishes = null; + if (dishesId != null && dishesId > 0) { + dishes = dishesService.getById(dishesId); + } + DishesVO dishesVO = dishesService.getDishesVO(dishes); + orderDetailsVO.setDishesVO(dishesVO); + return orderDetailsVO; + } + + @Override + public List getOrderDetailsVO(List orderDetailsList) { + if (CollectionUtils.isEmpty(orderDetailsList)) { + return new ArrayList<>(); + } + return orderDetailsList.stream().map(this::getOrderDetailsVO).collect(Collectors.toList()); + } + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderImageServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderImageServiceImpl.java new file mode 100644 index 0000000..bd3fb47 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderImageServiceImpl.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.model.domain.OrderImage; +import com.bsz.school_send_back_end.service.OrderImageService; +import com.bsz.school_send_back_end.mapper.OrderImageMapper; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class OrderImageServiceImpl extends ServiceImpl + implements OrderImageService{ + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderRefundsServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderRefundsServiceImpl.java new file mode 100644 index 0000000..f5d4214 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrderRefundsServiceImpl.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.mapper.OrderRefundsMapper; +import com.bsz.school_send_back_end.model.domain.OrderRefunds; +import com.bsz.school_send_back_end.service.OrderRefundsService; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class OrderRefundsServiceImpl extends ServiceImpl + implements OrderRefundsService{ + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrdersServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrdersServiceImpl.java new file mode 100644 index 0000000..da24613 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OrdersServiceImpl.java @@ -0,0 +1,507 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.OrdersMapper; +import com.bsz.school_send_back_end.model.domain.*; +import com.bsz.school_send_back_end.model.dto.order.OrderQueryRequest; +import com.bsz.school_send_back_end.model.dto.order.OrderUpdateRequest; +import com.bsz.school_send_back_end.model.vo.*; +import com.bsz.school_send_back_end.service.*; +import com.bsz.school_send_back_end.utils.RegexUtils; +import com.bsz.school_send_back_end.utils.SqlUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static com.bsz.school_send_back_end.contant.UserConstant.DELIVERY_FEE_MAP; + +/** + * @author xy + */ +@Service +@Slf4j +public class OrdersServiceImpl extends ServiceImpl + implements OrdersService { + + @Resource + private BusinessService businessService; + + @Resource + private OrderDetailsService orderDetailsService; + + @Resource + private UserService userService; + + @Resource + private DishesService dishesService; + + @Resource + private ErrandOrderService errandOrderService; + + @Resource + private OrderImageService orderImageService; + + + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized long addOrder(Orders orders, List orderDetailsList) { + boolean saveOrder = this.save(orders); + if (!saveOrder) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "创建订单失败,数据库错误"); + } + // 创建订单菜品 + for (OrderDetails orderDetails : orderDetailsList) { + // 绑定订单和订单详情 + orderDetails.setOrderId(orders.getId()); + boolean saveDetail = orderDetailsService.save(orderDetails); + if (!saveDetail) { + log.error("创建订单菜品失败,订单id:" + orders.getId()); + throw new BusinessException(ErrorCode.OPERATION_ERROR, "订单菜品创建失败"); + } + } + return orders.getId(); + } + + @Override + public void validOrder(Orders orders) { + String userName = orders.getUserName(); + String phone = orders.getPhone(); + Long userId = orders.getUserId(); + Long businessId = orders.getBusinessId(); + BigDecimal totalPrice = orders.getTotalPrice(); + Integer pickupMethod = orders.getPickupMethod(); + Integer payMethod = orders.getPayMethod(); + if (StringUtils.isAnyBlank(userName, phone)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + if (StringUtils.isNotBlank(phone) && RegexUtils.isPhoneInvalid(phone)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "手机号格式错误"); + } + if (ObjectUtils.isEmpty(totalPrice) || totalPrice.floatValue() <= 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "价格错误"); + } + if (ObjectUtils.anyNull(userId, businessId, payMethod, pickupMethod)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数不全"); + } + } + + @Override + public OrdersVO getOrdersVO(Orders orders) { + if (orders == null) { + return null; + } + OrdersVO ordersVO = new OrdersVO(); + BeanUtils.copyProperties(orders, ordersVO); + // 关联查询商家信息 + Long businessId = orders.getBusinessId(); + Business business = this.getBusiness(businessId); + BusinessVO businessVO = businessService.getBusinessVO(business); + ordersVO.setBusinessVO(businessVO); + // 关联查询订单详情信息 + Long orderId = orders.getId(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("orderId", orderId); + List orderDetailsList = orderDetailsService.list(queryWrapper); + List orderDetailsVOList = orderDetailsService.getOrderDetailsVO(orderDetailsList); + ordersVO.setOrderDetailsVOList(orderDetailsVOList); + // 关联查询评价状态 + + // 设置商品数量 + Integer number = 0; + for (OrderDetailsVO detailsVO : orderDetailsVOList) { + number += detailsVO.getQuantity(); + } + String address = business.getAddress(); + ordersVO.setAddress(address); + ordersVO.setNumber(number); + + ErrandOrder one = errandOrderService.getOne(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, orderId)); + if (one != null) { + ordersVO.setPickupEndTime(one.getEndTime()); + ordersVO.setPickupStartTime(one.getStartTime()); + } + + OrderImage image = orderImageService.getOne(Wrappers.lambdaQuery() + .eq(OrderImage::getOrderId, orderId)); + if (image != null) { + ordersVO.setImageAddress(image.getImageAddress()); + } + return ordersVO; + } + + @Override + public List getOrdersVO(List ordersList) { + if (CollectionUtils.isEmpty(ordersList)) { + return new ArrayList<>(); + } +// return ordersList.stream().map(this::getOrdersVO).collect(Collectors.toList()); + return ordersList.stream().map(orders ->{ + OrdersVO ordersVO = this.getOrdersVO(orders); + Business business = this.getBusiness(orders.getBusinessId()); + ordersVO.setAddress(business.getAddress()); + return ordersVO; + }).collect(Collectors.toList()); + } + + @Override + public QueryWrapper getQueryWrapper(OrderQueryRequest orderQueryRequest) { + if (orderQueryRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + Long id = orderQueryRequest.getId(); + Long userId = orderQueryRequest.getUserId(); + Long businessId = orderQueryRequest.getBusinessId(); + Long errandId = orderQueryRequest.getErrandId(); + String pickupCode = orderQueryRequest.getPickupCode(); + Integer pickupMethod = orderQueryRequest.getPickupMethod(); + Integer state = orderQueryRequest.getState(); + String startTime = orderQueryRequest.getStartTime(); + String endTime = orderQueryRequest.getEndTime(); + String sortField = orderQueryRequest.getSortField(); + String sortOrder = orderQueryRequest.getSortOrder(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.like(ObjectUtils.isNotEmpty(id), "id", id); + queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId); + queryWrapper.eq(ObjectUtils.isNotEmpty(businessId), "businessId", businessId); + queryWrapper.eq(ObjectUtils.isNotEmpty(errandId), "errandId", errandId); + queryWrapper.eq(ObjectUtils.isNotEmpty(pickupMethod), "pickupMethod", pickupMethod); + queryWrapper.eq(ObjectUtils.isNotEmpty(state), "state", state); + queryWrapper.ge(StringUtils.isNotBlank(pickupCode), "pickupCode", pickupCode); + queryWrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime); + queryWrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime); + queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + return queryWrapper; + } + + @Override + @Transactional + public Orders getOrderWithPessimisticLock(Long ordersId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Orders::getId, ordersId); + + // 使用悲观锁,查询并锁定订单 + Orders orders = this.getBaseMapper().selectOne(queryWrapper.last("FOR UPDATE")); + + return orders; + } + + @Override + public Boolean OrderToUpdate(OrderUpdateRequest orderUpdateRequest, HttpServletRequest request) { + if (orderUpdateRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + Orders orders = this.getById(orderUpdateRequest.getOrderId()); + if (orders == null) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "订单不存在"); + } + Integer state = orders.getState(); + if (state != 0) { + throw new BusinessException(ErrorCode.OPERATION_ERROR, "当前订单已支付"); + } + + User loginUser = userService.getLoginUser(request); + ThrowUtils.throwIf(!loginUser.getId().equals(orders.getUserId()), ErrorCode.OPERATION_ERROR, "当前订单不属于该用户"); + + ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, orders.getId())); + Integer pickupMethod = orderUpdateRequest.getPickupMethod(); + LocalDateTime pickupStartTime = orderUpdateRequest.getPickupStartTime(); + LocalDateTime pickupEndTime = orderUpdateRequest.getPickupEndTime(); + String location = orderUpdateRequest.getLocation(); + String notes = orderUpdateRequest.getNotes(); + BigDecimal totalPrice = orders.getTotalPrice(); + Integer currentPickupMethod = orders.getPickupMethod(); + + if (pickupMethod == 0) { + // 转为自取,需要减去相应的费用 + if (currentPickupMethod == 1 || currentPickupMethod == 2) { + BigDecimal newTotalPrice = calculateTotalPrice(orders.getId(), totalPrice, false); // 减去打包费 + orders.setTotalPrice(newTotalPrice); + if (currentPickupMethod == 2) { + BigDecimal total = calculateTotal(orders.getId(), newTotalPrice, location, false); //减去配送费 + orders.setTotalPrice(total); + } + } + } else if (pickupMethod == 1) { + // 转为外带 + if (currentPickupMethod == 0) { + // 从自取转为外带,添加打包费 + BigDecimal newTotalPrice = calculateTotalPrice(orders.getId(), totalPrice, true); + orders.setTotalPrice(newTotalPrice); + } else if (currentPickupMethod == 2) { + // 从配送转为外带,减去配送费,保留打包费 + BigDecimal newTotalPrice = calculateTotal(orders.getId(), totalPrice, location, false); + orders.setTotalPrice(newTotalPrice); + } + } else if (pickupMethod == 2) { + // 转为配送 + if (currentPickupMethod == 0) { + // 从自取转为配送,添加打包费和配送费 + BigDecimal newTotalPrice = calculateTotalPrice(orders.getId(), totalPrice, true); // 添加打包费 + BigDecimal total = calculateTotal(orders.getId(), newTotalPrice, location, true); // 添加配送费 + orders.setTotalPrice(total); + } else if (currentPickupMethod == 1) { + // 从外带转为配送,添加配送费,保留打包费 + BigDecimal total = calculateTotal(orders.getId(), totalPrice, location, true); + orders.setTotalPrice(total); + } + + // 验证取餐时间和地址 + this.validateDelivery(location, pickupStartTime); + + orders.setLocation(location); // 设置取餐地点 + long count = errandOrderService.count(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, orders.getId())); + if (count > 0) { + errandOrder.setErrandState(1); + errandOrder.setStartTime(pickupStartTime); + errandOrder.setEndTime(pickupEndTime); + boolean update = errandOrderService.updateById(errandOrder); + ThrowUtils.throwIf(!update, ErrorCode.OPERATION_ERROR, "更新跑腿订单失败"); + } else { + ErrandOrder errandOrder1 = new ErrandOrder(); + errandOrder1.setErrandState(1); // 待抢单 + errandOrder1.setOrderId(orders.getId()); + errandOrder1.setStartTime(pickupStartTime); + errandOrder1.setEndTime(pickupEndTime); + boolean save = errandOrderService.saveOrUpdate(errandOrder1); + ThrowUtils.throwIf(!save, ErrorCode.OPERATION_ERROR, "创建跑腿订单关联失败"); + } + } + + orders.setPickupMethod(pickupMethod); + if (pickupMethod == 0 || pickupMethod == 1) { + orders.setLocation(null); + if (errandOrder != null) { + boolean remove = errandOrderService.removeById(errandOrder); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR, "删除跑腿订单关联失败"); + } + } + + // 如果备注不为空,则设置备注 + if (StringUtils.isNotBlank(notes)) { + orders.setNotes(notes); + } + + // 更新订单 + System.out.println("此时location:" + orders.getLocation()); + ThrowUtils.throwIf(!this.updateById(orders), ErrorCode.OPERATION_ERROR, "修改订单失败"); + + return true; + } + + + @Override + public List findExpiredOrders(LocalDateTime deadline) { + return this.lambdaQuery() + .in(Orders::getState, 4) + .lt(Orders::getUpdateTime, deadline) // 更新时间小于deadline(过期) + .list(); + } + + @Override + public List findCancelOrders(Date halfHourAgo) { + return this.lambdaQuery() + .in(Orders::getState, 1) + .lt(Orders::getUpdateTime, halfHourAgo) + .eq(Orders::getPickupMethod, 2) // 外卖 + .list(); + } + + @Override + public OrderErrandVO getOrderErrandVO(Orders orders) { + if (orders == null) { + return null; + } + Long ordersId = orders.getId(); + OrderErrandVO orderErrandVO = new OrderErrandVO(); + //取餐码 + orderErrandVO.setPickupCode(orders.getPickupCode()); + //图片 + OrderImage image = orderImageService.getOne(Wrappers.lambdaQuery() + .eq(OrderImage::getOrderId, ordersId)); + orderErrandVO.setImageAddress(image.getImageAddress()); + //门店名称 + Business business = businessService.getOne(Wrappers.lambdaQuery() + .eq(Business::getId, orders.getBusinessId())); + orderErrandVO.setBusinessName(business.getBusinessName()); + //送达时间 + ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.lambdaQuery() + .eq(ErrandOrder::getOrderId, ordersId)); + orderErrandVO.setDeliveryTime(errandOrder.getUpdateTime()); + //配送地址 + orderErrandVO.setLocation(orders.getLocation()); + + return orderErrandVO; + } + + @Override + public List getListOrderErrandVO(List list) { + + return list.stream().map(this::getOrderErrandVO).collect(Collectors.toList()); + } + + @Override + public List liststatus(HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + Long userId = loginUser.getId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(Orders::getState, 1,4); //将订单状态为1-已支付和4已出餐的订单拿出来 + queryWrapper.eq(Orders::getUserId, userId); + List ordersList = this.list(queryWrapper); + List orderList = ordersList.stream() + .map(Orders::getId) + .collect(Collectors.toList()); + //获取哦errandstate + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(ErrandOrder::getOrderId, orderList); + List errandOrders = errandOrderService.list(wrapper); + + //获取addressimage + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(OrderImage::getOrderId, orderList); + List images = orderImageService.list(lambdaQueryWrapper); + Map imageMap = images.stream() + .collect(Collectors.toMap(OrderImage::getOrderId, OrderImage::getImageAddress)); + //先将errandOrder数据变成MAP,提高查询效率 + Map map = errandOrders.stream() + .collect(Collectors.toMap(ErrandOrder::getOrderId, ErrandOrder::getErrandState)); + List statusVOList = ordersList.stream() + .map(order -> { + OrderStatusVO orderStatusVO = new OrderStatusVO(); + orderStatusVO.setId(order.getId()); + orderStatusVO.setOrderState(order.getState()); + orderStatusVO.setPickupMethod(order.getPickupMethod()); + orderStatusVO.setImageAddress(imageMap.getOrDefault(order.getId(), "")); + orderStatusVO.setErrandState(map.getOrDefault(order.getId(), 0)); + return orderStatusVO; + }).collect(Collectors.toList()); + + return statusVOList; + } + + @Override + public List getOrdernumber() { + Map eatIn = this.getQueryNumByDay(0); // 获取堂食单量 + Map self = this.getQueryNumByDay(1); // 获取自提单量 + Map take = this.getQueryNumByDay(2); // 获取外卖单量 + + List ordersPickVOList = new ArrayList<>(); + +// 遍历 7 天数据(eatIn、self、take 具有相同的日期键) + for (String date : eatIn.keySet()) { + OrdersPickVO vo = new OrdersPickVO(); + vo.setDate(date); // 设置日期 + vo.setEatInNum(eatIn.getOrDefault(date, 0L)); // 堂食订单数 + vo.setSelfLiftNum(self.getOrDefault(date, 0L)); // 自提订单数 + vo.setTakeOutNum(take.getOrDefault(date, 0L)); // 外卖订单数 + ordersPickVOList.add(vo); + } + + return ordersPickVOList; + } + + + private void validateDelivery(String location, LocalDateTime pickupTime) { + if (StringUtils.isBlank(location) || !UserConstant.VALID_LOCATIONS.contains(location)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请选择有效地址"); + } + if (ObjectUtils.isEmpty(pickupTime)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请选择有效取餐时间"); + } + } + + private BigDecimal calculateTotalPrice(Long orderId, BigDecimal totalPrice, boolean add) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(OrderDetails::getOrderId, orderId); + List orderDetailsList = orderDetailsService.list(queryWrapper); + for (OrderDetails orderDetails : orderDetailsList) { + Long dishesId = orderDetails.getDishesId(); + Dishes dishes = dishesService.getById(dishesId); + Double packPrice = dishes.getPackPrice(); + BigDecimal pack = BigDecimal.valueOf(packPrice); + if (add) { + totalPrice = totalPrice.add(pack);// 确保将结果赋回 totalPrice + } else { + totalPrice = totalPrice.subtract(pack); // 减去打包费 + } + + } +// totalPrice = orderDetailsList.stream() +// .map(orderDetails -> { +// Long dishesId = orderDetails.getDishesId(); +// Dishes dishes = dishesService.getById(dishesId); +// Double packPrice = dishes.getPackPrice(); +// return BigDecimal.valueOf(packPrice); // 转换为 BigDecimal +// }) +// .reduce(totalPrice, (accumulatedPrice, packPrice) -> +// add ? accumulatedPrice.add(packPrice) : accumulatedPrice.subtract(packPrice)); // 根据 add 的值进行加减 + return totalPrice; + } + + private Business getBusiness (Long businessId) { + Business business = null; + if (businessId != null && businessId > 0) { + business = businessService.getById(businessId); + } + return business; + } + + private Map getQueryNumByDay(int pickupMethod) { + Map resultMap = new LinkedHashMap<>(); + LocalDateTime now = LocalDateTime.now(); + + for (int i = 0; i < 7; i++) { + LocalDateTime startOfDay = now.minusDays(i).toLocalDate().atStartOfDay(); + LocalDateTime endOfDay = startOfDay.plusDays(1); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(Orders::getCreateTime, startOfDay); + queryWrapper.lt(Orders::getCreateTime, endOfDay); + queryWrapper.eq(Orders::getPickupMethod, pickupMethod); + + long count = this.count(queryWrapper); + resultMap.put(startOfDay.toLocalDate().toString(), count); + } + + return resultMap; + } + + private BigDecimal calculateTotal(Long orderId, BigDecimal totalPrice, String location, boolean add) { + Orders orders = this.getById(orderId); + log.info("location:{}" , location); + BigDecimal pack = DELIVERY_FEE_MAP.get(location); + log.info("pack:{}" , pack); + if (add) { + totalPrice = totalPrice.add(pack);// 确保将结果赋回 totalPrice + } else { + totalPrice = totalPrice.subtract(pack); // 减去打包费 + } + + return totalPrice; + } + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OssServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OssServiceImpl.java new file mode 100644 index 0000000..a0e8bc7 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/OssServiceImpl.java @@ -0,0 +1,79 @@ +package com.bsz.school_send_back_end.service.impl; + +import cn.hutool.core.date.DateTime; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.bsz.school_send_back_end.service.OssService; +import com.bsz.school_send_back_end.utils.ConstantPropertiesUtil; + +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + + +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; + +/** + * @author xy + */ +@Service +public class OssServiceImpl implements OssService { + + //上传头像到OSS + @Override + public String uploadFileAvatar(MultipartFile file) { + + //工具类获取值 + String endpoint = ConstantPropertiesUtil.END_POINT; + String accessKeyId = ConstantPropertiesUtil.KEY_ID; + String accessKeySecret = ConstantPropertiesUtil.KEY_SECRET; + String bucketName = ConstantPropertiesUtil.BUCKET_NAME; + + + InputStream inputStream = null; + + + try { + // 创建OSS实例。 + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + + // 获取上传文件的输入流 + inputStream = file.getInputStream(); + + + //获取文件名称 + String fileName = file.getOriginalFilename(); + //添加随机值 + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + fileName = uuid + fileName; + + + //把文件按照日期分类 + //获取当前日期 + String datePath = new DateTime().toString("yyyy/MM/dd"); + //拼接日期 + fileName = datePath + "/" + fileName; + + + //调用oss实例中的方法实现上传 + //参数1: Bucket名称 + //参数2: 上传到oss文件路径和文件名称 /aa/bb/1.jpg + //参数3: 上传文件的输入流 + ossClient.putObject(bucketName, fileName, inputStream); + // 关闭OSSClient。 + ossClient.shutdown(); + + //把上传后文件路径返回 + //需要把上传到阿里云oss路径手动拼接出来 + //https://achang-edu.oss-cn-hangzhou.aliyuncs.com/default.gif + String url = "http://" + bucketName + "." + endpoint + "/" + fileName; + + return url; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/PrivateMessageServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/PrivateMessageServiceImpl.java new file mode 100644 index 0000000..715e7cb --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/PrivateMessageServiceImpl.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.model.domain.PrivateMessage; +import com.bsz.school_send_back_end.service.PrivateMessageService; +import com.bsz.school_send_back_end.mapper.PrivateMessageMapper; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class PrivateMessageServiceImpl extends ServiceImpl + implements PrivateMessageService{ + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SpecificationsDishesServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SpecificationsDishesServiceImpl.java new file mode 100644 index 0000000..f85551a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SpecificationsDishesServiceImpl.java @@ -0,0 +1,85 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.SpecificationsDishesMapper; +import com.bsz.school_send_back_end.model.domain.Specifications; +import com.bsz.school_send_back_end.model.domain.SpecificationsDishes; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; +import com.bsz.school_send_back_end.service.AttributeService; +import com.bsz.school_send_back_end.service.SpecificationsDishesService; +import com.bsz.school_send_back_end.service.SpecificationsService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import jakarta.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class SpecificationsDishesServiceImpl extends ServiceImpl + implements SpecificationsDishesService { + @Resource + private SpecificationsService specificationsService; + + @Resource + private AttributeService attributeService; + + @Override + public void deleteByDishesId(Long dishesId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("dishesId",dishesId); + long count = this.count(queryWrapper); + if (count < 1) { + return; + } + boolean remove = this.remove(queryWrapper); + ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR); + } + + @Override + public Boolean add(Long dishesId, List specificationsIds) { + if (CollectionUtils.isEmpty(specificationsIds)) { + return true; + } + + for (Long specificationsId: specificationsIds) { + SpecificationsDishes specificationsDishes = new SpecificationsDishes(); + specificationsDishes.setSpecificationsId(specificationsId); + specificationsDishes.setDishesId(dishesId); + boolean save = this.save(specificationsDishes); + ThrowUtils.throwIf(!save,ErrorCode.OPERATION_ERROR); + } + return true; + } + + @Override + public Boolean updateByDishesId(Long dishesId, List specificationsIds) { + //删除之前的中间表信息 + deleteByDishesId(dishesId); + //保存更新的中间表信息 + return add(dishesId,specificationsIds); + } + + @Override + public List getSpecificationsAddAttribute(List specificationsDishesList) { + List specificationsVOList = specificationsDishesList.stream().map(item -> { + Long specificationsId = item.getSpecificationsId(); + Specifications specifications = specificationsService.getById(specificationsId); + SpecificationsVO specificationsVO = new SpecificationsVO(); + BeanUtils.copyProperties(specifications, specificationsVO); + return specificationsVO; + }).collect(Collectors.toList()); + return attributeService.getBySpecificationsVoId(specificationsVOList); + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SpecificationsServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SpecificationsServiceImpl.java new file mode 100644 index 0000000..e7bd986 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SpecificationsServiceImpl.java @@ -0,0 +1,101 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.mapper.SpecificationsMapper; +import com.bsz.school_send_back_end.model.domain.Business; +import com.bsz.school_send_back_end.model.domain.Specifications; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeAddRequest; +import com.bsz.school_send_back_end.model.dto.attribute.AttributeUpdateRequest; +import com.bsz.school_send_back_end.model.vo.SpecificationsVO; +import com.bsz.school_send_back_end.service.AttributeService; +import com.bsz.school_send_back_end.service.BusinessService; +import com.bsz.school_send_back_end.service.SpecificationsService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* @author xy +*/ +@Service +public class SpecificationsServiceImpl extends ServiceImpl + implements SpecificationsService { + + @Resource + private BusinessService businessService; + + @Resource + private AttributeService attributeService; + + @Override + public void validSpecifications(Specifications specifications, boolean update) { + if (specifications == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + String specificationsName = specifications.getSpecificationsName(); + Long id = specifications.getId(); + + if (update) { + ThrowUtils.throwIf(id == null, ErrorCode.PARAMS_ERROR,"请提供规格id"); + } + + if (StringUtils.isBlank(specificationsName)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请填写规格名称"); + } + } + + @Override + public Boolean addSpecifications(Specifications specifications, List attributeAddRequests, HttpServletRequest request) { + //获取当前商户 + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + + //保存规格 + specifications.setBusinessId(businessId); + boolean save = this.save(specifications); + ThrowUtils.throwIf(!save, ErrorCode.PARAMS_ERROR); + Long specificationsId = specifications.getId(); + return attributeService.addAttribute(attributeAddRequests, businessId, specificationsId); + } + + @Override + public Boolean updateSpecifications(Specifications specifications, List attributeUpdateRequests, HttpServletRequest request) { + Long specificationsId = specifications.getId(); + //获取当期那登录商家信息 + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + //更新规格信息 + specifications.setBusinessId(businessId); + boolean update = this.updateById(specifications); + ThrowUtils.throwIf(!update,ErrorCode.OPERATION_ERROR); + //更新规格的属性信息 + return attributeService.updateAttribute(attributeUpdateRequests, businessId, specificationsId); + } + + @Override + public List getSpecificationsVO(List specificationsList) { + if (CollectionUtils.isEmpty(specificationsList)){ + return new ArrayList<>(); + } + return specificationsList.stream().map(item ->{ + SpecificationsVO specificationsVO = new SpecificationsVO(); + BeanUtils.copyProperties(item,specificationsVO); + return specificationsVO; + }).collect(Collectors.toList()); + } + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SysteminfoServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SysteminfoServiceImpl.java new file mode 100644 index 0000000..905e26e --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SysteminfoServiceImpl.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.model.domain.Systeminfo; +import com.bsz.school_send_back_end.mapper.SysteminfoMapper; +import com.bsz.school_send_back_end.service.SysteminfoService; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class SysteminfoServiceImpl extends ServiceImpl + implements SysteminfoService { + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SystemlogServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SystemlogServiceImpl.java new file mode 100644 index 0000000..c3c4591 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/SystemlogServiceImpl.java @@ -0,0 +1,45 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.contant.CommonConstant; +import com.bsz.school_send_back_end.model.domain.Systemlog; +import com.bsz.school_send_back_end.model.dto.log.LogQueryRequest; +import com.bsz.school_send_back_end.service.SystemlogService; +import com.bsz.school_send_back_end.mapper.SystemlogMapper; +import com.bsz.school_send_back_end.utils.SqlUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +/** +* @author xy +*/ +@Service +public class SystemlogServiceImpl extends ServiceImpl + implements SystemlogService{ + + @Override + public QueryWrapper getQueryWrapper(LogQueryRequest logQueryRequest) { + Long userId = logQueryRequest.getUserId(); + String content = logQueryRequest.getContent(); + String ip = logQueryRequest.getIp(); + String startTime = logQueryRequest.getStartTime(); + String endTime = logQueryRequest.getEndTime(); + String sortField = logQueryRequest.getSortField(); + String sortOrder = logQueryRequest.getSortOrder(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "userId", userId); + queryWrapper.eq(StringUtils.isNotBlank(content), "content", content); + queryWrapper.eq(StringUtils.isNotBlank(ip), "ip", ip); + queryWrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime); + queryWrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime); + queryWrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC), + sortField); + return queryWrapper; + } +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/UserRatingServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/UserRatingServiceImpl.java new file mode 100644 index 0000000..5c58345 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/UserRatingServiceImpl.java @@ -0,0 +1,131 @@ +package com.bsz.school_send_back_end.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.contant.UserConstant; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.model.domain.*; +import com.bsz.school_send_back_end.service.*; +import com.bsz.school_send_back_end.mapper.UserRatingMapper; +import org.springframework.stereotype.Service; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.util.List; + +/** +* @author xy +*/ +@Service +public class UserRatingServiceImpl extends ServiceImpl + implements UserRatingService{ + + @Resource + private UserService userService; + + @Resource + private OrdersService ordersService; + + @Resource + private BusinessService businessService; + + @Resource + private ErrandService errandService; + + @Override + public void validUserRating(UserRating userRating, HttpServletRequest request) { + + if (userRating.getRating() < 1 || userRating.getRating() > 5) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "分数不在可选范围内"); + } + + User loginUser = userService.getLoginUser(request); + if (!loginUser.getId().equals(userRating.getUserId())) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR, "当前登录用户与评分中的用户不匹配"); + } + Integer ratedEntityType = userRating.getRatedEntityType(); + Orders orders = ordersService.getOne(Wrappers.lambdaQuery().eq(Orders::getId, userRating.getOrderId())); + ThrowUtils.throwIf(orders == null, ErrorCode.NOT_FOUND_ERROR, "订单不存在"); + if (ratedEntityType == 0) { + ThrowUtils.throwIf(!orders.getBusinessId().equals(userRating.getRatedEntityId()) ,ErrorCode.NOT_FOUND_ERROR, "该商家与订单商家不一致"); + } + else if (ratedEntityType == 1) { + ThrowUtils.throwIf(!orders.getErrandId().equals(userRating.getRatedEntityId()), ErrorCode.OPERATION_ERROR, "该跑腿与订单跑腿不一致"); + }else { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "分类id不正确"); + } + + long count = this.count(Wrappers.lambdaQuery() + .eq(UserRating::getOrderId, userRating.getOrderId()) + .eq(UserRating::getRatedEntityType, userRating.getRatedEntityType())); + ThrowUtils.throwIf(count > 0, ErrorCode.SYSTEM_ERROR, "该订单已评分"); + } + + @Override + public void validUserRatingByBusiness(Long userRatingId, HttpServletRequest request) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserRating::getId, userRatingId); + UserRating userRating = this.getOne(queryWrapper); + Business loginBusiness = businessService.getLoginBusiness(request); + Long businessId = loginBusiness.getId(); + if (businessId.equals(userRating.getRatedEntityId())) { + throw new BusinessException(ErrorCode.OPERATION_ERROR,"该用户评分不属于当前商家"); + } + if (StringUtils.isBlank(userRating.getReview())) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "当前用户没有评论"); + } + if (StringUtils.isNotBlank(userRating.getBusinessReview())) { + throw new BusinessException(ErrorCode.PARAMS_ERROR,"当前用户评分已回复"); + } + } + + @Override + public List listUserRatingByUser(HttpServletRequest request) { + Long ratedEntityId = this.authenticationUser(request); + + return this.list(Wrappers.lambdaQuery() + .eq(UserRating::getRatedEntityId, ratedEntityId)); + } + + @Override + public int calculateLevel(Double averageScore) { + if (averageScore >= 4.5) { + return 5; + } else if (averageScore >= 4.0) { + return 4; + } else if (averageScore >= 3.0) { + return 3; + } else if (averageScore >= 2.0) { + return 2; + } else { + return 1; + } + } + + + private Long authenticationUser (HttpServletRequest request) { + User loginUser = userService.getLoginUser(request); + String userRole = loginUser.getUserRole(); + Long ratedEntityId = null; + if (userRole.equals(UserConstant.BUSINESS_ROLE)) { + Business business = businessService.getOne(Wrappers.lambdaQuery() + .eq(Business::getUserId, loginUser.getId())); + ratedEntityId = business.getId(); + } else if (userRole.equals(UserConstant.ERRAND_ROLE)) { + Errand errand = errandService.getOne(Wrappers.lambdaQuery() + .eq(Errand::getUserId, loginUser.getId())); + ratedEntityId = errand.getId(); + } + + return ratedEntityId; + } + +} + + + + diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/UserServiceImpl.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..6dcab57 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/service/impl/UserServiceImpl.java @@ -0,0 +1,417 @@ +package com.bsz.school_send_back_end.service.impl; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; +import com.bsz.school_send_back_end.exception.ThrowUtils; +import com.bsz.school_send_back_end.manager.SessionManager; +import com.bsz.school_send_back_end.mapper.UserMapper; +import com.bsz.school_send_back_end.model.enums.UserRoleEnum; +import com.bsz.school_send_back_end.model.vo.LoginUserVO; +import com.bsz.school_send_back_end.model.domain.User; +import com.bsz.school_send_back_end.model.dto.user.UserSearchRequest; +import com.bsz.school_send_back_end.model.dto.user.UserUpdatePasswordRequest; +import com.bsz.school_send_back_end.service.UserService; +import com.bsz.school_send_back_end.utils.NetUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.bsz.school_send_back_end.contant.RedisKeyConstant.USER_LOGIN_STATE; + + +/** + * @author xy + */ +@Service +@Slf4j +public class UserServiceImpl extends ServiceImpl + implements UserService { + + @Resource + private UserMapper userMapper; + + @Resource + private SessionManager sessionManager; + + /** + * 盐值 对密码进行混淆加密 + */ + private static final String SALT = "bsz"; + + /** + * 用户注册 + * + * @param userAccount 登陆账号 + * @param userPassword 登录密码 + * @param checkPassword 校验密码 + * @return 新id + */ + + @Override + public long userRegister(String userAccount, String userPassword, String checkPassword) { + + //1.非空 + if (StringUtils.isAllBlank(userAccount, userPassword, checkPassword)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数为空"); + } + //2.账号长度不小于4位 + if (userAccount.length() < 4) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号过短"); + } + //3.密码长度不小于8位 + if (userPassword.length() < 8 || checkPassword.length() < 8) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码过短"); + } + //正则表达式看账户包不包含特殊字符 + String validPattern = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; + + Matcher matcher = Pattern.compile(validPattern).matcher(userAccount); + + if (matcher.find()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "不符合规范"); + } + + //检验密码和校验密码是否相同 + if (!userPassword.equals(checkPassword)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "两次输入密码不同"); + } + + //账户不能重复,进行查询数据库看当中是否存在相同名称用户 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userAccount", userAccount); + Long count = userMapper.selectCount(queryWrapper); + if (count > 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "存在相同用户"); + } + + //对密码加密 + String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes()); + + User user = new User(); + user.setUserAccount(userAccount); + user.setUserPassword(encryptPassword); + user.setUserRole("errand"); + boolean saveResult = this.save(user); + if (!saveResult) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "插入失败!"); + } + return user.getId(); + } + + /** + * 登录 + * + * @param userAccount 登陆账号 + * @param userPassword 登陆密码 + * @param request 返回请求 + * @return 用户信息 + */ + + @Override + public String userLogin(String userAccount, String userPassword, String appName, HttpServletRequest request) { + //非空 + if (StringUtils.isAllBlank(userAccount, userPassword)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数为空"); + } + //账号长度不小于四位 + if (userAccount.length() < 4 || userAccount.length() > 20) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号应在4~20位"); + } + if (userPassword.length() < 8 || userPassword.length() > 16) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码应在8~16位"); + } + + //正则表达式看账户包不包含特殊字符 + String validPattern = "[ `~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; + + Matcher matcher = Pattern.compile(validPattern).matcher(userAccount); + + if (matcher.find()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "不符合规范"); + } + + //校验账号密码是否相同 + String encodePassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes(StandardCharsets.UTF_8)); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userAccount", userAccount); + queryWrapper.eq("userPassword", encodePassword); + User user = userMapper.selectOne(queryWrapper); + //用户不存在 + if (user == null) { + log.info("user login failed, userAccount Cannot match userPassword"); + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号或密码有误!"); + } + + ThrowUtils.throwIf(!user.getUserRole().equals(appName), ErrorCode.NO_AUTH, "当前用户无权限登录该APP"); + + //用户登陆成功 + return sessionManager.login(user, appName, request); + } + + /** + * 用户脱敏 + * + * @param originUser 未脱敏用户 + * @return 脱敏用户 + */ + @Override + public User getSafetyUser(User originUser) { + if (originUser == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数为空"); + } + User safetyUser = new User(); + safetyUser.setId(originUser.getId()); + safetyUser.setUsername(originUser.getUsername()); + safetyUser.setUserAccount(originUser.getUserAccount()); + safetyUser.setAvatarUrl(originUser.getAvatarUrl()); + safetyUser.setGender(originUser.getGender()); + safetyUser.setPhone(originUser.getPhone()); + safetyUser.setEmail(originUser.getEmail()); + safetyUser.setUserStatus(originUser.getUserStatus()); + safetyUser.setCreateTime(originUser.getCreateTime()); + safetyUser.setUpdateTime(originUser.getUpdateTime()); + safetyUser.setUserStatus(originUser.getUserStatus()); + safetyUser.setUserRole(originUser.getUserRole()); + return safetyUser; + } + + /** + * 用户注销 + * + * @param request 请求对象 + * @return 返回1表示成功 + */ + @Override + public int userLogout(HttpServletRequest request) { + if (request.getSession().getAttribute(USER_LOGIN_STATE) == null) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR); + } + sessionManager.logout(request); + //移除登录态 + request.getSession().removeAttribute(USER_LOGIN_STATE); + return 1; + } + + /** + * 获取当前登陆的用户 + * + * @param request 请求对象 + * @return 用户信息 + */ + @Override + public User getLoginUser(HttpServletRequest request) { + //判断是否登录 + Object userObj = request.getSession().getAttribute(USER_LOGIN_STATE); + User currentUser = (User) userObj; + + if (currentUser == null || currentUser.getId() == null) { + throw new BusinessException(ErrorCode.NOT_LOGIN, "未登录"); + } + //从数据库中获取该用户的信息 + String ipAddress = NetUtils.getIpAddress(request); + String oldSessionId = sessionManager.checkOtherLogin(currentUser.getId(), ipAddress, request); + if (StrUtil.isNotBlank(oldSessionId)) { + request.getSession().removeAttribute(USER_LOGIN_STATE); + throw new BusinessException(ErrorCode.NO_AUTH, "已在其他设备登录,请重新登录"); + } + + long userId = currentUser.getId(); + currentUser = this.getById(userId); + if (currentUser == null) { + throw new BusinessException(ErrorCode.NOT_LOGIN, "未登录"); + } + //被封号 + if (UserRoleEnum.BAN.getValue().equals(currentUser.getUserRole())) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR,"用户已被封禁,禁止登录"); + } + return currentUser; + } + + /** + * 分页查询 + * + * @param searchRequest + * @return + */ + + @Override + public QueryWrapper getQueryWrapper(UserSearchRequest searchRequest) { + + if (searchRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "请求参数为空"); + } + String username = searchRequest.getUsername(); + String userAccount = searchRequest.getUserAccount(); + Integer gender = searchRequest.getGender(); + String phone = searchRequest.getPhone(); + String email = searchRequest.getEmail(); + Integer userStatus = searchRequest.getUserStatus(); + String userRole = searchRequest.getUserRole(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + Date updateTime = searchRequest.getUpdateTime(); + Date createTime = searchRequest.getCreateTime(); + // username + if (StringUtils.isNotBlank(username)) { + queryWrapper.like("username", username); + } + // userAccount + if (StringUtils.isNotBlank(userAccount)) { + queryWrapper.like("userAccount", userAccount); + } + // gender + if (StringUtils.isNotBlank(username)) { + queryWrapper.eq("gender", gender); + } + // phone + if (StringUtils.isNotBlank(phone)) { + queryWrapper.like("phone", phone); + } + // email + if (StringUtils.isNotBlank(email)) { + queryWrapper.like("email", email); + } + // userStatus + if (userStatus != null) { + queryWrapper.eq("userStatus", userStatus); + } + + if (userRole != null) { + queryWrapper.eq("userRole", userRole); + } + if (updateTime != null) { + queryWrapper.like("updateTime", updateTime); + } + if (createTime != null) { + queryWrapper.like("createTime", createTime); + } + return queryWrapper; + } + + /** + * 用户登录(支付宝) + * + * @param openId + * @param userInfo + * @param request + * @return 脱敏后的用户信息 + */ + //TODO 表未设计openId 需要设计 + @Override + public LoginUserVO userLoginByAlipay(String openId, JSONObject userInfo, HttpServletRequest request) { + if (openId == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "openId为空"); + } + String nick_name = userInfo.getStr("nick_name"); + String avatar = userInfo.getStr("avatar"); + //单机锁 + synchronized (openId.intern()) { + //检查用户是否已经存在 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("openId", openId); + User user = this.getOne(queryWrapper); + if (user == null) { + user = new User(); + user.setOpenId(openId); + user.setUserPassword(RandomUtil.randomString(16)); + user.setAvatarUrl(avatar == null ? "https://xuande-hk.gitee.io/images/avatar.png" : avatar); + user.setUsername(nick_name == null ? "普通用户" + RandomUtil.randomString(6) : nick_name); + boolean result = this.save(user); + if (!result) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "用户创建失败"); + } + } + //记录用户的登录态 + request.getSession().setAttribute(USER_LOGIN_STATE, user); + //返回用户数据 + return getLoginUserVO(user); + } + } + + + /** + * 修改密码 + * + * @param updatePasswordRequest + * @param request + * @return + */ + @Override + public boolean updateUserPassword(UserUpdatePasswordRequest updatePasswordRequest, HttpServletRequest request) { + if (updatePasswordRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + User loginUser = getLoginUser(request); + Long userId = loginUser.getId(); + if (userId < 0 || userId == null) { + throw new BusinessException(ErrorCode.NULL_ERROR, "不存在该用户"); + } + User user = new User(); + BeanUtils.copyProperties(updatePasswordRequest, user); + user.setId(loginUser.getId()); + + // 使用 MD5 加密新密码 + String encryptedPassword = DigestUtils.md5DigestAsHex((SALT + updatePasswordRequest.getNewPassword()).getBytes()); + user.setUserPassword(encryptedPassword); + if (encryptedPassword.equals(updatePasswordRequest.getUserPassword())) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "修改密码不能相同"); + } + boolean result = updateById(user); + if (!result) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + return true; + } + + @Override + public LoginUserVO getLoginUserVO(User user) { + if (user == null) { + return null; + } + LoginUserVO loginUserVO = new LoginUserVO(); + BeanUtils.copyProperties(user, loginUserVO); + return loginUserVO; + } + + @Override + public void validUser(User user, boolean add) { + ThrowUtils.throwIf(user == null , ErrorCode.NULL_ERROR); + + String userAccount = user.getUserAccount(); + String userPassword = user.getUserPassword(); + + if (add) { + ThrowUtils.throwIf(StringUtils.isAllBlank(userAccount, userPassword), ErrorCode.PARAMS_ERROR); + + if (userAccount.length() < 4) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号不符合要求"); + } + + if(userPassword.length() < 8) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户密码不符合要求"); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("userAccount", userAccount); + long count = this.count(queryWrapper); + if (count > 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "账号重复"); + } + } + } + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/AliyunSmsUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/AliyunSmsUtils.java new file mode 100644 index 0000000..e41d8bf --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/AliyunSmsUtils.java @@ -0,0 +1,55 @@ +package com.bsz.school_send_back_end.utils; + +import com.alibaba.fastjson.JSON; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.HashMap; + +@Component +@Slf4j +public class AliyunSmsUtils { + + @Value("${aliyun.sms.sms-access-key-id}") + private String accessKeyId; + + @Value("${aliyun.sms.sms-access-key-secret}") + private String accessKeySecret; + + @Value("${aliyun.sms.sms-sign-nam}") + private String signName; + + @Value("${aliyun.sms.sms-template-cod}") + private String templateCode; + + @Value("${aliyun.sms.sms-endpoint}") + private String endpoint; + + public boolean sendSms(String phoneNumber, HashMap templateParams) { + try { + DefaultProfile profile = DefaultProfile.getProfile("cn-huhehaote", accessKeyId, accessKeySecret); + DefaultAcsClient client = new DefaultAcsClient(profile); + + SendSmsRequest sendSmsRequest = new SendSmsRequest(); + sendSmsRequest.setPhoneNumbers(phoneNumber); + sendSmsRequest.setSignName(signName); + sendSmsRequest.setTemplateCode(templateCode); + sendSmsRequest.setTemplateParam(JSON.toJSONString(templateParams)); + + SendSmsResponse sendSmsResponse = client.getAcsResponse(sendSmsRequest); + log.info("短信响应: Code={}, Message={}", sendSmsResponse.getCode(), sendSmsResponse.getMessage()); + + return "OK".equalsIgnoreCase(sendSmsResponse.getCode()); + } catch (ClientException e) { + log.error("短信发送异常: {}", e.getErrMsg()); + return false; + } + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/ConstantPropertiesUtil.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/ConstantPropertiesUtil.java new file mode 100644 index 0000000..b64312b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/ConstantPropertiesUtil.java @@ -0,0 +1,35 @@ +package com.bsz.school_send_back_end.utils; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 常量类,读取配置文件application.properties中的配置 + * @author xy + */ +@Component +public class ConstantPropertiesUtil implements InitializingBean { + + public static String END_POINT; + public static String KEY_ID; + public static String KEY_SECRET; + public static String BUCKET_NAME; + @Value("${aliyun.oss.file.endpoint}") + private String endpoint; + @Value("${aliyun.oss.file.keyid}") + private String keyid; + @Value("${aliyun.oss.file.keysecret}") + private String keysecret; + @Value("${aliyun.oss.file.bucketname}") + private String bucketname; + + @Override + public void afterPropertiesSet() throws Exception { + KEY_ID = this.keyid; + KEY_SECRET = this.keysecret; + END_POINT = this.endpoint; + BUCKET_NAME = this.bucketname; + } + +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/ExcelUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/ExcelUtils.java new file mode 100644 index 0000000..6befe9b --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/ExcelUtils.java @@ -0,0 +1,118 @@ +package com.bsz.school_send_back_end.utils; + + + + +import com.bsz.school_send_back_end.common.ErrorCode; +import com.bsz.school_send_back_end.exception.BusinessException; + +import jakarta.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * Excel工具类 + * + * @author xy + * */ +@SuppressWarnings("all") +public class ExcelUtils { + + /** + * 获取路径 + * + * @return 当前路径 + */ + public static String getPath() { + return ExcelUtils.class.getResource("/").getPath(); + } + + /** + * 创建新文件 + * + * @param pathName 文件名 + * @return 文件 + */ + public static File createNewFile(String pathName) { + File file = new File(getPath() + pathName); + if (file.exists()) { + file.delete(); + } else { + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + } + return file; + } + + /** + * 设置响应结果 + * + * @param response 响应结果对象 + * @param rawFileName 文件名 + */ + public static void setExcelResponseProp(HttpServletResponse response, String rawFileName) throws IOException { + //设置内容类型 +// response.setContentType("application/vnd.vnd.ms-excel"); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + //设置编码格式 + response.setCharacterEncoding("utf-8"); + //设置导出文件名称(避免乱码) + String fileName = URLEncoder.encode(rawFileName.concat(".xlsx"), "UTF-8"); + // 设置响应头 + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName); + } + + /** + * Date转String + * + * @param date 日期 + * @return 字符串 + */ + + public static String dateToString(LocalDateTime date) { + if (date == null) { + throw new BusinessException(ErrorCode.NOT_FOUND_ERROR); + } + // 使用 DateTimeFormatter 格式化 LocalDateTime + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + return date.format(formatter); + } + + + /** + * 转换跑腿订单状态 + * @param errandState + * @return + */ + public static String getErrandStateText(Integer errandState) { + switch (errandState) { + case 1: return "待抢单"; + case 2: return "已抢单"; + case 3: return "已取货"; + case 4: return "已送达"; + default: return "未知状态"; + } + } + + /** + * 转换订单状态 + * @param sate + * @return + */ + public static String getStateText(Integer state) { + switch (state) { + case 0: return "未支付"; + case 1: return "已支付"; + case 2: return "已退款"; + case 3: return "已取消"; + case 4: return "已出餐"; + case 5: return "已完成"; + default: return "未知状态"; + } + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/MultiDelayMessage.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/MultiDelayMessage.java new file mode 100644 index 0000000..37ed5a3 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/MultiDelayMessage.java @@ -0,0 +1,59 @@ +package com.bsz.school_send_back_end.utils; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Data +@NoArgsConstructor +public class MultiDelayMessage implements Serializable { + + /** + * 消息体 + */ + private T data; + + + /** + * 记录延时时间的集合 + */ + private List delayMillis; + + public MultiDelayMessage(T data, List delayMillis) { + this.data = data; + this.delayMillis = delayMillis; + } + + public MultiDelayMessage(T data, Long...delayMillis) { + this.data = data; + this.delayMillis = new ArrayList<>(Arrays.asList(delayMillis)); + } + + /** + * 获取并移除下一个延迟时间 + * @return 集合中第一个延迟时间 + */ + public Long removeNextDelay() { + return delayMillis.remove(0); + } + + + /** + * 是否有下一个延迟时间 + */ + public boolean hasNextDelay() { + return !delayMillis.isEmpty(); + } + + + + @Serial + private static final long serialVersionUID = 1L; + + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/NetUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/NetUtils.java new file mode 100644 index 0000000..ce2c577 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/NetUtils.java @@ -0,0 +1,56 @@ +package com.bsz.school_send_back_end.utils; + + +import jakarta.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * 网络工具类 + * + */ +@SuppressWarnings("all") +public class NetUtils { + + /** + * 获取客户端 IP 地址 + * + * @param request + * @return + */ + public static String getIpAddress(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + if (ip.equals("127.0.0.1")) { + InetAddress inet = null; + try { + inet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + if (inet != null) { + ip = inet.getHostAddress(); + } + } + } + + // 多个代理的情况下,第一个ip为客户端真实ip,多个ip按照‘,’分割 + if (ip != null && ip.length() > 15) { + if (ip.indexOf(",") > 0) { + ip = ip.substring(0,ip.indexOf(",")); + } + } + if (ip == null) { + return "127.0.0.1"; + } + return ip; + } + +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RandomNumberGenerator.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RandomNumberGenerator.java new file mode 100644 index 0000000..711349a --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RandomNumberGenerator.java @@ -0,0 +1,20 @@ +package com.bsz.school_send_back_end.utils; + +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +public class RandomNumberGenerator { + // 生成指定范围内的随机整数 + public int generateRandomNumber() { + Random random = new Random(); + return random.nextInt(9000 - 1000 + 1) + 1000; + } + + public String getFourBitRandom() { + Random random = new Random(); + int number = 1000 + random.nextInt(9000); // 生成1000到9999之间的随机数 + return String.valueOf(number); // 将数字转换为String并返回 + } +} \ No newline at end of file diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RedisKeyUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RedisKeyUtils.java new file mode 100644 index 0000000..a0696be --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RedisKeyUtils.java @@ -0,0 +1,29 @@ +package com.bsz.school_send_back_end.utils; + +import static com.bsz.school_send_back_end.contant.RedisKeyConstant.*; +import static org.springframework.session.data.redis.RedisIndexedSessionRepository.DEFAULT_NAMESPACE; + +public class RedisKeyUtils { + + /** + * 获取一登录用户的ip和sessionId对应的key + * @param userId + * @return + */ + public static String getUserExtraInfoKey(Long userId) { + return USER_EXTRA_INFO + String.valueOf(userId); + } + + /** + * 获取session信息对应的key + * @param sessionId + * @return + */ + public static String getSessionKey(String sessionId) { + return DEFAULT_NAMESPACE + ":" + SESSION_KEY_POSTFIX + ":" + sessionId; + } + + public static String getSessionAttrKey(String attrName) { + return SESSION_ATTRIBUTE_PREFIX + ":" + attrName; + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RegexUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RegexUtils.java new file mode 100644 index 0000000..39e6282 --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/RegexUtils.java @@ -0,0 +1,60 @@ +package com.bsz.school_send_back_end.utils; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; + +import static com.bsz.school_send_back_end.contant.RegexConstant.*; + +/** + * @author xy + */ +@SuppressWarnings("all") +public class RegexUtils { + + /** + * 是否是无效手机格式 + * + * @param phone 要校验的手机号 + * @return true:符合,false:不符合 + */ + public static boolean isPhoneInvalid(String phone) { + return mismatch(phone, PHONE_REGEX); + } + + /** + * 是否是无效邮箱格式 + * + * @param email 要校验的邮箱 + * @return true:符合,false:不符合 + */ + public static boolean isEmailInvalid(String email) { + return mismatch(email, EMAIL_REGEX); + } + + /** + * 是否是无效18位身份证格式 + * + * @param idCard 要校验的身份证号码 + * @return true:符合,false:不符合 + */ + public static boolean isIdCardInvalid(String idCard) { + return mismatch(idCard, ID_CARD_REGEX); + } + + /** + * 是否是无效验证码格式 + * + * @param code 要校验的验证码 + * @return true:符合,false:不符合 + */ + public static boolean isCodeInvalid(String code) { + return mismatch(code, VERIFY_CODE_REGEX); + } + + // 校验是否不符合正则格式 + private static boolean mismatch(String str, String regex) { + if (StringUtils.isBlank(str)) { + return true; + } + return !str.matches(regex); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/SqlUtils.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/SqlUtils.java new file mode 100644 index 0000000..921220f --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/SqlUtils.java @@ -0,0 +1,25 @@ +package com.bsz.school_send_back_end.utils; + + +import org.apache.commons.lang3.StringUtils; + +/** + * SQL 工具 + * + */ +@SuppressWarnings("all") +public class SqlUtils { + + /** + * 校验排序字段是否合法(防止 SQL 注入) + * + * @param sortField + * @return + */ + public static boolean validSortField(String sortField) { + if (StringUtils.isBlank(sortField)) { + return false; + } + return !StringUtils.containsAny(sortField, "=", "(", ")", " "); + } +} diff --git a/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/UniqueNumberGenerator.java b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/UniqueNumberGenerator.java new file mode 100644 index 0000000..3aaa7bc --- /dev/null +++ b/school_lend_back_end/src/main/java/com/bsz/school_send_back_end/utils/UniqueNumberGenerator.java @@ -0,0 +1,44 @@ +package com.bsz.school_send_back_end.utils; + +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +/** + * 取餐码生成 + * @author xy + */ +@Component +public class UniqueNumberGenerator { + private static int sequenceNumber = 1; // 初始化每天的序列号,从1开始 + private static String lastDate = ""; // 记录上次生成数字的日期 + private static final Random random = new Random(); // 随机数生成器 + + // 生成17位的唯一编号 + public static String generateNumber() { + // 获取当前日期的年月日格式 (前8位) + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); + String dateStr = dateFormat.format(new Date()); + + // 检查日期是否变更,如果变更则重置序列号 + if (!dateStr.equals(lastDate)) { + lastDate = dateStr; + sequenceNumber = 1; // 每天重置为0001 + } + + // 生成中间5位的随机数 + int middleRandom = 10000 + random.nextInt(90000); // 生成10000到99999之间的随机数 + + // 格式化后四位的序列号 + String sequenceStr = String.format("%04d", sequenceNumber); + + // 更新序列号,为下一次调用准备 + sequenceNumber++; + + // 组合并返回结果 + return dateStr + middleRandom + sequenceStr; + } + +} diff --git a/school_lend_back_end/src/main/resources/application-dev.yml b/school_lend_back_end/src/main/resources/application-dev.yml new file mode 100644 index 0000000..3ecd12e --- /dev/null +++ b/school_lend_back_end/src/main/resources/application-dev.yml @@ -0,0 +1,23 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://39.101.78.35/school_send?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC + username: school_send + password: 12345678 +# redis: +# host: 39.101.78.35 +# port: 6379 +# database: 3 +# password: 12345678 +# timeout: 60000 + rabbitmq: + host: 101.42.172.231 + port: 5672 + username: admin + password: Cksys6509 + virtual-host: myvh + listener: + simple: + prefetch: 1 +knife4j: + enable: true \ No newline at end of file diff --git a/school_lend_back_end/src/main/resources/application-prod.yml b/school_lend_back_end/src/main/resources/application-prod.yml new file mode 100644 index 0000000..1dd502f --- /dev/null +++ b/school_lend_back_end/src/main/resources/application-prod.yml @@ -0,0 +1,15 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://154.8.193.216/xiaokuaisong + username: xiaokuaisong + password: 12345678 + data: + redis: + host: 154.8.193.216 + port: 6379 + database: 3 + password: Cksys6509 + timeout: 60000 +knife4j: + enable: true \ No newline at end of file diff --git a/school_lend_back_end/src/main/resources/application.yml b/school_lend_back_end/src/main/resources/application.yml new file mode 100644 index 0000000..9c095ee --- /dev/null +++ b/school_lend_back_end/src/main/resources/application.yml @@ -0,0 +1,86 @@ +spring: + application: + name: school_send_back_end + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver +# url: jdbc:mysql://192.168.59.81/school_send +# username: school_send +# password: 12345678 +# url: jdbc:mysql://localhost:3306/school_send +# username: root +# password: 123456 + url: jdbc:mysql://39.101.78.35/school_send + username: school_send + password: 12345678 +# url: jdbc:mysql://154.8.193.216/xiaokuaisong +# username: xiaokuaisong +# password: 12345678 +# mvc: +# pathmatch: +# matching-strategy: ant_path_matcher + profiles: + active: dev + session: + store-type: redis + timeout: 2592000 + jackson: + time-zone: Asia/Shanghai + date-format: yyyy-MM-dd HH:mm:ss + serialization: + write-dates-as-timestamps: false + data: + redis: + host: 101.42.172.231 + port: 6379 + database: 3 + password: Cksys6509 + timeout: 60000 + ai: + dashscope: + api-key: sk-a5c3edaa6ddd45fe89ce641c25bcb6dc + chat: + options: + model: qwen-max +knife4j: + enable: true +server: + port: 9999 + servlet: + context-path: / + session: + timeout: 86400s + forward-headers-strategy: framework + #证书 + ssl: + enabled: false +mybatis-plus: + configuration: + map-underscore-to-camel-case: false + global-config: + db-config: + logic-delete-field: isDelete + logic-delete-value: 1 + logic-not-delete-value: 0 + + +aliyun: + oss: + file: + endpoint: xxxx + keyid: xxxx + keysecret: xxxx + bucketname: xxxx + sms: + sms-access-key-id: LTAI5tBHrWcJRgM247ykY7kE + sms-access-key-secret: jHFWiFZ8S5jMfRFSGUKUMFTi0LHaUP + sms-sign-nam: 校食通 + sms-template-cod: SMS_478475841 + sms-endpoint: dysmsapi.aliyuncs.com +# 支付宝相关 +alipay: + #支付宝开放平台 + appId: 2021004151684053 + alipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1WYUUWEH+kW2pdYoBJa6j5G3iWe3uL/3L1QXPenzrp/NC1M9W/yvniJnAiYR4pdopZmlWfEm7FpHxbLaxxcXe0jTkspq9vv9vDldyXgKr13QZBJu4hD3w4QZNa+85paANXkfcVKXCpIh6sWTaW78lBE5p7Q0M6O26OCj/K3iPD7x4+KagqS5w9YYS8AXlQdsZPBh99bO3+KuQzcK4o4bFGI+ut4HLvd2IxdF5LwfjucloN6SRbU06vsDtpjtA+Oeoet5Y0CNfkpgbh7wvvNIbM6XEqMtfKCzevPaqRxwrFkS8WUQTMOaQbJXATbPQDt7MoWGujFd37lYz7ESQZed2wIDAQAB" + appPrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOoaURczOevheVDeG9tmdCZ+PSInYwCY+ak3Jcy5CG4wrbHHy30ejMv5jNnyX/iSyC3MYIfHQ2I5uxh7pO3QSiB8GpeM9Oy3bUCOtPVM8o7FJ+/pa6o0s25jmj+Lx6/Q4sAaDxhQPY8vUZdIitQyqNS4IVhDuIWAS1w3ngZWHhcbtCPrCk3wIJPCYbhHi8eTgCXTJ0TbJ/QR+Pj0SAiL46rwSRc9KB1alxL5RoTK4VWvdHlqbfowen6teQ6bo2W5UkUEP8kew6MH9a3QQZ3YdLKFHufSGMWk19Wh26CEsvnf/Mb6dnv6YzbmzZLtCHiKKvFN516peW8Exd9/EtJCu1AgMBAAECggEAPghReVhoL/cu3HXQIylsmXYDoIW6b0QJP8o25+Lk9bVTKF6oY24Y2MvPkkZQSWYIhNWuD0zJYi50bW7BecEoXawP7zwKtZNKGAfVB4i0HHFDo9XoCj4w3SyeDxGEL91VR5Bhxgj61mU8chi7xNc8b31SkzcSiUb2rXLZ091kB58/xtzQk2nZAhKhwms7gbX7qxm8+TWLRK9g4vWmsGVqbgFNj/sutqBURSeU/pHmW9PMqgcWvx6AwWWi+VgBUSoIgMnX7r7s6ZlgeDIgioii3JdCcr1nq39sVYPwFpwIe7a1DOCB58B+v2un1XoThC7ZNEcbwP5oYpUdFhSoxClrNQKBgQDJc/A1nz2yYiLUHUMJn2DhyTrOnCSclmowuzJVkyuo5gQPfZ3dTmjdPkM/fg09J3+zi3UCSwZd6dGMzJVHWooMniSiomZ/rY+o9SVTAJOjxt29N8jFN92b3fB43hbAWyBOuy4NMZMcr+4cADuqRHz2pKAeaALiZdpTbrTCzVXtqwKBgQC1QGS0sv8VU9fyBCyrYU4kQh8Fcvz0g6ObgUnHZi6UIL+Cy0/3JIGeIyvB/n47RF1wLUz4wykwW70e1qlMz7w21HM+DB8fVuzbO7SmQI3gDo024kQkWWGUhe3/w9ztzLF9ezleSN6wnrPeDbeMV+pURbsxIXA9xg7DYpZZ76ksHwKBgHQnF/oi7bTbpo88q/lxXq/wkaqtFuL+Sw378UKsD4Fb1j2ERTBj1Ey0aJvENyfqjVPddcKztWESvtL65pt0laI+0IrBLm4xiWJ2rmWUMIw+zn0aG/Wyh2Emb0+RZfbU0+TxQdUzn0nsGlMkw0IiKRcgxn2hpQAaj+6JJ0omkIPvAoGAZ2eGTKT17Cf6QgNprJiF6R+j7QruD11uoJABFHZSSoXoXGk7hMbZ/+sW0sUrJQrat93QVPeabxFXctmKmtzFBw7rdFGcC9gepvCIHnUju9jxbYdm0sn/ZqmF323RhAVMmUcMsqKmEWNpQFzZA4NAl7V0lxH5o/RzhbqgBk05WYcCgYEAny/umQs7+NYgwL/FztMJVljfQsGY81mhgrQyPhmg/7NiWmLodJtwQgSj3UitDVtUGhZRnuidO8P1XW0sUyDwc8xMLb+0qVxX4gMpM4J1B0UaIp+oPg7hCXeFGxkWQl8bPY0RFa3GOfT2/D63NpXqYw8Fe1lZWoIMz+PBdx0YN90=" +# alipayPublicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjqGlEXMznr4XlQ3hvbZnQmfj0iJ2MAmPmpNyXMuQhuMK2xx8t9HozL+YzZ8l/4ksgtzGCHx0NiObsYe6Tt0EogfBqXjPTst21AjrT1TPKOxSfv6WuqNLNuY5o/i8ev0OLAGg8YUD2PL1GXSIrUMqjUuCFYQ7iFgEtcN54GVh4XG7Qj6wpN8CCTwmG4R4vHk4Al0ydE2yf0Efj49EgIi+Oq8EkXPSgdWpcS+UaEyuFVr3R5am36MHp+rXkOm6NluVJFBD/JHsOjB/Wt0EGd2HSyhR7n0hjFpNfVodughLL53/zG+nZ7+mM25s2S7Qh4iirxTedeqXlvBMXffxLSQrtQIDAQAB" +# appPrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOoaURczOevheVDeG9tmdCZ+PSInYwCY+ak3Jcy5CG4wrbHHy30ejMv5jNnyX/iSyC3MYIfHQ2I5uxh7pO3QSiB8GpeM9Oy3bUCOtPVM8o7FJ+/pa6o0s25jmj+Lx6/Q4sAaDxhQPY8vUZdIitQyqNS4IVhDuIWAS1w3ngZWHhcbtCPrCk3wIJPCYbhHi8eTgCXTJ0TbJ/QR+Pj0SAiL46rwSRc9KB1alxL5RoTK4VWvdHlqbfowen6teQ6bo2W5UkUEP8kew6MH9a3QQZ3YdLKFHufSGMWk19Wh26CEsvnf/Mb6dnv6YzbmzZLtCHiKKvFN516peW8Exd9/EtJCu1AgMBAAECggEAPghReVhoL/cu3HXQIylsmXYDoIW6b0QJP8o25+Lk9bVTKF6oY24Y2MvPkkZQSWYIhNWuD0zJYi50bW7BecEoXawP7zwKtZNKGAfVB4i0HHFDo9XoCj4w3SyeDxGEL91VR5Bhxgj61mU8chi7xNc8b31SkzcSiUb2rXLZ091kB58/xtzQk2nZAhKhwms7gbX7qxm8+TWLRK9g4vWmsGVqbgFNj/sutqBURSeU/pHmW9PMqgcWvx6AwWWi+VgBUSoIgMnX7r7s6ZlgeDIgioii3JdCcr1nq39sVYPwFpwIe7a1DOCB58B+v2un1XoThC7ZNEcbwP5oYpUdFhSoxClrNQKBgQDJc/A1nz2yYiLUHUMJn2DhyTrOnCSclmowuzJVkyuo5gQPfZ3dTmjdPkM/fg09J3+zi3UCSwZd6dGMzJVHWooMniSiomZ/rY+o9SVTAJOjxt29N8jFN92b3fB43hbAWyBOuy4NMZMcr+4cADuqRHz2pKAeaALiZdpTbrTCzVXtqwKBgQC1QGS0sv8VU9fyBCyrYU4kQh8Fcvz0g6ObgUnHZi6UIL+Cy0/3JIGeIyvB/n47RF1wLUz4wykwW70e1qlMz7w21HM+DB8fVuzbO7SmQI3gDo024kQkWWGUhe3/w9ztzLF9ezleSN6wnrPeDbeMV+pURbsxIXA9xg7DYpZZ76ksHwKBgHQnF/oi7bTbpo88q/lxXq/wkaqtFuL+Sw378UKsD4Fb1j2ERTBj1Ey0aJvENyfqjVPddcKztWESvtL65pt0laI+0IrBLm4xiWJ2rmWUMIw+zn0aG/Wyh2Emb0+RZfbU0+TxQdUzn0nsGlMkw0IiKRcgxn2hpQAaj+6JJ0omkIPvAoGAZ2eGTKT17Cf6QgNprJiF6R+j7QruD11uoJABFHZSSoXoXGk7hMbZ/+sW0sUrJQrat93QVPeabxFXctmKmtzFBw7rdFGcC9gepvCIHnUju9jxbYdm0sn/ZqmF323RhAVMmUcMsqKmEWNpQFzZA4NAl7V0lxH5o/RzhbqgBk05WYcCgYEAny/umQs7+NYgwL/FztMJVljfQsGY81mhgrQyPhmg/7NiWmLodJtwQgSj3UitDVtUGhZRnuidO8P1XW0sUyDwc8xMLb+0qVxX4gMpM4J1B0UaIp+oPg7hCXeFGxkWQl8bPY0RFa3GOfT2/D63NpXqYw8Fe1lZWoIMz+PBdx0YN90=" \ No newline at end of file diff --git a/school_lend_back_end/src/main/resources/mapper/AttributeMapper.xml b/school_lend_back_end/src/main/resources/mapper/AttributeMapper.xml new file mode 100644 index 0000000..6bfdba5 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/AttributeMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + id,businessId,specificationsId, + attributeName,attributeStatus,createTime, + updateTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/BusinessAuthMapper.xml b/school_lend_back_end/src/main/resources/mapper/BusinessAuthMapper.xml new file mode 100644 index 0000000..5e9e65b --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/BusinessAuthMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + id,businessId,shopkeeper, + license,frontIdCard,backIdCard, + bankCard,createTime,updateTime, + isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/BusinessLevelMapper.xml b/school_lend_back_end/src/main/resources/mapper/BusinessLevelMapper.xml new file mode 100644 index 0000000..9f198e2 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/BusinessLevelMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,businessId,averageScore, + level,createTime,updateTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/BusinessMapper.xml b/school_lend_back_end/src/main/resources/mapper/BusinessMapper.xml new file mode 100644 index 0000000..0650c87 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/BusinessMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id,userId,businessName, + businessAvatar,address,businessProfile, + businessImages,categoryId,startBusiness, + endBusiness,state,storeStatus, + createTime,updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/BusinessinfoMapper.xml b/school_lend_back_end/src/main/resources/mapper/BusinessinfoMapper.xml new file mode 100644 index 0000000..2a0f048 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/BusinessinfoMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + id,businessId,content, + createTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/CartMapper.xml b/school_lend_back_end/src/main/resources/mapper/CartMapper.xml new file mode 100644 index 0000000..0151134 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/CartMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + id,userId,businessId, + createTime,updateTime,dishesId, + quantity,price,subtotal, + selectedOptions,isDeleted + + diff --git a/school_lend_back_end/src/main/resources/mapper/CategoryMapper.xml b/school_lend_back_end/src/main/resources/mapper/CategoryMapper.xml new file mode 100644 index 0000000..fda684a --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/CategoryMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + id,name,image, + createTime,updateTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/CollectMapper.xml b/school_lend_back_end/src/main/resources/mapper/CollectMapper.xml new file mode 100644 index 0000000..2dea6e2 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/CollectMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,userId,businessId + + diff --git a/school_lend_back_end/src/main/resources/mapper/DishesGroupMapper.xml b/school_lend_back_end/src/main/resources/mapper/DishesGroupMapper.xml new file mode 100644 index 0000000..509a342 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/DishesGroupMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + id,businessId,groupName, + isTopping,createTime,updateTime, + isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/DishesMapper.xml b/school_lend_back_end/src/main/resources/mapper/DishesMapper.xml new file mode 100644 index 0000000..65fdb52 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/DishesMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + id,businessId,dishesGroupId, + dishesName,dishesImage,dishesPrice, + packPrice,inventoryStatus,status, + createTime,updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/ErrandAuthMapper.xml b/school_lend_back_end/src/main/resources/mapper/ErrandAuthMapper.xml new file mode 100644 index 0000000..54530f7 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/ErrandAuthMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + id,errandId,bankCard, + frontIdCard,backIdCard,healthCertificate, + certificateStartTime,certificateEndTime,createTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/ErrandBillMapper.xml b/school_lend_back_end/src/main/resources/mapper/ErrandBillMapper.xml new file mode 100644 index 0000000..270968a --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/ErrandBillMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,orderId,username, + income,errandState,orderStartTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/ErrandIncomeMapper.xml b/school_lend_back_end/src/main/resources/mapper/ErrandIncomeMapper.xml new file mode 100644 index 0000000..8f762d9 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/ErrandIncomeMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,errandId,orderId, + income,state,createTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/ErrandLevelMapper.xml b/school_lend_back_end/src/main/resources/mapper/ErrandLevelMapper.xml new file mode 100644 index 0000000..2e7dba6 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/ErrandLevelMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + id,errandId, + averageScore,level,createTime, + updateTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/ErrandMapper.xml b/school_lend_back_end/src/main/resources/mapper/ErrandMapper.xml new file mode 100644 index 0000000..fa19362 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/ErrandMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + id,userId,errandName,errandAvatarUrl, + gender,errandPhone,distributionScope, + state,totalOrders,maxOrders,totalPrice, + createTime,updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/ErrandOrderMapper.xml b/school_lend_back_end/src/main/resources/mapper/ErrandOrderMapper.xml new file mode 100644 index 0000000..2b62ec9 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/ErrandOrderMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + id,orderId,errandState, + startTime,endTime,errandId, + createTime,updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/OrderDetailsMapper.xml b/school_lend_back_end/src/main/resources/mapper/OrderDetailsMapper.xml new file mode 100644 index 0000000..da4c22e --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/OrderDetailsMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + id,orderId,dishesId, + quantity,price,subtotal, + attributeNames,createTime,updateTime, + isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/OrderImageMapper.xml b/school_lend_back_end/src/main/resources/mapper/OrderImageMapper.xml new file mode 100644 index 0000000..83e8c2f --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/OrderImageMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + orderId,imageAddress + + diff --git a/school_lend_back_end/src/main/resources/mapper/OrderRefundsMapper.xml b/school_lend_back_end/src/main/resources/mapper/OrderRefundsMapper.xml new file mode 100644 index 0000000..d8f24bf --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/OrderRefundsMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + id,orderId,userId, + reason,amount,status, + createTime,updateTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/OrdersMapper.xml b/school_lend_back_end/src/main/resources/mapper/OrdersMapper.xml new file mode 100644 index 0000000..cedee3f --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/OrdersMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id,pickupCode,userName, + phone,userId,businessId, + errandId,location, + totalPrice,pickupMethod, + payMethod,pickupTime,notes, + state,createTime, + updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/PrivateMessageMapper.xml b/school_lend_back_end/src/main/resources/mapper/PrivateMessageMapper.xml new file mode 100644 index 0000000..f5fd8ae --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/PrivateMessageMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + id,from_userAccount,to_userAccount, + orderId,message,from_user_deleted, + to_user_deleted + + diff --git a/school_lend_back_end/src/main/resources/mapper/SpecificationsDishesMapper.xml b/school_lend_back_end/src/main/resources/mapper/SpecificationsDishesMapper.xml new file mode 100644 index 0000000..64679b2 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/SpecificationsDishesMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,dishesId,specificationsId, + createTime,updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/SpecificationsMapper.xml b/school_lend_back_end/src/main/resources/mapper/SpecificationsMapper.xml new file mode 100644 index 0000000..0333f2b --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/SpecificationsMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,businessId,specificationsName, + createTime,updateTime,isDelete + + diff --git a/school_lend_back_end/src/main/resources/mapper/SysteminfoMapper.xml b/school_lend_back_end/src/main/resources/mapper/SysteminfoMapper.xml new file mode 100644 index 0000000..6d67beb --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/SysteminfoMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + id,type,content, + createTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/SystemlogMapper.xml b/school_lend_back_end/src/main/resources/mapper/SystemlogMapper.xml new file mode 100644 index 0000000..b96f02c --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/SystemlogMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + id,userId,content, + ip,createTime + + diff --git a/school_lend_back_end/src/main/resources/mapper/UserMapper.xml b/school_lend_back_end/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..b6d59e4 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id,username,userAccount, + avatarUrl,gender,userPassword, + phone,email,userStatus, + createTime,updateTime,isDelete, + userRole + + + + diff --git a/school_lend_back_end/src/main/resources/mapper/UserRatingMapper.xml b/school_lend_back_end/src/main/resources/mapper/UserRatingMapper.xml new file mode 100644 index 0000000..71c6114 --- /dev/null +++ b/school_lend_back_end/src/main/resources/mapper/UserRatingMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + id,ratedEntityId, + ratedEntityType,userId, + orderId,rating,review, + businessReview,createTime + + diff --git a/school_lend_back_end/src/main/resources/static/index.html b/school_lend_back_end/src/main/resources/static/index.html new file mode 100644 index 0000000..89bb8ba --- /dev/null +++ b/school_lend_back_end/src/main/resources/static/index.html @@ -0,0 +1,6 @@ + + +

hello word!!!

+

this is a html page

+ + \ No newline at end of file diff --git a/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/Test.java b/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/Test.java new file mode 100644 index 0000000..fb26e31 --- /dev/null +++ b/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/Test.java @@ -0,0 +1,21 @@ +package com.bsz.school_send_back_end; + +import com.bsz.school_send_back_end.contant.UserConstant; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.DigestUtils; + + + +@SpringBootTest +public class Test { + + @org.junit.Test + public void password() { + String pas1 = "Hzn040128@"; + String pas2 = "Ryx040813@"; + String pas3 = "Zxr040805@"; + System.out.println(DigestUtils.md5DigestAsHex((UserConstant.USER_SALT + pas1).getBytes())); + System.out.println(DigestUtils.md5DigestAsHex((UserConstant.USER_SALT + pas2).getBytes())); + System.out.println(DigestUtils.md5DigestAsHex((UserConstant.USER_SALT + pas3).getBytes())); + } +} diff --git a/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/UserCenterApplicationTests.java b/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/UserCenterApplicationTests.java new file mode 100644 index 0000000..a780bb9 --- /dev/null +++ b/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/UserCenterApplicationTests.java @@ -0,0 +1,14 @@ +package com.bsz.school_send_back_end; + +import com.bsz.school_send_back_end.utils.UniqueNumberGenerator; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class UserCenterApplicationTests { + + public static void main(String[] args) { + System.out.println(UniqueNumberGenerator.generateNumber()); + } + +} diff --git a/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/model/dto/business/BusinessAddRequest.java b/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/model/dto/business/BusinessAddRequest.java new file mode 100644 index 0000000..0a0f3b5 --- /dev/null +++ b/school_lend_back_end/src/test/java/com/bsz/school_send_back_end/model/dto/business/BusinessAddRequest.java @@ -0,0 +1,4 @@ +package com.bsz.school_send_back_end.model.dto.business; + +public class BusinessAddRequest { +}