Compare commits

..

5 Commits

3 changed files with 90 additions and 18 deletions

View File

@@ -276,6 +276,20 @@ def init_db():
] ]
for key, value, desc in default_configs: for key, value, desc in default_configs:
cursor.execute('INSERT INTO system_configs (key, value, description) VALUES (?, ?, ?)', (key, value, desc)) cursor.execute('INSERT INTO system_configs (key, value, description) VALUES (?, ?, ?)', (key, value, desc))
else:
# 检查并添加缺失的配置项(兼容旧数据库)
default_configs = [
('app_developer', 'OpenClaw Team', '开发者'),
('app_update_date', '2026-04-27', '更新日期'),
('app_technology', '智谱 GLM-4.5-Air 大模型', '技术基础'),
('app_description', '提供智能对话、多种智能体服务', '应用简介'),
('privacy_policy_url', '', '隐私政策链接'),
('user_agreement_url', '', '用户协议链接'),
]
for key, value, desc in default_configs:
cursor.execute('SELECT COUNT(*) FROM system_configs WHERE key=?', (key,))
if cursor.fetchone()[0] == 0:
cursor.execute('INSERT INTO system_configs (key, value, description) VALUES (?, ?, ?)', (key, value, desc))
# 初始化管理员账户 # 初始化管理员账户
cursor.execute('SELECT COUNT(*) FROM admin_users') cursor.execute('SELECT COUNT(*) FROM admin_users')

View File

@@ -124,6 +124,19 @@ async function loadBackendConfig() {
// 不加载默认启用的工具,所有工具默认未启用 // 不加载默认启用的工具,所有工具默认未启用
// 将后台系统配置赋值到 CONFIG
if (backendConfig.system) {
CONFIG.system = backendConfig.system;
}
// 将后台 LLM 配置赋值到 CONFIG
if (backendConfig.llm) {
CONFIG.apiUrl = backendConfig.llm.api_url;
CONFIG.apiKey = backendConfig.llm.api_key;
CONFIG.model = backendConfig.llm.model;
CONFIG.maxTokens = backendConfig.llm.max_tokens || 2048;
}
updateAgentsDisplay(); updateAgentsDisplay();
console.log('后台配置已加载', backendConfig); console.log('后台配置已加载', backendConfig);
} catch (e) { } catch (e) {
@@ -308,15 +321,41 @@ document.addEventListener('DOMContentLoaded', async () => {
// 初始化 appContainer // 初始化 appContainer
appContainer = document.getElementById('app'); appContainer = document.getElementById('app');
// 加载后台配置(包含 LLM、智能体等
await loadBackendConfig();
// 加载用户登录状态(优先检查) // 加载用户登录状态(优先检查)
const savedUser = localStorage.getItem('currentUser'); const savedUser = localStorage.getItem('currentUser');
if (savedUser) { if (savedUser) {
currentUser = JSON.parse(savedUser); currentUser = JSON.parse(savedUser);
} }
// 如果用户已登录且有ID从 backend 加载对话数据 // 如果用户已登录且有ID从 backend 加载最新用户信息和对话数据
if (currentUser && currentUser.id) { if (currentUser && currentUser.id) {
try { try {
// 从后台获取最新用户信息(包括头像)
const userRes = await fetch(`/api/user/${currentUser.id}`);
if (userRes.ok) {
const userData = await userRes.json();
if (userData && userData.id) {
// 更新 currentUser 为后台最新数据
currentUser = {
id: userData.id,
username: userData.username,
phone: userData.phone || '',
email: userData.email || '',
avatar: userData.avatar || '👤',
signature: userData.signature || '',
gender: userData.gender || '',
age: userData.age || '',
region: userData.region || '',
registeredAt: Date.now()
};
saveCurrentUser();
}
}
// 从 backend 加载对话数据
const res = await fetch(`/api/user/${currentUser.id}/conversations`); const res = await fetch(`/api/user/${currentUser.id}/conversations`);
const data = await res.json(); const data = await res.json();
if (Array.isArray(data) && data.length > 0) { if (Array.isArray(data) && data.length > 0) {
@@ -424,13 +463,8 @@ document.addEventListener('DOMContentLoaded', async () => {
currentPage = savedPage; currentPage = savedPage;
} }
// 加载后台配置并显示主页 // 显示主页
loadBackendConfig().then(() => {
showMainPage(); showMainPage();
}).catch(() => {
// 即使加载失败也显示主页
showMainPage();
});
}); });
// 根据用户配置更新显示的智能体 // 根据用户配置更新显示的智能体
@@ -789,10 +823,10 @@ function renderAgentsPage() {
<div class="recent-agent-item" data-conv-id="${conv.id}"> <div class="recent-agent-item" data-conv-id="${conv.id}">
<div class="recent-agent-left"> <div class="recent-agent-left">
<span class="recent-agent-avatar">${conv.agent ? conv.agent.avatar : '🤖'}</span> <span class="recent-agent-avatar">${conv.agent ? conv.agent.avatar : '🤖'}</span>
<span class="recent-agent-name">${conv.agent ? conv.agent.name : '未知智能体'}</span> <span class="recent-agent-title">${conv.title}</span>
</div> </div>
<div class="recent-agent-right"> <div class="recent-agent-right">
<span class="recent-agent-title">${conv.title}</span> <span class="recent-agent-agent-name">${conv.agent ? conv.agent.name : '未知智能体'}</span>
<span class="recent-agent-time">${formatTime(conv.updatedAt)}</span> <span class="recent-agent-time">${formatTime(conv.updatedAt)}</span>
</div> </div>
</div> </div>
@@ -1324,6 +1358,7 @@ function filterDiscoverAgents(keyword) {
if (!keyword) { if (!keyword) {
// 显示所有 // 显示所有
showDiscoverSection('hot', systemAgents.filter(a => a.category === 'hot')); showDiscoverSection('hot', systemAgents.filter(a => a.category === 'hot'));
showDiscoverSection('basic', systemAgents.filter(a => a.category === 'basic'));
showDiscoverSection('work', systemAgents.filter(a => a.category === 'work')); showDiscoverSection('work', systemAgents.filter(a => a.category === 'work'));
showDiscoverSection('study', systemAgents.filter(a => a.category === 'study')); showDiscoverSection('study', systemAgents.filter(a => a.category === 'study'));
showDiscoverSection('life', systemAgents.filter(a => a.category === 'life')); showDiscoverSection('life', systemAgents.filter(a => a.category === 'life'));
@@ -1338,6 +1373,7 @@ function filterDiscoverAgents(keyword) {
// 显示搜索结果 // 显示搜索结果
showDiscoverSection('hot', filtered.filter(a => a.category === 'hot')); showDiscoverSection('hot', filtered.filter(a => a.category === 'hot'));
showDiscoverSection('basic', filtered.filter(a => a.category === 'basic'));
showDiscoverSection('work', filtered.filter(a => a.category === 'work')); showDiscoverSection('work', filtered.filter(a => a.category === 'work'));
showDiscoverSection('study', filtered.filter(a => a.category === 'study')); showDiscoverSection('study', filtered.filter(a => a.category === 'study'));
showDiscoverSection('life', filtered.filter(a => a.category === 'life')); showDiscoverSection('life', filtered.filter(a => a.category === 'life'));
@@ -2611,7 +2647,12 @@ function showAboutPage() {
const privacyPolicyBtn = document.getElementById('privacyPolicyBtn'); const privacyPolicyBtn = document.getElementById('privacyPolicyBtn');
if (privacyPolicyBtn) { if (privacyPolicyBtn) {
privacyPolicyBtn.addEventListener('click', () => { privacyPolicyBtn.addEventListener('click', () => {
showToast('隐私政策页面待完善'); const privacyUrl = CONFIG?.system?.privacyPolicyUrl;
if (privacyUrl) {
window.open(privacyUrl, '_blank');
} else {
showToast('隐私政策链接未配置');
}
}); });
} }
@@ -2619,7 +2660,12 @@ function showAboutPage() {
const userAgreementBtn = document.getElementById('userAgreementBtn'); const userAgreementBtn = document.getElementById('userAgreementBtn');
if (userAgreementBtn) { if (userAgreementBtn) {
userAgreementBtn.addEventListener('click', () => { userAgreementBtn.addEventListener('click', () => {
showToast('用户协议页面待完善'); const agreementUrl = CONFIG?.system?.userAgreementUrl;
if (agreementUrl) {
window.open(agreementUrl, '_blank');
} else {
showToast('用户协议链接未配置');
}
}); });
} }
} }
@@ -3003,10 +3049,10 @@ function showAgentHistoryPage() {
<div class="agent-history-item" data-conv-id="${conv.id}"> <div class="agent-history-item" data-conv-id="${conv.id}">
<div class="agent-history-left"> <div class="agent-history-left">
<span class="agent-history-avatar">${conv.agent ? conv.agent.avatar : '🤖'}</span> <span class="agent-history-avatar">${conv.agent ? conv.agent.avatar : '🤖'}</span>
<span class="agent-history-agent-name">${conv.agent ? conv.agent.name : '未知智能体'}</span> <span class="agent-history-title">${conv.title}</span>
</div> </div>
<div class="agent-history-right"> <div class="agent-history-right">
<span class="agent-history-title">${conv.title}</span> <span class="agent-history-agent-name">${conv.agent ? conv.agent.name : '未知智能体'}</span>
<span class="agent-history-time">${formatTime(conv.updatedAt)}</span> <span class="agent-history-time">${formatTime(conv.updatedAt)}</span>
</div> </div>
</div> </div>

View File

@@ -1731,14 +1731,23 @@ body {
} }
.recent-agent-title { .recent-agent-title {
font-size: 13px; font-size: 14px;
color: #333; color: #333;
font-weight: 500;
max-width: 120px; max-width: 120px;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.recent-agent-agent-name {
font-size: 12px;
color: var(--primary);
background: rgba(102, 126, 234, 0.1);
padding: 2px 8px;
border-radius: 4px;
}
/* 智能体历史页面 */ /* 智能体历史页面 */
.agent-history-page { .agent-history-page {
display: flex; display: flex;
@@ -1809,8 +1818,9 @@ body {
} }
.agent-history-title { .agent-history-title {
font-size: 13px; font-size: 14px;
color: #333; color: #333;
font-weight: 500;
max-width: 150px; max-width: 150px;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@@ -1818,9 +1828,11 @@ body {
} }
.agent-history-agent-name { .agent-history-agent-name {
font-size: 13px; font-size: 12px;
color: var(--primary); color: var(--primary);
font-weight: 500; background: rgba(102, 126, 234, 0.1);
padding: 2px 8px;
border-radius: 4px;
} }
/* ==================== 我的页面 ==================== */ /* ==================== 我的页面 ==================== */