P3. 创建个人中心页面

news2024/11/19 7:41:52

P3. 创建个人中心页面

    • 0 概述
    • Tips
    • 1 个人中心页面
      • 1.1 创建 Bot 表及 pojo, mapper
      • 1.2 实现 Bot 增删改查的 API
      • 1.3 实现个人中心页面前端

0 概述

  • 主要介绍了一下添加一个表(类),及其CRUD的前端和后端的实现方式,介绍的是通用的方法。

    后端的CRUD很好写,在前几节P2. 配置MySQL和用户注册登录模块已经介绍过了,因此这边只是带过。


Tips

  • 在数据库中用下划线定义字段 user_id,在 pojo 中用驼峰命名来定义属性 userId,在 queryWrapper 中还是用下划线的变量。
  • 创建数据库表字段的时候一般除了 id 设置成主键非空自增唯一,其他的一般不会设置,比如 bottitle 字段,我们可以在 service 中判断使其非空,未来如果实现草稿功能,那么是允许为空的,因此别设置死这些属性。

1 个人中心页面

1.1 创建 Bot 表及 pojo, mapper

以下字段仅供参考,创建 table, pojo, mapper 的实现在P2. 配置MySQL和用户注册登录模块介绍过了。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Bot {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private Integer userId;
    private String title;
    private String description;
    private String content;
    private Integer rating;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date createtime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
    private Date modifytime;
}

1.2 实现 Bot 增删改查的 API

同样的,根据P2. 配置MySQL和用户注册登录模块中介绍的,分别实现每个功能的 service, serviceImpl, controller 很容易写这几个功能,要注意以下几个细节:

  • 创建 bot 要判断用户传入的参数是否合法;
  • 删除 bot 要看用户是否有权限删除该 bot,且该 bot 是否存在;
  • 更新 bot 首先判断参数是否合法,bot 是否存在,用户是否有权限修改 bot,再更新当前 bot 数据;
  • 获取所有 bot 只需要根据当前登录用户的 user_id 进行查找即可;

1.3 实现个人中心页面前端

在这里插入图片描述

希望整一个上图所示的简单的样子,左边显示头像,右边显示具体的 Bot 信息,提供创建,修改,删除按钮。

整个前端页面分成以下几个步骤实现:

(1) 创建头像栏和右侧 bot 显示栏

首先创建 container 可以动态调整区域,row, col 是通过 grid 将整个 containier 分成 3 份和 9 份。

这里取出头像的方式是通过 :src="$store.state.user.photo": 表示后面是表达式,photostate 中取出。

<template>
    <div class="container">
        <div class="row">

            <div class="col-3">
                <div class="card" style="margin-top: 20px;">
                    <div class="card-body">
                        <img :src="$store.state.user.photo" alt="" style ="width: 100%;">
                    </div>
                </div>
            </div>

            <div class="col-9">
                <div class="card" style = "margin-top: 20px;">

                    <div class="card-header">
                        <span style="font-size: 130%;">
                            My Bots
                        </span>

                        <button type="button" class="btn btn-primary float-end">
                            Create Bots
                        </button>
                    </div>

                    <div class = "card-body">
                    </div>

                </div>
            </div>

        </div>
    </div>
</template>

(2) 把该用户的所有 bots 通过 api 查询出来并保存

setup() {
    const store = useStore();
    let bots = ref([]);
        
    const refresh_bots = () => {
        $.ajax({
            url: "http://127.0.0.1:3000/user/bot/getlist/",
            type: "get",
            headers: {
                Authorization: "Bearer " + store.state.user.token,
            },
            success(resp) {
                bots.value = resp;
                console.log(resp);
            }
        })
    } 

    refresh_bots();

    return {
        bots,
    }
}

(3) 把所有 bot 信息渲染出来

以表格形式显示每个 bot 信息,通过 v-for:key 可以取出来每个 bot

<div class = "card-body">
    <table class="table table-hover">
		<thead>
			<tr>
				<th>名称</th>
				<th>创建时间</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
			<tr v-for="bot in bots" :key = "bot.id">
				<td>{{ bot.title }}</td>
				<td>{{ bot.createtime }}</td>
				<td>
					<button type="button" class="btn btn-secondary" style = "margin-right: 10px;">
                    	修改
                	</button>
                	<button type="button" class="btn btn-danger">删除</button>
                </td>
            </tr>
         </tbody>
	</table>
</div>

(4) 实现创建 bot 的模态框并且绑定对象

首先要实现一个模态框,供用户输入相关信息,打开模态框的 button 和模态框通过 id 进行绑定。

vue 中对象一般用 reactive,变量一般用 ref,在 <template> 中通过 v-model 绑定变量或对象的属性。

点击创建按钮,触发 add_bug 事件,用于调试模态框及其是否绑定到对象。

<template>
	<button type="button" class="btn btn-primary float-end" 
            data-bs-toggle="modal" data-bs-target="#add-bot-btn">
        Create Bot
    </button>

    <!-- Modal -->
    <div class="modal fade" id="add-bot-btn" tabindex="-1">
        <div class="modal-dialog modal-xl">
            <div class="modal-content">

                <div class="modal-header">
                    <h5 class="modal-title">Create Bot</h5>
                    <button type="button" class="btn-close" 
                            data-bs-dismiss="modal" aria-label="Close"></button>
                </div>

                <div class="modal-body">
                    <div class="mb-3">
                        <label for="add-bot-title" class="form-label">名称</label>
                        <input v-model = "botadd.title" type="text" class="form-control" 
                               id="add-bot-title" placeholder="请输入BOT名称">
                    </div>

                    <div class="mb-3">
                         <label for="add-bot-description" class="form-label">简介</label>
                         <textarea v-model = "botadd.description" class="form-control" 
                                   id="add-bot-description" rows="3" placeholder="请输入BOT简介">
    					 </textarea>
                    </div>

                    <div class="mb-3">
                          <label for="add-bot-code" class="form-label">代码</label>
                          <textarea v-model = "botadd.content" class="form-control" 
                                    id="add-bot-code" rows="7" placeholder="请编写BOT代码"></textarea>
                    </div>
                </div>

                <div class="modal-footer">
                    <div class="error_message">{{ botadd.error_message }}</div>
                    <button type="button" class="btn btn-primary" @click = "add_bot">创建</button>
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
                </div>

            </div>
        </div>
    </div>
</template>  

<script>
export default {
    setup() {
        const botadd = reactive({
            title:"",
            description:"",
            content: "",
            error_message: "",
        }); 
        
        const add_bot = () => {
            console.log(botadd);
        }
        
        return {
            botadd,
            add_bot,
        }
    }
}
</script>

<style scoped>
div.error_message {
    color: red;
}
</style>

(5) 将创建 bot 绑定到后端 api,也就是修改上面的 add_bot 函数

这里要注意几点,首先每次记得把上次的错误信息清空;其次在创建成功之后要把所有的信息清空,方便下次创建;在创建完成之后要记得把模态框关掉 Modal.getInstance(#add-bot-btn).hide,并且要重新加载所有的 bots: refresh_bots()

Modal.getInstance(#btn_id) 通过 id 进行绑定。

另外,这里的 success 是指成功返回结果,而不是说成功创建,因此还要判断 error_message === "success"

const add_bot = () => {
	botadd.error_message = "";
	$.ajax({
		url: "http://127.0.0.1:3000/user/bot/add/",
		type: "post",
		data: {
			title: botadd.title,
			content: botadd.content,
            description: botadd.description,
        },
        headers: {
            Authorization: "Bearer " + store.state.user.token,
        },
        success(resp) {
            if (resp.error_message === "success") {
            	botadd.title = "";
                botadd.description = "";
                botadd.content = "";
                
                Modal.getInstance("#add-bot-btn").hide();
                
                refresh_bots();
          	} else {
                 botadd.error_message = resp.error_message;
          	}
    	},
	})
}

(6) 将删除功能绑定到后端 api

比较简单,不再赘述,删除成功后也要记得刷新 bot 列表。

删除需要传入参数 bot

const remove_bot = (bot) => {
	$.ajax({
		url: "http://127.0.0.1:3000/user/bot/delete/",
        type: "post",
        data: {
        	bot_id: bot.id,
        },
        headers: {
            Authorization: "Bearer " + store.state.user.token,
        },
        success(resp) {
            if (resp.error_message === "success") {
            	refresh_bots();
			}
		}
	})
}

(7) 实现修改功能的模态框并绑定后端 api

模态框和创建的类似,直接搬过来就行,但有一点要注意,每个 bot 是不同的,因此对应的模态框也要对应起来,也就是不只有一个修改模态框,而是有多个修改模态框,根据 bot_id 来绑定 :id="'update-bot-modal-' + bot.id"

<template>
<button type="button" class="btn btn-secondary" style = "margin-right: 10px;" 
        data-bs-toggle="modal" :data-bs-target="'#update-bot-modal-' + bot.id">修改</button>
                                                                        
<div class="modal fade" :id="'update-bot-modal-' + bot.id" tabindex="-1">
	<div class="modal-dialog modal-xl">
		<div class="modal-content">

            <div class="modal-header">
                <h5 class="modal-title">Update Bot</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
    		 	</button>
            </div>

            <div class="modal-body">
                <div class="mb-3">
                    <label for="update-bot-title" class="form-label">名称</label>
                    <input v-model = "bot.title" type="text" class="form-control" 
                           id="update-bot-title" placeholder="请输入bot名称">
                </div>

                <div class="mb-3">
                    <label for="update-bot-description" class="form-label">简介</label>
                    <textarea v-model = "bot.description" class="form-control" 
                              id="update-bot-description" rows="3" placeholder="请输入bot简介"></textarea>
                </div>

                <div class="mb-3">
                     <label for="update-bot-code" class="form-label">代码</label>
                     <textarea v-model = "bot.content" class="form-control" 
                               id="update-bot-code" rows="7" placeholder="请编写bot代码"></textarea>
                </div>
            </div>

            <div class="modal-footer">
                <div class="error_message">{{ update_error_message }}</div>
                <button type="button" class="btn btn-primary" @click = "update_bot(bot)">保存</button>
                <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
            </div>

		</div>
	</div>
</div>
</template>

<script>
const update_bot = (bot) => {
	update_error_message.value = "";
    $.ajax({
        url: "http://127.0.0.1:3000/user/bot/update/",
        type: "post",
        data: {
            bot_id: bot.id,
            title: bot.title, 
            description: bot.description,
            content: bot.content,
        },
        headers: {
            Authorization: "Bearer " + store.state.user.token,
        },
        success(resp) {
            if(resp.error_message === "success") {
                Modal.getInstance('#update-bot-modal-' + bot.id).hide();
                refresh_bots();
            } else {
                update_error_message.value = resp.error_message;
            }
        }
    })
}
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java面试】十五、HashMap相关

文章目录 1、二叉树1.1 二叉搜索树1.2 红黑树 2、散列表2.1 哈希冲突2.2 哈希冲突 - 链表法 3、HashMap的实现原理4、HashMap源码4.1 属性部分4.2 构造函数部分 5、HashMap的put方法的流程6、HashMap的扩容机制7、HashMap的寻址算法8、为何HashMap底层的数组长度一定是2的次幂 …

导入地址表钩取技术解析

前置知识 导入表 在一个可执行文件需要用到其余DLL文件中的函数时&#xff0c;就需要用到导入表&#xff0c;用于记录需要引用的函数。例如我们编写的可执行文件需要用到CreateProcess函数&#xff0c;就需要用到kernel32.dll文件并且将其中的CreateProcess函数的信息导入到我…

数据库管理-第198期 升级Oracle ACE Pro,新赛季继续努力(20240605)

数据库管理198期 2024-06-05 数据库管理-第198期 升级ACE Pro&#xff0c;新赛季继续努力&#xff08;20240605&#xff09;1 惊喜2 变化3 Oracle ACE总结 数据库管理-第198期 升级ACE Pro&#xff0c;新赛季继续努力&#xff08;20240605&#xff09; 作者&#xff1a;胖头鱼的…

【PCB]射频电路pcb设计

学习改变命运&#xff0c;技能成就未来&#xff01;❤~~ 1射频信号的基础知识及工作原理介绍 射频的基础知识介绍 2射频板PCB的布局要求 3射频板布局要求 4屏蔽帐设计 5射频板的层叠阻抗设计 6射频板的PCB布线原则 7射频板的PCB布线要求 8射频板的设计实战

kubeedge v1.17.0部署教程

文章目录 前言一、安装k8s平台二、部署kubeedge1.部署MetalLB(可选)2.cloud3.edge4. 部署nginx到edge端 总结参考 前言 本文主要介绍kubeedge v1.17.0的安装过程 主要环境如下表 应用版本centos7.0k8s1.28.2kubeedge1.17.0docker24.0.8centos7.0 一、安装k8s平台 本文主要参…

2024年6月1日 (周六) 叶子游戏新闻

Embracer探讨单机游戏大作涨价超过70美元的可能性在Embracer集团等待公布新公司名称的同时&#xff0c;他们对游戏大作的价格上涨做出了评论。几年来&#xff0c;游戏大作的价格已经达到了70美元的门槛。Embracer集团的CEO Lars Wingefors在采访中表示&#xff0c;电子游戏行业…

MySQL—多表查询—内连接

一、引言 &#xff08;1&#xff09;内连接查询语法 内连接查询的是两张表的交集部分的数据。&#xff08;也就是绿色部分展示的数据&#xff09; &#xff08;2&#xff09;内连接有两种形式&#xff1a; 1、隐式内连接 语法结构&#xff1a; 2、显示内连接 语法结构&#xf…

AIGC绘画设计——midjourney有哪些好用的关键词?

midjourney有哪些高级关键词&#xff1f; 这一期继续分享一些高级的关键词&#xff0c; 我有一些案例也是从其他博主那学习来的&#xff0c; 但为了尽可能不出错&#xff0c;每个案例都是自己尝试了很多次后才拿出来的。 挑选了几个效果比较好&#xff0c;使用场景较高的类型…

lux和ffmpeg进行下载各大主流自媒体平台视频

1、lux下载&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1WjGbouL3KFTU6LeqZmACpA?pwdagpp 提取码&#xff1a;agpp 2、ffmpeg下载&#xff0c;跟lux放在同一个目录&#xff1b; 3、为lux、ffmpeg设置环境变量&#xff1b; 4、WINR&#xff0c;打开运行&#xff0…

手眼标定学习笔记

目录 标定代码&#xff1a; 手眼标定原理学习 什么是手眼标定 手眼标定的目的 eye in hand eye to hand AXXB问题的求解 标定代码&#xff1a; GitHub - pumpkin-ws/HandEyeCalib 推荐博文&#xff1a; https://zhuanlan.zhihu.com/p/486592374 手眼标定原理学习 参…

nexus搭建npm前端项目的私服

一、为什么要搭建私库 节省外网带宽加速maven构建部署第三方构件&#xff08;特别是无法从公共仓库下载的构件&#xff09;提高稳定性&#xff08;内网部署&#xff0c;更少地依赖外网&#xff09;降低中央仓库的负荷 构件&#xff0c;好比我们的藏书&#xff0c;去书店或商城…

【数据库】SQL--DDL(初阶)

文章目录 DDL1. 数据库操作1.1. 表操作1.1.1 创建1.1.2. 查询 2. 数据类型及案例2.1 数值类型2.2 字符串类型2.3 日期时间类型2.4 案例练习 3. 表操作--修改3.1 添加字段3.2 修改字段3.3 修改表名 4. 表操作-删除4.1 删除字段4.2 删除表 5. DDL小结 更多数据库MySQL系统内容就在…

如何在强数据一致性要求下设计数据库的高可用架构

在高可用的三大架构设计(基于数据层的高可用、基于业务层的高可用,以及融合的高可用架构设计)中。仅仅解决了业务连续性的问题:也就是当服务器因为各种原因,发生宕机,导致MySQL 数据库不可用之后,快速恢复业务。但对有状态的数据库服务来说,在一些核心业务系统中,比如…

svn的使用

【图文详解】入职必备——SVN使用教程-CSDN博客 使用SVNBucket作为服务端,来辅助学习. 什么时候会产生冲突呢? 原本A,B,服务器的版本都一致,都是最新版. A修改文件m,向服务器提交 B修改文件m,向服务器提交,这时候出现了冲突 双击冲突的文件,手动修改

鬼畜恶搞类型的视频素材哪里找?热门搞笑素材网站分享

在当今数字媒体时代&#xff0c;寻找优质的视频素材变得尤为重要&#xff0c;尤其是对于喜欢鬼畜恶搞风格的创作者来说&#xff0c;选择合适的素材网站可以大大提升视频的吸引力和观看体验。本文将为短视频创作者和自媒体运营者介绍一些顶级的视频素材网站和工具&#xff0c;特…

方案设计|汽车轮胎数显胎压计方案

一、引言 数显轮胎胎压计是一个专门测量车辆轮胎气压的工具&#xff0c;它具有高精度测量的功能&#xff0c;能够帮助快速准确获取轮胎气压正确数值&#xff0c;保证轮胎使用安全。本文将对数显轮胎胎压计的方案技术进行分析&#xff0c;包括其基本原理、硬件构成、软件设计等方…

nvme-cli常见命令分析

一、背景 nvme-cli命令常常用于获取或者设置SSD参数&#xff0c;比如常见的nvme list&#xff0c;nvme id-ctrl等&#xff0c;都是获取SSD的基本信息&#xff0c;也有nvme admin-passthru用于读取或者设置自定义命令。作为使用者&#xff0c;我们并不知道nvme-cli源码怎么实现…

k8s怎么监听自定义资源的变更?(2)

接上一篇当生成下面代码之后怎么去使用呢&#xff1f; 1.生成crd文件 这里我们通过kubebuilder的一个子项目 controller-gen 来生成crd文件 https://github.com/kubernetes-sigs/controller-tools curl -L -o https://github.com/kubernetes-sigs/controller-tools; go ins…

关于远程销售的电子课程开发

一家国际网络安全公司委托我们开发用于培训销售代表远程和电话销售的互动电子内容。我们在 Articulate Storyline 中创建了情节脚本和二维动画&#xff0c;以解释关键概念和销售技巧。互动元素使学习者可以按照自己的节奏进行学习&#xff0c;而我们的动画插图则使材料生动起来…

【嵌入式DIY实例】-OLED显示BME280传感器数据

OLED显示BME280传感器数据 文章目录 OLED显示BME280传感器数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 开发板(ESP12-E 模块)和 BME280 气压、温度和湿度传感器构建本地气象站。 NodeMCU 从 BME280 传感器读取温度、湿度和压力值,并将它们(分别以…