From ddfe7a90d426f342b585865bfdef8aaf2c2adeaf Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Wed, 26 Feb 2025 15:45:48 +0800
Subject: [PATCH] 添加知识库文档,项目介绍

---
 _knowledges/01-项目介绍.md |  335 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 335 insertions(+), 0 deletions(-)

diff --git "a/_knowledges/01-\351\241\271\347\233\256\344\273\213\347\273\215.md" "b/_knowledges/01-\351\241\271\347\233\256\344\273\213\347\273\215.md"
new file mode 100644
index 0000000..d0b200b
--- /dev/null
+++ "b/_knowledges/01-\351\241\271\347\233\256\344\273\213\347\273\215.md"
@@ -0,0 +1,335 @@
+# 项目介绍
+
+这是一个编程项目,用于移动端网页开发
+
+## 技术栈
+
+*   语法框架:Vue(v2.5.0)
+*   项目框架:Taro(v3.2.13)
+*   显示框架:Taro-UI-Vue(v1.0.0-beta.10)
+*   样式:Sass
+*   相关插件
+    -   时间插件:moment(v2.29.1)
+
+## 项目目录结构
+
+项目主要目录及其用途
+
+*   root/(根目录)
+    -   public/(静态资源目录)
+    -   src/(开发源码目录)
+        -   components/(公共组件目录)
+            -   bases/(公共基类目录)
+            -   common/(公共库目录)
+            -   forms/(公共表单组件目录)
+            -   layout/(公共排版组件目录)
+            -   plugins/(公共插件目录)
+        -   fetchers/(请求层目录)
+            -   FName.js(请求集)
+        -   pages/(界面层目录)
+            -   pageGroup/
+                -   pageName/
+                    -   cmpt/(页面子组件目录)
+                        -   CName.vue(子组件)
+                        -   cName.scss(组件样式)
+                    -   page.vue(页面)
+                    -   page.scss(页面样式)
+        -   pilots/(数据控制层目录)
+            -   _overall/(全局数据控制目录)
+            -   pilotGroup/
+                -   mixin/(混合件目录)
+                    -   MName.js(混合件)
+                -   PName.js(数据控制器)
+
+### 短路径映射
+
+项目资源引用时,通常使用更短的引用路径:
+
+* `@components` 代表 `root/src/components`
+* `@fetchers` 代表 `root/src/fetchers`
+* `@pages` 代表 `root/src/pages`
+* `@pilots` 代表 `root/src/pilots`
+
+例如:'@components/layout/h5Page' 实际引用的是 'root/src/components/layout/h5Page'
+
+## 页面构成
+
+当我们说组件的时候,就是指普通 Vue 组件  
+
+当我们说业务页面的时候,则是由**页面层**和**数据控制层**两部分组成  
+同时页面层有子组件,数据层关联请求层,结构如下
+
+*   业务页面:
+    -   页面层(root/src/pages/pageGroup/pageName/page.vue)
+        -   子组件(root/src/pages/pageGroup/pageName/cmpt/CName.vue)
+    -   数据控制层(root/src/pilots/pilotsGroup/PName.js)
+        -   请求层(root/src/fetchers/FName.js)
+
+### 页面拆分
+
+一个业务页面的页面层和数据控制层,实际上是对一个 Vue 组件的拆分,最终运行的时候,还是会合二为一,还原成原本的 Vue 实例  
+因此,数据控制层其实是对这个 Vue 实例部分功能,进行拆分的一种转写,类似于语法糖
+
+#### 数据控制层写法
+
+例如:
+
+```js
+// 数据控制器
+export class PIndex extends Pilot {
+    $data() {
+        return {
+            a: 1,
+        };
+    }
+    $computed = {
+        a2() {},
+    };
+    $mounted() {}
+    onOpenSelector() {}
+}
+```
+
+会转换成
+
+```js
+// 标准 Vue
+const Component = Vue.extend({
+    data() {
+        return {
+            a: 1,
+        };
+    },
+    computed: {
+        a2() {},
+    },
+    methods: {
+        onOpenSelector() {},
+    },
+    mounted() {},
+});
+```
+
+##### 数据控制层的 Vue 属性
+
+数据控制器中的 Vue 属性,需要使用 $ 开头
+
+```js
+// 数据控制器
+export class PIndex extends Pilot {
+    $data() {
+        return {
+            a: 1,
+        };
+    }
+    $computed = {
+        a2() {},
+    };
+}
+```
+
+会转换成
+
+```js
+// 标准 Vue
+const Component = Vue.extend({
+    data() {
+        return {
+            a: 1,
+        };
+    },
+    computed: {
+        a2() {},
+    },
+});
+```
+
+##### 数据控制层的 Vue 方法
+
+数据控制器中的 Vue 方法,不用写 methods 中,直接写最外层
+
+```js
+// 数据控制器
+export class PIndex extends Pilot {
+    onOpenSelector() {}
+}
+```
+
+会转换成
+
+```js
+// 标准 Vue
+const Component = Vue.extend({
+    methods: {
+        onOpenSelector() {},
+    },
+});
+```
+
+注意:数据控制器中不能使用 $name、$components、$methods 这三项,因为实际合并时会覆盖
+
+## 新页面模板
+
+新建页面时,可使用如下空白页面模板
+
+### 页面层
+
+#### H5 空白页面示例
+
+H5 页面需要 CPage、CContent、CNavBar 这三个基础页面组件
+
+```html
+/**
+* pageName - 页面名称
+* @author 作者
+*/
+
+<template>
+    <CPage>
+        <CNavBar title="页面名称" />
+        <CContent class="page-name">
+            <!-- 页面内容 -->
+        </CContent>
+    </CPage>
+</template>
+
+<script>
+    import Taro from '@tarojs/taro';
+    import {} from 'taro-ui-vue';
+    import {
+        PPageName
+    } from '@pilots/pilotGroup/PPageName';
+    import {
+        CPage,
+        CContent,
+        CNavBar
+    } from '@components/layout/h5Page';
+    import './pageName.scss';
+
+    export default {
+        name: 'PageName',
+        components: {},
+        ...new PPageName().createOptions(),
+    };
+</script>
+```
+
+#### 小程序空白页面示例
+
+```html
+/**
+* pageName - 页面名称
+* @author 作者
+*/
+
+<template>
+    <view class="page-name">
+        <!-- 页面内容 -->
+    </view>
+</template>
+
+<script>
+    import Taro from '@tarojs/taro';
+    import {} from 'taro-ui-vue';
+    import {
+        PPageName
+    } from '@pilots/pilotGroup/PPageName';
+    import './pageName.scss';
+
+    export default {
+        name: 'PageName',
+        components: {},
+        ...new PPageName().createOptions(),
+    };
+</script>
+```
+
+#### 空白样式文件示例
+
+```css
+/**
+ * pageName - 页面名称
+ * @author 作者
+ */
+
+@import "../../../components/common/sassMixin";
+
+.page-name {}
+```
+
+### 数据控制层
+
+#### 空白数据控制层示例
+
+```js
+/**
+ * PPageName - 页面名称
+ * @author 作者
+ */
+
+import Taro from '@tarojs/taro';
+import {
+    Pilot
+} from '@components/bases/Pilot';
+import {
+    $fetchCommon
+} from '@fetchers/FCommon';
+
+export class PPageName extends Pilot {
+
+    $data() {
+        return {};
+    }
+
+    $mounted() {
+        this.onLoadDataResource();
+    }
+
+    // 加载用户详情
+    onLoadDataResource() {
+        Taro.showLoading();
+        $fetchCommon.getPageDetail()
+            .then(res => {
+                Taro.hideLoading();
+                if (!res) {
+                    return;
+                }
+                // do something
+            });
+    }
+
+}
+```
+
+#### 空白请求层示例
+
+```js
+/**
+ * FCommon
+ * @author 作者
+ */
+
+import {
+    Fetcher
+} from '@components/bases/Fetcher';
+
+class FCommon extends Fetcher {
+
+    constructor() {
+        super({
+            // url前缀(本地路径, 服务器路径)
+            urlPrefix: ['/api/common/', '/serverPath/'],
+        });
+    }
+
+    // 读取页面详情
+    getPageDetail() {
+        const url = this.spellURL('getPageDetail', 'page/Detail');
+        const send = {};
+        return this.post(url, send);
+    }
+
+}
+
+export const $fetchCommon = new FCommon();
+```

--
Gitblit v1.9.1