系列文章目录
- 健康云平台开发说明文档
- 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;
@漏刻有时



















