档案管理系统广域网部署全指南:零踩坑实操手册
你是不是也遇到过这种情况?外勤要查个客户档案,得特意跑回单位登内网。跨地市的分公司要交年度档案,只能发快递寄U盘,不仅慢还怕丢。想把档案管理系统放到广域网能用,又怕泄密、怕卡、怕出bug不敢弄?这篇我...
2026年06月29日 19:35:15
本方案适配通用档案管理场景,基于RBAC(基于角色的访问控制)模型实现,分为4级权限体系:超级管理员、部门管理员、档案创作者、普通访客,完全匹配档案分级查阅、分级编辑的业务需求,所有步骤可直接复用,零调整落地。
从零开发或二次开发档案管理系统,直接使用以下资源准备环境,所有链接为官方直链,可直接下载:
https://adoptium.net/temurin/releases/?version=17https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.zipsudo yum install -y mysql-community-server,Windows下载地址:https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.33.0.msi登录MySQL后,直接复制以下SQL执行,自动生成所有权限核心表和初始数据:
```sql CREATE DATABASE IF NOT EXISTS file_manage DEFAULT CHARACTER SET utf8mb4; USE file_manage; -- 系统用户表 CREATE TABLE `sys_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID', `username` varchar(32) NOT NULL COMMENT '用户名', `password` varchar(128) NOT NULL COMMENT 'BCrypt加密密码', `dept_id` bigint DEFAULT NULL COMMENT '所属部门ID', `status` tinyint NOT NULL DEFAULT '1' COMMENT '1启用 0禁用', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表'; -- 角色表 CREATE TABLE `sys_role` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID', `role_name` varchar(32) NOT NULL COMMENT '角色名称', `role_code` varchar(32) NOT NULL COMMENT '角色唯一标识', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; -- 用户角色关联表 CREATE TABLE `sys_user_role` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL COMMENT '用户ID', `role_id` bigint NOT NULL COMMENT '角色ID', PRIMARY KEY (`id`), UNIQUE KEY `uk_user_role` (`user_id`,`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表'; -- 权限表 CREATE TABLE `sys_permission` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '权限ID', `perm_code` varchar(64) NOT NULL COMMENT '权限唯一标识', `perm_name` varchar(32) NOT NULL COMMENT '权限名称', `perm_type` tinyint NOT NULL COMMENT '1目录 2菜单 3数据/接口权限', PRIMARY KEY (`id`), UNIQUE KEY `uk_perm_code` (`perm_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表'; -- 角色权限关联表 CREATE TABLE `sys_role_perm` ( `id` bigint NOT NULL AUTO_INCREMENT, `role_id` bigint NOT NULL COMMENT '角色ID', `perm_id` bigint NOT NULL COMMENT '权限ID', PRIMARY KEY (`id`), UNIQUE KEY `uk_role_perm` (`role_id`,`perm_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限关联表'; -- 档案业务表 CREATE TABLE `archive` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '档案ID', `archive_name` varchar(128) NOT NULL COMMENT '档案名称', `creator_id` bigint NOT NULL COMMENT '创建人ID', `dept_id` bigint NOT NULL COMMENT '归属部门ID', `visible_level` tinyint NOT NULL DEFAULT '1' COMMENT '1仅本人 2部门可见 3全公司可见', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='档案表'; -- 插入初始角色数据 INSERT INTO `sys_role` (`role_name`, `role_code`) VALUES ('超级管理员', 'super_admin'), ('部门管理员', 'dept_admin'), ('档案创作者', 'creator'), ('普通访客', 'guest'); -- 插入档案权限数据 INSERT INTO `sys_permission` (`perm_code`, `perm_name`, `perm_type`) VALUES ('archive:view:all', '查看所有档案', 3), ('archive:view:dept', '查看本部门档案', 3), ('archive:view:self', '查看自己创建的档案', 3), ('archive:edit:all', '编辑所有档案', 3), ('archive:edit:dept', '编辑本部门档案', 3), ('archive:edit:self', '编辑自己的档案', 3), ('archive:delete:all', '删除所有档案', 3), ('archive:delete:dept', '删除本部门档案', 3), ('archive:delete:self', '删除自己的档案', 3); -- 给超级管理员绑定所有权限 INSERT INTO `sys_role_perm` (`role_id`, `perm_id`) SELECT 1, id FROM sys_permission; -- 插入初始超级管理员,初始密码123456(已BCrypt加密) INSERT INTO `sys_user` (`username`, `password`, `status`) VALUES ('admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iAt', 1); INSERT INTO `sys_user_role` (`user_id`, `role_id`) VALUES (1,1); ```在SpringBoot项目中,先添加核心依赖,pom.xml中直接添加以下配置:

每次用户访问档案接口时,自动校验权限,完整代码可直接复制:
```java @Component public class ArchivePermissionInterceptor implements HandlerInterceptor { @Autowired private ArchiveMapper archiveMapper; @Autowired private PermissionService permissionService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 1.获取请求参数中的档案ID Long archiveId = Long.parseLong(request.getParameter("archiveId")); // 2.获取当前登录用户ID(替换为你项目的token解析逻辑即可) Long userId = UserContext.getCurrentUserId(); // 3.查询档案基础信息 Archive archive = archiveMapper.selectById(archiveId); // 4.按档案可见级别校验权限 switch (archive.getVisibleLevel()) { case 1: // 仅本人可见 boolean isSelf = archive.getCreatorId().equals(userId); boolean hasAllView = permissionService.hasPermission(userId, "archive:view:all"); if (!isSelf && !hasAllView) { response.sendError(403, "无权限访问该档案"); return false; } break; case 2: // 仅部门可见 User currentUser = UserContext.getCurrentUser(); boolean sameDept = currentUser.getDeptId().equals(archive.getDeptId()); boolean hasDeptView = permissionService.hasPermission(userId, "archive:view:dept"); if ((!sameDept || !hasDeptView) && !hasAllView) { response.sendError(403, "无权限访问该档案"); return false; } break; case 3: // 全公司可见 boolean hasAnyView = permissionService.hasAnyPermission(userId, "archive:view:self", "archive:view:dept", "archive:view:all"); if (!hasAnyView) { response.sendError(403, "无权限访问该档案"); return false; } break; } return true; } } ```注册拦截器,配置拦截规则:
```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private ArchivePermissionInterceptor archivePermissionInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(archivePermissionInterceptor) .addPathPatterns("/archive/") .excludePathPatterns("/user/login", "/user/logout"); } } ```完成开发后,按以下步骤给用户配置权限,操作即可生效:
POST /api/cache/clear/perm?userId={用户ID}刷新archive:view:cross,给对应角色勾选即可支持跨部门访问完成以上所有步骤后,即可实现完整可用的档案管理软件访问权限控制,无需额外调整即可适配绝大多数业务场景。