简介:基于Java的销售评价系统是一份面向高校学生、毕业设计与课程设计等场景的较为完整的项目资源。系统覆盖销售评价管理的核心功能,可用于学习Java编程、系统分层设计、数据库结构设计以及软件部署全流程。压缩包内共389个文件,大小约53.74MB,主要包含java源码、class编译文件、xml配置、js与html前端页面、css样式、mp4演示与部署视频、png图片及数据库文档等,文档与视频配合源码便于对照学习。目前已有34人浏览学习。资源内含演示视频、部署视频和数据库设计文档,帮助理解系统运行效果与后端表结构;源码目录完整,可参考控制器、实体类与业务逻辑的写法,适合在毕业设计或课程设计中快速搭建同类评价系统。整体上是一份内容详实、即下即用的Java Web学习资料。
1. 一套Java销售评价系统到底在解决什么问题
销售团队月度考核,很多公司还在用 Excel 打分表:主管凭印象打分、指标口径不统一、月底汇总靠加班,员工质疑分数时还拿不出依据。基于 Java 的销售评价系统,就是把这件事变成一套可配置的线上流程——管理员定义考核指标与权重,主管按订单、回款、客户满意度逐项打分,系统自动汇总排名,每一步操作留痕。项目采用 Java 生态最主流的一组组合:Spring Boot + MyBatis/MyBatis-Plus + MySQL,配套资料里有演示视频、部署视频、数据库文档和部署源码。适合两类人:手里有源码但一直没跑起来的初学者,以及想拿它当底座、快速改成企业内部销售考核工具的 Java 工程师。
2. 销售评价系统的技术选型:为什么是 Java + Spring Boot + MySQL
2.1 业务模块拆解:评价对象、评分维度与流程状态
销售评价系统表面上是“打分”,但落到工程上,它是一整套流程。如果拿到源码急着跑起来,不先把业务模型看清楚,后面改需求或者排查数据问题,会相当被动。
先看评价对象。多数销售评价系统要管三个层级:销售个人、销售小组、区域门店。层级不同,关注指标就不同——个人看业绩完成率和回款率,小组看团队达成率和人效,门店看坪效和客诉率。所以在建表时,“评价对象类型”必须是独立字段,不能写死在业务代码里。我见过把对象类型拼进指标名的写法,结果指标一多,SQL 里全是模糊匹配,改起来非常痛苦。
再看评分维度。典型维度有销售额完成率、回款及时率、新客户开发数、客户满意度、客诉处理及时率。这里的关键设计是:指标和权重必须可配置。考核周期一变,重点就会从“冲量”变成“要利润”,指标写死就只能改代码重新发版。配置化的做法是指标存表、权重在评价任务里维护,打分时动态加载。
最后是流程状态。完整流程一般是:管理员创建评价任务并设置指标权重 → 系统分发给对应主管 → 主管逐项打分 → 提交给经理审核 → 审核通过后发布 → 员工查看结果并发起申诉。流程不复杂,但每个环节都要有状态字段和操作日志。不少简易 demo 只做打分和汇总,没有审核和申诉,直接用到企业里会撑不住——分数一旦有争议,没有日志就查无可查。
还有一个容易被忽略的点:评价周期。系统里要区分月度、季度、年度考核,评价主表里的 period 字段要设计成字符串而不是日期类型,比如“2025-Q1”。因为日期类型在跨年跨季度统计时,边界条件特别容易出错,字符串加统一格式反而好维护。
2.2 技术栈选型:单体够用,别上来就微服务
对应标题里的 Java,这套系统最常见、最可靠的技术组合是 Spring Boot + MyBatis/MyBatis-Plus + MySQL,前端用 Thymeleaf 服务端渲染或 Vue 前后端分离都有,后端差异不大。
先说为什么选 Spring Boot。它解决了 Java 项目最烦的配置问题,内嵌 Tomcat,Maven 打成 jar 后一条命令就能启动,不用单独装容器,对部署场景非常友好。Spring Boot 的自动配置加上约定优于配置,让一个小团队也能快速迭代。
ORM 我推荐 MyBatis 而不是 JPA。评价系统天生带一堆统计报表,比如“每个销售最近三个月的平均分趋势”“各小组指标得分明细”,这类查询用 SQL 写汇总最直接。MyBatis 能把 SQL 完全掌握在手里,JPA 的对象导航在这种场景下反而不直观。MyBatis-Plus 是加分项,把单表 CRUD 和分页样板代码省掉了,核心统计 SQL 还是自己写。
数据库用 MySQL,理由很简单:免费、易部署、资料多。评价系统的数据量级,单表百万条以内完全没问题,配合索引和合理的 SQL,性能不用担心。字符集一定要 utf8mb4,否则遇到生僻字或 Emoji 就乱码。
有人会问:要不要上微服务?多数时候不用。这套系统的典型规模是公司内部几百到几千人,一天产生的评价数据可能就几千条,单体没有任何瓶颈。拆微服务意味着引入注册中心、配置中心、网关,部署运维成本成倍上升,收益几乎为零。单体加合理分层——controller / service / mapper——足够用到系统被替换那天。
前端选型上,服务端渲染版本部署最简单,一个 jar 全包;前后端分离版本要先 npm install 再 build,还要配 Nginx 端口转发和静态文件路径。如果只求快速跑通,优先选服务端渲染;如果打算长期二次开发且有前端基础,再考虑前后端分离。技术选型要跟着团队能力走,不必迷信前后端分离。
顺带提醒一点:这类资源包里的源码大概率是学生项目或内部系统的脱产版本,代码质量参差不齐,但结构通常是完整的。跑通是第一目标,别在跑通前纠结代码风格。等系统跑起来,再按你自己团队的规范去重构不迟。
2.3 配套资源的正确打开方式:演示视频、部署视频、数据库文档
标题里的资源包里有演示视频、部署视频、数据库文档和部署源码,四样东西有使用顺序,不要拿到手就解压源码去读。
我的习惯是先看演示视频。它会过一遍界面流程,你要注意功能边界:有没有权限管理?指标是配置还是写死?有没有审核环节?能不能导出报表?这些信息帮你判断系统复杂度。比如演示视频里出现“申诉”页面,数据库里大概率有一张申诉表,后面在文档里找它就行。
再看部署视频。部署视频一般是录屏指导,缺点是版本可能过时。比如视频里用 JDK 8 和 MySQL 5.7,你机器上是 JDK 17 和 MySQL 8,这时以视频为流程参考、以自己机器版本为准。JDK 8 或 11、MySQL 8.0 是目前兼容性最好的组合,建议按这个来。
然后翻数据库文档。数据库文档一般有 ER 图和字段说明,这是最值钱的部分。先找三样东西:初始化 SQL 脚本、建表语句、基础数据账号。ER 图告诉你表怎么关联,字段说明告诉你每个数字的含义。
最后才看源码。源码不是逐行读,而是用来回答文档里没说清的问题。比如某个字段取 0 还是 1 代表通过,看枚举类就知道了。
这个顺序的核心理由是:先知道系统能干什么,再知道怎么跑起来,然后知道数据怎么存,最后深入代码。反过来,一上来扎进源码,很容易在细节里迷路。
3. 数据库设计:评价系统的六张核心表与字段边界
数据库是整个系统最值得先啃的部分。销售评价系统的表不多,但每张表的含义要搞清,二次开发时改字段才不出错。按“能跑通一套完整评价流程”的最小集合来算,常见的就是这六张表,先记一个整体印象。
| 表 | 作用 | 关键字段 |
|---|---|---|
| sys_user | 用户表 | user_id, username, password, dept_id |
| sys_role / sys_user_role | 角色与关联 | role_id, role_code, user_id |
| evl_indicator | 指标配置表 | indicator_id, name, type, sort_order |
| evl_evaluation | 评价主表(任务) | evaluation_id, period, status |
| evl_evaluation_detail | 评分明细表 | detail_id, target_user_id, score, comment |
| evl_score_summary | 得分汇总表 | target_user_id, total_score, rank |
以我接触过的几个销售评价系统来看,表名可能不同,但关系模型基本一致。你拿到手的数据库文档如果表名不一样,把字段对上就能理解,不用死记表名。
3.1 用户、角色与权限:评价资格怎么控制
第一类是用户与权限相关:用户表、角色表、用户角色关联表。很多简易系统只用一张用户表加 type 字段,但真实环境会遇到问题——一个人同时是销售和主管,单字段表达不了多角色。
用户表核心字段:user_id、username、password(密文)、real_name、dept_id、status。password 必须存加密密文,明文是红线。status 用来禁用离职员工账号,而不是删记录,因为评价历史要跟着人走,删了记录历史就断了。
角色表不用复杂,一个角色一条记录:ADMIN、MANAGER、SUPERVISOR、SALESPERSON。用户角色关联表就是 userId + roleId 两列。
这里要提醒:评价系统的“数据权限”比“功能权限”更关键。功能权限决定能不能点某个菜单,数据权限决定能看到哪些人的分数——主管只能看自己团队,经理能看整个大区。数据权限一般用 dept_id 过滤,这也是用户表里单独留 dept_id 的原因。
功能权限可以用 Shiro 或 Spring Security,但如果只是跑通这套源码,用拦截器按角色判断也够。关键是别把角色判断散落在每个方法里,要集中在一个拦截器或切面,否则以后加一个角色要改几十个地方。
3.2 评价主表、评价明细与指标配置表
第二类是评价业务表:指标配置表、评价主表、评价明细表、得分汇总表。
指标配置表是系统的“字典”。字段大致是 indicator_id、indicator_name、indicator_type、unit、sort_order、status。indicator_type 区分定量和定性指标:定量指标如销售额完成率,系统自动从订单表算;定性指标如服务态度,需要主管手工打分。权重不放在指标表里,而是放在评价任务里,因为同一指标在不同周期权重可能不同。
评价主表代表“一次评价任务”。字段有 evaluation_id、task_name、period、status、create_by、create_time。status 是状态机:0 草稿、1 进行中、2 待审核、3 已发布、4 已关闭。period 用字符串存,比如 2025-Q1,跨季度统计时避免日期边界问题。
评价明细表是打分记录。字段有 detail_id、evaluation_id、target_user_id、indicator_id、score、comment、evaluator_id、audit_status。核心设计是一个评分项一条记录,而不是把多个分数塞进一个字段。一个指标一个分,统计时按 indicator_id 分组,塞进一个字段后续 SQL 极难写。
得分汇总表存每个员工在一个评价周期内的总分和排名。严格说可以实时算,但实践中都要落表,因为月末要导出报表,实时计算在数据量大时拖慢页面。
还有一个设计细节:表之间通常不用物理外键,只在代码层维护逻辑关联。原因是评价系统将来做导出、做数据清洗时,物理外键会变成绊脚石。比如要临时改一条错误评分,有外键就得先处理关联记录。逻辑外键加索引,性能和外键差不多,但灵活得多。
评价明细的查询是这套系统最常用的 SQL,先写一个基础版本:
-- 查询某次评价任务中每个员工的指标得分明细 SELECT d.target_user_id, i.indicator_name, d.score, d.comment FROM evl_evaluation_detail d LEFT JOIN evl_indicator i ON d.indicator_id = i.indicator_id WHERE d.evaluation_id = 1 ORDER BY d.target_user_id, i.sort_order;这里用 LEFT JOIN 而不是 JOIN,是为了保留打分记录即使指标已被删除;排序用指标的 sort_order,保证报表顺序跟配置一致。这只是明细查询,如果要算总分,还需要按 target_user_id 做 GROUP BY。
3.3 初始化SQL的导入顺序与常见报错
数据库文档一般带一份 init.sql 或 create.sql。导入顺序有讲究,直接全选执行大概率报外键错误。
正确顺序:先建用户表、角色表、指标表这些无外键依赖的基础表,再建评价主表,最后建明细表和汇总表。如果 SQL 已带 CREATE DATABASE,用 Navicat 或命令行整体执行也行。MySQL 外键约束在多表导入时敏感,建议在头部加 SET FOREIGN_KEY_CHECKS = 0; 导入完再恢复。
常见报错有两种。一种是 Unknown collation: utf8mb4_0900_ai_ci,原因是 SQL 从 MySQL 8 导出,排序规则在 5.7 里不认。解决:把 utf8mb4_0900_ai_ci 替换成 utf8mb4_general_ci,或直接用 MySQL 8 导入。
另一种是 Data too long for column,通常是基础数据里某字段超长,常见于 varchar 定义太紧。把对应字段放宽到 255 或 text 即可,只要不是主键字段,放宽风险不大。
导入完成后先验证:
-- 确认基础数据已到位 SELECT COUNT(*) AS user_cnt FROM sys_user; SELECT COUNT(*) AS indicator_cnt FROM evl_indicator;两条查询分开跑。用户表能查到管理员账号、指标表有数据,说明数据到位。如果没有,说明导入顺序有问题或脚本只建表没插数据,回头找 data.sql。
如果导入时遇到“无法连接数据库”,先不要怀疑 SQL,检查 MySQL 服务是否启动、账号能不能登录、远程访问权限是否打开。数据库报错的第一原则是看错误码,比如 1045 是密码错,2003 是连不上服务,对症处理比瞎试快得多。
4. 从源码到本地跑通:环境搭建与最小启动命令
这一章给手里有源码但一直没跑起来的人。先说明一个判断标准:源码能正常编译,跑通只是时间问题;遇到报错不要怀疑“是源码有问题”,绝大多数情况是环境差异。
4.1 环境准备:JDK 版本、Maven 仓库与 MySQL 8
本地环境按这套来:JDK 1.8 或 11、Maven 3.6 以上、MySQL 8.0、IDEA。如果源码是旧项目,JDK 8 最稳;如果 Spring Boot 2.7 以上,JDK 11 也可以。先看项目根目录的 pom.xml,里面声明了 Java 版本,以它为准,不要强行用最新 JDK。
Maven 有两个坑。第一,默认中央仓库下载依赖很慢,建议在 settings.xml 配阿里云镜像。第二,不要把 IDEA 自带 Maven 和命令行 Maven 混用,版本不一致可能导致依赖解析结果不同。在 conf/settings.xml 里加镜像配置,所有项目都能用。
MySQL 安装好后,把 root 密码和环境变量配好。建议创建专用数据库用户,但本地跑通先用 root 也没问题,正式环境再收权限。
提示:确认 pom.xml 里的 Spring Boot 版本,再决定 JDK。Spring Boot 2.x 用 JDK 8 或 11 都没问题,Spring Boot 3.x 必须 JDK 17 起步。选错版本,启动阶段就会报 UnsupportedClassVersionError。
安装 Maven 后,命令行执行 mvn -v 能输出版本信息,说明 Maven 可用。IDEA 里打开项目后,要确认两件事:Project Structure 里的 Project SDK 选对 JDK,Maven 面板里 Runner 的 JRE 也选同一版本。这两个地方不一致,会导致 IDE 里跑和命令行跑结果不同,是新手最容易翻车的位置。
数据库的 root 密码设置要注意:MySQL 8 的默认认证插件是 caching_sha2_password,老项目用的 MySQL 驱动如果版本太旧可能连不上,报 Authentication plugin 错误。解决办法是换新驱动,或者在 MySQL 里把用户认证方式改回 mysql_native_password。本地跑通阶段,驱动版本跟着 pom.xml 走,一般不用动;如果是自己新建连接,选 8.0.33 以上版本。
4.2 配置文件必改的五个参数
源码跑不起来,九成问题出在配置文件。Spring Boot 项目核心配置在 src/main/resources/application.yml(或 .properties)。拿到评价系统源码,我必改五个地方:
第一是数据源,包括 url、username、password。url 里的库名要和初始化 SQL 建的库名一致。第二是端口,默认 8080,被占用就换 8081。第三是文件上传路径,评价系统如果支持上传截图附件,配置里会有 upload.path,改成绝对路径。第四是日志级别,排查前把 root 从 info 改成 debug,跑通后改回。第五是连接池和时区参数。
application.yml 数据源片段:
spring: datasource: url: jdbc:mysql://localhost:3306/sales_evaluation?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: "root123" driver-class-name: com.mysql.cj.jdbc.Driver servlet: multipart: max-file-size: 10MB max-request-size: 20MB server: port: 8080这里的要点:serverTimezone 必须写,MySQL 8 驱动对时区敏感,不写启动时会报 CST 时区错误;characterEncoding 用 utf8,配合数据库的 utf8mb4 才能避免乱码;driver-class-name 在 MySQL 8 下是 com.mysql.cj.jdbc.Driver,中间多了 cj,写旧的 com.mysql.jdbc.Driver 会在启动时报错。
另外,如果源码里同时存在 application.yml 和 application-prod.yml、application-dev.yml 这样的文件,Spring Boot 默认加载的是 application.yml 主配置,profile 指定的环境由 spring.profiles.active 决定。跑本地就用 dev 或默认,部署时再切 prod。改配置前先确认当前激活的是哪个 profile,改错文件会白忙一场。
改完先执行 Maven 命令编译一次,把依赖下载完整:
mvn clean package -DskipTests这个命令清理旧的编译产物,跳过测试,直接打包。第一次执行较久,因为要下载依赖。看到 BUILD SUCCESS 说明编译没问题。这个阶段报错,先查 Maven 镜像和 JDK 版本,不要急着看业务代码。
4.3 用一条完整流程验证系统可用
编译通过不代表功能可用,要拿一条真实业务链路验证。我一般用这条:管理员登录 → 创建评价任务 → 配置指标权重 → 主管打分 → 提交审核 → 经理审核发布 → 查看排名。
前后端分离的源码,前端要先启动;服务端渲染,直接启动后端,访问 http://localhost:8080 看到登录页。管理员账号一般在数据库文档里写明,没写就在初始化 SQL 里找 sys_user 中 role 为 ADMIN 的记录,默认密码通常是 123456 或 admin。
启动后端:
java -jar target/sales-evaluation-0.0.1-SNAPSHOT.jar看到 Tomcat started on port(s): 8080 说明启动成功。启动失败优先看控制台第一行异常——Spring Boot 启动失败九成是数据源连不上,错误信息会写 Access denied 还是 Communications link failure。前者账号密码错,后者 MySQL 没启动或端口不对。
如果是前后端分离,前端目录有 package.json,启动命令基本是 npm install 然后 npm run dev。注意前端配置文件里的后端地址,一般在 src/utils/request.js 或 .env.development 里配置 baseURL,必须指向后端实际端口,否则页面能打开但接口全报 404。
验证的意义:别只看登录页能打开就说跑通。真正要验证的是“打分后汇总的数字对不对”。拿两个测试账号,一个主管一个销售,走一遍流程,然后用 SQL 核对最终分数。这一步确认了,系统里的报表和导出功能才值得信任。
跑通流程后,顺手把日志级别调回 info,避免 debug 日志刷屏。同时把 application.yml 里自己改过的密码、路径记录到本地笔记里,部署到服务器时要再改一遍,有记录能省很多事。
5. 部署避坑清单:从打包到上线的五个常见问题
部署阶段集中在三种环境问题:构建、数据库、运行。下面五条按现象写到处理,实际部署时可以直接对照。
提示:下面每条都可以独立排查,按“现象 → 原因 → 解决”的顺序看。如果多个现象同时出现,优先处理数据库阶段的报错,因为后续报错往往是它引发的。
5.1 构建阶段:乱码与依赖拉取失败
现象一:Maven 打包时控制台中文全乱码,但英文正常。原因是 Maven 在 Windows 下用 GBK 编码读源码,而源码是 UTF-8 保存。解决:在 pom.xml 的 properties 节点里统一编码。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>这行配置加到 properties 里后,全队统一编码,不会因为某个人忘记加参数而复现乱码。如果项目里还有其他模块,最好在每个模块的 pom 里都加上,避免子模块继承时漏掉。
现象二:依赖下载报 Could not transfer artifact,原因是中央仓库网络不稳定。解决:在 settings.xml 里配阿里云镜像,然后删掉本地仓库 .m2 目录下的 .lastUpdated 残留文件,重新构建,否则 Maven 会一直读失败缓存。判断标准是 mvn clean package 能连续两次成功,依赖环境才算真正稳定,没有这个缓存残留,后面打包就不会再卡住。
5.2 数据库阶段:时区、字符集与连接池
现象三:项目启动报 The server time zone value is unrecognized。原因是 MySQL 8 的驱动对服务端时区敏感,而 MySQL 默认时区信息没被客户端识别。解决:JDBC url 加 serverTimezone=Asia/Shanghai,同时在 MySQL 里执行 SET GLOBAL time_zone = '+8:00'; 两条都做最稳。如果只是改了 url 还报错,多半是服务端时区没生效,两条一起改能一次排除两个变量。
现象四:页面数据全是问号或乱码。三个排查点:数据库表字符集不是 utf8mb4、JDBC url 没加 characterEncoding=utf8、页面编码不是 UTF-8。先查表:
-- 查看评价明细表的建表语句和字符集 SHOW CREATE TABLE evl_evaluation_detail;看到 DEFAULT CHARSET 是 latin1 或 gbk,需要把表转成 utf8mb4。执行 ALTER TABLE 可以转,但转之前要备份,并且选对转换方向,避免中文数据损坏。注意,只改表字符集还不够,字段级别的字符集也要一起看,SHOW CREATE TABLE 输出里会列出每个字段的 charset,确认字段也变成了 utf8mb4 才算结束。
还有一个和字符集无关、但同样导致查询变慢的现象:连接池打满。解决方式是连接池别开太大,初始化 5、最大 20 足够。连接数打满先跑 SHOW PROCESSLIST 看当前连接:
-- 列出当前所有 MySQL 连接,排查慢查询和 Sleep 连接 SHOW PROCESSLIST;找到长时间处于 Sleep 状态或慢查询的连接,顺着查对应接口。评价系统的连接池开太大反而会掩盖慢 SQL 问题,调小之后慢查询会更容易暴露。
5.3 运行阶段:端口占用、静态资源404与定时任务不执行
现象五:启动提示 Port 8080 was already in use。原因是端口被其他程序占用。Linux 下执行 lsof -i:8080 找到占用进程,确认不是重要程序再杀,或者改项目端口。部署前先检查端口,不要等启动失败再排查。如果用的是云服务器,还要确认安全组放行了对应端口,否则外部访问仍然不通,但本地 curl 又是好的。
现象六:页面能打开但样式图片全丢,浏览器控制台一堆 404。原因是静态资源路径配置不对。Spring Boot 默认静态资源在 classpath:/static/ 下,如果把前端页面放到了其他位置,需要在配置里指定。如果做了 Nginx 端口转发,静态资源路径也要匹配,常见错误是只转了接口没转静态目录,导致 HTML 能打开但 CSS、JS 全部 404。
现象七:定时任务不执行,比如每月 1 号自动汇总没跑。原因一般是两个:服务器时区不对导致 cron 表达式错位,或任务类没被 Spring 扫描到。先检查 @Scheduled 注解所在类是否放在启动类子包下面,这是最容易被忽略的问题。如果包路径没问题,再检查 cron 表达式里的秒和时区,服务器时区设置成 UTC 时,定时任务会在北京时间上午 8 点才执行。确认服务时区用 date 命令看当前时间,不对就改 timedatectl set-timezone Asia/Shanghai。
6. 二次开发:把销售评价系统改造成自己的考核工具
6.1 改指标配置:从写死公式到可配置的评估项
最常做的二次开发是改评价指标。以销售额完成率为例,它是定量指标,系统自动从订单表计算。要改成回款率,不用动表结构,只在指标配置表加一条记录,然后调整 service 层里那段汇总公式。具体做法是:找到指标计算的地方,一般在 service 层有一个根据 indicator_type 分支的方法,确认入参是员工 ID 和时间范围,再替换公式。
假设原来是“实际销售额 / 目标销售额”,改成回款率就是“已回款金额 / 应回款金额”。改之前先用 SQL 在库里验证口径一致,别直接改代码,因为涉及月份边界时容易出错——比如回款日期算哪一天,边界定错,月初月末的数据就对不上。
6.2 用一条 SQL 给系统打分结果做体检
我给自己定过规矩:任何评价汇总功能上线前,必须用 SQL 手工对一遍结果。界面上看到的数字经过了好几层代码,黑匣子式信任早晚会翻车。做法是把评分明细按员工分组求和,跟界面对比。
-- 按员工分组汇总某次评价的总分,用于核对界面排名 SELECT d.target_user_id, SUM(d.score) AS total_score FROM evl_evaluation_detail d WHERE d.evaluation_id = 1 GROUP BY d.target_user_id ORDER BY total_score DESC;如果 SQL 算出来的总和与界面一致,说明链路没问题;不一致就缩小范围,逐项对比明细,找到是四舍五入还是漏了权重。这个习惯帮我避免过不止一次返工。
现在我做二次开发,习惯把这条验证 SQL 留在项目文档里,下次改代码拿出来就能用。评价系统的价值不在打分这个动作,而在分数经得起追问。希望帮到你。
本文还有配套的精品资源,点击获取