简介:面向事业单位与公关单位的在线培训考试系统源码,定位于解决组织内部培训与考核的数字化管理问题,适合开发者或系统管理员据此开展二次开发与功能定制。该压缩包约34.23MB,内含系统运行所需的核心代码,围绕题库管理、试卷生成、考试监控、成绩分析等关键模块组织,开发者可通过源码梳理前后端接口、数据表结构及权限控制流程,快速定位修改点,降低后期维护与功能升级难度。目前已有167人学习,印证了该资源在在线培训场景中的实用价值。借助这套源码,技术人员不仅能优化界面和交互体验,还能扩展社交互动、课程推荐算法或移动端适配等能力,使平台更贴合公关单位员工技能培训、沟通技巧考核、危机处理演练等实际业务需求,从而提升培训管理效率、降低组织培训成本,并增强内部知识传承效果。
1. 先把“公关单位在线培训考试系统源码.rar”这个文件名拆明白
“公关单位在线培训考试系统源码.rar”这个压缩包,看起来就是一套给机关、企事业单位做内部培训考核用的 Web 考试系统源码,打包成 rar 格式分发,解压之后部署到内网服务器上就能用。它解决的场景非常具体:培训负责人不再收发纸质试卷、人工判分、手工统计,学员在浏览器里完成在线学习、参加考试、查成绩,管理员在后台维护题库、组卷、发考试、看报表。适合两类人拿它上手:一是单位信息岗或运维人员,想快速在内网搭一套培训考试平台;二是刚入行做 PHP 二次开发的程序员,想找一个功能完整的真实项目练手。但前提都一样——你得先把这套源码从 rar 里完整地解出来,并且把数据库初始化做对。
2. 解压之前先看清系统边界:这类单位内部考试系统通常长什么样
2.1 它和公有网校系统的三个本质区别
我拿到任何一个以“单位内部”为前缀的考试系统源码,第一件事不是解压,而是确认它的定位。这类系统跟面向公众的网校、在线教育平台有很明显的三个差异,直接影响你后面怎么部署、怎么改。
第一个差异是部署环境。单位内部系统默认跑在内网,可能没有公网域名,甚至没有 HTTPS 证书,服务器是一台普通的 Windows Server 或者 CentOS,数据库和 Web 服务装在同一台机器上。所以这套源码大概率是单体应用,而不是微服务,不需要 Redis 集群、消息队列这些重型组件。
第二个差异是账号体系。内部系统不搞开放注册,账号由管理员批量导入,跟组织架构绑定,比如“宣传处-舆情科-科员”这种层级。考试结果要能按部门汇总,所以用户表里几乎必然会带 department_id 或类似的部门字段,而不是像公网产品那样把用户丢在一个扁平表里。
第三个差异是考试严肃度。公网培训考试挂科了可以重考,没人管;单位内部的培训考试往往跟年度考核、持证上岗挂钩,所以系统必须有防作弊设计:考试时段限制、考试时长倒计时、切屏记录、IP 段限制、试卷随机抽题。这些功能在源码里不一定都实现,但框架上会留位置。
读源码前先想清楚这三个差异,你才知道哪些文件是核心,哪些文件可以完全不看。
2.2 这类源码的典型形态:PHP 单体 + 后台模板 + MySQL
虽然标题上没写技术栈,但“在线培训考试系统源码”这种 rar 包在市面上流通最多的形态是 PHP 单体应用,少数是 Java 的 Spring Boot 项目。PHP 单体之所以多,是因为这类系统要部署在客户内网,而内网服务器最常见的就是 Windows + phpStudy / 宝塔面板,PHP 的部署门槛最低。
一个典型的 PHP 单体考试系统,目录结构大致这样:
/ ├── admin/ # 管理后台入口(管理员登录、题库管理、试卷管理) ├── home/ # 学员前台(登录、考试、成绩查询) ├── application/ # 业务代码(控制器、模型、视图) │ ├── config/ # 数据库、路由、上传等配置文件 │ └── database/ # 初始化 SQL 脚本 ├── static/ # 前端资源(CSS、JS、图片) ├── upload/ # 用户上传的图片、导入的题库文件 ├── thinkphp/ # 如果基于 ThinkPHP,核心框架目录在这里 ├── index.php # 入口文件 └── README.txt # 部署说明如果 rar 解开以后你看到的是这个结构,基本可以判断它是 ThinkPHP 3.x/5.x 或类似 MVC 框架写的。也有的源码不依赖框架,只有一个include/目录放公共函数,admin 和 home 下直接是 PHP 页面,那种系统维护起来更原始,但部署反而更简单——丢到 Web 根目录就能跑。
还有一种情况是前后端分离:后端是一个提供 JSON 接口的 PHP 或 Java 服务,前端是一个单独的 Vue 打包后的 dist 目录。这种系统第一次上手会麻烦一点,因为你必须先把后端跑起来,再配置 Nginx 把前端请求转发到后端接口,任何一个环节出错,页面就白屏。
2.3 解压后第一件事:按顺序看这三个文件,而不是急着配环境
很多人拿到源码第一反应是丢进 phpStudy 然后打开浏览器,结果白屏或报错,原因就是没看说明文件。我一般按这个顺序检查:
第一个是README.txt或安装说明.doc。这里通常写着环境要求,比如“PHP 5.6 以上 / 7.0 以下”“MySQL 5.7”“开启伪静态”。这一行字能帮你避开一大半版本兼容问题。
第二个是application/database/或根目录下的.sql文件。它的文件大小很说明问题,通常这类系统的初始 SQL 在几百 KB 到几 MB 之间,包含用户表、题库表、试卷表、考试记录表、部门表等。如果 SQL 文件缺失,或者只是一个几十 KB 的“空库”脚本,说明这套源码很可能需要你自己建表,工作量完全不一样。
第三个是配置文件。ThinkPHP 项目看application/config.php或database.php,原生 PHP 项目看include/config.php或conn.php。这里能确认数据库名、数据库账号、前缀(xxx_user里那个xxx_)。这三个文件确认完,你对这套系统能不能跑起来,心里已经有底了。
3. 把 rar 里的源码在本地跑通:环境、数据库、配置文件一次说清
3.1 解压这一步就有坑:编码、目录名、路径长度
先说解压。rar 压缩包在 Windows 上可以用 WinRAR 或 7-Zip 解压,在 Linux 服务器上如果收到的是 rar,需要先装unrar或rar命令:
# CentOS / Ubuntu 安装解压工具 yum install -y unrar # CentOS 系列 apt install unrar # Ubuntu / Debian 系列 # 解压到指定目录 unrar x 公关单位在线培训考试系统源码.rar /var/www/html/解压时有三个细节很容易翻车:第一,如果源码是 GBK 编码写的,解压到 Linux 上后文件名会乱码,unrar加-ai参数可以强制按指定编码解压;第二,不要把文件解到带中文和空格的路径里,后面配置伪静态、写 crontab 都会有莫名其妙的毛病;第三,解完看一眼upload/和runtime/目录是否存在,如果压缩包里就没带这两个目录,你要手动创建并给写权限,否则后面上传图片和生成缓存都会报错。
3.2 创建数据库并导入初始化数据
这一步是整套系统能不能跑起来的命门。我习惯在命令行里做,而不是用 phpMyAdmin 点导入,因为 SQL 文件大的时候图形界面容易超时中途断掉。
# 登录 MySQL,创建库并指定 utf8mb4 字符集 mysql -uroot -p CREATE DATABASE IF NOT EXISTS training_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; exit # 导入初始化 SQL,注意文件路径 mysql -uroot -p training_db < /var/www/html/application/database/training.sql这里我说一下为什么字符集一定要显式指定为 utf8mb4。老考试系统建库脚本里经常写utf8,在 MySQL 5.5 以下没问题,但现在的 MySQL 5.7 / 8.0 默认字符集是 utf8mb4,如果你建库用 utf8,后面导入题库时遇到生僻字、emoji、特殊符号就会报Incorrect string value。更麻烦的是,如果 SQL 文件本身是 GBK 编码,你要先把它转成 utf8 再导入:
# 把 GBK 编码的 SQL 转成 UTF-8,避免导入后中文全是乱码 iconv -f GBK -t UTF-8 training_gbk.sql > training_utf8.sql mysql -uroot -p training_db < training_utf8.sql导入完之后,不要急着进后台,先在命令行里检查一遍表数量和关键表里的数据:
USE training_db; SHOW TABLES; SELECT COUNT(*) FROM `user`; -- 看有没有内置管理员账号 SELECT COUNT(*) FROM `question`; -- 看题库表里有没有初始试题如果user表里一条记录都没有,说明这套源码的初始化 SQL 是“空库”脚本,管理员账号需要你自己往表里插一条(密码通常是 MD5 加密后的字符串,不要直接明文插入)。
3.3 改配置文件里的三处参数:数据库、URL、时区
以 ThinkPHP 系最常见的config/database.php为例,你需要改的就是数据库名、用户名、密码这三项,但踩坑的往往是另外两个参数:
<?php return [ // 数据库配置 'type' => 'mysql', 'hostname' => '127.0.0.1', 'database' => 'training_db', // 改成你建的库名 'username' => 'root', // 本地调试可以用 root 'password' => 'your_password', // 数据库密码 'hostport' => '3306', 'charset' => 'utf8mb4', // 和建库字符集保持一致 // 伪静态配置 'url_rewrite' => true, // 开启后需要配 Nginx/Apache 伪静态 // 时区配置 'default_timezone' => 'Asia/Shanghai', // 不改的话考试记录时间差 8 小时 ];字符集那一行最容易被人忽略。如果 PHP 连接数据库用的字符集是 utf8,而数据库是 utf8mb4,表面上正常,但考生答题内容里一旦有特殊字符,写入就失败,考试记录保存不上,考生那边看到的就是“交卷失败”,这个故障非常隐蔽。
时区问题也值得多说一句。默认配置如果写成'default_timezone' => 'UTC',你后台看到的考试开始时间、成绩统计都会比北京时间慢 8 小时,排错得排半天。改成Asia/Shanghai之后,date('Y-m-d H:i:s')取到的才是本地时间。如果改完发现时间还是不对,重启一下 PHP-FPM,因为 PHP 的时区配置有 opcache 缓存。
3.4 第一次登录:用内置账号走完“建考卷 → 发布考试 → 答题 → 查成绩”全流程
配置改完,访问http://localhost/index.php或http://localhost/,如果页面能打开,说明框架已经跑起来了。这时候别急着看界面,先找内置账号登录后台。
内置账号一般写在 README 里,比如admin/admin123,也有的系统在初始化 SQL 里预置。如果 README 丢了,可以直接查数据库:
-- 常见的用户表名是 admin_user / user / sys_user,密码字段常见为 password 或 pwd SELECT id, username, password, role FROM admin_user LIMIT 5;登录后台后,我建议按“建分类 → 导试题 → 创建试卷 → 发布考试 → 用学员账号答题 → 查看统计报表”这个顺序走一遍全流程。第一次全流程跑通比什么都重要,它验证的是这套系统的核心链路是通的。很多系统前台页面能打开,但一点“开始考试”就 404 或白屏,多半是伪静态没配,这个问题在下一章避坑部分专门讲。
4. 从“能打开”到“能考试”:试卷规则、考试参数、防作弊、权限一起调
4.1 组卷规则:固定卷、随机卷、AB 卷到底怎么选
考试系统的核心是组卷。这类源码一般提供两种组卷方式:固定卷和随机卷。固定卷就是管理员手动从题库里挑题,挑完以后所有人看到的是同一套题;随机卷是设定规则(比如从“单选题”分类里抽 20 道,从“多选题”里抽 10 道),每个考生拿到的题目顺序和题目本身都不同。
从单位内部考试场景来说,我强烈建议优先用随机卷,理由很直接:内部考试题库一共就几百道题,固定卷流传一份出去,整个考试就失效了。随机卷配合乱序选项,成本最低的防作弊手段。
随机抽题的配置通常在“创建试卷”页面,核心参数有这么几个:
| 参数 | 含义 | 建议值 |
|---|---|---|
| 抽题分类 | 从哪个题库分类抽题 | 按培训专题建分类,别建一个“综合”大分类 |
| 抽题数量 | 每类抽几道 | 单选题 20 道、多选题 10 道、判断题 10 道比较适中 |
| 每题分值 | 每道题多少分 | 单选题 2 分、多选题 4 分、判断题 1 分,自动算总分 |
| 选项乱序 | 是否打乱 ABCD 选项顺序 | 必须开启 |
| 题目乱序 | 是否打乱题目顺序 | 必须开启 |
题库分类是组卷的地基。我见过不少单位把几百道题全塞进“综合题库”一个分类里,结果随机卷抽出来全是判断题,单选多选抽不够数量,系统直接报“题库数量不足”。正确做法是按课程模块建分类,比如“舆情应对基础”“新闻发布实务”“保密知识”,每个分类下再分单选/多选/判断三种题型,组卷的时候才能精确控制比例。
4.2 考试参数:时长、及格线、重考次数、成绩显示方式
试卷建好后,发布考试时还有一组参数决定考试体验。这组参数在源码里通常在试卷表或考试记录表里维护,配置页面可能叫“考试设置”或“发布考试”。
核心参数和坑点如下:
考试时长。单位内部考试一般 45~60 分钟。坑点在于时长的计算方式:有的系统是“进入试卷即开始倒计时”,有的是“页面加载后开始倒计时”。如果源码用的是后者,考生提前打开试卷界面放着不答,时长会被白白耗掉。我见过某系统把倒计时放到了前端 JS 里,考生一刷新页面,倒计时重新从头开始,这个 bug 等于没设时长。拿到源码后,先看考试开始接口和后端时长校验逻辑在哪里,如果只靠前端倒计时,必须把超时判卷逻辑改到后端。
及格线。就是及格分,60 分是默认值。但单位内部考试往往有“合格/不合格”两档,也有一些特殊场景需要“80 分合格”,所以及格线要支持按考试单独配置,而不是全局统一。如果源码里写死了及格线,改动很简单——找到成绩计算函数,把硬编码的60改成读取考试配置表的字段。
重考次数。内部考试按考核严肃程度设重考次数,一般默认允许补考 1~2 次。坑点是:如果考试结束但考生没交卷,系统是否判定为“一次考试机会已使用”?如果答案是否定的,考生只要不点交卷,就可以无限次重新进入考试。这一点在验收源码功能时必须测试到。
成绩显示。当场显示成绩还是考后统一公布?如果跟考核挂钩,建议考后统一公布;如果只是培训测验,当场显示成绩体验更好。这属于一个开关参数,但实现方式差异很大——当场显示成绩意味着交卷后立即调判分接口,考后公布意味着成绩字段要锁到“发布时刻”才在前台可见。
4.3 防作弊与过程管理:切屏记录、考试时段、IP 限制
单位内部考试的防作弊不需要人脸识别那么重,三件事做到位就够了:限时段、切屏记录、IP 限制。
考试时段是最基本的:设置“2025-06-10 09:00 至 11:00”,这个时段之外任何人进不了考试页。如果源码没有这个字段,那就只能在发布考试时人工控制——这样其实不合格,因为稍微懂技术的考生改一下本地时间就绕过去了。看源码时找exam_start_time和exam_end_time这两个字段。
切屏记录这个功能在不同源码里完成度天差地别。成熟的做法是前端监听visibilitychange事件,切出页面时把事件上报到后端;接口层面再配合“考试中不允许另开页面”的校验。很多源码只做了前端的blur弹窗提醒,这种在技术上等于没有,因为弹窗可以被浏览器拦截。如果你拿到的源码只有 JS 层防切屏,你要么接受它是个摆设,要么在后端加一个“考试状态表”,每次答题提交时记录时间戳,间隔异常就标记为疑似作弊。
IP 限制的做法是把允许考试的网段写进配置,比如单位内网是192.168.1.0/24,不在这个段内的 IP 不允许进入考试。这个功能在 PHP 里的实现很简单:
// 考试前校验 IP 是否在允许段内 function check_ip_allowed($client_ip, $allowed_net) { list($net, $mask) = explode('/', $allowed_net); $client_ip_long = ip2long($client_ip); $net_long = ip2long($net); $mask_long = -1 << (32 - (int)$mask); return (($client_ip_long & $mask_long) == ($net_long & $mask_long)); }这段逻辑不长,但作用很关键。注意,如果你的系统部署在内网且有反向代理,$client_ip不能直接用$_SERVER['REMOTE_ADDR'],而要看HTTP_X_FORWARDED_FOR,否则所有考生的 IP 都显示成代理服务器的 IP,限制就失效了。
4.4 权限与组织架构:角色分配和部门数据隔离
内部考试系统最容易被忽略的是权限模型。最小可用的权限模型只有三种角色:系统管理员(管题库、试卷、用户)、部门管理员(看本部门成绩、本部门学员)、学员(考试、查自己成绩)。
如果你拿到的源码是只有“管理员/普通用户”两种角色,十有八九做不到按部门看成绩,所有部门的数据都平铺在一起。这时改造方案有两种:轻量做法是在用户表加department_id,成绩查询 SQL 按当前管理员所属部门过滤;重量做法是引入 RBAC 权限表(角色表、节点表、角色-用户关联表),虽然开发量大,但后续加“阅卷员”“题库审核员”这类角色就不用改表结构了。
部门隔离还有一个细节:批量导入学员时,Excel 模板里必须有“部门”列,否则导入后几百个用户全挂在“未分配部门”下,部门管理员登录后什么都看不到。这里的踩坑经验是,导入前先做一次用户表department_id空值检测:
-- 找出没分配部门的用户,数量为 0 才能正常按部门统计成绩 SELECT COUNT(*) FROM `user` WHERE department_id = 0 OR department_id IS NULL;5. 部署和二次开发最常踩的 5 个坑:现象、原因、解决一起讲
5.1 页面全是乱码,或者 Ajax 接口返回 500
现象:后台页面打开后中文全是“锟斤拷”之类的乱码,或者考试提交答案时接口直接 500。原因:最常见的是三层字符集不一致——数据库是 utf8,PHP 连接字符集是 latin1,页面 meta 声明是 gb2312。我处理过一个案例,源码是老的 GBK 项目,数据库表也是 GBK,但部署在宝塔面板上时 PHP 默认连接字符集是 utf8mb4,结果所有中文读写全乱。解决:统一按三层排查。第一层,浏览器访问页面时右键查看源码,看<meta charset="...">声明的是什么;第二层,查看配置文件里数据库连接字符集;第三层,进 MySQL 执行SHOW CREATE TABLE user\G看表默认字符集。三层必须一致,通常全部统一为 utf8 或 utf8mb4 最省事。如果源码文件本身是 GBK 编码,用编辑器统一转成 UTF-8 再继续改,避免混着改越改越乱。
5.2 图片上传失败、题库导入 Excel 报错
现象:后台传 logo、传课程封面,提示“上传失败”或“文件过大”;导入题库 Excel 时进度条走到一半报错。原因:上传是典型的双重限制问题。PHP 侧有upload_max_filesize和post_max_size两个参数,Nginx 侧有client_max_body_size,任何一个不满足都会失败。默认 PHP 的upload_max_filesize是 2M,导入题库的 Excel 稍微带点图片就超限。解决:修改后记得重启 PHP-FPM 才生效。
; php.ini 中调整上传限制 upload_max_filesize = 50M post_max_size = 60M max_execution_time = 300 memory_limit = 256M# Nginx 站点配置中调整请求体大小,位置在 server 块内 client_max_body_size 60m;改完之后,用phpinfo()页面确认修改生效。还有一个很容易忽略的点:upload/目录如果权限是 755,Web 用户(www)没有写权限,上传同样会失败,执行chown -R www:www /var/www/html/upload解决。
5.3 伪静态没配好,菜单链接全部 404
现象:首页能打开,但点“题库管理”“试卷管理”等菜单,浏览器地址栏变了,页面却 404。原因:这类系统几乎都依赖伪静态(URL 重写),把index.php?m=admin&c=Question&a=index这种参数式 URL 重写成/admin/Question/index。如果你用的是 Nginx 而只配了try_files没配 rewrite 规则,就会 404。解决:Nginx 下最常用的规则是:
location / { if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s=$1 last; } }Apache 下则是开启.htaccess重写,并且把AllowOverride All配好。判断伪静态是否生效,直接看地址栏——如果 URL 里出现index.php字样,说明重写没生效;如果 URL 是干净的/admin/xxx.html,说明规则正常。这里要特别提醒:改完 Nginx 配置必须nginx -t检查语法再reload,不要直接重启,免得配置写错导致整个站点挂掉。
5.4 管理员改密码不生效,或者登录状态一会儿就掉线
现象:后台改完管理员密码,退出登录后用新密码登不上;或者登录后过十几分钟就被踢出,提示“登录超时”。原因:改密码不生效,基本是密码写入时和校验时用的加密算法不一致,比如注册时用的是md5($password),校验时却用了md5($password . $salt)。登录掉线则多半是 session 存到了/tmp,而 /tmp 被系统定期清理,或者 PHP 的session.gc_maxlifetime默认只有 1440 秒(24 分钟)。解决:先查用户表里密码字段存的格式,是 32 位 MD5,还是 40 位 SHA1,还是$2y$开头的 bcrypt,把注册和登录两处代码对齐到同一种算法。session 存储路径改到项目目录下并设好权限:
; php.ini 中调整 session session.save_path = "/var/www/html/runtime/session" session.gc_maxlifetime = 7200改完后重启 PHP-FPM。如果还掉线,检查是不是部署了多台服务器而 session 存在本地没走共享存储,单位内部系统单机部署一般不会遇到这个问题。
5.5 多人同时考试时页面卡死,数据库连接被打满
现象:平时自己测试都正常,一到正式考试 50 个人同时进系统,网页打开很慢,交卷时提示“数据库连接失败”。原因:单体 PHP 系统默认每次请求都新建一个 MySQL 连接,不设连接池。50 个人同时答题,加上 Ajax 自动保存答案的轮询请求,瞬间并发请求数可能到 200 以上,MySQL 的max_connections默认 151,直接就打满了。解决:应急办法是把 MySQL 连接数调大,同时把 PHP-FPM 的进程数控制住:
# my.cnf 中调整,注意内存够不够 max_connections = 500 # php-fpm.conf 中控制并发,避免进程数爆炸 pm.max_children = 50 pm.start_servers = 10 pm.max_spare_servers = 20治本的办法是看源码里是否支持长连接(pconnect),以及自动保存答案的接口是否做了防抖。很多系统的“自动保存”是每 10 秒请求一次,前端要做成修改后才请求,而不是定时轮询。还有一个更实用的方案:把 MySQL 的wait_timeout从默认 28800 秒调小到 600,避免大量空闲连接占用资源。这些参数调完后用SHOW PROCESSLIST;观察连接数,能看到明显下降。
6. 怎么验证这套系统能扛住一次真实考试:从压测到安全加固的三板斧
验证这套系统能不能用,不能靠“我点了几下没报错”来判断。我每次部署完考试系统,都要做三轮验证,这三轮都过了才敢让它上真实考试。
第一轮是功能链路验证,上面 3.4 节已经讲过了,管理员建卷、学员答题、成绩统计整条线跑通。第二轮是并发验证,用 Apache 自带的 ab 工具模拟 50 个并发用户同时登录和交卷:
# 模拟 200 个请求、50 并发,分别压登录接口和交卷接口 ab -n 200 -c 50 -p payload_login.json -T application/json http://127.0.0.1/home/user/login ab -n 200 -c 50 -p payload_exam.json -T application/json http://127.0.0.1/home/exam/submit看两个指标:Failed Requests必须是 0,Requests per second不要低于 10。如果失败率超过 1%,回到第 5.5 节调连接数和进程数。
第三轮是安全加固,这是我最重视的一步。源码包里默认的管理员密码、数据库密码必须第一时间改掉;后台登录接口要加一个简单的频率限制,防止被暴力破解;备份数据库的脚本要设好,正式考试前一天自动备份一次。最后在服务器上执行一遍:
# 检查 Web 目录下有没有可疑的后门文件,找最近被修改过的 PHP 文件 find /var/www/html -name "*.php" -mtime -7 -type f -newer /etc/hostname这条命令查的是最近 7 天被改动过的 PHP 文件。正常开发期改文件是一件好事,但如果部署完成后还有新 PHP 文件出现,就该提高警惕了——尤其要留意eval(、base64_decode(这类函数出现在非框架文件里。我在一次客户现场就抓到一个藏在upload/目录下伪装成图片的 PHP 后门,正是靠这条命令发现的。
这套系统值不值得长期投入,我的判断标准其实很简单:如果源码的题库管理、组卷逻辑、成绩统计三条链路都清晰,改造成本可控,那就值得在它上面做二次开发;如果连初始化 SQL 都不完整、登录都有问题,不要浪费时间修补,直接换一套。拿到的第一周先把验证做完,后面再谈定制。我自己吃过这个亏——花了两周给一套结构很差的旧系统打补丁,最后推倒重来,不如第一天就做决定。希望帮到你。
本文还有配套的精品资源,点击获取