Compare commits

..

11 Commits
v0.0.1 ... main

Author SHA1 Message Date
bce1748768 适配ssl证书 2025-05-26 09:54:44 +08:00
39f397fd70 修改ssl证书配置 2025-05-25 09:00:42 +08:00
e9f6a219c6 添加注解 2025-05-23 20:04:24 +08:00
c5f84d2f05 更新版本 2025-05-14 13:09:50 +08:00
530f0fb620 更新作者和创建时间 2025-05-12 18:42:05 +08:00
30e68a1c6b 更新版本 2025-05-12 15:21:36 +08:00
251e98bb68 校快送2024.12.16.v0.0.7 2024-12-18 14:46:22 +08:00
947b94418b 校快送 2024.12.10 v0.0.6 2024-12-11 14:00:25 +08:00
f0debc7d38 校快送 2024.12.5 v0.0.5 2024-12-03 15:51:21 +08:00
65420d9f9e 校快送 2024.11.19 v0.0.4 2024-11-19 19:00:01 +08:00
32e7432ba1 修复bug054 2024-11-11 08:31:23 +08:00
322 changed files with 9298 additions and 1633 deletions

View File

@ -1,136 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bsz</groupId>
<artifactId>school_send_back_end</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>school_send_back_end</name>
<description>school_send_back_end</description>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.0.ALL</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<!--日期工具栏依赖-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!-- https://doc.xiaominfo.com/knife4j/documentation/get_start.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.4</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

Binary file not shown.

View File

@ -0,0 +1,289 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/>
</parent>
<groupId>com.bsz</groupId>
<artifactId>school_send_back_end</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>school_send_back_end</name>
<description>school_send_back_end</description>
<properties>
<java.version>17</java.version>
<spring-ai.version>1.0.0-M2</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.0.ALL</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version> <!-- 推荐稳定版 -->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.21</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.5.12</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.109.Final</version>
</dependency>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>sensitive-word</artifactId>
<version>0.23.0</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version> <!-- 或使用其他 Jakarta 版本,根据需要 -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.websocket</groupId>
<artifactId>jakarta.websocket-api</artifactId>
<version>2.1.0</version> <!-- 使用 Jakarta 版本的 WebSocket API -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version> <!-- 或者选择最新的兼容版本 -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-core</artifactId>
<version>2.2.20</version>
</dependency>
<!--阿里AI-->
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
<version>1.0.0-M2.1</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/release</url>
</repository>
<repository>
<id>knife4j</id>
<url>https://s01.oss.sonatype.org/content/repositories/releases/</url>
</repository>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestone Repository</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -4,22 +4,22 @@ use school_send;
create table user
(
username varchar(256) null comment '用户昵称',
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-管理员',
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;
@ -174,12 +174,14 @@ create table if not exists orders
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已取消',
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 '是否删除',
@ -221,9 +223,10 @@ create table if not exists cart
) comment '购物车表' collate = utf8mb4_unicode_ci;
create table demo(
id int auto_increment primary key ,
name varchar(30) comment '姓名',
create table demo
(
id int auto_increment primary key,
name varchar(30) comment '姓名',
detail varchar(256) comment '详情'
);
@ -234,4 +237,155 @@ create table if not exists systemInfo
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;
) 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;

View File

@ -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();
}
}

View File

@ -15,8 +15,9 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* 权限校验 AOP
@ -33,9 +34,15 @@ public class AuthInterceptor {
*/
@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);
// 必须有该权限才通过
@ -62,13 +69,23 @@ public class AuthInterceptor {
}
// 必须有商家或管理员权限
if (UserRoleEnum.BUSINESS.equals(mustUserRoleEnum)) {
if (!mustRole.equals(userRole)
&& !UserConstant.ADMIN_ROLE.equals(userRole)
&&!UserConstant.BOSS_ROLE.equals(userRole)) {
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();
}

View File

@ -19,8 +19,8 @@ import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
/**
* 日志AOP
@ -41,12 +41,18 @@ public class SystemLogInterceptor {
*/
@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);
//写入系统日志

View File

@ -1,31 +1,24 @@
package com.bsz.school_send_back_end.common;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
*通用返回类
*
* @author bsz
*/
@Data
@Schema(description = "通用返回对象")
public class BaseResponse<T> 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) {

View File

@ -12,6 +12,7 @@ public enum ErrorCode {
NOT_LOGIN(40100, "未登录", ""),
NO_AUTH(40101, "无权限", ""),
NOT_FOUND_ERROR(40400,"请求数据不存在",""),
FORBIDDEN_ERROR(40300, "禁止访问",""),
SYSTEM_ERROR(50000, "系统内部异常", ""),
OPERATION_ERROR(50001, "操作失败", "");

View File

@ -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<Void, List<BusinessVO>> getBusinessByAI() {
List<BusinessVO> allBusiness = businessService.findAllBusiness();
return unused -> allBusiness.stream()
.filter(businessVO -> businessVO.getLevel() == 5)
.toList();
}
// @Bean
// @Description("推荐菜品")
// public Function<Void, List<Dishes>> getDishesByAI() {
// new LocalTime
// }
}

View File

@ -3,7 +3,7 @@ package com.bsz.school_send_back_end.config;
import com.alipay.api.internal.util.AlipaySignature;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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.key1").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<String, Object> 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();
}
}

View File

@ -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;
}

View File

@ -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<Object> 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;
}
}

View File

@ -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);
}
}

View File

@ -14,7 +14,7 @@ public interface FileConstant {
/**
* 服务器访问地址
*/
String SERVER_HOST = "154.8.193.216:9494";
String SERVER_HOST = "https://xiaoshitong.xyz";
/**
* 服务器上传路径

View File

@ -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<Long> DELAY_MILLIS = List.of(10000L, 10000L, 10000L, 15000L, 15000L, 30000L, 30000L, 60000L, 60000L, 120000L, 300000L, 600000L, 600000L));
// 堂食订单取消3分钟
List<Long> DINE_IN_DELAY_MILLIS = List.of(30000L, 30000L, 30000L, 30000L, 30000L, 30000L);
// 外卖订单退款30分钟多次检查
List<Long> 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";
//
}

View File

@ -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";
}

View File

@ -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<String> VALID_LOCATIONS = Set.of("1公寓", "2公寓", "3公寓","4公寓","5公寓","6公寓",
"7公寓","8公寓","9公寓","10公寓","11公寓","12公寓","育才大厦");
/**
* 公寓配送费
*/
Map<String, BigDecimal> 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;
}

View File

@ -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";
}

View File

@ -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<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "介绍自己") String message) {
Flux<String> 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]"));
}
}

View File

@ -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<List<ErrandBill>> listBillByErrand(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Orders::getErrandId, loginErrand.getId());
List<Orders> ordersList = ordersService.list(wrapper);
// 如果订单列表为空直接返回空结果
if (ordersList.isEmpty()) {
return ResultUtils.success(Collections.emptyList());
}
List<Long> orderIds = ordersList.stream()
.map(Orders::getId)
.collect(Collectors.toList());
LambdaQueryWrapper<ErrandBill> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ErrandBill::getOrderId, orderIds);
queryWrapper.orderByDesc(ErrandBill::getOrderStartTime);// orderStartTime 降序排序
List<ErrandBill> bills = billService.list(queryWrapper);
return ResultUtils.success(bills);
}
}

View File

@ -1,7 +1,9 @@
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;
@ -12,6 +14,7 @@ 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;
@ -21,23 +24,28 @@ 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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
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")
@ -52,6 +60,9 @@ public class BusinessController {
@Resource
private UserService userService;
@Resource
private CollectService collectService;
@PostMapping("/add")
public BaseResponse<Long> addBusiness(@RequestBody BusinessAddRequest businessAddRequest) {
@ -65,7 +76,7 @@ public class BusinessController {
BeanUtils.copyProperties(businessAddRequest, businessAuth);
//对每个应该校验的业务进行校验
businessService.validUser(user, true);
userService.validUser(user, true);
businessService.validBusiness(business, true);
businessService.validBusinessAuth(businessAuth, true);
@ -152,7 +163,7 @@ public class BusinessController {
*/
@GetMapping("/getById")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<BusinessAdminVO> getBusinessById(long id) {
public BaseResponse<BusinessAdminVO> getBusinessById(@RequestParam Long id) {
if (id <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
@ -179,9 +190,9 @@ public class BusinessController {
* 查询所有商家
*/
@PostMapping("/list")
public BaseResponse<List<Business>> listBusinessAll(){
List<Business> businessList = businessService.list();
return new BaseResponse<>(0,businessList,"查询成功");
public BaseResponse<List<BusinessVO>> listBusinessAll(){
List<BusinessVO> business = businessService.findAllBusiness();
return new BaseResponse<>(0,business,"查询成功");
}
@ -207,8 +218,6 @@ public class BusinessController {
ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
QueryWrapper<Business> queryWrapper = businessService.getQueryWrapper(businessQueryRequest);
// 只显示正常营业商家
queryWrapper.eq("state", 1);
Page<Business> businessPage = businessService.page(new Page<>(current, size), queryWrapper);
Page<BusinessVO> businessVOPage = new Page<>(current, size, businessPage.getTotal());
List<BusinessVO> businessVOList = businessService.getBusinessVO(businessPage.getRecords());
@ -216,6 +225,22 @@ public class BusinessController {
return ResultUtils.success(businessVOPage);
}
@GetMapping("/my/getById")
@AuthCheck(mustRole = DEFAULT_ROLE)
public BaseResponse<BusinessVO> getBusinessVO (@RequestParam Long businessId, HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
LambdaQueryWrapper<Business> 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.<Collect>lambdaQuery()
.eq(Collect::getUserId, loginUser.getId())
.eq(Collect::getBusinessId, businessId));
businessVO.setIsCollected(collect > 0);
return ResultUtils.success(businessVO);
}
}

View File

@ -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<Boolean> 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<Boolean> 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<Businessinfo> 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<List<Businessinfo>> selectMyInfo (HttpServletRequest request) {
Business loginBusiness = businessService.getLoginBusiness(request);
Long businessId = loginBusiness.getId();
LambdaQueryWrapper<Businessinfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Businessinfo::getBusinessId, businessId);
queryWrapper.orderByDesc(Businessinfo::getCreateTime);
List<Businessinfo> list = businessinfoService.list(queryWrapper);
return ResultUtils.success(list, "查询成功");
}
/**
* 查询公列表仅管理员 分页
* @param infoQueryRequest 查询请求体
* @return 查询列表
*/
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<Businessinfo>> selectInfoByPage (@RequestBody InfoQueryRequest infoQueryRequest) {
if (infoQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long current = infoQueryRequest.getCurrent();
long pageSize = infoQueryRequest.getPageSize();
QueryWrapper<Businessinfo> queryWrapper = businessinfoService.getQueryWrapper(infoQueryRequest);
Page<Businessinfo> page = businessinfoService.page(new Page<>(current, pageSize), queryWrapper);
return ResultUtils.success(page, "查询成功");
}
/**
* 用户查询商家最新公告
* @return 查询列表
*/
@PostMapping("/list")
public BaseResponse<Businessinfo> selectInfo (@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = commonRequest.getId();
LambdaQueryWrapper<Businessinfo> 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, "查询成功");
}
}

View File

@ -15,21 +15,20 @@ 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.util.CollectionUtils;
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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "购物车接口")
@RestController
@Slf4j
@RequestMapping("/cart")
@ -120,7 +119,7 @@ public class CartController {
queryWrapper.eq(Cart::getBusinessId, businessId);
queryWrapper.eq(Cart::getUserId, userId);
List<Cart> cartList = cartService.list(queryWrapper);
List<CartVO> cartVOList = this.getCartVOList(cartList);
List<CartVO> cartVOList = cartService.getCartVOList(cartList);
return ResultUtils.success(cartVOList);
}
@ -137,7 +136,7 @@ public class CartController {
wrapper.eq(Cart::getUserId, userId);
List<Cart> cartList = cartService.list(wrapper);
List<CartVO> cartVOList = this.getCartVOList(cartList);
List<CartVO> cartVOList = cartService.getCartVOList(cartList);
return ResultUtils.success(cartVOList);
}
@ -182,15 +181,4 @@ public class CartController {
return ResultUtils.success(true);
}
private List<CartVO> getCartVOList(List<Cart> cartList) {
if (CollectionUtils.isEmpty(cartList)) {
return new ArrayList<>();
}
return cartList.stream().map(item ->{
CartVO cartVO = new CartVO();
BeanUtils.copyProperties(item, cartVO);
return cartVO;
}).collect(Collectors.toList());
}
}

View File

@ -15,13 +15,15 @@ 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 javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
@Tag(name = "餐厅接口")
@Slf4j
@RestController
@RequestMapping("/category")

View File

@ -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<Boolean> 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<Boolean> 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<Collect> 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<Boolean> deleteCollectAll(HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
Long loginUserId = loginUser.getId();
LambdaQueryWrapper<Collect> 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<List<CollectVO>> listCollect(HttpServletRequest request) {
List<CollectVO> collectList = collectService.getCollectList(request);
if (collectList == null) {
collectList = new ArrayList<>();
}
return ResultUtils.success(collectList);
}
}

View File

@ -23,16 +23,18 @@ 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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Tag(name = "菜品接口")
@Slf4j
@RestController
@RequestMapping("/dishes")

View File

@ -21,6 +21,7 @@ import com.bsz.school_send_back_end.model.dto.DishesGroup.DishesGroupUpdateReque
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;
@ -29,10 +30,11 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Tag(name = "菜品分组接口")
@Slf4j
@RestController
@RequestMapping("/dishesGroup")

View File

@ -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<Boolean> addErrandAuth(@RequestBody ErrandAuthAddRequest addRequest) {
if (addRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long errandId = addRequest.getErrandId();
LambdaQueryWrapper<ErrandAuth> 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<Boolean> 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<ErrandAuth> 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<Page<ErrandAuth>> listErrandAuthByPage(@RequestBody ErrandAuthQueryRequest errandAuthQueryRequest) {
if (errandAuthQueryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long pageSize = errandAuthQueryRequest.getPageSize();
long current = errandAuthQueryRequest.getCurrent();
QueryWrapper<ErrandAuth> queryWrapper = errandAuthService.getQueryWrapper(errandAuthQueryRequest);
Page<ErrandAuth> page = errandAuthService.page(new Page<>(current, pageSize),queryWrapper);
return ResultUtils.success(page);
}
@GetMapping("/getErrandAuthById")
public BaseResponse<ErrandAuth> getErrandAuthById (String errandId) {
Long errandId1 = Long.valueOf(errandId);
ErrandAuth errandAuth = errandAuthService.getErrandAuth(errandId1);
return ResultUtils.success(errandAuth);
}
@PostMapping("/get/my")
public BaseResponse<ErrandAuth> getMyErrandAuth (HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
Long id = loginErrand.getId();
LambdaQueryWrapper<ErrandAuth> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandAuth::getErrandId, id);
ErrandAuth errandAuth = errandAuthService.getOne(queryWrapper);
ThrowUtils.throwIf(errandAuth == null, ErrorCode.OPERATION_ERROR, "当前跑腿为认证");
return ResultUtils.success(errandAuth);
}
}

View File

@ -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<Boolean> 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<Boolean> deleteErrand (HttpServletRequest request){
errandService.deleteErrand(request);
return ResultUtils.success(true);
}
/**
* 修改跑腿信息(管理员)
* @param updateRequest 修改请求体
* @return 是否修改成功
*/
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> 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<Boolean> 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<List<Errand>> listErrand() {
List<Errand> list = errandService.list();
return ResultUtils.success(list);
}
/**
* 分页获取跑腿信息列表
* @param queryRequest 查询请求体
* @return 跑腿信息分页
*/
@PostMapping("/page")
@AuthCheck(mustRole = ADMIN_ROLE)
public BaseResponse<Page<Errand>> listErrandByPage (@RequestBody ErrandQueryRequest queryRequest) {
if (queryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long pageSize = queryRequest.getPageSize();
long current = queryRequest.getCurrent();
QueryWrapper<Errand> queryWrapper = errandService.getQueryWrapper(queryRequest);
Page<Errand> 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<Boolean> 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.<ErrandOrder>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<Boolean> 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<ErrandVO> 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<List<OrdersVO>> listOrdersByErrand(Integer errandState, HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
String distributionScope = loginErrand.getDistributionScope();
// 创建 errand_order 表的查询条件
LambdaQueryWrapper<ErrandOrder> 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<ErrandOrder> errandOrderList = errandOrderService.list(errandOrderQueryWrapper);
// 获取符合条件的 orderId 列表
List<Long> orderIds = errandOrderList.stream().map(ErrandOrder::getOrderId).collect(Collectors.toList());
// 如果没有符合条件的订单则返回空
if (orderIds.isEmpty()) {
return ResultUtils.success(Collections.emptyList());
}
// 查询 orders 获取相关订单信息
LambdaQueryWrapper<Orders> ordersQueryWrapper = new LambdaQueryWrapper<>();
ordersQueryWrapper.in(Orders::getId, orderIds);
ordersQueryWrapper.eq(Orders::getLocation, distributionScope);
// 获取订单数据
List<Orders> ordersList = ordersService.list(ordersQueryWrapper);
List<OrdersVO> 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<ErrandVO> getErrandById (String errandId1) {
Long errandId = Long.valueOf(errandId1);
Errand errand = errandService.getOne(Wrappers.<Errand>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);
}
}

View File

@ -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<Long> countIncomeNumber(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId());
long count = errandIncomeService.count(queryWrapper);
return ResultUtils.success(count);
}
@PostMapping("/count/money")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<BigDecimal> countIncomeMoney(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId());
queryWrapper.eq(ErrandIncome::getState, 1);
List<ErrandIncome> 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<BigDecimal> 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<List<ErrandIncome>> 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<ErrandIncome> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandIncome::getErrandId, errandId);
List<ErrandIncome> list = errandIncomeService.list(queryWrapper);
if (list == null) {
list = new ArrayList<>();
}
return ResultUtils.success(list);
}
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ERRAND_ROLE)
public BaseResponse<Page<ErrandIncome>> listErrandIncomeByPage(@RequestBody ErrandIncomeQueryRequest queryRequest) {
if (queryRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
long pageSize = queryRequest.getPageSize();
long current = queryRequest.getCurrent();
QueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getWrapper(queryRequest);
Page<ErrandIncome> 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<BigDecimal> countIncomeMoneyNo(HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
LambdaQueryWrapper<ErrandIncome> queryWrapper = errandIncomeService.getQueryWrapper(loginErrand.getId());
queryWrapper.eq(ErrandIncome::getState, 0);
List<ErrandIncome> list = errandIncomeService.list(queryWrapper);
BigDecimal price = list.stream().map(ErrandIncome::getIncome).reduce(BigDecimal.ZERO, BigDecimal::add);
return ResultUtils.success(price);
}
}

View File

@ -10,13 +10,14 @@ 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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
@ -24,6 +25,7 @@ import java.util.Arrays;
/**
* 文件上传
*/
@Tag(name = "文件上传接口")
@Slf4j
@RestController
@RequestMapping("/file")
@ -67,7 +69,7 @@ public class FileController {
}
@PostMapping("/upload/server")
public BaseResponse<String> uploadServerFile(@RequestPart("file") MultipartFile multipartFile, UploadFileRequest uploadFileRequest, HttpServletRequest request) {
public BaseResponse<String> uploadServerFile(@RequestPart("file") MultipartFile multipartFile, UploadFileRequest uploadFileRequest, HttpServletRequest request) {
// 获取业务名称
String biz = uploadFileRequest.getBiz();
FileUploadBizEnum fileUploadBizEnum = FileUploadBizEnum.getEnumByValue(biz);
@ -125,23 +127,4 @@ public class FileController {
}
}
}

View File

@ -0,0 +1,630 @@
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<Long> 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<OrderDetailAddRequest> detailAddRequest = orderAddRequest.getOrderDetailAddRequest();
List<OrderDetails> 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<Boolean> 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<OrdersVO> 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<OrdersVO> 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.<Orders>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<Page<Orders>> listOrdersByPage(@RequestBody OrderQueryRequest orderQueryRequest) {
long current = orderQueryRequest.getCurrent();
long size = orderQueryRequest.getPageSize();
Page<Orders> ordersPage = ordersService.page(new Page<>(current, size),
ordersService.getQueryWrapper(orderQueryRequest));
return ResultUtils.success(ordersPage);
}
/**
* 获取我的订单
*/
@PostMapping("/my/page")
public BaseResponse<Page<OrdersVO>> 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<Orders> 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<Orders> ordersPage = ordersService.page(new Page<>(current, size),
queryWrapper);
Page<OrdersVO> ordersVOPage = new Page<>(current, size, ordersPage.getTotal());
List<OrdersVO> ordersVOList = ordersService.getOrdersVO(ordersPage.getRecords());
ordersVOPage.setRecords(ordersVOList);
return ResultUtils.success(ordersVOPage);
}
/**
* 订单统计
*/
@PostMapping("/count")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<String> 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<Orders> 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<List<BigDecimal>> 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<BigDecimal> 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<Orders> queryWrapper = ordersService.getQueryWrapper(orderQueryRequest);
List<Orders> orderList = ordersService.list(queryWrapper);
BigDecimal money = new BigDecimal("0");
for (Orders order : orderList) {
money = money.add(order.getTotalPrice());
}
moneyCountList.add(money);
}
} else {
QueryWrapper<Orders> queryWrapper = ordersService.getQueryWrapper(orderQueryRequest);
List<Orders> 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<List<Long>> 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<Long> 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<Orders> queryWrapper = ordersService.getQueryWrapper(orderQueryRequest);
long count = ordersService.count(queryWrapper );
numberCountList.add(count);
}
} else {
QueryWrapper<Orders> 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<String> 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<Long> businessIdList = new ArrayList<>();
ThrowUtils.throwIf(StringUtils.isBlank(type), ErrorCode.PARAMS_ERROR);
if (categoryId != null || businessName != null || businessState != null) {
QueryWrapper<Business> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(businessName), "businessName", businessName);
wrapper.eq(businessState != null, "state", businessState);
wrapper.eq(categoryId != null, "categoryId", categoryId);
List<Business> businessList = businessService.list(wrapper);
if (CollectionUtils.isEmpty(businessList)) {
return ResultUtils.success("0");
}
businessIdList = businessList.stream().map(Business::getId).collect(Collectors.toList());
}
QueryWrapper<Orders> 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<Orders> wrapper = new QueryWrapper<>();
wrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime);
wrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime);
wrapper.eq("businessId", businessId).and(item -> item.eq("state", 1).or().eq("state", 2));
wrapper.orderBy(SqlUtils.validSortField(sortField), sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
sortField);
List<Orders> ordersList = ordersService.list(wrapper);
List<OrdersExcelVO> ordersExcelVOList = ordersList.stream().map(item -> {
OrdersExcelVO ordersExcelVO = new OrdersExcelVO();
BeanUtils.copyProperties(item, ordersExcelVO);
//改变订单支付状态
if (item.getState() == 1) {
ordersExcelVO.setState("已完成");
} else if (item.getState() == 2) {
ordersExcelVO.setState("已退款");
}
// 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<Boolean> deleteOrder (@RequestBody CommonRequest commonRequest, HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long orderId = commonRequest.getId();
LambdaQueryWrapper<Orders> 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<Orders> 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<Boolean> updateOrderState(@RequestBody CommonRequest commonRequest,HttpServletRequest request) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long id = commonRequest.getId();
LambdaQueryWrapper<Orders> 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<Orders> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(Orders::getState,4);
updateWrapper.eq(Orders::getId, id);
String location = orders.getLocation();
ErrandOrder errandOrder = errandOrderService.getOne(Wrappers.<ErrandOrder>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<Boolean> updateOrder(@RequestBody OrderUpdateRequest orderUpdateRequest, HttpServletRequest request) {
return ResultUtils.success(ordersService.OrderToUpdate(orderUpdateRequest, request));
}
@PostMapping("/update/state/user")
public BaseResponse<Boolean> 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<ErrandIncome> 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<List<OrderErrandVO>> listOrderErrandVO (HttpServletRequest request) {
Errand loginErrand = errandService.getLoginErrand(request);
Long errandId = loginErrand.getId();
List<ErrandOrder> errandOrders = errandOrderService.list(Wrappers.<ErrandOrder>lambdaQuery()
.eq(ErrandOrder::getErrandId, errandId)
.eq(ErrandOrder::getErrandState, 4));
List<Long> orderIds = errandOrders.stream()
.map(ErrandOrder::getOrderId)
.collect(Collectors.toList());
LambdaQueryWrapper<Orders> wrapper = new LambdaQueryWrapper<>();
wrapper.in(Orders::getId, orderIds);
List<Orders> ordersList = ordersService.list(wrapper);
List<OrderErrandVO> listOrderErrandVO = ordersService.getListOrderErrandVO(ordersList);
return ResultUtils.success(listOrderErrandVO);
}
@PostMapping("/list/status")
@AuthCheck(mustRole = UserConstant.DEFAULT_ROLE)
public BaseResponse<List<OrderStatusVO>> listOrderStatus (HttpServletRequest request) {
List<OrderStatusVO> liststatus = ordersService.liststatus(request);
return ResultUtils.success(liststatus);
}
@PostMapping("/list/numnber")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<List<OrdersPickVO>> getPickUpNum () {
List<OrdersPickVO> 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<Orders> 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<Orders> ordersList = ordersService.list(wrapper);
Collection<Long> orderIds = ordersList.stream()
.map(Orders::getId)
.collect(Collectors.toList());
//获取errandState
LambdaQueryWrapper<ErrandOrder> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.in(ErrandOrder::getOrderId, orderIds);
List<ErrandOrder> errandOrders = errandOrderService.list(wrapper1);
//先将errandOrder数据变成MAP提高查询效率
Map<Long, Integer> map = errandOrders.stream()
.collect(Collectors.toMap(ErrandOrder::getOrderId, ErrandOrder::getErrandState));
//获取跑腿收入
LambdaQueryWrapper<ErrandIncome> wrapper2 = new LambdaQueryWrapper<>();
wrapper2.in(ErrandIncome::getOrderId, orderIds);
List<ErrandIncome> errandIncomes = errandIncomeService.list(wrapper2);
Map<Long, BigDecimal> decimalMap = errandIncomes.stream()
.collect(Collectors.toMap(ErrandIncome::getOrderId, ErrandIncome::getIncome));
Collection<OrdersExcelByErrandVO> 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<BigDecimal> countErrand (@RequestBody OrdersCountByErrandRequest errandRequest) {
if (errandRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long errandId = errandRequest.getErrandId();
Integer state = errandRequest.getState();
LambdaQueryWrapper<ErrandIncome> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ErrandIncome::getErrandId, errandId);
queryWrapper.eq(ObjectUtils.isNotEmpty(state), ErrandIncome::getState, state);
List<ErrandIncome> 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<String> getStringBaseResponse(String type, String startTime, String endTime, QueryWrapper<Orders> queryWrapper) {
queryWrapper.ge(StringUtils.isNotBlank(startTime), "createTime", startTime);
queryWrapper.le(StringUtils.isNotBlank(endTime), "createTime", endTime);
if (type.equals("money")) {
List<Orders> 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不正确");
}
}
}

View File

@ -7,12 +7,13 @@ 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 javax.annotation.Resource;
import jakarta.annotation.Resource;
@Api(tags = "阿里云文件管理")
@Tag(name = "阿里云文件上传接口")
@RestController
@RequestMapping("/fileOss")
public class OssController {

View File

@ -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);
}
}

View File

@ -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<Boolean> 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<List<String>> listPrivateMessage(
@PathVariable("fromUserAccount") String fromUserAccount,
@PathVariable("toUserAccount") String toUserAccount) {
LambdaQueryWrapper<PrivateMessage> 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<PrivateMessage> list = privateMessageService.list(queryWrapper);
List<String> collect = list.stream().map(PrivateMessage::getMessage).collect(Collectors.toList());
return ResultUtils.success(collect);
}
/**
* 删除所有私聊聊天记录
*/
@PostMapping("/delete/{fromUserAccount}/{toUserAccount}")
public BaseResponse<Boolean> deleteAllMessage(
@PathVariable("fromUserAccount") String fromUserAccount,
@PathVariable("toUserAccount") String toUserAccount) {
// 更新当前用户的删除标志不影响另一个用户的查看状态
UpdateWrapper<PrivateMessage> 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.<User>lambdaQuery().eq(User::getUserAccount, fromUserAccount));
template.convertAndSend("/topic/ServerToClient.deleteMsg", fromUser);
return ResultUtils.success(true);
}
}

View File

@ -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<Boolean> addRefund(@RequestBody RefundAddRequest refundAddRequest, HttpServletRequest request) {
User loginUser = userService.getLoginUser(request);
Long orderId = refundAddRequest.getOrderId();
LambdaQueryWrapper<Orders> 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<List<OrderRefunds>> listRefundByBusiness(@RequestParam Integer status, HttpServletRequest request) {
Business loginBusiness = businessService.getLoginBusiness(request);
Long id = loginBusiness.getId();
LambdaQueryWrapper<OrderRefunds> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OrderRefunds::getStatus, status)
.inSql(OrderRefunds::getOrderId, "SELECT id FROM orders WHERE businessId = " + id); // 根据商家ID过滤订单
List<OrderRefunds> list = refundsService.list(queryWrapper);
return ResultUtils.success(list);
}
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> 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.<Orders>lambdaQuery()
.eq(Orders::getId, orderId));
ThrowUtils.throwIf(orders == null, ErrorCode.PARAMS_ERROR, "传入的订单id不正确");
ThrowUtils.throwIf(businessId.equals(orders.getBusinessId()), ErrorCode.PARAMS_ERROR, "当前订单不属于该商家");
LambdaQueryWrapper<OrderRefunds> 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<List<String>> 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<OrderRefunds> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.ge(OrderRefunds::getCreateTime, startOfDayDate);
queryWrapper.le(OrderRefunds::getCreateTime, endOfDayDate);
List<OrderRefunds> refunds = refundsService.list(queryWrapper);
List<String> collect = refunds.stream()
.map(OrderRefunds::getReason)
.collect(Collectors.toList());
return ResultUtils.success(collect);
}
}

View File

@ -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<String> sendCode (@PathVariable String phone) {
String code = (String) redisTemplate.opsForValue().get(phone);
log.info("获取验证码:{}", code);
if (code == null) {
String fourBitRandom = randomNumberGenerator.getFourBitRandom();
HashMap<String, Object> 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("请勿重复发送验证码");
}
}
}

View File

@ -32,8 +32,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
@Slf4j

View File

@ -7,10 +7,11 @@ 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.SystemDeleteRequest;
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;
@ -18,9 +19,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
@Tag(name = "公告与轮播图接口")
@RestController
@Slf4j
@RequestMapping("/system")
@ -49,12 +51,12 @@ public class SystemInfoController {
* 删除功能
*/
@PostMapping("/delete")
public BaseResponse<Boolean> deleteInfo (@RequestBody SystemDeleteRequest deleteRequest) {
if (deleteRequest == null) {
public BaseResponse<Boolean> deleteInfo (@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
boolean remove = systeminfoService.removeById(deleteRequest.getId());
boolean remove = systeminfoService.removeById(commonRequest.getId());
ThrowUtils.throwIf(!remove, ErrorCode.OPERATION_ERROR, "添加失败");
return ResultUtils.success(true,"删除成功");
}

View File

@ -15,6 +15,7 @@ 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;
@ -23,10 +24,11 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import jakarta.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "系统日志接口")
@RestController
@RequestMapping("/log")
@Slf4j

View File

@ -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<UserVO> 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<User>().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<String> 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<Orders> 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<Orders> 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.<OrderRefunds>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<String, String>
Map<String,String> params = new HashMap<>();Map<String, String[]> requestParams = request.getParameterMap();
for(String name : requestParams.keySet()) {
params.put(name, request.getParameter(name));
}
//修改订单信息
String out_trade_no = params.get("out_trade_no");
QueryWrapper<Orders> 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&notify_time=2019-03-29 19:42:04&subject=**电脑网站支付&sign_type=RSA2&charset=UTF-8&auth_app_id=201****222&notify_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&notify_id=20190329002221942040**8";
//编码格式
String charset="utf-8";
//签名方式
String sign_type="RSA2";
//对待签名字符串数据通过&进行拆分
String [] temp = resultInfo.split("&");
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
//把拆分数据放在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();
}
}
}

View File

@ -16,13 +16,14 @@ 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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@ -32,6 +33,7 @@ import static com.bsz.school_send_back_end.contant.UserConstant.*;
/**
* 用户接口
*/
@Tag(name = "用户接口")
@RestController
@RequestMapping("/user")
public class UserController {
@ -75,20 +77,21 @@ public class UserController {
* @return
*/
@PostMapping("/login")
public BaseResponse<LoginUserVO> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request) {
public BaseResponse<String> 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, "请求参数为空");
}
LoginUserVO loginUserVO = userService.userLogin(userAccount, userPassword, request);
return ResultUtils.success(loginUserVO);
String message = userService.userLogin(userAccount, userPassword, appName, request);
return ResultUtils.success(message);
}
/*
@ -285,7 +288,7 @@ public class UserController {
*/
@GetMapping("/getById")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<User> getUserById(long id, HttpServletRequest request) {
public BaseResponse<User> getUserById(@RequestParam long id) {
if (id <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}

View File

@ -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<Boolean> 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<Boolean> 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<List<UserRating>> 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<UserRating> list = userRatingService.list(Wrappers.<UserRating>lambdaQuery()
.eq(UserRating::getUserId, userId).eq(UserRating::getRatedEntityType, ratedEntityType) );
return ResultUtils.success(list);
}
/**
* 展示当前用户评分
* @param request 当前用户
* @return 评分列表
*/
@PostMapping("/list/user")
public BaseResponse<List<UserRating>> listUserRatingByUser (HttpServletRequest request) {
List<UserRating> userRatings = userRatingService.listUserRatingByUser(request);
return ResultUtils.success(userRatings);
}
@PostMapping("/business/reply")
@AuthCheck(mustRole = UserConstant.BUSINESS_ROLE)
public BaseResponse<Boolean> 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<UserRating> 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<List<UserRating>> listUserRatingByBusiness (@RequestBody CommonRequest commonRequest) {
if (commonRequest == null) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
Long businessId = commonRequest.getId();
List<UserRating> list = userRatingService.list(Wrappers.<UserRating>lambdaQuery()
.eq(UserRating::getRatedEntityId, businessId));
return ResultUtils.success(list);
}
}

View File

@ -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<Long> msg) {
Long orderId = msg.getData();
log.info("订单超时检查订单ID{}", orderId);
// 查询订单
LambdaQueryWrapper<Orders> 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<Long> msg) {
Long orderId = msg.getData();
log.info("外卖单超时检查订单ID{}", orderId);
// 查询订单
LambdaQueryWrapper<Orders> 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);
}
}
}

View File

@ -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<String, Object> 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<Long> newDelayMillis = new ArrayList<>(RabbitMQConstant.DINE_IN_DELAY_MILLIS);
// 延迟检查订单状态信息
MultiDelayMessage<Long> 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);
}
}

View File

@ -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("我走了哦~");
}
}

View File

@ -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);
}
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.BusinessAuth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表business_auth(商家认证)的数据库操作Mapper
* @createDate 2024-06-24 21:01:17
* @Entity com.bsz.school_send_back_end.model.domain.BusinessAuth
* @author xy
*/
public interface BusinessAuthMapper extends BaseMapper<BusinessAuth> {

View File

@ -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<BusinessLevel> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表business(商家)的数据库操作Mapper
* @createDate 2024-06-24 21:01:17
* @Entity com.bsz.school_send_back_end.model.domain.Business
* @author xy
*/
public interface BusinessMapper extends BaseMapper<Business> {

View File

@ -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<Businessinfo> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Cart;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表cart(购物车表)的数据库操作Mapper
* @createDate 2024-08-13 13:59:13
* @Entity com.bsz.school_send_back_end.model.domain.Cart
* @author xy
*/
public interface CartMapper extends BaseMapper<Cart> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Category;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表category(分类表)的数据库操作Mapper
* @createDate 2024-09-01 18:09:04
* @Entity com.bsz.school_send_back_end.model.domain.Category
* @author xy
*/
public interface CategoryMapper extends BaseMapper<Category> {

View File

@ -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<Collect> {
}

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.DishesGroup;
/**
* @author bsz
* @author xy
*/
public interface DishesGroupMapper extends BaseMapper<DishesGroup> {

View File

@ -5,10 +5,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.Dishes;
/**
* @author pc
* @description 针对表dishes(菜品表)的数据库操作Mapper
* @createDate 2024-06-29 17:23:31
* @Entity com.bsz.school_send_back_end.model.domain.Dishes
* @author xy
*/
public interface DishesMapper extends BaseMapper<Dishes> {

View File

@ -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<ErrandAuth> {
}

View File

@ -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<ErrandBill> {
}

View File

@ -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<ErrandIncome> {
}

View File

@ -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<ErrandLevel> {
}

View File

@ -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<Errand> {
}

View File

@ -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<ErrandOrder> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.OrderDetails;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表order_details(订单详情表)的数据库操作Mapper
* @createDate 2024-09-12 12:31:48
* @Entity com.bsz.school_send_back_end.model.domain.OrderDetails
* @author xy
*/
public interface OrderDetailsMapper extends BaseMapper<OrderDetails> {

View File

@ -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<OrderImage> {
}

View File

@ -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<OrderRefunds> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Orders;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Lenovo
* @description 针对表orders(订单表)的数据库操作Mapper
* @createDate 2024-09-12 12:31:49
* @Entity com.bsz.school_send_back_end.model.domain.Orders
* @author xy
*/
public interface OrdersMapper extends BaseMapper<Orders> {

View File

@ -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<PrivateMessage> {
}

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.SpecificationsDishes;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表specifications_dishes(菜品和规格的中间表)的数据库操作Mapper
* @createDate 2024-06-29 21:18:25
* @Entity generator.domain.SpecificationsDishes
* @author xy
*/
public interface SpecificationsDishesMapper extends BaseMapper<SpecificationsDishes> {

View File

@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bsz.school_send_back_end.model.domain.Specifications;
/**
* @author pc
* @description 针对表specifications(规格表)的数据库操作Mapper
* @createDate 2024-06-29 21:10:34
* @Entity com.bsz.school_send_back_end.model.domain.Specifications
* @author xy
*/
public interface SpecificationsMapper extends BaseMapper<Specifications> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Systeminfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表systeminfo(系统信息)的数据库操作Mapper
* @createDate 2024-09-23 19:16:42
* @Entity com.bsz.school_send_back_end.model.domain.Systeminfo
* @author xy
*/
public interface SysteminfoMapper extends BaseMapper<Systeminfo> {

View File

@ -4,10 +4,7 @@ import com.bsz.school_send_back_end.model.domain.Systemlog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author pc
* @description 针对表systemlog(系统信息)的数据库操作Mapper
* @createDate 2024-09-25 15:40:09
* @Entity com.bsz.school_send_back_end.model.domain.Systemlog
* @author xy
*/
public interface SystemlogMapper extends BaseMapper<Systemlog> {

View File

@ -6,10 +6,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* @author bsz
* @description 针对表user(用户)的数据库操作Mapper
* @createDate 2024-05-09 20:59:59
*
* @author xy
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {

View File

@ -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<UserRating> {
@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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -1,9 +1,6 @@
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 com.baomidou.mybatisplus.annotation.*;
import java.io.Serial;
import java.io.Serializable;
@ -72,6 +69,7 @@ public class Cart implements Serializable {
/**
* 是否删除
*/
@TableLogic
private Integer isDelete;
@Serial

View File

@ -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;
}

Some files were not shown because too many files have changed in this diff Show More