diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index b56158b..cbdef5b 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,7 +4,13 @@
-
+
+
+
+
+
+
+
@@ -111,15 +117,7 @@
-
-
-
-
- 1775896148590
-
-
-
- 1775896148590
+
@@ -505,7 +503,15 @@
1784131564427
-
+
+
+ 1784135922873
+
+
+
+ 1784135922873
+
+
@@ -525,7 +531,6 @@
-
@@ -550,7 +555,8 @@
-
+
+
\ No newline at end of file
diff --git a/.workbuddy/memory/2026-07-16.md b/.workbuddy/memory/2026-07-16.md
index 919d357..f5799b5 100644
--- a/.workbuddy/memory/2026-07-16.md
+++ b/.workbuddy/memory/2026-07-16.md
@@ -13,4 +13,17 @@
- 补充 `register`(`src/passport/register.tsx` 存在但未声明)
- 统一引号风格、清理尾随逗号
-待确认:phone-auth / invite / webview 三个页面是否需要新建(目前无文件、无引用)。
+## passport/pay 功能从 websopy-taro-bak 迁移
+
+问题:`src/passport/pay/index.tsx` 失效,原因是当前项目基于 xinlong-shop 框架,`API_BASE_URL` 指向商城接口 `https://shop-api.websoft.top/api`,而 pay 页面需要访问 websopy 业务接口 `https://websopy-api.websoft.top/api` 的 `/app/subscription/*`。
+
+迁移与修复:
+- 确认 `src/passport/pay/` 与 `src/api/passport/wx-login/` 文件和备份项目一致,无需替换。
+- 在 `config/env.js` 新增 `WEBSOPY_API_BASE_URL`。
+- 在 `config/app.ts` 导出 `WebsopyBaseUrl`。
+- 创建 `config/env.d.ts` 消除 `config/app.ts` 导入 `.js` 的隐式 any 类型错误。
+- 增强 `src/utils/request.ts`:在 `RequestConfig` 增加 `baseUrl?: string`,`request`/`get`/`post` 等函数支持自定义 baseUrl,相对路径会自动拼接;完整 URL 保持不变。
+- 修改 `src/passport/pay/index.tsx`:三个订阅接口请求均传入 `baseUrl: WebsopyBaseUrl`;修复 `tenantId` 类型(string -> number)和 `saveStorageByLoginUser` 的 user 类型断言。
+- 运行 `npx taro build --type weapp` 构建成功;dist 中 `passport/pay` 文件生成,确认请求使用 websopy API。
+- 说明:`npm run type-check` 仍因 `@tarojs/taro` 类型包解析问题失败,这是项目既有环境问题,不影响构建。
+
diff --git a/config/app.ts b/config/app.ts
index 822a56d..48a03ae 100644
--- a/config/app.ts
+++ b/config/app.ts
@@ -1,7 +1,8 @@
-import { API_BASE_URL, SERVER_API_URL } from './env'
+import { API_BASE_URL, SERVER_API_URL, WEBSOPY_API_BASE_URL } from './env'
export const TenantId = '5'
export const TenantName = '威硕开发助手'
export const BaseUrl = API_BASE_URL
export const ServerBaseUrl = SERVER_API_URL
+export const WebsopyBaseUrl = WEBSOPY_API_BASE_URL
export const Version = 'v3.0.0'
diff --git a/config/env.d.ts b/config/env.d.ts
new file mode 100644
index 0000000..4c1ef61
--- /dev/null
+++ b/config/env.d.ts
@@ -0,0 +1,30 @@
+export const CURRENT_ENV: string
+export const ENV_CONFIG: {
+ development: {
+ API_BASE_URL: string
+ SERVER_API_URL: string
+ WEBSOPY_API_BASE_URL: string
+ APP_NAME: string
+ DEBUG: string
+ }
+ test: {
+ API_BASE_URL: string
+ SERVER_API_URL: string
+ WEBSOPY_API_BASE_URL: string
+ APP_NAME: string
+ DEBUG: string
+ }
+ production: {
+ API_BASE_URL: string
+ SERVER_API_URL: string
+ WEBSOPY_API_BASE_URL: string
+ APP_NAME: string
+ DEBUG: string
+ }
+}
+export function getEnvConfig(): (typeof ENV_CONFIG)[keyof typeof ENV_CONFIG]
+export const API_BASE_URL: string
+export const SERVER_API_URL: string
+export const WEBSOPY_API_BASE_URL: string
+export const APP_NAME: string
+export const DEBUG: string
diff --git a/config/env.js b/config/env.js
index b233b5a..808fe7e 100644
--- a/config/env.js
+++ b/config/env.js
@@ -4,18 +4,21 @@ export const ENV_CONFIG = {
development: {
API_BASE_URL: 'https://shop-api.websoft.top/api',
SERVER_API_URL: 'https://server.websoft.top/api',
+ WEBSOPY_API_BASE_URL: 'https://websopy-api.websoft.top/api',
APP_NAME: '威硕谱软件',
DEBUG: 'true',
},
test: {
API_BASE_URL: 'https://shop-api.websoft.top/api',
SERVER_API_URL: 'https://server.websoft.top/api',
+ WEBSOPY_API_BASE_URL: 'https://websopy-api.websoft.top/api',
APP_NAME: '威硕谱软件',
DEBUG: 'true',
},
production: {
API_BASE_URL: 'https://shop-api.websoft.top/api',
SERVER_API_URL: 'https://server.websoft.top/api',
+ WEBSOPY_API_BASE_URL: 'https://websopy-api.websoft.top/api',
APP_NAME: '威硕谱软件',
DEBUG: 'false',
},
@@ -25,4 +28,4 @@ export function getEnvConfig() {
return ENV_CONFIG[CURRENT_ENV] || ENV_CONFIG.development
}
-export const { API_BASE_URL, SERVER_API_URL, APP_NAME, DEBUG } = getEnvConfig()
+export const { API_BASE_URL, SERVER_API_URL, WEBSOPY_API_BASE_URL, APP_NAME, DEBUG } = getEnvConfig()
diff --git a/src/passport/pay/index.tsx b/src/passport/pay/index.tsx
index 4aff7f2..dfc0324 100644
--- a/src/passport/pay/index.tsx
+++ b/src/passport/pay/index.tsx
@@ -5,8 +5,9 @@ import { Check, Close, Tips, Clock } from '@nutui/icons-react-taro'
import Taro from '@tarojs/taro'
import { request } from '@/utils/request'
import { getOpenId, loginByOpenId } from '@/api/passport/wx-login'
+import type { User } from '@/api/system/user/model'
import { saveStorageByLoginUser } from '@/utils/server'
-import { TenantId } from '@/config/app'
+import { TenantId, WebsopyBaseUrl } from '@/config/app'
/**
* 小程序支付页面
@@ -87,7 +88,8 @@ const PayPage: React.FC = () => {
const data: any = await request({
url: `/app/subscription/detail-by-no/${subscriptionNo}`,
method: 'GET',
- returnRaw: true // 先用 returnRaw=true 拿到完整响应,方便调试
+ returnRaw: true,
+ baseUrl: WebsopyBaseUrl
})
console.log('[PayPage] 接口完整返回(returnRaw=true):', JSON.stringify(data))
@@ -175,13 +177,13 @@ const PayPage: React.FC = () => {
try {
const loginResult = await loginByOpenId({
code: loginRes.code,
- tenantId: TenantId
+ tenantId: Number(TenantId)
})
console.log('[PayPage] loginByOpenId 结果:', loginResult)
if (loginResult.success && loginResult.data) {
// 登录成功,保存 token
- saveStorageByLoginUser(loginResult.data.access_token || '', loginResult.data.user)
+ saveStorageByLoginUser(loginResult.data.access_token || '', loginResult.data.user as unknown as User)
console.log('[PayPage] 自动登录成功,已保存 token')
} else {
console.warn('[PayPage] 自动登录失败:', loginResult.message)
@@ -211,7 +213,8 @@ const PayPage: React.FC = () => {
url: `/app/subscription/mp-prepay/${detail.id}`,
method: 'POST',
data: { openid },
- returnRaw: true
+ returnRaw: true,
+ baseUrl: WebsopyBaseUrl
})
console.log('[PayPage] mp-prepay 完整返回:', JSON.stringify(prepayRes))
@@ -240,7 +243,8 @@ const PayPage: React.FC = () => {
await request({
url: `/app/subscription/mp-confirm/${detail.subscriptionNo}`,
method: 'POST',
- data: {}
+ data: {},
+ baseUrl: WebsopyBaseUrl
})
} catch (confirmErr) {
console.warn('支付确认通知失败,等待轮询:', confirmErr)
diff --git a/src/utils/request.ts b/src/utils/request.ts
index b0b865e..8655ca7 100644
--- a/src/utils/request.ts
+++ b/src/utils/request.ts
@@ -12,6 +12,7 @@ export interface RequestConfig {
showLoading?: boolean
showError?: boolean
returnRaw?: boolean
+ baseUrl?: string
}
interface ApiResponse {
@@ -206,7 +207,7 @@ const retryRequest = async (config: RequestConfig, retryCount = 0): Promise(options: RequestConfig): Promise {
try {
- const config = requestInterceptor({ ...DEFAULT_CONFIG, ...options })
+ const config = requestInterceptor({ ...DEFAULT_CONFIG, ...options, url: buildUrl(options.url, options.baseUrl) })
return await retryRequest(config)
} catch (error) {
const requestError = error as RequestError
@@ -215,11 +216,11 @@ export async function request(options: RequestConfig): Promise {
}
}
-const buildUrl = (url: string): string => {
+const buildUrl = (url: string, customBaseUrl?: string): string => {
if (url.startsWith('http://') || url.startsWith('https://')) {
return url
}
- return `${baseUrl}${url}`
+ return `${customBaseUrl || baseUrl}${url}`
}
const buildQueryString = (params: Record): string => {
@@ -231,41 +232,41 @@ const buildQueryString = (params: Record): string => {
}
export function get(url: string, params?: any, config?: Partial): Promise {
- const fullUrl = buildUrl(url) + (params ? buildQueryString(params) : '')
+ const fullUrl = buildUrl(url, config?.baseUrl) + (params ? buildQueryString(params) : '')
return request({ url: fullUrl, method: 'GET', returnRaw: true, ...config })
}
export function post(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'POST', data, returnRaw: true, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'POST', data, returnRaw: true, ...config })
}
export function put(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'PUT', data, returnRaw: true, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'PUT', data, returnRaw: true, ...config })
}
export function patch(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'PATCH', data, returnRaw: true, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'PATCH', data, returnRaw: true, ...config })
}
export function del(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'DELETE', data, returnRaw: true, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'DELETE', data, returnRaw: true, ...config })
}
export function getData(url: string, params?: any, config?: Partial): Promise {
- const fullUrl = buildUrl(url) + (params ? buildQueryString(params) : '')
+ const fullUrl = buildUrl(url, config?.baseUrl) + (params ? buildQueryString(params) : '')
return request({ url: fullUrl, method: 'GET', returnRaw: false, ...config })
}
export function postData(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'POST', data, returnRaw: false, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'POST', data, returnRaw: false, ...config })
}
export function putData(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'PUT', data, returnRaw: false, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'PUT', data, returnRaw: false, ...config })
}
export function delData(url: string, data?: any, config?: Partial): Promise {
- return request({ url: buildUrl(url), method: 'DELETE', data, returnRaw: false, ...config })
+ return request({ url: buildUrl(url, config?.baseUrl), method: 'DELETE', data, returnRaw: false, ...config })
}
export default {
diff --git a/taro-feature-migration.zip b/taro-feature-migration.zip
new file mode 100644
index 0000000..59e4d05
Binary files /dev/null and b/taro-feature-migration.zip differ