Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
836f0e1cbf | ||
|
|
44da3cab6e |
+5
-1
@@ -14,6 +14,7 @@ import cn.novalon.gym.manage.member.entity.MemberCard;
|
|||||||
import cn.novalon.gym.manage.member.entity.MemberCardRecord;
|
import cn.novalon.gym.manage.member.entity.MemberCardRecord;
|
||||||
import cn.novalon.gym.manage.member.repository.MemberCardRecordRepository;
|
import cn.novalon.gym.manage.member.repository.MemberCardRecordRepository;
|
||||||
import cn.novalon.gym.manage.member.repository.MemberCardRepository;
|
import cn.novalon.gym.manage.member.repository.MemberCardRepository;
|
||||||
|
import cn.novalon.gym.manage.member.repository.IMemberRepository;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.DisplayName;
|
import org.junit.jupiter.api.DisplayName;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -57,6 +58,9 @@ class CheckInModuleTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private IGroupCourseBookingService groupCourseBookingService;
|
private IGroupCourseBookingService groupCourseBookingService;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private IMemberRepository memberRepository;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private MemberCard mockMemberCard;
|
private MemberCard mockMemberCard;
|
||||||
|
|
||||||
@@ -72,7 +76,7 @@ class CheckInModuleTest {
|
|||||||
void setUp() {
|
void setUp() {
|
||||||
MockitoAnnotations.openMocks(this);
|
MockitoAnnotations.openMocks(this);
|
||||||
checkService = new CheckServiceImpl(qrCodeConfig, redisUtil, memberCardRecordRepository,
|
checkService = new CheckServiceImpl(qrCodeConfig, redisUtil, memberCardRecordRepository,
|
||||||
memberCardRepository, signInRecordRepository, groupCourseBookingService);
|
memberCardRepository, signInRecordRepository, groupCourseBookingService, memberRepository);
|
||||||
|
|
||||||
when(mockMemberCard.getId()).thenReturn(1L);
|
when(mockMemberCard.getId()).thenReturn(1L);
|
||||||
when(mockMemberCard.getMemberCardType()).thenReturn("TIME_CARD");
|
when(mockMemberCard.getMemberCardType()).thenReturn("TIME_CARD");
|
||||||
|
|||||||
+12
@@ -53,6 +53,10 @@ public class GroupCourseBooking extends BaseDomain {
|
|||||||
@Schema(description = "上课地点", example = "健身房A区")
|
@Schema(description = "上课地点", example = "健身房A区")
|
||||||
private String location;
|
private String location;
|
||||||
|
|
||||||
|
//封面图URL(非DB字段,由 Service 从 GroupCourse 填充)
|
||||||
|
@Schema(description = "封面图URL", example = "https://example.com/cover.jpg")
|
||||||
|
private String coverImage;
|
||||||
|
|
||||||
public Long getCourseId() {
|
public Long getCourseId() {
|
||||||
return courseId;
|
return courseId;
|
||||||
}
|
}
|
||||||
@@ -132,4 +136,12 @@ public class GroupCourseBooking extends BaseDomain {
|
|||||||
public void setLocation(String location) {
|
public void setLocation(String location) {
|
||||||
this.location = location;
|
this.location = location;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCoverImage() {
|
||||||
|
return coverImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCoverImage(String coverImage) {
|
||||||
|
this.coverImage = coverImage;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+13
@@ -7,6 +7,7 @@ import cn.novalon.gym.manage.groupcourse.handler.BookingSagaHandler;
|
|||||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseBookingRepository;
|
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseBookingRepository;
|
||||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
|
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
|
||||||
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseBookingService;
|
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseBookingService;
|
||||||
|
import cn.novalon.gym.manage.groupcourse.util.OSSUtil;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.r2dbc.core.DatabaseClient;
|
import org.springframework.r2dbc.core.DatabaseClient;
|
||||||
@@ -335,6 +336,18 @@ public class GroupCourseBookingService implements IGroupCourseBookingService {
|
|||||||
public Flux<GroupCourseBooking> getBookingsByMemberId(Long memberId) {
|
public Flux<GroupCourseBooking> getBookingsByMemberId(Long memberId) {
|
||||||
logger.debug("查询会员预约记录:memberId={}", memberId);
|
logger.debug("查询会员预约记录:memberId={}", memberId);
|
||||||
return bookingRepository.findByMemberId(memberId)
|
return bookingRepository.findByMemberId(memberId)
|
||||||
|
.flatMap(booking -> {
|
||||||
|
// 从关联的 GroupCourse 获取封面图并转为预签名URL
|
||||||
|
if (booking.getCourseId() != null) {
|
||||||
|
return courseRepository.findByIdAndDeletedAtIsNull(booking.getCourseId())
|
||||||
|
.map(course -> {
|
||||||
|
booking.setCoverImage(OSSUtil.toCoverPresignedUrl(course.getCoverImage()));
|
||||||
|
return booking;
|
||||||
|
})
|
||||||
|
.defaultIfEmpty(booking);
|
||||||
|
}
|
||||||
|
return Mono.just(booking);
|
||||||
|
})
|
||||||
.doOnComplete(() -> logger.debug("查询完成:memberId={}", memberId));
|
.doOnComplete(() -> logger.debug("查询完成:memberId={}", memberId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
@@ -5,6 +5,7 @@ import cn.novalon.gym.manage.groupcourse.domain.GroupCourseRecommend;
|
|||||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRecommendRepository;
|
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRecommendRepository;
|
||||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
|
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
|
||||||
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseRecommendService;
|
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseRecommendService;
|
||||||
|
import cn.novalon.gym.manage.groupcourse.util.OSSUtil;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -134,6 +135,8 @@ public class GroupCourseRecommendService implements IGroupCourseRecommendService
|
|||||||
|
|
||||||
return groupCourseRepository.findByIdAndDeletedAtIsNull(recommend.getCourseId())
|
return groupCourseRepository.findByIdAndDeletedAtIsNull(recommend.getCourseId())
|
||||||
.map(course -> {
|
.map(course -> {
|
||||||
|
// 将 OSS Key 转换为预签名URL,前端可直接加载
|
||||||
|
course.setCoverImage(OSSUtil.toCoverPresignedUrl(course.getCoverImage()));
|
||||||
recommend.setGroupCourse(course);
|
recommend.setGroupCourse(course);
|
||||||
return recommend;
|
return recommend;
|
||||||
})
|
})
|
||||||
|
|||||||
+37
-7
@@ -19,6 +19,7 @@ import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseRepository;
|
|||||||
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseTypeRepository;
|
import cn.novalon.gym.manage.groupcourse.repository.IGroupCourseTypeRepository;
|
||||||
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseService;
|
import cn.novalon.gym.manage.groupcourse.service.IGroupCourseService;
|
||||||
import cn.novalon.gym.manage.groupcourse.util.QRCodeUtil;
|
import cn.novalon.gym.manage.groupcourse.util.QRCodeUtil;
|
||||||
|
import cn.novalon.gym.manage.groupcourse.util.OSSUtil;
|
||||||
import cn.novalon.gym.manage.member.entity.MemberCard;
|
import cn.novalon.gym.manage.member.entity.MemberCard;
|
||||||
import cn.novalon.gym.manage.member.entity.MemberCardRecord;
|
import cn.novalon.gym.manage.member.entity.MemberCardRecord;
|
||||||
import cn.novalon.gym.manage.member.enums.MemberCardType;
|
import cn.novalon.gym.manage.member.enums.MemberCardType;
|
||||||
@@ -32,6 +33,7 @@ import org.springframework.r2dbc.core.DatabaseClient;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import reactor.core.publisher.Flux;
|
import reactor.core.publisher.Flux;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
import reactor.core.scheduler.Schedulers;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@@ -153,7 +155,7 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
detail.setCurrentMembers(course.getCurrentMembers());
|
detail.setCurrentMembers(course.getCurrentMembers());
|
||||||
detail.setStatus(course.getStatus());
|
detail.setStatus(course.getStatus());
|
||||||
detail.setLocation(course.getLocation());
|
detail.setLocation(course.getLocation());
|
||||||
detail.setCoverImage(course.getCoverImage());
|
detail.setCoverImage(OSSUtil.toCoverPresignedUrl(course.getCoverImage()));
|
||||||
detail.setDescription(course.getDescription());
|
detail.setDescription(course.getDescription());
|
||||||
detail.setStoredValueAmount(course.getStoredValueAmount());
|
detail.setStoredValueAmount(course.getStoredValueAmount());
|
||||||
detail.setQrCodePath(course.getQrCodePath());
|
detail.setQrCodePath(course.getQrCodePath());
|
||||||
@@ -178,7 +180,7 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
try {
|
try {
|
||||||
GroupCourse groupCourse = objectMapper.readValue(cachedJson, GroupCourse.class);
|
GroupCourse groupCourse = objectMapper.readValue(cachedJson, GroupCourse.class);
|
||||||
logger.info("缓存命中 - findById: id={}", id);
|
logger.info("缓存命中 - findById: id={}", id);
|
||||||
return Mono.just(groupCourse);
|
return Mono.just(fillCoverPresignedUrl(groupCourse));
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
logger.warn("缓存解析失败,删除缓存 - id: {}, error: {}", id, e.getMessage());
|
logger.warn("缓存解析失败,删除缓存 - id: {}, error: {}", id, e.getMessage());
|
||||||
return redisUtil.delete(cacheKey).then(Mono.empty());
|
return redisUtil.delete(cacheKey).then(Mono.empty());
|
||||||
@@ -188,6 +190,7 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
})
|
})
|
||||||
.switchIfEmpty(
|
.switchIfEmpty(
|
||||||
groupCourseRepository.findByIdAndDeletedAtIsNull(id)
|
groupCourseRepository.findByIdAndDeletedAtIsNull(id)
|
||||||
|
.map(this::fillCoverPresignedUrl)
|
||||||
.flatMap(groupCourse -> {
|
.flatMap(groupCourse -> {
|
||||||
try {
|
try {
|
||||||
String jsonData = objectMapper.writeValueAsString(groupCourse);
|
String jsonData = objectMapper.writeValueAsString(groupCourse);
|
||||||
@@ -205,16 +208,19 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<GroupCourse> findAll() {
|
public Flux<GroupCourse> findAll() {
|
||||||
return groupCourseRepository.findAll();
|
return groupCourseRepository.findAll()
|
||||||
|
.map(this::fillCoverPresignedUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Flux<GroupCourse> findAll(boolean includeDeleted) {
|
public Flux<GroupCourse> findAll(boolean includeDeleted) {
|
||||||
|
Flux<GroupCourse> flux;
|
||||||
if(includeDeleted){
|
if(includeDeleted){
|
||||||
return groupCourseRepository.findAll();
|
flux = groupCourseRepository.findAll();
|
||||||
}else{
|
}else{
|
||||||
return groupCourseRepository.findByDeletedAtIsNull();
|
flux = groupCourseRepository.findByDeletedAtIsNull();
|
||||||
}
|
}
|
||||||
|
return flux.map(this::fillCoverPresignedUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -234,6 +240,7 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
PageResponse<GroupCourse> pageResponse = objectMapper.readValue(cachedJson,
|
PageResponse<GroupCourse> pageResponse = objectMapper.readValue(cachedJson,
|
||||||
objectMapper.getTypeFactory().constructParametricType(PageResponse.class, GroupCourse.class));
|
objectMapper.getTypeFactory().constructParametricType(PageResponse.class, GroupCourse.class));
|
||||||
logger.info("缓存命中 - findByPage: key={}", cacheKey);
|
logger.info("缓存命中 - findByPage: key={}", cacheKey);
|
||||||
|
fillCoverPresignedUrl(pageResponse);
|
||||||
return Mono.just(pageResponse);
|
return Mono.just(pageResponse);
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
logger.warn("缓存解析失败,删除缓存 - key: {}, error: {}", cacheKey, e.getMessage());
|
logger.warn("缓存解析失败,删除缓存 - key: {}, error: {}", cacheKey, e.getMessage());
|
||||||
@@ -254,6 +261,7 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
|
|
||||||
return resultMono.flatMap(pageResponse -> {
|
return resultMono.flatMap(pageResponse -> {
|
||||||
try {
|
try {
|
||||||
|
fillCoverPresignedUrl(pageResponse);
|
||||||
String jsonData = objectMapper.writeValueAsString(pageResponse);
|
String jsonData = objectMapper.writeValueAsString(pageResponse);
|
||||||
return redisUtil.setWithExpire(cacheKey, jsonData, CACHE_EXPIRE_SECONDS)
|
return redisUtil.setWithExpire(cacheKey, jsonData, CACHE_EXPIRE_SECONDS)
|
||||||
.thenReturn(pageResponse)
|
.thenReturn(pageResponse)
|
||||||
@@ -572,8 +580,11 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
query.getTimePeriod(), query.getPriceSort(), query.getRemainingMost());
|
query.getTimePeriod(), query.getPriceSort(), query.getRemainingMost());
|
||||||
|
|
||||||
return groupCourseRepository.searchGroupCourses(query)
|
return groupCourseRepository.searchGroupCourses(query)
|
||||||
.doOnSuccess(result -> logger.info("多条件查询结果 - total={}, page={}, size={}",
|
.doOnSuccess(result -> {
|
||||||
result.getTotalElements(), result.getCurrentPage(), result.getPageSize()))
|
fillCoverPresignedUrl(result);
|
||||||
|
logger.info("多条件查询结果 - total={}, page={}, size={}",
|
||||||
|
result.getTotalElements(), result.getCurrentPage(), result.getPageSize());
|
||||||
|
})
|
||||||
.doOnError(error -> logger.error("多条件查询失败 - error: {}", error.getMessage()));
|
.doOnError(error -> logger.error("多条件查询失败 - error: {}", error.getMessage()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,4 +593,23 @@ public class GroupCourseService implements IGroupCourseService {
|
|||||||
.then(redisUtil.deleteByPattern(CACHE_KEY_ID_PREFIX + "*"))
|
.then(redisUtil.deleteByPattern(CACHE_KEY_ID_PREFIX + "*"))
|
||||||
.then(redisUtil.deleteByPattern(CACHE_KEY_DETAIL_PREFIX + "*")).then();
|
.then(redisUtil.deleteByPattern(CACHE_KEY_DETAIL_PREFIX + "*")).then();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将单个 GroupCourse 的 coverImage 从 OSS Key 转换为预签名URL
|
||||||
|
*/
|
||||||
|
private GroupCourse fillCoverPresignedUrl(GroupCourse course) {
|
||||||
|
if (course != null) {
|
||||||
|
course.setCoverImage(OSSUtil.toCoverPresignedUrl(course.getCoverImage()));
|
||||||
|
}
|
||||||
|
return course;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将分页结果中所有 GroupCourse 的 coverImage 从 OSS Key 转换为预签名URL
|
||||||
|
*/
|
||||||
|
private void fillCoverPresignedUrl(PageResponse<GroupCourse> pageResponse) {
|
||||||
|
if (pageResponse != null && pageResponse.getContent() != null) {
|
||||||
|
pageResponse.getContent().forEach(this::fillCoverPresignedUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-1
@@ -23,7 +23,7 @@ public class OSSUtil {
|
|||||||
private static final Logger logger = LoggerFactory.getLogger(OSSUtil.class);
|
private static final Logger logger = LoggerFactory.getLogger(OSSUtil.class);
|
||||||
|
|
||||||
// OSS配置信息
|
// OSS配置信息
|
||||||
private static final String ENDPOINT = "oss-cn-beijing.aliyuncs.com";
|
private static final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";
|
||||||
private static final String ACCESS_KEY_ID = "LTAI5t9wHCiH68Xjxg64Xx4Y";
|
private static final String ACCESS_KEY_ID = "LTAI5t9wHCiH68Xjxg64Xx4Y";
|
||||||
private static final String ACCESS_KEY_SECRET = "isAfz1IFGAnV13LOIrVg19aPhY8aRq";
|
private static final String ACCESS_KEY_SECRET = "isAfz1IFGAnV13LOIrVg19aPhY8aRq";
|
||||||
private static final String BUCKET_NAME = "ycc-filesaver";
|
private static final String BUCKET_NAME = "ycc-filesaver";
|
||||||
@@ -37,6 +37,8 @@ public class OSSUtil {
|
|||||||
|
|
||||||
// 预签名URL有效期(秒)
|
// 预签名URL有效期(秒)
|
||||||
private static final long PRESIGN_EXPIRE_SECONDS = 300;
|
private static final long PRESIGN_EXPIRE_SECONDS = 300;
|
||||||
|
// 封面图预签名URL有效期(秒)- 1小时,确保前端列表页足够展示
|
||||||
|
private static final long COVER_PRESIGN_EXPIRE_SECONDS = 3600;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传文件到阿里云OSS(文件默认继承Bucket权限,不设置ACL)
|
* 上传文件到阿里云OSS(文件默认继承Bucket权限,不设置ACL)
|
||||||
@@ -171,4 +173,21 @@ public class OSSUtil {
|
|||||||
public static String getPublicUrl(String ossKey) {
|
public static String getPublicUrl(String ossKey) {
|
||||||
return OSS_URL_PREFIX + ossKey;
|
return OSS_URL_PREFIX + ossKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将OSS Key(相对路径)转换为封面图预签名URL(1小时有效期)
|
||||||
|
* 如果已经是HTTP(S)完整URL则直接返回
|
||||||
|
*
|
||||||
|
* @param ossKey OSS对象Key或完整URL
|
||||||
|
* @return 可访问的预签名URL,ossKey为空时返回null
|
||||||
|
*/
|
||||||
|
public static String toCoverPresignedUrl(String ossKey) {
|
||||||
|
if (ossKey == null || ossKey.isBlank()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (ossKey.startsWith("http://") || ossKey.startsWith("https://")) {
|
||||||
|
return ossKey;
|
||||||
|
}
|
||||||
|
return generatePresignedUrl(ossKey, COVER_PRESIGN_EXPIRE_SECONDS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -61,9 +61,7 @@ class QRCodeUtilTest {
|
|||||||
String ossUrl = QRCodeUtil.generateQRCodeAndUploadToOSS(jsonContent);
|
String ossUrl = QRCodeUtil.generateQRCodeAndUploadToOSS(jsonContent);
|
||||||
|
|
||||||
assertNotNull(ossUrl, "OSS访问地址不应为空");
|
assertNotNull(ossUrl, "OSS访问地址不应为空");
|
||||||
assertTrue(ossUrl.startsWith("https://"), "OSS访问地址应为HTTPS");
|
assertTrue(ossUrl.startsWith("qrcode/"), "OSS访问地址应以qrcode/开头");
|
||||||
assertTrue(ossUrl.contains("ycc-filesaver.oss-cn-beijing.aliyuncs.com"), "OSS访问地址应包含正确的域名");
|
|
||||||
assertTrue(ossUrl.contains("/qrcode/"), "OSS访问地址应包含qrcode目录");
|
|
||||||
assertTrue(ossUrl.endsWith(".png"), "OSS访问地址应为PNG格式");
|
assertTrue(ossUrl.endsWith(".png"), "OSS访问地址应为PNG格式");
|
||||||
|
|
||||||
System.out.println("上传到OSS的二维码地址: " + ossUrl);
|
System.out.println("上传到OSS的二维码地址: " + ossUrl);
|
||||||
|
|||||||
+1991
-2915
File diff suppressed because it is too large
Load Diff
+4
-4
@@ -8,7 +8,7 @@ class AuthResponseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testConstructorWithParameters() {
|
void testConstructorWithParameters() {
|
||||||
AuthResponse response = new AuthResponse("test-token", 1L, "testuser");
|
AuthResponse response = new AuthResponse("test-token", 1L, "testuser", null, null);
|
||||||
|
|
||||||
assertEquals("test-token", response.getToken());
|
assertEquals("test-token", response.getToken());
|
||||||
assertEquals(1L, response.getUserId());
|
assertEquals(1L, response.getUserId());
|
||||||
@@ -63,7 +63,7 @@ class AuthResponseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testConstructorWithNullValues() {
|
void testConstructorWithNullValues() {
|
||||||
AuthResponse response = new AuthResponse(null, null, null);
|
AuthResponse response = new AuthResponse(null, null, null, null, null);
|
||||||
|
|
||||||
assertNull(response.getToken());
|
assertNull(response.getToken());
|
||||||
assertNull(response.getUserId());
|
assertNull(response.getUserId());
|
||||||
@@ -72,7 +72,7 @@ class AuthResponseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testConstructorWithEmptyStrings() {
|
void testConstructorWithEmptyStrings() {
|
||||||
AuthResponse response = new AuthResponse("", 1L, "");
|
AuthResponse response = new AuthResponse("", 1L, "", null, null);
|
||||||
|
|
||||||
assertEquals("", response.getToken());
|
assertEquals("", response.getToken());
|
||||||
assertEquals(1L, response.getUserId());
|
assertEquals(1L, response.getUserId());
|
||||||
@@ -164,7 +164,7 @@ class AuthResponseTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testConstructorWithZeroUserId() {
|
void testConstructorWithZeroUserId() {
|
||||||
AuthResponse response = new AuthResponse("token", 0L, "user");
|
AuthResponse response = new AuthResponse("token", 0L, "user", null, null);
|
||||||
|
|
||||||
assertEquals("token", response.getToken());
|
assertEquals("token", response.getToken());
|
||||||
assertEquals(0L, response.getUserId());
|
assertEquals(0L, response.getUserId());
|
||||||
|
|||||||
+10
-1
@@ -6,9 +6,11 @@ import cn.novalon.gym.manage.sys.security.JwtTokenProvider;
|
|||||||
import cn.novalon.gym.manage.sys.core.domain.SysUser;
|
import cn.novalon.gym.manage.sys.core.domain.SysUser;
|
||||||
import cn.novalon.gym.manage.sys.core.domain.SysRole;
|
import cn.novalon.gym.manage.sys.core.domain.SysRole;
|
||||||
import cn.novalon.gym.manage.sys.core.domain.SysLoginLog;
|
import cn.novalon.gym.manage.sys.core.domain.SysLoginLog;
|
||||||
|
import cn.novalon.gym.manage.sys.core.domain.SysPermission;
|
||||||
import cn.novalon.gym.manage.sys.util.TestDataFactory;
|
import cn.novalon.gym.manage.sys.util.TestDataFactory;
|
||||||
import cn.novalon.gym.manage.sys.core.service.ISysUserService;
|
import cn.novalon.gym.manage.sys.core.service.ISysUserService;
|
||||||
import cn.novalon.gym.manage.sys.core.service.ISysLoginLogService;
|
import cn.novalon.gym.manage.sys.core.service.ISysLoginLogService;
|
||||||
|
import cn.novalon.gym.manage.sys.core.service.ISysPermissionService;
|
||||||
import cn.novalon.gym.manage.sys.util.UserAgentParser;
|
import cn.novalon.gym.manage.sys.util.UserAgentParser;
|
||||||
import cn.novalon.gym.manage.sys.util.IpLocationParser;
|
import cn.novalon.gym.manage.sys.util.IpLocationParser;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
@@ -47,6 +49,9 @@ class SysAuthHandlerTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private ISysLoginLogService loginLogService;
|
private ISysLoginLogService loginLogService;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private ISysPermissionService permissionService;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private UserAgentParser userAgentParser;
|
private UserAgentParser userAgentParser;
|
||||||
|
|
||||||
@@ -59,7 +64,7 @@ class SysAuthHandlerTest {
|
|||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setUp() {
|
void setUp() {
|
||||||
authHandler = new SysAuthHandler(userService, passwordEncoder, jwtTokenProvider, loginLogService,
|
authHandler = new SysAuthHandler(userService, passwordEncoder, jwtTokenProvider, loginLogService,
|
||||||
userAgentParser, ipLocationParser);
|
permissionService, userAgentParser, ipLocationParser);
|
||||||
|
|
||||||
testUser = TestDataFactory.createTestUser();
|
testUser = TestDataFactory.createTestUser();
|
||||||
}
|
}
|
||||||
@@ -88,6 +93,10 @@ class SysAuthHandlerTest {
|
|||||||
when(userService.getUserRoles(1L)).thenReturn(Flux.just(mockRole));
|
when(userService.getUserRoles(1L)).thenReturn(Flux.just(mockRole));
|
||||||
when(loginLogService.save(any())).thenReturn(Mono.just(new SysLoginLog()));
|
when(loginLogService.save(any())).thenReturn(Mono.just(new SysLoginLog()));
|
||||||
|
|
||||||
|
SysPermission mockPermission = new SysPermission();
|
||||||
|
mockPermission.setPermissionCode("system:user:view");
|
||||||
|
when(permissionService.findByRoleIds(anyList())).thenReturn(Flux.just(mockPermission));
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.body(Mono.just(loginRequest));
|
.body(Mono.just(loginRequest));
|
||||||
Mono<ServerResponse> response = authHandler.login(request);
|
Mono<ServerResponse> response = authHandler.login(request);
|
||||||
|
|||||||
+25
-5
@@ -2,6 +2,8 @@ package cn.novalon.gym.manage.sys.handler.role;
|
|||||||
|
|
||||||
import cn.novalon.gym.manage.sys.core.domain.SysRole;
|
import cn.novalon.gym.manage.sys.core.domain.SysRole;
|
||||||
import cn.novalon.gym.manage.sys.core.service.ISysRoleService;
|
import cn.novalon.gym.manage.sys.core.service.ISysRoleService;
|
||||||
|
import cn.novalon.gym.manage.sys.core.service.ISysUserService;
|
||||||
|
import cn.novalon.gym.manage.sys.util.AuthUtil;
|
||||||
import cn.novalon.gym.manage.sys.dto.request.RoleCreateRequest;
|
import cn.novalon.gym.manage.sys.dto.request.RoleCreateRequest;
|
||||||
import cn.novalon.gym.manage.sys.dto.request.RoleUpdateRequest;
|
import cn.novalon.gym.manage.sys.dto.request.RoleUpdateRequest;
|
||||||
import cn.novalon.gym.manage.sys.core.command.CreateRoleCommand;
|
import cn.novalon.gym.manage.sys.core.command.CreateRoleCommand;
|
||||||
@@ -35,12 +37,18 @@ class SysRoleHandlerTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private Validator validator;
|
private Validator validator;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private AuthUtil authUtil;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private ISysUserService userService;
|
||||||
|
|
||||||
private SysRoleHandler roleHandler;
|
private SysRoleHandler roleHandler;
|
||||||
private SysRole testRole;
|
private SysRole testRole;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setUp() {
|
void setUp() {
|
||||||
roleHandler = new SysRoleHandler(roleService, validator);
|
roleHandler = new SysRoleHandler(roleService, validator, authUtil, userService);
|
||||||
|
|
||||||
testRole = new SysRole();
|
testRole = new SysRole();
|
||||||
testRole.setId(1L);
|
testRole.setId(1L);
|
||||||
@@ -251,10 +259,13 @@ class SysRoleHandlerTest {
|
|||||||
updateRequest.setRoleSort(3);
|
updateRequest.setRoleSort(3);
|
||||||
updateRequest.setStatus(0);
|
updateRequest.setStatus(0);
|
||||||
|
|
||||||
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
when(roleService.updateRole(any(UpdateRoleCommand.class))).thenReturn(Mono.just(testRole));
|
when(roleService.updateRole(any(UpdateRoleCommand.class))).thenReturn(Mono.just(testRole));
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "1")
|
.pathVariable("id", "2")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.body(Mono.just(updateRequest));
|
.body(Mono.just(updateRequest));
|
||||||
Mono<ServerResponse> response = roleHandler.updateRole(request);
|
Mono<ServerResponse> response = roleHandler.updateRole(request);
|
||||||
|
|
||||||
@@ -271,10 +282,13 @@ class SysRoleHandlerTest {
|
|||||||
RoleUpdateRequest updateRequest = new RoleUpdateRequest();
|
RoleUpdateRequest updateRequest = new RoleUpdateRequest();
|
||||||
updateRequest.setRoleName("UPDATED_ROLE");
|
updateRequest.setRoleName("UPDATED_ROLE");
|
||||||
|
|
||||||
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
when(roleService.updateRole(any(UpdateRoleCommand.class))).thenReturn(Mono.empty());
|
when(roleService.updateRole(any(UpdateRoleCommand.class))).thenReturn(Mono.empty());
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "999")
|
.pathVariable("id", "999")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.body(Mono.just(updateRequest));
|
.body(Mono.just(updateRequest));
|
||||||
Mono<ServerResponse> response = roleHandler.updateRole(request);
|
Mono<ServerResponse> response = roleHandler.updateRole(request);
|
||||||
|
|
||||||
@@ -288,10 +302,13 @@ class SysRoleHandlerTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testDeleteRole() {
|
void testDeleteRole() {
|
||||||
when(roleService.logicalDeleteRole(1L)).thenReturn(Mono.just(testRole));
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
|
when(roleService.logicalDeleteRole(2L)).thenReturn(Mono.just(testRole));
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "1")
|
.pathVariable("id", "2")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.build();
|
.build();
|
||||||
Mono<ServerResponse> response = roleHandler.deleteRole(request);
|
Mono<ServerResponse> response = roleHandler.deleteRole(request);
|
||||||
|
|
||||||
@@ -300,15 +317,18 @@ class SysRoleHandlerTest {
|
|||||||
serverResponse.statusCode() == HttpStatus.OK)
|
serverResponse.statusCode() == HttpStatus.OK)
|
||||||
.verifyComplete();
|
.verifyComplete();
|
||||||
|
|
||||||
verify(roleService).logicalDeleteRole(1L);
|
verify(roleService).logicalDeleteRole(2L);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testDeleteRole_NotFound() {
|
void testDeleteRole_NotFound() {
|
||||||
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
when(roleService.logicalDeleteRole(999L)).thenReturn(Mono.empty());
|
when(roleService.logicalDeleteRole(999L)).thenReturn(Mono.empty());
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "999")
|
.pathVariable("id", "999")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.build();
|
.build();
|
||||||
Mono<ServerResponse> response = roleHandler.deleteRole(request);
|
Mono<ServerResponse> response = roleHandler.deleteRole(request);
|
||||||
|
|
||||||
|
|||||||
+17
-3
@@ -2,6 +2,7 @@ package cn.novalon.gym.manage.sys.handler.user;
|
|||||||
|
|
||||||
import cn.novalon.gym.manage.sys.core.domain.SysUser;
|
import cn.novalon.gym.manage.sys.core.domain.SysUser;
|
||||||
import cn.novalon.gym.manage.sys.core.service.ISysUserService;
|
import cn.novalon.gym.manage.sys.core.service.ISysUserService;
|
||||||
|
import cn.novalon.gym.manage.sys.util.AuthUtil;
|
||||||
import cn.novalon.gym.manage.sys.dto.request.PasswordChangeRequest;
|
import cn.novalon.gym.manage.sys.dto.request.PasswordChangeRequest;
|
||||||
import cn.novalon.gym.manage.sys.dto.request.UserRegisterRequest;
|
import cn.novalon.gym.manage.sys.dto.request.UserRegisterRequest;
|
||||||
import cn.novalon.gym.manage.sys.dto.request.UserUpdateRequest;
|
import cn.novalon.gym.manage.sys.dto.request.UserUpdateRequest;
|
||||||
@@ -42,12 +43,15 @@ class SysUserHandlerTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private Validator validator;
|
private Validator validator;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private AuthUtil authUtil;
|
||||||
|
|
||||||
private SysUserHandler userHandler;
|
private SysUserHandler userHandler;
|
||||||
private SysUser testUser;
|
private SysUser testUser;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setUp() {
|
void setUp() {
|
||||||
userHandler = new SysUserHandler(userService, validator);
|
userHandler = new SysUserHandler(userService, validator, authUtil);
|
||||||
|
|
||||||
testUser = new SysUser();
|
testUser = new SysUser();
|
||||||
testUser.setId(1L);
|
testUser.setId(1L);
|
||||||
@@ -191,9 +195,12 @@ class SysUserHandlerTest {
|
|||||||
void testDeleteUser() {
|
void testDeleteUser() {
|
||||||
when(userService.findById(1L)).thenReturn(Mono.just(testUser));
|
when(userService.findById(1L)).thenReturn(Mono.just(testUser));
|
||||||
when(userService.deleteUser(1L)).thenReturn(Mono.empty());
|
when(userService.deleteUser(1L)).thenReturn(Mono.empty());
|
||||||
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "1")
|
.pathVariable("id", "1")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.build();
|
.build();
|
||||||
Mono<ServerResponse> response = userHandler.deleteUser(request);
|
Mono<ServerResponse> response = userHandler.deleteUser(request);
|
||||||
|
|
||||||
@@ -379,10 +386,14 @@ class SysUserHandlerTest {
|
|||||||
updateRequest.setRoleId(2L);
|
updateRequest.setRoleId(2L);
|
||||||
updateRequest.setStatus(0);
|
updateRequest.setStatus(0);
|
||||||
|
|
||||||
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
|
when(userService.findById(1L)).thenReturn(Mono.just(testUser));
|
||||||
when(userService.updateUser(any(UpdateUserCommand.class))).thenReturn(Mono.just(testUser));
|
when(userService.updateUser(any(UpdateUserCommand.class))).thenReturn(Mono.just(testUser));
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "1")
|
.pathVariable("id", "1")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.body(Mono.just(updateRequest));
|
.body(Mono.just(updateRequest));
|
||||||
Mono<ServerResponse> response = userHandler.updateUser(request);
|
Mono<ServerResponse> response = userHandler.updateUser(request);
|
||||||
|
|
||||||
@@ -399,10 +410,13 @@ class SysUserHandlerTest {
|
|||||||
UserUpdateRequest updateRequest = new UserUpdateRequest();
|
UserUpdateRequest updateRequest = new UserUpdateRequest();
|
||||||
updateRequest.setEmail("updated@example.com");
|
updateRequest.setEmail("updated@example.com");
|
||||||
|
|
||||||
when(userService.updateUser(any(UpdateUserCommand.class))).thenReturn(Mono.empty());
|
when(authUtil.getMemberIdOrThrow(any())).thenReturn(1L);
|
||||||
|
when(userService.verifyPassword(1L, "password123")).thenReturn(Mono.just(true));
|
||||||
|
when(userService.findById(999L)).thenReturn(Mono.empty());
|
||||||
|
|
||||||
ServerRequest request = MockServerRequest.builder()
|
ServerRequest request = MockServerRequest.builder()
|
||||||
.pathVariable("id", "999")
|
.pathVariable("id", "999")
|
||||||
|
.queryParam("adminPassword", "password123")
|
||||||
.body(Mono.just(updateRequest));
|
.body(Mono.just(updateRequest));
|
||||||
Mono<ServerResponse> response = userHandler.updateUser(request);
|
Mono<ServerResponse> response = userHandler.updateUser(request);
|
||||||
|
|
||||||
@@ -411,7 +425,7 @@ class SysUserHandlerTest {
|
|||||||
serverResponse.statusCode() == HttpStatus.NOT_FOUND)
|
serverResponse.statusCode() == HttpStatus.NOT_FOUND)
|
||||||
.verifyComplete();
|
.verifyComplete();
|
||||||
|
|
||||||
verify(userService).updateUser(any(UpdateUserCommand.class));
|
verify(userService).findById(999L);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ async function handleDelete(row: any) {
|
|||||||
inputType: 'password',
|
inputType: 'password',
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
}).catch(() => {})
|
}).catch(() => ({ value: '' }))
|
||||||
if (!pwd) {
|
if (!pwd) {
|
||||||
ElMessage.warning('请输入验证密码')
|
ElMessage.warning('请输入验证密码')
|
||||||
return
|
return
|
||||||
@@ -94,7 +94,7 @@ async function handleSave() {
|
|||||||
inputType: 'password',
|
inputType: 'password',
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
}).catch(() => {})
|
}).catch(() => ({ value: '' }))
|
||||||
if (!pwd) {
|
if (!pwd) {
|
||||||
ElMessage.warning('请输入验证密码')
|
ElMessage.warning('请输入验证密码')
|
||||||
return
|
return
|
||||||
@@ -132,7 +132,7 @@ async function handleAssignRoles() {
|
|||||||
inputType: 'password',
|
inputType: 'password',
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
}).catch(() => {})
|
}).catch(() => ({ value: '' }))
|
||||||
if (!pwd) {
|
if (!pwd) {
|
||||||
ElMessage.warning('请输入验证密码')
|
ElMessage.warning('请输入验证密码')
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -89,8 +89,8 @@ async function fetchData() {
|
|||||||
newMemberData[i] = res?.newMembers ?? 0
|
newMemberData[i] = res?.newMembers ?? 0
|
||||||
activeMemberData[i] = res?.activeMembers ?? 0
|
activeMemberData[i] = res?.activeMembers ?? 0
|
||||||
if (i === todayIdx) {
|
if (i === todayIdx) {
|
||||||
statCards.value[0].value = res?.totalMembers ?? 0
|
statCards.value[0]!.value = res?.totalMembers ?? 0
|
||||||
statCards.value[1].value = res?.newMembers ?? 0
|
statCards.value[1]!.value = res?.newMembers ?? 0
|
||||||
}
|
}
|
||||||
}).catch(() => {}),
|
}).catch(() => {}),
|
||||||
|
|
||||||
@@ -98,14 +98,14 @@ async function fetchData() {
|
|||||||
bookingData[i] = res?.newBookings ?? 0
|
bookingData[i] = res?.newBookings ?? 0
|
||||||
cancelData[i] = res?.cancelBookings ?? 0
|
cancelData[i] = res?.cancelBookings ?? 0
|
||||||
if (i === todayIdx) {
|
if (i === todayIdx) {
|
||||||
statCards.value[3].value = res?.newBookings ?? 0
|
statCards.value[3]!.value = res?.newBookings ?? 0
|
||||||
}
|
}
|
||||||
}).catch(() => {}),
|
}).catch(() => {}),
|
||||||
|
|
||||||
getSignInStatistics(range).then((res: any) => {
|
getSignInStatistics(range).then((res: any) => {
|
||||||
signinData[i] = res?.totalSignIns ?? 0
|
signinData[i] = res?.totalSignIns ?? 0
|
||||||
if (i === todayIdx) {
|
if (i === todayIdx) {
|
||||||
statCards.value[2].value = res?.totalSignIns ?? 0
|
statCards.value[2]!.value = res?.totalSignIns ?? 0
|
||||||
}
|
}
|
||||||
}).catch(() => {}),
|
}).catch(() => {}),
|
||||||
)
|
)
|
||||||
@@ -116,7 +116,7 @@ async function fetchData() {
|
|||||||
getRevenueStatistics().then((res: any) => {
|
getRevenueStatistics().then((res: any) => {
|
||||||
const data = res?.data
|
const data = res?.data
|
||||||
if (data) {
|
if (data) {
|
||||||
statCards.value[4].value = (data.todayIncome ?? 0).toFixed(2)
|
statCards.value[4]!.value = (data.todayIncome ?? 0).toFixed(2)
|
||||||
}
|
}
|
||||||
}).catch(() => {}),
|
}).catch(() => {}),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ async function fetchData() {
|
|||||||
const cache: Record<number, LabelItem[]> = {}
|
const cache: Record<number, LabelItem[]> = {}
|
||||||
labelResults.forEach((result, i) => {
|
labelResults.forEach((result, i) => {
|
||||||
if (result.status === 'fulfilled' && Array.isArray(result.value)) {
|
if (result.status === 'fulfilled' && Array.isArray(result.value)) {
|
||||||
cache[arr[i].id] = result.value as LabelItem[]
|
cache[arr[i]!.id] = result.value as LabelItem[]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
labelCache.value = cache
|
labelCache.value = cache
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ function handleSearch() {
|
|||||||
function resetFilters() {
|
function resetFilters() {
|
||||||
keyword.value = ''
|
keyword.value = ''
|
||||||
genderFilter.value = null
|
genderFilter.value = null
|
||||||
sortBy.value = sortOptions[0]
|
sortBy.value = sortOptions[0]!
|
||||||
currentPage.value = 1
|
currentPage.value = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ async function handleDelete(row: any) {
|
|||||||
inputType: 'password',
|
inputType: 'password',
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
}).catch(() => {})
|
}).catch(() => ({ value: '' }))
|
||||||
if (!pwd) {
|
if (!pwd) {
|
||||||
ElMessage.warning('请输入验证密码')
|
ElMessage.warning('请输入验证密码')
|
||||||
return
|
return
|
||||||
@@ -151,7 +151,7 @@ async function handleSave() {
|
|||||||
inputType: 'password',
|
inputType: 'password',
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
}).catch(() => {})
|
}).catch(() => ({ value: '' }))
|
||||||
if (!pwd) {
|
if (!pwd) {
|
||||||
ElMessage.warning('请输入验证密码')
|
ElMessage.warning('请输入验证密码')
|
||||||
return
|
return
|
||||||
@@ -189,7 +189,7 @@ async function handleAssignPerms() {
|
|||||||
inputType: 'password',
|
inputType: 'password',
|
||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消',
|
cancelButtonText: '取消',
|
||||||
}).catch(() => {})
|
}).catch(() => ({ value: '' }))
|
||||||
if (!pwd) {
|
if (!pwd) {
|
||||||
ElMessage.warning('请输入验证密码')
|
ElMessage.warning('请输入验证密码')
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import vueDevTools from 'vite-plugin-vue-devtools'
|
|||||||
|
|
||||||
// https://vite.dev/config/
|
// https://vite.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
base: '/cuit/',
|
||||||
plugins: [
|
plugins: [
|
||||||
vue(),
|
vue(),
|
||||||
vueDevTools(),
|
vueDevTools(),
|
||||||
|
|||||||
Reference in New Issue
Block a user