XiaBx vor 2 Jahren
Commit
a6c8180e97

+ 26 - 0
.gitignore

@@ -0,0 +1,26 @@
+.DS_Store
+node_modules
+/dist
+/build
+
+# sign
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
+.ide
+.quickapp.preview.json

+ 1 - 0
.npmrc

@@ -0,0 +1 @@
+registry="https://registry.npm.taobao.org"

+ 6 - 0
.prettierignore

@@ -0,0 +1,6 @@
+package.json
+manifest.json
+README.md
+
+# assets/js
+src/assets/js/*.js

+ 39 - 0
README.md

@@ -0,0 +1,39 @@
+# 快应用示例模版
+
+## 文件结构
+
+```
+├── sign                # 存储 rpk 包签名模块;
+│   ├── certificate.pem # 证书文件
+│   └── private.pem     # 私钥文件
+└── src
+│   ├── assets          # 公用的资源(images/styles/字体...)
+│   │   ├──images       # 存储 png/jpg/svg 等公共图片资源
+│   │   └──styles       # 存放 less/css/sass 等公共样式资源
+│   │   └──js           # 存储公共 javaScript 代码资源
+│   │   └──iconfont     # 存放图标字体
+│   ├── CardDemo        # 快应用卡片示例页面
+│   ├── helper          # 项目自定义辅助各类工具
+│   │   └──utils        # 存放项目所封装的工具类方法
+│   ├── pages           # 统一存放项目页面级代码
+│   ├── app.ux          # 应用程序代码的人口文件
+│   ├── manifest.json   # 配置快应用基本信息
+│   └── components      # 存放快应用组件
+└── package.json        # 定义项目需要的各种模块及配置信息
+└── prettier.config.js  #代码美化规则
+```
+
+
+## GIT 提交规范
+- 项目通过 [commitlint](https://github.com/conventional-changelog/commitlint) + [husky](https://github.com/typicode/husky) 进行git代码约束
+ 示例:git commit 提交规范:(git commit -m 'feat: 新增功能') 跳过git commit 步骤 (git commit -m 'feat:xxxxx' --no-verify)
+ #### 相关参数
+- feat: 新增功能
+- fix: BUG修复
+- perf 性能优化
+- style 不影响程序逻辑的代码修改(修改空白字符,补全缺失的分号等)
+- test 新增测试用例或者更新
+- docs 文档类修改
+- refactor 重构代码
+- revert 回滚某个更早之前提交
+- chore:不属于以上类型的其他类型(日常事务)

+ 52 - 0
commitlint.config.js

@@ -0,0 +1,52 @@
+  
+module.exports = {
+    //忽略初始化
+    ignores: [(commit) => commit.includes('init')],
+    //第三方NPM包
+    extends: ['@commitlint/config-conventional'],
+    //解析器配置
+    parserPreset: {
+      parserOpts: {
+        //头部正则校验
+        headerPattern: /^(\w*|[\u4e00-\u9fa5]*)(?:[\(\(](.*)[\)\)])?[\:\:] (.*)/,
+        //headerPattern: /^(\w*)(?:\((.*)\))?:\s(.*)$/,
+        headerCorrespondence: ['type', 'scope', 'subject'],
+        referenceActions: [
+          'close',
+          'closes',
+          'closed',
+          'fix',
+          'fixes',
+          'fixed',
+          'resolve',
+          'resolves',
+          'resolved',
+        ],
+      },
+    },
+    rules: {
+      'body-leading-blank': [2, 'always'],
+      'footer-leading-blank': [1, 'always'],
+      'header-max-length': [2, 'always', 108],
+      'subject-empty': [2, 'never'],
+      'type-empty': [2, 'never'],
+      'type-enum': [
+        2,
+        'always',
+        [
+          'feat',
+          'fix',
+          'perf',
+          'style',
+          'docs',
+          'test',
+          'refactor',
+          'revert',
+          'chore',
+          'build',
+          'ci' 
+        ],
+      ],
+    },
+  };
+  

Datei-Diff unterdrückt, da er zu groß ist
+ 3566 - 0
package-lock.json


+ 53 - 0
package.json

@@ -0,0 +1,53 @@
+{
+  "name": "zsy_quickapp",
+  "version": "2.0.0",
+  "description": "Quickapp Sample Template",
+  "scripts": {
+    "start": "hap server --watch",
+    "server": "hap server",
+    "build": "hap build",
+    "release": "hap release",
+    "watch": "hap watch",
+    "debug": "hap debug",
+    "gen": "node ./scripts/gen/index.js",
+    "precommit-msg": "echo '🚧 start pre-commit checks ...' && exit 0",
+    "prettier": "node ./scripts/selfCloseInputTag.js && prettier --write \"src/**/*.{ux,js,json,less,scss,css,pcss,md,vue}\"",
+    "prettier-watcher": "onchange '**/*.md' \"src/**/**/*.{ux,js,json,less,scss,css,pcss,md,vue}\" -- prettier --write {{changed}}"
+  },
+  "dependencies": {
+    "@commitlint/cli": "^17.0.3",
+    "@commitlint/config-conventional": "^17.0.3",
+    "apex-ui": "^1.9.2"
+  },
+  "devDependencies": {
+    "@babel/runtime": "^7.12.5",
+    "@types/quickapp": "npm:quickapp-interface@1.0.0",
+    "colors": "^1.4.0",
+    "husky": "^7.0.1",
+    "less": "^4.1.1",
+    "less-loader": "^10.0.1",
+    "lint-staged": "^11.0.1",
+    "onchange": "^5.2.0",
+    "prettier": "^2.3.2",
+    "prettier-plugin-ux": "^0.3.0"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "yarn run precommit-msg && lint-staged"
+    }
+  },
+  "lint-staged": {
+    "**/**.{ux,js,json,less,scss,css,pcss,md,vue}": [
+      "prettier --write",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "快应用",
+    "快应用示例",
+    "快应用模版"
+  ],
+  "browserslist": [
+    "chrome 65"
+  ]
+}

+ 38 - 0
prettier.config.js

@@ -0,0 +1,38 @@
+module.exports = {
+    //指定每行长度
+    printWidth: 150,
+    //指定缩进的空格数
+    tabWidth: 2,
+    //用tab代替空格
+    useTabs: false,
+    //行尾自动加分号
+    semi: true,
+    //对Vue文件中<script>和<style>标签内的代码进行缩进
+    vueIndentScriptAndStyle: true,
+    singleQuote: true,
+    //对象里的key是否引号包裹 1.as-needed 2.consistent 3.preserve
+    quoteProps: 'as-needed',
+    //对象字面增加空格
+    bracketSpacing: true,
+    //多行情况下,在末尾增加逗号
+    trailingComma: 'es5',
+    //jsx 单引号代替双引号
+    jsxSingleQuote: false,
+    //箭头函数单参数是否用括号
+    arrowParens: 'always',
+    //插入特殊符号
+    insertPragma: false,
+    //注释代码格式化
+    requirePragma: false,
+    //是否折叠行
+    proseWrap: 'never',
+    //html対空格敏感度
+    htmlWhitespaceSensitivity: 'strict',
+    //结尾自动换行
+    endOfLine: 'auto',
+    //是否格式化某一部分
+    rangeStart: 0,
+    //使用单引号
+    "singleQuote": true,
+  };
+  

+ 87 - 0
scripts/gen/index.js

@@ -0,0 +1,87 @@
+/**
+ * @desc: gen script command,make a new page generated by one click.
+ * @author: nicejade
+ */
+
+const fs = require('fs')
+const path = require('path')
+const colors = require('colors')
+
+const newFolderName = process.argv[2]
+
+String.prototype.firstUpperCase = function() {
+  return this.replace(/\b(\w)/g, $1 => {
+    return $1.toLowerCase()
+  })
+}
+const resolve = dir => {
+  return path.join(__dirname, '../..', dir)
+}
+
+const successExecPrint = msg => {
+  console.log(
+    colors.green(`✓ `) +
+      colors.cyan(`${msg} `) +
+      colors.green('task has been successfully executed.')
+  )
+}
+
+function createNewPage(newFolderPath) {
+  const mReg = new RegExp('@PAGE_CLASS_NAME', 'g')
+  const pageContent = fs.readFileSync(`${__dirname}/template.ux`, 'UTF-8')
+  const rootClassName = newFolderName
+    .firstUpperCase()
+    .replace(/([A-Z])/g, '-$1')
+    .toLowerCase()
+  const newContent = pageContent.replace(mReg, rootClassName)
+
+  fs.mkdirSync(newFolderPath, 0777)
+  fs.writeFile(`${newFolderPath}/index.ux`, newContent, error => {
+    if (error) throw `Something went wrong: ${error}`
+  })
+  successExecPrint('Create New Page')
+}
+
+function saveRouter2Manifest() {
+  const manifestPath = resolve('/src/manifest.json')
+  let manifestConf = fs.readFileSync(manifestPath, 'UTF-8')
+  manifestConf = JSON.parse(manifestConf)
+  const routerPages = manifestConf.router.pages
+  routerPages[`pages/${newFolderName}`] = {
+    component: 'index'
+  }
+  manifestConf = JSON.stringify(manifestConf, null, 2)
+  fs.writeFile(manifestPath, manifestConf, error => {
+    if (error) throw `Something went wrong[@saveRouter2Manifest]: ${error}`
+  })
+  successExecPrint('Save Router Into Manifest')
+}
+
+function main() {
+  if (!newFolderName) {
+    return console.warn(
+      `⚠️  Please enter the name of the page you want to create.`.underline.red
+    )
+  }
+
+  const folderNameReg = /^[A-Z][[A-Za-z0-9]+$/
+  if (!folderNameReg.test(newFolderName)) {
+    return console.warn(
+      `⚠️  Please enter the standard Folder name. Eg: XyzAbcde.`.underline.red
+    )
+  }
+
+  const newFolderPath = path.join(__dirname, `../../src/pages/${newFolderName}`)
+  const isExist = fs.existsSync(newFolderPath)
+
+  if (isExist) {
+    return console.warn(
+      `⚠️  ${newFolderName} already exists in the /src/pages/ directory.`
+        .underline.red
+    )
+  }
+  createNewPage(newFolderPath)
+  saveRouter2Manifest()
+}
+
+main()

+ 28 - 0
scripts/gen/template.ux

@@ -0,0 +1,28 @@
+<template>
+  <div class="wrapper">
+    <text class="title">{{ title }}</text>
+  </div>
+</template>
+
+<script>
+export default {
+  private: {
+    title: '欢迎体验快应用开发'
+  },
+
+  onInit() {}
+}
+</script>
+
+<style lang="less">
+@import './../../assets/styles/style.less';
+
+.wrapper {
+  .flex-box-mixins(column, center, center);
+  .title {
+    font-size: 8 * @size-factor;
+    text-align: center;
+    color: @black;
+  }
+}
+</style>

+ 36 - 0
scripts/selfCloseInputTag.js

@@ -0,0 +1,36 @@
+/**
+ * @file: selfCloseInputTag.js
+ * @desc: 遍历指定目录下 .ux 文件,将其中 input 标签由 <input **></input> 转换为 <input ** />
+ * @date: 2019-01-23
+ */
+
+const fs = require('fs')
+const path = require('path')
+
+const quickappCodePath = './src/'
+
+const main = codePath => {
+  const traversing = cpath => {
+    const files = fs.readdirSync(cpath)
+    files.forEach(fileName => {
+      const fPath = path.join(cpath, fileName)
+      const stats = fs.statSync(fPath)
+      stats.isDirectory() && traversing(fPath)
+      stats.isFile() && fPath.endsWith('.ux') && matchAndReplace(fPath)
+    })
+  }
+  traversing(codePath)
+}
+
+const matchAndReplace = path => {
+  const pageContent = fs.readFileSync(path, 'UTF-8')
+  const newContent = pageContent.replace(
+    /(<)([\s]*?)(input\b[^\/]*?)>[\s\S]*?<\/input>/gm,
+    '$1$3 />'
+  )
+  fs.writeFile(path, newContent, error => {
+    if (error) throw `Something went wrong: ${error}`
+  })
+}
+
+main(quickappCodePath)

+ 26 - 0
sign/release/certificate.pem

@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIJAMejl+Lvsjn8MA0GCSqGSIb3DQEBCwUAMIHDMQswCQYD
+VQQGEwJaSDERMA8GA1UECAwIWmhlSmlhbmcxEjAQBgNVBAcMCUhhbmcgWmhvdTFF
+MEMGA1UECgw8w6bCncKtw6XCt8Kew6bCjsKMw6fCu8K0w6fCp8KRw6bCisKAw6bC
+nMKJw6nCmcKQw6XChcKsw6XCj8K4MRMwEQYDVQQLDApPcGVyYXRpb25zMRAwDgYD
+VQQDDAdkZWZhdWx0MR8wHQYJKoZIhvcNAQkBFhA1MDMzMjUwMTdAcXEuY29tMB4X
+DTE5MTAzMDA4MjkwM1oXDTI5MTAyNzA4MjkwM1owgcMxCzAJBgNVBAYTAlpIMREw
+DwYDVQQIDAhaaGVKaWFuZzESMBAGA1UEBwwJSGFuZyBaaG91MUUwQwYDVQQKDDzD
+psKdwq3DpcK3wp7DpsKOwozDp8K7wrTDp8KnwpHDpsKKwoDDpsKcwonDqcKZwpDD
+pcKFwqzDpcKPwrgxEzARBgNVBAsMCk9wZXJhdGlvbnMxEDAOBgNVBAMMB2RlZmF1
+bHQxHzAdBgkqhkiG9w0BCQEWEDUwMzMyNTAxN0BxcS5jb20wggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDgF4Vxg3qofpvewPsa0PNIu2Cd5nCF3zGQMfSP
+bwey1bhGkUHsu1FARI72ltJfaKqBnUDMH1gLcfoDiS2QYxLAQsKZb243eumvkEo4
+2564WJd9Wp8UPbQ7FomwefNXD7xNnj29YFo/rzj3CQTyBfo7yOQP2ZXPTXg+AR+a
+CgPozzSPQv2P9UJ+inkftWuPpJw51F832B2cloRyoznYoQRaJ1nFXJtxscelaNoy
+BRh9qrgBsXNMRE51T7kwf/e7TuKl9HvJ4bGuMUOG9K6rGYuWcvMnjPx50TyokxnF
+U3+FqfnuUxEfHZBOzsIFB/XF3FRoPiIN35dqlt0oDXxF03k5AgMBAAGjUzBRMB0G
+A1UdDgQWBBTiK+2T4ctk3lTlVDeWt49JaHyEKzAfBgNVHSMEGDAWgBTiK+2T4ctk
+3lTlVDeWt49JaHyEKzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IB
+AQBLYVYAq0LPl+/iuvPT/MluHU2fzyAIcqeoLZ0x+AxufFi0YWA6vfmVLAdYAJ9S
+UIHIJGoaA2b8bKQ7OXDgyv6hV4TXnX+YC17oQpUYTg65Va3xTI1yyoHsCHy4fYBc
+HduFEdcWWbJKRI75OlSjLnqnvPTmCs9cABRH2DPGaOyRGgr46xugZvtKrfYZv9m+
+eBAp20OKTrw+v7TzsbGjMEKrT5aJEmNvdFdtVfCFioNXi4fn7TxOli2q4E2JJSLN
+UBT00Eyuo0ywHrq+2BmWeRgrIiZULFIW0Nhe/sXXse7BaFE/d/PV4G0cPEnrwLE2
+mADdDi8gGdy+5rehrHrVSjcD
+-----END CERTIFICATE-----

+ 28 - 0
sign/release/private.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDgF4Vxg3qofpve
+wPsa0PNIu2Cd5nCF3zGQMfSPbwey1bhGkUHsu1FARI72ltJfaKqBnUDMH1gLcfoD
+iS2QYxLAQsKZb243eumvkEo42564WJd9Wp8UPbQ7FomwefNXD7xNnj29YFo/rzj3
+CQTyBfo7yOQP2ZXPTXg+AR+aCgPozzSPQv2P9UJ+inkftWuPpJw51F832B2cloRy
+oznYoQRaJ1nFXJtxscelaNoyBRh9qrgBsXNMRE51T7kwf/e7TuKl9HvJ4bGuMUOG
+9K6rGYuWcvMnjPx50TyokxnFU3+FqfnuUxEfHZBOzsIFB/XF3FRoPiIN35dqlt0o
+DXxF03k5AgMBAAECggEAcR4udECEWC2hDO6pUr4LMLm1ab97KXijEkDFTOolHrcX
+kDee6Zscxq5U5FD53MN+3nK81M01qoFcTRCf+XSpcHfCt6UyI7td3wudC9qA4lmG
+DvcBujvzkKgt1PGaTmZZDW1FiSTsKZ2PydO5tVojGK6twPp6zuwyOEpk42MO2iNc
+eojVmJX14vJ2pAAwwKq8X4YDtVoS4vFKcXsKlYuz+d5vqxurzsq0gCxsPZnV90Ad
+ACb4WtGTtoeKX7lD4b7fGlilZ3RBKXM5D3yRVq0i9akzDZIXTFnojxbCxwBIIrQ6
+MYN3kAYKZcp3JOVeAAgH2jo+0SDYgpMEOEHM5UEwAQKBgQDws6/lfciGWnKJJ1v8
+eviinohnRuILbEhIajjyC/I32j28g/p6O2LasslpH4TZRgIQljmLvMeMHM8BRpfw
+MH8NR0EGJRG4YpSuaDwGGRcYp8wpOOJvyeFP2EKbBG6GzV1gE6HWD9yVZ9QKHZK4
+D8UtAlWfXZhzqt0sLYcjE+34OQKBgQDuVZUquZL4ZnRx3MdnzNFEDCpQChzOr9z3
+H+mrK70KhKE3xzsbHFmUOoFCSTnYyMSGi5UuuVY7yl7hHkw6h7XvNOKKpRf3dLb7
+VoxzXgj/l/8L/xAJ+6+wkhp3jwUzYmqOkuIRGzB+gHxr20oR0vRJKo3q1gsrlanS
+Ui9EgoeJAQKBgQDnpCVc98Xo9lZPg99UhYuOBH9E1MRpNdYCSqdu2OxLr+3F5EVD
+KK+jxHdsgXa6GlOWXtwWjKCFSJw2oBdMgX9j6fS70yTQi56Gka1iOPcvNRyXdzUD
+XAdHbdn7kTJE7JI2Ce6vMSiZaAh5i6hNFnAtNpfr/Ijgl8it4UqyCVX0kQKBgQDn
+IyzFALAeIw6vFlR0wFf6zGmEsin58Og06kgtbv+o4bOQarFRu47MiGivJmDpctvV
+OC134NpWpg6Z+E4pPVAeKoXBvBagMBr9aZRQllPXvUrmEXk2lVZvwWHVrWh3yuxY
+VO7VdC71oBoKZ+NPoeyzwIddxjOTE1Rc2sNoh8Z2AQKBgQDEkydkQVLA1Xx36U6j
+VxCt6U1ap+LS8YDv86VAUszHF1EqZ7ULHcmQHCNB/BJURijXu+fWk4WWmXBRiaE2
+Qfn3m+4VC2WqBub9Q3oQt1X8DEDvu9+nlSWysi40O4On73OCu1KuCdGj4YJ78NoB
+HSKG9Rcz0pW0o3Q05kZWo8F2HA==
+-----END PRIVATE KEY-----

+ 17 - 0
src/app.ux

@@ -0,0 +1,17 @@
+<script>
+  /**
+   * 应用级别的配置,供所有页面公用
+   */
+
+  const $utils = require('./helper/utils').default;
+
+
+  /* @desc: 注入方法至全局 global,以便页面调用 */
+  const hook2global = global.__proto__ || global;
+  hook2global.$utils = $utils;
+
+
+  export default {
+    onCreate() {},
+  };
+</script>

BIN
src/assets/images/logo.png


+ 5 - 0
src/assets/styles/mixins.less

@@ -0,0 +1,5 @@
+.flex-box-mixins (@column, @justify, @align) {
+  flex-direction: @column;
+  justify-content: @justify;
+  align-items: @align;
+}

+ 2 - 0
src/assets/styles/style.less

@@ -0,0 +1,2 @@
+@import './variables.less';
+@import './mixins.less';

+ 9 - 0
src/assets/styles/variables.less

@@ -0,0 +1,9 @@
+@brand: #09ba07;
+
+@white: #ffffff;
+@black: #000000;
+@grey: #9393aa;
+@red: #fa0101;
+@green: #ffff00;
+
+@size-factor: 5px;

+ 29 - 0
src/helper/utils.js

@@ -0,0 +1,29 @@
+/**
+ * 您可以将常用的方法、或系统 API,统一封装,暴露全局,以便各页面、组件调用,而无需 require / import.
+ */
+const prompt = require('@system.prompt');
+
+/**
+ * 拼接 url 和参数
+ */
+function queryString(url, query) {
+  let str = [];
+  for (let key in query) {
+    str.push(key + '=' + query[key]);
+  }
+  let paramStr = str.join('&');
+  return paramStr ? `${url}?${paramStr}` : url;
+}
+
+function showToast(message = '', duration = 0) {
+  if (!message) return;
+  prompt.showToast({
+    message: message,
+    duration,
+  });
+}
+
+export default {
+  showToast,
+  queryString,
+};

+ 57 - 0
src/manifest.json

@@ -0,0 +1,57 @@
+{
+  "package": "com.beidao.kuaiying.zsy",
+  "name": "追书云",
+  "versionName": "1.0.0",
+  "versionCode": 1,
+  "minPlatformVersion": 1080,
+  "icon": "/assets/images/logo.png",
+  "features": [
+    {
+      "name": "system.prompt"
+    },
+    {
+      "name": "system.router"
+    },
+    {
+      "name": "system.shortcut"
+    },
+    {
+      "name": "system.fetch"
+    }
+  ],
+  "permissions": [
+    {
+      "origin": "*"
+    }
+  ],
+  "template/official": "demo-template",
+  "config": {
+    "logLevel": "debug"
+  },
+  "router": {
+    "entry": "pages/Demo",
+    "pages": {
+      
+    },
+    "widgets": {
+      "CardDemo": {
+        "name": "CardDemo",
+        "description": "快应用卡片展示",
+        "component": "index",
+        "path": "/CardDemo",
+        "minPlatformVersion": 1032,
+        "targetManufactorys": [
+          "vivo"
+        ],
+        "features": []
+      }
+    }
+  },
+  "display": {
+    "titleBarBackgroundColor": "#f2f2f2",
+    "titleBarTextColor": "#414141",
+    "pages": {
+      
+    }
+  }
+}

+ 3 - 0
src/sitemap.json

@@ -0,0 +1,3 @@
+{
+  "rules": [{ "rule": "enable", "page": "*" }]
+}