项目改造,进入 demo-schedule 项目中,下载 pinia 依赖

在 main.js 中开启 pinia

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/router.js'
import {createPinia} from 'pinia'let pinia = createPinia()
const app = createApp(App)
app.use(router)
app.use(pinia)
app.mount('#app')

开启 pinia 的代码会经常使用,可以单独抽出来成为一个 js 文件

pinia.js:

import {createPinia} from 'pinia'let pinia = createPinia()export default pinia

在 main.js 中直接导入即可

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/router.js'
import pinia from './pinia.js'const app = createApp(App)
app.use(router)
app.use(pinia)
app.mount('#app')

userStore.js:

/* 专门用于存储用户状态的pinia */import {defineStore} from 'pinia'
export const defineUser = defineStore('loginUser',{state:()=>{return{uid:0,username:'',}},getters:{},actions:{}}
)

scheduleStore.js :

import {defineStore} from 'pinia'export const defineSchedule = defineStore('scheduleList',{state:()=>{return {itemList:[{sid:1,uid:1,title:'学习Java',completed:0,}],itemList:[{sid:1,uid:1,title:'学习Java',completed:0,}],itemList:[{sid:1,uid:1,title:'学习Java',completed:0,}],}}}
)

Header.vue:

在 Header 中导入 pinia,增加 v-if 判断,如果已经登录,则显示退出登录和查看日程,如果未登录,则显示登录和注册按钮,同时完成 logout 的退出方法:

<script setup>
/* 导入 pinia 数据 */
import {defineUser} from '../store/userStore.js'
import {defineSchedule} from '../store/scheduleStore.js'import {useRouter} from 'vue-router'
let router = useRouter()let sysUser = defineUser()
let schedule = defineSchedule()function logout() {// 清楚所有 pinia 数据sysUser.$reset()schedule.$reset()// 跳转到登录页面router.push("/login")
}
</script><template><div><h1 class = 'ht'>欢迎使用日程管理系统</h1><div><div class = 'optionDiv' v-if="sysUser.username == ''"><router-link to = '/login'><button class = 'b1s'>登录</button></router-link><router-link to = '/regist'><button class = 'b1s'>注册</button></router-link></div><div class = 'optionDiv' v-else>欢迎{{sysUser.username}}<button class = 'b1b' @click = "logout()">退出登录</button><router-link to = '/showSchedule'><button class = 'b1b'>查看日程</button></router-link></div><br></div></div></template><style scoped>
.ht{text-align: center;color: cadetblue;font-family: 幼圆;
}
.b1s{border: 2px solid powderblue;border-radius: 4px;width:60px;background-color: antiquewhite;
}
.b1b{border: 2px solid powderblue;border-radius: 4px;width:100px;background-color: antiquewhite;
}
.optionDiv{width: 400px;float: right;
}
</style>

对后端的 SysUserController 类中的 login 方法,成功登录进行修改

前端 Login.vue 中,登录成功后,接收后端响应回来的用户名 id 和用户名,存储在 userStore 中

<script setup>import {ref,reactive} from 'vue'import {useRouter} from 'vue-router'const router = useRouter()import {defineUser} from '../store/userStore.js'let sysUser = defineUser()import request from '../utils/request'//响应式数据,保存用户输入的表单信息let loginUser = reactive({username:'',userPwd:'',})// 响应式数据,保存校验的提示信息let usernameMsg = ref('')let userPwdMsg = ref('')//校验用户名的方法function checkUsername() {// 定义正则表达式var usernameReg = /^[a-zA-Z0-9]{5,10}$/// 校验用户名if (!usernameReg.test(loginUser.username)) {// 格式不合法usernameMsg.value="格式有误"return false}usernameMsg.value="ok"return true}// 校验密码的方法function checkUserPwd() {// 定义正则表达式var userPwdReg = /^[0-9]{6}$/// 校验密码if(!userPwdReg.test(loginUser.userPwd)) {// 格式不合法userPwdMsg.value='格式有误'return false}userPwdMsg.value='ok'return true}async function login() {// 检查表单数据格式正确再提交let flg1 = checkUsername()let flg2 = checkUserPwd()if (!(flg1 && flg2)) {return }let {data} = await request.post('user/login', loginUser)if (data.code == 200) {alert("登录成功")// 将后返回的登录的用户信息,更新到 pinia 中sysUser.uid = data.data.loginUser.uidsysUser.username = data.data.loginUser.username// 跳转到 showSchedulerouter.push("/showSchedule")} else if (code == 503) {alert("密码有误")} else if (code == 501) {aletr("用户名有误")} else {alert("未知错误")}}
</script><template><div><h3 class = 'ht'>请登录</h3><table class = 'tab' cellspacing = '0px'><tr class = 'ltr'><td>请输入账号</td><td><input class = 'ipt'type = 'text'v-model="loginUser.username"@blur="checkUsername()"><span id = "usernameMsg" v-text="usernameMsg"></span></td></tr><tr class = 'ltr'><td>请输入密码</td><td><input class = 'ipt'type = 'password'v-model="loginUser.userPwd"@blur="checkUserPwd()"><span id = "userPwdMsg" v-text="userPwdMsg"></span></td></tr><tr class = 'ltr'><td colspan="2" class = 'buttonContainer'><input class = 'btn1' type = 'button' @click="login()" value = '登录'><input class = 'btn1' type = 'button' value = '重置'><router-link to = '/regist'><button class = 'btn1'>去注册</button></router-link></td></tr></table></div>
</template><style scoped>
.ht{text-align: center;color: cadetblue;font-family: 幼圆;
}
.tab{width: 500px;border: 5px solid cadetblue;margin: 0px auto;border-radius: 5px;font-family: 幼圆;
}
.ltr td{border: 1px solid powderblue;
}
.ipt{border: 0px;width: 50%;
}
.btn1{border: 2px solid powderblue;border-radius: 4px;width:60px;background-color: antiquewhite;
}
#usernameMsg , #userPwdMsg {color: gold;
}
.buttonContainer{text-align: center;
}
</style>

接下来,我们还要设置一个路由的全局前置守卫,判断一下是否可以访问 showSchedule

import {createRouter, createWebHashHistory} from 'vue-router'import Login from '../components/Login.vue'
import Regist from '../components/Regist.vue'
import ShowSchedule from '../components/ShowSchedule.vue'import pinia from '../pinia.js'
import { defineUser } from '../store/userStore.js'
let sysUser = defineUser(pinia)let router = createRouter({history:createWebHashHistory(),routes:[{path:'/',redirect:"/showSchedule"},{path:'/login',component:Login,},{path:'/regist',component:Regist,},{path:'/showSchedule',component:ShowSchedule,},]}
)
// 路由的全局前置守卫, 判断是否可以访问 showSchedule
router.beforeEach((to,from,next) => {if(to.path == '/showSchedule') {// 登陆过放行// 没登陆过,回到登录页if (sysUser.username == '') {next('/login')} else {next()}} else {next()}
})export default router

接下来处理显示所有日程数据的问题,showSchedule.vue 中向后端发送异步请求,查询数据并且将数据在前端页面进行展示

<script setup>// 导入 pinia 数据import {defineUser} from '../store/userStore.js'import {defineSchedule} from '../store/scheduleStore.js'let sysUser = defineUser()let schedule = defineSchedule()import {ref, reactive, onUpdated, onMounted} from 'vue'import request from '../utils/request'// 第一次挂载完毕后立即向后端发送请求,获取最新数据onMounted(async function () {showSchedule()})// 发送异步请求async function showSchedule() {let {data} = await request.get("/schedule/findAllSchedule",{params:{'uid':sysUser.uid}})4console.log(data)}
</script><template><div><h3 class="ht">您的日程如下</h3><table class="tab" cellspacing="0px"><tr class="ltr"><th>编号</th><th>内容</th><th>进度</th><th>操作</th></tr><tr class="ltr" v-for="item,index in schedule.itemList" :key="index"><td v-text="index+1"></td><td><input type = "text" v-model="item.title"></td><td><input type = "radio" value = "1" v-model="item.completed">已完成<input type = "radio" value = "0" v-model="item.completed">未完成</td><td class="buttonContainer"><button class="btn1">删除</button><button class="btn1">保存修改</button></td></tr><tr class="ltr buttonContainer"><td colspan="4"><button class="btn1">新增日程</button></td></tr></table></div>
</template><style scoped>
.ht {text-align: center;color: cadetblue;font-family: 幼圆;
}
.tab {width: 80%;border: 5px solid cadetblue;margin: 0px auto;border-radius: 5px;font-family: 幼圆;
}
.ltr td {border: 1px solid powderblue;
}
.ipt {border: 0px;width: 50%;
}
.btn1 {border: 2px solid powderblue;border-radius: 4px;width: 100px;background-color: antiquewhite;
}
#usernameMsg,
#userPwdMsg {color: gold;
}
.buttonContainer {text-align: center;
}
</style>
```

后端中的 SysScheduleController 类中进行 findAllSchedule 方法的编写

服务层代码:

Dao 层代码:

再回到前端 showSchedule.vue 中发送异步请求:

接下来完成新增日程功能:

showSchedule.vue 的新增日程 button 上添加函数:

在上面实现 addItem 函数

SysScheduleController 中增加一个 addDefaultSchedule 方法

最终在 SysScheduleDaoImpl 中的 addDefault 中实现:

保存修改功能:

在后端实现功能:

SysScheduleController:

SysScheduleDaoImpl:

再实现删除功能:

完!

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

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

相关文章

infinityfree 网页连接内网穿透 localtunnel会换 还是用frp成功了

模型库首页 魔搭社区 fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. 我尝试用本机ipv6&#xff0c;失败了 配置文件 - ChmlFrp 香港2才能用 只支持https CNAME解析 | 怊猫科技 | 文档 How to create …

批量更新数据:Mybatis update foreach 和 update case when 写法及比较

在平常的开发工作中&#xff0c;我们经常需要批量更新数据&#xff0c;业务需要每次批量更新几千条数据&#xff0c;采用 update foreach 写法的时候&#xff0c;接口响应 10s 左右&#xff0c;优化后&#xff0c;采用 update ... case when 写法&#xff0c;接口响应 2s 左右。…

Java基础篇04:数组、二维数组

1 数组 数组是一个数据容器&#xff0c;可用来存储一批同类型的数据。 1.1 数组的定义方式 静态初始化 数据类型[][] 数组名 {元素1&#xff0c;元素2&#xff0c;元素3}; string[][] name {"wfs","jsc","qf"} 动态初始化 数据类型[][] 数组名…

unity开发类似个人网站空间

可以用 Unity 开发 “个人网站空间” 类工具&#xff0c;但需要结合其技术特性和适用场景来判断是否合适。以下从技术可行性、优势、局限性、适用场景四个方面具体分析&#xff1a;一、技术可行性Unity 本质是游戏引擎&#xff0c;但具备开发 “桌面应用” 和 “交互内容” 的能…

SDK游戏盾如何实现动态加密

SDK游戏盾的动态加密体系通过​​密钥动态管理、多层加密架构、协议混淆、AI自适应调整及设备绑定​​等多重机制协同作用&#xff0c;实现对游戏数据全生命周期的动态保护&#xff0c;有效抵御中间人攻击、协议破解、重放攻击等威胁。以下从核心技术与实现逻辑展开详细说明&am…

TensorFlow平台介绍

什么是 TensorFlow&#xff1f; TensorFlow 是一个由 Google Brain 团队 开发并维护的 开源、端到端机器学习平台。它的核心是一个强大的数值计算库&#xff0c;特别擅长于使用数据流图来表达复杂的计算任务&#xff0c;尤其适合大规模机器学习和深度学习模型的构建、训练和部署…

TENGJUN防水TYPE-C连接器:立贴结构与IPX7防护的精密融合

在户外电子、智能家居、车载设备等对连接可靠性与空间适配性要求严苛的场景中&#xff0c;连接器不仅是信号与电力传输的“桥梁”&#xff0c;更需抵御潮湿、粉尘等复杂环境的侵蚀。TENGJUN防水TYPE-C连接器以“双排立贴”为核心设计&#xff0c;融合锌合金底座、精准尺寸控制与…

Spring Boot + Vue 项目中使用 Redis 分布式锁案例

加锁使用命令&#xff1a;set lock_key unique_value NX PX 1000NX:等同于SETNX &#xff0c;只有键不存在时才能设置成功PX&#xff1a;设置键的过期时间为10秒unique_value&#xff1a;一个必须是唯一的随机值&#xff08;UUID&#xff09;&#xff0c;通常由客户端生成…

微信小程序携带token跳转h5, h5再返回微信小程序

需求: 在微信小程序内跳转到h5, 浏览完后点击返回按钮再返回到微信小程序中 微信小程序跳转h5: 微信小程序跳转h5,这个还是比较简单的, 但要注意细节 一、微信小程序代码 1.新建跳转h5页面, 新建文件夹,新建page即可 2.使用web-view标签 wxml页面 js页面 到此为止, 小程序…

【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路

【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路 简介 猫狗识别作为计算机视觉领域的经典入门任务&#xff0c;不仅能帮助我们掌握深度学习的核心流程&#xff0c;更能直观体会到不同优化策略对模型性能的影响。本文将从 “从零搭建简单 CNN” 出发&#xff0c;逐步…

异步处理(前端面试)

Promise 1&#xff1a;使用promise原因 了解回调地狱【什么是回调地狱】 1&#xff1a;回调地狱是异步获取结果后&#xff0c;为下一个异步函数提供参数&#xff0c;层层回调嵌入回调 2&#xff1a;导致回调层次很深&#xff0c;代码维护特别困难 3&#xff1a;在没有ES6时&…

3种XSS攻击简单案例

1、接收cookie端攻击机上用python写个接收web程序flask from flask import Flask, request, Responseapp Flask(__name__)app.route(/) def save_cookie():cookie request.args.get(cookie, )if cookie:with open(/root/cookies.txt, a) as f:f.write(f"{cookie}\n"…

Docker 部署生产环境可用的 MySQL 主从架构

简介跨云服务器一主一从&#xff0c;可以自己按照逻辑配置多个从服务器 假设主服务器ip: 192.168.0.4 从服务器ip&#xff1a;192.168.0.5 系统 CentOS7.9 &#xff08;停止维护了&#xff0c;建议大家用 Ubuntu 之类的&#xff0c;我这个没办法&#xff0c;前人在云服务器上…

DeepResearch(上)

概述 OpenAI首先推出Deep Research Agent&#xff0c;深度研究智能体&#xff0c;简称DRA。 通过自主编排多步骤网络探索、定向检索和高阶综合&#xff0c;可将大量在线信息转换为分析师级别的、引用丰富的报告&#xff0c;将数小时的手动桌面研究压缩为几分钟。 作为新一代…

附050.Kubernetes Karmada Helm部署联邦及使用

文章目录karmada简介karmada概述karmada Helm部署Kubernetes karmada介绍基础准备Kubernetes集群获取chat包正式部署karmada使用karmada纳管集群查看memeber集群导出kubeconfig切换集群测试应用karmada简介 karmada概述 参考&#xff1a;附049.Kubernetes Karmada Local-up部…

必知必会:基于Transformer 的预训练语言模型如何区分文本位置(sinusoidal位置编码、原理和详细推导)

预训练位置编码 基于Transformer 的预训练语言模型如何区分文本位置? 基于 Transformer 的预训练语言模型主要通过位置编码来区分文本位置。Transformer 核心的自注意力机制本身并不考虑词的顺序&#xff0c;它对输入序列的处理是与位置无关的。在 query 和 key 的矩阵乘法之后…

redis key过期后会立马删除吗

Redis 的 Key 过期后不会立即被删除。Redis 采用了一种结合 ​惰性删除 (Lazy Expiration)​​ 和 ​定期删除 (Periodic Expiration)​​ 的策略来管理过期 Key 的回收&#xff0c;这是为了在内存管理、性能和 CPU 开销之间取得平衡。&#x1f4cc; Redis 过期 Key 删除的两种…

关于 React 19 的四种组件通信方法

注意&#xff1a;使用的是UI库是 antd-mobile1.父子级组件通信父组件单向数据流&#xff1a;数据从父组件流向子组件。支持多种数据类型&#xff1a;字符串、数字、对象、数组、函数等。只读性&#xff1a;子组件不能直接修改 props 中的数据。import { useState } from react …

OC-单例模式

文章目录单例模式定义特点使用原因缺点模式介绍懒汉模式同步锁实现dispatch_once饿汉模式实现总结懒汉模式优点缺点饿汉模式优点缺点单例模式 定义 单例模式&#xff0c;简单的说就是一个类始终只对应同一个对象&#xff0c;每次获取这个类的对象获得的都是同一个实例 如果一…

[论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案

抗量子紧凑&#xff01;SM3-OTS&#xff1a;基于国产哈希算法的一次签名新方案 论文信息信息类别具体内容论文原标题SM3-OTS: 基于国密算法SM3的紧凑型后量子一次签名方案主要作者杨亚涛、殷方锐、陈亮宇、潘登研究机构1. 北京电子科技学院 电子与通信工程系&#xff08;北京 1…