系列文章目录
- 健康云平台开发说明文档
- SD申报系统迭代说明文档
- 漏刻有时物联网传感器API接口对接说明文档
- Echarts数据分析系统Data Analysis Platform使用说明文档
- 漏刻有时云守护数据可视化v2.0迭代升级说明文档
- 百度地图POI多信息点标注开发说明文档
- 漏刻有时云守护数据可视化画质感知状态迭代说明文档
- Zabbix物联网可视化开发文档
- Echarts动态排名柱状图(自适应电脑和手机端)说明文档
- 漏刻有时文档系统之XE培训系统二次开发配置手册
文章目录
- 系列文章目录
- 前言
- 一、用户前端
- 1.前端登录
- 2.绑定手机和修改密码
- 3.流程管控
- 3.越权安全
- cookie传参
- url加密传参
- 数据验证
- 二、后台管理
- 1.数据大屏
- 2.用户管理
- 群发短信
- 一键审核
- 3.数据分表
- 配置文件
- 切换数据分表
- 添加数据分表
- 删除数据分表
前言
一、账户登录
1.SDYY大学普通话考试报名系统的账户为学号,不能自行注册,其中默认密码ZYY#身份证后6位,X大写;
2.输入学号和系统默认密码登录,建议登录后马上修改自己的密码,防止信息泄露;
3.如忘记密码,请联系系统管理员,重新设置;
二、信息认证
1.注册状态,由系统管理员导入完成,能登录即表明已完成该状态;
2.身份认证,系统核对姓名、性别、民族和身份证号,如非实名,则无法提交;
3.基础信息,所在学院、班级、CET状态、联系电话和证件照,用于生成准考证;
4.费用缴纳,考生扫描条码后,系统会自动认证,一经认证,基础信息无法修改;
5.准考制证,系统根据审核情况,进行自动制证。生成后,可打开下载或打印
一、用户前端
1.前端登录
- 后台导入用户信息,以学号为准,默认账号为学号,默认密码ZYY#身份证后6位,X大写;
- 支持手机号绑定,但在导入时未涉及到手机号,因此需要在用户首次登录后,强制绑定手机和修改默认密码;
2.绑定手机和修改密码
/*强制弹出修改密码*/
if (user_agree == "0") {
getConfirm('?m=Index&a=userBind', '90%', '90%', 'no', '首次登录绑定手机');
}
//确认协议弹出模态框
function getConfirm(url, width, height, pop, title) {
layer.open({
type: 2,
fix: false,
shade: 0.6,
title: title,
maxmin: false,
area: [width, height],
closeBtn: 0,
shadeClose: false,
anim: 3,
isOutAnim: true,
content: [url, pop]
});
}
3.流程管控
var stepData = [
{'title': "注册用户",links:"#", "desc": "2022-11-12 00:00:00"},
{'title': "身份认证",links:"?m=Index&a=infomationIdentity&act=showIdentity", "desc": "2022-11-12 00:00:00"},
{'title': "报名信息",links:"?m=Index&a=infomationEdit&act=showInfo", "desc": "2022-11-12 00:00:00"},
{'title': "费用缴纳",links:"?m=Index&a=infomationPay", "desc": "2022-11-12 00:00:00"},
{'title': "下载准考证",links:"?m=Index&a=infomationExam&act=showExam", "desc": "2022-11-12 00:00:00"}
];
$.ajax({
type: "get",
url: "api/api.php?act=getUserStatus&token=3cab7ce4142608c0f40c785b5ab5ca24",
async: true,
data: {},
dataType: "json",
success: function (res) {
var data = res.data[0]['user_status'];
//更新状态
steps.make(stepData, '#steps', data);
}
});
3.越权安全
多用户系统,使用user_id数字时,容易明文越权,即通过手动修改user_id,可访问不同用户的信息,为了保证用户信息的私密性和完整性,需要对用户信息进行越权控制。
cookie传参
即用户登录后,将user_id设置为cookie,在后台处理时,默认传参。
$user_id = AuthCode($_COOKIE['db_id'], 'DECODE', '', '');
url加密传参
将user_id加密,后台解密,实现参数的密文传参。
m=Index&a=indexDeal&act=preview&user_id=6d0ed7O1wKrWZ8uLeIV3Q8wymU8EUzlCcuwI4CBAtvqf
。由于生成的密钥,默认带+,带url传参的时候,系统会默认将+转为空格,因此在get方法获取user_id时,需要将空格替换为+.
$sys_id = str_ireplace(' ', '+', get_param('user_id'));//未解码
$user_id = AuthCode($sys_id, 'DECODE', '', '');//已解码
数据验证
在后台读取数据库记录,如果为空,直接跳转到信息提示页。
$row = $db->fetch($current_table, '*', array('user_id' => $user_id), ' user_id DESC');
if (!$row) {
redirect('?m=Index&a=tips&act=tips&tips_id=7');
}
二、后台管理
1.数据大屏
调用echarts展示各个学院的报名情况(未报名、已报名)
2.用户管理
群发短信
//发送短信;
case "sendSms";
$user_id = $_POST['user_id'];
//var_dump($user_id);
if (is_array($user_id)) {
//循环发送信息;
for ($i = 0; $i < count($user_id); $i++) {
$row = $db->fetch($current_table, 'user_name,user_sms,user_phone', array('user_id' => $user_id[$i]), ' user_id DESC');
if ($row['user_phone'] == NULL || $row['user_phone'] == "") {
$res['code'] = 0;
$res['msg'] = $row['user_name'] . "手机号码有误,无法发送";
die(json_encode_lockdata($res));
}
//发送短信 TODO
//更新发送短信次数
$user_sms = $row['user_sms'] + 1;
$db->update($current_table, array('user_sms' => $user_sms), array('user_id' => $user_id[$i]));
}
$res['code'] = 1;
$res['msg'] = "短信发送成功";
die(json_encode_lockdata($res));
} else {
$row = $db->fetch($current_table, 'user_name,user_sms,user_phone', array('user_id' => $user_id), ' user_id DESC');
if ($row['user_phone'] == NULL || $row['user_phone'] == "") {
$res['code'] = 0;
$res['msg'] = $row['user_name'] . "手机号码有误,无法发送";
die(json_encode_lockdata($res));
}
//发送短信 TODO
//更新发送短信次数
$user_sms = $row['user_sms'] + 1;
$db->update($current_table, array('user_sms' => $user_sms), array('user_id' => $user_id));
$res['code'] = 1;
$res['msg'] = $row['user_name'] . ",短信发送成功";
die(json_encode_lockdata($res));
}
break;
一键审核
//一键审核;
case "sendVerify";
$user_id = $_POST['user_id'];
//var_dump($user_id);
if (is_array($user_id)) {
//循环发送信息;
for ($i = 0; $i < count($user_id); $i++) {
$row = $db->fetch($current_table, 'user_name,user_sms,user_phone', array('user_id' => $user_id[$i]), ' user_id DESC');
$db->update($current_table, array('user_verify' => 2), array('user_id' => $user_id[$i]));
}
$res['code'] = 1;
$res['msg'] = "报名审核成功";
die(json_encode_lockdata($res));
} else {
$row = $db->fetch($current_table, 'user_name,user_sms,user_phone', array('user_id' => $user_id), ' user_id DESC');
$db->update($current_table, array('user_verify' => 2), array('user_id' => $user_id));
$res['code'] = 1;
$res['msg'] = $row['user_name'] . ",短信发送成功";
die(json_encode_lockdata($res));
}
break;
3.数据分表
为了提高系统的复合利用率,系统增加了数据分表。即:不同批次的学生报名时,切换数据表,当前使用的为当期的。
配置文件
config.table.php
<?php return ['current_table' => '2024'];
切换数据分表
//切换数据分表;
case "sendVerify";
$tb_name = $_POST['tb_name'];
if ($tb_name == "") {
$res['code'] = 0;
$res['msg'] = "未选择数据表";
die(json_encode_lockdata($res));
} else {
//生成数据分表的配置文件config.table.php
$config_table = "<?php return ['current_table' => '" . $tb_name . "'];";
@file_put_contents('conf/config.table.php', $config_table);
//更新状态码;
$db->update('subtables', array('tb_use' => 0), array(''));
$db->update('subtables', array('tb_use' => 1), array('tb_name' => $tb_name));
//操作日志;
addlogs($_COOKIE["admin_name"], $tb_name . '切换数据分表,STATUS:OK', '', time(), getip());
$res['code'] = 1;
$res['msg'] = "数据分表切换成功";
die(json_encode_lockdata($res));
}
break;
添加数据分表
case "add";
$tb_name = $_POST['tb_name'];
$tb_times = time();
$row = $db->fetch('subtables', '*', array('tb_name' => trim(addslashes($tb_name))), ' tb_id DESC');
if ($row) {
$res['code'] = 0;
$res['msg'] = "数据表名已存在,请更换名称。";
die(json_encode_lockdata($res));
}
//创建数据;
$db->insert('subtables', array('tb_name' => $tb_name, 'tb_use' => 0, 'tb_times' => $tb_times));
//创建分表;
$sql = "CREATE TABLE IF NOT EXISTS `" . $CONF['db_prefix'] . 'user_' . $tb_name . "` (
`user_id` int(11) NOT NULL,
`user_ticket` varchar(64) DEFAULT NULL COMMENT '学号',
`user_phone` varchar(32) DEFAULT NULL COMMENT '手机',
`user_name` varchar(32) DEFAULT NULL COMMENT '姓名',
`user_pwd` varchar(64) DEFAULT NULL COMMENT '密码',
`user_gender` varchar(32) DEFAULT NULL COMMENT '性别',
`user_nation` varchar(32) DEFAULT NULL COMMENT '民族',
`user_cet` varchar(32) DEFAULT NULL COMMENT '四六级',
`user_card` varchar(32) DEFAULT NULL COMMENT '身份证',
`user_campus` varchar(64) DEFAULT NULL COMMENT '所在校区',
`major_id` int(11) DEFAULT '0' COMMENT '学院Id',
`user_work` varchar(255) DEFAULT NULL COMMENT '学院',
`user_class` varchar(32) DEFAULT NULL COMMENT '班级',
`user_time` int(11) DEFAULT NULL COMMENT '注册时间',
`user_photo` varchar(255) DEFAULT NULL COMMENT '证件照',
`user_sms` int(2) DEFAULT '0' COMMENT '短信发送次数',
`user_verify` int(2) DEFAULT '0' COMMENT '0未报名1已报名2已审核',
`user_pay` int(2) DEFAULT '0' COMMENT '0未交费1已缴费',
`user_status` int(2) DEFAULT '0' COMMENT '1已注册2已认证3已完善4已缴费5已通过',
`user_ip` varchar(255) DEFAULT NULL COMMENT 'ip',
`user_agree` int(2) NOT NULL DEFAULT '0' COMMENT '0未验证1已验证',
`user_period` varchar(64) DEFAULT NULL COMMENT '用户批次',
`user_salt` varchar(64) DEFAULT NULL,
`user_city` varchar(32) DEFAULT NULL COMMENT '地级市',
`user_area` varchar(32) DEFAULT NULL COMMENT '地区',
`user_province` varchar(32) DEFAULT NULL COMMENT '省份',
`exam_no` varchar(255) DEFAULT NULL COMMENT '准考证号',
`exam_times` varchar(255) DEFAULT NULL COMMENT '考试时间',
`exam_place` varchar(255) DEFAULT NULL COMMENT '考试地点',
`exam_class` varchar(255) DEFAULT NULL COMMENT '考场号',
`exam_seat` varchar(255) DEFAULT NULL COMMENT '座位号',
`exam_prepare` varchar(255) DEFAULT NULL COMMENT '备考室',
`exam_notice` text COMMENT '考生须知'
) ENGINE=InnoDB AUTO_INCREMENT=4457 DEFAULT CHARSET=utf8 COMMENT='信息表';";
$row = $db->queryall($sql);
$res['code'] = 1;
$res['msg'] = "数据分表创建成功,请在conf/config中配置切换";
die(json_encode_lockdata($res));
//操作日志;
addlogs($_COOKIE["admin_name"], $tb_name . '数据分表创建,STATUS:OK', '', time(), getip());
break;
删除数据分表
//删除数据分表;
case "del";
$tb_id = get_param('tb_id');
$tb_name = get_param('tb_name');
if (is_array($tb_id)) {
$tb_id = implode(",", $tb_id);
}
if ($tb_id == '') {
die("tb_id错误");
}
//删除记录;
$db->delete('subtables', 'tb_id in(' . $tb_id . ')');
//删除数据表;
$sql = "DROP TABLE IF EXISTS " . $CONF['db_prefix'] . $tb_name;
$row = $db->queryall($sql);
//操作日志;
addlogs($_COOKIE["admin_name"], $tb_id . '数据分表删除,STATUS:OK', '', time(), getip());
break;
@漏刻有时