mirror of
https://github.com/zhinianboke/xianyu-auto-reply.git
synced 2025-08-30 09:37:35 +08:00
优化登录界面
This commit is contained in:
parent
a9302527f8
commit
e49f45ba6e
@ -407,6 +407,7 @@ class DBManager:
|
|||||||
INSERT OR IGNORE INTO system_settings (key, value, description) VALUES
|
INSERT OR IGNORE INTO system_settings (key, value, description) VALUES
|
||||||
('theme_color', 'blue', '主题颜色'),
|
('theme_color', 'blue', '主题颜色'),
|
||||||
('registration_enabled', 'true', '是否开启用户注册'),
|
('registration_enabled', 'true', '是否开启用户注册'),
|
||||||
|
('show_default_login_info', 'true', '是否显示默认登录信息'),
|
||||||
('smtp_server', '', 'SMTP服务器地址'),
|
('smtp_server', '', 'SMTP服务器地址'),
|
||||||
('smtp_port', '587', 'SMTP端口'),
|
('smtp_port', '587', 'SMTP端口'),
|
||||||
('smtp_user', '', 'SMTP登录用户名(发件邮箱)'),
|
('smtp_user', '', 'SMTP登录用户名(发件邮箱)'),
|
||||||
|
@ -1502,10 +1502,35 @@ def get_registration_status():
|
|||||||
return {'enabled': True, 'message': '注册功能已开启'} # 出错时默认开启
|
return {'enabled': True, 'message': '注册功能已开启'} # 出错时默认开启
|
||||||
|
|
||||||
|
|
||||||
|
@app.get('/login-info-status')
|
||||||
|
def get_login_info_status():
|
||||||
|
"""获取默认登录信息显示状态(公开接口,无需认证)"""
|
||||||
|
from db_manager import db_manager
|
||||||
|
try:
|
||||||
|
enabled_str = db_manager.get_system_setting('show_default_login_info')
|
||||||
|
logger.debug(f"从数据库获取的登录信息显示设置值: '{enabled_str}'")
|
||||||
|
|
||||||
|
# 如果设置不存在,默认为开启
|
||||||
|
if enabled_str is None:
|
||||||
|
enabled_bool = True
|
||||||
|
else:
|
||||||
|
enabled_bool = enabled_str == 'true'
|
||||||
|
|
||||||
|
return {"enabled": enabled_bool}
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"获取登录信息显示状态失败: {e}")
|
||||||
|
# 出错时默认为开启
|
||||||
|
return {"enabled": True}
|
||||||
|
|
||||||
|
|
||||||
class RegistrationSettingUpdate(BaseModel):
|
class RegistrationSettingUpdate(BaseModel):
|
||||||
enabled: bool
|
enabled: bool
|
||||||
|
|
||||||
|
|
||||||
|
class LoginInfoSettingUpdate(BaseModel):
|
||||||
|
enabled: bool
|
||||||
|
|
||||||
|
|
||||||
@app.put('/registration-settings')
|
@app.put('/registration-settings')
|
||||||
def update_registration_settings(setting_data: RegistrationSettingUpdate, admin_user: Dict[str, Any] = Depends(require_admin)):
|
def update_registration_settings(setting_data: RegistrationSettingUpdate, admin_user: Dict[str, Any] = Depends(require_admin)):
|
||||||
"""更新注册开关设置(仅管理员)"""
|
"""更新注册开关设置(仅管理员)"""
|
||||||
@ -1532,6 +1557,31 @@ def update_registration_settings(setting_data: RegistrationSettingUpdate, admin_
|
|||||||
logger.error(f"更新注册设置失败: {e}")
|
logger.error(f"更新注册设置失败: {e}")
|
||||||
raise HTTPException(status_code=500, detail=str(e))
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
|
@app.put('/login-info-settings')
|
||||||
|
def update_login_info_settings(setting_data: LoginInfoSettingUpdate, admin_user: Dict[str, Any] = Depends(require_admin)):
|
||||||
|
"""更新默认登录信息显示设置(仅管理员)"""
|
||||||
|
from db_manager import db_manager
|
||||||
|
try:
|
||||||
|
enabled = setting_data.enabled
|
||||||
|
success = db_manager.set_system_setting(
|
||||||
|
'show_default_login_info',
|
||||||
|
'true' if enabled else 'false',
|
||||||
|
'是否显示默认登录信息'
|
||||||
|
)
|
||||||
|
if success:
|
||||||
|
log_with_user('info', f"更新登录信息显示设置: {'开启' if enabled else '关闭'}", admin_user)
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
'enabled': enabled,
|
||||||
|
'message': f"默认登录信息显示已{'开启' if enabled else '关闭'}"
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
raise HTTPException(status_code=500, detail='更新登录信息显示设置失败')
|
||||||
|
except HTTPException:
|
||||||
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"更新登录信息显示设置失败: {e}")
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1568,6 +1568,39 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 默认登录信息设置 -->
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<i class="bi bi-info-circle me-2"></i>登录信息设置
|
||||||
|
<span class="badge bg-warning ms-2">管理员专用</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="mb-3">
|
||||||
|
<div class="form-check form-switch">
|
||||||
|
<input class="form-check-input" type="checkbox" id="showDefaultLoginInfo">
|
||||||
|
<label class="form-check-label" for="showDefaultLoginInfo">
|
||||||
|
<strong>显示默认登录信息</strong>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-text">
|
||||||
|
<i class="bi bi-info-circle me-1"></i>
|
||||||
|
开启后,登录页面将显示默认的用户名和密码信息,方便用户快速登录
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-primary" onclick="updateLoginInfoSettings()">
|
||||||
|
<i class="bi bi-check-circle me-1"></i>保存设置
|
||||||
|
</button>
|
||||||
|
<div id="loginInfoStatus" class="mt-3" style="display: none;">
|
||||||
|
<div class="alert alert-info mb-0">
|
||||||
|
<i class="bi bi-info-circle me-2"></i>
|
||||||
|
<span id="loginInfoStatusText"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 外发配置 (仅管理员可见) -->
|
<!-- 外发配置 (仅管理员可见) -->
|
||||||
|
@ -7674,9 +7674,10 @@ async function loadSystemSettings() {
|
|||||||
outgoingConfigs.style.display = isAdmin ? 'block' : 'none';
|
outgoingConfigs.style.display = isAdmin ? 'block' : 'none';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果是管理员,加载注册设置和外发配置
|
// 如果是管理员,加载注册设置、登录信息设置和外发配置
|
||||||
if (isAdmin) {
|
if (isAdmin) {
|
||||||
await loadRegistrationSettings();
|
await loadRegistrationSettings();
|
||||||
|
await loadLoginInfoSettings();
|
||||||
await loadOutgoingConfigs();
|
await loadOutgoingConfigs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7897,6 +7898,76 @@ async function updateRegistrationSettings() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 加载默认登录信息设置
|
||||||
|
async function loadLoginInfoSettings() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/system-settings', {
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${authToken}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const settings = await response.json();
|
||||||
|
const checkbox = document.getElementById('showDefaultLoginInfo');
|
||||||
|
|
||||||
|
if (checkbox && settings.show_default_login_info !== undefined) {
|
||||||
|
checkbox.checked = settings.show_default_login_info === 'true';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('加载登录信息设置失败:', error);
|
||||||
|
showToast('加载登录信息设置失败', 'danger');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新默认登录信息设置
|
||||||
|
async function updateLoginInfoSettings() {
|
||||||
|
const checkbox = document.getElementById('showDefaultLoginInfo');
|
||||||
|
const statusDiv = document.getElementById('loginInfoStatus');
|
||||||
|
const statusText = document.getElementById('loginInfoStatusText');
|
||||||
|
|
||||||
|
if (!checkbox) return;
|
||||||
|
|
||||||
|
const enabled = checkbox.checked;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch('/login-info-settings', {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': `Bearer ${authToken}`
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
enabled: enabled
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
const message = enabled ? '默认登录信息显示已开启' : '默认登录信息显示已关闭';
|
||||||
|
showToast(message, 'success');
|
||||||
|
|
||||||
|
// 显示状态信息
|
||||||
|
if (statusDiv && statusText) {
|
||||||
|
statusText.textContent = message;
|
||||||
|
statusDiv.style.display = 'block';
|
||||||
|
|
||||||
|
// 3秒后隐藏状态信息
|
||||||
|
setTimeout(() => {
|
||||||
|
statusDiv.style.display = 'none';
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const errorData = await response.json();
|
||||||
|
showToast(`更新失败: ${errorData.detail || '未知错误'}`, 'danger');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('更新登录信息设置失败:', error);
|
||||||
|
showToast('更新登录信息设置失败', 'danger');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ================================
|
// ================================
|
||||||
// 订单管理功能
|
// 订单管理功能
|
||||||
// ================================
|
// ================================
|
||||||
|
@ -226,7 +226,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 默认账号提示 -->
|
<!-- 默认账号提示 -->
|
||||||
<div class="mt-4 p-3 bg-light rounded-3">
|
<div id="defaultLoginInfo" class="mt-4 p-3 bg-light rounded-3">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<small class="text-muted">
|
<small class="text-muted">
|
||||||
<i class="bi bi-info-circle me-1"></i>
|
<i class="bi bi-info-circle me-1"></i>
|
||||||
@ -659,11 +659,33 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查默认登录信息显示状态
|
||||||
|
async function checkLoginInfoStatus() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/login-info-status');
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
const defaultLoginInfo = document.getElementById('defaultLoginInfo');
|
||||||
|
if (result.enabled) {
|
||||||
|
defaultLoginInfo.style.display = 'block';
|
||||||
|
} else {
|
||||||
|
defaultLoginInfo.style.display = 'none';
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('检查登录信息显示状态失败:', error);
|
||||||
|
// 出错时默认显示
|
||||||
|
document.getElementById('defaultLoginInfo').style.display = 'block';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 事件监听器
|
// 事件监听器
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
// 检查注册状态
|
// 检查注册状态
|
||||||
checkRegistrationStatus();
|
checkRegistrationStatus();
|
||||||
|
|
||||||
|
// 检查默认登录信息显示状态
|
||||||
|
checkLoginInfoStatus();
|
||||||
|
|
||||||
// 登录方式切换
|
// 登录方式切换
|
||||||
document.querySelectorAll('input[name="loginType"]').forEach(radio => {
|
document.querySelectorAll('input[name="loginType"]').forEach(radio => {
|
||||||
radio.addEventListener('change', switchLoginType);
|
radio.addEventListener('change', switchLoginType);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user