2 Commits

Author SHA1 Message Date
ae703091d4 feat:添加日志 2026-01-27 16:38:52 +08:00
8daea722bd feat: 添加关闭按钮及其逻辑到邀请码验证弹窗 2026-01-27 16:03:51 +08:00
3 changed files with 103 additions and 10 deletions

View File

@ -57,42 +57,70 @@ async function request<T>(path: string, options: RequestOptions): Promise<T> {
timeout: options.timeout || timeout timeout: options.timeout || timeout
}; };
console.log('[HTTP] 请求详情:', {
url: url.toString(),
method: options.method,
headers: requestOptions.headers,
hasToken: !!token,
body: options.body
});
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const req = httpModule.request(requestOptions, (res) => { const req = httpModule.request(requestOptions, (res) => {
let data = ''; let data = '';
console.log('[HTTP] 响应状态码:', res.statusCode);
console.log('[HTTP] 响应头:', res.headers);
res.on('data', (chunk) => { res.on('data', (chunk) => {
data += chunk; data += chunk;
}); });
res.on('end', () => { res.on('end', () => {
console.log('[HTTP] 响应体:', data);
try { try {
const json = JSON.parse(data); const json = JSON.parse(data);
console.log('[HTTP] 解析后的响应:', JSON.stringify(json, null, 2));
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) { if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
console.log('[HTTP] 请求成功');
resolve(json as T); resolve(json as T);
} else { } else {
reject(new Error(json.error || json.message || `HTTP ${res.statusCode}`)); console.error('[HTTP] 请求失败:', {
statusCode: res.statusCode,
error: json.error,
message: json.message,
msg: json.msg
});
reject(new Error(json.error || json.message || json.msg || `HTTP ${res.statusCode}`));
} }
} catch (e) { } catch (e) {
console.error('[HTTP] 解析响应失败:', e);
console.error('[HTTP] 原始响应:', data);
reject(new Error(`解析响应失败: ${data}`)); reject(new Error(`解析响应失败: ${data}`));
} }
}); });
}); });
req.on('error', (error) => { req.on('error', (error) => {
console.error('[HTTP] 请求错误:', error);
reject(error); reject(error);
}); });
req.on('timeout', () => { req.on('timeout', () => {
console.error('[HTTP] 请求超时');
req.destroy(); req.destroy();
reject(new Error('请求超时')); reject(new Error('请求超时'));
}); });
if (options.body) { if (options.body) {
req.write(JSON.stringify(options.body)); const bodyStr = JSON.stringify(options.body);
console.log('[HTTP] 发送请求体:', bodyStr);
req.write(bodyStr);
} }
req.end(); req.end();
console.log('[HTTP] 请求已发送');
}); });
} }
@ -266,12 +294,22 @@ export async function getCreditBalance(userId: string): Promise<CreditBalanceRes
* POST /api/invitation/verify * POST /api/invitation/verify
*/ */
export async function verifyInvitationCode(code: string): Promise<InvitationVerifyResponse> { export async function verifyInvitationCode(code: string): Promise<InvitationVerifyResponse> {
console.log('[API] 验证邀请码'); console.log('[API] 验证邀请码 - 开始');
console.log('[API] 邀请码:', code);
const body: InvitationVerifyRequest = { code }; const body: InvitationVerifyRequest = { code };
return request<InvitationVerifyResponse>('/api/invitation/verify', { console.log('[API] 请求体:', JSON.stringify(body));
method: 'POST',
body try {
}); const response = await request<InvitationVerifyResponse>('/api/invitation/verify', {
method: 'POST',
body
});
console.log('[API] 验证邀请码 - 响应:', JSON.stringify(response));
return response;
} catch (error) {
console.error('[API] 验证邀请码 - 错误:', error);
throw error;
}
} }
/** /**

View File

@ -22,22 +22,35 @@ export class InvitationService {
*/ */
static async verifyCode(code: string): Promise<{ success: boolean; message: string }> { static async verifyCode(code: string): Promise<{ success: boolean; message: string }> {
try { try {
console.log('[InvitationService] 验证邀请码:', code); console.log('[InvitationService] ========== 开始验证邀请码 ==========');
console.log('[InvitationService] 邀请码:', code);
console.log('[InvitationService] 邀请码长度:', code.length);
const response = await verifyInvitationCode(code); const response = await verifyInvitationCode(code);
console.log('[InvitationService] 收到响应:', JSON.stringify(response, null, 2));
console.log('[InvitationService] 响应代码:', response.code);
console.log('[InvitationService] 响应消息:', response.msg);
console.log('[InvitationService] 验证结果:', response.data?.verified);
if (response.code === 200 && response.data?.verified) { if (response.code === 200 && response.data?.verified) {
console.log('[InvitationService] ✓ 验证成功');
return { return {
success: true, success: true,
message: response.msg || '验证成功' message: response.msg || '验证成功'
}; };
} else { } else {
console.log('[InvitationService] ✗ 验证失败');
return { return {
success: false, success: false,
message: response.msg || '验证失败' message: response.msg || '验证失败'
}; };
} }
} catch (error: any) { } catch (error: any) {
console.error('[InvitationService] 验证邀请码失败:', error); console.error('[InvitationService] ========== 验证邀请码异常 ==========');
console.error('[InvitationService] 错误类型:', error.constructor.name);
console.error('[InvitationService] 错误消息:', error.message);
console.error('[InvitationService] 错误堆栈:', error.stack);
return { return {
success: false, success: false,
message: error.message || '网络连接失败,请检查网络后重试' message: error.message || '网络连接失败,请检查网络后重试'

View File

@ -11,13 +11,14 @@ export function getInvitationModalContent(qrCodeUri?: string): string {
<div id="invitationModal" class="invitation-modal" style="display: none;"> <div id="invitationModal" class="invitation-modal" style="display: none;">
<div class="invitation-modal-overlay"></div> <div class="invitation-modal-overlay"></div>
<div class="invitation-modal-content"> <div class="invitation-modal-content">
<button id="invitationCloseBtn" class="invitation-close-btn" title="关闭">×</button>
<div class="invitation-modal-header"> <div class="invitation-modal-header">
<h2>验证邀请码</h2> <h2>验证邀请码</h2>
<p class="invitation-modal-subtitle">仅供企业端用户和内部人员使用</p> <p class="invitation-modal-subtitle">仅供企业端用户和内部人员使用</p>
</div> </div>
<div class="invitation-modal-body"> <div class="invitation-modal-body">
<div class="invitation-qrcode-section"> <div class="invitation-qrcode-section">
<p class="invitation-qrcode-text">欢迎企业端用户扫码添加微信获取邀请码</p> <p class="invitation-qrcode-text">欢迎扫码添加微信获取邀请码</p>
<img src="${qrCodeUri}" alt="微信二维码" class="invitation-qrcode-image" /> <img src="${qrCodeUri}" alt="微信二维码" class="invitation-qrcode-image" />
</div> </div>
<div class="invitation-input-section"> <div class="invitation-input-section">
@ -80,6 +81,36 @@ export function getInvitationModalStyles(): string {
animation: modalSlideIn 0.3s ease-out; animation: modalSlideIn 0.3s ease-out;
} }
.invitation-close-btn {
position: absolute;
top: 12px;
right: 12px;
width: 28px;
height: 28px;
border: none;
background: transparent;
color: var(--vscode-foreground);
font-size: 24px;
line-height: 1;
cursor: pointer;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
opacity: 0.6;
z-index: 1;
}
.invitation-close-btn:hover {
opacity: 1;
background: var(--vscode-toolbar-hoverBackground);
}
.invitation-close-btn:active {
transform: scale(0.95);
}
@keyframes modalSlideIn { @keyframes modalSlideIn {
from { from {
opacity: 0; opacity: 0;
@ -216,6 +247,7 @@ export function getInvitationModalScript(): string {
const modal = document.getElementById('invitationModal'); const modal = document.getElementById('invitationModal');
const input = document.getElementById('invitationCodeInput'); const input = document.getElementById('invitationCodeInput');
const submitBtn = document.getElementById('invitationSubmitBtn'); const submitBtn = document.getElementById('invitationSubmitBtn');
const closeBtn = document.getElementById('invitationCloseBtn');
const errorDiv = document.getElementById('invitationError'); const errorDiv = document.getElementById('invitationError');
// 显示邀请码弹窗 // 显示邀请码弹窗
@ -270,6 +302,11 @@ export function getInvitationModalScript(): string {
// 点击提交按钮 // 点击提交按钮
submitBtn.addEventListener('click', submitInvitationCode); submitBtn.addEventListener('click', submitInvitationCode);
// 点击关闭按钮
closeBtn.addEventListener('click', function() {
hideInvitationModal();
});
// 回车键提交 // 回车键提交
input.addEventListener('keypress', function(e) { input.addEventListener('keypress', function(e) {
if (e.key === 'Enter') { if (e.key === 'Enter') {
@ -277,6 +314,11 @@ export function getInvitationModalScript(): string {
} }
}); });
// 点击遮罩层关闭弹窗
document.querySelector('.invitation-modal-overlay').addEventListener('click', function() {
hideInvitationModal();
});
// 阻止点击弹窗内容时关闭 // 阻止点击弹窗内容时关闭
document.querySelector('.invitation-modal-content').addEventListener('click', function(e) { document.querySelector('.invitation-modal-content').addEventListener('click', function(e) {
e.stopPropagation(); e.stopPropagation();