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_radiusserver tab 及相关函数 loadRadiusServerConfig、saveRadiusServerConfig、controlRadiusServer。
  • 移除 RADIUS 日志:移除审计日志中的 auditTab_radius tab 及 loadRadiusLogs、radiusLogSearch、radiusLogReset 等函数。
  • 移除在线用户:移除 auditTab_online tab 及 loadRadiusOnline、renderOnlineTable、renderOnlineToolbar、kickOnlineUser 等函数。
  • 移除记账记录:移除 auditTab_accounting tab 及 loadRadiusAccounting、renderAcctTable、authAcctSearch、authAcctReset 等函数。
  • 移除调试日志:移除 DEBUG_LOG_STATE 变量及 loadRadiusDebugLog、loadRadiusDebugLogContent、toggleDebugAutoRefresh、clearDebugLog、colorizeDebugLine 等函数。

迁 功能迁移

  • LDAP 配置迁移:将 LDAP 配置从第三方认证管理页面迁移到安全设置页面,添加 secTab_ldap tab,在 switchSecTab 数组中添加 'ldap'。
  • LDAP 服务端迁移:将 LDAP 服务端配置迁移到安全设置页面,添加 secTab_ldapserver tab,在 PAGE_RENDER['security'] 中调用 loadLdapServerConfig()。
  • RADIUS 配置迁移:将 RADIUS 配置迁移到安全设置页面,添加 secTab_radius tab,在 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_online tab-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 引用等。
技术栈
组件版本说明
后端框架FlaskPython 3.12.11
数据库SQLite22 张数据表
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 个功能模块
端口配置
端口协议用途配置文件
80HTTPWeb 前端 + API 代理user.nb8m.com.http.conf
443HTTPSWeb 前端 + API + 文档user.nb8m.com.conf
8443HTTPS外部映射到 443 端口(防火墙/路由器映射)
9443HTTPSAPI 服务专用 + 文档user.nb8m.com.api.conf
1389TCPLDAP 服务ldap_server.py
5000HTTPFlask 后端(内部)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_rulesIP 访问规则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_logsAPI 调用日志token_id, method, endpoint, status_code, response_time_ms
api_tokensAPI Tokentoken, name, user_id, permissions, expires_at
ldap_configLDAP 配置server, port, bind_dn, bind_password, base_dn, user_filter
radius_configRADIUS 配置server, port, shared_secret, timeout, retries
syslog_configSyslog 配置server, port, protocol, facility, log_level
ldap_access_logsLDAP 访问日志bind_dn, operation, source_ip, timestamp
radius_access_logsRADIUS 访问日志username, nas_ip, result, timestamp
radius_accounting_logsRADIUS 记账日志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_mappingLDAP 属性映射system_field, ldap_attr, description