P3. 创建个人中心页面

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.rhkb.cn/news/342351.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐七款知名度非常高的数据防泄密软件

在数据防泄密软件领域&#xff0c;一些权威且知名度较高的解决方案提供商及其产品&#xff0c;凭借其强大的功能、可靠性以及广泛的市场认可度&#xff0c;成为众多企业保护敏感数据的首选。以下是一些代表性较高的数据防泄密软件。 1.安企神软件 安企神作为一款成熟的数据防泄…

如何减少Apache Spark日志的数量

修改log4j配置文件&#xff0c;没有就创建&#xff1a; 内容&#xff1a; # 设置日志记录器 log4j.rootCategoryWARN, console log4j.appender.consoleorg.apache.log4j.ConsoleAppender log4j.appender.console.targetSystem.err log4j.appender.console.layoutorg.apache.lo…

浅谈申请小程序地理位置权限的正确打开方式

小程序地理位置接口有什么功能&#xff1f; 这篇内容会教大家如何快速申请“获取当前的地理位置&#xff08;onLocationChange&#xff09;”接口&#xff0c;以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验&#xff0c;来之不易&#xff0c;望大家…

C语言(联合和枚举)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习笔记&#xff0c;在这里撰写成…

Dvws靶场

文章目录 一、XXE外部实体注入二、No-SQL注入三、Insecure Direct Object Reference四、Mass Assignment五、Information Disclosure六、Command Injection七、SQL注入 一、XXE外部实体注入 访问http://192.168.92.6/dvwsuserservice?wsdl&#xff0c;发现一个SOAP服务。在SO…

Unity 实现让物体渲染在最前面

演示 实现方案 1.创建一个shader脚本 2.删掉原来的内容&#xff1a;我们自己写 附上完整的shader代码&#xff1a; Shader "Custom/ZTestAlways" {Properties {_Color ("Color Tint",Color) (1,1,1,1)_MainTex("Main Tex",2D) "white&q…

【Python报错】已解决ModuleNotFoundError: No module named ‘timm’

成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中&#xff0c;经常会遇到各种导入模块的错误&#xff0c;其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…

使用Minikube+docker+harbor+k8s自动化部署 @by_TWJ

目录 1. 开始1.1. 环境1.2. 测试的git仓库1.3. 离线文件1.4. 安装docker1.5. 安装docker-compose&#xff08;非必要&#xff09;1.6. 安装Jenkins1.7. 安装harbor1.8. 允许docker通过http访问私有仓库1.9. 修改/etc/hosts&#xff0c;追加自定义域名1.10. 安装Minikube 2. min…

前端列表可滚动,可轮播

前端列表可滚动&#xff0c;可轮播 <ulclass"scroll-list"ref"scroll_List"mouseenter"cancelScroll()"mouseleave"autoScroll()"><liclass"list-item"v-for"(item,index) in tableData3":class"[…

eNSP学习——配置RIP的版本兼容、定时器和协议优先级

目录 主要命令 原理概述 实验内容 实验拓扑 实验目的 实验编址 实验步骤 1、基本配置 2、配置RIP协议的版本兼容 3、配置RIP的定时器 4&#xff0e;配置RIP协议优先级 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PDF版…

mysql中事务的简介

大家好。我们在日常开发过程中肯定都或多或少的用到过事务&#xff0c;而且在面试时&#xff0c;数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。 为了方便我们下面内容的讲解&#xff0c;我们也先建立一个讲事务必用的表–account表&#xff0c;并在表中插入两…

CSS学习笔记之高级教程(五)

23、CSS 媒体查询 - 实例 /* 如果屏幕尺寸超过 600 像素&#xff0c;把 <div> 的字体大小设置为 80 像素 */ media screen and (min-width: 600px) {div.example {font-size: 80px;} }/* 如果屏幕大小为 600px 或更小&#xff0c;把 <div> 的字体大小设置为 30px …

Golang:使用Base64Captcha生成数字字母验证码实现安全校验

Base64Captcha可以在服务端生成验证码&#xff0c;以base64的格式返回 为了能看到生成的base64验证码图片&#xff0c;我们借助gin go get -u github.com/mojocn/base64Captcha go get -u github.com/gin-gonic/gin文档的示例看起来很复杂&#xff0c;下面&#xff0c;通过简…

区块链游戏(链游)安全防御:抵御攻击的策略与实践

一、引言 区块链游戏&#xff0c;或称为链游&#xff0c;近年来随着区块链技术的普及而迅速崛起。然而&#xff0c;如同其他任何在线平台一样&#xff0c;链游也面临着各种安全威胁。本文将探讨链游可能遭遇的攻击类型以及如何通过有效的策略和技术手段进行防御。 二、链游可…

怎么用PHP语言实现远程控制两路照明开关

怎么用PHP语言实现远程控制两路开关呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制两路开关&#xff0c;两路开关可控制两路照明、排风扇等电器。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi墙…

LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

科技赋能,无障碍出行的新纪元

在现代社会&#xff0c;公共设施的建设不仅是衡量城市文明程度的标尺&#xff0c;更是实现社会公平与包容的重要载体。对于盲人群体而言&#xff0c;一个完善的公共设施网络&#xff0c;意味着他们能够更加独立、自信地融入社会&#xff0c;享受与视力健全者同等的公共服务与便…

二叉树的顺序结构(堆的实现)

前言 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。 现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&…

基于物理的分析模型,用于具有场板结构的GaN HEMT的输入、输出及反向电容

Physics-Based Analytical Model for Input, Output, and Reverse Capacitance of a GaN HEMT With the Field-Plate Structure&#xff08;TPE 17年&#xff09; 摘要 该论文提出了一种分析模型&#xff0c;用于描述带有场板结构的常开型AlGaN/GaN高电子迁移率晶体管&#x…

视频汇聚EasyCVR视频监控云平台对接GA/T 1400视图库对象和对象集合XMLSchema描述

GA/T 1400协议主要应用于公安系统的视频图像信息应用系统&#xff0c;如警务综合平台、治安防控系统、交通管理系统等。在城市的治安监控、交通管理、案件侦查等方面&#xff0c;GA/T 1400协议都发挥着重要作用。 以视频汇聚EasyCVR视频监控资源管理平台为例&#xff0c;该平台…