3
版本发布
11
新增功能
15
Bug 修复
11
功能更新
6
功能移除
8
性能优化
5
文档完善
v1.2.0
2026-08-13
本次更新修复了编辑用户时密码修改不生效的严重 bug,优化了侧边栏标题显示,并完成了 API 文档和更新日志的服务器部署。新增文档中心首页,统一了 443/9443/80 三个端口的文档访问路径。
修 Bug 修复
- 编辑用户密码不生效:后端
update_user函数(PUT /api/users/<uid>)的字段更新列表中未包含password字段,导致编辑用户时输入的新密码被直接忽略。app.py
修复方案:在函数中添加密码处理逻辑,包括密码策略验证(8位+数字)、SM3 哈希生成、盐值更新,并同步更新password_changed_at和清除must_change_password标记。API 验证:编辑修改密码 →{"code":0,"msg":"用户更新成功"}→ 新密码登录成功。
优 UI 优化
- 侧边栏标题字体调整:将"浙通信息用户管理中台"标题字体从
16px调整为14px,并添加white-space:nowrap和overflow:hidden;text-overflow:ellipsis防止换行,确保标题在一行内完整显示。index.html CSS
文 文档部署
- API 文档服务器部署:将完整的 89 个 API 接口文档(1,325 行 HTML)部署到服务器
/usr/share/nginx/html/docs/api-docs/,可通过https://user.nb8m.com:9443/docs/api-docs/访问。 - 开发更新日志部署:将开发更新日志部署到
/usr/share/nginx/html/docs/changelog/,可通过https://user.nb8m.com:9443/docs/changelog/访问。 - 文档中心首页:创建文档导航首页(
/docs/index.html),包含 API 文档和更新日志的快速入口卡片、系统信息(技术栈、端口配置、LDAP 配置)和访问地址汇总。 - Nginx 多端口文档配置:统一配置 443、9443、80 三个端口的
/docs/路径访问,修正/docs和/changelog的 301 重定向。之前 9443 端口无法访问文档,现已修复。user.nb8m.com.conf + api.conf + http.conf - 侧边栏文档入口:在前端侧边栏菜单底部添加"API 文档"和"更新日志"两个入口链接(无需权限检查,所有登录用户可见),点击在新标签页打开。
v1.1.0
2026-08-12
本次更新进行了大规模功能精简,移除了第三方认证管理等 6 个功能模块,将 LDAP/RADIUS 配置迁移到安全设置页面,并修复了模态框误关闭问题。共减少约 54,000 字符代码,提升了系统维护性。
删 功能移除(共减少 ~54,000 字符)
- 移除第三方认证管理:移除整个菜单项及
PAGE_RENDER['auth-external']页面渲染函数、switchAuthTab函数、AUTH_PAGE_STATE状态变量,以及所有*Auth后缀的辅助函数(共 40+ 个函数)。 - 移除 RADIUS 服务端:移除安全设置中的
secTab_radiusservertab 及相关函数loadRadiusServerConfig、saveRadiusServerConfig、controlRadiusServer。 - 移除 RADIUS 日志:移除审计日志中的
auditTab_radiustab 及loadRadiusLogs、radiusLogSearch、radiusLogReset等函数。 - 移除在线用户:移除
auditTab_onlinetab 及loadRadiusOnline、renderOnlineTable、renderOnlineToolbar、kickOnlineUser等函数。 - 移除记账记录:移除
auditTab_accountingtab 及loadRadiusAccounting、renderAcctTable、authAcctSearch、authAcctReset等函数。 - 移除调试日志:移除
DEBUG_LOG_STATE变量及loadRadiusDebugLog、loadRadiusDebugLogContent、toggleDebugAutoRefresh、clearDebugLog、colorizeDebugLine等函数。
迁 功能迁移
- LDAP 配置迁移:将 LDAP 配置从第三方认证管理页面迁移到安全设置页面,添加
secTab_ldaptab,在switchSecTab数组中添加'ldap'。 - LDAP 服务端迁移:将 LDAP 服务端配置迁移到安全设置页面,添加
secTab_ldapservertab,在PAGE_RENDER['security']中调用loadLdapServerConfig()。 - RADIUS 配置迁移:将 RADIUS 配置迁移到安全设置页面,添加
secTab_radiustab,在PAGE_RENDER['security']中调用loadRadiusConfig()。
修 Bug 修复
- 模态框点击外部关闭:移除
modalMask上的addEventListener('click')事件监听,该事件导致点击模态框外部空白区域时意外关闭窗口。index.html JS
修复后模态框只能通过以下 3 种方式关闭:① 点击右上角 × 按钮 ② 点击取消按钮(共 16 处) ③ 按 ESC 键。防止用户误操作丢失表单数据。
优 代码清理
- 移除
downloadCSV、formatBytes、LDAP_SYS_FIELDS、LDAP_DEFAULT_MAPPING等无引用的辅助函数和变量。 - 清理审计日志页面中多余的
auditTab_accounting、auditTab_radius、auditTab_onlinetab-content div。 - 清理注释块和残留代码,共减少约 54,671 字符。
- JS 语法检查全部通过(
node --check),确保无引用错误。
v1.0.0
2026-08-11
初始版本发布。包含 LDAP 配置增强、登录系统修复、密码策略统一、Nginx 优化等多项核心功能完善和 bug 修复。奠定了系统的安全基线和工程规范。
新 新功能
- LDAP 服务端 userPassword 属性:在
ldap_server.py的build_user_attributes函数中添加userPassword属性,格式为{SM3}hash:salt。认证绑定可获取密码哈希进行验证,匿名绑定由_apply_attr_policy过滤不可见。ldap_server.py
密码格式示例:{SM3}091f89c12593b27df08b75bf918088c107e997c79d42c77ac3ca75c8a3c4278e:0538f281c686b8ef0967674929d3fcc9 - LDAP 配置页面增强:添加服务器地址、Bind DN、密码字段(带可见性切换按钮)、属性映射配置等完整配置表单。
- autoLogout 函数:创建
autoLogout函数,跳过确认对话框直接调用/api/logout清除 session,用于密码修改后自动退出登录。
修 Bug 修复
- 登录系统 500 错误:
_check_account_status函数返回值数量不一致(有时返回 2 个值,有时返回 3 个值),导致登录请求解包失败。统一返回 3 个值:(locked, msg, user)。app.py - LDAP 密码字段不显示:
build_user_attributes函数中使用user.get('password_hash', '')访问密码字段,但user是sqlite3.Row对象,不支持.get()方法,导致始终返回空字符串。修改为user['password_hash'] if 'password_hash' in user.keys() else ''。 - 密码修改不生效:
doChangePassword函数中前端使用res.message读取错误信息,但后端返回res.msg,导致错误提示不显示。修改为res.msg||res.message兼容两种格式。 - 401 响应误处理:密码修改时 401 响应被误解为 session 过期而非密码错误,导致用户被强制登出而非显示错误提示。修复为正确区分 401 密码错误和 session 过期。
- event.target 空引用:通过代码调用
doChangePassword()时event.target为 null,导致按钮状态更新失败。添加typeof event!=='undefined'判断。 - forceLogout 函数名冲突:
forceLogout与已有函数冲突,重命名为autoLogout。 - 管理员重置密码验证不匹配:前端
doResetPassword仅验证密码 6 位,但后端要求 8 位+数字。修改前端验证为pwd.length<8并添加数字检查/\d/.test(pwd)。 - 前端残留代码导致函数解析失败:LDAP 密码字段代码中的残留 placeholder 文本和双重转义导致 JavaScript 语法错误,
doLogin等函数无法被解析,UI 元素消失。清理残留代码修复。 - tab-content div 删除导致空引用:移除 HTML 元素时未同步移除引用该元素的 JavaScript 函数调用,导致
Cannot set properties of null错误。
更 功能更新
- 密码策略统一:前端密码验证从
length<6统一修改为length<8,并添加数字检查,与后端密码策略(min_length=8, require_digit=1)保持一致。 - 密码提示文本更新:修改密码和重置密码的 placeholder 文本从"请输入新密码"更新为"至少8位,需包含数字",明确提示密码要求。
- doResetPassword 增强:添加按钮禁用/加载状态、错误处理(
.catch)、错误消息兼容(res.msg||res.message)。
优 基础设施优化
- Nginx no-cache 配置:在
location /中添加Cache-Control: no-cache, no-store, must-revalidate、Pragma: no-cache、Expires: 0头,确保浏览器获取最新前端代码。 - Nginx HTTP 80 端口反向代理:添加
/api/路径反向代理到 Flask 后端,支持 HTTP 和 HTTPS 双协议访问。 - JS 语法检查流程:建立使用
node --check对所有<script>块进行语法检查的标准流程,在每次修改后自动执行。
文 文档与规范
- 建立项目记忆文件,记录硬约束(模态框关闭规则、密码策略、登录安全等)和工程约定(Nginx 配置、错误处理规范等)。
- 记录教训:sqlite3.Row 不支持 .get() 方法、前后端字段名需一致、HTML 元素删除需同步移除 JS 引用等。
技术栈
| 组件 | 版本 | 说明 |
|---|---|---|
| 后端框架 | Flask | Python 3.12.11 |
| 数据库 | SQLite | 22 张数据表 |
| Web 服务器 | Nginx 1.26.3 | 反向代理 + 静态文件服务 |
| 前端 | 单文件 HTML 应用 | 原生 JS + CSS 变量 |
| LDAP 服务 | 自研 Python LDAP Server | 端口 1389, Base DN: dc=ztinfo,dc=com |
| 密码哈希 | SM3 国密算法 | 格式: sm3$hash |
| 认证方式 | Session + API Token | 双认证模式 |
| API 接口数 | 89 个 | 19 个功能模块 |
端口配置
| 端口 | 协议 | 用途 | 配置文件 |
|---|---|---|---|
80 | HTTP | Web 前端 + API 代理 | user.nb8m.com.http.conf |
443 | HTTPS | Web 前端 + API + 文档 | user.nb8m.com.conf |
8443 | HTTPS | 外部映射到 443 端口 | (防火墙/路由器映射) |
9443 | HTTPS | API 服务专用 + 文档 | user.nb8m.com.api.conf |
1389 | TCP | LDAP 服务 | ldap_server.py |
5000 | HTTP | Flask 后端(内部) | usermgr.service |
数据库表
| 表名 | 说明 | 关键字段 |
|---|---|---|
users | 用户表 | username, password_hash, salt, status, failed_login_count, locked_until |
departments | 部门表 | name, parent_id, sort_order, status |
roles | 角色表 | name, code, description, status |
permissions | 权限表 | name, code, type, parent_id, sort_order, path, icon |
user_roles | 用户角色关联 | user_id, role_id |
role_permissions | 角色权限关联 | role_id, permission_id |
user_departments | 用户部门关联 | user_id, department_id, is_primary |
password_policy | 密码策略 | min_length=8, require_digit=1, max_login_attempts=5, lockout_duration=30min |
ip_rules | IP 访问规则 | ip_range, rule_type, status |
login_logs | 登录日志 | username, login_time, source_ip, status, fail_reason |
operation_logs | 操作日志 | user_id, operation, module, target_type, detail |
api_logs | API 调用日志 | token_id, method, endpoint, status_code, response_time_ms |
api_tokens | API Token | token, name, user_id, permissions, expires_at |
ldap_config | LDAP 配置 | server, port, bind_dn, bind_password, base_dn, user_filter |
radius_config | RADIUS 配置 | server, port, shared_secret, timeout, retries |
syslog_config | Syslog 配置 | server, port, protocol, facility, log_level |
ldap_access_logs | LDAP 访问日志 | bind_dn, operation, source_ip, timestamp |
radius_access_logs | RADIUS 访问日志 | username, nas_ip, result, timestamp |
radius_accounting_logs | RADIUS 记账日志 | username, session_id, bytes_in, bytes_out, duration |
system_settings | 系统设置 | key, value, description |
sessions | 会话表 | session_id, user_id, ip, user_agent, expires_at |
ldap_attr_mapping | LDAP 属性映射 | system_field, ldap_attr, description |