v0.8.7测试
This commit is contained in:
@@ -27,7 +27,7 @@ from schemas.admin import (
|
|||||||
AddPointsRequest, RevokeRequest, AddAdminRequest,
|
AddPointsRequest, RevokeRequest, AddAdminRequest,
|
||||||
AddStudentRequest,
|
AddStudentRequest,
|
||||||
UpdateHomeworkStatusRequest, AddAttendanceRequest,
|
UpdateHomeworkStatusRequest, AddAttendanceRequest,
|
||||||
UpdateAdminRequest, DeleteAdminRequest
|
UpdateAdminRequest, DeleteAdminRequest, ResetPasswordRequest
|
||||||
)
|
)
|
||||||
from utils.response import success_response, error_response
|
from utils.response import success_response, error_response
|
||||||
from utils.logger import get_logger
|
from utils.logger import get_logger
|
||||||
@@ -439,7 +439,7 @@ async def delete_admin(request: Request, user_id: int):
|
|||||||
|
|
||||||
|
|
||||||
@router.post("/reset-password/{user_id}")
|
@router.post("/reset-password/{user_id}")
|
||||||
async def reset_admin_password(request: Request, user_id: int):
|
async def reset_admin_password(request: Request, user_id: int, req: ResetPasswordRequest):
|
||||||
"""重置管理员密码(班主任)"""
|
"""重置管理员密码(班主任)"""
|
||||||
user = await get_current_user(request)
|
user = await get_current_user(request)
|
||||||
is_teacher = await PermissionChecker.check_is_teacher(user["user_id"])
|
is_teacher = await PermissionChecker.check_is_teacher(user["user_id"])
|
||||||
@@ -457,8 +457,8 @@ async def reset_admin_password(request: Request, user_id: int):
|
|||||||
if target_user["user_type"] != "admin":
|
if target_user["user_type"] != "admin":
|
||||||
return error_response(message="只能重置管理员密码", code=400)
|
return error_response(message="只能重置管理员密码", code=400)
|
||||||
|
|
||||||
# 生成新密码
|
# 使用传入的新密码
|
||||||
new_password = SecurityUtils.generate_random_password(8)
|
new_password = req.new_password
|
||||||
password_hash = SecurityUtils.sha1_md5_password(new_password)
|
password_hash = SecurityUtils.sha1_md5_password(new_password)
|
||||||
|
|
||||||
# 更新密码
|
# 更新密码
|
||||||
@@ -471,6 +471,6 @@ async def reset_admin_password(request: Request, user_id: int):
|
|||||||
details=f"重置管理员密码: {target_user['real_name']}({target_user['username']})",
|
details=f"重置管理员密码: {target_user['real_name']}({target_user['username']})",
|
||||||
ip=request.client.host
|
ip=request.client.host
|
||||||
)
|
)
|
||||||
return success_response(data={"password": new_password}, message="密码重置成功")
|
return success_response(message="密码重置成功")
|
||||||
else:
|
else:
|
||||||
return error_response(message="密码重置失败")
|
return error_response(message="密码重置失败")
|
||||||
@@ -98,3 +98,8 @@ class UpdateAdminRequest(BaseModel):
|
|||||||
class DeleteAdminRequest(BaseModel):
|
class DeleteAdminRequest(BaseModel):
|
||||||
"""删除管理员请求"""
|
"""删除管理员请求"""
|
||||||
user_id: int = Field(..., description="用户ID")
|
user_id: int = Field(..., description="用户ID")
|
||||||
|
|
||||||
|
|
||||||
|
class ResetPasswordRequest(BaseModel):
|
||||||
|
"""重置密码请求"""
|
||||||
|
new_password: str = Field(..., min_length=6, max_length=50, description="新密码")
|
||||||
@@ -121,8 +121,35 @@ include __DIR__ . '/../includes/header.php';
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 重置密码模态框 -->
|
||||||
|
<div id="resetPasswordModal" class="modal">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3>重置密码</h3>
|
||||||
|
<button class="modal-close" onclick="closeModal('resetPasswordModal')">×</button>
|
||||||
|
</div>
|
||||||
|
<form onsubmit="event.preventDefault(); submitResetPassword()">
|
||||||
|
<input type="hidden" id="resetPasswordUserId">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>管理员</label>
|
||||||
|
<input type="text" id="resetPasswordAdminName" disabled>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>新密码</label>
|
||||||
|
<input type="text" id="newPassword" required minlength="6" placeholder="请输入新密码(至少6位)">
|
||||||
|
<small>密码长度至少6位</small>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="submit" class="btn btn-primary">确认重置</button>
|
||||||
|
<button type="button" class="btn" onclick="closeModal('resetPasswordModal')">取消</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var currentEditUserId = null;
|
var currentEditUserId = null;
|
||||||
|
var currentResetUserId = null;
|
||||||
|
|
||||||
async function loadAdmins() {
|
async function loadAdmins() {
|
||||||
const res = await apiGet('/api/admin/list');
|
const res = await apiGet('/api/admin/list');
|
||||||
@@ -228,14 +255,30 @@ async function deleteAdmin(userId, realName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function resetAdminPassword(userId, realName) {
|
function resetAdminPassword(userId, realName) {
|
||||||
if (!confirm(`确定要重置管理员 "${realName}" 的密码吗?`)) {
|
currentResetUserId = userId;
|
||||||
|
document.getElementById('resetPasswordUserId').value = userId;
|
||||||
|
document.getElementById('resetPasswordAdminName').value = realName;
|
||||||
|
document.getElementById('newPassword').value = '';
|
||||||
|
document.getElementById('resetPasswordModal').style.display = 'flex';
|
||||||
|
}
|
||||||
|
|
||||||
|
async function submitResetPassword() {
|
||||||
|
if (!currentResetUserId) return;
|
||||||
|
|
||||||
|
const newPassword = document.getElementById('newPassword').value;
|
||||||
|
if (!newPassword || newPassword.length < 6) {
|
||||||
|
showToast('密码长度至少6位', 'warning');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const res = await apiPost(`/api/admin/reset-password/${userId}`, {});
|
const res = await apiPost(`/api/admin/reset-password/${currentResetUserId}`, {
|
||||||
|
new_password: newPassword
|
||||||
|
});
|
||||||
|
|
||||||
if (res && res.success) {
|
if (res && res.success) {
|
||||||
alert(`密码重置成功!\n管理员:${realName}\n新密码:${res.data.password}\n请妥善保管并及时通知该管理员。`);
|
showToast('密码重置成功');
|
||||||
|
closeModal('resetPasswordModal');
|
||||||
} else {
|
} else {
|
||||||
showToast(res?.message || '密码重置失败', 'error');
|
showToast(res?.message || '密码重置失败', 'error');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,8 +114,8 @@ async function exportMoralityRecords() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有历史记录(不分页,获取全部)
|
// 获取所有历史记录(获取全部,API限制最大1000条)
|
||||||
const historyRes = await apiGet('/api/admin/conduct/history', { page: 1, page_size: 10000 });
|
const historyRes = await apiGet('/api/admin/conduct/history', { page: 1, page_size: 1000 });
|
||||||
if (!historyRes || !historyRes.success) {
|
if (!historyRes || !historyRes.success) {
|
||||||
showToast('获取历史记录失败', 'error');
|
showToast('获取历史记录失败', 'error');
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user