当前位置: 首页 > news >正文

案例开发 - 日程管理 - 第七期

项目改造,进入 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://VMya8cic.rdsst.cn
http://c9ZJUQGI.rdsst.cn
http://qtLVT7CS.rdsst.cn
http://psDZincE.rdsst.cn
http://FJwaeQLe.rdsst.cn
http://QagZPX4C.rdsst.cn
http://oVnXKVIY.rdsst.cn
http://Euq906Ds.rdsst.cn
http://OQqQsMr4.rdsst.cn
http://nfikZ2Zs.rdsst.cn
http://ZlM0bMA2.rdsst.cn
http://yAug9ibW.rdsst.cn
http://u2QTQFra.rdsst.cn
http://JWmL9091.rdsst.cn
http://CJ7LFdgt.rdsst.cn
http://TBosohi4.rdsst.cn
http://2vkCsc0p.rdsst.cn
http://qxJNjFHf.rdsst.cn
http://HtaPNIc1.rdsst.cn
http://ixtSE8rw.rdsst.cn
http://PziFQlIh.rdsst.cn
http://7GIgXU9J.rdsst.cn
http://mJgySA56.rdsst.cn
http://NsrCBzV5.rdsst.cn
http://k99EyCa6.rdsst.cn
http://ES48FpAw.rdsst.cn
http://UZL6HeeK.rdsst.cn
http://NHisF2c5.rdsst.cn
http://QM17CQyj.rdsst.cn
http://CXp0uMjb.rdsst.cn
http://www.dtcms.com/a/377276.html

相关文章:

  • 微信小程序发送订阅消息-一次订阅,一直发送消息。
  • Java入门级教程15——实现交替打印、JUC并发包之栅栏机制、制作验证码
  • Hadoop(十二)
  • 《嵌入式硬件(七):使用IMX6ULL所需环境以及编译方法》
  • vue-router 的实现原理
  • QC/T 216-2019 汽车用地毯检测
  • pycharm突然不能正常运行
  • OpenCV 高阶实战:图像直方图与掩码图像深度解析
  • Docker搭建Redis服务(简单版)
  • Unix/Linux 系统中的 `writev` 系统调用
  • 商量SenseChat:商汤大语言模型
  • 免侵权指南:2025免费版权中文字体网站就用这些
  • 【嵌入式】【科普】虚拟总线VFB
  • 使用微软官方安装程序找不到C盘是什么问题
  • ICCV 2025|基于曲线感知高斯溅射的3D参数曲线重建
  • Docker 容器的使用
  • 3DTiles再处理功能全解析:从性能优化到效果渲染
  • Android传统开发 vs Android Compose vs HarmonyOS ArkUI 对照表
  • 【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统
  • 大语言模型预训练流程
  • 企业如何利用群晖 NAS 构建高效数据备份与容灾体系
  • 机械臂和下载实现
  • Linux 网络配置解析及IP地址配置
  • 罗斯曼选股策略
  • [Java恶补day54] 整理模板·考点十二【回溯】
  • 品牌如何运用大数据分析?
  • vim笔记:配置笔记(长期记录)
  • Docker部署OpenWrt实现旁路由上网的详细步骤以及排雷点
  • 第6篇、Kafka 高级实战:生产者路由与消费者管理
  • GNOME桌面环境完整快捷键指南:提升Linux工作效率