后台管理系统窗体程序:文章管理 > 文章列表

目录

文章列表的的功能介绍:

        1、进入页面

        2、页面内的各种功能设计

        (1)文章表格

        (2)删除按钮

        (3)编辑按钮

        (4)发表文章按钮

        (5)所有分类下拉框

        (6)关键字检索

        (7)所有状态下拉框

        (8)筛选按钮

        (9)页面底部的页码跳转

一、网页设计

二、HTML代码

三、css代码

四、js代码


 

本次项目为后台管理系统,在本系统内的第四个界面为窗体程序内的文章列表页面,作为首页内大分类下的小分类项目,需要和首页进行联合

文章列表的的功能介绍:

在进行本页面时,我们将进行多个功能的串联

        1、进入页面

        在首页进入时需要变换分类的样式,使用排他思想即可进行该项操作,而在大分类展开小分类的事件中使用基础动画效果即可

        2、页面内的各种功能设计

        (1)文章表格

        由于数据库的调取,我们需要实时对表格进行更改,此时就要进行以下思路:

调取数据 > 渲染表格 > 用户操作数据 > 数据库接受更改,并存储 > 调取数据  >重新渲染表格

在调取接口时,使用拼接表格操作,将需要调取的数据直接进行渲染。

        在调取数据库内的数据时,会同时返回数据量和多种数据,根据调用接口的不同来确定返回数据

        (2)删除按钮

        需注意每条数据在数据库和网页都具有一个唯一的标识符,该行的重点在于点击按钮时告知数据库删除的标识符,并返回数据。在后端数据库更改完数据后我们再次对表格进行渲染,以调取删除后的数据来完成该次操作。

        在编写代码时,我们需注意前端注重的交互体验,即人机交互体验,类似于删除时提醒用户是否删除,告知删除是否完成等操作。

        即注重用户体验也是前端的主要目标之一。

        (3)编辑按钮

        在要求中我们确定编辑按钮作为跳转按钮存在,将跳转到发表文章大分类内进行编辑,但是需要注意的是我们再跳转该网页的同时要附带我们点击编辑时所点击的编辑选项的唯一标识符,作为下个页面内渲染数据的支持

        (4)发表文章按钮

        发表文章按钮同理但是不做携带唯一标识符的处理

        (5)所有分类下拉框

        该下拉框会有专门的接口为我们进行调取来选择本身有的分类选项和后续我们添加的分类选项

        (6)关键字检索

        该处不做交互设计,我们只需要在其中写入数值让其他操作能读取到其中的内容并接收即可

        (7)所有状态下拉框

        该处也不做特殊处理,需要注意某些类似于布尔值一般的对错二选一,我们一般不使用接口进行特殊渲染,而是对其进行选择操作,即返回他们的值然后接收

        (8)筛选按钮

        该处按钮的设计将会返回三个值,分别是关键字检索,所有分类下拉框,所有状态下拉框

即我们的接口将调用多项值,在代码设计中我们将会获取其中的值并返回数据库,然后接收数据库修改后返回的值。

        (9)页面底部的页码跳转

        该处我们需获取表格后对总页数进行显示(后端会返还页数和每页条目消息),获取并写入跳转页等操作

当我们对于这些基础功能进行一些简单的说明和归类后我们就可以开始进行该页面的项目编写

一、网页设计

二、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/reset.css">
    <link rel="stylesheet" href="./CSS/article.css">

</head>

<body>
    <!-- 在该处代码完成iframe中的头部和选择区域 -->
    <div class="header" id="header">文章列表</div>
    <div class="main" id="main">
        <input type="text" class="maintext" id="maintext" placeholder="请输入关键字···">
        <select name="" id="mainselect1" value="">
            <option value="" selected>所有分类</option>

        </select>

        <select name="" id="mainselect2" value="">
            <option value="" selected>所有状态</option>
            <option value="已发布">已发布</option>
            <option value="草稿">草稿</option>


        </select>

        <button class="mainbtn" id="mainbtn">筛选</button>

        <button class="mainpublish" id="mainpublish">发表文章</button>
    </div>

    <!-- 此处是表格渲染的区域 -->
    <div class="btm">
        <table>
            <thead>

                <th id="title">标题</th>
                <th id="author">作者</th>
                <th id="classify">分类</th>
                <th id="submission">提交时间</th>
                <th id="state">状态</th>
                <th id="operate">操作</th>
            </thead>
            <tbody>

            </tbody>
        </table>

        <!-- 该处是页码中跳转按钮和页码变化的按钮 -->
        <div class="foot">
            <span class="btmup" id="btmup">上一页</span>
            <input type="text" class="btmtext" id="btmtext">
            <span style="background-color: white;" id="btmt"></span>
            <span class="btmload" id="btmload">跳转</span>
            <span class="btmdown" id="btmdown">下一页</span>
        </div>

    </div>





</body>
<script src="./JS/jquery.min.js"></script>
<script src="./JS/move.js"></script>
<script src="./JS/article.js"></script>


</html>

三、css代码

button{
    cursor: pointer;
}
body
{
    font-size: 16px;
    background-color: #f2f3f5;
}
.header
{
    width: 88vw;
    height: 4vh;
    background-color: #fbfbfb;
    margin: 3vh auto;
    margin-bottom: 0px;
    line-height: 4vh;
    border: 1px solid #a2a2a3;
    padding-left: 2vw;
}
.main   
{        
    color: #5b5b5b;
    font-size: 13px;
    width: 88vw;
    background-color: #ffffff;
    margin: 0vh auto;
    border: 1px solid #a2a2a3;
    border-top: none;
    padding: 2vh 1vw;
    position: relative;
}
.maintext
{
    padding-left: 5px;
    height: 20px;
    width: 150px;
    outline: none;
    margin: 0px 10px;
}
#mainselect1 , 
#mainselect2
{
    height: 24px;
    width: 100px;
    padding-left: 5px;
    margin-right: 10px;
    cursor: pointer;
}

.mainbtn
{
    background-color: white;
    border: 1px solid #5b5b5b;
    height: 24px;
    width: 50px;
    border-radius: 3px;
}

.mainpublish
{
    background-color: #5cb85c;
    border: none;
    height: 24px;
    width: 70px;
    color: white;
    border-radius: 3px;
    position: absolute;
    right: 20px;
}


.btm   
{        height: 75vh;
    color: #5b5b5b;
    font-size: 13px;
    width: 88vw;
    background-color: #ffffff;
    margin: 3vh auto;
    margin-top: 0px;
    border: 1px solid #a2a2a3;
    border-top: none;
    padding: 2vh 1vw;
    position: relative;
}




table
{
    border: 1px solid #a2a2a3;
    border-collapse: collapse;
    font-size: 14px;
}
th ,td{
    border: 1px solid #a2a2a3;
    height: 40px;
    
}
td
{
    padding:0px  10px;
}


#title
{
    width: 50vw;
}
#author
{
    width: 8vw;
}

#classify
{
    width: 12vw;
}
#submission
{
    width: 10vw;
}
#state
{
    width: 10vw;

}
#operate
{
    width: 12vw;
}






.btm span{
    padding: 10px 20px;
    background-color: #c5c5c5;
    border-radius: 10px;
    cursor: pointer;

}
.btmtext{
    min-width: 20px;
    max-width: 50px;
    /* padding-left: 5px; */
    text-align: center;
    outline: none;   
    height: 30px;
}
.foot
{
    position: absolute;
    bottom: 20px;
    left: 50%;
    margin-left: -140px;
}



.btn1
{
    background-color: #ffcb8b;
    border: 1px solid #3a3a3a;
    width: 50px;
    height: 25px;
    color: black;
    font-size: 12px;
    border-radius: 5px;
}
.btn2
{
    background-color: #d9534f;
    border: 1px solid #3a3a3a;
    width: 50px;
    height: 25px;
    color: white;
    border-radius: 5px;
    font-size: 12px;
}

四、js代码

// 定义文章的跳转页面初始在第一页
var page = 1

// 定义后端数据库返回的总页数的变量
var totalpage


// 定义状态的值
var state = ""

// 定义分类的值
var type = ""

// 定义文章列表内的唯一标识符的id值被赋值的对象
var index

// 定义关键字检索的值
var key = ""


//获取文章列表分类的具体数据并对其进行渲染
getlist()

//获取文章列表表格数据并渲染
getTable()

//上一页
$("#btmup").on("click", function () {
    //点击时值是否小于正常页数的最小值
    if (page > 1) {
        // 如果不小于则在需要减少时进行自减
        page--
        //并重新将赋值给page,同时进行表格的再次渲染,使之前写入的page值发生改变已做到改变渲染的页面
        getTable()
    } else {
        //如果是小于最小值则提示用户已经是首页
        alert("已经是首页")
    }

})


//下一页
$("#btmdown").on("click", function () {
    //点击时值是否大于正常页数的最大值
    if (page < totalpage) {
        //如果不大于则进行自增
        page++
        //并重新将赋值给page,同时进行表格的再次渲染,使之前写入的page值发生改变已做到改变渲染的页面
        getTable()
    }
    else {
        //如果大于最大值则提示用户已经是尾页
        alert("已经是尾页")
    }


})



//跳转
$("#btmload").on("click", function () {
    //获取到输入的值,并对其中可能出现的浮点数进行向下取整处理
    //同时对其进行使用变量代替
    var text = Math.floor($("#btmtext").val())

    // 当变量在我们后端数据库返回的正常页数内时
    if (text <= totalpage && text > 0) {
        // 我们将需要跳转的数赋值给page
        page = text;
        // 同时进行表格的再次渲染,使之前写入的page值发生改变已做到改变渲染的页面
        getTable()
    }
    // 如果我们获取到的值已经超过了正常页数
    else {
        //则提示用户输入正确的页数
        alert("请输入正确的页数")
        //同时对我们的输入框进行清空并返回第一页,且再次对表格进行渲染来完成刷新
        $("#btmtext").val("")
        $("#btmtext").val(1)
        getTable()
    }
})

//删除按钮事件
//通过事件委托的形式,在点击时通过父元素来获取到我们点击的元素
$("tbody").on("click", "#btn2", function () {
    // 定义一个选择提示框,提醒用户是否确定删除
    var r = confirm("确定要删除吗")
    // 在此我们获取到该删除按钮父级元素th的父级元素tr,即该行的唯一标识符
    index = $(this).parents().parents().attr("index")
    // 如果我们获取到选择提示框的值是true
    if (r) {
        // 开始调用接口
        $.ajax({
            // 接口地址
            url: "http://localhost:8080/api/v1/admin/article/delete",
            // 请求方式
            type: "post",
            // 请求头
            headers: {
                "Authorization": sessionStorage.getItem("token")
            },
            // 请求体
            data: {
                id: index
            },
            // 请求成功
            success(res) {
                //获取msg的值来判断后端数据库返回值的值是否为我们需要的值
                if (res.msg == "文章删除成功") {
                    // 重新获取表格数据并渲染
                    getTable()
                    // 并对用户提示该处文章删除成功
                    alert("已删除该文章")
                }
            },
            // 请求失败
            error(err) {
                console.log(err)
            }
        })
    }
})




//筛选按钮点击事件
$("#mainbtn").on("click", function () {
    //该处重新对page值进行重置,防止我们再进行筛选时,我们之前的page值还在
    page = 1
    // 调取接口
    $.ajax({
        // 接口地址
        // 需注意此时我们的接口返回的值将会对关键字检索,分类选择,状态选择,页数选择,每页显示条数进行筛选
        url: "http://localhost:8080/api/v1/admin/article/query?key=" + key + "&state=" + state + "&type=" + type + "&page=" + page + "&perpage=10",
        //请求方式    
        type: "get",
        // 请求头
        headers: {
            "Authorization": sessionStorage.getItem("token")
        },
        // 请求成功
        success(res) {
            // 我们的的变量将获取到我们在筛选页面的筛选条件的具体值
            state = $("#mainselect2").val()
            type = $("#mainselect1").val()
            key = $("#maintext").val()
            // 同时对表格进行重新渲染
            getTable()
        },
        // 请求失败
        error(err) {
            // 返回错误
            console.log(err);
        }
    })
})




//编辑跳转到发表文章页面
//注意我们的表格内容是使用渲染的方式进行的,我们通过点击事件来获取到我们点击的元素,
$("tbody").on("click", "#btn1", function () {
    //获取到我们点击的元素,即该行的唯一标识符
    index = $(this).parents().parents().attr("index")
    //并将该行的唯一标识符赋值给index,且在跳转时将该标识符进行携带,以实现跳转至编辑页面时我们对于数据的渲染的准确性
    //在对跳转时我吗们使用location.href来进行跳转,并直接将变量拼接到跳转地址中
    location.href = `./publish.html?id=` + index
    // console.log(`./publish.html?id=` + index);

})

//发表文章按钮的点击事件
$("#mainpublish").on("click", function () {
    // 由于不需要携带数据,所以直接跳转即可
    location.href = `./publish.html`
})










//表格的渲染,由于需要不断的调用,并且需要在页面开始的时候进行一次渲染,所以将其写成一个封装函数
function getTable() {
    // 调取接口
    $.ajax({
        // 接口地址
        // 需注意此时我们的接口返回的值将会对关键字检索,分类选择,状态选择,页数选择,每页显示条数进行筛选
        url: "http://localhost:8080/api/v1/admin/article/query?key=" + key + "&state=" + state + "&type=" + type + "&page=" + page + "&perpage=10",
        // 请求方式
        type: "get",
        // 请求头
        headers: {
            "Authorization": sessionStorage.getItem("token")
        },
        // 请求成功
        success(res) {
            // 此处编写代码时可在控制台获取到所需的数据,但一般省略
            // console.log(res)
            // 在msg中获取到数据获取成功时
            if (res.msg == "数据获取成功") {
                // 先对总页数进行获取并渲染
                $("#btmt").html("共 " + res.data.totalPage + " 页")

                // 声明一个需要进行拼接前的空字符串,且注意带变量为局部变量
                var str = ""

                totalpage = res.data.totalPage

                // 将获取到的对象组成的伪数组进行声明变量并赋值
                var arr = res.data.data
                //遍历该数组
                for (var item of arr) {
                    //在获取到值之后将其进行拼接,并对其加入一个可以在全局读取的唯一标识符
                    //注意此处我们使用的是item.id,即我们获取到的对象中的id值,该值在后端数据库中为唯一的数据标识符
                    str += `<tr index=${item.id}>
                    <td>${item.title}</td>
                    <td style="text-align: center;">${item.author}</td>
                    <td style="text-align: center;">${item.category}</td>
                    <td style="text-align: center;">${item.date}</td>
                    <td style="text-align: center;">${item.state}</td>
                    <td style="text-align: center;">

                    <button class="btn1" id="btn1">编辑</button>
                    <button class="btn2" id="btn2">删除</button>
                    </td>
                    </tr>
                    `
                    // 同时写入两个按钮,一个为编辑,一个为删除
                }
                // 将拼接后的字符串写入表格中
                $("tbody").html(str)

                //表格的样式,即对表格各行换色
                $("tr:odd").css("background", "#f5f5f5")
            }
        },
        // 请求失败
        error(err) {
            // 返回错误
            console.log(err);
        }
    })

    //渲染表格后写入当前page值代表的页数
    $("#btmtext").val(page)

}



//分类的提取,由于需要不断的调用,并且需要在页面开始的时候进行一次渲染,所以将其写成一个封装函数
function getlist() {
    // 调用接口 
    $.ajax({
        // 接口地址
        url: "http://localhost:8080/api/v1/admin/category/list",
        // 请求方式
        type: "get",
        // 请求头
        headers: {
            "Authorization": sessionStorage.getItem("token")
        },
        // 请求成功
        success(res) {
            // console.log(res)
            if (res.msg == "获取成功") {
                // 声明一个变量进行拼接
                var str = ""
                var arr = res.data
                //先拼接一个默认选中且不再数据库内的全选选项
                str += `
                     <option value="" selected > 所有分类</option >
                    `
                for (var item of arr) {
                    //遍历并拼接分类数据
                    str += `
                     <option value="${item.id}">${item.name}</option>
                    `
                }
                //将其写入下拉框中
                $("#mainselect1").html(str)
            }

        },
        // 请求失败
        error(err) {
            // 返回错误
            console.log(err);

        }
    })
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913215.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【万字详解】如何在微信小程序的 Taro 框架中设置静态图片 assets/image 的 Base64 转换上限值

设置方法 mini 中提供了 imageUrlLoaderOption 和 postcss.url 。 其中&#xff1a; config.limit 和 imageUrlLoaderOption.limit 服务于 Taro 的 MiniWebpackModule.js &#xff0c; 值的写法要 &#xff08;&#xff09;KB * 1024。 config.maxSize 服务于 postcss-url 的…

基于STM32通过TM1637驱动4位数码管详细解析(可直接移植使用)

目录 1. 单位数码管概述 2. 对应编码 2.1 共阳数码管 2.2 共阴数码管 3. TM1637驱动数码管 3.1 工作原理 3.1.1 读键扫数据 3.1.2 显示器寄存器地址和显示模式 3.2 时序 3.2.1 指令数据传输过程&#xff08;读案件数据时序&#xff09; 3.2.2 写SRAM数据…

数字信号处理Python示例(11)生成非平稳正弦信号

文章目录 前言一、生成非平稳正弦信号的实验设计二、生成非平稳正弦信号的Python代码三、仿真结果及分析写在后面的话 前言 本文继续给出非平稳信号的Python示例&#xff0c;所给出的示例是非平稳正弦信号&#xff0c;在介绍了实验设计之后给出Python代码&#xff0c;最后给出…

Linux 系统结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它…

网络安全之SQL初步注入

一.字符型 平台使用pikachu $name$_GET[name]; ​ $query"select id,email from member where username$name"; 用户输入的数据会被替换到SQL语句中的$name位置 查询1的时候&#xff0c;会展示username1的用户数据&#xff0c;可以测试是否有注入点&#xff08;闭…

【IEEE/EI会议】第八届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2025)

会议通知 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a;中国南京 会议官网&#xff1a;www.aemcse.org 会议简介 第八届先进电子材料、计算机与软件工程国际学术会议&#xff08;AEMCSE 2025&#xff09;由南京信息工程大学主办&#xff0c;将于2025年4月25日…

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)

华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目分享——共九套&#xff08;每套四十题&#xff09; 岗位——芯片与器件设计工程师 岗位意向——模拟芯片 真题题目分享&#xff0c;完整题目&#xff0c;无答案&#xff08;共8套&#xff09; 实习岗位…

Python——数列1/2,2/3,3/4,···,n/(n+1)···的一般项为Xn=n/(n+1),当n—>∞时,判断数列{Xn}是否收敛

没注释的源代码 from sympy import * n symbols(n) s n/(n1) print(数列的极限为&#xff1a;,limit(s,n,oo))

104、Python并发编程:基于事件Event实现多线程间的同步

引言 继续介绍关于多线程同步的实现方式&#xff0c;本文将介绍基于Event的线程同步方式。 本文的主要内容有&#xff1a; 1、什么是Event 2、Event的使用场景 3、Event的代码实例 4、Event与Condition的比较 什么是Event 在Python的多线程编程中&#xff0c;Event是一个…

首次超越扩散模型和非自回归Transformer模型!字节开源RAR:自回归生成最新SOTA!

文章链接&#xff1a;https://arxiv.org/pdf/2411.00776 项目链接&#xff1a;https://yucornetto.github.io/projects/rar.html 代码&模型链接&#xff1a;https://github.com/bytedance/1d-tokenizer 亮点直击 RAR&#xff08;随机排列自回归训练策略&#xff09;&#x…

IDEA在编译时: java: 找不到符号符号: 变量 log

一、问题 IDEA在编译的时候报Error:(30, 17) java: 找不到符号符号: 变量 log Error:(30, 17) java: 找不到符号 符号: 变量 log 位置: 类 com.mokerson.rabbitmq.config.RabbitMqConfig 二、解决方案 背景&#xff1a;下载其他同事代码时&#xff0c;第一次运行&#xff0c…

【Hadoop实训】Hive 数据操作②

延续上一篇文章&#xff0c;不懂的宝子们请看以下链接&#xff1a; 【Hadoop实训】Hive 数据操作①-CSDN博客 目录 一、Group by 语句 (1)、计算emp表每个部门的平均工资 (2)、计算emp表每个部门中每个岗位的最高工资 二、Having 语句 (1)、求每个部门的平均工资 (2)、求每个…

nginx的相关命令

nginx的启用和停止有多种方式1、nginx服务的信号控制&#xff1b;2、nginx的命令行控制。 1、信号控制 ps -ef | grep nginx 可以查询跟nginx有关的所有线程。 有一个master进程和worker进程 我们作为管理员&#xff0c;只需要通过master进程发送信号来控制nginx&#xff0c…

【SpringMVC】——Cookie和Session机制

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;实践 1&#xff1a;获取URL中的参数 &#xff08;1&#xff09;PathVariable 2&…

31.校园志愿者管理系统(基于springboot和vue的Java项目)

目录 1.系统的受众说明 2.开发技术与环境配置 2.1 SpringBoot框架 2.2Java语言简介 2.3 MySQL环境配置 2.4 MyEclipse环境配置 2.5 mysql数据库介绍 2.6 B/S架构 3.系统分析与设计 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3经济可行性 3.4.1 …

Android下的系统调用 (syscall),内联汇编syscall

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 什么是系统调用 (syscall) 系统调用是操作系统提供给应用程序的一组接口&#xff0c;允许用户空间程序与内核进行交互。 在 Android&#xff08;基于 Linux …

linux-vlan

# VLAN # 1.topo # 2.创建命名空间 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns1-veth0 type veth peer name ns21-veth0 ip link add ns3-veth0 type veth peer name ns23-veth0 # 4.veth设备放入命名空间,启动接口 ip link set n…

浙江大学高等数学研究所已变样

跟我199X年春季到访相比&#xff0c;现改名为“研究院”&#xff0c;说是2017年建立的&#xff0c;刘克峰&#xff08;1965-&#xff0c;研究黎曼几何&#xff0c;加州洛杉矶大学教授&#xff09;已退位&#xff0c;励建书&#xff08;1959-&#xff0c;香港科技大学教授&#…

使用 AMD GPU 上的 Whisper 进行语音转文字

Speech-to-Text on an AMD GPU with Whisper — ROCm Blogs 2024年4月16日&#xff0c;作者&#xff1a;Clint Greene. 介绍 Whisper是由 OpenAI 开发的高级自动语音识别&#xff08;ASR&#xff09;系统。它采用了一个简单的编码器-解码器 Transformer 架构&#xff0c;其中…

统信UOS开发环境支持rust

集成了Rust编译器和包管理工具,支持系统级编程、网络应用等多场景,为开发者提供丰富的库支持。 文章目录 一、环境部署1. rust开发环境安装2. rust开发环境配置二、代码示例三、常见问题1. 借用和所有权问题2. 编译器错误和警告一、环境部署 1. rust开发环境安装 rust是一门…