榆山数据端小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
liushaowen efd646a82b 子页面标题根据首页获得的名称动态设定 5 years ago
.vscode 榆山领导端init 5 years ago
src 子页面标题根据首页获得的名称动态设定 5 years ago
typings 榆山领导端init 5 years ago
.eslintignore 分离 5 years ago
.eslintrc.js 分离 5 years ago
.gitignore gulp修改 5 years ago
README.md gulp修改 5 years ago
gulpfile.js gulp修改 5 years ago
package-lock.json gulp修改 5 years ago
package.json gulp修改 5 years ago
project.config.json project.config.json 5 years ago
tsconfig.json 榆山领导端init 5 years ago

README.md

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)、当标签属性超过三个时,一律换行展示,不要一梭到底

<cover-view 
  catchtap="onChnageUnionCondition"
  data-condition="{{item.value}}"
  class="list-item"
  wx:for="{{categoryList}}"
  wx:for-index="index"
  wx:for-item="item" wx:key="index">
  <cover-view class="name">{{item.label}}</cover-view>
  <cover-view wx:if="{{selectUnionCondition.value === item.value}}" class="select">√</cover-view>
</cover-view>

(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