phpems / phpems
PHP Exam Management System
Installs: 727
Dependents: 0
Suggesters: 0
Security: 1
Stars: 24
Watchers: 2
Forks: 81
Language:JavaScript
Type:project
Requires
- php: >=7.0
- ext-json: *
- aliyuncs/oss-sdk-php: ^2.4
- davedevelopment/phpmig: ^1.6
- illuminate/database: >=5.0
- predis/predis: ^1.1
- thamaraiselvam/mysql-import: ^1.1
Requires (Dev)
- symfony/var-dumper: >=3.0
Suggests
- overtrue/easy-sms: 方便发送验证码短信的组件
- overtrue/wechat: 方便开发服务号相关功能的组件
README
开源免费的PHP无纸化模拟考试系统,基于 PHPEMS v6.1 优化。本版本重点修复BUG(包括所有非 E_NOTICE 级别错误提示),并根据需要优化新增一些功能。
优化&新增功能
- 新增使用composer,可直接安装第三方扩展包
- 为所有数据表定义 Model ,数据库操作更灵活方便
- 可在线数据库迁移,请参考
tasks
目录下Database.php
和migrations
目录下的示例文件 - 新增部分字符串和数组辅助函数,如:dd()
- 新增 Redis 缓存支持,请参考
tasks
目录中的Cache.php
默认集成扩展包如下:
推荐集成扩展包:
使用 ORM 操作数据库示例:
// 获取userid为1的用户 $user = \Model\User::find(1); // 获取用户名 echo $user->username; // 调试输出用户所有信息 dd($user->getAttributes()); // 获取用户的考试记录 $eh = $user->examHistories; foreach ($eh as $result){ print_r($result->getAttributes()); } // 获取用户开通的考场 $ob = $use->basics; foreach($ob as $basic) { // 考场信息 print_r($basic->getAttributes()); // 开通时间等信息 print_r($basic->pivot->getAttributes()); } // 获取basicid为1的考场 $basic = \Model\Basic::find(1); // 获取考场考试科目信息 print_r($basic->subject->getAttributes()); // 获取考场的考试记录 $eh = $basic->examHistories; foreach ($eh as $result){ print_r($result->getAttributes()); } // 获取开通考场的用户 $ou = $basic->users; foreach($ou as $user) { // 用户信息 print_r($user->getAttributes()); // 开通时间等信息 print_r($user->pivot->getAttributes()); } // 更多方法参考 model 目录
使用 Redis 缓存数据库示例:
$client = new Predis\Client('tcp://127.0.0.1:6379'); $client->set('phpems:questions', json_encode(Cache::questions())); $client->set('phpems:knows', json_encode(Cache::knows()));
安装和配置
安装
方式1:使用 composer 创建项目
通过 composer 指令直接创建项目
composer create-project --prefer-dist phpems/phpems phpems
如果要安装 v5.0 版本,请使用以下指令:
composer create-project --prefer-dist phpems/phpems phpems "5.*"
提示:推荐使用阿里云 Composer 全量镜像
方式2:使用 git 创建项目
使用 git 复制项目后使用 composer 安装依赖
git clone https://github.com/phpems/phpems.git
cd phpems && composer install
cd lib && cp config.inc.example.php config.inc.php
配置
安装完成后,根据需要修改 lib 目录下的 config.inc.php
文件,配置数据库,然后使用 migrations
目录下的数据库文件 phpems.sql
创建数据库,项目上线后务必删除 tasks
目录。
可使用以下指令安装数据库:
./vendor/davedevelopment/phpmig/bin/phpmig migrate
如果是 phpems v5.0 版本升级到 v6.0,请使用 tasks
目录下的 v5.0v6.0.sql
升级数据库。如果是 phpems v6.0 版本升级到 v6.1,请使用 tasks
目录下的 v6.0v6.1.sql
升级数据库,也可以访问 /tasks/Database.php?action=update
在线升级。
如果是 linux 系统,需要保证 data
目录具有可写权限,否则网站无法正常访问。
默认管理员账号:peadmin,密码:peadmin
源码默认关闭错误提示,如需调试请修改
config.inc.php
中DEBUG
为true
。
使用(演示)
考试设置
- 考试模块:考试设计—>科目管理(ID影响教师阅卷)—>章节—>知识点(ID影响试卷生成)
- 考试模块:试题管理—>普通试题管理—>添加试题—>CSV导入(对应知识点ID)
- 考试模块:试卷管理—>随机组卷—>试卷管理—>随机组卷
- 考试模块:考试设计—>考场列表—>添加考场(至此步骤考试设置完毕)
- 教师管理:
- 教师管理—>用户模块—>模型管理—>教师模型(字段管理)—>Teacher_subjects(修改字段)—>可选值列表(科目名称=ID)—>提交;
- 用户管理—>用户名—>修改(可管理科目打钩);
- 登录—>成绩管理
开启微信自动登录
config.inc.php
中 USEWX
值改为 true
,并配置好微信服务号的 appid 和 appsecret 即可。
第一次从服务号或小程序登录系统会自动绑定微信和考试账号,以后从服务号或小程序进入直接自动登录。
关于系统二次开发的说明:
PHPEMS 文件夹结构
api
支付相关API接口目录app
项目的核心代码目录,应用的所有模块的类(cls)、控制器(controller)和视图模板(tpls)都在这里,其中app
对应PC端、phone
对应移动端、master
对应管理后台、teach
对应教师后台。主要模块如下:bank
财务模块certificate
证书模块content
内容模块core
全局核心模块,包括网站首页course
课程模块docs
文档(词条)模块document
文件(附件)模块exma
考试模块seminar
专题模块user
用户模块weixin
微信登录模块
data
缓存和日志目录,需要可写权限files
上传的附件和公共静态文件目录,需要可写权限lib
系统公共类和方法目录,包括配置文件model
数据模型目录,使用 ORM 操作数据库更为便捷tasks
示例数据库和示例文件目录,项目上线后最好删除vendor
项目依赖的 composer 包
PHPEMS 路由说明
项目路由入口文件为根目录下的 index.php
,如:
index.php?user-phone-login-index
以上路由访问的是
app
目录下user/controller/login.phone.php
文件的index
方法
PHPEMS 模板说明
视图模板在 app
文件夹下模块中的 tpl
文件夹中,编译文件在 /data/compile/
目录。
/data/compile/seminar/tpls/app/%%cpl%%index.php
以上编译文件对应的是
app
目录下seminar/tpls/app/index.tpl
文件。
PHPEMS smarty模板标签
变量
{x2;$var}
该标签会被翻译为该变量必须为在php程序中被$this->tpl->assign过后的变量。
{x2;v:var}
该标签会被翻译为该变量是在php模板中产生的临时变量,不需要assign
{x2;c:const}
该标签用于显示常量,注意,在以后的if,tree,loop等标签中,常量不需要c:,只在显示常量的本标签中需要c:
循环遍历:tree
tree标签是一个组合标签,用于遍历一个数组。规则如下
{x2;tree:遍历变量,临时指针变量,循环次数变量}
{x2;endtree}
逻辑判断:if
if标签格式:
{x2;if:判断语句}
......
{x2;elseif:判断语句}
......
{x2;else}
......
{x2;endif}
字符处理
date
将unix时间戳转换为具体时间,用法{x2;date:变量,'Y-m-d H:i:s'}
substring
字符串截取,用法{x2;substring:变量,长度数字}
realhtml
取消转义并显示带html的内容,{x2;realhtml:变量}
数据表说明
不使用model生成CURD sql
这是项目原生的方式,使用起来太麻烦,推荐使用前面示例的ORM的方式。
// 查询 // $sql = 'SELECT '.$db_fields.' FROM '.$db_tables.' WHERE '.$db_query.$db_groups.$db_orders.' LIMIT '.$db_limits; $args = [ $db_fields, // 多列使用数组 $db_tables, // 多表使用数组 $db_query, // [['AND','usergroupid = 1'],['AND','userid >= :userid','userid',$userid]] $db_groups, // 可选 $db_orders, // 可选 $db_limits, // 可选 ]; $sql = $this->pdosql->makeSelect($args); return $this->db->fetch($sql); // 新增 // $sql = 'INSERT INTO '.$db_tables.' ('.implode(',', $db_field).') VALUES ('.implode(',', $db_value).')'; args = [ 'username' => $username, 'userpassword' => md5($userpassword), 'useremail' => $email ]; $data = ['user', $args]; $sql = $this->pdosql->makeInsert($data); $this->db->exec($sql); return $this->db->lastInsertId(); // 更新 // $sql = 'UPDATE '.$db_tables.' SET '.$parsql.' WHERE '.$db_query.$db_groups.$db_orders.' LIMIT '.$db_limits; args = ['useremail' => $email]; $data = ['user', $args, [['AND', 'userid = :userid', 'userid', $userid]]]; $sql = $this->pdosql->makeUpdate($data); return $this->db->exec($sql); // 删除 // $sql = 'DELETE FROM '.$db_tables.' WHERE '.$db_query.$db_groups.$db_orders.' LIMIT '.$db_limits; $data = ['user', [['AND', 'userid = :userid', 'userid', $userid]]]; $sql = $this->pdosql->makeDelete($data); return $this->db->exec($sql);
版权说明
PHPEMS属于开源免费程序,开发者为火眼,您可以自由修改其中属于PHPEMS原创部分的代码,原则上您只要不通过出售PHPEMS相关源代码盈利,即可免费使用本软件。
本系统基于火眼的 PHPEMS6.0(20190924) 修改,如果在安装和使用中发现问题,欢迎反馈或联系我(QQ:7300637),但如果需要付费定制,请直接联系版权所有者火眼(QQ:278768688)。
使用交流QQ群
- 群1:2736999
- 群2:274154600
- 群3:391191029
- 群4:438228249
- 群5:264590257
- 群6:466859119
- 群7:2554408
- 群8:479709205
- 群9:474900152
- 群10:498555033