# e锦水小程序开发文档 ## 一、该小程序框架 所包含的功能以如下: ### 1、引入前端打包工具gulp,实现代码压缩等功能 ### 2、通过gulp,使typescript 编译产生 javascript ### 3、通过gulp,引入css预处理器 sass 编译产生 css 可实现换肤功能 ### 4、引入eslint, 用于统一团队代码规范 ### 5、之后不再写 js 和 wxss,为了便于快速生成小程序页面和组件(.ts .scss .json .wxml),新增脚本,新增命令行 ``` npm run new:page // 请输入要生成的页面路径,会生成在src/目录下 eg: pages/auto/auto // 会在pages自动生成auto页面 npm run new:component // 请输入要生成的组件路径,会生成在src/目录下 eg: components/loadMore/loadMore 会在通用组件下生成 上拉加载 组件 ``` ### 6、可以通过 cross-env 搭配 gulp-preprocess 实现多环境变量,不过暂时感觉意义不大 ## 二、该小程序框架 代码规范如下: ### 1、小程序开发规范----ts/js代码规范 ### (1)、页面级API顺序 ``` Page({ data: { // 页面数据 } onLoad () { // 页面实例创建完成 }, onShow () { // 页面出现在前台时执行 }, onReady () { // 页面首次渲染完毕时执行 }, onHide () { // 页面从前台变为后台时执行 }, onUnload () { // 页面销毁时执行 }, onPullDownRefresh () { // 触发下拉刷新时执行 }, onReachBottom () { // 页面触底时执行 }, onPageScroll () { // 页面滚动时执行 }, onShareAppMessage () { // 页面被用户分享时执行 }, onResize () { // 页面尺寸变化时执行 }, onTabItemTap (item) { // tab 点击时执行 }, // 最后写自定义方法, 每一个方法加注释 页面生命周期和内置方法不需要加注释,没用到的方法不需要写出来 customMethod () {} }) ``` ### (2)、组件级API顺序 ``` Component({ data: { // 组件数据 }, properties: { // props 数据 }, lifetimes: { created () { // 组件实例刚刚被创建 } attached () { // 实例创建完成 并加入页面Dom树 }, ready () { // 组件在视图层布局完成 }, detached () { // 组件实例从页面DOM树移除 } }, pageLifetimes: { show () { // 组件所在页面进入前台 }, hide () { // 页面进入后台 }, reside () { // 页面尺寸变化 } }, methods: { // 组件内的方法 记得每一个方法加注释,组件生命周期和内置方法不需要加注释,没用到的内置方法不需要写 } }) ``` ### (3)、有时某个字段有多个状态,传给后端的是状态对应的数字,可以使用枚举来区分,同时将注释填写完整。 其他同事阅读代码时,更容易理解。 ``` const selfStatus = 4 /* eslint-disable no-unused-vars */ enum Status { success = 1, // 成功 fail = 2, // 失败 error = 3, // 产生错误 pending = 4 // 加载中 } if (selfStatus === Status.success) { this.setData({ status: Status.success }) } else if (selfStatus === Status.fail) { this.setData({ status: Status.fail }) } else if (selfStatus === Status.error) { this.setData({ status: Status.error }) } else if (selfStatus === Status.pending) { this.setData({ status: Status.pending }) } console.log(this.data.status) // 4 ``` ### (4)、项目存在迭代升级,后端接口会随时更新,前端对于每个功能模块采用 命名空间的方式来适应后端迭代升级。 ``` // 后端接口 加入命名空间定义 // 命名空间v1 export namespace indexV1 { /** * 未转项目议题列表(热议中,已关闭)接口 * @param {string} deptId 部门Id * @param {Number} pageIndex 页码 * @param {Number} pageSize 页容量 * @param {string} stateType 状态类型:1.热议中,2.已关闭 */ export function getUnpassedList ({ deptId, pageIndex, pageSize, stateType }: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) { return request({ method: "GET", url: "cloudAnalysis/issue/getUnpassedList", options: { deptId, pageIndex, pageSize, stateType } }) } } // 命名空间v2 export namespace indexV2 { /** * 未转项目议题列表(热议中,已关闭)接口 * @param {string} deptId 部门Id * @param {Number} pageIndex 页码 * @param {Number} pageSize 页容量 * @param {string} stateType 状态类型:1.热议中,2.已关闭 */ export function getUnpassedList ({ deptId, pageIndex, pageSize, stateType }: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) { return request({ method: "GET", url: "cloudAnalysis/issue/getUnpassedList", options: { deptId, pageIndex, pageSize, stateType } }) } } // 接口使用 import { indexV1, indexV2 } from "../../api/index" async getIssueListV1 () { const para = { deptId: "", pageIndex: 1, pageSize: 10, stateType: "1" } try { let resV1 = await indexV1.getUnpassedList(para) // 使用v1版本的接口 let resV2 = await indexV2.getUnpassedList(para) // 使用v2版本的接口 console.log(resV1) console.log(resV2) } catch (e) { console.log(e) } } ``` ### (5)、所有后端接口 全部放入 api 文件夹下对应的模块文件内,便于统一管理,每个接口注释其作用,入参类型、含义。 * 接口参数 <= 3, 接口函数形参逐一填写 * 接口参数 > 3 && <= 5 可以一个形参(对象)或者形参逐一写上 * 接口参数 > 5 必须 一个形参(对象) ``` /** * 未转项目议题列表(热议中,已关闭)接口 * @param {string} deptId 部门Id * @param {Number} pageIndex 页码 * @param {Number} pageSize 页容量 * @param {string} stateType 状态类型:1.热议中,2.已关闭 */ export function getUnpassedList ({ deptId, pageIndex, pageSize, stateType }: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) { return request({ method: "GET", url: "cloudAnalysis/issue/getUnpassedList", options: { deptId, pageIndex, pageSize, stateType } }) } // 或者 export function getUnpassedList ( options: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) { return request({ method: "GET", url: "cloudAnalysis/issue/getUnpassedList", options }) } ``` ### (6)、页面跳转 不要使用相对路径,一律使用绝对路径,便于某个模块或某个页面复用 ``` wx.navigateTo({ url: "/pages/index/index" }) wx.navigateTo({ url: "/subpages/reality/pages/realityIndex/realityIndex" }) ``` ### 2、小程序开发规范---- wxml代码规范 ### (1)、当标签属性超过三个时,一律换行展示,不要一梭到底 ``` {{item.label}} ``` ### (2)、 除了动态属性,禁止在wxml里面写内联样式 ### (3)、最外层的components放公共组件(公共组件可以全局配置为全局组件这样就不需要用到的时候在引入),业务模块组件在自己所在页面下建components存放 ``` src ├─api ├─components ---- 公共组件/通用组件 ├─filters ├─pages ├ ├─index ├ ├─components --- 模块组件/页面拆分组件 ├ ├─index.json ├ ├─index.ts ├ ├─index.scss ├ └index.wxml └subpages ``` ### 3、小程序开发规范---- wxss/scss规范 ### (1)、 class名严禁使用驼峰式命名,一律使用中划线连接 eg: load-more