首页 > 其他分享 >图书订阅管理系统——管理员管理用户

图书订阅管理系统——管理员管理用户

时间:2022-08-29 21:26:16浏览次数:54  
标签:订阅 const .. 管理系统 console oneApply 管理员 import response

1.这是界面设计(可能有亿点丑,重在这个过程)

    

 

2.图片1

 

 当用户点击用户管理时,将进入该页面,灵活使用less、以及阿里图标库,在路由层级上,这一页与4个模块作为同级,继承主页面的footer,

 

 

 

 3.图片2

用户信息页,我通过竖向列表的形式进行展示,这是页面设计依旧是flex属性的灵活运用,组件逻辑如下:

练习这么些组件下来,已经养成了习惯:组件临时存储需要创建状态,这个组件比较简单,输入用户名,点击搜索,和数据库进行交互拿到数据返回,前端一接到数据就改变临时状态userInfo,交互统一的形式在上一节管理员管理书籍那里说过,再顺一次:

前端发送一个ajax请求(axios二次封装的)-----后端服务器通过监听端口,截取信息,通过后端注册的路由进行匹配-----调用后端XX服务的接口函数,处理数据并返回-----前端采用同步实现异步的形式 async。。。await与try。。。catch搭配,轻松获取后端返回数据,这就是大致的前后端数据处理过程。

import React, { useState } from 'react'
import IconToFirstPage from '../../../../components/IconToFirstPage'
import './style.less'
import { Input } from 'antd';
import { reqSearchUser } from '../../../../api/index-ajax';
const { Search } = Input;
export default function UserInfo() {
    const [userInfo, setUserInfo] = useState([]);
    const onSearch = async (value) => {
        console.log(value);
        try {
            const response = await reqSearchUser({ value: value });
            console.log(response)
            setUserInfo(response.data.userInfo)
        } catch (error) {
            console.log("请求错误", error)
        }
    }
    return (
        <div>
            <div className="userInfoHead">
                <IconToFirstPage />
                <div className="userInfoTitle"><span>用户信息</span></div>
            </div>
            <div className="manageUsersBody">
                <div className='search-wrapper'>
                    <div className="search">
                        <Search
                            placeholder="请输入用户名,点击搜索"
                            onSearch={onSearch}
                            style={{
                                width: 250,
                            }}
                        />
                    </div>
                </div>
            </div>
            <div className="userInfoWrapper">
                <div className='userInfoListTitle'>
                    <div className="title"><span>类别</span></div>
                    <div className="data"><span>数据</span></div>
                </div>
                {
                    userInfo.length !== 0 ? userInfo.map((userInfoObj) => {
                        return (
                            <div key={userInfoObj._id}>
                                <div className="username">
                                    <div className="title"><span>姓名</span></div>
                                    <div className="data"><span>{userInfoObj.username}</span></div>
                                </div>
                                <div className="password">
                                    <div className="title"><span>密码</span></div>
                                    <div className="data"><span>{userInfoObj.password}</span></div>
                                </div>
                                <div className="jobNum">
                                    <div className="title"><span>学工号</span></div>
                                    <div className="data"><span>{userInfoObj.jobnum}</span></div>
                                </div>
                                <div className="identify">
                                    <div className="title"><span>身份</span></div>
                                    <div className="data"><span>{userInfoObj.identify}</span></div>
                                </div>
                                <div className="phone">
                                    <div className="title"><span>联系方式</span></div>
                                    <div className="data"><span>{userInfoObj.phone}</span></div>
                                </div>
                                <div className="email">
                                    <div className="title"><span>电子邮件</span></div>
                                    <div className="data"><span>{userInfoObj.email}</span></div>
                                </div>
                            </div>
                        )
                    }):<div>暂时无数据</div>
                }
            </div>
        </div>
    )
}

4、图片3

申请列表页,主要是展示用户还在申请中的项目,需要完成用户订阅才能做,目下已经全部做完才总结这里的。它的业务逻辑是,把后端数据库里存储的用户订阅状态还在申请中订阅申请拿出来,放在前端,并进行拒绝或者同意操作。

本页,由于这些数据只是一个页面使用,并且需要不停刷新,我并没有进行本地缓存,节省本地也就是客户端localStorage资源(这个单词之前有拼错的莫介意哈)这一页的组件实现逻辑等同于3个图片2:点击按钮——发送请求(reqXXXXX)——后端处理——返回数据(ersponse)

import React, { useState } from 'react'
import IconToFirstPage from '../../../../components/IconToFirstPage'
import './style.less'
import { Button } from 'antd'
import { reqagreeSub, reqGetApplyList, reqrejectSub } from '../../../../api/index-ajax';
export default function ApplyList() {
    const [applyList, setapplyList] = useState([]);
    const toShift = async () => {
        let username = document.getElementsByClassName("username1")[0];
        if(username.value==='') alert("您尚未填写您想查询的用户名,直接刷新将返回所有数据")
        try {
            const response = await reqGetApplyList({ value: username.value });
            console.log(response)
            setapplyList(response.data.data)
        } catch (error) {
            console.log("请求错误", error)
        }
    }
    console.log(JSON.parse(localStorage.getItem('userInfo')).username)
    const rejectSub = async(oneApply)=>{
        const response = await reqrejectSub({applyPerson:oneApply.applyPerson,applyBook:oneApply.applyBook,optionPerson:JSON.parse(localStorage.getItem('userInfo')).username});
        console.log(response)
        alert(response.data.msg);
    }
    const agreeSub = async(oneApply)=>{
        const response = await reqagreeSub({applyPerson:oneApply.applyPerson,applyBook:oneApply.applyBook,optionPerson:JSON.parse(localStorage.getItem('userInfo')).username});
        console.log(response)
        alert(response.data.msg);
    }
    return (
        <div>
            <div className="applyListHeader">
                <IconToFirstPage />
                <div className="applyListTitle">
                    <span>申请列表</span>
                </div>
            </div>
            <div className="applyListBody">
                <div className="title-data">
                    <div className="applyListBodyTitle">
                        <div className="applyPerson"><span>申请人</span></div>
                        <div className="applyBook"><span>申请书籍</span></div>
                        <div className="applyBookTime"><span>申请时间</span></div>
                        <div className="subStartTime"><span>订阅开始</span></div>
                        <div className="subEndTime"><span>订阅结束</span></div>
                        <div className="option"><span>操作</span></div>
                    </div>
                    <div className="applyListwrapper">
                        {
                            applyList.length !== 0 ? applyList.map((oneApply) => {
                                return (
                                    <div className="applyListData" key={oneApply._id}>
                                        <div className="applyPerson"><span>{oneApply.applyPerson}</span></div>
                                        <div className="applyBook"><span>{oneApply.applyBook}</span></div>
                                        <div className="applyBookTime"><span>{oneApply.applyBookTime}</span></div>
                                        <div className="subStartTime"><span>{oneApply.subStartTime}</span></div>
                                        <div className="subEndTime"><span>{oneApply.subEndTime}</span></div>
                                        <div className="option"><Button type="primary" htmlType="submit" onClick={()=>agreeSub(oneApply)}>同意</Button><Button type="primary" htmlType="submit" onClick={()=>rejectSub(oneApply)}>拒绝</Button></div>
                                    </div>
                                )
                            }) : <div>暂无数据</div>
                        }
                    </div>
                </div>
            </div>
            <div className="shift">
                <input type="text" className='username1' placeholder='用户名: ' />
                <Button type="primary" htmlType="submit" onClick={() => toShift()}>
                    刷新
                </Button>
            </div>
        </div>
    )
}

5.图片4

 订阅流水,管理员可以返回所有的订阅记录,也可以用户名筛选。不做本地缓存,管理员刷新,就会将数据显示。实现逻辑依旧和上面一样。

 

总结一下:

1.页面设计上的不足,我是一个人做,所以设计如此,这个是可以后天跟上的,进了公司,做的多了,自然就广阔了,主要是组件的灵活穿梭和信息传递;个人觉得本地localStorage应该慎用,存储一些即时性的数据、就算是缓存清理了,数据库里也能拿的数据,根据需要,有时候能减少访问数据库的频率,能提高性能。

2.这一节主要是点击按钮——发送请求(reqXXXXX)——后端处理——返回数据(ersponse),没有过复杂的逻辑。

 

搜索

复制

<iframe></iframe> import React, { useState } from 'react' import IconToFirstPage from '../../../../components/IconToFirstPage' import './style.less' import { Button } from 'antd' import { reqagreeSub, reqGetApplyList, reqrejectSub } from '../../../../api/index-ajax'; export default function ApplyList() {     const [applyList, setapplyList] = useState([]);     const toShift = async () => {         let username = document.getElementsByClassName("username1")[0];         if(username.value==='') alert("您尚未填写您想查询的用户名,直接刷新将返回所有数据")         try {             const response = await reqGetApplyList({ value: username.value });             console.log(response)             setapplyList(response.data.data)         } catch (error) {             console.log("请求错误", error)         }     }     console.log(JSON.parse(localStorage.getItem('userInfo')).username)     const rejectSub = async(oneApply)=>{         const response = await reqrejectSub({applyPerson:oneApply.applyPerson,applyBook:oneApply.applyBook,optionPerson:JSON.parse(localStorage.getItem('userInfo')).username});         console.log(response)         alert(response.data.msg);     }     const agreeSub = async(oneApply)=>{         const response = await reqagreeSub({applyPerson:oneApply.applyPerson,applyBook:oneApply.applyBook,optionPerson:JSON.parse(localStorage.getItem('userInfo')).username});         console.log(response)         alert(response.data.msg);     }     return (         <div>             <div className="applyListHeader">                 <IconToFirstPage />                 <div className="applyListTitle">                     <span>申请列表</span>                 </div>             </div>             <div className="applyListBody">                 <div className="title-data">                     <div className="applyListBodyTitle">                         <div className="applyPerson"><span>申请人</span></div>                         <div className="applyBook"><span>申请书籍</span></div>                         <div className="applyBookTime"><span>申请时间</span></div>                         <div className="subStartTime"><span>订阅开始</span></div>                         <div className="subEndTime"><span>订阅结束</span></div>                         <div className="option"><span>操作</span></div>                     </div>                     <div className="applyListwrapper">                         {                             applyList.length !== 0 ? applyList.map((oneApply) => {                                 return (                                     <div className="applyListData" key={oneApply._id}>                                         <div className="applyPerson"><span>{oneApply.applyPerson}</span></div>                                         <div className="applyBook"><span>{oneApply.applyBook}</span></div>                                         <div className="applyBookTime"><span>{oneApply.applyBookTime}</span></div>                                         <div className="subStartTime"><span>{oneApply.subStartTime}</span></div>                                         <div className="subEndTime"><span>{oneApply.subEndTime}</span></div>                                         <div className="option"><Button type="primary" htmlType="submit" onClick={()=>agreeSub(oneApply)}>同意</Button><Button type="primary" htmlType="submit" onClick={()=>rejectSub(oneApply)}>拒绝</Button></div>                                     </div>                                 )                             }) : <div>暂无数据</div>                         }                     </div>                 </div>             </div>             <div className="shift">                 <input type="text" className='username1' placeholder='用户名: ' />                 <Button type="primary" htmlType="submit" onClick={() => toShift()}>                     刷新                 </Button>             </div>         </div>     ) }

标签:订阅,const,..,管理系统,console,oneApply,管理员,import,response
From: https://www.cnblogs.com/qiao-16/p/16637385.html

相关文章

  • vue——消息订阅与发布(pubsub)
    一.消息订阅与发布:一种组件间通信的方式,适用于任意组件间通信订阅消息:设置消息名==>接收数据的组件进行订阅消息发布消息:传递消息内容==>传递数组的组件进行发布消......
  • P3955 [NOIP2017 普及组] 图书管理员
    P3955[NOIP2017普及组]图书管理员-洛谷|计算机科学教育新生态(luogu.com.cn)  #include<iostream>#include<cstdio>#include<cstring>#include<algorithm......
  • [ROS学习]7. 订阅者Subscriber的编程实现
    笔记参考:【ROS学习笔记】7.订阅者Subscriber的编程实现(C++和Python)基于B站ROS公开课:【古月居】古月·ROS入门21讲基于Ubuntu20.04.1、Noetic版本(部分图摘自:b站【古月居......
  • wx小程序订阅消息概念和应用场景理解(一次性消息一定要人手动触发)
     订阅消息(一次性订阅)和模板消息的区别 原小程序模板消息接口于2020年1月10日下线  订阅消息的特点1. 开发者订阅一次后,只能为其下发一条消息(没有效量限制,将交由......
  • C++停车场管理系统
    C++停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只......
  • c++实现通讯录管理系统
    利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄,联系电话、家庭住址)最多记录1000人显示联系人:显......
  • MFC高校职工信息管理系统
    MFC高校职工信息管理系统6.9高校职工信息管理系统课程设计任务书一、任务开发“高校职工信息管理系统”软件。二、基本要求使用面向对象的系统分析和设计,开发基于MF......
  • 学习:python 综合训练 超市商品管理系统 数据库版
                 ......
  • Spring Boot 2.x基础教程:使用Redis的发布订阅功能
    通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K、V存储的高性能缓存。接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定......
  • 开源任务管理系统:创建一个任务
    GitHub地址:https://github.com/dom-bro/task-manager虽说是一个任务管理系统,但简单地讲,其实就是任务的增删改查(CRUD)。其中最重要的又当属增,即创建任务,此为数据之源,......