修改UniApp

main
lijun 2026-02-06 00:44:50 +08:00
parent 1dda007263
commit b11e936518
17 changed files with 377 additions and 29 deletions

View File

@ -7,6 +7,7 @@ import com.yanzhu.framework.security.config.SecurityProperties;
import com.yanzhu.framework.security.core.util.SecurityFrameworkUtils; import com.yanzhu.framework.security.core.util.SecurityFrameworkUtils;
import com.yanzhu.module.member.controller.app.auth.vo.*; import com.yanzhu.module.member.controller.app.auth.vo.*;
import com.yanzhu.module.member.convert.auth.AuthConvert; import com.yanzhu.module.member.convert.auth.AuthConvert;
import com.yanzhu.module.member.dal.dataobject.user.MemberUserDO;
import com.yanzhu.module.member.service.auth.MemberAuthService; import com.yanzhu.module.member.service.auth.MemberAuthService;
import com.yanzhu.module.system.api.social.SocialClientApi; import com.yanzhu.module.system.api.social.SocialClientApi;
import com.yanzhu.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO; import com.yanzhu.module.system.api.social.dto.SocialWxJsapiSignatureRespDTO;
@ -26,9 +27,13 @@ import javax.validation.Valid;
import static com.yanzhu.framework.common.pojo.CommonResult.success; import static com.yanzhu.framework.common.pojo.CommonResult.success;
import static com.yanzhu.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static com.yanzhu.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import com.yanzhu.framework.tenant.core.aop.TenantIgnore;
import com.yanzhu.framework.tenant.core.context.TenantContextHolder;
@Tag(name = "用户 APP - 认证") @Tag(name = "用户 APP - 认证")
@RestController @RestController
@RequestMapping("/member/auth") @RequestMapping("/member/auth")
@TenantIgnore
@Validated @Validated
@Slf4j @Slf4j
public class AppAuthController { public class AppAuthController {
@ -46,7 +51,20 @@ public class AppAuthController {
@Operation(summary = "使用手机 + 密码登录") @Operation(summary = "使用手机 + 密码登录")
@PermitAll @PermitAll
public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) {
// 先设置忽略租户,查询用户时不进行租户过滤
TenantContextHolder.setIgnore(true);
try {
// 先根据手机号查询用户获取租户ID
MemberUserDO user = authService.getUserByMobile(reqVO.getMobile());
if (user != null && user.getTenantId() != null) {
TenantContextHolder.setTenantId(user.getTenantId());
TenantContextHolder.setIgnore(false);
}
return success(authService.login(reqVO)); return success(authService.login(reqVO));
} finally {
// 清除上下文
TenantContextHolder.clear();
}
} }
@PostMapping("/logout") @PostMapping("/logout")
@ -75,6 +93,11 @@ public class AppAuthController {
@Operation(summary = "使用手机 + 验证码登录") @Operation(summary = "使用手机 + 验证码登录")
@PermitAll @PermitAll
public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) {
// 先根据手机号查询用户获取租户ID
MemberUserDO user = authService.getUserByMobile(reqVO.getMobile());
if (user != null && user.getTenantId() != null) {
TenantContextHolder.setTenantId(user.getTenantId());
}
return success(authService.smsLogin(reqVO)); return success(authService.smsLogin(reqVO));
} }

View File

@ -35,4 +35,7 @@ public class AppAuthLoginRespVO {
@Schema(description = "社交用户 openid", example = "qq768") @Schema(description = "社交用户 openid", example = "qq768")
private String openid; private String openid;
@Schema(description = "租户编号", example = "1")
private Long tenantId;
} }

View File

@ -38,6 +38,9 @@ public class AppMemberUserInfoRespVO {
@Schema(description = "是否成为推广员", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") @Schema(description = "是否成为推广员", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
private Boolean brokerageEnabled; private Boolean brokerageEnabled;
@Schema(description = "租户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "162")
private Long tenantId;
@Schema(description = "用户 App - 会员等级") @Schema(description = "用户 App - 会员等级")
@Data @Data
public static class Level { public static class Level {

View File

@ -22,6 +22,7 @@ import java.util.stream.Collectors;
@Mapper @Mapper
public interface MemberUserMapper extends BaseMapperX<MemberUserDO> { public interface MemberUserMapper extends BaseMapperX<MemberUserDO> {
@com.yanzhu.framework.tenant.core.aop.TenantIgnore
default MemberUserDO selectByMobile(String mobile) { default MemberUserDO selectByMobile(String mobile) {
return selectOne(MemberUserDO::getMobile, mobile); return selectOne(MemberUserDO::getMobile, mobile);
} }

View File

@ -85,4 +85,12 @@ public interface MemberAuthService {
*/ */
AppAuthLoginRespVO refreshToken(String refreshToken); AppAuthLoginRespVO refreshToken(String refreshToken);
/**
*
*
* @param mobile
* @return
*/
com.yanzhu.module.member.dal.dataobject.user.MemberUserDO getUserByMobile(String mobile);
} }

View File

@ -152,8 +152,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, openid); return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL, openid);
} }
private AppAuthLoginRespVO createTokenAfterLoginSuccess(MemberUserDO user, String mobile, private AppAuthLoginRespVO createTokenAfterLoginSuccess(MemberUserDO user, String mobile, LoginLogTypeEnum logType, String openid) {
LoginLogTypeEnum logType, String openid) {
// 插入登陆日志 // 插入登陆日志
createLoginLog(user.getId(), mobile, logType, LoginResultEnum.SUCCESS); createLoginLog(user.getId(), mobile, logType, LoginResultEnum.SUCCESS);
// 创建 Token 令牌 // 创建 Token 令牌
@ -161,7 +160,10 @@ public class MemberAuthServiceImpl implements MemberAuthService {
.setUserId(user.getId()).setUserType(getUserType().getValue()) .setUserId(user.getId()).setUserType(getUserType().getValue())
.setClientId(OAuth2ClientConstants.CLIENT_ID_DEFAULT)); .setClientId(OAuth2ClientConstants.CLIENT_ID_DEFAULT));
// 构建返回结果 // 构建返回结果
return AuthConvert.INSTANCE.convert(accessTokenRespDTO, openid); AppAuthLoginRespVO respVO = AuthConvert.INSTANCE.convert(accessTokenRespDTO, openid);
// 设置租户ID
respVO.setTenantId(user.getTenantId());
return respVO;
} }
@Override @Override
@ -257,6 +259,11 @@ public class MemberAuthServiceImpl implements MemberAuthService {
return AuthConvert.INSTANCE.convert(accessTokenDO, null); return AuthConvert.INSTANCE.convert(accessTokenDO, null);
} }
@Override
public MemberUserDO getUserByMobile(String mobile) {
return userService.getUserByMobile(mobile);
}
private void createLogoutLog(Long userId) { private void createLogoutLog(Long userId) {
LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO(); LoginLogCreateReqDTO reqDTO = new LoginLogCreateReqDTO();
reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType()); reqDTO.setLogType(LoginLogTypeEnum.LOGOUT_SELF.getType());

View File

@ -3,9 +3,13 @@ SHOPRO_VERSION=v2.4.1
# 后端接口 - 正式环境(通过 process.env.NODE_ENV 非 development # 后端接口 - 正式环境(通过 process.env.NODE_ENV 非 development
#SHOPRO_BASE_URL=http://api-dashboard.yudao.iocoder.cn #SHOPRO_BASE_URL=http://api-dashboard.yudao.iocoder.cn
SHOPRO_BASE_URL=http://127.0.0.1:48080 #SHOPRO_BASE_URL=http://127.0.0.1:48080
SHOPRO_BASE_URL=
#http://62.234.3.186
# 后端接口 - 测试环境(通过 process.env.NODE_ENV = development # 后端接口 - 测试环境(通过 process.env.NODE_ENV = development
SHOPRO_DEV_BASE_URL=http://127.0.0.1:48080 #SHOPRO_DEV_BASE_URL=http://127.0.0.1:48080
SHOPRO_DEV_BASE_URL=
#http://62.234.3.186
### SHOPRO_DEV_BASE_URL=http://10.171.1.188:48080 ### SHOPRO_DEV_BASE_URL=http://10.171.1.188:48080
### SHOPRO_DEV_BASE_URL = http://yunai.natapp1.cc ### SHOPRO_DEV_BASE_URL = http://yunai.natapp1.cc

View File

@ -89,11 +89,12 @@
}, },
"dependencies": { "dependencies": {
"dayjs": "^1.11.7", "dayjs": "^1.11.7",
"lodash": "^4.17.21", "lodash": "^4.17.23",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"luch-request": "^3.0.8", "luch-request": "^3.0.8",
"pinia": "^2.0.33", "pinia": "^2.0.33",
"pinia-plugin-persist-uni": "^1.2.0", "pinia-plugin-persist-uni": "^1.2.0",
"vue": "^3.5.11",
"weixin-js-sdk": "^1.6.0" "weixin-js-sdk": "^1.6.0"
}, },
"devDependencies": { "devDependencies": {

View File

@ -181,7 +181,7 @@
&::before { &::before {
content: ''; content: '';
width: 64rpx; width: 64rpx;
height: 12rpx; height: 88rpx;
background: linear-gradient( background: linear-gradient(
90deg, 90deg,
var(--ui-BG-Main-gradient), var(--ui-BG-Main-gradient),

View File

@ -25,6 +25,8 @@
import { onLoad, onShow, onPageScroll, onPullDownRefresh } from '@dcloudio/uni-app'; import { onLoad, onShow, onPageScroll, onPullDownRefresh } from '@dcloudio/uni-app';
import sheep from '@/sheep'; import sheep from '@/sheep';
import $share from '@/sheep/platform/share'; import $share from '@/sheep/platform/share';
import { showAuthModal } from '@/sheep/hooks/useModal';
import $store from '@/sheep/store';
// tabBar // tabBar
uni.hideTabBar({ uni.hideTabBar({
fail: () => {}, fail: () => {},
@ -91,6 +93,12 @@
} }
} }
// #endif // #endif
//
const userStore = $store('user');
if (!userStore.isLogin) {
showAuthModal('smsLogin');
}
}); });
// //

View File

@ -1,4 +1,5 @@
import { baseUrl, apiPath, tenantId } from '@/sheep/config'; import { baseUrl, apiPath } from '@/sheep/config';
import { getTenantId } from '@/sheep/request';
import request, { getAccessToken } from '@/sheep/request'; import request, { getAccessToken } from '@/sheep/request';
const FileApi = { const FileApi = {
@ -14,7 +15,7 @@ const FileApi = {
name: 'file', name: 'file',
header: { header: {
Accept: '*/*', Accept: '*/*',
'tenant-id': tenantId, 'tenant-id': getTenantId(),
Authorization: 'Bearer ' + getAccessToken(), Authorization: 'Bearer ' + getAccessToken(),
}, },
formData: { formData: {

View File

@ -83,12 +83,16 @@
.login-btn-start { .login-btn-start {
width: 158rpx; width: 158rpx;
height: 56rpx; height: 56rpx;
line-height: normal; line-height: 56rpx;
background: linear-gradient(90deg, var(--ui-BG-Main), var(--ui-BG-Main-gradient)); background: linear-gradient(90deg, var(--ui-BG-Main, #409eff), var(--ui-BG-Main-gradient, #66b1ff)) !important;
border-radius: 28rpx; border-radius: 28rpx;
font-size: 26rpx; font-size: 26rpx;
font-weight: 500; font-weight: 500;
color: #fff; color: #fff !important;
border: none;
outline: none;
display: inline-block;
text-align: center;
} }
.type-btn { .type-btn {

View File

@ -1,6 +1,6 @@
<template> <template>
<!-- 规格弹窗 --> <!-- 规格弹窗 -->
<su-popup :show="authType !== ''" round="10" :showClose="true" @close="closeAuthModal"> <su-popup :show="authType !== ''" round="10" :showClose="userStore.isLogin" :isMaskClick="userStore.isLogin" @close="closeAuthModal">
<view class="login-wrap"> <view class="login-wrap">
<!-- 1. 账号密码登录 accountLogin --> <!-- 1. 账号密码登录 accountLogin -->
<account-login <account-login
@ -93,14 +93,13 @@
:class="{ shake: currentProtocol }" :class="{ shake: currentProtocol }"
> >
<view class="agreement-title ss-m-b-20">请选择是否同意以下协议(请联网查看)</view> <view class="agreement-title ss-m-b-20">请选择是否同意以下协议(请联网查看)</view>
<view class="agreement-options-container"> <view class="agreement-options-container">
<!-- 同意选项 --> <!-- 同意选项 -->
<view class="agreement-option ss-m-b-20"> <view class="agreement-option ss-m-b-20">
<view class="radio ss-flex ss-col-center" @tap="onAgree"> <view class="radio ss-flex ss-col-center">
<radio <radio
:checked="state.protocol === true" :checked="state.protocol == true"
color="var(--ui-BG-Main)" color="#ff4d4f"
style="transform: scale(0.8)" style="transform: scale(0.8)"
@tap.stop="onAgree" @tap.stop="onAgree"
/> />
@ -115,7 +114,7 @@
<!-- 拒绝选项 --> <!-- 拒绝选项 -->
<view class="agreement-option"> <view class="agreement-option">
<view class="radio ss-flex ss-col-center" @tap="onRefuse"> <view class="radio ss-flex ss-col-center">
<radio <radio
:checked="state.protocol === false" :checked="state.protocol === false"
color="#ff4d4f" color="#ff4d4f"
@ -147,13 +146,15 @@
import changePassword from './components/change-password.vue'; import changePassword from './components/change-password.vue';
import mpAuthorization from './components/mp-authorization.vue'; import mpAuthorization from './components/mp-authorization.vue';
import { closeAuthModal, showAuthModal } from '@/sheep/hooks/useModal'; import { closeAuthModal, showAuthModal } from '@/sheep/hooks/useModal';
import $store from '@/sheep/store';
const modalStore = sheep.$store('modal'); const modalStore = sheep.$store('modal');
const userStore = $store('user');
// //
const authType = computed(() => modalStore.auth); const authType = computed(() => modalStore.auth);
const state = reactive({ const state = reactive({
protocol: null, // nulltruefalse protocol: false, // falsetrue
}); });
const currentProtocol = ref(false); const currentProtocol = ref(false);
@ -170,7 +171,9 @@
// //
function onProtocol(title) { function onProtocol(title) {
if (userStore.isLogin) {
closeAuthModal(); closeAuthModal();
}
sheep.$router.go('/pages/public/richtext', { sheep.$router.go('/pages/public/richtext', {
title, title,
}); });
@ -192,11 +195,7 @@
currentProtocol.value = false; currentProtocol.value = false;
}, 1000); }, 1000);
if (state.protocol === false) { sheep.$helper.toast('请选择同意协议后继续');
sheep.$helper.toast('您已拒绝协议,无法继续登录');
} else {
sheep.$helper.toast('请选择是否同意协议');
}
return; return;
} }
const loginRes = await sheep.$platform.useProvider(provider).login(); const loginRes = await sheep.$platform.useProvider(provider).login();

View File

@ -4,7 +4,7 @@
*/ */
import Request from 'luch-request'; import Request from 'luch-request';
import { apiPath, baseUrl, tenantId } from '@/sheep/config'; import { apiPath, baseUrl } from '@/sheep/config';
import $store from '@/sheep/store'; import $store from '@/sheep/store';
import $platform from '@/sheep/platform'; import $platform from '@/sheep/platform';
import { showAuthModal } from '@/sheep/hooks/useModal'; import { showAuthModal } from '@/sheep/hooks/useModal';
@ -98,7 +98,9 @@ http.interceptors.request.use(
config.header['terminal'] = getTerminal(); config.header['terminal'] = getTerminal();
config.header['Accept'] = '*/*'; config.header['Accept'] = '*/*';
config.header['tenant-id'] = getTenantId(); const tenantId = getTenantId();
config.header['tenant-id'] = tenantId;
console.log('请求头中的租户ID:', tenantId);
return config; return config;
}, },
(error) => { (error) => {
@ -114,6 +116,10 @@ http.interceptors.response.use(
// 约定:如果是 /auth/ 下的 URL 地址,并且返回了 accessToken 说明是登录相关的接口,则自动设置登陆令牌 // 约定:如果是 /auth/ 下的 URL 地址,并且返回了 accessToken 说明是登录相关的接口,则自动设置登陆令牌
if (response.config.url.indexOf('/member/auth/') >= 0 && response.data?.data?.accessToken) { if (response.config.url.indexOf('/member/auth/') >= 0 && response.data?.data?.accessToken) {
$store('user').setToken(response.data.data.accessToken, response.data.data.refreshToken); $store('user').setToken(response.data.data.accessToken, response.data.data.refreshToken);
// 存储租户ID
if (response.data.data.tenantId) {
uni.setStorageSync('tenant-id', response.data.data.tenantId);
}
} }
// 自定处理【loading 加载中】:如果需要显示 loading则关闭 loading // 自定处理【loading 加载中】:如果需要显示 loading则关闭 loading
@ -300,7 +306,7 @@ export const getRefreshToken = () => {
/** 获得租户编号 */ /** 获得租户编号 */
export const getTenantId = () => { export const getTenantId = () => {
return uni.getStorageSync('tenant-id') || tenantId; return uni.getStorageSync('tenant-id');
}; };
const request = (config) => { const request = (config) => {

View File

@ -54,6 +54,10 @@ const user = defineStore({
return; return;
} }
this.userInfo = data; this.userInfo = data;
// 存储租户ID
if (data.tenantId) {
uni.setStorageSync('tenant-id', data.tenantId);
}
return Promise.resolve(data); return Promise.resolve(data);
}, },
@ -86,6 +90,7 @@ const user = defineStore({
this.isLogin = false; this.isLogin = false;
uni.removeStorageSync('token'); uni.removeStorageSync('token');
uni.removeStorageSync('refresh-token'); uni.removeStorageSync('refresh-token');
uni.removeStorageSync('tenant-id');
} else { } else {
this.isLogin = true; this.isLogin = true;
uni.setStorageSync('token', token); uni.setStorageSync('token', token);

View File

@ -29,6 +29,14 @@ export default (command, mode) => {
hmr: { hmr: {
overlay: true, overlay: true,
}, },
proxy: {
'/app-api': {
target: 'http://localhost:48080/',//'http://62.234.3.186/',
//target: 'http://62.234.3.186/',
ws: false,
changeOrigin: true,
},
}
}, },
}; };
}; };

View File

@ -0,0 +1,267 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/helper-string-parser@^7.27.1":
version "7.27.1"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
"@babel/helper-validator-identifier@^7.28.5":
version "7.28.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4"
integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
"@babel/parser@^7.28.5":
version "7.29.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6"
integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==
dependencies:
"@babel/types" "^7.29.0"
"@babel/runtime@^7.17.2":
version "7.28.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b"
integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==
"@babel/types@^7.29.0":
version "7.29.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7"
integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==
dependencies:
"@babel/helper-string-parser" "^7.27.1"
"@babel/helper-validator-identifier" "^7.28.5"
"@dcloudio/types@^2.0.16":
version "2.6.12"
resolved "https://registry.yarnpkg.com/@dcloudio/types/-/types-2.6.12.tgz#6c9559b9e65483f355dd61cb88fe8c14c8e61189"
integrity sha512-mrCMwcINy1IFjU9VUqLeWBkj404yWs5paLDttBcA+eqUjanuUQbBcTVPqlrGgkyzLXDcV2oDDZRSNxNpXi4kMQ==
"@jridgewell/sourcemap-codec@^1.5.5":
version "1.5.5"
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
"@vue/compiler-core@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.27.tgz#ce4402428e26095586eb889c41f6e172eb3960bd"
integrity sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==
dependencies:
"@babel/parser" "^7.28.5"
"@vue/shared" "3.5.27"
entities "^7.0.0"
estree-walker "^2.0.2"
source-map-js "^1.2.1"
"@vue/compiler-dom@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz#32b2bc87f0a652c253986796ace0ed6213093af8"
integrity sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==
dependencies:
"@vue/compiler-core" "3.5.27"
"@vue/shared" "3.5.27"
"@vue/compiler-sfc@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz#84651b8816bf8e7d6e62fddd14db86efd6d6f1b6"
integrity sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==
dependencies:
"@babel/parser" "^7.28.5"
"@vue/compiler-core" "3.5.27"
"@vue/compiler-dom" "3.5.27"
"@vue/compiler-ssr" "3.5.27"
"@vue/shared" "3.5.27"
estree-walker "^2.0.2"
magic-string "^0.30.21"
postcss "^8.5.6"
source-map-js "^1.2.1"
"@vue/compiler-ssr@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz#b480cad09dacf8f3d9c82b9843402f1a803baee7"
integrity sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==
dependencies:
"@vue/compiler-dom" "3.5.27"
"@vue/shared" "3.5.27"
"@vue/devtools-api@^6.6.3":
version "6.6.4"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
"@vue/reactivity@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.27.tgz#d870557de1389a27b8abcb7cbfa30978dc69a000"
integrity sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==
dependencies:
"@vue/shared" "3.5.27"
"@vue/runtime-core@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.27.tgz#bb43744ed070166c7d581b849ac22b71a9ccf127"
integrity sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==
dependencies:
"@vue/reactivity" "3.5.27"
"@vue/shared" "3.5.27"
"@vue/runtime-dom@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz#392513252c7ca7e5277240fdc70b8093449127f5"
integrity sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==
dependencies:
"@vue/reactivity" "3.5.27"
"@vue/runtime-core" "3.5.27"
"@vue/shared" "3.5.27"
csstype "^3.2.3"
"@vue/server-renderer@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.27.tgz#8137d0d7ec3b59d5992bb04c553775d209dddba7"
integrity sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==
dependencies:
"@vue/compiler-ssr" "3.5.27"
"@vue/shared" "3.5.27"
"@vue/shared@3.5.27":
version "3.5.27"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.27.tgz#33a63143d8fb9ca1b3efbc7ecf9bd0ab05f7e06e"
integrity sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==
copy-text-to-clipboard@^3.0.1:
version "3.2.2"
resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz#99bc79db3f2d355ec33a08d573aff6804491ddb9"
integrity sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==
core-js@^3.11.0:
version "3.48.0"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.48.0.tgz#1f813220a47bbf0e667e3885c36cd6f0593bf14d"
integrity sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==
csstype@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
dayjs@^1.11.7:
version "1.11.19"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938"
integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==
entities@^7.0.0:
version "7.0.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b"
integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
lodash-es@^4.17.21:
version "4.17.23"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0"
integrity sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==
lodash@^4.17.23:
version "4.17.23"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.23.tgz#f113b0378386103be4f6893388c73d0bde7f2c5a"
integrity sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==
luch-request@^3.0.8:
version "3.1.1"
resolved "https://registry.yarnpkg.com/luch-request/-/luch-request-3.1.1.tgz#a62b0aab54c5acd9da5b5fd0564ed2cdb8af9c2f"
integrity sha512-p7+mlcEtgRcd0OfXC4XZbyiwSr1XgCeqNT7LlVUjnk7InYl/8d5Rk7BUqAYNA2WRafI1wRIUQWRWZRpeUwWR0w==
dependencies:
"@dcloudio/types" "^2.0.16"
magic-string@^0.30.21:
version "0.30.21"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91"
integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.5"
mutation-observer@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/mutation-observer/-/mutation-observer-1.0.3.tgz#42e9222b101bca82e5ba9d5a7acf4a14c0f263d0"
integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==
nanoid@^3.3.11:
version "3.3.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
picocolors@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
pinia-plugin-persist-uni@^1.2.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/pinia-plugin-persist-uni/-/pinia-plugin-persist-uni-1.3.2.tgz#bff4621be537eec1f545a621e6113a01b45a4866"
integrity sha512-Z47MWlAI3dnm9xENwodYyT6B3TMDuwFK7MHHymwQyrTchuhG2Yu26w7bYlIap7df0fCwNCmAo0n7n1RK3Ute+w==
dependencies:
vue-demi "^0.12.1"
pinia@^2.0.33:
version "2.3.1"
resolved "https://registry.yarnpkg.com/pinia/-/pinia-2.3.1.tgz#54c476675b72f5abcfafa24a7582531ea8c23d94"
integrity sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==
dependencies:
"@vue/devtools-api" "^6.6.3"
vue-demi "^0.14.10"
postcss@^8.5.6:
version "8.5.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c"
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
dependencies:
nanoid "^3.3.11"
picocolors "^1.1.1"
source-map-js "^1.2.1"
prettier@^2.8.7:
version "2.8.8"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
source-map-js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
vconsole@^3.15.0:
version "3.15.1"
resolved "https://registry.yarnpkg.com/vconsole/-/vconsole-3.15.1.tgz#569a8ab15f353259527bbcf004f02946b4482cff"
integrity sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==
dependencies:
"@babel/runtime" "^7.17.2"
copy-text-to-clipboard "^3.0.1"
core-js "^3.11.0"
mutation-observer "^1.0.3"
vue-demi@^0.12.1:
version "0.12.5"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.12.5.tgz#8eeed566a7d86eb090209a11723f887d28aeb2d1"
integrity sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==
vue-demi@^0.14.10:
version "0.14.10"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"
integrity sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==
vue@^3.5.11:
version "3.5.27"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.27.tgz#e55fd941b614459ab2228489bc19d1692e05876c"
integrity sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==
dependencies:
"@vue/compiler-dom" "3.5.27"
"@vue/compiler-sfc" "3.5.27"
"@vue/runtime-dom" "3.5.27"
"@vue/server-renderer" "3.5.27"
"@vue/shared" "3.5.27"
weixin-js-sdk@^1.6.0:
version "1.6.5"
resolved "https://registry.yarnpkg.com/weixin-js-sdk/-/weixin-js-sdk-1.6.5.tgz#01fe5220b91dbfe089fc0730d061be0e68271e6a"
integrity sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ==