2020-09-26---错题小系统

技术

Bootstrap、JavaScript、Ajax、PHP

环境

VScode、谷歌浏览器、PHPstudy(Apache、MySQL)

界面

  1. 主界面:
    在这里插入图片描述

  2. 点击添加错题:
    在这里插入图片描述

  3. 点击修改错题:
    在这里插入图片描述

功能

1.查

显示所有错题,把数据库中的错题都显示到页面。

2.增

添加错题,点击添加错题按钮后,弹出模态框,可以输入对应的内容,通过ajax内容添加到数据库中,然后再通过重载功能把内容加载到页面中。

3.删

删除错题,点击对应错题后面的删除错题按钮后,通过ajax把数据库中对应的错题删除,然后再通过前端删除节点的功能把页面中对应的错题删除

4.改

修改错题,点击对应错题后面的修改按钮,首先通过ajax把对应错题的id传到后端,查询对应的错题,把内容显示到页面中(查);然后再修改错题,之后再通过ajax把修改后的内容和对应的错题id都传到数据库,使数据库中对应错题的内容也被修改,然后前端通过重载功能把前端页面中对应的错题内容也修改。这里是改操作,一定要记得把要修改的错题id传过来,然后才能修改对应内容。(改)

数据库

在这里插入图片描述

文件结构

在这里插入图片描述

接口文档

apidoc.md

将数据库中的错题显示到页面
method : get
url :  ./php/show.php

将错题添加到数据库
method : post
url : ./php/add.php
参数:
    content  string  错题内容
    where  string  错在哪
    idea   string  想法

删除错题
method : get
url : ./php/delete.php
参数
    id  int  错题id

修改错题(获取要修改的错题的id)
method : get
url : ./php/update_select.php
参数
    id  int 错题id

修改错题
method : post
url : ./php/update.php
参数:
    id        int       错题id
    content   string    错题内容
    where     string    错在哪
    idea      string    想法 

代码

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>错题系统</title>
    <link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
    <div class="container-fluid">
        <h3>
            <span class="logo">
                <img src="http://www.qfedu.com/images/new_logo.png"/>
            </span>
            易错内容
            <button type="button" class="btn" data-toggle="modal" data-target='.wq-add'>
                <!-- 字体小图标 添加一个齿轮 -->
                <span  class="glyphicon glyphicon-cog"></span>
                添加错题
            </button>
        </h3>
        <!-- 添加错题部分 模态框显示-->
        <div class="modal fade wq-add">
            <div class="modal-dialog modal-lg">
                <div class="modal-content">
                    <!-- 细节划分 -->
                    <h4>请详细填写重点信息:</h4>
                    <div class="form-group">
                        <label for="wq-content">易错内容</label>
  						<input type="text" name="wq-content" id="wq-content" value="闭包" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label for="wq-where">错在哪</label>
                        <textarea id="wq-where" class="form-control" rows="2" cols="" placeholder="请详细描述错误位置" value="闭包的原理略有模糊现在已经了解"></textarea>
                    </div>
                    <div class="form-group">
                        <label for="wq-idea">你的想法</label>
                        <textarea id="wq-idea" class="form-control" rows="2" placeholder="你的感悟" value="闭包利用了垃圾回收机制,在每个函数执行的时候,都会产生一个活动对象,这个活动对象会在函数执行结束之后删除,但是内存的垃圾回收机制会保留已经储存的数据,该数据可查询,闭包就是利用这个原理对已经删除的数据进行查询"></textarea>
                    </div>
                    <div class="text-center">
                        <button type="button" class="btn btn-success" data-dismiss='modal' id="wq-save-question">提交</button>
                    </div>
                </div>
            </div>
        </div>
        <!-- 错题表格 -->
        <div class="table">
            <table class="table table-bordered table-hover wq-main-table">
                <!-- 错题项目 -->
                <thead>
                    <tr>
                        <th class="col-md-1-text-center">#</th>
                        <th class="col-md-3 text-center">易错内容</th>
  						<th class="col-md-3 text-center">错在哪</th>
  						<th class="col-md-3 text-center">你的想法</th>
  						<th class="col-md-1 text-conter">删除</th>
  						<th class="col-md-1 text-center">操作</th>
                    </tr>
                </thead>
                <tbody id="tbody">
                    <!-- <tr class="text-center middle">
                        <td>**索引**</td>
                        <td>**标题**</td>
                        <td>**副标题**</td>
                        <td>内容</td>
                        <td>
                            <button class="btn">删除</button>
                        </td>
                        <td>
                            <button class="btn">
                                <span class="glyphicon glyphicon-cog">修改</span>
                            </button>
                        </td>
                    </tr> -->
                </tbody>
            </table>
        </div>
    </div>



    <script src="js/jquery-1.12.4.js"></script>
    <script src="js/bootstrap.js"></script>
    <script src="js/ajax.js"></script>
    <script src="js/index.js"></script>
</body>
</html>

CSS

导入bootstrap.css文件

php

  1. 公共的php
<?php
    //设置字符集
    header('content-type:text/html;charset=utf-8');

    //连接并选择操作的数据库
    $db = mysqli_connect('localhost','root','root','day20200921');
  1. 将数据库中的错题显示到页面
<?php
    // 导入公共文件
    include 'public.php';

    //操作数据库
    //把数据库的错题显示到页面,不需要传递数据

    //查询数据库
    //编写sql语句
    $sql = 'SELECT * FROM `wqtab` WHERE 1';
    //执行sql语句
    $set = mysqli_query($db,$sql);  //结果返回一个集合  
    //转为数组
    // mysqli_fetch_array  一次只能转一条记录
    while($arr = mysqli_fetch_array($set)){
        //每转出一条记录,就放到数组中一条
        $list[] = $arr;
    }
    //将数据转为json格式返回给前端
    echo json_encode($list);
    // echo json_encode($arr);
    // echo json_encode($set);
  1. 将错题添加到数据库
<?php
    //导入公共文件
    include 'public.php';

    //添加错题

    //接收前端请求的数据
    $content = $_POST['content'];
    $where = $_POST['where'];
    $idea = $_POST['idea'];

    //操作数据库
    //编写sql语句

    // $sql = 'INSERT INTO `wqtab`(`wcontent`, `wwhere`, `widea`) VALUES ('$content','$where','$idea')';
    $sql = "INSERT INTO `wqtab`(`wcontent`, `wwhere`, `widea`) VALUES ('$content','$where','$idea')";
    //执行sql语句
    mysqli_query($db,$sql);
  1. 删除错题
<?php
    //导入外部文件
    include 'public.php';

    //接收前端的数据
    $id = $_GET['id'];

    //操作数据库;
    //编写sql语句
    $sql = "DELETE FROM `wqtab` WHERE wid=$id";

    //执行sql语句
    mysqli_query($db,$sql);
  1. 修改错题(获取要修改的错题的id)
<?php
    //导入外部文件
    include 'public.php';

    //接收前端的数据
    $id = $_GET['id'];

    //操作数据库
    //编写sql语句
    $sql = "SELECT * FROM `wqtab` WHERE wid=$id";
    //执行sql语句
    $set = mysqli_query($db,$sql);
    //转为数组
    $arr = mysqli_fetch_array($set);
    
    //转为json格式返给前端
    echo json_encode($arr);
  1. 修改错题
<?php
    //导入外部文件
    include 'public.php';

    //获取前端数据
    $id = $_POST['id'];
    $content = $_POST['content'];
    $where = $_POST['where'];
    $idea = $_POST['idea'];

    //操作数据库
    //编写sql语句
    // $sql = "UPDATE `wqtab` SET `wcontent`=$content,`wwhere`=$where,`widea`=$idea WHERE `wid`=$id";
    $sql = "UPDATE `wqtab` SET `wcontent`='$content',`wwhere`='$where',`widea`='$idea' WHERE wid=$id";

    //执行sql语句
    mysqli_query($db,$sql);

JS

  1. 导入bootstrap.js文件
  2. 导入jquery-1.12.4文件
  3. 封装ajax.js文件
let ajax = new Object();
ajax.get = function(url,fn){
    let xhr = new XMLHttpRequest();
    xhr.open('get',url,true);
    xhr.send();
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4){
            if(xhr.status === 200){
                if(fn instanceof Function){
                    fn(xhr.responseText);
                }
            }
        }
    }
}
ajax.post = function(url,data,fn){
    let xhr = new XMLHttpRequest();
    xhr.open('post',url,true);
    xhr.setRequestHeader('Content-type','Application/x-www-form-urlencoded;charset=utf-8');
    xhr.send(data);
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4){
            if(xhr.status === 200){
                if(fn instanceof Function){
                    fn(xhr.responseText);
                }
            }
        }
    }
}
  1. 编写index.js文件
//1. 获取数据库中的错题,显示到页面中。(查询)

//2. 添加错题到数据库中(增加)

//3. 删除错题 (删除)

//4. 修改错题(查询、修改)

class EQ{
    constructor(){
        this.show();
        this.add();
    }
    // <td>**索引**</td>
    // <td>**标题**</td>
    // <td>**副标题**</td>
    // <td>内容</td>
    // <td>
    //     <button class="btn">删除</button>
    // </td>
    // <td>
    //     <button class="btn">
    //         <span class="glyphicon glyphicon-cog">修改</span>
    //     </button>
    // </td>
    //1. 获取数据库中的错题,显示到页面中。(查询)
    show(){
        //获取tbody
        let o_tbody = $('#tbody');
        //获取数据库的错题
        ajax.get('./php/show.php',data => {
            //先打印一下数据,看接收回来的数据是什么类型
            console.log(data);  //数组
            //转为对象
            data = JSON.parse(data);
            console.log(data);
            //遍历数组
            data.forEach(value => {
                // console.log(value);
                //遍历出一条添加一行
                let tr = document.createElement('tr');
                tr.innerHTML = `
                    <td>${value[0]}</td>
                    <td>${value[1]}</td>
                    <td>${value[2]}</td>
                    <td>${value[3]}</td>
                    <td>
                        <button class="btn delete" data-wq-id=${value[0]}>删除</button>
                    </td>
                    <td>
                        <button class="btn update" data-wq-id=${value[0]}>
                            <span class="glyphicon glyphicon-cog">修改</span>
                        </button>
                    </td>
                `;
                // console.log(value[0]);
                // console.log(value[1]);
                // console.log(value[2]);
                o_tbody.appendChild(tr);

                //调用删除错题  因为删除按钮是在这里动态添加的
                this.delete();
                this.update();
            })
        })
    }

    //2. 添加错题到数据库中(增加)
    add(){
        //获取错题内容文本框
        let o_content = $('#wq-content');
        //获取错在哪文本框
        let o_where = $('#wq-where');
        //获取想法文本框
        let o_idea = $('#wq-idea');
        //获取提交按钮
        let o_sub = $('#wq-save-question');
        //给按钮添加点击事件
        o_sub.onclick = function(){
            let content = o_content.value;
            console.log(content);
            let where = o_where.value;
            let idea = o_idea.value;
            //content 是 后端设置的参数  ${content}是前端接收到的文本框的内容
            let data = `content=${content}&where=${where}&idea=${idea}`;
            console.log(data);
            //通过ajax传到后端
            ajax.post('./php/add.php',data,() => {
                location.reload();
            })
            
        }
    }

    //3. 删除错题 (删除)
    delete(){
        //获取所有的删除按钮
        let o_del = document.querySelectorAll('.delete');
        //给删除按钮添加点击事件
        for(let i = 0,len = o_del.length;i < len;i ++){
            o_del[i].onclick = function(){
                //获取错题id
                let id = this.getAttribute('data-wq-id');
                console.log(id);
                //通过ajax将数据库中对应id的错题删掉
                //注意格式 路径和参数之间用问号
                ajax.get('./php/delete.php?id=' + id);
                //删除页面中的错题
                this.parentNode.parentNode.remove();
            }
        }
    }

    //4. 修改错题(查询、修改)
    update(){
        //获取所有的修改按钮
        let o_upd = document.querySelectorAll('.update');
        // console.log(o_upd);
        //给修改按钮添加点击事件
        for(let i = 0,len = o_upd.length;i < len;i ++){
            o_upd[i].onclick = function(){
                //获取错题id
                let id = this.getAttribute('data-wq-id');
                console.log(id);
                //获取数据库中对应的错题
                ajax.get('./php/update_select.php?id=' + id,data => {
                    console.log(data);
                    data = JSON.parse(data);
                    //把获取到数据放到前端页面
                    //遮罩层
                    let o_mark = document.createElement('div');  
                    //放置内容的div
                    let o_float = document.createElement('div');
                    // console.log(o_mark,o_float);
                    //设置样式
                    o_mark.style.cssText = "width : 100%;height : 100%;background : black;opacity : 0.5;position : absolute;top : 0;left : 0;z-index : 9999";
                    o_float.style.cssText = "width : 500px;height : 300px;background : skyblue;opacity : 0.9;position : absolute;top : 100px;left : 500px;z-index : 10000";

                    // 添加到页面
                    document.documentElement.appendChild(o_mark);
                    document.documentElement.appendChild(o_float);
                    
                    //添加内容
                    o_float.innerHTML = `
                        <form>
                            <h3>修改错题</h3>
                            <p>错题内容:<input type = 'hidden' value = ${data[0]} id = 'id'><input type = 'text' value = ${data[1]} id = 'content'></p>
                            <p>错在哪:<input type = 'text' value = ${data[2]} id = 'where'></p>
                            <p>你的想法:<input type = 'text' value = ${data[3]} id = 'idea'></p>
                            <input type = 'button' id = 'updbtn' value = '修改'>
                        </form>
                    `;
                    

                    //获取修改按钮
                    let o_updbtn = $('#updbtn');
                    //给修改按钮添加点击事件
                    o_updbtn.onclick = function(){

                        //获取修改后的输入框的内容,放到数据库
                        // let id = $('#id').value;
                        // let content = $('#content').value;
                        // let where = $('#where').value;
                        // let idea = $('#idea').value;
                        let datas = `id=${$('#id').value}&content=${$('#content').value}&where=${$('#where').value}&idea=${$('#idea').value}`;
                        // let datas = 'id=' + id
                        // console.log(datas); 
                        ajax.post('./php/update.php',datas,() => {
                            // console.log(datas);
                            //页面重载,数据库中的错题修改之后,前端页面也对应修改
                            location.reload();
                        });
                    }
                });
                
            }
        }
    }

}
new EQ();

function $(selector){
    return document.querySelector(selector);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值