Compare commits

...

10 Commits

Author SHA1 Message Date
woody 8b1a9ef54f Merge branch 'test' of 47.94.45.65:angelo/web-africa-h5 into base-online 2025-09-01 09:11:10 +08:00
woody 22abef940b fix(main): rm location redirect 2025-09-01 09:10:40 +08:00
woody d5d481b39a Merge branch 'test' of 47.94.45.65:angelo/web-africa-h5 into base-online 2025-08-28 15:29:20 +08:00
woody a4b5d8b52f feat(security): 隐藏邮箱设置入口 2025-08-28 14:40:18 +08:00
woody e37b60f54f chore(config): update ossapi url 2025-08-28 14:04:11 +08:00
woody c43c566091 chore(config): update app url 2025-08-28 13:51:35 +08:00
woody 203a36085e chore(manifest): update app name 2025-08-28 11:19:05 +08:00
woody 9453a799b7 feat(global): 国际化及配置处理 2025-08-28 10:54:21 +08:00
woody 65a6780398 feat(main): update url 2025-08-15 14:41:02 +08:00
woody 7891ea5956 chore(gitignore): update gitignore 2025-08-15 14:12:43 +08:00
24 changed files with 1118 additions and 3267 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/unpackage/dist/build/.automator/h5
/unpackage
/node_modules

View File

@ -221,12 +221,7 @@ export default {
this.$i18n.mergeLocaleMessage(name, enUS);
}
}
if (name == "ru-RU") {
if (ruRU) {
const localruRU = this.getJS(ruRU, "ruRU");
this.$i18n.mergeLocaleMessage(name, ruRU);
}
}
if (name == "fr-FR") {
if (frFR) {
const localruRU = this.getJS(frFR, "frFR");
@ -238,9 +233,7 @@ export default {
let self = this;
self.setLocale("en-US", "enUS", "en");
self.setLocale("zh-CN", "zhCN", "zh-CN");
self.setLocale("ru-RU", "ruRU", "ru-RU");
self.setLocale("fr-FR", "frFR", "fr-FR");
// self.setLocale('pt-PT', 'ptPT', 'pt-PT');
},
isFirstEnter() {
var firstEnter = uni.getStorageSync("firstEnter"); //

View File

@ -130,7 +130,7 @@
},
getData() {
let self = this;
self._get("/member/api/member/get-member-annuity-time", {}, (res) => {
self._get("member/api/member/get-member-annuity-time", {}, (res) => {
self.annuityParams = res.data;
if (
self.annuityParams.expireDateNumber <= 60 &&
@ -146,7 +146,7 @@
},
getMemberRenewAmount() {
let self = this;
self._get("/member/api/member/get-member-renew-amount", {}, (res) => {
self._get("member/api/member/get-member-renew-amount", {}, (res) => {
this.qnnuityPrice = res.data;
this.isPopup = true;
});

View File

@ -42,14 +42,6 @@
></image>
</view>
<view>
<!-- <image
crossorigin="anonymous"
data-etype="image"
:data-enode="treeData.countryUrl2"
:src="'data:image/png;base64,' + treeData.countryUrl2Base64"
mode="aspectFit"
class="poster2"
></image> -->
<image
crossorigin="anonymous"
data-etype="image"
@ -139,7 +131,6 @@
</view>
</view>
<view class="flex_btn">
<!-- <view @click.stop="downImage('Poster1')" class="goTop_btn" style="backgroundColor:#ee1e26">{{ $t('S_C_45') }}</view> -->
<view
@click.stop="copyText(treeData)"
class="goTop_btn"
@ -164,8 +155,7 @@
v-if="
Array.isArray(treeData.children) &&
treeData.children.length &&
treeData.extend &&
!loading
treeData.extend
"
>
<view
@ -175,7 +165,7 @@
class="childLevel v-td"
>
<TreeChart
:json="children"
:treeData="children"
:left="0"
:top="0"
@click-node="clickNode"
@ -183,7 +173,6 @@
/>
</view>
</view>
<!-- <Eposter width="750" height="1334" :list="list" backgroundColor="rgb(255, 255, 255)" @on-success="onSuccess" ref="Eposter"></Eposter> -->
</view>
</template>
@ -195,59 +184,14 @@ export default {
// Eposter
},
name: "TreeChart",
props: ["json", "size"],
props: ["treeData", "size"],
data() {
return {
treeData: {},
list: [],
languages: "",
loading: true,
};
},
watch: {
json: {
handler: function (Props) {
let extendKey = function (jsonData) {
if (Object.prototype.toString.call(jsonData) !== "[object Object]") {
jsonData = {};
}
jsonData.extend =
jsonData.extend === void 0 ? true : !!jsonData.extend;
if (Array.isArray(jsonData.children)) {
jsonData.children.forEach((c) => {
extendKey(c);
});
}
return jsonData;
};
if (Props) {
let self = this;
// self._post(
// 'member/manage/member-structure/get-url-base64',
// {
// countryUrl2: extendKey(Props).countryUrl2,
// settleCountryUrl2: extendKey(Props).settleCountryUrl2,
// avatarUrl: extendKey(Props).avatarUrl
// },
// res => {
// extendKey(Props).countryUrl2Base64 = res.countryUrl2Base64;
// extendKey(Props).settleCountryUrl2Base64 = res.settleCountryUrl2Base64;
// extendKey(Props).avatarUrlBase64 = res.avatarUrlBase64;
// this.treeData = extendKey(Props);
// self.loading = false;
// }
// );
extendKey(Props).countryUrl2Base64 = extendKey(Props).countryUrl2;
extendKey(Props).settleCountryUrl2Base64 =
extendKey(Props).settleCountryUrl2;
extendKey(Props).avatarUrlBase64 = extendKey(Props).avatarUrl;
this.treeData = extendKey(Props);
self.loading = false;
}
},
immediate: true,
},
},
onload() {
this.languages = uni.getLocale();
},
@ -291,44 +235,6 @@ export default {
},
});
},
//
downImage(elClass) {
this.$refs.Eposter.createForElRect(elClass, false);
},
downloadImg() {
let self = this;
let element = document.querySelector(".Poster1");
uni.showLoading({
title: self.$t("w_0413"),
});
html2canvas(element)
.then(function (canvas) {
let dataURL = canvas.toDataURL("image/jpeg");
let link = document.createElement("a");
link.style.display = "none";
link.href = dataURL;
link.download = "image.jpg";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
uni.showToast({
icon: "none",
title: self.$t("fn_056"),
duration: 2000,
});
uni.hideLoading();
})
.catch(function (error) {
uni.hideLoading();
uni.showModal({
title: self.$t("w_0406"),
});
});
},
onSuccess(val) {
this.posterImg = val;
this.downloadImg(this.posterImg);
},
toggleExtend: function (treeData) {
treeData.extend = !treeData.extend;
this.$forceUpdate();

View File

@ -1,14 +1,12 @@
var app_url = 'http://f.hzs413.com';
var app_url = '/prod-api/';
var yxyapi = 'https://yxy.hzs413.com';
var ossapi = 'https://dny-test.s3.ap-southeast-1.amazonaws.com';
var ossurl = '/online/language/';
var ossapi = 'https://agl413-test.s3.af-south-1.amazonaws.com';
var ossurl = '/test/';
// 如果是本地测试环境
if (process.env.NODE_ENV === 'development') {
//#ifdef H5
app_url = '/api';
app_url = 'http://192.168.0.86:8080/';
yxyapi = '/dev-api';
ossapi = '/oss-api';
ossurl = '/online/language/';
//#endif
}
// 如果是生产环境h5环境下直接读取url

View File

@ -2,14 +2,12 @@ import enUS from './en-US.json'
import zhCN from './zh-CN';
// import zhHant from './zh-Hant.json'
import frFR from './fr-FR.json'
import ruRU from './ru-RU.json'
import ptPT from './pt-PT.json'
export default {
'en-US': enUS,
'zh-CN': zhCN,
// 'zh-Hant': zhHant,
'fr-FR': frFR,
'ru-RU': ruRU,
'pt-PT':ptPT
}

File diff suppressed because it is too large Load Diff

View File

@ -1,34 +0,0 @@
{
"common": {
"uni.app.quit": "Нажмите еще раз, чтобы выйти из приложения",
"uni.async.error": "Время ожидания подключения к серверу, нажмите на экран, чтобы повторить попытку",
"uni.showActionSheet.cancel": "Отменить",
"uni.showToast.unpaired": "Обратите внимание, что ShowToast и HideToast должны работать вместе.",
"uni.showLoading.unpaired": "Обратите внимание, что showLoading и hideLoading должны быть совместимы.",
"uni.showModal.cancel": "Отменить",
"uni.showModal.confirm": "Определение",
"uni.chooseImage.cancel": "Отменить",
"uni.chooseImage.sourceType.album": "Выбрать из альбома",
"uni.chooseImage.sourceType.camera": "Съемки",
"uni.chooseVideo.cancel": "Отменить",
"uni.chooseVideo.sourceType.album": "Выбрать из альбома",
"uni.chooseVideo.sourceType.camera": "Съемки",
"uni.previewImage.cancel": "Отменить",
"uni.previewImage.button.save": "Сохранить изображение",
"uni.previewImage.save.success": "Сохранить изображение в альбом",
"uni.previewImage.save.fail": "Ошибка сохранения изображения в альбоме",
"uni.setClipboardData.success": "Содержание скопировано",
"uni.scanCode.title": "Код сканирования",
"uni.scanCode.album": "Фотоальбом",
"uni.scanCode.fail": "Ошибка идентификации",
"uni.scanCode.flash.on": "Подсветка",
"uni.scanCode.flash.off": "Приключения закрываются",
"uni.startSoterAuthentication.authContent": "Отпечатки пальцев....",
"uni.picker.done": "Завершено",
"uni.picker.cancel": "Отменить",
"uni.video.danmu": "Снаряд",
"uni.video.volume": "Громкость",
"uni.button.feedback.title": "Обратная связь ",
"uni.button.feedback.send": "Отправить"
}
}

36
main.js
View File

@ -17,14 +17,9 @@ let i18nConfig = {
'en-US': messages['en-US'],
'zh-CN': messages['zh-CN'],
// 'zh-Hant': messages['zh-Hant'],
'ru-RU': messages['ru-RU'],
'fr-FR': messages['fr-FR'],
'pt-PT': messages['pt-PT'],
// 'en': '',
// 'zh-CN': '',
// 'zh-Hant': '',
// 'ru-RU': '',
// 'fr-FR': '',
}
}
import VueI18n from 'vue-i18n'
@ -85,9 +80,9 @@ app.$router.afterEach((to, from) => {
}
const u = navigator.userAgent.toLowerCase()
if (u.indexOf("like mac os x") < 0 || u.match(/MicroMessenger/i) != 'micromessenger') return
if (to.path !== global.location.pathname) {
location.assign(config.h5_addr + to.fullPath);
}
// if (to.path !== global.location.pathname) {
// location.assign(config.h5_addr + to.fullPath);
// }
})
//#endif
@ -114,10 +109,12 @@ Vue.prototype._get = function(path, data, success, fail, complete) {
let host = self.websiteUrl();
// #ifndef APP-PLUS
host = config.app_url
console.log(host, '...host')
// #endif
let callback = function() {
uni.request({
url: host + '/inter-api/' + path,
url: host + path,
data: data,
dataType: 'json',
header: {
@ -195,7 +192,7 @@ Vue.prototype._post = function(path, data, success, fail, complete) {
Source = '3'
// #endif
uni.request({
url: host + '/inter-api/' + path,
url: host + path,
data: data,
dataType: 'json',
method: 'POST',
@ -241,7 +238,7 @@ Vue.prototype._put = function(path, data, success, fail, complete) {
host = config.app_url
// #endif
uni.request({
url: host + '/inter-api/' + path + '/' + data,
url: host + path + '/' + data,
dataType: 'json',
method: 'PUT',
header: {
@ -281,7 +278,7 @@ Vue.prototype._putjson = function(path, data, success, fail, complete) {
host = config.app_url
// #endif
uni.request({
url: host + '/inter-api/' + path,
url: host + path,
data: data,
dataType: 'json',
method: 'PUT',
@ -321,7 +318,7 @@ Vue.prototype._delete = function(path, data, success, fail, complete) {
host = config.app_url
// #endif
uni.request({
url: host + '/inter-api/' + path,
url: host + path,
dataType: 'json',
method: 'DELETE',
header: {
@ -603,18 +600,11 @@ Vue.prototype.topBarTop = function() {
// #ifdef MP-WEIXIN
return uni.getMenuButtonBoundingClientRect().top;
// #endif
// #ifndef MP-WEIXIN
const SystemInfo = uni.getSystemInfoSync();
return SystemInfo.statusBarHeight;
// #endif
};
Vue.prototype.topBarHeight = function() {
// #ifdef MP-WEIXIN
return uni.getMenuButtonBoundingClientRect().height;
// #endif
// #ifndef MP-WEIXIN
return 0
// #endif
};
Vue.prototype.callPhone = function(n) {
if (n == '') {
@ -705,8 +695,6 @@ Vue.prototype.getLocale = function() {
return 'zh-TC'
} else if (l == 'fr-FR') {
return 'fr-FR'
} else if (l == 'ru-RU') {
return 'ru-RU'
} else if (l == 'pt-PT') {
return 'pt-PT'
} else {
@ -721,8 +709,6 @@ Vue.prototype.getLanguage = function() {
return 'zh-TC'
} else if (l == 'fr-FR') {
return 'fr-FR'
} else if (l == 'ru-RU') {
return 'ru-RU'
} else if (l == 'pt-PT') {
return 'pt-PT'
} else {

View File

@ -1,35 +1,35 @@
{
"name" : "海之圣",
"appid" : "__UNI__A4B56F3",
"description" : "海之圣",
"versionName" : "1.6.4",
"versionCode" : 164,
"transformPx" : false,
"app-plus" : {
"compatible" : {
"ignoreVersion" : true //trueHBuilderX1.9.0
"name": "af-app",
"appid": "__UNI__31B4587",
"description": "af-app",
"versionName": "1.6.4",
"versionCode": 164,
"transformPx": false,
"app-plus": {
"compatible": {
"ignoreVersion": true //trueHBuilderX1.9.0
},
/* 5+App */
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
"modules" : {
"Share" : {},
"VideoPlayer" : {},
"Payment" : {},
"Geolocation" : {},
"Barcode" : {},
"Camera" : {}
"modules": {
"Share": {},
"VideoPlayer": {},
"Payment": {},
"Geolocation": {},
"Barcode": {},
"Camera": {}
},
/* */
"distribute" : {
"distribute": {
/* */
"android" : {
"android": {
/* android */
"permissions" : [
"permissions": [
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
@ -49,146 +49,153 @@
"<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
"abiFilters": [
"armeabi-v7a",
"arm64-v8a",
"x86"
]
},
"ios" : {
"idfa" : false,
"privacyDescription" : {
"NSPhotoLibraryUsageDescription" : "评论时需要上传评论图片",
"NSCameraUsageDescription" : "评论时需要上传评论图片",
"NSLocationWhenInUseUsageDescription" : "需要获取您的地理位置,为您推荐最近门店"
"ios": {
"idfa": false,
"privacyDescription": {
"NSPhotoLibraryUsageDescription": "评论时需要上传评论图片",
"NSCameraUsageDescription": "评论时需要上传评论图片",
"NSLocationWhenInUseUsageDescription": "需要获取您的地理位置,为您推荐最近门店"
},
"dSYMs" : false
"dSYMs": false
},
/* ios */
"sdkConfigs" : {
"oauth" : {},
"ad" : {},
"share" : {
"weixin" : {
"appid" : "wx6996eec3fdcc8482",
"UniversalLinks" : "https://hzs.hzs413.com/"
"sdkConfigs": {
"oauth": {},
"ad": {},
"share": {
"weixin": {
"appid": "wx6996eec3fdcc8482",
"UniversalLinks": "https://hzs.hzs413.com/"
}
},
"payment" : {
"weixin" : {
"__platform__" : [ "ios", "android" ],
"appid" : "wx6996eec3fdcc8482",
"UniversalLinks" : "https://hzs.hzs413.com/"
"payment": {
"weixin": {
"__platform__": [
"ios",
"android"
],
"appid": "wx6996eec3fdcc8482",
"UniversalLinks": "https://hzs.hzs413.com/"
}
},
"geolocation" : {
"amap" : {
"__platform__" : [ "ios", "android" ],
"appkey_ios" : "6f95a1f244b11c5948c4f76bdef74044",
"appkey_android" : "87dd4017ae554f18176812ddc4ae4c13"
"geolocation": {
"amap": {
"__platform__": [
"ios",
"android"
],
"appkey_ios": "6f95a1f244b11c5948c4f76bdef74044",
"appkey_android": "87dd4017ae554f18176812ddc4ae4c13"
}
}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
}
}
},
"splashscreen" : {
"androidStyle" : "default",
"iosStyle" : "storyboard",
"android" : {
"hdpi" : "E:/工作/项目/2023客户/一体化/一体化上传20230717/.9/480.9.png",
"xhdpi" : "E:/工作/项目/2023客户/一体化/一体化上传20230717/.9/720.9.png",
"xxhdpi" : "E:/工作/项目/2023客户/一体化/一体化上传20230717/.9/1080.9.png"
"splashscreen": {
"androidStyle": "default",
"iosStyle": "storyboard",
"android": {
"hdpi": "E:/工作/项目/2023客户/一体化/一体化上传20230717/.9/480.9.png",
"xhdpi": "E:/工作/项目/2023客户/一体化/一体化上传20230717/.9/720.9.png",
"xxhdpi": "E:/工作/项目/2023客户/一体化/一体化上传20230717/.9/1080.9.png"
},
"ios" : {
"storyboard" : "E:/工作/项目/2023客户/一体化/一体化上传20230717/CustomStoryboard.zip"
"ios": {
"storyboard": "E:/工作/项目/2023客户/一体化/一体化上传20230717/CustomStoryboard.zip"
}
}
}
},
/* SDK */
"quickapp" : {},
"quickapp": {},
/* */
"mp-weixin" : {
"mp-weixin": {
/* */
"appid" : "wx6996eec3fdcc8482",
"setting" : {
"urlCheck" : false,
"es6" : true,
"postcss" : true,
"minified" : true
"appid": "wx6996eec3fdcc8482",
"setting": {
"urlCheck": false,
"es6": true,
"postcss": true,
"minified": true
},
"usingComponents" : true,
"permission" : {
"scope.userLocation" : {
"desc" : "你的位置信息将用于小程序位置接口的效果展示"
"usingComponents": true,
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于小程序位置接口的效果展示"
}
}
},
"h5" : {
"router" : {
"mode" : "hash",
"base" : ""
"h5": {
"router": {
"mode": "hash",
"base": ""
},
"devServer" : {
"https" : false,
"proxy" : {
"/api" : {
"ws" : false,
"target" : "http://f.hzs413.com",
"changeOrigin" : true,
"secure" : false,
"pathRewrite" : {
"^/api" : "/"
"devServer": {
"https": false,
"proxy": {
"/prod-api": {
"ws": false,
"target": "http://af-app.beida413.com/",
"changeOrigin": true,
"secure": false
},
"/dev-api": {
"ws": false,
"target": "https://yxy.hzs413.com",
"changeOrigin": true,
"secure": false,
"pathRewrite": {
"^/dev-api": "/"
}
},
"/dev-api" : {
"ws" : false,
"target" : "https://yxy.hzs413.com",
"changeOrigin" : true,
"secure" : false,
"pathRewrite" : {
"^/dev-api" : "/"
}
},
"/oss-api" : {
"ws" : false,
"target" : "https://dny-test.s3.ap-southeast-1.amazonaws.com",
"changeOrigin" : true,
"secure" : false,
"pathRewrite" : {
"^/oss-api" : "/"
"/oss-api": {
"ws": false,
"target": "https://dny-test.s3.ap-southeast-1.amazonaws.com",
"changeOrigin": true,
"secure": false,
"pathRewrite": {
"^/oss-api": "/"
}
}
}
},
"title" : "店铺管理系统"
"title": "店铺管理系统"
},
"fallbackLocale" : "en-US",
"locale" : "en-US"
}
"fallbackLocale": "en-US",
"locale": "en-US"
}

470
package-lock.json generated
View File

@ -12,6 +12,52 @@
"vue-i18n": "^9.2.2"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"peer": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"peer": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.28.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
"integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
"peer": true,
"dependencies": {
"@babel/types": "^7.28.2"
},
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/types": {
"version": "7.28.2",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
"peer": true,
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@intlify/core-base": {
"version": "9.2.2",
"resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz",
@ -69,11 +115,117 @@
"node": ">= 14"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"peer": true
},
"node_modules/@vue/compiler-core": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
"integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
"peer": true,
"dependencies": {
"@babel/parser": "^7.28.0",
"@vue/shared": "3.5.18",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
"integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
"peer": true,
"dependencies": {
"@vue/compiler-core": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
"integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
"peer": true,
"dependencies": {
"@babel/parser": "^7.28.0",
"@vue/compiler-core": "3.5.18",
"@vue/compiler-dom": "3.5.18",
"@vue/compiler-ssr": "3.5.18",
"@vue/shared": "3.5.18",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.17",
"postcss": "^8.5.6",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
"integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"node_modules/@vue/devtools-api": {
"version": "6.5.0",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
},
"node_modules/@vue/reactivity": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz",
"integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
"peer": true,
"dependencies": {
"@vue/shared": "3.5.18"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
"integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
"integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
"peer": true,
"dependencies": {
"@vue/reactivity": "3.5.18",
"@vue/runtime-core": "3.5.18",
"@vue/shared": "3.5.18",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
"integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
"peer": true,
"dependencies": {
"@vue/compiler-ssr": "3.5.18",
"@vue/shared": "3.5.18"
},
"peerDependencies": {
"vue": "3.5.18"
}
},
"node_modules/@vue/shared": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
"integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
"peer": true
},
"node_modules/base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
@ -90,6 +242,30 @@
"utrie": "^1.0.2"
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"peer": true
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"peer": true,
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"peer": true
},
"node_modules/html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
@ -102,6 +278,67 @@
"node": ">=8.0.0"
}
},
"node_modules/magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
"integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"peer": true,
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"peer": true
},
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
@ -110,6 +347,15 @@
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/text-segmentation": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
@ -126,6 +372,27 @@
"base64-arraybuffer": "^1.0.2"
}
},
"node_modules/vue": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz",
"integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
"peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.18",
"@vue/compiler-sfc": "3.5.18",
"@vue/runtime-dom": "3.5.18",
"@vue/server-renderer": "3.5.18",
"@vue/shared": "3.5.18"
},
"peerDependencies": {
"typescript": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/vue-i18n": {
"version": "9.2.2",
"resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz",
@ -145,6 +412,37 @@
}
},
"dependencies": {
"@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"peer": true
},
"@babel/helper-validator-identifier": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"peer": true
},
"@babel/parser": {
"version": "7.28.3",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
"integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
"peer": true,
"requires": {
"@babel/types": "^7.28.2"
}
},
"@babel/types": {
"version": "7.28.2",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
"integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
"peer": true,
"requires": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
}
},
"@intlify/core-base": {
"version": "9.2.2",
"resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz",
@ -187,11 +485,114 @@
"@intlify/shared": "9.2.2"
}
},
"@jridgewell/sourcemap-codec": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"peer": true
},
"@vue/compiler-core": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
"integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
"peer": true,
"requires": {
"@babel/parser": "^7.28.0",
"@vue/shared": "3.5.18",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"@vue/compiler-dom": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
"integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
"peer": true,
"requires": {
"@vue/compiler-core": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"@vue/compiler-sfc": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
"integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
"peer": true,
"requires": {
"@babel/parser": "^7.28.0",
"@vue/compiler-core": "3.5.18",
"@vue/compiler-dom": "3.5.18",
"@vue/compiler-ssr": "3.5.18",
"@vue/shared": "3.5.18",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.17",
"postcss": "^8.5.6",
"source-map-js": "^1.2.1"
}
},
"@vue/compiler-ssr": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
"integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
"peer": true,
"requires": {
"@vue/compiler-dom": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"@vue/devtools-api": {
"version": "6.5.0",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz",
"integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q=="
},
"@vue/reactivity": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz",
"integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
"peer": true,
"requires": {
"@vue/shared": "3.5.18"
}
},
"@vue/runtime-core": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
"integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
"peer": true,
"requires": {
"@vue/reactivity": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"@vue/runtime-dom": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
"integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
"peer": true,
"requires": {
"@vue/reactivity": "3.5.18",
"@vue/runtime-core": "3.5.18",
"@vue/shared": "3.5.18",
"csstype": "^3.1.3"
}
},
"@vue/server-renderer": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
"integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
"peer": true,
"requires": {
"@vue/compiler-ssr": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"@vue/shared": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
"integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
"peer": true
},
"base64-arraybuffer": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
@ -205,6 +606,24 @@
"utrie": "^1.0.2"
}
},
"csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"peer": true
},
"entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
"peer": true
},
"estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"peer": true
},
"html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
@ -214,11 +633,49 @@
"text-segmentation": "^1.0.3"
}
},
"magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
"integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"peer": true,
"requires": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"nanoid": {
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"peer": true
},
"picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"peer": true
},
"postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"peer": true,
"requires": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"source-map-js": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"peer": true
},
"text-segmentation": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
@ -235,6 +692,19 @@
"base64-arraybuffer": "^1.0.2"
}
},
"vue": {
"version": "3.5.18",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz",
"integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
"peer": true,
"requires": {
"@vue/compiler-dom": "3.5.18",
"@vue/compiler-sfc": "3.5.18",
"@vue/runtime-dom": "3.5.18",
"@vue/server-renderer": "3.5.18",
"@vue/shared": "3.5.18"
}
},
"vue-i18n": {
"version": "9.2.2",
"resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz",

View File

@ -162,7 +162,7 @@ export default {
getDataList() {
let self = this;
let params = this.queryParams;
self._get("/member/api/member-structure/tj-framework", params, (res) => {
self._get("member/api/member-structure/tj-framework", params, (res) => {
self.treeData = res.data;
});
},

View File

@ -0,0 +1,30 @@
export default {
data() {
return {
archTreeData: {},
};
},
methods: {
archDataFormat(archTreeData) {
const forkData = JSON.parse(JSON.stringify(archTreeData))
const addExtendKey = (forkData) => {
if (!forkData) {
forkData = {}
}
forkData.extend = forkData.extend === void 0 ? true : !!forkData.extend
if (Array.isArray(forkData.children)) {
forkData.children.forEach((c) => {
addExtendKey(c)
})
} else {
forkData.countryUrl2Base64 = forkData.countryUrl2
forkData.settleCountryUrl2Base64 = forkData.settleCountryUrl2
forkData.avatarUrlBase64 = forkData.avatarUrl
}
return forkData
}
addExtendKey(forkData)
return forkData
},
},
};

View File

@ -0,0 +1,425 @@
// 兼容性处理requestAnimationFrame polyfill
const getRequestAnimationFrame = () => {
// 检查全局对象是否存在uni-app 中可能是 uni 而不是 window
const global = typeof window !== 'undefined' ? window :
typeof uni !== 'undefined' ? uni :
typeof global !== 'undefined' ? global : {};
return global.requestAnimationFrame ||
global.webkitRequestAnimationFrame ||
global.mozRequestAnimationFrame ||
global.oRequestAnimationFrame ||
global.msRequestAnimationFrame ||
function(callback) {
return setTimeout(callback, 1000 / 60); // 60 FPS fallback
};
};
const getCancelAnimationFrame = () => {
const global = typeof window !== 'undefined' ? window :
typeof uni !== 'undefined' ? uni :
typeof global !== 'undefined' ? global : {};
return global.cancelAnimationFrame ||
global.webkitCancelAnimationFrame ||
global.mozCancelAnimationFrame ||
global.oCancelAnimationFrame ||
global.msCancelAnimationFrame ||
function(id) {
return clearTimeout(id);
};
};
const requestAnimationFrame = getRequestAnimationFrame();
const cancelAnimationFrame = getCancelAnimationFrame();
export default {
data() {
return {
// 触摸缩放相关状态
touchStartPosition1: {
x: 0,
y: 0,
},
touchStartPosition2: {
x: 0,
y: 0,
},
initialDistance: 0,
x: 0, // 元素的x坐标
y: 0, // 元素的y坐标
scale: 1, // 元素的缩放比例
initialX: 0, // 元素的初始x坐标
initialY: 0, // 元素的初始y坐标
minScale: 0.5, // 最小缩放比例
maxScale: 3, // 最大缩放比例
isScaling: false, // 是否正在缩放
lastTouchTime: 0, // 上次触摸时间
// 拖拽优化相关
isDragging: false, // 是否正在拖拽
dragStartTime: 0, // 拖拽开始时间
lastMoveTime: 0, // 上次移动时间
velocity: { x: 0, y: 0 }, // 移动速度
animationId: null, // 动画帧ID
pendingUpdate: false, // 是否有待处理的更新
// 边界控制
enableBoundary: false, // 是否启用边界控制
boundary: {
minX: -500,
maxX: 500,
minY: -500,
maxY: 500,
}, // 移动边界
// 兼容性相关
useTimer: false, // 是否使用定时器代替 RAF兼容性降级
};
},
methods: {
/**
* 触摸开始事件处理
* @param {TouchEvent} event 触摸事件
*/
handleTouchStart(event) {
event.preventDefault();
// 取消之前的动画
if (this.animationId) {
this.safeCancelAnimationFrame(this.animationId);
this.animationId = null;
}
const currentTime = Date.now();
this.lastTouchTime = currentTime;
if (event.touches.length === 1) {
// 单指拖拽初始化
this.isScaling = false;
this.isDragging = true;
this.dragStartTime = currentTime;
this.lastMoveTime = currentTime;
this.initialX = event.touches[0].clientX;
this.initialY = event.touches[0].clientY;
this.velocity = { x: 0, y: 0 };
this.pendingUpdate = false;
} else if (event.touches.length === 2) {
// 双指缩放初始化
this.isScaling = true;
this.isDragging = false;
this.touchStartPosition1.x = event.touches[0].clientX;
this.touchStartPosition1.y = event.touches[0].clientY;
this.touchStartPosition2.x = event.touches[1].clientX;
this.touchStartPosition2.y = event.touches[1].clientY;
// 计算初始两指间距离
this.initialDistance = this.getDistance(
this.touchStartPosition1,
this.touchStartPosition2
);
}
},
/**
* 触摸移动事件处理
* @param {TouchEvent} event 触摸事件
*/
handleTouchMove(event) {
event.preventDefault();
if (event.touches.length === 2 && this.isScaling) {
// 双指缩放逻辑
const currentDistance = this.getDistance(
{ x: event.touches[0].clientX, y: event.touches[0].clientY },
{ x: event.touches[1].clientX, y: event.touches[1].clientY }
);
if (this.initialDistance > 0) {
// 计算缩放比例变化
const scaleChange = currentDistance / this.initialDistance;
let newScale = this.scale * scaleChange;
// 限制缩放范围
newScale = Math.max(this.minScale, Math.min(this.maxScale, newScale));
this.scale = newScale;
// 更新初始距离为当前距离,用于下次计算
this.initialDistance = currentDistance;
}
} else if (event.touches.length === 1 && this.isDragging) {
// 单指拖拽逻辑优化
const currentTime = Date.now();
const currentX = event.touches[0].clientX;
const currentY = event.touches[0].clientY;
// 计算移动距离
const deltaX = currentX - this.initialX;
const deltaY = currentY - this.initialY;
// 计算移动速度(用于惯性效果)
const timeDelta = currentTime - this.lastMoveTime;
if (timeDelta > 0) {
this.velocity.x = deltaX / timeDelta * 16; // 标准化到16ms60fps
this.velocity.y = deltaY / timeDelta * 16;
}
// 使用节流机制更新位置
this.schedulePositionUpdate(deltaX, deltaY);
// 更新初始位置和时间
this.initialX = currentX;
this.initialY = currentY;
this.lastMoveTime = currentTime;
}
},
/**
* 触摸结束事件处理
* @param {TouchEvent} event 触摸事件
*/
handleTouchEnd(event) {
if (event.touches.length === 0) {
// 所有手指都离开屏幕,重置状态
this.isScaling = false;
this.initialDistance = 0;
// 如果是拖拽结束,启动惯性效果
if (this.isDragging) {
this.isDragging = false;
this.startInertiaAnimation();
}
} else if (event.touches.length === 1 && this.isScaling) {
// 从双指变为单指,切换到拖拽模式
this.isScaling = false;
this.isDragging = true;
this.initialX = event.touches[0].clientX;
this.initialY = event.touches[0].clientY;
this.lastMoveTime = Date.now();
}
},
/**
* 计算两点间距离的辅助方法
* @param {Object} point1 第一个点 {x, y}
* @param {Object} point2 第二个点 {x, y}
* @return {Number} 两点间距离
*/
getDistance(point1, point2) {
const dx = point1.x - point2.x;
const dy = point1.y - point2.y;
return Math.sqrt(dx * dx + dy * dy);
},
/**
* 重置缩放和位置
*/
resetTransform() {
this.x = 0;
this.y = 0;
this.scale = 1;
this.isScaling = false;
this.initialDistance = 0;
},
/**
* 安全的 requestAnimationFrame 调用
* @param {Function} callback 回调函数
* @return {Number} 动画ID
*/
safeRequestAnimationFrame(callback) {
try {
if (this.useTimer) {
return setTimeout(callback, 16); // 约 60 FPS
}
return requestAnimationFrame(callback);
} catch (error) {
console.warn('requestAnimationFrame failed, fallback to setTimeout:', error);
this.useTimer = true;
return setTimeout(callback, 16);
}
},
/**
* 安全的 cancelAnimationFrame 调用
* @param {Number} id 动画ID
*/
safeCancelAnimationFrame(id) {
try {
if (this.useTimer || typeof id === 'number') {
clearTimeout(id);
} else {
cancelAnimationFrame(id);
}
} catch (error) {
console.warn('cancelAnimationFrame failed, fallback to clearTimeout:', error);
clearTimeout(id);
}
},
/**
* 节流位置更新机制
* @param {Number} deltaX x轴位移
* @param {Number} deltaY y轴位移
*/
schedulePositionUpdate(deltaX, deltaY) {
// 计算新位置
let newX = this.x + deltaX;
let newY = this.y + deltaY;
// 应用边界限制
if (this.enableBoundary) {
const pos = this.applyBoundaryConstraints(newX, newY);
newX = pos.x;
newY = pos.y;
}
// 更新位置
this.x = newX;
this.y = newY;
if (!this.pendingUpdate) {
this.pendingUpdate = true;
this.safeRequestAnimationFrame(() => {
this.pendingUpdate = false;
});
}
},
/**
* 启动惯性动画
*/
startInertiaAnimation() {
const minVelocity = 0.1; // 最小速度阈值
const friction = 0.95; // 摩擦系数
// 如果速度太小,直接停止
if (Math.abs(this.velocity.x) < minVelocity && Math.abs(this.velocity.y) < minVelocity) {
return;
}
const animate = () => {
// 应用摩擦力
this.velocity.x *= friction;
this.velocity.y *= friction;
// 更新位置
let newX = this.x + this.velocity.x;
let newY = this.y + this.velocity.y;
// 应用边界限制
if (this.enableBoundary) {
const pos = this.applyBoundaryConstraints(newX, newY);
newX = pos.x;
newY = pos.y;
// 如果到达边界,减慢对应方向的速度
if (newX !== this.x + this.velocity.x) {
this.velocity.x *= 0.3;
}
if (newY !== this.y + this.velocity.y) {
this.velocity.y *= 0.3;
}
}
this.x = newX;
this.y = newY;
// 检查是否继续动画
if (Math.abs(this.velocity.x) > minVelocity || Math.abs(this.velocity.y) > minVelocity) {
this.animationId = this.safeRequestAnimationFrame(animate);
} else {
this.animationId = null;
this.velocity = { x: 0, y: 0 };
}
};
this.animationId = this.safeRequestAnimationFrame(animate);
},
/**
* 应用边界约束
* @param {Number} x x坐标
* @param {Number} y y坐标
* @return {Object} 约束后的坐标 {x, y}
*/
applyBoundaryConstraints(x, y) {
return {
x: Math.max(this.boundary.minX, Math.min(this.boundary.maxX, x)),
y: Math.max(this.boundary.minY, Math.min(this.boundary.maxY, y)),
};
},
/**
* 设置缩放范围
* @param {Number} minScale 最小缩放比例
* @param {Number} maxScale 最大缩放比例
*/
setScaleRange(minScale, maxScale) {
this.minScale = minScale || 0.5;
this.maxScale = maxScale || 3;
},
/**
* 设置移动边界
* @param {Object} boundary 边界配置 {minX, maxX, minY, maxY}
* @param {Boolean} enable 是否启用边界控制
*/
setBoundary(boundary, enable = true) {
this.boundary = { ...this.boundary, ...boundary };
this.enableBoundary = enable;
},
/**
* 检测并设置兼容性模式
*/
detectCompatibility() {
try {
// 尝试调用 requestAnimationFrame
const testId = requestAnimationFrame(() => {});
cancelAnimationFrame(testId);
this.useTimer = false;
} catch (error) {
console.warn('requestAnimationFrame not supported, using timer fallback');
this.useTimer = true;
}
},
/**
* 强制使用定时器模式用于调试或特殊需求
* @param {Boolean} useTimer 是否使用定时器
*/
setTimerMode(useTimer = true) {
this.useTimer = useTimer;
if (useTimer) {
console.info('TouchScale: 已切换到定时器模式');
} else {
console.info('TouchScale: 已切换到 requestAnimationFrame 模式');
}
},
/**
* 清理动画和状态
*/
cleanupTouchScale() {
if (this.animationId) {
this.safeCancelAnimationFrame(this.animationId);
this.animationId = null;
}
this.isDragging = false;
this.isScaling = false;
this.velocity = { x: 0, y: 0 };
this.pendingUpdate = false;
},
},
// 组件创建时检测兼容性
mounted() {
this.detectCompatibility();
},
// 组件销毁时清理
beforeDestroy() {
this.cleanupTouchScale();
},
};

View File

@ -45,7 +45,7 @@
transform: `scale(${scale})`,
}"
:size="size"
:json="data"
:treeData="archTreeData"
:class="{ landscape: landscape.length }"
@click-node="clickNode"
@click-top="clickTop"
@ -146,11 +146,14 @@
import html2canvas from "html2canvas";
import TreeChart3 from "@/components/architectures/resettleSO1.vue";
import Eposter from "@/components/architectures/Poster.vue";
import archDataMixin from "./mixin/archDataMixin";
import touchScaleMixin from "./mixin/touchScaleMixin";
export default {
components: {
TreeChart3,
Eposter,
},
mixins: [archDataMixin, touchScaleMixin],
data() {
return {
avaerInfoList: [],
@ -158,35 +161,21 @@ export default {
queryParams: {
memberSettlePeriodId: "", //
memberCode: "", //
level: 3, //
level: 7, //
type: 1,
},
memberSettlePeriodList: [], //
popShow: false,
listShow: false,
settleName: "",
data: {},
archTreeData: {},
size: 0.8,
landscape: [],
popMould: {},
isPop: false,
touchStartPosition1: {
x: 0,
y: 0,
},
touchStartPosition2: {
x: 0,
y: 0,
},
initialDistance: 0,
list: [],
startX: 0,
startY: 0,
x: 0, // x
y: 0, // y
scale: 1, //
initialX: 0, // x
initialY: 0, // y
startY: 0
};
},
onLoad() {
@ -198,41 +187,8 @@ export default {
methods: {
onpenPop() {
this.popShow = true;
console.log(this.popShow);
},
handleTouchStart(event) {
//
this.initialX = event.changedTouches[0].clientX;
this.initialY = event.changedTouches[0].clientY;
},
handleTouchMove(event) {
if (event.touches.length === 2) {
//
const deltaX = event.touches[0].clientX - event.touches[1].clientX;
const deltaY = event.touches[0].clientY - event.touches[1].clientY;
//
this.x += deltaX;
this.y += deltaY;
//
this.scale += deltaY / 100;
} else {
//
const deltaX = event.changedTouches[0].clientX - this.initialX;
const deltaY = event.changedTouches[0].clientY - this.initialY;
//
this.x += deltaX;
this.y += deltaY;
}
//
this.initialX = event.touches[0].clientX;
this.initialY = event.touches[0].clientY;
},
handleTouchEnd(event) {
// 便使
this.initialX = event.changedTouches[0].clientX;
this.initialY = event.changedTouches[0].clientY;
},
clickNode(e) {},
clickTop(e) {
let that = this;
@ -260,10 +216,9 @@ export default {
);
},
getDataList() {
let self = this;
let params = this.queryParams;
self._get("/member/api/member-structure/az-framework-first", params, (res) => {
self.data = res.data[0];
this._get("/member/api/member-structure/az-framework-first", params, (res) => {
this.archTreeData = this.archDataFormat(res.data[0] || {});
});
},
clearAll() {

View File

@ -318,7 +318,7 @@ export default {
console.log(self.typeIndex);
let specialArea = self.typeList[self.typeIndex].specialArea;
self._get(
"/sale/api/shopping/getShopping",
"sale/api/shopping/getShopping",
{
specialArea: specialArea,
},
@ -339,7 +339,7 @@ export default {
getType() {
let self = this;
self.isInit = false;
self._get("/sale/api/shopping/getShopping", {}, (res) => {
self._get("sale/api/shopping/getShopping", {}, (res) => {
self.typeList = res.data;
if (self.typeList && self.typeList.length > 0) {
self.listData = self.typeList[0].shoppingCartList;

View File

@ -49,7 +49,7 @@
v-for="(item, index) in advertBannerList" :key="index"></view>
</view>
</view>
<view class="time-box f26">{{$t('fn_313')+': '}}<text class="domation">{{nowDate}}</text></view>
<!-- <view class="time-box f26">{{$t('fn_313')+': '}}<text class="domation">{{nowDate}}</text></view> -->
<annuity :userInfo="userInfo"></annuity>
<view class="nav-list">
<view class="nav-item" v-for="(item, index) in recommendSpecialAreaList" :key="index" v-if="

View File

@ -222,20 +222,7 @@
<view class="p-40-0">
<button class="normal-sub-btn" @click="payFunc">{{ $t('w_0248') }}</button>
</view>
<template v-if="showUp">
<view class="pop-bg"></view>
<view class="upgrade-pop">
<view class="d-e-c" @click="showUp = false"><u-icon name="close" size="32rpx" color="#fff"></u-icon></view>
<view class="fb white tc f48">升级成功</view>
<image style="width:100%;margin: 0 auto;" src="/static/cashier-up.png" mode="widthFix"></image>
<view class="progress-box"><view class="progress-box-item"></view></view>
<view class="d-c d-c-c white f28">
<view class="mb20">32100/49800</view>
<view class="mb20">您的最新等级为:VIP</view>
<view class="mb20">您的最新奖衔为:资深经理</view>
</view>
</view>
</template>
<Popup :show="isPopup" :width="665" :padding="0" @hidePopup="hidePopupFunc">
<view class="d-e-c ww100">
<view class="p20" @click="hidePopupFunc(true)"><text class="icon iconfont icon-guanbi" style="color: #999;font-size: 28rpx;"></text></view>

View File

@ -342,7 +342,7 @@ export default {
methods: {
getOrderStatus() {
let self = this;
self._get("/system/pub/enums/order-status-api", {}, (res) => {
self._get("system/pub/enums/order-status-api", {}, (res) => {
self.orderStatus = res.data;
});
},

View File

@ -24,7 +24,7 @@
<text class="domation mr10">*</text>
{{ $t("PER_DA_3") }}
</view>
<view class="flex-1 d-s-c">
<view class="flex-1 d-s-c" style="width: 100%; justify-content: flex-end;">
<image
class="queryimg mr10"
mode="heightFix"
@ -34,7 +34,7 @@
: ''
"
></image>
<view class="flex-1">{{
<view >{{
pkCountry >= 0 && countryList[pkCountry]
? countryList[pkCountry].shortName
: ""
@ -48,7 +48,7 @@
<text class="domation mr10">*</text>
{{ $t("PER_DA_4") }}
</view>
<view class="flex-1 d-s-c">
<view class="flex-1 d-s-c" style="width: 100%; justify-content: flex-end;">
<image
class="queryimg mr10"
mode="heightFix"
@ -58,7 +58,7 @@
: ''
"
></image>
<view class="flex-1">{{
<view style="padding-right: 30rpx;">{{
pkSettleCountry >= 0 && countryList[pkSettleCountry]
? countryList[pkSettleCountry].shortName
: ""
@ -600,7 +600,8 @@ export default {
.queryimg {
height: 60rpx;
flex-shrink: 0;
width: 60rpx;
// flex-shrink: 0;
}
.form-top-nav {

View File

@ -305,7 +305,8 @@
}
.queryimg {
height: 60rpx;
flex-shrink: 0;
width: 60rpx;
// flex-shrink: 0;
}
.form-title {

View File

@ -674,13 +674,13 @@
methods: {
getMemberAnnuity() {
let self = this;
self._get("/member/api/member/get-member-annuity-time", {}, (res) => {
self._get("member/api/member/get-member-annuity-time", {}, (res) => {
self.resaleIncomeBonus = res.data.resaleIncomeBonus;
});
},
getNextLevelPv() {
let self = this;
self._get("/member/api/member/next-level-pv", {}, (res) => {
self._get("member/api/member/next-level-pv", {}, (res) => {
self.nextText = res.data.gradeValue;
self.isMaxGrade = res.data.isMaxGrade;
});
@ -2029,7 +2029,8 @@
.queryimg {
height: 40rpx;
flex-shrink: 0;
width: 40rpx;
// flex-shrink: 0;
margin: 0 10rpx;
}

View File

@ -317,7 +317,7 @@
},
getOrderStatus() {
let self = this;
self._get('/system/pub/enums/order-status-api', {}, res => {
self._get('system/pub/enums/order-status-api', {}, res => {
self.orderStatus = res.data;
})
},

View File

@ -14,7 +14,7 @@
</view>
</view>
</view>
<view class="set-group" style="padding-top: 18rpx;">
<!-- <view class="set-group" style="padding-top: 18rpx;">
<view class="d-b-c set-group-item "
@click="gotoPage('pages/user/set/bind/email?email='+encodeURIComponent(userInfo.email || ''))">
<view>{{$t('PER_DA_33')}}</view>
@ -23,20 +23,9 @@
<text class="icon iconfont icon-jiantou"></text>
</view>
</view>
<!-- <view class="d-b-c set-group-item" @click="gotoPage('pages/user/set/bind/mobiless')">
<view>{{$t('w_0417')}}</view>
<view class="d-e-c gray9">
<text class="">{{ mobileHidden(userInfo.phone) || $t('w_0418') }}</text>
</view>
</view> -->
<view class="d-b-c set-group-item">
<view>{{$t('w_0417')}}</view>
<view class="d-e-c gray9">
<text class="">{{ mobileHidden(userInfo.phone) || $t('w_0418') }}</text>
<!-- <text class="icon iconfont icon-jiantou"></text> -->
</view>
</view>
</view>
</view> -->
</view>
</template>