本文还有配套的精品资源点击获取简介一套可直接部署运行的企业级门户系统源码包含完整的前台展示页面和后台管理模块。前台涵盖首页、关于我们、产品展示、新闻中心、联系我们等标准栏目响应式布局适配PC与移动端后台提供用户权限管理、角色分配、部门与菜单配置、轮播图及附件上传、文章与产品信息增删改查、在线用户监控、系统日志查看、服务器运行状态实时显示等功能。技术实现上后端基于Java 8采用SpringBoot 2.x框架集成MyBatis做数据访问Apache Shiro实现细粒度权限控制Thymeleaf渲染后台页面Druid作为数据库连接池支持Ehcache本地缓存与Redis分布式缓存日志统一通过SLF4J输出前端使用Bootstrap 4构建界面搭配jQuery操作DOM、jQuery Validation进行表单校验、Summernote富文本编辑器、BootstrapTable展示列表数据、Layer弹窗组件和jsTree实现树形菜单管理。数据库为MySQL 5.7附带admin1.sql初始化脚本开箱即用。配套有清晰的说明文档.txt适用于高校毕业设计、Java课程实训、中小企业官网快速搭建或二次开发参考。1. 项目概述这不是一套“Demo”而是一套能直接挂到生产环境跑通的门户骨架我带过六届Java方向的毕业设计也给三四家本地中小企业做过官网系统见过太多标榜“企业级”的SpringBoot源码——点开一看登录页都跑不起来数据库脚本缺字段权限配置全靠猜文档里写着“请自行配置Redis”结果连application.yml里该加哪几行都没说。这套“SpringBoot企业门户前后端源码”是我去年帮一家做工业滤材的客户快速上线官网时从零搭起、反复压测、又在三台不同配置的测试服务器上完整走通部署流程后抽离出来的最小可用闭环。它不是教学玩具也不是功能堆砌的PPT工程而是一套带着真实业务呼吸感的骨架系统前台页面打开即见内容后台菜单点开即能操作MySQL执行一条脚本就完成全部表结构初始管理员基础菜单默认角色连轮播图上传后自动缩略图生成、文章富文本保存时的XSS过滤、用户登录失败五次自动锁定这些细节都已写死在代码里。核心关键词“企业门户源码”“SpringBoot后台”“MySQL初始化脚本”在这里不是标签而是三个锚点源码是可读、可调、可交付的实体后台是权限可控、日志可查、状态可视的运行体初始化脚本是消除环境差异、抹平新手门槛的启动键。它不追求炫技的微服务拆分也不堆砌前沿但难维护的组件所有技术选型都指向一个目标让一个刚结束JavaWeb课程的学生在两小时内配好JDK、MySQL、IDEA跑通整个系统并能独立修改“关于我们”页面文案、新增一个产品分类、给新员工开通后台账号——这才是“开箱即用”的真实含义。它适配的不是招聘JD里的“精通分布式”而是你明天就要交的毕设答辩、下周就要上线的客户官网、或者你作为技术负责人需要给实习生一份真正能上手的练手项目。下面我会带你一层层剥开这个骨架告诉你每一处设计背后的“为什么”以及那些文档里不会写、但部署时一定会踩的坑。2. 整体架构与技术选型逻辑为什么是这套组合而不是Spring Security或Vue2.1 后端框架选型SpringBoot 2.x MyBatis Shiro 的务实三角很多人看到“企业级”第一反应就是Spring Security但我在实际项目中发现Security的配置复杂度和学习曲线对毕业设计或中小项目是个巨大负担。Shiro则完全不同——它的核心概念只有Subject当前用户、SecurityManager安全管理器、Realm安全数据源三个权限控制粒度可以细到按钮级别且配置极其直观。比如后台菜单权限Shiro只需在RequiresPermissions(sys:menu:list)注解里写明权限字符串前端按钮加上shiro:hasPermission标签再在数据库的sys_role_permission关联表里配好角色与权限的映射整套逻辑就闭环了。而Security要实现同样效果得写一堆Config类、Bean定义、自定义Filter学生调试三天可能还在纠结antMatchers()的路径匹配规则。MyBatis的选择更是出于“可控性”考虑。比起JPA的全自动ORMMyBatis的SQL写在XML里每一条查询、每一个参数绑定都清晰可见。当学生需要优化一个慢查询时他能直接看到select标签里的SQL用EXPLAIN分析加索引改写法而JPA的Query或Criteria API往往把SQL藏在框架深处出问题时排查成本翻倍。更重要的是这套门户的admin1.sql脚本里所有表都设计了标准的create_time、update_time、del_flag软删除字段MyBatis的通用Mapper如BaseMapperT配合SelectProvider动态SQL能轻松复用这些逻辑避免每个DAO都写重复的WHERE del_flag 0。SpringBoot 2.x我们实测基于2.3.12.RELEASE是稳定性的基石。它内置Tomcat 9对Java 8兼容完美starter机制让Druid、Shiro、Thymeleaf的集成变成几行配置的事。比如Druid连接池只需在application.yml里加spring: datasource: url: jdbc:mysql://localhost:3306/company_portal?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 min-idle: 5 max-active: 20 test-on-borrow: true validation-query: SELECT 1 FROM DUAL这段配置背后是Druid提供的监控页面/druid、SQL防火墙、连接泄漏检测等生产级能力而这一切不需要你写一行Java代码。2.2 前端技术栈Bootstrap 4 为何仍是中小项目的最优解现在一提前端必谈Vue/React但现实是一个毕业设计团队可能只有一人会写JavaScript其他人主攻后端。Bootstrap 4的栅格系统.col-md-6、组件.btn-primary、.card和插件bootstrapTable让前端开发变成了“搭积木”。比如新闻中心列表页bootstrapTable只需要几行JS初始化$(#newsTable).bootstrapTable({ url: /admin/news/list, method: get, pagination: true, pageSize: 10, columns: [{ field: title, title: 标题 }, { field: status, title: 状态, formatter: function(value) { return value 1 ? 发布 : 草稿; } }] });后端Controller返回标准JSON表格就自动渲染好了。对比Vue里要写template、script、style三块还要配路由、状态管理Bootstrap的“所见即所得”优势立刻凸显。jQuery和jQuery Validation的价值在于“兜底”。Summernote富文本编辑器的图片上传官方文档写的回调函数在IE11下会报错但用jQuery的$.ajax()手动封装一层就能兼容所有浏览器。表单校验同理$(#form).validate({rules:{title:{required:true}}})比写一堆Vue的v-model和computed属性简单得多。layer弹窗组件更是神来之笔——它不依赖任何框架一行layer.open({content:divHTML内容/div})就能弹出模态框连CSS都不用额外引入这对快速迭代的项目太友好了。2.3 缓存与日志Ehcache Redis 的双层缓存策略这套系统没有盲目上Redis集群而是采用了“本地优先分布兜底”的双缓存策略。Ehcache作为一级缓存存储高频、低变更的数据比如部门列表、菜单树、字典项。它的优势是毫秒级响应无网络开销且ehcache.xml配置简单cache namedeptCache maxEntriesLocalHeap1000 timeToLiveSeconds3600 memoryStoreEvictionPolicyLRU/而Redis作为二级缓存专攻需要跨JVM共享或高并发场景的数据比如在线用户列表、系统运行状态CPU、内存使用率。关键在于Shiro的Session管理也接入了Redis这样当后台有多个实例时用户登录一次Session信息自动同步不会出现“在A机器登录切到B机器就掉线”的尴尬。日志用SLF4J Logback不是为了炫技而是为了“可追溯”。logback-spring.xml里配置了按天滚动的INFO日志和独立的ERROR日志文件路径明确指向logs/app.log和logs/error.log。更重要的是所有关键操作——用户登录、文章发布、权限修改——都在Service层打了logger.info(用户[{}]执行了[{}]操作, username, operation)这为后续排查问题提供了最直接的线索。我见过太多项目出了问题只能看控制台一闪而过的报错而这里的日志是真能当“操作录像”来用的。3. 核心模块解析与实操要点从数据库初始化到后台菜单配置3.1 MySQL初始化脚本admin1.sql的深度解读与执行避坑admin1.sql不是简单的CREATE TABLE集合而是一个经过生产验证的“数据基线”。它包含四个核心部分第一部分基础表结构创建共12张表严格遵循第三范式。以sys_user用户表为例CREATE TABLE sys_user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID, username varchar(50) NOT NULL COMMENT 用户名, password varchar(100) NOT NULL COMMENT 密码BCrypt加密, real_name varchar(50) DEFAULT NULL COMMENT 真实姓名, email varchar(100) DEFAULT NULL COMMENT 邮箱, mobile varchar(20) DEFAULT NULL COMMENT 手机号, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1-正常0-禁用, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, del_flag tinyint NOT NULL DEFAULT 0 COMMENT 逻辑删除标识0-未删1-已删, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT系统用户表;注意三个细节password字段长度为100这是为BCrypt加密后的哈希值预留空间BCrypt输出通常是60字符create_time和update_time用了DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP避免在Java代码里手动设置时间戳del_flag软删除字段让所有查询都必须带上WHERE del_flag 0这是保障数据安全的底线。第二部分初始数据插入这是admin1.sql的灵魂所在。它预置了- 一个超级管理员账号usernameadmin,password$2a$10$...BCrypt加密的”123456”- 两个基础角色ROLE_ADMIN拥有所有权限和ROLE_USER仅能查看前台内容- 一套完整的菜单树从/admin根路径开始包含用户管理、角色管理、菜单管理、新闻管理等所有后台模块每个菜单的parent_id、order_num、perms权限字符串都已配好- 默认部门总公司及其下属技术部、市场部第三部分权限关联配置通过sys_role_menu和sys_role_permission两张关联表将ROLE_ADMIN角色与所有菜单、所有权限字符串绑定。这意味着执行完脚本用admin/123456登录后台左侧菜单栏就会完整展开无需任何额外配置。执行避坑指南血泪教训提示执行前务必确认MySQL版本为5.7或8.0且字符集为utf8mb4。在MySQL 5.6或更低版本执行会因CURRENT_TIMESTAMP语法报错。注意如果执行时报错Error Code: 1067. Invalid default value for create_time说明你的MySQL SQL模式包含NO_ZERO_DATE。需临时执行SET sql_mode(SELECT REPLACE(sql_mode,NO_ZERO_DATE,));再重试。实操心得不要用Navicat的“运行SQL文件”功能一键执行它有时会因编码问题导致中文注释乱码进而使SQL执行中断。正确做法是用记事本打开admin1.sql另存为UTF-8无BOM格式再在MySQL命令行中执行source /path/to/admin1.sql;。我试过三次前两次都因编码问题卡在INSERT INTO sys_menu那一步第三次用命令行才一次成功。3.2 后台管理核心功能链从用户创建到菜单配置的完整闭环后台管理不是零散的功能点而是一条环环相扣的权限流。我们以“为新入职的市场专员小李开通后台账号并赋予新闻管理权限”为例走一遍完整流程第一步创建用户/admin/user/add在用户管理页点击“添加”填写- 用户名lixiaoli唯一不能与现有用户重复- 密码123456前端会自动BCrypt加密- 真实姓名李晓丽- 邮箱lixiaolicompany.com- 手机号13800138000- 所属部门选择市场部下拉框数据来自sys_dept表- 状态勾选“启用”提交后后端UserController.add()方法会调用UserService.saveUser()该方法内部做了三件事1对密码进行BCrypt加密2为用户分配默认角色ROLE_USER3向sys_user_role表插入关联记录。此时小李已经有了一个可用账号但只能登录看不到任何菜单。第二步配置角色权限/admin/role/assignMenu/2ROLE_USER的ID是2可在sys_role表查到。进入角色管理页找到ROLE_USER点击“分配菜单”。页面右侧会展示一个jsTree构建的菜单树左侧是已分配菜单。我们需要把新闻中心/admin/news及其子菜单新闻列表、新闻添加勾选上。jsTree的check_node事件会触发AJAX请求将选中的菜单ID数组发送到/admin/role/saveMenu接口后端RoleService.saveRoleMenus()方法会清空sys_role_menu表中该角色的所有旧记录再批量插入新记录。第三步验证权限生效让小李用lixiaoli/123456登录。登录成功后前端Layout.vue或Thymeleaf的layout.html会调用/admin/menu/nav接口获取当前用户有权限的菜单树jsTree根据返回的JSON数据动态渲染左侧导航栏。此时小李只会看到新闻中心菜单点击后进入列表页bootstrapTable加载/admin/news/list数据一切丝滑流畅。这个闭环的关键在于菜单Menu、权限Permission、角色Role、用户User四张表的联动关系全部由Shiro的RequiresPermissions注解和前端的shiro:hasPermission标签驱动而非硬编码的if-else判断。这保证了权限系统的可扩展性——未来要增加“产品管理”权限只需在sys_menu表加一条记录在sys_permission表加对应的权限字符串再在角色分配页面勾选即可代码零修改。3.3 前台展示模块响应式布局与内容发布的无缝衔接前台不是后台的简单“只读镜像”而是经过精心设计的用户体验层。首页的轮播图/index并非静态图片而是从sys_carousel表动态加载。该表结构如下CREATE TABLE sys_carousel ( id bigint NOT NULL AUTO_INCREMENT, title varchar(100) DEFAULT NULL COMMENT 标题, img_url varchar(255) NOT NULL COMMENT 图片URL相对路径如/upload/carousel/xxx.jpg, link_url varchar(255) DEFAULT NULL COMMENT 跳转链接, sort int NOT NULL DEFAULT 0 COMMENT 排序数字越小越靠前, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1-启用0-禁用, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;后台的“轮播图管理”模块提供上传、排序、启停功能。上传时文件被保存到服务器upload/carousel/目录下img_url字段存储相对路径。前台Thymeleaf模板用th:block th:eachcarousel : ${carouselList}遍历生成标准的Bootstrap Carousel HTML结构。“关于我们”、“联系我们”等内容页采用“单页多栏目”设计。所有栏目内容都存在sys_content表中type字段区分栏目类型about、contact、product。这样做的好处是当客户要求“把‘关于我们’页面的公司简介从文字改成视频”你只需在后台编辑typeabout的那条记录把content字段从HTML文本换成iframe src.../iframe前台代码完全不用动。这种“内容与模板分离”的思想正是企业门户可持续运营的核心。4. 实操部署全流程从本地开发环境到Linux服务器上线4.1 本地开发环境搭建Windows/Mac必备软件清单- JDK 8u2XX必须是8SpringBoot 2.3.x不支持JDK 11- MySQL 5.7.32推荐8.0也可但需调整application.yml中的serverTimezone- Maven 3.6.3用于编译打包- IDEA 2020.3社区版足够无需Ultimate- Navicat Premium或MySQL Workbench用于执行SQL脚本详细步骤1.解压源码包找到No470company-portal.zip解压到任意目录如D:\project\company-portal。2.导入IDEA项目打开IDEA选择File - Open定位到解压目录下的company-portal文件夹注意不是外层那个zkoXbshDXy0nVX2AZ3N6-master-7742c3753432ec84bcf176151e6961344ee61a7eIDEA会自动识别为Maven项目。等待Maven下载所有依赖约5分钟取决于网速。3.配置MySQL启动MySQL服务用root账号登录执行admin1.sql脚本按3.1节的避坑指南操作。4.修改数据库配置打开src/main/resources/application.yml找到spring.datasource节点修改url、username、password为你本地MySQL的实际值。特别注意url末尾的serverTimezoneAsia/Shanghai这是解决时区错误的关键。5.启动项目右键CompanyPortalApplication.java选择Run CompanyPortalApplication.main()。控制台输出Started CompanyPortalApplication in X.XXX seconds即表示启动成功。6.访问验证浏览器打开http://localhost:8080看到企业门户首页打开http://localhost:8080/admin/login用admin/123456登录进入后台管理界面。常见问题排查提示如果启动时报错java.lang.ClassNotFoundException: javax.servlet.Filter说明你的JDK版本过高如JDK 11请卸载并安装JDK 8。注意如果访问http://localhost:8080显示404检查是否误将company-portal目录放在了src文件夹内正确路径应为D:\project\company-portal\src而非D:\project\src\company-portal。实操心得第一次启动时IDEA可能会提示“Maven home directory is not specified”点击Configure - Maven Settings选择你本地安装的Maven路径即可。别慌这是正常提示。4.2 Linux服务器部署CentOS 7.6生产环境部署核心是“自动化”和“可回滚”。我们采用最简方案JAR包 Nginx反向代理。前置准备- 服务器阿里云ECSCentOS 7.62核4G- 已安装JDK 8、MySQL 5.7、Nginx 1.18部署步骤1.打包JAR在IDEA中右键项目根目录 -Maven - clean package。等待BUILD SUCCESS生成的company-portal-1.0.jar位于target/目录下。2.上传JAR包用WinSCP或scp命令将target/company-portal-1.0.jar上传至服务器/opt/company-portal/目录。3.创建配置文件在服务器上创建/opt/company-portal/application-prod.yml内容为生产环境配置数据库地址改为内网IP关闭H2控制台开启Redisspring: profiles: active: prod datasource: url: jdbc:mysql://192.168.1.100:3306/company_portal?... # 其他配置同本地省略 redis: host: 192.168.1.101 port: 6379 password: your_redis_password编写启动脚本创建/opt/company-portal/start.sh#!/bin/bash nohup java -jar -Dspring.profiles.activeprod -Dfile.encodingUTF-8 company-portal-1.0.jar app.log 21 echo $! pid.txt赋予执行权限chmod x start.sh。5.启动服务执行./start.sh。用ps -ef | grep company-portal确认Java进程已运行。6.配置Nginx编辑/etc/nginx/conf.d/company-portal.confserver { listen 80; server_name www.yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /upload/ { alias /opt/company-portal/upload/; } }重启Nginxsystemctl restart nginx。7.域名解析与SSL在DNS服务商处将www.yourdomain.com解析到服务器公网IP。SSL证书用Let’s Encrypt免费申请Nginx配置HTTPS。关键经验提示生产环境务必关闭spring.devtools.restart.enabled否则热部署会消耗大量内存。注意/upload/目录是文件上传的根目录Nginx的alias指令必须精确指向它否则轮播图、附件无法显示。实操心得第一次部署后一定要用tail -f app.log实时查看日志。我曾遇到过因服务器时区为UTC导致create_time写入为1970年的问题就是靠日志里第一条记录的时间戳发现的。解决方案是在/etc/profile里加入export TZAsia/Shanghai然后source /etc/profile。5. 常见问题与排查技巧实录那些文档里不会写的“坑”5.1 数据库与连接池相关问题问题现象可能原因排查与解决启动时报错Cannot load JDBC driver class com.mysql.jdbc.DriverMySQL驱动版本不匹配pom.xml中mysql-connector-java版本应为8.0.28对应MySQL 8.0或5.1.49对应MySQL 5.7。检查mvn dependency:tree \| grep mysql确认实际引入的版本。后台操作缓慢druid监控页面显示连接数长期满载Druid连接池配置不合理或SQL未加索引进入http://localhost:8080/druid查看SQL监控页找出执行时间100ms的SQL用EXPLAIN分析其执行计划。常见原因是sys_news表的status字段未建索引添加ALTER TABLE sys_news ADD INDEX idx_status (status);即可。登录后首页轮播图显示为“图片不存在”文件上传路径配置错误或Nginx未代理/upload/检查application.yml中file.upload-path配置如upload/确认该目录在服务器上真实存在且Java进程有写入权限。同时检查Nginx配置中location /upload/的alias路径是否正确指向该目录的绝对路径。5.2 权限与Shiro相关问题问题现象可能原因排查与解决用admin登录后左侧菜单为空白sys_menu表中parent_id为0的顶级菜单缺失或sys_role_menu表中role_id1的记录为空在MySQL中执行SELECT * FROM sys_menu WHERE parent_id 0;确认有系统管理、内容管理等顶级菜单。再执行SELECT * FROM sys_role_menu WHERE role_id 1;确认有对应记录。若缺失重新执行admin1.sql。新增用户后无法登录提示“账号或密码错误”用户密码未加密或加密方式不一致检查UserController.add()方法中是否调用了passwordEncoder.encode(password)。确保PasswordEncoderBean是BCryptPasswordEncoder而非NoOpPasswordEncoder后者是明文存储极不安全。给角色分配了新闻管理权限但用户登录后仍看不到该菜单前端shiro:hasPermission标签未生效或后端RequiresPermissions注解位置错误查看浏览器开发者工具的Network标签确认/admin/menu/nav接口返回的JSON数据中是否包含了/admin/news路径的菜单。若返回数据正确则问题在前端Thymeleaf渲染若返回为空则检查Shiro的Realm类中doGetAuthorizationInfo()方法确认SimpleAuthorizationInfo.addStringPermission()是否正确添加了权限字符串。5.3 前端与文件上传问题问题现象可能原因排查与解决Summernote编辑器上传图片后图片不显示控制台报404图片上传路径与Nginx静态资源映射不一致Summernote默认将图片上传到/common/upload接口后端CommonController.upload()方法会将文件保存到file.upload-path指定的目录如upload/并返回相对路径/upload/xxx.jpg。Nginx必须配置location /upload/来代理该目录否则浏览器请求/upload/xxx.jpg时Nginx找不到静态文件返回404。BootstrapTable分页失效点击下一页数据不变后端分页参数未正确接收或PageHelper未生效检查NewsController.list()方法的参数是否包含RequestParam Integer offset和RequestParam Integer limit。确认pom.xml中已引入pagehelper-spring-boot-starter且application.yml中配置了pagehelper.helper-dialect: mysql。在Controller方法内用logger.debug(offset{}, limit{}, offset, limit)打印参数确认前端传参正确。响应式布局在手机端显示错乱侧边栏覆盖内容Bootstrap 4的栅格类未正确使用或CSS被覆盖检查HTML中是否遗漏了meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno。用浏览器开发者工具的Device Toolbar模拟手机尺寸检查元素的class属性确认col-12 col-md-8等类名是否生效。若样式异常检查是否有自定义CSS文件如main.css中写了float:left等破坏Bootstrap栅格的规则。5.4 生产环境独有问题问题现象可能原因排查与解决服务器重启后Java进程自动退出nohup启动脚本未正确守护进程使用systemd替代nohup。创建/etc/systemd/system/company-portal.service[Unit] DescriptionCompany Portal Service Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/opt/company-portal ExecStart/usr/bin/java -jar -Dspring.profiles.activeprod company-portal-1.0.jar Restartalways RestartSec10 [Install] WantedBymulti-user.target执行systemctl daemon-reload systemctl enable company-portal systemctl start company-portal。 || Redis连接超时后台“在线用户”显示为空 | Redis服务未启动或防火墙阻止连接 | 在服务器上执行redis-cli -h 192.168.1.101 -p 6379 ping若返回PONG则Redis正常。若超时检查Redis配置文件redis.conf中bind 127.0.0.1是否改为bind 0.0.0.0并确认firewall-cmd --permanent --add-port6379/tcp已执行并重载防火墙。 || 日志文件app.log无限增长占满磁盘 | Logback未配置日志滚动策略 | 修改src/main/resources/logback-spring.xml在appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender节点内添加rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy fileNamePatternlogs/app.%d{yyyy-MM-dd}.%i.log/fileNamePattern timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATP maxFileSize10MB/maxFileSize /timeBasedFileNamingAndTriggeringPolicy maxHistory30/maxHistory /rollingPolicy这将限制单个日志文件不超过10MB最多保留30天。 |6. 二次开发与功能扩展指南如何让它真正属于你这套源码的价值不仅在于“能用”更在于“好改”。我总结了三条最实用的扩展路径路径一快速定制前台UI适合设计师/前端新手所有前台页面都在src/main/resources/templates/front/目录下使用Thymeleaf语法。比如想把首页的蓝色主题换成绿色只需修改front/index.html中body标签的class属性从bg-blue改为bg-green再在static/css/front.css里添加.bg-green { background-color: #28a745; }。无需重启服务Thymeleaf的spring.thymeleaf.cachefalse配置让修改实时生效。这是比Vue单文件组件更轻量的定制方式。路径二无缝接入新业务模块适合Java开发者假设客户需要增加“招聘管理”模块。你只需三步1.建表在MySQL中执行CREATE TABLE sys_recruit (...)结构参照sys_news2.写代码复制NewsController、NewsService、NewsMapper三个文件重命名为RecruitController等修改其中的SQL语句和实体类名3.配权限在sys_menu表插入一条parent_id为招聘管理顶级菜单ID的新记录在sys_permission表插入recruit:list等权限字符串最后在后台“角色分配菜单”页面勾选。全程无需改动任何公共代码符合开闭原则。路径三对接企业微信/钉钉适合进阶集成系统已预留SysNotice通知表type字段支持扩展。要实现“新闻发布后自动推送到企业微信”只需- 在NewsService.publish()方法末尾添加调用企业微信API的代码用RestTemplate- 将企业微信的corpid、corpsecret、agentid配置到application.yml中- 在SysNotice表中增加send_status字段记录推送成功与否便于后续重试。这种“在现有骨架上嫁接”的方式远比从零开发一个通知系统高效。我个人在实际操作中发现这套源码最强大的地方是它把“企业级”的复杂性转化成了可触摸、可修改的实体。当你第一次成功为一个新客户上线官网看着他们用后台自己发布的第一条新闻那种成就感是任何教程都无法给予的。它不是一个终点而是一个扎实的起点——你站在这个起点上可以走得比想象中更远。本文还有配套的精品资源点击获取简介一套可直接部署运行的企业级门户系统源码包含完整的前台展示页面和后台管理模块。前台涵盖首页、关于我们、产品展示、新闻中心、联系我们等标准栏目响应式布局适配PC与移动端后台提供用户权限管理、角色分配、部门与菜单配置、轮播图及附件上传、文章与产品信息增删改查、在线用户监控、系统日志查看、服务器运行状态实时显示等功能。技术实现上后端基于Java 8采用SpringBoot 2.x框架集成MyBatis做数据访问Apache Shiro实现细粒度权限控制Thymeleaf渲染后台页面Druid作为数据库连接池支持Ehcache本地缓存与Redis分布式缓存日志统一通过SLF4J输出前端使用Bootstrap 4构建界面搭配jQuery操作DOM、jQuery Validation进行表单校验、Summernote富文本编辑器、BootstrapTable展示列表数据、Layer弹窗组件和jsTree实现树形菜单管理。数据库为MySQL 5.7附带admin1.sql初始化脚本开箱即用。配套有清晰的说明文档.txt适用于高校毕业设计、Java课程实训、中小企业官网快速搭建或二次开发参考。本文还有配套的精品资源点击获取