diff --git "a/\345\220\264\344\275\263\351\242\226/2025.5.19\345\211\215\347\253\257CRUD\347\225\214\351\235\242.md" "b/\345\220\264\344\275\263\351\242\226/2025.5.19\345\211\215\347\253\257CRUD\347\225\214\351\235\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..a5e42aa0267a5a15da58550b8da161e64cd4424c --- /dev/null +++ "b/\345\220\264\344\275\263\351\242\226/2025.5.19\345\211\215\347\253\257CRUD\347\225\214\351\235\242.md" @@ -0,0 +1,67 @@ +# 1. 创建生命周期钩子(onMounted) +组件挂载后自动调用对应方法,使用axios向后端请求数据,获取书籍列表 +- 调用 getAll() 获取全部书籍数据 +- 将返回的书籍数组解构后添加到 books 中 + +> books 更新触发 DOM 自动重渲染 +```js +onMounted(async () => { + let data = await getAll(); + books.push(...data.data) +}) +``` + +## api请求逻辑 +1. getAll 函数:获取图书列表 + - 根据是否有 keyword 发送不同请求 + - 返回格式需符合 { code, data, msg } 结构 +```js +export const getAll = async (keyword) => { + let data; + if (keyword) { data = await axios.get(`http://localhost:3000/book?keyword=${keyword}`) + } else { data = await axios.get(`http://localhost:3000/book`)} + return data.data; +} +``` + +2. delItem 函数:删除对应图书 + - 发送 DELETE 请求到 /book/:id + - 返回操作结果(成功 / 失败) +```js +export const delItem = async (id) => { + let data = await axios.delete(`http://localhost:3000/book/${id}`) + return data.data; +} +``` + +## 查找对应图书 +1. 获取并处理搜索关键字(去除首尾空格) +2. 调用 getAll(keyword) 发送搜索请求 +3. 清空当前 books 数组 +4. 将搜索结果添加到 books 中(触发 DOM 更新) +```js +async function btnQuery() { + let trimKeyword = keyword.value.trim(); + let data = await getAll(trimKeyword); + books.splice(0); + books.push(...data.data); +} +``` + +## 删除图书 +1. 弹出确认对话框 +2. 确认后调用 delItem(id) 发送删除请求 +3. 根据返回状态码(code === 1000)判断操作结果 +4. 成功则从 books 中移除对应项(触发 DOM 更新) +5. 失败则打印错误信息 +```js +async function btnDel(id) { + if (confirm('真的要删除吗?')) { + let res = await delItem(id); + if (res.code === 1000) { + let index = books.findIndex(item => item.id === id); + books.splice(index, 1); + } else { console.log(res.msg); } + } +} +``` \ No newline at end of file diff --git "a/\345\220\264\344\275\263\351\242\226/2025.5.20\345\211\215\347\253\257\345\242\236\345\210\240\346\224\271.md" "b/\345\220\264\344\275\263\351\242\226/2025.5.20\345\211\215\347\253\257\345\242\236\345\210\240\346\224\271.md" new file mode 100644 index 0000000000000000000000000000000000000000..0962d3c34302b392b872d4185410e839997bc859 --- /dev/null +++ "b/\345\220\264\344\275\263\351\242\226/2025.5.20\345\211\215\347\253\257\345\242\236\345\210\240\346\224\271.md" @@ -0,0 +1,55 @@ +# 1. api模块 +所有方法都使用 axios 发送 HTTP 请求,并返回后端数据 + +1. getById:通过 ID 获取单个图书信息(GET 请求) +2. addItem:创建新图书(POST 请求) +3. editItem:更新已有图书(PUT 请求) +```js +// 查找单个数据 +export const getById = async (id) => { + let data = await axios.get(`${url}/book/${id}`) + return data.data +} +// 新增数据 +export const addItem = async (obj) => { + let data = await axios.post(`${url}/book`,obj) + return data.data +} +// 编辑数据 +export const editItem = async (id,obj) => { + let data = await axios.put(`${url}/book/${id}`,obj) + return data.data +} +``` + +## 2. 生命周期钩子 +1. 获取 URL 中的id参数 +2. 如果id存在,调用 `getById方法` 获取图书详情 +3. 使用Object.assign将返回的数据合并到响应式对象obj中,自动更新表单显示 +```js +onMounted(async () => { + let id = route.params.id || 0 + let data = await getById(id) + Object.assign(obj,data.data) +}) +``` + +## 3. 新增和编辑 +1. 获取 URL 参数中的id,判断是新增还是编辑操作 +2. 调用对应的 API 方法:editItem(编辑)或addItem(新增) +3. 根据返回结果判断操作是否成功: + - 成功(code 为 1000):跳转到图书列表页 + - 失败:打印错误信息到控制台 +```js +async function btnSave(){ + let id = route.params.id || 0 + let data + if(id){ + data = await editItem(id,obj) + }else{ + data = await addItem(obj) + } + if(data.code === 1000){ router.push('/book') + }else{ console.log(data.msg);} +} +``` \ No newline at end of file diff --git "a/\345\220\264\344\275\263\351\242\226/2025.5.21\347\273\204\344\273\266\345\272\223vant.md" "b/\345\220\264\344\275\263\351\242\226/2025.5.21\347\273\204\344\273\266\345\272\223vant.md" new file mode 100644 index 0000000000000000000000000000000000000000..d6b4f777546445eb7dd0fdd59e5ff42f69e4dfa3 --- /dev/null +++ "b/\345\220\264\344\275\263\351\242\226/2025.5.21\347\273\204\344\273\266\345\272\223vant.md" @@ -0,0 +1,17 @@ +# UI组件库 +## 安装 +```bash +yarn add vant +``` +## 引入组件(Button为例) +```js +import { createApp } from 'vue'; +import { Button } from 'vant'; + +const app = createApp(); +app.use(Button); +``` +## 使用 +```js +主要按钮 +``` \ No newline at end of file diff --git "a/\345\220\264\344\275\263\351\242\226/2025.5.23\345\244\215\344\271\240-\345\260\235\350\257\225\344\275\277\347\224\250mock.md" "b/\345\220\264\344\275\263\351\242\226/2025.5.23\345\244\215\344\271\240-\345\260\235\350\257\225\344\275\277\347\224\250mock.md" new file mode 100644 index 0000000000000000000000000000000000000000..f241be2bd9abeb97551a20b1f8ceb23609879d55 --- /dev/null +++ "b/\345\220\264\344\275\263\351\242\226/2025.5.23\345\244\215\344\271\240-\345\260\235\350\257\225\344\275\277\347\224\250mock.md" @@ -0,0 +1,41 @@ +# Mock数据 + +## 安装Mock和axios +```bash +yarn add mockjs +``` +## 创建一个文件用来存储mock模拟数据 +> 在src目录下创建一个mock/index.js文件 +```js +import Mock from 'mockjs' + +let data=Mock.mock({ + "data|6":[ //生成6条数据 + { + "stuid|+1":1,//生成学生id,自增1 + "stuname":"@cname",//生成学生名字,都是中国人的名字, + "stuAddress":"@county(true)" //随机生成地址 + } + ] +}) +Mock.mock(/\/goods\/list/,'get',()=>{ + //第一个请求路径,第二个请求方式,第三个回调函数返回值 + return data +}) +``` +## 在入口文件main.js文件中引入模拟数据文件 + +```js +import "./mock.index.js" +``` + +## 在需要请求数据的页面使用axios请求数据 + +```js +import axios from 'axios' + +axios.get('/goods/list').then(res=>{ + console.log("这是我发送的请求") + console.log(res.data) //打印请求的数据 +}) +``` \ No newline at end of file