简介:一份面向Java学习者与企业级开发人员的OA系统完整资料包,聚焦企业办公自动化中的工作流、文档、任务分配等核心模块,帮助读者从代码到视频逐步掌握基于Java技术栈的团队协作系统实现方法。包内共4个文件,包含2个mp4讲解视频、1个源代码压缩包以及1个SQL数据库脚本,总大小约206MB,已有312人学习下载。视频部分针对系统架构、关键模块和数据库设计展开解析,源代码采用Spring Boot、Spring MVC、MyBatis/JPA等主流框架,SQL文件则完整呈现数据表结构、实体关系与示例数据,便于结合讲解边看边练。通过阅读源码和跟随视频调试,既可理解OA系统的工作流引擎、文档管理等功能设计,也能积累真实企业项目的构建技巧与排错思路,适合作为毕业设计参考或Java企业开发进阶练习。
1. 拿到一套Java OA系统源码,先想清楚它到底能给你什么
很多人在网上下载了一个基于java的企业办公OA系统的zip包,解压之后看到三样东西:源代码、讲解视频、数据库脚本,第一反应是双击运行,第二反应是看不懂。这套东西的真实价值不在“能跑”,而在于它把Java Web开发的完整链路压缩进了一个项目:从前端页面到Controller,从Service到MyBatis的Mapper,从数据库表设计到部署配置。你可以通过它一次性补齐java基础、SSM/Spring Boot分层、数据库连接池、权限设计和审批流这几块硬技能,正好也是java面试题里最高频的考点。它适合正在做课程设计的学生、想转Java开发的自学者,以及准备在公司内部搭一套小型办公系统的程序员。下面按拿到资源后的实际操作顺序,把目录结构、环境配置、核心代码和避坑方法一次讲完。
2. 从源码包结构看懂OA系统的骨架:目录、数据库脚本和视频怎么配合
2.1 源码目录结构:先认清一个典型的Java Web项目分层
解压之后,第一件事不是找启动类,而是先看顶层目录长什么样。常见的这类OA教学项目,结构上一般有两种:老一点的是SSM(Spring + Spring MVC + MyBatis)配Maven多模块,新一点的是Spring Boot单应用。无论哪种,核心分包逻辑是一致的。
oa-system/ ├── pom.xml # Maven 父工程,管理依赖版本 ├── sql/ # 数据库脚本目录 │ └── oa_system.sql # 建库建表 + 初始数据 ├── src/main/java/com/oa/ │ ├── controller/ # 接口层,接收前端请求 │ ├── service/ # 业务层,处理具体逻辑 │ │ └── impl/ # 业务实现类 │ ├── mapper/ # MyBatis 数据访问接口 │ ├── entity/ # 数据库表对应的实体类 │ ├── config/ # 配置类,拦截器、事务等 │ └── utils/ # 工具类,日期、Excel等 ├── src/main/resources/ │ ├── mapper/ # MyBatis 的 XML 文件 │ ├── application.yml # Spring Boot 配置(或 jdbc.properties) │ └── static/ # JS、CSS、图片 ├── src/main/webapp/ │ ├── WEB-INF/ │ │ └── views/ # JSP 或模板页面 │ └── static/ └── README.md # 作者写的启动说明,务必先读这个结构你只要看懂了,整个OA系统的运行路径就清楚了:浏览器发起请求,Controller接收,Service处理业务,Mapper操作数据库,最后把结果返回到视图层渲染。这个流程是Java Web开发的通用骨架,不只是OA系统,绝大多数企业级Java项目都长这样。
说到这里要提醒一点:查看源码时别先去读entity实体类,那个信息量太低。先读pom.xml,看它用了哪些依赖,能直接判断项目的技术栈和版本倾向。比如pom里有spring-boot-starter-web,说明是Spring Boot项目;有大量的org.springframework:spring-xxx坐标,就是SSM项目。然后顺着请求链路读代码,比从头到尾逐行扫要高效得多。
2.2 数据库脚本:OA系统表结构设计的五个核心模块
打开sql/oa_system.sql,这是整个项目的“黑匣子说明书”。OA系统的数据库设计几乎都有一个固定套路,核心就是围绕“人”和“事”展开。这是典型的几个模块:
| 模块 | 核心表 | 关键字段 | 说明 |
|---|---|---|---|
| 组织架构 | sys_dept、sys_user | dept_id、user_id、status | 部门与用户的从属关系 |
| 权限体系 | sys_role、sys_menu、sys_user_role | role_id、menu_id、perms | 用户、角色、菜单三者关联 |
| 审批流程 | oa_leave、oa_expense | apply_user_id、approve_status、audit_user_id | 状态字段决定流程走向 |
| 日常办公 | oa_notice、oa_mail | title、content、send_time | 公告与站内信 |
| 考勤管理 | oa_attendance | user_id、check_in_time、check_out_time | 上下班打卡记录 |
看数据库脚本的时候,有一个地方值得多看几眼:sys_menu表里的perms字段。这个字段在OA系统里相当关键,它表示某个按钮或菜单对应的权限标识,后端接口在做权限校验时,就是拿当前用户拥有的perms集合去比对请求需要的perms。很多java面试题里问“权限设计怎么做”,答案就在这张表里。
另外要注意脚本里的初始化数据。登录账号、默认密码、管理员角色都是在这里预置的。很多人跑不起来项目,是因为只导入了表结构,没有导入初始化数据,结果登录页输什么账号都提示“用户不存在”。所以导入时整个sql文件要完整执行,不能只执行建表语句。
2.3 讲解视频的正确打开顺序:不是从头看到尾,而是挑场景看
标题里带了讲解视频,这也是很多学习者买椟还珠的地方——视频一共几十集,从第一集开始慢慢刷,刷到第十集已经忘了前面讲了什么。我一般会建议按这个顺序看:先看“环境搭建和项目导入”这一集,它能帮你把项目跑起来;再看“数据库设计讲解”,把表关系理顺;然后是“核心功能演示”,知道系统有哪些功能;最后才是“源码讲解”,跟着作者的思路走代码。
视频里最值得看的部分,其实是“如何从零搭起这个项目”的那十几分钟。很多讲解视频的作者会把创建项目、引入依赖、配置文件的初始过程演示一遍,这一段对java基础薄弱的人帮助很大。至于后面那些逐行读代码的部分,完全可以倍速播放,或者只在某个功能看不懂时回头定位。视频是给你查漏补缺用的,不是让你从头看完才能动手的。
这里额外说一句:拿到任何源代码包,第一优先级永远是README或视频里的“运行说明”,第二是数据库脚本,第三才是源码。顺序反了,大概率会在环境配置上翻车。
3. 把项目跑起来:JDK、Maven、MySQL和配置文件的落地操作
3.1 环境准备:JDK版本、Maven仓库和数据库版本的匹配关系
很多这类Java OA系统下载包跑不起来,九成问题出在版本匹配上。常见的情况是:项目基于JDK 8写的,你装了JDK 17;项目用的MySQL 5.7驱动,你本地是MySQL 8.0;Maven仓库里缺依赖,idea下载半天失败。这些都属于环境问题,和项目本身无关。
先检查你的JDK版本。在命令行输入java -version看输出,如果显示1.8.0_xxx就是JDK 8。这个OA系统项目一般推荐JDK 8或11,太新的JDK反而可能因为移除了某些类导致启动报错。Maven方面,确认mvn -v命令能正常输出,Maven配置的镜像源最好改成国内镜像,否则从中央仓库拉依赖会慢到怀疑人生。MySQL建议装5.7或8.0,装好后在命令行能通过mysql -uroot -p登录即可。
Tomcat方面,SSM项目的war包需要独立Tomcat,Spring Boot项目则内置了Tomcat,不需要额外安装。从标题和资源形式来看,这类OA项目既有SSM也有Spring Boot版本,你解压后打开pom.xml看一眼即可确认。如果pom里出现了spring-boot-maven-plugin,就是Spring Boot,直接当普通Java应用启动就行。
3.2 导入数据库:命令行与可视化工具两条路走通
把数据库脚本完整导入是跑通项目的前提。这里给出两种方式的完整命令。
第一种方式,用MySQL命令行直接导入:
# 先登录MySQL mysql -u root -p # 登录后创建数据库,注意字符集要选utf8mb4 CREATE DATABASE oa_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 退出MySQL后,用命令行导入脚本 # 这里-o是输出,<符号表示将文件内容作为输入 mysql -u root -p oa_system < /你的路径/sql/oa_system.sql # 导入完成后,验证表是否齐全 mysql -u root -p -e "USE oa_system; SHOW TABLES;"参数说明:-u root指定用户名,-p表示需要输入密码,-e允许在命令行直接执行SQL语句而不进入交互模式。导入成功后能看到sys_user、sys_dept、oa_leave等表,说明脚本执行完整。
第二种方式是用Navicat:连接本地MySQL,右键“新建数据库”,名称填oa_system,字符集选utf8mb4,然后双击打开这个数据库,右键“运行SQL文件”,选择oa_system.sql,点开始。这种方式适合不熟悉命令行的初学者,但要注意Navicat导入大型SQL文件时可能会超时,如果遇到“Error 1153”,需要在“高级”里把超时时间改大。
数据库导入完成后,打开源码里的配置文件,把数据库连接信息改成你自己的。
3.3 修改配置文件:数据库连接、端口和文件上传路径
数据库连接信息是项目配置里最容易出错的地方。Spring Boot项目一般写在application.yml里,SSM项目则写在jdbc.properties里。下面以Spring Boot的application.yml为例:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/oa_system?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver servlet: multipart: max-file-size: 10MB max-request-size: 50MB mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.oa.entity configuration: map-underscore-to-camel-case: true这段配置里每一行都有讲究。url里的serverTimezone=Asia/Shanghai必须加,否则MySQL 8.0会报时区错误;useSSL=false是为了避免本地连接时出现SSL警告。driver-class-name如果用的MySQL 5.7,可以改成com.mysql.jdbc.Driver,8.0则必须用com.mysql.cj.jdbc.Driver。password填你自己数据库的密码,默认是root的话也要写,MySQL默认不会为空。
文件上传路径是另一个容易被忽略的配置项。OA系统里的头像上传、附件导入都会用到这个。如果配置里写的是D:/upload/,但你的机器上没有这个目录,运行时会报FileNotFoundException。解决办法是先手动建好这个目录,或者把路径改成项目内的./upload相对路径。
3.4 启动项目:IDE部署与命令行启动两条路线
Spring Boot项目启动比较简单,在IDEA里打开项目,等Maven把依赖下载完成,找到OaApplication.java这个类,右键运行主方法即可。如果Maven依赖下载失败,在IDEA的Terminal里先执行:
# 清理并重新下载依赖 mvn clean install -DskipTests-DskipTests表示跳过测试代码执行,避免因为测试类报错导致打包失败。clean会清除target目录下的旧产物,install会把项目打包并安装到本地仓库。执行完再右键运行,比直接点绿色三角按钮更稳。
SSM项目则多一步Tomcat部署。在IDEA里配置Tomcat:点击“Run”菜单,选择“Edit Configurations”,添加一个Tomcat Server,在Deployment选项卡里把这个项目挂上去,Application context填/oa。启动后访问http://localhost:8080/oa,能看到登录页说明部署成功。用命令行启动Tomcat的方式是,把项目打成war包,拷贝到Tomcat的webapps目录下,启动Tomcat脚本即可。但这种方式调试起来没有IDEA方便,不推荐新手用。
启动成功后看到的默认登录页,账号密码都在数据库的sys_user表里。用SELECT * FROM sys_user;查一眼就能看到管理员账号和密码,很多系统的默认密码是123456,如果表里存的是MD5加密后的值,可以直接去网上找一个MD5解密工具还原。
4. 读懂核心业务代码:登录、权限、审批流和考勤的实现路径
4.1 登录认证与会话管理:拦截器是怎么拦住未登录请求的
把项目跑起来之后,就该进入源码阅读环节了。OA系统里最核心的一条代码路径就是登录认证。几乎所有页面都要求先登录,这一效果是靠拦截器实现的。看代码时先找那个实现了HandlerInterceptor接口的类,或者继承了WebMvcConfigurer的配置类。
// 登录拦截器的核心逻辑,一般放在 interceptor/ 包下 public class LoginInterceptor implements HandlerInterceptor { // 在进入Controller之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 从session里取登录用户,key一般在loginController里定义 Object user = request.getSession().getAttribute("loginUser"); if (user == null) { // 未登录,跳转到登录页,return false表示请求被拦截 response.sendRedirect(request.getContextPath() + "/login.html"); return false; } // 已登录,放行 return true; } }这段代码的逻辑很直接:session里没有用户就重定向到登录页。要注意的是request.getSession()方法,如果session不存在,getSession(false)返回null,但直接getSession()会自动创建新session,在拦截器里如果用getSession(false)会更严谨。改造方法就是把第一行改成HttpSession session = request.getSession(false);,再判空。
了解了拦截器,再回看登录Controller里的业务逻辑。登录成功后做了三件事:把用户对象放进session、查询用户对应的权限集合、跳转系统首页。很多人只会写最基础的查询用户并比对密码,却忽略了“登录后加载权限”这一步。而OA系统的权限控制,恰恰依赖这一步。
4.2 权限控制:从用户表到菜单表的权限分配逻辑
OA系统的权限设计,一般是一张“用户-角色-菜单”的经典RBAC模型。跑起来之后,用管理员账号登录系统,在“角色管理”里能看到内置的角色,比如“总经理”“部门经理”“普通员工”,每个角色勾选的菜单不同,登录后看到的侧边栏就不同。这套逻辑落到代码上,关键在菜单查询语句。
-- 根据用户ID查询其有权限访问的菜单列表 -- 思路:user -> user_role -> role -> role_menu -> menu SELECT DISTINCT m.menu_id, m.menu_name, m.url, m.icon, m.parent_id, m.perms FROM sys_user u INNER JOIN sys_user_role ur ON u.user_id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.role_id INNER JOIN sys_role_menu rm ON r.role_id = rm.role_id INNER JOIN sys_menu m ON rm.menu_id = m.menu_id WHERE u.user_id = #{userId} AND m.status = '0' ORDER BY m.parent_id, m.order_num这条SQL是这个系统权限体系的核心,记住它的实现思路,面试时被问到权限设计可以直接照搬。DISTINCT是为了去重,因为一个用户可能挂多个角色,不同角色分配了相同菜单时会重复。m.status = '0'表示只查启用状态的菜单。查询结果会转成菜单树,前端根据这个树渲染侧边栏。
后端接口层面的权限校验,用的是@RequiresPermissions("oa:leave:audit")这种注解。这个注解里的字符串值,就是sys_menu表里的perms字段。用户点击审批按钮时,权限框架会拦截请求,比对当前用户的perms集合里是否有这个权限标识。理解了这一环,你就能看懂整个系统里哪些接口是普通用户能调的,哪些只有管理员能调。
4.3 审批流:OA中最容易出问题的状态机设计
审批流是OA系统区别于普通CRUD系统的重要标志,也是代码里最值得深读的部分。拿请假审批举例,一条请假记录从提交到结束,状态变化序列大概是:待部门经理审批 -> 待总经理审批 -> 通过/驳回。这个状态流转在数据库里就是一个approve_status字段,在代码里是一套if-else逻辑。
// 审批逻辑的简化版,实际项目比这个分支多 public boolean auditLeave(LeaveVO vo, String currentUserId) { // 1.查出当前请假记录 LeaveApply apply = leaveMapper.selectById(vo.getApplyId()); if (apply == null) { throw new BusinessException("请假记录不存在"); } // 2.判断当前操作人是否有审批权 boolean canAudit = checkPermission(apply.getCurrentAuditUserId(), currentUserId); if (!canAudit) { throw new BusinessException("您不是当前审批人"); } // 3.根据操作类型更新状态: 1-同意 2-驳回 if (vo.getOperateType() == 1) { // 此处判断是否需要下一级审批 if (apply.getAuditLevel() == 1) { apply.setApproveStatus(2); // 待总经理审批 apply.setCurrentAuditUserId(apply.getNextAuditUserId()); } else { apply.setApproveStatus(3); // 审批通过 apply.setAuditCompleteTime(new Date()); } } else { apply.setApproveStatus(4); // 驳回 apply.setAuditCompleteTime(new Date()); } return leaveMapper.updateById(apply) > 0; }这段逻辑看着简单,实际运行中的坑在“审批人判断”上。很多系统的漏洞是:一个部门经理直接改了前端参数,把applyId换成自己权限范围之外的记录,就能越权审批。所以第二步的checkPermission必须做两层校验:第一层查这条记录当前待审批人是不是操作人,第二层查操作人角色是否有审批权限。只做第一层,管理员就能审批所有部门的单子。
状态机的另一处坑是并发。两个审批人同时打开同一条待审批记录,一个点了同意,一个点了驳回,后提交的会覆盖先提交的结果。解决思路是在updateById时加上乐观锁条件,SQL里多一个AND approve_status = #{oldStatus},再判断update返回的行数,如果是0说明状态已变更,提示“该单据已被其他人处理”。
4.4 数据库连接池与事务:MyBatis的配置细节
阅读这个OA项目的源码,你会发现很多和数据库连接池相关的配置藏在application.yml里。前面提到过datasource节点,Spring Boot默认用的是HikariCP连接池。连接池的核心参数有四个:maximum-pool-size最大连接数、minimum-idle最小空闲连接数、connection-timeout获取连接超时时间、idle-timeout空闲超时时间。OA系统这类内部管理系统,并发量不高,最大连接数设20左右足够,设太大反而浪费数据库资源。
事务方面,项目中凡是涉及多表更新的Service方法,都建议加上@Transactional注解。比如提交请假申请时,要同时插入请假记录表、更新审批人表、记录操作日志,三张表必须同时成功或同时失败。没加事务时,如果插入请假记录成功但日志写入失败,整条数据就不完整,排错时特别费劲。加上注解还不够,要理解@Transactional的默认回滚规则:只回滚RuntimeException和Error,检查异常不会触发回滚。如果你的业务代码里把异常catch住了,事务同样不会生效,这是新手最容易踩的暗坑。
5. OA系统部署避坑指南:新手最容易踩的5个坑与排查思路
5.1 坑一:数据库连接报错 Access denied for user
现象:启动项目后,控制台输出Access denied for user 'root'@'localhost',项目直接启动失败。
原因:配置文件的数据库用户名或密码和你本机MySQL不一致。最常见的情况是:项目里默认密码是123456,你本机MySQL密码是root。
解决:先打开配置文件,确认username和password。然后用本机命令行mysql -u root -p输入对应密码测试能不能登录成功。如果命令行能登录但项目配置还是报错,检查一下配置文件里是不是有空格,password: root这种末尾多了一个空格会让密码变成“root+空格”,直接导致认证失败。这个坑很隐蔽,排查了半个小时才发现是手滑打的空格。
5.2 坑二:JDK版本太新,Tomcat启动失败或报ClassNotFoundException
现象:Spring Boot项目能编译,但启动时提示Unable to instantiate ServletSupport或NoClassDefFoundError;SSM项目的war包部署到Tomcat后,页面一直500。
原因:很多OA教学项目是基于JDK 8开发的,而新机器装的是JDK 17或21,部分依赖在新JDK下已经不兼容。
解决:安装JDK 8并切换默认版本。在IDEA里打开Project Structure,把Project SDK改为1.8,并在Settings里把Maven的ImporterJDK也改为1.8。命令行输入java -version确认版本变为1.8.0_xxx后,再重新运行。如果你是SSM项目用了Tomcat,检查Tomcat版本,JDK 8配Tomcat 8或9比较稳妥,Tomcat 10及以上把javax.servlet改成了jakarta.servlet,老项目直接部署会报找不到包。
5.3 坑三:Maven依赖下载失败或下载慢
现象:导入项目后IDEA一直在转圈,pom文件报红,Maven库里的lastUpdated文件一堆。
原因:默认走的Maven中央仓库,国内访问速度慢,而且某些依赖版本较老,中央仓库偶尔会连接超时。
解决:修改本地Maven的settings.xml,把mirror换成阿里云镜像:
<mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>然后在IDEA里打开Settings -> Maven -> Runner,在VM Options里填-DarchetypeCatalog=internal,避免创建项目时远程拉取模板。改完镜像,执行mvn clean install -U强制更新快照依赖,基本能解决下载问题。顺便说一句,-U参数表示强制刷新远程仓库的SNAPSHOT版本,不是每次都要加,只在依赖异常时用。
5.4 坑四:登录成功后,页面报错“系统异常,请稍后重试”
现象:账号密码输入正确,前端跳转首页,然后弹出一个笼统的“系统异常”,打开控制台F12能看到某个请求返回500。
原因:这类OA系统的首页一般会展示待办审批数量、本周考勤统计、最近公告,这些数据接口查的表里有脏数据或字段不存在,导致MyBatis查询异常被全局异常处理器捕获后返回了通用错误信息。
解决:打开浏览器开发者工具,切到Network面板,找到那个标红的请求,点开看Response里的具体异常信息。一般能在日志里看到SQL Exception: Unknown column 'xxx' in 'field list',说明数据库脚本没有执行完整,a表里的字段没建出来。这时回到Navicat,重新导入完整的sql脚本。另一种常见情况是首页查了考勤表,而考勤表里没有任何数据时某些聚合函数返回null,这是代码里没做null判断导致的,需要给对应的Service方法加一个默认值兜底。
5.5 坑五:数据库时间差8小时,考勤打卡和审批时间全部错乱
现象:系统里提交的请假单开始时间比实际时间少了8小时,或者考勤记录显示凌晨打卡。
原因:JDBC连接串里没加serverTimezone=Asia/Shanghai,MySQL数据库用的是UTC时区,Java程序和数据库各存各的时间,连接时没协商一致。
解决:在数据库连接URL末尾追加serverTimezone=Asia/Shanghai。如果你用的是MySQL 8.0,还需要确认驱动是com.mysql.cj.jdbc.Driver。改完配置重启项目,把已有的脏数据手动修正过来,后续新增数据就正常了。这个坑几乎每个跑Java OA系统的人都会遇到一次,属于时区问题里的经典案例,在java面试题里也常被当作细节考点拿出来问。
6. 学完这套OA系统之后:把课程设计升级成简历项目的4个验证动作
项目跑通、代码读透只是第一步。如果这个项目要写进简历,或者在面试时拿来当项目经验讲,还需要做额外的验证和加固。我一般会建议做四个动作:
第一个动作是给核心权限接口补单元测试。用Spring Boot的@SpringBootTest写几个测试用例,模拟不同角色访问同一个接口,验证越权请求是否被拦截。面试官问“你这个项目权限怎么保证的”,你直接把测试用例的断言逻辑讲给他听,比背一万次RBAC模型都有说服力。
第二个动作是验证审批流的并发场景。开两个浏览器,用两个不同账号同时打开同一条待审批记录,A账号先提交同意,B账号再提交驳回,观察最终状态是不是被B覆盖。如果被覆盖,说明缺少乐观锁保护,你自己动手加上version字段或状态条件更新。这个优化写进简历里,是“解决并发下审批状态覆盖问题”的真实案例。
第三个动作是检查系统日志打印。很多教学项目把日志框架配得乱七八糟,控制台一屏error却不知道错在哪。把logback-spring.xml配置好,至少做到SQL日志和业务日志分离,排查问题时能少熬夜两小时。
第四个动作是做一个数据库备份脚本。OA系统跑起来之后,数据会越来越多,没有任何备份机制是隐患。写一个简单的mysqldump脚本,每天凌晨自动备份一次,这也是在真实运维环境里一定要做、但很多课程设计项目完全不会教的部分。写完这个脚本,你对数据库运维的认识会明显比同龄人强一截。
做完这四个动作,这套OA系统就不再是网上下载的作业,而是真正属于你自己的项目了。面试时被问到设计思路、异常场景和优化方向,你能从真实调试过的经历里找答案,而不是背别人写好的答案。做项目的过程中记住一个习惯:每次踩坑都顺手记下当时的报错信息、排查路径和最终解决办法。这个笔记在面试前翻一遍,比临时刷java面试八股文管用得多。希望这些经验和细节对你跑通这套OA系统有帮助。
本文还有配套的精品资源,点击获取