ThinkPHP5实现答题管理系统(一)

最近实习做了一个PHP的项目练手,大概是一个答题管理的模板(已部署至www.songlei.online),用了TP5+Jquery+layui来实现,由于整个系统功能模块有点多,所以我们逐个拆分出来。这次先做问题模板的添加和删除。如下图。

模板.JPG

1.前期准备

TP5框架:在tp5的官网下载框架模板ThinkPHP5核心版
编辑器:我选用的是VS code。因为相较于其它IDE,更加轻量级,别的集成IDE亦可。
一点点的TP5知识储备:TP5完全开发手册
一点点的layui文档的bang助:layui开发使用文档

2.架构设计(MVC)

image.png

这里我选择单模块index模块 将所有控制器都放在Controller层
不同于TP5框架提供的index模块的view层,我将view层要渲染的html页面都放在了template目录下,并且与controller层一一对应,配置的代码,在application模块下的config.php中。

  'template'               => [
        // 模板引擎类型 支持 php think 支持扩展
        'type'         => 'Think',
        // 模板路径
        'view_path'    => '',
        // 模板后缀
        'view_suffix'  => 'html',
        // 模板文件名分隔符
        'view_depr'    => DS,
        // 模板引擎普通标签开始标记
        'tpl_begin'    => '{',
        // 模板引擎普通标签结束标记
        'tpl_end'      => '}',
        // 标签库标签开始标记
        'taglib_begin' => '{',
        // 标签库标签结束标记
        'taglib_end'   => '}',
        'view_base'    => ROOT_PATH . 'template/',
    ],

在template关联数组末尾加一句view_base的关联

    'view_base'    => ROOT_PATH . 'template/',

3.数据库设计

image.png

t_gr_是表前缀,总共有四张表。
qsn_model表用来存储题目的模板数据
qsn用来存储每套模板下的题目数据
qsn_detail用来存储用来存储每个题目对应选型的数据
psg_qsn_r用来存储用户答题的数据

今天的主角是qsn_model表


image.png
image.png

四个字段,主键(model_id),模板名称(name),模板创建时间(time),创建人名称(create_name)。

4.View层实现(Jquery+layui)

首先是添加模板的View层实现。

image.png

引用了layui的按钮组样式 id为btn-add的按钮 即为添加模板按钮


image.png

点击添加模板 我们用Jquery设置其弹出了一个layui的弹出层 id为set-add-put

            //弹出添加窗口
            $('#btn-add').click(function() {
                layer.open({
                    type: 1,
                    skin: 'layui-layer-rim', //加上边框
                    area: ['660px', '350px'], //宽高
                    content: $('#set-add-put'),
                    title: "添加模板"
                });
            });

如下

image.png

input框有三个,分别对应数据库的create_name,time,name。

 <!--添加弹出层-->
    <div id="set-add-put" style="display:none; width:550px; padding:20px;">
        <form class="layui-form">
            <div class="layui-form-item">
                <label class="layui-form-label">创建人名字</label>
                <div class="layui-input-block">
                    <input type="text" name="create_name" required lay-verify="required" placeholder="请输入创建人姓名" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">创建时间</label>
                <div class="layui-input-block">
                    <input type="text" name="time" required lay-verify="required" placeholder="请输入创建时间" autocomplete="off" class="layui-input" id="time">
                </div>
            </div>
            <div class="layui-form-item">
                <label class="layui-form-label">模板名称</label>
                <div class="layui-input-block">
                    <input type="text" name="name" required lay-verify="required" placeholder="请输入模板名称" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-form-item">
                <div class="layui-input-block">
                    <button type="button" class="layui-btn" lay-submit lay-filter="formDemo" id="add">立即添加</button>
                    <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                </div>
            </div>
        </form>
    </div>

然后,我们数据点击立即添加按钮,id为add。我们对其用Jquery进行ajax请求。

 //添加数据
            $('#add').click(function() {
                var create_name = $('input[name="create_name"]').val(); //获取值
                var name = $('input[name="name"]').val();
                var time = $('input[name="time"]').val();
                if (create_name !== '') {
                    //打开正在加载中弹出层
                    layer.msg('加载中', {
                        icon: 16,
                        shade: 0.01,
                        time: '9999999'
                    });
                    var url = "{:url('survey/add_qsn')}";
                    var data = {
                        create_name: create_name,
                        name: name,
                        time: time
                    }
                    $.post(url, data, function(data) { //使用ajax提交
                        layer.closeAll();
                        if (data.code == 1) { //这里的code对应返回的状态码
                            layer.msg(data.msg, {
                                icon: 6
                            });
                            location.reload();
                        } else {
                            layer.msg(data.msg, {
                                icon: 5
                            });
                        }
                    }, "json");
                }
            });

提交的data,就是我们输入框获取的三个值,create_name,name,time。
提交到Controller层,如果返回的数据状态码为代表成功的1,则刷新整个页面,否则,提示错误。

然后我们看看Controller层的代码。

5.Controller层实现

首先我在application目录下的common.php文件定义了一个公共方法,用来返回json格式数据给View层。

<?php
// 应用公共文件

function returnjson($arr_data){
    $arr = array(
        'code' => $arr_data['0'],
        'msg'  => $arr_data['1'],
        'data' => $arr_data['2']
    );
    if(!isset($arr_data['2'])){
        unset($arr['data']);
    }
    if(!isset($arr_data['1'])){
        unset($arr['msg']);
    }
    echo json_encode($arr);exit;
}

返回的数据有三个,code状态码,msg信息,data返回的数据。

然后看survey.php下的add_qsn方法:

 //新增
    public function add_qsn()
    {
        $data['create_name'] = input('post.create_name'); //thinkPHP中的助手函数,我们用ajax提交的数据
        $data['name'] = input('post.name');
        $data['time'] = input('post.time');
        $data['model_id'] = uniqid('model', true);//使用uniqid形成一个特定唯一的model_id
        if (empty($data['create_name'])) {//查询创建人是否为空
            returnjson([3, 'warning1', '']);
        }
        //查询model_id 是否重复 模板不存在的话 就能添加此条记录
        $chk_model_id = db('qsn_model')->where('create_name', $data['create_name'])->find($data);
        if (empty($chk_model_id)) {
            //插入数据库
            $insert = db('qsn_model')->insert($data);
            if ($insert) {
                returnjson([1, '添加成功', '']);
            } else {
                returnjson([2, '添加失败', '']);
            }
        } else {
            returnjson([3, '该数据已存在', '']);
        }
    }

我这里用了TP5提供的助手函数,熟悉PHP的话,应该会知道_GET和_POST,这里就是对应$_POST,TP5对这两个函数形成了助手函数,防止一些SQL注入等安全因素带来的隐患。
此外,还有一个封装的returnjson方法,对我们返回的状态码,数据,msg进行规范操作。

function returnjson($arr_data){
    $arr = array(
        'code' => $arr_data['0'],
        'msg'  => $arr_data['1'],
        'data' => $arr_data['2']
    );
    if(!isset($arr_data['2'])){
        unset($arr['data']);
    }
    if(!isset($arr_data['1'])){
        unset($arr['msg']);
    }
    echo json_encode($arr);exit;
}

6.功能一览

然后我们查看下我们的功能实现了没


1.gif

可以看见,列表的模板已经从2个增加到3个了。
大功告成啦,如果喜欢就给颗小吧~

此外还有对应的
答题管理系统二:模板删除功能

答题管理系统三:题目及选项增删功能

答题管理系统四:答题功能

答题管理系统五:统计功能

项目仅供测试学习使用,拒绝任何形式的商业用途,转侵删。
项目源码关注公众号Code In Java,回复"答题管理系统ThinkPHP版本"即可获取。除此之外,还有Java学习图谱,数据结构与算法资料等各种资料都可以在后台获取。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容