From 9edefbb215220816ac5dbf0c66fb807bb31846ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=AE=B8=E6=99=A8?=
<11820282+xu-chenlll@user.noreply.gitee.com>
Date: Sun, 19 May 2024 12:58:49 +0000
Subject: [PATCH 1/2] =?UTF-8?q?=E7=AC=94=E8=AE=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 许晨 <11820282+xu-chenlll@user.noreply.gitee.com>
---
.../20240516-\345\244\215\344\271\240Vue.md" | 300 ++++++++++++++++++
1 file changed, 300 insertions(+)
create mode 100644 "\350\256\270\346\231\250/20240516-\345\244\215\344\271\240Vue.md"
diff --git "a/\350\256\270\346\231\250/20240516-\345\244\215\344\271\240Vue.md" "b/\350\256\270\346\231\250/20240516-\345\244\215\344\271\240Vue.md"
new file mode 100644
index 0000000..0e19da9
--- /dev/null
+++ "b/\350\256\270\346\231\250/20240516-\345\244\215\344\271\240Vue.md"
@@ -0,0 +1,300 @@
+## 复习Vue
+
+
+## 前端
+```
+
+
+
+
+
+
+
+
+
+
+
+
+ id |
+ 书名 |
+ 作者 |
+ 价格 |
+ 出版社 |
+ 操作 |
+
+
+ {{ item.id }} |
+ {{item.bookname }} |
+ {{ item.author }} |
+ {{ item.price }} |
+ {{ item.publish }} |
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+```
+
+## 后端
+
+```
+import Koa from 'koa';
+import Router from 'koa-router';
+import cors from 'koa2-cors';
+import bodyParser from 'koa-bodyparser';
+import { Sequelize,DataTypes,Op } from 'sequelize';
+
+const app=new Koa();
+const router=new Router();
+
+const sequelize=new Sequelize('BookDb','sa','123456',{
+ host:'localhost',
+ dialect:'mssql'
+
+})
+
+const booklist=sequelize.define('booklist',{
+ bookname:{type:DataTypes.STRING},
+ author:{type:DataTypes.STRING},
+ price:{type:DataTypes.STRING},
+ publish:{type:DataTypes.STRING},
+})
+
+booklist.sync();
+
+router.get('/book/:id?',async(ctx)=>{
+ let keyword=ctx.query.keyword;
+ let id=ctx.params.id * 1 || 0;
+ let data;
+ if(keyword){
+ data=await booklist.findAll({
+ where:{
+ [Sequelize.Op.or]:[
+ {id:{[Sequelize.Op.like]:'%'+keyword+'%'}},
+ {bookname:{[Sequelize.Op.like]:'%'+keyword+'%'}},
+ {price:{[Sequelize.Op.like]:'%'+keyword+'%'}},
+ {publish:{[Sequelize.Op.like]:'%'+keyword+'%'}},
+ ]
+ }
+ })
+ }else if(id){
+ data=await booklist.findByPk(id)
+ }else{
+ data=await booklist.findAll()
+ }
+ ctx.body={
+ msg:'查找成功',
+ code:3000,
+ data:data,
+ }
+})
+
+router.delete('/book/:id',async(ctx)=>{
+ let id=ctx.params.id * 1 || 0;
+if(id>0){
+ let data=await booklist.destroy({
+ where:{
+ id:id
+ }
+ })
+ ctx.body={
+ msg:'删除成功',
+ code:3000,
+ data:data
+ }
+}else{
+ ctx.body={
+ msg:'删除失败',
+ code:1000,
+ data:data
+ }
+}
+
+
+
+
+})
+
+router.put('/book/:id',async(ctx)=>{
+ let id=ctx.params.id * 1 || 0;
+ let obj=ctx.request.body;
+ let item=booklist.findByPk(id);
+ let data;
+ if(item){
+ data=await booklist.update(obj,{
+ where:{
+ id:id
+ }
+ })
+ ctx.body={
+ msg:'修改成功',
+ code:3000,
+ data:data
+ }
+ }else{
+ ctx.body={
+ msg:'修改失败',
+ code:1000,
+ data:data
+ }
+ }
+})
+
+router.post('/book',async(ctx)=>{
+ let obj=ctx.request.body;
+ let data;
+ if(obj){
+ data=await booklist.create(obj)
+ ctx.body={
+ msg:'新增成功',
+ code:3000,
+ data:data
+ }
+ }else{
+ ctx.body={
+ msg:'新增失败',
+ code:1000,
+ data:data
+ }
+ }
+
+})
+
+app.use(bodyParser());
+app.use(cors());
+app.use(router.routes());
+
+let port=3000;
+app.listen(port);
+console.log(`服务运行地址如下 http://localhost:${port}`);
+
+```
\ No newline at end of file
--
Gitee
From f251e008c8644951afab09795b51066d5adf7c7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=AE=B8=E6=99=A8?=
<11820282+xu-chenlll@user.noreply.gitee.com>
Date: Sun, 19 May 2024 13:24:59 +0000
Subject: [PATCH 2/2] =?UTF-8?q?=E7=AC=94=E8=AE=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: 许晨 <11820282+xu-chenlll@user.noreply.gitee.com>
---
...20240513-\350\256\244\350\257\206pinia.md" | 107 ++++++++++++++++++
1 file changed, 107 insertions(+)
create mode 100644 "\350\256\270\346\231\250/20240513-\350\256\244\350\257\206pinia.md"
diff --git "a/\350\256\270\346\231\250/20240513-\350\256\244\350\257\206pinia.md" "b/\350\256\270\346\231\250/20240513-\350\256\244\350\257\206pinia.md"
new file mode 100644
index 0000000..c245788
--- /dev/null
+++ "b/\350\256\270\346\231\250/20240513-\350\256\244\350\257\206pinia.md"
@@ -0,0 +1,107 @@
+## 认识pinia
+Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export const state = reactive({}) 来共享一个全局状态。对于单页应用来说确实可以,但如果应用在服务器端渲染,这可能会使你的应用暴露出一些安全漏洞。 而如果使用 Pinia,即使在小型单页应用中,你也可以获得如下功能:
+
+1.Devtools 支持
+
+- 追踪 actions、mutations 的时间线
+- 在组件中展示它们所用到的 Store
+- 让调试更容易的 Time travel
+
+2.热更新
+- 不必重载页面即可修改 Store
+- 开发时可保持当前的 State
+
+3.插件:可通过插件扩展 Pinia 功能
+
+4.为 JS 开发者提供适当的 TypeScript 支持以及自动补全功能
+
+5.支持服务端渲染
+
+## 定义一个Store
+在深入了解核心概念之前,我们需要知道 Store 是使用 defineStore() 定义的,并且它需要一个唯一名称,作为第一个参数传递:
+```
+
+import { defineStore } from 'pinia'
+
+// useStore 可以是 useUser、useCart 之类的任何东西
+// 第一个参数是应用程序中 store 的唯一 id
+export const useStore = defineStore('main', {
+ // other options...
+})
+这个 name,也称为 id,是必要的,Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use... 是跨可组合项的约定,以使其符合你的使用习惯。
+
+
+```
+
+## 使用store
+我们正在 定义 一个 store,因为在 setup() 中调用 useStore() 之前不会创建 store:
+
+```
+import { useStore } from '@/stores/counter'
+
+export default {
+ setup() {
+ const store = useStore()
+
+ return {
+ // 您可以返回整个 store 实例以在模板中使用它
+ store,
+ }
+ },
+}
+
+```
+
+您可以根据需要定义任意数量的 store ,并且**您应该在不同的文件中定义每个 store **以充分利用 pinia(例如自动允许您的包进行代码拆分和 TypeScript 推理)。
+
+如果您还没有使用 setup 组件,您仍然可以将 Pinia 与 map helpers 一起使用。
+
+一旦 store 被实例化,你就可以直接在 store 上访问 state、getters 和 actions 中定义的任何属性。 我们将在接下来的页面中详细介绍这些内容,但自动补全会对您有所帮助。
+
+请注意,store 是一个用reactive 包裹的对象,这意味着不需要在getter 之后写.value,但是,就像setup 中的props 一样,我们不能对其进行解构:
+
+```
+export default defineComponent({
+ setup() {
+ const store = useStore()
+ // ❌ 这不起作用,因为它会破坏响应式
+ // 这和从 props 解构是一样的
+ const { name, doubleCount } = store
+
+ name // "eduardo"
+ doubleCount // 2
+
+ return {
+ // 一直会是 "eduardo"
+ name,
+ // 一直会是 2
+ doubleCount,
+ // 这将是响应式的
+ doubleValue: computed(() => store.doubleCount),
+ }
+ },
+})
+
+```
+
+为了从 Store 中提取属性同时保持其响应式,您需要使用storeToRefs()。 它将为任何响应式属性创建 refs。 当您仅使用 store 中的状态但不调用任何操作时,这很有用:
+
+```
+import { storeToRefs } from 'pinia'
+
+export default defineComponent({
+ setup() {
+ const store = useStore()
+ // `name` 和 `doubleCount` 是响应式引用
+ // 这也会为插件添加的属性创建引用
+ // 但跳过任何 action 或 非响应式(不是 ref/reactive)的属性
+ const { name, doubleCount } = storeToRefs(store)
+
+ return {
+ name,
+ doubleCount
+ }
+ },
+})
+
+```
\ No newline at end of file
--
Gitee