diff --git "a/\345\220\264\350\257\227\350\214\265/20240513-19.pinia.md" "b/\345\220\264\350\257\227\350\214\265/20240513-19.pinia.md" new file mode 100644 index 0000000000000000000000000000000000000000..9004c65e599f4ef26c2c10af805dd902899132e5 --- /dev/null +++ "b/\345\220\264\350\257\227\350\214\265/20240513-19.pinia.md" @@ -0,0 +1,536 @@ +## Pinia + +Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态 + +### 1.Pinia的安装和实例 + + npm i pinia + +创建一个pinia实例(根store)并将其传递给应用: + +``` +import { createApp } from 'vue'; +import './style.css'; +import App from './App.vue'; +import { createPinia } from 'pinia'; +let app=createApp(App); +let pinia=createPinia(); +app.use(pinia); +app.mount('#app'); +``` + +### 2.Store + +Store(如Pinia)是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。它有三个概念,state、getter和action,我们可以假设这些概念相当于组件中的 data、 computed和methods + +#### 定义Store + +``` +import { defineStore } from 'pinia'; +export let useUserStore=defineStore('users', +{ + // 其他配置 +}); +``` + +Store是用defineStore()定义的,它的第一个参数要求是一个独一无二的名字:这个名字,也被用作id,是必须传入的,Pinia将用它来连接 store 和devtools。为了养成习惯性的用法,将返回的函数命名为use...是一个符合组合式函数风格的约定 + +defineStore()的第二个参数可接受两类值:Setup函数或Option对象 + +#### 使用Store + +``` + + + +``` + +### 3.State + +在Pinia中,state被定义为一个返回初始状态的函数 + +#### 添加state数据 + +``` +import { defineStore } from 'pinia'; +export let useUserStore=defineStore('users', +{ + state:()=> + { + return{name:'思航航',age:18,sex:'女'}; + } +}); +``` + +state属性是用来存储数据的,state接收的是一个箭头函数返回的值,它不能直接接收一个对象 + +#### 读取state数据 + +① 正常写法: + +``` + + + +``` + +② 解构方法: + +``` + + + +``` + +#### 修改state数据 + +``` + + + +``` + +#### 重置state数据 + +``` + + + +``` + +#### 变更state数据 + +``` + + + +``` + +#### 替换state数据 + +``` + + + +``` + +#### 订阅state数据 + +store的$subscribe()方法侦听state及其变化。比起普通的watch(),使用$subscribe()的好处是subscriptions在patch后只触发一次(例如,当使用上面的函数版本时) + +### 4.Getter + +Getter只是幕后的计算属性,所以不可以向它们传递任何参数 + +#### 定义Getter + +``` +import { defineStore } from 'pinia'; +export let useUserStore=defineStore('users', +{ + state:()=> + { + return{name:'思航航',age:18,sex:'女'}; + }, + getters: + { + getAddAge:(state)=> + { + return state.age+100; + } + } +}); +``` + +getter属性对象中定义了一个getAddAge方法,该方法会默认接收一个state参数,也就是state对象,然后该方法返回的是一个新的数据 + +#### 使用Getter + +``` + + + +``` + +#### 访问其他Store的Getter + +在users.js文件里写: + +``` +import { defineStore } from 'pinia'; +export let useUserStore=defineStore('users', +{ + state:()=> + { + return{name:'思航航',age:18,sex:'女'}; + }, + getters: + { + getAddAge:(state)=> + { + return state.age+100; + }, + getNameAndAge() + { + return this.name+this.getAddAge; + } + } +}); +``` + +在App.vue文件里写: + +``` + + + +``` + +#### 向Getter传递参数 + +在users.js文件里写: + +``` +import { defineStore } from 'pinia'; +export let useUserStore=defineStore('users', +{ + state:()=> + { + return{name:'思航航',age:18,sex:'女'}; + }, + getters: + { + getAddAge:(state)=> + { + return(number)=>state.age+number; + }, + getNameAndAge() + { + return this.name+this.getAddAge; + } + } +}); +``` + +在App.vue文件里写: + +``` + + + +``` + +### 5.Action + +actions属性值同样是一个对象,该对象里面也是存储的各种各样的方法,包括同步方法和异步方法 + +#### 定义Action + +``` +import { defineStore } from 'pinia'; +export let useUserStore=defineStore('users', +{ + state:()=> + { + return{name:'思航航',age:18,sex:'女'}; + }, + getters: + { + getAddAge:(state)=> + { + return(number)=>state.age+number; + }, + getNameAndAge() + { + return this.name+this.getAddAge; + } + }, + actions: + { + saveName(name) + { + this.name=name; + } + } +}); +``` + +#### 使用Action + +``` + + + +``` \ No newline at end of file diff --git "a/\345\220\264\350\257\227\350\214\265/20240514-20.API\345\222\214REST.md" "b/\345\220\264\350\257\227\350\214\265/20240514-20.API\345\222\214REST.md" new file mode 100644 index 0000000000000000000000000000000000000000..fff961c3560f7a8ec7b1c62f5b1a3ebc9c99448f --- /dev/null +++ "b/\345\220\264\350\257\227\350\214\265/20240514-20.API\345\222\214REST.md" @@ -0,0 +1,30 @@ +## API和REST + +### API + +Application Programming Interface(应用程序接口)是它的全称。简单的理解就是,API是一个接口 + +### REST + +HTTP总共包含八种方法: + +``` +GET +POST +PUT +DELETE +OPTIONS +HEAD +TRACE +CONNECT +``` + +● 2xx = Success(成功) + +● 3xx = Redirect(重定向) + +● 4xx = User error(客户端错误) + +● 5xx = Server error(服务器端错误) + +我们常见的是200(请求成功)、404(未找到)、401(未授权)、500(服务器错误)... \ No newline at end of file diff --git "a/\345\220\264\350\257\227\350\214\265/20240516-21.\345\244\215\344\271\240.md" "b/\345\220\264\350\257\227\350\214\265/20240516-21.\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..1e54ef17181b9cdeb0d87199af905afd4f7f69c9 --- /dev/null +++ "b/\345\220\264\350\257\227\350\214\265/20240516-21.\345\244\215\344\271\240.md" @@ -0,0 +1,346 @@ +## 复习 + +在app.js文件里写: + +``` +import Koa from 'koa'; + +import Router from 'koa-router'; + +import bodyparser from 'koa-bodyparser'; + +import cors from 'koa2-cors'; + +import { Sequelize , DataTypes , Op } from 'sequelize'; + +const app=new Koa(); + +let router=new Router(); + +let sequelize=new Sequelize('Good_project','sa','YLJW6195', +{ + host:'localhost', + dialect:'mssql' +}); + +let Goods=sequelize.define('Goods', +{ + title:{type:DataTypes.STRING}, + author:{type:DataTypes.STRING}, + flag:{type:DataTypes.STRING}, +}); + +await Goods.sync(); + +router.get('/goods',async(ctx)=> +{ + let keyword = ctx.request.query.keyword || ''; + keyword = keyword.trim(); + if (keyword) { + let list = await Goods.findAll + ({ + where: + { + [Op.or]: + [ + { title: { [Op.like]: '%' + keyword + '%' } }, + { author: { [Op.like]: '%' + keyword + '%' } }, + { flag: { [Op.like]: '%' + keyword + '%' } }, + ] + } + }); + ctx.body = + { + code: 1000, + data: list, + msg: '查找数据成功' + }; + } + else { + let list = await Goods.findAll(); + ctx.body = + { + code: 1000, + data: list, + msg: '获取所有商品成功' + }; + }; +}); + +router.get('/goods/:id',async(ctx)=> +{ + let id = ctx.params.id * 1 || 0; + let row = await Goods.findAll + ({ + where: + { + id: id + } + }); + let res = + { + code: 1000, + data: row[0], + msg: `获取指定id为${id}的商品成功` + } + ctx.body = res; +}); + +router.post('/goods',async(ctx)=> +{ + let obj = ctx.request.body; + let row = await Goods.create(obj); + ctx.body = + { + code: 1000, + data: row, + msg: '创建商品成功' + }; +}); + +router.put('/goods/:id',async(ctx)=> +{ + let id = ctx.params.id * 1 || 0; + let obj = ctx.request.body; + let item = Goods.findByPk(id); + if (item) + { + let data = await Goods.update(obj, + { + where: { id: id } + }); + ctx.body = + { + code: 1000, + data: data, + msg: '修改成功' + }; + } + else + { + ctx.body = + { + code: 4000, + data: null, + msg: '找不到' + }; + }; +}); + +router.delete('/goods/:id',async(ctx)=> +{ + let id = ctx.params.id || 0; + let row = await Goods.findByPk(id); + if (row) { + Goods.destroy + ({ + where: { id: id } + }); + ctx.body = + { + code: 1000, + msg: '删除成功' + }; + } + else { + ctx.body = + { + code: 4000, + msg: '找不到你要删除的商品,请确认后重试' + }; + }; +}); + +// 解决跨域问题 +app.use(cors()); + +// 解决post、put请求拿到表单数据的问题 +app.use(bodyparser()); + +// 解决路由问题 +app.use(router.routes()); + +let port=3000; + +app.listen(port); + +console.log(`http服务器运行与如下地址:http://localhost:${port}`); +``` + +在App.vue文件里写: + +``` + + + + + +``` \ No newline at end of file