diff --git a/app/api-public/http.js b/app/api-public/http.js new file mode 100644 index 0000000..c86dc5c --- /dev/null +++ b/app/api-public/http.js @@ -0,0 +1,125 @@ +import {useRuntimeConfig} from '#app' +import {ofetch} from 'ofetch' +import {message} from '@/components/x-message/useMessage.js' +import { getFingerprint } from '@/utils/fingerprint' +let httpStatusErrorHandler +let http + +// HTTP 状态码映射 - 使用i18n国际化 +export function setupHttp() { + if (http) return http + + const config = useRuntimeConfig() + const baseURL = config.public.NUXT_PUBLIC_API_BASE + const router = useRouter() + const i18n = useNuxtApp().$i18n + + // 国际化的HTTP状态码映射 + const HTTP_STATUS_MAP = { + 400: i18n.t('http.error.badRequest'), + 401: i18n.t('http.error.unauthorized'), + 403: i18n.t('http.error.forbidden'), + 404: i18n.t('http.error.notFound'), + 500: i18n.t('http.error.serverError'), + 502: i18n.t('http.error.badGateway'), + 503: i18n.t('http.error.serviceUnavailable'), + 504: i18n.t('http.error.gatewayTimeout') + } + + const defaultOptions = { + baseURL, + headers: { 'Content-Type': 'application/json' }, + timeout: 15000, // 15秒超时 + retry: 3, + retryDelay: 1000, + } + + http = ofetch.create({ + ...defaultOptions, + + // 请求拦截 + async onRequest({ options, request }) { + const fingerprint = await getFingerprint() + console.log('fingerprint',fingerprint) + // 添加 token + options.headers = { + 'Authorization': '12312', + ...options.headers, + 'fingerprint':fingerprint, + 'accept-language': i18n.locale.value + } + + // GET 请求添加时间戳防止缓存 + if (request.toLowerCase().includes('get')) { + options.params = { + ...options.params, + _t: Date.now() + } + } + }, + + // 响应拦截 + async onResponse({ response }) { + const data = response._data + + // 处理业务错误 + if (data.status === 1) { + message.error(data.msg || i18n.t('http.error.operationFailed')) + } + + return response + }, + + // 响应错误处理 + async onResponseError({ response, request }) { + // 网络错误 + if (!response) { + message.error(i18n.t('http.error.networkError')) + return Promise.reject(new Error(i18n.t('http.error.networkError'))) + } + const status = response.status + const data = response._data + + // 处理 HTTP 状态错误 + const errorMessage = data.msg || HTTP_STATUS_MAP[status] || i18n.t('http.error.requestFailed') + + if (Array.isArray(data.msg)) { + data.msg.forEach(item => { + httpStatusErrorHandler?.(item, status) + }) + } else { + httpStatusErrorHandler?.(errorMessage, status) + } + + message.error(errorMessage) + return Promise.reject(data) + }, + }) + + return http +} + +export function createAbortController() { + return new AbortController() +} + +export function injectHttpStatusErrorHandler(handler) { + httpStatusErrorHandler = handler +} + +export function getHttp() { + if (!http) { + throw new Error(useNuxtApp().$i18n.t('http.error.httpNotInitialized')) + } + return http +} + +// 导出请求工具函数 +export async function request({url,...options}) { + const http = getHttp() + try { + return await http(url, {...options,body:options.data}) + } catch (error) { + throw error + } +} \ No newline at end of file diff --git a/app/api-public/public/index.js b/app/api-public/public/index.js new file mode 100644 index 0000000..5242052 --- /dev/null +++ b/app/api-public/public/index.js @@ -0,0 +1,25 @@ +import { request } from "../http"; + +export async function defaultDetail(data) { + + return await request( { + url:'/api/v1/m/auction/out/default/detail', + method: 'POST', + data + }) +} +export async function getLink(data) { + + return await request( { + url:'/api/v1/m/auction/out/log/sendlog/aljdfoqueoirhkjsadhfiu', + method: 'POST', + data + }) +} +export async function outBuyList(data) { + return await request( { + url:'/api/v1/m/auction/out/buy/list', + method: 'POST', + data + }) +} \ No newline at end of file diff --git a/app/api/auth/index.js b/app/api/auth/index.js index 66c5ee3..b1056b6 100644 --- a/app/api/auth/index.js +++ b/app/api/auth/index.js @@ -22,4 +22,18 @@ export async function userUpdate(data) { method: 'POST', data }) +} +export async function userCaptcha(data) { + return await request( { + url:'/api/v1/m/user/captcha', + method: 'POST', + data + }) +} +export async function userCaptchaValidate(data) { + return await request( { + url:'/mall/user/validate/captcha', + method: 'POST', + data + }) } \ No newline at end of file diff --git a/app/api/public/index.js b/app/api/public/index.js new file mode 100644 index 0000000..2679faf --- /dev/null +++ b/app/api/public/index.js @@ -0,0 +1,28 @@ +import { request } from "../http"; + +export async function defaultDetail(data) { + + return await request( { + url:'/api/v1/m/auction/out/default/detail', + headers:{ + 'fingerprint':'12312' + }, + method: 'POST', + data + }) +} +export async function getLink(data) { + + return await request( { + url:'/api/v1/m/auction/out/log/sendlog/aljdfoqueoirhkjsadhfiu', + method: 'POST', + data + }) +} +export async function outBuyList(data) { + return await request( { + url:'/api/v1/m/auction/out/buy/list', + method: 'POST', + data + }) +} \ No newline at end of file diff --git a/app/components/YourPuzzleComponent.vue b/app/components/YourPuzzleComponent.vue new file mode 100644 index 0000000..2a91174 --- /dev/null +++ b/app/components/YourPuzzleComponent.vue @@ -0,0 +1,367 @@ + + + + + diff --git a/app/components/slider-verify/slider-verify-image/de_DE/bg.png b/app/components/slider-verify/slider-verify-image/de_DE/bg.png new file mode 100644 index 0000000..3d9fb66 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/de_DE/bg.png differ diff --git a/app/components/slider-verify/slider-verify-image/de_DE/bg_error.png b/app/components/slider-verify/slider-verify-image/de_DE/bg_error.png new file mode 100644 index 0000000..d5c0114 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/de_DE/bg_error.png differ diff --git a/app/components/slider-verify/slider-verify-image/de_DE/error.png b/app/components/slider-verify/slider-verify-image/de_DE/error.png new file mode 100644 index 0000000..cf416ee Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/de_DE/error.png differ diff --git a/app/components/slider-verify/slider-verify-image/de_DE/success.png b/app/components/slider-verify/slider-verify-image/de_DE/success.png new file mode 100644 index 0000000..494273b Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/de_DE/success.png differ diff --git a/app/components/slider-verify/slider-verify-image/en_US/bg.png b/app/components/slider-verify/slider-verify-image/en_US/bg.png new file mode 100644 index 0000000..57fb091 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/en_US/bg.png differ diff --git a/app/components/slider-verify/slider-verify-image/en_US/bg_error.png b/app/components/slider-verify/slider-verify-image/en_US/bg_error.png new file mode 100644 index 0000000..fb9cde1 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/en_US/bg_error.png differ diff --git a/app/components/slider-verify/slider-verify-image/en_US/error.png b/app/components/slider-verify/slider-verify-image/en_US/error.png new file mode 100644 index 0000000..85a0b2b Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/en_US/error.png differ diff --git a/app/components/slider-verify/slider-verify-image/en_US/success.png b/app/components/slider-verify/slider-verify-image/en_US/success.png new file mode 100644 index 0000000..2a6b13e Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/en_US/success.png differ diff --git a/app/components/slider-verify/slider-verify-image/icon-button-normal.png b/app/components/slider-verify/slider-verify-image/icon-button-normal.png new file mode 100644 index 0000000..f6ad995 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/icon-button-normal.png differ diff --git a/app/components/slider-verify/slider-verify-image/ja_JP/bg.png b/app/components/slider-verify/slider-verify-image/ja_JP/bg.png new file mode 100644 index 0000000..3720658 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/ja_JP/bg.png differ diff --git a/app/components/slider-verify/slider-verify-image/ja_JP/bg_error.png b/app/components/slider-verify/slider-verify-image/ja_JP/bg_error.png new file mode 100644 index 0000000..80abf21 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/ja_JP/bg_error.png differ diff --git a/app/components/slider-verify/slider-verify-image/ja_JP/error.png b/app/components/slider-verify/slider-verify-image/ja_JP/error.png new file mode 100644 index 0000000..c78245c Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/ja_JP/error.png differ diff --git a/app/components/slider-verify/slider-verify-image/ja_JP/success.png b/app/components/slider-verify/slider-verify-image/ja_JP/success.png new file mode 100644 index 0000000..256cb6d Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/ja_JP/success.png differ diff --git a/app/components/slider-verify/slider-verify-image/reload.png b/app/components/slider-verify/slider-verify-image/reload.png new file mode 100644 index 0000000..85f24ea Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/reload.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_CN/bg.png b/app/components/slider-verify/slider-verify-image/zh_CN/bg.png new file mode 100644 index 0000000..a6364dc Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_CN/bg.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_CN/bg_error.png b/app/components/slider-verify/slider-verify-image/zh_CN/bg_error.png new file mode 100644 index 0000000..1cbeb01 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_CN/bg_error.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_CN/error.png b/app/components/slider-verify/slider-verify-image/zh_CN/error.png new file mode 100644 index 0000000..56ea2a1 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_CN/error.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_CN/success.png b/app/components/slider-verify/slider-verify-image/zh_CN/success.png new file mode 100644 index 0000000..2cbcd88 Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_CN/success.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_TW/bg.png b/app/components/slider-verify/slider-verify-image/zh_TW/bg.png new file mode 100644 index 0000000..463b06f Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_TW/bg.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_TW/bg_error.png b/app/components/slider-verify/slider-verify-image/zh_TW/bg_error.png new file mode 100644 index 0000000..34c416d Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_TW/bg_error.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_TW/error.png b/app/components/slider-verify/slider-verify-image/zh_TW/error.png new file mode 100644 index 0000000..508e52a Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_TW/error.png differ diff --git a/app/components/slider-verify/slider-verify-image/zh_TW/success.png b/app/components/slider-verify/slider-verify-image/zh_TW/success.png new file mode 100644 index 0000000..cab371d Binary files /dev/null and b/app/components/slider-verify/slider-verify-image/zh_TW/success.png differ diff --git a/app/components/slider-verify/slider-verify/index.vue b/app/components/slider-verify/slider-verify/index.vue new file mode 100644 index 0000000..040ce95 --- /dev/null +++ b/app/components/slider-verify/slider-verify/index.vue @@ -0,0 +1,418 @@ + + + + + \ No newline at end of file diff --git a/app/pages/login/index.vue b/app/pages/login/index.vue index 29526bb..424a1c2 100644 --- a/app/pages/login/index.vue +++ b/app/pages/login/index.vue @@ -1,15 +1,20 @@ @@ -238,4 +311,15 @@ onUnmounted(() => { width: 41px; height: 41px; } + +.verify-popup-content { + width: 90vw; + max-width: 350px; + padding: 20px; + box-sizing: border-box; +} + +:deep(.van-popup) { + background: transparent; +} diff --git a/app/pages/publicLiveRoom/components/broadcast/index.vue b/app/pages/publicLiveRoom/components/broadcast/index.vue new file mode 100644 index 0000000..284e48e --- /dev/null +++ b/app/pages/publicLiveRoom/components/broadcast/index.vue @@ -0,0 +1,76 @@ + + + + + \ No newline at end of file diff --git a/app/pages/publicLiveRoom/index.client.vue b/app/pages/publicLiveRoom/index.client.vue new file mode 100644 index 0000000..35937d9 --- /dev/null +++ b/app/pages/publicLiveRoom/index.client.vue @@ -0,0 +1,123 @@ + + + + + + \ No newline at end of file diff --git a/app/plugins/http.ts b/app/plugins/http.ts index 16e2c67..2838dc9 100644 --- a/app/plugins/http.ts +++ b/app/plugins/http.ts @@ -1,6 +1,9 @@ import { setupHttp } from '@/api/http' -import { setupHttp as setupHttp1} from '@/api-collect-code/http' +import { setupHttp as setupHttp1} from '@/api-collect-code/http' +import { setupHttp as setupHttp2} from '@/api-public/http' export default defineNuxtPlugin(() => { setupHttp() setupHttp1() + setupHttp2() }) + diff --git a/app/static/images/reset.png b/app/static/images/reset.png new file mode 100644 index 0000000..f10bfe5 Binary files /dev/null and b/app/static/images/reset.png differ diff --git a/app/stores/live/index.js b/app/stores/live/index.js index adab290..ff7fbcf 100644 --- a/app/stores/live/index.js +++ b/app/stores/live/index.js @@ -248,6 +248,7 @@ export const liveStore = createGlobalState(() => { } } return{ + decryptUtils, wsClient, fullLive, isMinWindow, diff --git a/app/stores/public/index.js b/app/stores/public/index.js new file mode 100644 index 0000000..7bf44aa --- /dev/null +++ b/app/stores/public/index.js @@ -0,0 +1,8 @@ +import {createGlobalState, useLocalStorage} from '@vueuse/core' +export const publicStore = createGlobalState(() => { + const auctionData=useLocalStorage('auctionData',{}) + return { + auctionData + } +}) + diff --git a/app/utils/fingerprint.js b/app/utils/fingerprint.js new file mode 100644 index 0000000..d0f9bb6 --- /dev/null +++ b/app/utils/fingerprint.js @@ -0,0 +1,17 @@ +import FingerprintJS from '@fingerprintjs/fingerprintjs' + +export async function getFingerprint() { + try { + // 初始化 FingerprintJS + const fp = await FingerprintJS.load() + + // 获取访问者的指纹 + const result = await fp.get() + + // 返回指纹哈希值 + return result.visitorId + } catch (error) { + console.error('获取浏览器指纹失败:', error) + return null + } +} \ No newline at end of file diff --git a/package.json b/package.json index b0a46f5..16eeaef 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "vue-demi": "^0.14.10", "vue-pdf-embed": "^2.1.2", "vue-router": "^4.5.0", - "vue-signature-pad": "^3.0.2" + "vue-signature-pad": "^3.0.2", + "vue3-puzzle-vcode": "1.1.6-nuxt" }, "devDependencies": { "@iconify-json/carbon": "^1.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea90507..dcd80b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -77,6 +77,9 @@ importers: vue-signature-pad: specifier: ^3.0.2 version: 3.0.2(vue@3.5.13(typescript@5.7.3)) + vue3-puzzle-vcode: + specifier: 1.1.6-nuxt + version: 1.1.6-nuxt devDependencies: '@iconify-json/carbon': specifier: ^1.2.5 @@ -809,8 +812,8 @@ packages: resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==} engines: {node: '>= 16'} - '@intlify/shared@11.1.1': - resolution: {integrity: sha512-2kGiWoXaeV8HZlhU/Nml12oTbhv7j2ufsJ5vQaa0VTjzUmZVdd/nmKFRAOJ/FtjO90Qba5AnZDwsrY7ZND5udA==} + '@intlify/shared@11.1.2': + resolution: {integrity: sha512-dF2iMMy8P9uKVHV/20LA1ulFLL+MKSbfMiixSmn6fpwqzvix38OIc7ebgnFbBqElvghZCW9ACtzKTGKsTGTWGA==} engines: {node: '>= 16'} '@intlify/unplugin-vue-i18n@6.0.3': @@ -4618,6 +4621,9 @@ packages: peerDependencies: vue: ^3.2.0 + vue3-puzzle-vcode@1.1.6-nuxt: + resolution: {integrity: sha512-V3DrPIYznxko8jBAtZtmsNPw9QmkPnFicQ0p9B192vC3ncRv4IDazhLC7D/cY/OGq0OeqXmk2DiOcBR7dyt8GQ==} + vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -5342,14 +5348,14 @@ snapshots: '@intlify/shared@11.0.0-rc.1': {} - '@intlify/shared@11.1.1': {} + '@intlify/shared@11.1.2': {} '@intlify/unplugin-vue-i18n@6.0.3(@vue/compiler-dom@3.5.13)(eslint@9.20.1(jiti@2.4.2))(rollup@4.34.6)(typescript@5.7.3)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.1(jiti@2.4.2)) '@intlify/bundle-utils': 10.0.0(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.3))) - '@intlify/shared': 11.1.1 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.1)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) + '@intlify/shared': 11.1.2 + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) '@rollup/pluginutils': 5.1.4(rollup@4.34.6) '@typescript-eslint/scope-manager': 8.24.0 '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) @@ -5373,11 +5379,11 @@ snapshots: '@intlify/utils@0.13.0': {} - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.1)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': dependencies: '@babel/parser': 7.26.8 optionalDependencies: - '@intlify/shared': 11.1.1 + '@intlify/shared': 11.1.2 '@vue/compiler-dom': 3.5.13 vue: 3.5.13(typescript@5.7.3) vue-i18n: 10.0.5(vue@3.5.13(typescript@5.7.3)) @@ -9896,6 +9902,8 @@ snapshots: signature_pad: 3.0.0-beta.4 vue: 3.5.13(typescript@5.7.3) + vue3-puzzle-vcode@1.1.6-nuxt: {} + vue@3.5.13(typescript@5.7.3): dependencies: '@vue/compiler-dom': 3.5.13 diff --git a/tsconfig.json b/tsconfig.json index a746f2a..0fbd00b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,11 @@ { // https://nuxt.com/docs/guide/concepts/typescript - "extends": "./.nuxt/tsconfig.json" + "extends": "./.nuxt/tsconfig.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["app/*"] // 确保这里的路径别名配置和你的项目配置一致 + } + }, + "include": ["app/**/*"] }