小程序
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
# http://editorconfig.org
 | 
			
		||||
root = true
 | 
			
		||||
 | 
			
		||||
[*]
 | 
			
		||||
indent_style = space
 | 
			
		||||
indent_size = 2
 | 
			
		||||
charset = utf-8
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
 | 
			
		||||
[*.md]
 | 
			
		||||
trim_trailing_whitespace = false
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
TARO_APP_ID="wx8902ddbfddb820d1"
 | 
			
		||||
TARO_APP_BASE_API="http://172.10.10.93:8765"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
TARO_APP_ID="wx24cc8a872b57ac79"
 | 
			
		||||
TARO_APP_BASE_API="http://172.10.10.207:7000"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
# TARO_APP_ID="测试环境下的小程序appid"
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
// ESLint 检查 .vue 文件需要单独配置编辑器:
 | 
			
		||||
// https://eslint.vuejs.org/user-guide/#editor-integrations
 | 
			
		||||
{
 | 
			
		||||
  "extends": [
 | 
			
		||||
    "taro/vue3"
 | 
			
		||||
  ],
 | 
			
		||||
  "rules": {
 | 
			
		||||
    "vue/multi-word-component-names": "off"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
dist/
 | 
			
		||||
deploy_versions/
 | 
			
		||||
.temp/
 | 
			
		||||
.rn_temp/
 | 
			
		||||
node_modules/
 | 
			
		||||
.DS_Store
 | 
			
		||||
.swc
 | 
			
		||||
yarn.lock
 | 
			
		||||
components.d.ts
 | 
			
		||||
package-lock.json
 | 
			
		||||
.vscode
 | 
			
		||||
.idea
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
import TestUtils from '@tarojs/test-utils-vue3'
 | 
			
		||||
 | 
			
		||||
describe('Testing', () => {
 | 
			
		||||
 | 
			
		||||
  test('Test', async () => {
 | 
			
		||||
    const testUtils = new TestUtils()
 | 
			
		||||
    await testUtils.createApp()
 | 
			
		||||
    await testUtils.PageLifecycle.onShow('pages/index/index')
 | 
			
		||||
    expect(testUtils.html()).toMatchSnapshot()
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
// babel-preset-taro 更多选项和默认值:
 | 
			
		||||
// https://github.com/NervJS/taro/blob/next/packages/babel-preset-taro/README.md
 | 
			
		||||
module.exports = {
 | 
			
		||||
  presets: [
 | 
			
		||||
    ['taro', {
 | 
			
		||||
      framework: 'vue3',
 | 
			
		||||
      ts: true
 | 
			
		||||
    }]
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
import type { UserConfigExport } from "@tarojs/cli";
 | 
			
		||||
export default {
 | 
			
		||||
   logger: {
 | 
			
		||||
    quiet: false,
 | 
			
		||||
    stats: true
 | 
			
		||||
  },
 | 
			
		||||
  mini: {},
 | 
			
		||||
  h5: {}
 | 
			
		||||
} satisfies UserConfigExport
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
import {defineConfig, type UserConfigExport} from '@tarojs/cli'
 | 
			
		||||
import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'
 | 
			
		||||
import devConfig from './dev'
 | 
			
		||||
import prodConfig from './prod'
 | 
			
		||||
import ComponentsPlugin from 'unplugin-vue-components/webpack'
 | 
			
		||||
import NutUIResolver from '@nutui/auto-import-resolver'
 | 
			
		||||
 | 
			
		||||
// https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数
 | 
			
		||||
export default defineConfig(async (merge, {command, mode}) => {
 | 
			
		||||
  const baseConfig: UserConfigExport = {
 | 
			
		||||
    projectName: 'collect_information',
 | 
			
		||||
    date: '2024-4-12',
 | 
			
		||||
    designWidth(input: any) {
 | 
			
		||||
      // 配置 NutUI 375 尺寸
 | 
			
		||||
      if (input?.file?.replace(/\\+/g, '/').indexOf('@nutui') > -1) {
 | 
			
		||||
        return 375
 | 
			
		||||
      }
 | 
			
		||||
      // 全局使用 Taro 默认的 750 尺寸
 | 
			
		||||
      return 750
 | 
			
		||||
    },
 | 
			
		||||
    deviceRatio: {
 | 
			
		||||
      640: 2.34 / 2,
 | 
			
		||||
      750: 1,
 | 
			
		||||
      828: 1.81 / 2,
 | 
			
		||||
      375: 2
 | 
			
		||||
    },
 | 
			
		||||
    sourceRoot: 'src',
 | 
			
		||||
    outputRoot: 'dist',
 | 
			
		||||
    plugins: ['@tarojs/plugin-html'],
 | 
			
		||||
    defineConstants: {},
 | 
			
		||||
    copy: {
 | 
			
		||||
      patterns: [],
 | 
			
		||||
      options: {}
 | 
			
		||||
    },
 | 
			
		||||
    framework: 'vue3',
 | 
			
		||||
    compiler: 'webpack5',
 | 
			
		||||
    cache: {
 | 
			
		||||
      enable: false // Webpack 持久化缓存配置,建议开启。默认配置请参考:https://docs.taro.zone/docs/config-detail#cache
 | 
			
		||||
    },
 | 
			
		||||
    mini: {
 | 
			
		||||
      miniCssExtractPluginOption: {
 | 
			
		||||
        ignoreOrder: true
 | 
			
		||||
      },
 | 
			
		||||
      postcss: {
 | 
			
		||||
        pxtransform: {
 | 
			
		||||
          enable: true,
 | 
			
		||||
          config: {}
 | 
			
		||||
        },
 | 
			
		||||
        url: {
 | 
			
		||||
          enable: true,
 | 
			
		||||
          config: {
 | 
			
		||||
            limit: 1024 // 设定转换尺寸上限
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        cssModules: {
 | 
			
		||||
          enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
 | 
			
		||||
          config: {
 | 
			
		||||
            namingPattern: 'module', // 转换模式,取值为 global/module
 | 
			
		||||
            generateScopedName: '[name]__[local]___[hash:base64:5]'
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      webpackChain(chain) {
 | 
			
		||||
        chain.resolve.plugin('tsconfig-paths').use(TsconfigPathsPlugin)
 | 
			
		||||
        chain.plugin('unplugin-vue-components').use(ComponentsPlugin({
 | 
			
		||||
          resolvers: [NutUIResolver({taro: true})]
 | 
			
		||||
        }))
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    h5: {
 | 
			
		||||
      publicPath: '/',
 | 
			
		||||
      staticDirectory: 'static',
 | 
			
		||||
      output: {
 | 
			
		||||
        filename: 'js/[name].[hash:8].js',
 | 
			
		||||
        chunkFilename: 'js/[name].[chunkhash:8].js'
 | 
			
		||||
      },
 | 
			
		||||
      miniCssExtractPluginOption: {
 | 
			
		||||
        ignoreOrder: true,
 | 
			
		||||
        filename: 'css/[name].[hash].css',
 | 
			
		||||
        chunkFilename: 'css/[name].[chunkhash].css'
 | 
			
		||||
      },
 | 
			
		||||
      postcss: {
 | 
			
		||||
        autoprefixer: {
 | 
			
		||||
          enable: true,
 | 
			
		||||
          config: {}
 | 
			
		||||
        },
 | 
			
		||||
        cssModules: {
 | 
			
		||||
          enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
 | 
			
		||||
          config: {
 | 
			
		||||
            namingPattern: 'module', // 转换模式,取值为 global/module
 | 
			
		||||
            generateScopedName: '[name]__[local]___[hash:base64:5]'
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      webpackChain(chain) {
 | 
			
		||||
        chain.resolve.plugin('tsconfig-paths').use(TsconfigPathsPlugin)
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    rn: {
 | 
			
		||||
      appName: 'taroDemo',
 | 
			
		||||
      postcss: {
 | 
			
		||||
        cssModules: {
 | 
			
		||||
          enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (process.env.NODE_ENV === 'development') {
 | 
			
		||||
    // 本地开发构建配置(不混淆压缩)
 | 
			
		||||
    return merge({}, baseConfig, devConfig)
 | 
			
		||||
  }
 | 
			
		||||
  // 生产构建配置(默认开启压缩混淆等)
 | 
			
		||||
  return merge({}, baseConfig, prodConfig)
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
import type { UserConfigExport } from "@tarojs/cli";
 | 
			
		||||
export default {
 | 
			
		||||
  mini: {},
 | 
			
		||||
  h5: {
 | 
			
		||||
    /**
 | 
			
		||||
     * WebpackChain 插件配置
 | 
			
		||||
     * @docs https://github.com/neutrinojs/webpack-chain
 | 
			
		||||
     */
 | 
			
		||||
    // webpackChain (chain) {
 | 
			
		||||
    //   /**
 | 
			
		||||
    //    * 如果 h5 端编译后体积过大,可以使用 webpack-bundle-analyzer 插件对打包体积进行分析。
 | 
			
		||||
    //    * @docs https://github.com/webpack-contrib/webpack-bundle-analyzer
 | 
			
		||||
    //    */
 | 
			
		||||
    //   chain.plugin('analyzer')
 | 
			
		||||
    //     .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [])
 | 
			
		||||
    //   /**
 | 
			
		||||
    //    * 如果 h5 端首屏加载时间过长,可以使用 prerender-spa-plugin 插件预加载首页。
 | 
			
		||||
    //    * @docs https://github.com/chrisvfritz/prerender-spa-plugin
 | 
			
		||||
    //    */
 | 
			
		||||
    //   const path = require('path')
 | 
			
		||||
    //   const Prerender = require('prerender-spa-plugin')
 | 
			
		||||
    //   const staticDir = path.join(__dirname, '..', 'dist')
 | 
			
		||||
    //   chain
 | 
			
		||||
    //     .plugin('prerender')
 | 
			
		||||
    //     .use(new Prerender({
 | 
			
		||||
    //       staticDir,
 | 
			
		||||
    //       routes: [ '/pages/index/index' ],
 | 
			
		||||
    //       postProcess: (context) => ({ ...context, outputPath: path.join(staticDir, 'index.html') })
 | 
			
		||||
    //     }))
 | 
			
		||||
    // }
 | 
			
		||||
  }
 | 
			
		||||
} satisfies UserConfigExport
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
const defineJestConfig = require('@tarojs/test-utils-vue3/dist/jest.js').default
 | 
			
		||||
 | 
			
		||||
module.exports = defineJestConfig({
 | 
			
		||||
  testEnvironment: 'jsdom',
 | 
			
		||||
  testMatch: ['<rootDir>/__tests__/**/*.(spec|test).[jt]s?(x)']
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,95 @@
 | 
			
		|||
{
 | 
			
		||||
  "name": "collect_information",
 | 
			
		||||
  "version": "1.0.0",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "description": "智慧派出所信息采集小程序",
 | 
			
		||||
  "templateInfo": {
 | 
			
		||||
    "name": "default",
 | 
			
		||||
    "typescript": true,
 | 
			
		||||
    "css": "Sass",
 | 
			
		||||
    "framework": "Vue3"
 | 
			
		||||
  },
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "build:weapp": "taro build --type weapp",
 | 
			
		||||
    "build:swan": "taro build --type swan",
 | 
			
		||||
    "build:alipay": "taro build --type alipay",
 | 
			
		||||
    "build:tt": "taro build --type tt",
 | 
			
		||||
    "build:h5": "taro build --type h5",
 | 
			
		||||
    "build:rn": "taro build --type rn",
 | 
			
		||||
    "build:qq": "taro build --type qq",
 | 
			
		||||
    "build:jd": "taro build --type jd",
 | 
			
		||||
    "build:quickapp": "taro build --type quickapp",
 | 
			
		||||
    "build:harmony-hybrid": "taro build --type harmony-hybrid",
 | 
			
		||||
    "dev:weapp": "npm run build:weapp -- --watch",
 | 
			
		||||
    "dev:swan": "npm run build:swan -- --watch",
 | 
			
		||||
    "dev:alipay": "npm run build:alipay -- --watch",
 | 
			
		||||
    "dev:tt": "npm run build:tt -- --watch",
 | 
			
		||||
    "dev:h5": "npm run build:h5 -- --watch",
 | 
			
		||||
    "dev:rn": "npm run build:rn -- --watch",
 | 
			
		||||
    "dev:qq": "npm run build:qq -- --watch",
 | 
			
		||||
    "dev:jd": "npm run build:jd -- --watch",
 | 
			
		||||
    "dev:quickapp": "npm run build:quickapp -- --watch",
 | 
			
		||||
    "dev:harmony-hybrid": "npm run build:harmony-hybrid -- --watch",
 | 
			
		||||
    "test": "jest"
 | 
			
		||||
  },
 | 
			
		||||
  "browserslist": [
 | 
			
		||||
    "last 3 versions",
 | 
			
		||||
    "Android >= 4.1",
 | 
			
		||||
    "ios >= 8"
 | 
			
		||||
  ],
 | 
			
		||||
  "author": "",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@babel/runtime": "^7.21.5",
 | 
			
		||||
    "@nutui/icons-vue-taro": "^0.0.9",
 | 
			
		||||
    "@nutui/nutui-taro": "^4.3.5",
 | 
			
		||||
    "@tarojs/components": "3.6.25",
 | 
			
		||||
    "@tarojs/helper": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-framework-vue3": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-html": "^3.6.26",
 | 
			
		||||
    "@tarojs/plugin-platform-alipay": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-h5": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-harmony-hybrid": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-jd": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-qq": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-swan": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-tt": "3.6.25",
 | 
			
		||||
    "@tarojs/plugin-platform-weapp": "3.6.25",
 | 
			
		||||
    "@tarojs/runtime": "3.6.25",
 | 
			
		||||
    "@tarojs/shared": "3.6.25",
 | 
			
		||||
    "@tarojs/taro": "3.6.25",
 | 
			
		||||
    "dayjs": "^1.11.10",
 | 
			
		||||
    "pinia": "^2.1.7",
 | 
			
		||||
    "vue": "^3.0.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/core": "^7.8.0",
 | 
			
		||||
    "@nutui/auto-import-resolver": "^1.0.0",
 | 
			
		||||
    "@tarojs/cli": "3.6.25",
 | 
			
		||||
    "@tarojs/taro-loader": "3.6.25",
 | 
			
		||||
    "@tarojs/test-utils-vue3": "^0.1.1",
 | 
			
		||||
    "@tarojs/webpack5-runner": "3.6.25",
 | 
			
		||||
    "@types/jest": "^29.3.1",
 | 
			
		||||
    "@types/node": "^18.15.11",
 | 
			
		||||
    "@types/webpack-env": "^1.13.6",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^6.2.0",
 | 
			
		||||
    "@typescript-eslint/parser": "^6.2.0",
 | 
			
		||||
    "@vue/babel-plugin-jsx": "^1.0.6",
 | 
			
		||||
    "@vue/compiler-sfc": "^3.0.0",
 | 
			
		||||
    "babel-preset-taro": "3.6.25",
 | 
			
		||||
    "css-loader": "3.4.2",
 | 
			
		||||
    "eslint": "^8.12.0",
 | 
			
		||||
    "eslint-config-taro": "3.6.25",
 | 
			
		||||
    "eslint-plugin-vue": "^8.0.0",
 | 
			
		||||
    "jest": "^29.3.1",
 | 
			
		||||
    "jest-environment-jsdom": "^29.5.0",
 | 
			
		||||
    "postcss": "^8.4.18",
 | 
			
		||||
    "style-loader": "1.3.0",
 | 
			
		||||
    "stylelint": "^14.4.0",
 | 
			
		||||
    "ts-node": "^10.9.1",
 | 
			
		||||
    "tsconfig-paths-webpack-plugin": "^4.1.0",
 | 
			
		||||
    "typescript": "^5.1.0",
 | 
			
		||||
    "unplugin-vue-components": "^0.26.0",
 | 
			
		||||
    "vue-loader": "^17.0.0",
 | 
			
		||||
    "webpack": "5.78.0"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
{
 | 
			
		||||
  "miniprogramRoot": "dist/",
 | 
			
		||||
  "projectname": "collect_information",
 | 
			
		||||
  "description": "智慧派出所信息采集小程序",
 | 
			
		||||
  "setting": {
 | 
			
		||||
    "urlCheck": false,
 | 
			
		||||
    "es6": false,
 | 
			
		||||
    "enhance": false,
 | 
			
		||||
    "compileHotReLoad": false,
 | 
			
		||||
    "postcss": false,
 | 
			
		||||
    "minified": false,
 | 
			
		||||
    "babelSetting": {
 | 
			
		||||
      "ignore": [],
 | 
			
		||||
      "disablePlugins": [],
 | 
			
		||||
      "outputPath": ""
 | 
			
		||||
    },
 | 
			
		||||
    "ignoreUploadUnusedFiles": true
 | 
			
		||||
  },
 | 
			
		||||
  "compileType": "miniprogram",
 | 
			
		||||
  "libVersion": "3.5.0",
 | 
			
		||||
  "srcMiniprogramRoot": "dist/",
 | 
			
		||||
  "packOptions": {
 | 
			
		||||
    "ignore": [],
 | 
			
		||||
    "include": []
 | 
			
		||||
  },
 | 
			
		||||
  "condition": {},
 | 
			
		||||
  "editorSetting": {
 | 
			
		||||
    "tabIndent": "insertSpaces",
 | 
			
		||||
    "tabSize": 2
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,55 @@
 | 
			
		|||
{
 | 
			
		||||
  "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
 | 
			
		||||
  "projectname": "collect_information",
 | 
			
		||||
  "setting": {
 | 
			
		||||
    "compileHotReLoad": true
 | 
			
		||||
  },
 | 
			
		||||
  "condition": {
 | 
			
		||||
    "miniprogram": {
 | 
			
		||||
      "list": [
 | 
			
		||||
        {
 | 
			
		||||
          "name": "",
 | 
			
		||||
          "pathName": "pages/mine/mine",
 | 
			
		||||
          "query": "",
 | 
			
		||||
          "launchMode": "default",
 | 
			
		||||
          "scene": null
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "",
 | 
			
		||||
          "pathName": "pages/login/login",
 | 
			
		||||
          "query": "",
 | 
			
		||||
          "launchMode": "default",
 | 
			
		||||
          "scene": null
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "",
 | 
			
		||||
          "pathName": "pages/mine/mine",
 | 
			
		||||
          "query": "",
 | 
			
		||||
          "launchMode": "default",
 | 
			
		||||
          "scene": null
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "",
 | 
			
		||||
          "pathName": "pages/index/index",
 | 
			
		||||
          "query": "",
 | 
			
		||||
          "launchMode": "default",
 | 
			
		||||
          "scene": null
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "",
 | 
			
		||||
          "pathName": "pages/index/dataEntry/buildFloorEntry/buildFloorEntry",
 | 
			
		||||
          "query": "",
 | 
			
		||||
          "launchMode": "default",
 | 
			
		||||
          "scene": null
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          "name": "",
 | 
			
		||||
          "pathName": "pages/register/register",
 | 
			
		||||
          "query": "",
 | 
			
		||||
          "launchMode": "default",
 | 
			
		||||
          "scene": null
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
{
 | 
			
		||||
  "miniprogramRoot": "./",
 | 
			
		||||
  "projectname": "collect_information",
 | 
			
		||||
  "appid": "testAppId",
 | 
			
		||||
  "setting": {
 | 
			
		||||
    "es6": false,
 | 
			
		||||
    "minified": false
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,38 @@
 | 
			
		|||
export default defineAppConfig({
 | 
			
		||||
  pages: [
 | 
			
		||||
    'pages/login/login',
 | 
			
		||||
    'pages/register/register',
 | 
			
		||||
    'pages/index/index',
 | 
			
		||||
    'pages/mine/mine',
 | 
			
		||||
    'pages/employeeInfo/employeeInfo',
 | 
			
		||||
  ],
 | 
			
		||||
  window: {
 | 
			
		||||
    backgroundTextStyle: 'light',
 | 
			
		||||
    navigationBarBackgroundColor: '#f7f8fa',
 | 
			
		||||
    navigationBarTitleText: '',
 | 
			
		||||
    navigationBarTextStyle: 'black',
 | 
			
		||||
  },
 | 
			
		||||
  tabBar: {
 | 
			
		||||
    list: [
 | 
			
		||||
      {
 | 
			
		||||
        pagePath: 'pages/index/index',
 | 
			
		||||
        text: '首页',
 | 
			
		||||
        iconPath: "assets/mine/punch.png",
 | 
			
		||||
        selectedIconPath: "assets/mine/punch-active.png"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        pagePath: 'pages/employeeInfo/employeeInfo',
 | 
			
		||||
        text: '员工信息',
 | 
			
		||||
        iconPath: "assets/mine/punch.png",
 | 
			
		||||
        selectedIconPath: "assets/mine/punch-active.png"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        pagePath: 'pages/mine/mine',
 | 
			
		||||
        text: '我的',
 | 
			
		||||
        iconPath: "assets/mine/my.png",
 | 
			
		||||
        selectedIconPath: "assets/mine/my-active.png"
 | 
			
		||||
      },
 | 
			
		||||
    ]
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
*{
 | 
			
		||||
   margin: 0;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
import {createApp} from 'vue'
 | 
			
		||||
import {createPinia} from 'pinia'
 | 
			
		||||
import './app.scss'
 | 
			
		||||
import './assets/scss/colorui.scss'
 | 
			
		||||
 | 
			
		||||
const App = createApp({
 | 
			
		||||
  onShow(options) {
 | 
			
		||||
    console.log('App onShow.')
 | 
			
		||||
  },
 | 
			
		||||
  // 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
App.use(createPinia())
 | 
			
		||||
 | 
			
		||||
export default App
 | 
			
		||||
| 
		 After Width: | Height: | Size: 14 KiB  | 
| 
		 After Width: | Height: | Size: 387 KiB  | 
| 
		 After Width: | Height: | Size: 12 KiB  | 
| 
		 After Width: | Height: | Size: 520 B  | 
| 
		 After Width: | Height: | Size: 501 B  | 
| 
		 After Width: | Height: | Size: 565 B  | 
| 
		 After Width: | Height: | Size: 416 B  | 
| 
						 | 
				
			
			@ -0,0 +1,308 @@
 | 
			
		|||
/*  -- 内外边距 -- */
 | 
			
		||||
.margin-0 {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-xs {
 | 
			
		||||
  margin: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-sm {
 | 
			
		||||
  margin: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin {
 | 
			
		||||
  margin: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-lg {
 | 
			
		||||
  margin: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-xl {
 | 
			
		||||
  margin: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-top-xs {
 | 
			
		||||
  margin-top: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-top-sm {
 | 
			
		||||
  margin-top: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-top {
 | 
			
		||||
  margin-top: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-top-lg {
 | 
			
		||||
  margin-top: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-top-xl {
 | 
			
		||||
  margin-top: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-right-xs {
 | 
			
		||||
  margin-right: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-right-sm {
 | 
			
		||||
  margin-right: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-right {
 | 
			
		||||
  margin-right: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-right-lg {
 | 
			
		||||
  margin-right: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-right-xl {
 | 
			
		||||
  margin-right: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-bottom-xs {
 | 
			
		||||
  margin-bottom: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-bottom-sm {
 | 
			
		||||
  margin-bottom: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-bottom {
 | 
			
		||||
  margin-bottom: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-bottom-lg {
 | 
			
		||||
  margin-bottom: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-bottom-xl {
 | 
			
		||||
  margin-bottom: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-left-xs {
 | 
			
		||||
  margin-left: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-left-sm {
 | 
			
		||||
  margin-left: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-left {
 | 
			
		||||
  margin-left: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-left-lg {
 | 
			
		||||
  margin-left: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-left-xl {
 | 
			
		||||
  margin-left: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-lr-xs {
 | 
			
		||||
  margin-left: 10rpx;
 | 
			
		||||
  margin-right: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-lr-sm {
 | 
			
		||||
  margin-left: 20rpx;
 | 
			
		||||
  margin-right: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-lr {
 | 
			
		||||
  margin-left: 30rpx;
 | 
			
		||||
  margin-right: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-lr-lg {
 | 
			
		||||
  margin-left: 40rpx;
 | 
			
		||||
  margin-right: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-lr-xl {
 | 
			
		||||
  margin-left: 50rpx;
 | 
			
		||||
  margin-right: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-tb-xs {
 | 
			
		||||
  margin-top: 10rpx;
 | 
			
		||||
  margin-bottom: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-tb-sm {
 | 
			
		||||
  margin-top: 20rpx;
 | 
			
		||||
  margin-bottom: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-tb {
 | 
			
		||||
  margin-top: 30rpx;
 | 
			
		||||
  margin-bottom: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-tb-lg {
 | 
			
		||||
  margin-top: 40rpx;
 | 
			
		||||
  margin-bottom: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.margin-tb-xl {
 | 
			
		||||
  margin-top: 50rpx;
 | 
			
		||||
  margin-bottom: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-0 {
 | 
			
		||||
  padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-xs {
 | 
			
		||||
  padding: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-sm {
 | 
			
		||||
  padding: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding {
 | 
			
		||||
  padding: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-lg {
 | 
			
		||||
  padding: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-xl {
 | 
			
		||||
  padding: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-top-xs {
 | 
			
		||||
  padding-top: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-top-sm {
 | 
			
		||||
  padding-top: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-top {
 | 
			
		||||
  padding-top: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-top-lg {
 | 
			
		||||
  padding-top: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-top-xl {
 | 
			
		||||
  padding-top: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-right-xs {
 | 
			
		||||
  padding-right: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-right-sm {
 | 
			
		||||
  padding-right: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-right {
 | 
			
		||||
  padding-right: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-right-lg {
 | 
			
		||||
  padding-right: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-right-xl {
 | 
			
		||||
  padding-right: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-bottom-xs {
 | 
			
		||||
  padding-bottom: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-bottom-sm {
 | 
			
		||||
  padding-bottom: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-bottom {
 | 
			
		||||
  padding-bottom: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-bottom-lg {
 | 
			
		||||
  padding-bottom: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-bottom-xl {
 | 
			
		||||
  padding-bottom: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-left-xs {
 | 
			
		||||
  padding-left: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-left-sm {
 | 
			
		||||
  padding-left: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-left {
 | 
			
		||||
  padding-left: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-left-lg {
 | 
			
		||||
  padding-left: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-left-xl {
 | 
			
		||||
  padding-left: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-lr-xs {
 | 
			
		||||
  padding-left: 10rpx;
 | 
			
		||||
  padding-right: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-lr-sm {
 | 
			
		||||
  padding-left: 20rpx;
 | 
			
		||||
  padding-right: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-lr {
 | 
			
		||||
  padding-left: 30rpx;
 | 
			
		||||
  padding-right: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-lr-lg {
 | 
			
		||||
  padding-left: 40rpx;
 | 
			
		||||
  padding-right: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-lr-xl {
 | 
			
		||||
  padding-left: 50rpx;
 | 
			
		||||
  padding-right: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-tb-xs {
 | 
			
		||||
  padding-top: 10rpx;
 | 
			
		||||
  padding-bottom: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-tb-sm {
 | 
			
		||||
  padding-top: 20rpx;
 | 
			
		||||
  padding-bottom: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-tb {
 | 
			
		||||
  padding-top: 30rpx;
 | 
			
		||||
  padding-bottom: 30rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-tb-lg {
 | 
			
		||||
  padding-top: 40rpx;
 | 
			
		||||
  padding-bottom: 40rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.padding-tb-xl {
 | 
			
		||||
  padding-top: 50rpx;
 | 
			
		||||
  padding-bottom: 50rpx;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,225 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view>
 | 
			
		||||
    <nut-form ref="formRef" :model-value="formParams" :rules="rules">
 | 
			
		||||
      <nut-form-item label="街道/社区:" prop="streetCommunity">
 | 
			
		||||
        <view @click="streetCommunitySmallCommunityVisible = true">
 | 
			
		||||
          {{ streetCommunitySmallCommunityLabel || "请选择街道/小区" }}
 | 
			
		||||
        </view>
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="楼栋/门户:" prop="residentialDivision">
 | 
			
		||||
        <view @click="buildingFloorHouseVisible = true">
 | 
			
		||||
          {{ buildingFloorHouseLabel || "请选择楼栋/门户" }}
 | 
			
		||||
        </view>
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="姓名:" prop="name">
 | 
			
		||||
        <nut-input
 | 
			
		||||
          v-model="formParams.name"
 | 
			
		||||
          placeholder="请输入姓名"
 | 
			
		||||
          type="text"
 | 
			
		||||
        />
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="性别:" prop="sex">
 | 
			
		||||
        <nut-radio-group v-model="formParams.sex" direction="horizontal">
 | 
			
		||||
          <nut-radio v-for="item in SEX" :key="item.value" :label="item.value"
 | 
			
		||||
            >{{ item.label }}
 | 
			
		||||
          </nut-radio>
 | 
			
		||||
        </nut-radio-group>
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="出生日期:" prop="dataOfBirth">
 | 
			
		||||
        <view @click="dataOfBirthVisible = true">
 | 
			
		||||
          {{
 | 
			
		||||
            dayjs(formParams.dataOfBirth).format("YYYY-MM-DD") ||
 | 
			
		||||
            "请选择出生日期"
 | 
			
		||||
          }}
 | 
			
		||||
        </view>
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="身份证:" prop="idCard">
 | 
			
		||||
        <nut-input
 | 
			
		||||
          v-model="formParams.idCard"
 | 
			
		||||
          placeholder="请输入身份证"
 | 
			
		||||
          type="text"
 | 
			
		||||
        />
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="手机号:" prop="phone">
 | 
			
		||||
        <nut-input
 | 
			
		||||
          v-model="formParams.phone"
 | 
			
		||||
          placeholder="请输入手机号码"
 | 
			
		||||
          type="text"
 | 
			
		||||
        />
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
      <nut-form-item label="户籍地:" prop="householdRegistrationAddress">
 | 
			
		||||
        <nut-input
 | 
			
		||||
          v-model="formParams.householdRegistrationAddress"
 | 
			
		||||
          placeholder="请输入户籍地"
 | 
			
		||||
          type="text"
 | 
			
		||||
        />
 | 
			
		||||
      </nut-form-item>
 | 
			
		||||
    </nut-form>
 | 
			
		||||
    <nut-cascader
 | 
			
		||||
      v-model:visible="streetCommunitySmallCommunityVisible"
 | 
			
		||||
      v-model="formParams.streetCommunitySmallCommunityIds"
 | 
			
		||||
      :options="streetCommunitySmallCommunityTreeData"
 | 
			
		||||
      title="选择街道/社区"
 | 
			
		||||
      text-key="label"
 | 
			
		||||
      @change="streetCommunitySmallCommunityChange"
 | 
			
		||||
    ></nut-cascader>
 | 
			
		||||
    <nut-cascader
 | 
			
		||||
      v-model:visible="buildingFloorHouseVisible"
 | 
			
		||||
      v-model="formParams.buildingFloorHouseIds"
 | 
			
		||||
      :options="buildingFloorHouseTreeData"
 | 
			
		||||
      title="选择楼栋/门户"
 | 
			
		||||
      text-key="label"
 | 
			
		||||
      @change="buildingFloorHouseChange"
 | 
			
		||||
    ></nut-cascader>
 | 
			
		||||
    <nut-popup v-model:visible="dataOfBirthVisible" position="bottom">
 | 
			
		||||
      <nut-date-picker
 | 
			
		||||
        v-model="formParams.dataOfBirth"
 | 
			
		||||
        :min-date="min"
 | 
			
		||||
        :max-date="max"
 | 
			
		||||
        :three-dimensional="false"
 | 
			
		||||
        @confirm="dataOfBirthVisible = false"
 | 
			
		||||
      ></nut-date-picker>
 | 
			
		||||
    </nut-popup>
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { SEX } from "@/enums";
 | 
			
		||||
import dayjs from "dayjs";
 | 
			
		||||
import { ref, watch } from "vue";
 | 
			
		||||
import type { FormRules } from "@nutui/nutui-taro/dist/types/__VUE/form/types";
 | 
			
		||||
import api from "@/request";
 | 
			
		||||
import type { FormInstance } from "@nutui/nutui-taro";
 | 
			
		||||
import { useLoad } from "@tarojs/taro";
 | 
			
		||||
 | 
			
		||||
const emits = defineEmits(["update:modelValue"]);
 | 
			
		||||
const props = withDefaults(
 | 
			
		||||
  defineProps<{
 | 
			
		||||
    modelValue: PersonnelInformation;
 | 
			
		||||
  }>(),
 | 
			
		||||
  {
 | 
			
		||||
    modelValue: () => {
 | 
			
		||||
      return {
 | 
			
		||||
        name: "",
 | 
			
		||||
        sex: 0,
 | 
			
		||||
        dataOfBirth: new Date(),
 | 
			
		||||
        idCard: "",
 | 
			
		||||
        phone: "",
 | 
			
		||||
        householdRegistrationAddress: "",
 | 
			
		||||
        streetCommunitySmallCommunityIds: [],
 | 
			
		||||
        buildingFloorHouseIds: [],
 | 
			
		||||
      } as PersonnelInformation;
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
const defaultParams = { ...props.modelValue };
 | 
			
		||||
 | 
			
		||||
const formRef = ref<FormInstance>();
 | 
			
		||||
const formParams = ref<PersonnelInformation>({
 | 
			
		||||
  ...props.modelValue,
 | 
			
		||||
});
 | 
			
		||||
const rules: FormRules = {
 | 
			
		||||
  name: [
 | 
			
		||||
    { required: true, message: "请输入姓名" },
 | 
			
		||||
    {
 | 
			
		||||
      validator: (value) => {
 | 
			
		||||
        return !(value.length < 2 || value.length >= 20);
 | 
			
		||||
      },
 | 
			
		||||
      message: "名字在2~20字符之间",
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  sex: [{ required: true, message: "请选择性别" }],
 | 
			
		||||
  idCard: [
 | 
			
		||||
    { required: true, message: "请输入身份证" },
 | 
			
		||||
    {
 | 
			
		||||
      regex:
 | 
			
		||||
        /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
 | 
			
		||||
      message: "身份证格式错误",
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  phone: [
 | 
			
		||||
    { required: true, message: "请输入手机号码" },
 | 
			
		||||
    {
 | 
			
		||||
      regex: /^400(-?)[0-9]{7}$|^1\d{10}$|^0[0-9]{2,3}-[0-9]{7,8}$/,
 | 
			
		||||
      message: "手机格式错误",
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
watch(formParams.value, (n) => {
 | 
			
		||||
  emits("update:modelValue", n);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const dataOfBirthVisible = ref(false);
 | 
			
		||||
const min = new Date(1920, 0, 1);
 | 
			
		||||
const max = new Date(2025, 10, 1);
 | 
			
		||||
 | 
			
		||||
defineExpose<{
 | 
			
		||||
  validate: () => Promise<unknown>;
 | 
			
		||||
  resetForm: () => void;
 | 
			
		||||
}>({
 | 
			
		||||
  validate: async (): Promise<unknown> => {
 | 
			
		||||
    const result = (await formRef.value?.validate()) as any;
 | 
			
		||||
    if (result.valid) {
 | 
			
		||||
      return Promise.resolve("校验通过");
 | 
			
		||||
    }
 | 
			
		||||
    return Promise.reject("校验不通过");
 | 
			
		||||
  },
 | 
			
		||||
  resetForm: () => {
 | 
			
		||||
    for (let key in defaultParams) {
 | 
			
		||||
      formParams.value[key] = defaultParams[key];
 | 
			
		||||
    }
 | 
			
		||||
    streetCommunitySmallCommunityLabel.value = "";
 | 
			
		||||
    buildingFloorHouseLabel.value = "";
 | 
			
		||||
    buildingFloorHouseTreeData.value = [];
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const streetCommunitySmallCommunityTreeData = ref<TreeNode<string>[]>([]);
 | 
			
		||||
const streetCommunitySmallCommunityVisible = ref<boolean>(false);
 | 
			
		||||
const streetCommunitySmallCommunityLabel = ref<string>("");
 | 
			
		||||
const streetCommunitySmallCommunityChange = (
 | 
			
		||||
  value: string,
 | 
			
		||||
  pathNodes: Record<string, any>[]
 | 
			
		||||
) => {
 | 
			
		||||
  buildingFloorHouseLabel.value = "";
 | 
			
		||||
  formParams.value.buildingFloorHouseIds = [];
 | 
			
		||||
  buildingFloorHouseTreeData.value = [];
 | 
			
		||||
  streetCommunitySmallCommunityLabel.value = pathNodes
 | 
			
		||||
    .map((e) => e.text)
 | 
			
		||||
    .join(",");
 | 
			
		||||
  getBuildingFloorHouseTreeBySmallCommunityId(value[value.length - 1]);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const buildingFloorHouseVisible = ref<boolean>(false);
 | 
			
		||||
const buildingFloorHouseLabel = ref<string>("");
 | 
			
		||||
const buildingFloorHouseChange = (
 | 
			
		||||
  value: string,
 | 
			
		||||
  pathNodes: Record<string, any>[]
 | 
			
		||||
) => (buildingFloorHouseLabel.value = pathNodes.map((e) => e.text).join(","));
 | 
			
		||||
const buildingFloorHouseTreeData = ref<TreeNode<string>[]>([]);
 | 
			
		||||
 | 
			
		||||
const getBuildingFloorHouseTreeBySmallCommunityId = (
 | 
			
		||||
  smallCommunityId: string
 | 
			
		||||
) => {
 | 
			
		||||
  api
 | 
			
		||||
    .get<TreeNode<string>[]>(
 | 
			
		||||
      "/residentialDivision/getBuildingFloorHouseTreeBySmallCommunityId",
 | 
			
		||||
      { smallCommunityId }
 | 
			
		||||
    )
 | 
			
		||||
    .then((resp) => {
 | 
			
		||||
      buildingFloorHouseTreeData.value = resp.data as TreeNode<string>[];
 | 
			
		||||
    });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
useLoad(() => {
 | 
			
		||||
  api
 | 
			
		||||
    .get<TreeNode<string>[]>(
 | 
			
		||||
      "/residentialDivision/streetCommunitySmallCommunityTree"
 | 
			
		||||
    )
 | 
			
		||||
    .then((resp) => {
 | 
			
		||||
      streetCommunitySmallCommunityTreeData.value =
 | 
			
		||||
        resp.data as TreeNode<string>[];
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
export const SEX: SelectNode<number>[] = [
 | 
			
		||||
  {
 | 
			
		||||
    value: 0,
 | 
			
		||||
    label: "男",
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    value: 1,
 | 
			
		||||
    label: "女",
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
export const IDENTITY: SelectNode<string>[] = [
 | 
			
		||||
  {
 | 
			
		||||
    label: "公安",
 | 
			
		||||
    value: "police"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    label: "项目经理",
 | 
			
		||||
    value: "project_manager"
 | 
			
		||||
  },
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export const getLabelByEnumValue = (enums: SelectNode<any>[], value: any): string => {
 | 
			
		||||
  for (let i = 0; i < enums.length; i++) {
 | 
			
		||||
    if (enums[i].value === value) {
 | 
			
		||||
      return enums[i].label
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return '-'
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
<head>
 | 
			
		||||
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
 | 
			
		||||
  <meta content="width=device-width,initial-scale=1,user-scalable=no" name="viewport">
 | 
			
		||||
  <meta name="apple-mobile-web-app-capable" content="yes">
 | 
			
		||||
  <meta name="apple-touch-fullscreen" content="yes">
 | 
			
		||||
  <meta name="format-detection" content="telephone=no,address=no">
 | 
			
		||||
  <meta name="apple-mobile-web-app-status-bar-style" content="white">
 | 
			
		||||
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" >
 | 
			
		||||
  <title>collect_information</title>
 | 
			
		||||
  <script><%= htmlWebpackPlugin.options.script %></script>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
  <div id="app"></div>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
    // navigationBarTitleText: '自定义导航栏',
 | 
			
		||||
    navigationStyle: "custom"
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view style="height: 42px;background: #3d69dc"></view>
 | 
			
		||||
  <view></view>
 | 
			
		||||
  <view></view>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import Taro, {useLoad } from "@tarojs/taro";
 | 
			
		||||
import './employeeInfo.scss'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
useLoad(() => {
 | 
			
		||||
  // TaroSetNavigationBarTitle()
 | 
			
		||||
})
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
.dropdown{
 | 
			
		||||
   background: red;
 | 
			
		||||
   height: 100px;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
 | 
			
		||||
export default definePageConfig({
 | 
			
		||||
    navigationBarTitleText: '首页',
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view>
 | 
			
		||||
    <view class="swiper-demo">
 | 
			
		||||
     12
 | 
			
		||||
    </view>
 | 
			
		||||
    <view class="margin-top">
 | 
			
		||||
45
 | 
			
		||||
    </view>
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import './index.scss'
 | 
			
		||||
import {ref} from 'vue'
 | 
			
		||||
import Taro from "@tarojs/taro";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const swiperRef = ref()
 | 
			
		||||
console.log(swiperRef)
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
    navigationBarTitleText: '登录',
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view class="SignMultiple">
 | 
			
		||||
   登录
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import "./login.scss";
 | 
			
		||||
import Taro, { useLoad } from "@tarojs/taro";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
useLoad(() => {
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
  navigationBarTitleText: '我的',
 | 
			
		||||
  navigationBarBackgroundColor:'#3d69dc',
 | 
			
		||||
  navigationBarTextStyle:'white'
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
.message {
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  background-color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.login-container {
 | 
			
		||||
  height: 205rpx;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  background-image: url('../../assets/images/banner.jpg');
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
  background-position: right;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  padding: 18rpx;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
 | 
			
		||||
  .contact {
 | 
			
		||||
    height: 100rpx;
 | 
			
		||||
    width: 100rpx;
 | 
			
		||||
    border-radius: 50%;
 | 
			
		||||
    border: solid 1px gray;
 | 
			
		||||
 | 
			
		||||
    .image {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 100%;
 | 
			
		||||
      border-radius: 50%
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .tips-text {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    font-size: 28rpx;
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    line-height: 50rpx;
 | 
			
		||||
    margin-left: 20rpx;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    justify-content: space-evenly;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.userIndex {
 | 
			
		||||
  .exit {
 | 
			
		||||
    height: 100rpx;
 | 
			
		||||
    line-height: 40px;
 | 
			
		||||
    border-bottom: solid 0.5px #ebebf7;
 | 
			
		||||
    box-sizing: border-box;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: space-between;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    // margin-bottom: 30rpx;
 | 
			
		||||
    color: #7d7d7d;
 | 
			
		||||
 | 
			
		||||
    .exitItem {
 | 
			
		||||
      display: flex;
 | 
			
		||||
      align-items: center;
 | 
			
		||||
      margin-left: 30rpx;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .exitItemIndex {
 | 
			
		||||
      height: 40rpx;
 | 
			
		||||
      width: 40rpx;
 | 
			
		||||
      border-radius: 50%;
 | 
			
		||||
      // border: solid 1px gray;
 | 
			
		||||
      display: block;
 | 
			
		||||
      line-height: 48rpx;
 | 
			
		||||
 | 
			
		||||
      image {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 100%;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .iconScope {
 | 
			
		||||
      width: 8px;
 | 
			
		||||
      height: 8px;
 | 
			
		||||
      display: inline-block;
 | 
			
		||||
      border: solid 2px #ccc;
 | 
			
		||||
      -webkit-transform: rotate(45deg);
 | 
			
		||||
      transform: rotate(45deg);
 | 
			
		||||
      border-bottom: white;
 | 
			
		||||
      border-left: white;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view class="message">
 | 
			
		||||
      89+89+
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import './mine.scss'
 | 
			
		||||
import {ref} from "vue";
 | 
			
		||||
import Taro, {useLoad,useDidShow} from "@tarojs/taro";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
export default definePageConfig({
 | 
			
		||||
    navigationBarTitleText: '用户注册'
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
.register {
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nut-cell-group__wrap {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.registerIndex {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.registerBtn {
 | 
			
		||||
  margin-top: 40rpx;
 | 
			
		||||
  padding: 0 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.buttonChoose {
 | 
			
		||||
  margin: 0;
 | 
			
		||||
  border: none;
 | 
			
		||||
  background: transparent;
 | 
			
		||||
  outline: none;
 | 
			
		||||
  padding: 0;
 | 
			
		||||
  height: 90rpx;
 | 
			
		||||
  width: 90rpx;
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.nickNameInput{
 | 
			
		||||
   color: black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.contact {
 | 
			
		||||
  height: 83rpx;
 | 
			
		||||
  width: 83rpx;
 | 
			
		||||
  border-radius: 50%;
 | 
			
		||||
  border: solid 1px gray;
 | 
			
		||||
 | 
			
		||||
  .image {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,212 @@
 | 
			
		|||
<template>
 | 
			
		||||
  <view class="register">
 | 
			
		||||
    <view class="registerIndex">
 | 
			
		||||
      <nut-form :model-value="formData" ref="formRef" :rules="rules">
 | 
			
		||||
        <nut-form-item label="头像:">
 | 
			
		||||
          <button class="buttonChoose" open-type="chooseAvatar" @chooseAvatar="onChooseAvatar">
 | 
			
		||||
            <view class="contact">
 | 
			
		||||
              <image :src="formData.avatar" mode="scaleToFill" class="image"/>
 | 
			
		||||
            </view>
 | 
			
		||||
          </button>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
        <nut-form-item label="姓名:" prop="name">
 | 
			
		||||
          <nut-input
 | 
			
		||||
          v-model="formData.name"
 | 
			
		||||
          placeholder="请输入您的昵称"
 | 
			
		||||
          type="text"
 | 
			
		||||
          />
 | 
			
		||||
<!--          <nut-input  class="nickNameInput" type="nickname" v-model="formData.name" placeholder="请输入您的昵称" @change="getNickname"></nut-input>-->
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
        <nut-form-item label="性别:" prop="sex">
 | 
			
		||||
          <nut-radio-group v-model="formData.sex" direction="horizontal">
 | 
			
		||||
            <nut-radio v-for="item in SEX" :key="item.value" :label="item.value"
 | 
			
		||||
            >{{ item.label }}
 | 
			
		||||
            </nut-radio>
 | 
			
		||||
          </nut-radio-group>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
        <nut-form-item label="手机号:">
 | 
			
		||||
          <nut-input
 | 
			
		||||
              v-model="formData.telephone"
 | 
			
		||||
              placeholder="请输入手机号码"
 | 
			
		||||
              type="text"
 | 
			
		||||
          />
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
        <nut-form-item label="行政区划:" prop="name">
 | 
			
		||||
          <view @click="visible = true" style="color: black">
 | 
			
		||||
            {{ streetCommunitySmallCommunityLabel || "请选择行政区划" }}
 | 
			
		||||
          </view>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
        <nut-form-item label="身份:">
 | 
			
		||||
          <nut-radio-group v-model="formData.identity">
 | 
			
		||||
            <nut-radio
 | 
			
		||||
                v-for="item in IDENTITY"
 | 
			
		||||
                :key="item.value"
 | 
			
		||||
                :label="item.value"
 | 
			
		||||
            >{{ item.label }}
 | 
			
		||||
            </nut-radio>
 | 
			
		||||
          </nut-radio-group>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
        <nut-form-item label="单位:" name="unitId">
 | 
			
		||||
          <view @click="unitsList" style="color: black">
 | 
			
		||||
            {{ selectedLabel || '请选择单位'}}
 | 
			
		||||
          </view>
 | 
			
		||||
        </nut-form-item>
 | 
			
		||||
      </nut-form>
 | 
			
		||||
      <nut-cascader
 | 
			
		||||
          v-model:visible="visible"
 | 
			
		||||
          v-model="TreeValue"
 | 
			
		||||
          title="选择地址"
 | 
			
		||||
          :options="TreeData"
 | 
			
		||||
          @change="change"
 | 
			
		||||
          text-key="label"
 | 
			
		||||
      ></nut-cascader>
 | 
			
		||||
      <nut-popup v-model:visible="show" position="bottom">
 | 
			
		||||
        <nut-picker
 | 
			
		||||
            :field-names="{
 | 
			
		||||
               text: 'label',
 | 
			
		||||
               children: 'extData'
 | 
			
		||||
    }" v-model="formData.unitId" :columns="columns" title="请选择城市" @confirm="confirm" @cancel="show = false"/>
 | 
			
		||||
      </nut-popup>
 | 
			
		||||
      <view class="registerBtn">
 | 
			
		||||
        <nut-button block type="success" @click="register">注册</nut-button>
 | 
			
		||||
      </view>
 | 
			
		||||
    </view>
 | 
			
		||||
  </view>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import './register.scss'
 | 
			
		||||
import {onMounted, ref} from "vue";
 | 
			
		||||
import {IDENTITY, SEX} from "@/enums";
 | 
			
		||||
import Taro from "@tarojs/taro";
 | 
			
		||||
import api from '@/request/index'
 | 
			
		||||
import type {FormInstance} from "@nutui/nutui-taro";
 | 
			
		||||
import {FormRules} from "@nutui/nutui-taro/dist/types/__VUE/form/types";
 | 
			
		||||
 | 
			
		||||
const formData = ref<RegisterParams>({
 | 
			
		||||
  avatar: "https://img12.360buyimg.com/imagetools/jfs/t1/196430/38/8105/14329/60c806a4Ed506298a/e6de9fb7b8490f38.png",
 | 
			
		||||
  name: "",
 | 
			
		||||
  sex:0,
 | 
			
		||||
  telephone:'',
 | 
			
		||||
  identity: 'police',
 | 
			
		||||
  unitId:''
 | 
			
		||||
});
 | 
			
		||||
const show = ref(false)
 | 
			
		||||
const visible = ref(false)
 | 
			
		||||
const TreeValue = ref<Record<string, any>[]>([])
 | 
			
		||||
const TreeData = ref(['']);
 | 
			
		||||
const streetCommunitySmallCommunityLabel = ref<string>("");
 | 
			
		||||
const getAdministrativeDivisionTree = async () => {
 | 
			
		||||
  const resp = await api.get<TreeNode<string>[]>('/common/administrativeDivisionTree')
 | 
			
		||||
  TreeData.value = resp.data as any
 | 
			
		||||
  console.log(resp.data)
 | 
			
		||||
}
 | 
			
		||||
const change = (value: string, pathNodes: Record<string, any>[]) => {
 | 
			
		||||
  streetCommunitySmallCommunityLabel.value = pathNodes.map((e) => e.text).join(",");
 | 
			
		||||
  TreeValue.value = value as any
 | 
			
		||||
}
 | 
			
		||||
const columns = ref([])
 | 
			
		||||
const unitsList = async () => {
 | 
			
		||||
  if(streetCommunitySmallCommunityLabel.value !== ''){
 | 
			
		||||
    show.value = true
 | 
			
		||||
    const queryUnitListByIdentityQueryParams = {
 | 
			
		||||
      identity: formData.value.identity,
 | 
			
		||||
      administrativeDivisionCodes: TreeValue.value
 | 
			
		||||
    }
 | 
			
		||||
    const resp = await api.post<TreeNode<string>[]>('/common/queryUnitListByIdentity', queryUnitListByIdentityQueryParams)
 | 
			
		||||
    columns.value = resp.data as any
 | 
			
		||||
  }else{
 | 
			
		||||
     Taro.showToast({
 | 
			
		||||
         title:'请先选择行政区划',
 | 
			
		||||
     })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const selectedLabel = ref ('')
 | 
			
		||||
const confirm = ({selectedOptions, selectedValue}) => {
 | 
			
		||||
  Object.keys(selectedOptions).forEach((e)=>{
 | 
			
		||||
    selectedLabel.value = selectedOptions[e].label
 | 
			
		||||
    formData.value.unitId = selectedOptions[e].value
 | 
			
		||||
  })
 | 
			
		||||
  show.value = false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const formRef = ref<FormInstance>()
 | 
			
		||||
// 注册之前先调用login拿取code 传递给后端
 | 
			
		||||
// 注册
 | 
			
		||||
const register = async () => {
 | 
			
		||||
  await Taro.login({
 | 
			
		||||
    success: async function (res) {
 | 
			
		||||
      if (res.code) {
 | 
			
		||||
        const miniProgramUserRegisterParams = {
 | 
			
		||||
          code: res.code,
 | 
			
		||||
          name: formData.value.name,
 | 
			
		||||
          telephone: formData.value.telephone,
 | 
			
		||||
          sex: formData.value.sex,
 | 
			
		||||
          identity: formData.value.identity,
 | 
			
		||||
          unitId:formData.value.unitId
 | 
			
		||||
        }
 | 
			
		||||
        const resp = await api.post<string>('/miniProgramUser/register', miniProgramUserRegisterParams, {loading: true})
 | 
			
		||||
        Taro.showToast({
 | 
			
		||||
          title: "注册成功",
 | 
			
		||||
          icon: 'success',
 | 
			
		||||
          duration: 2000,
 | 
			
		||||
          mask: true,
 | 
			
		||||
        }).then()
 | 
			
		||||
        await Taro.setStorage({
 | 
			
		||||
          key: "token",
 | 
			
		||||
          data: resp.data,
 | 
			
		||||
          success(res) {
 | 
			
		||||
            Taro.switchTab({
 | 
			
		||||
              url: '/pages/index/index'
 | 
			
		||||
            })
 | 
			
		||||
          },
 | 
			
		||||
        })
 | 
			
		||||
      }else{
 | 
			
		||||
        Taro.showToast({
 | 
			
		||||
          title: res.errMsg,
 | 
			
		||||
          icon: 'error',
 | 
			
		||||
          duration: 2000,
 | 
			
		||||
          mask: true
 | 
			
		||||
        }).then()
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const rules: FormRules = {
 | 
			
		||||
  name: [
 | 
			
		||||
    { required: true, message: "请输入姓名" },
 | 
			
		||||
    {
 | 
			
		||||
      validator: (value) => {
 | 
			
		||||
        return !(value.length < 2 || value.length >= 20);
 | 
			
		||||
      },
 | 
			
		||||
      message: "名字在2~20字符之间",
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  sex: [{ required: true, message: "请选择性别" }],
 | 
			
		||||
  telephone: [
 | 
			
		||||
    { required: true, message: "请输入手机号码" },
 | 
			
		||||
    {
 | 
			
		||||
      regex: /^400(-?)[0-9]{7}$|^1\d{10}$|^0[0-9]{2,3}-[0-9]{7,8}$/,
 | 
			
		||||
      message: "手机格式错误",
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// 获取头像
 | 
			
		||||
const onChooseAvatar = (e) => {
 | 
			
		||||
  const {avatarUrl} = e.detail
 | 
			
		||||
  formData.value.avatar = avatarUrl
 | 
			
		||||
}
 | 
			
		||||
// 获取昵称
 | 
			
		||||
const getNickname = (e) => {
 | 
			
		||||
  formData.value.name = e.detail.value
 | 
			
		||||
  console.log( formData.value.name)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
  getAdministrativeDivisionTree()
 | 
			
		||||
})
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,86 @@
 | 
			
		|||
import Taro from "@tarojs/taro";
 | 
			
		||||
import {ApiOptions} from "../../types/request";
 | 
			
		||||
 | 
			
		||||
const requestInterceptor = (chain: Taro.Chain) => {
 | 
			
		||||
  const requestParams = chain.requestParams
 | 
			
		||||
  const token = Taro.getStorageSync('token')
 | 
			
		||||
  if (token) {
 | 
			
		||||
    requestParams.header = {
 | 
			
		||||
      ...requestParams.header,
 | 
			
		||||
      token
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return chain.proceed(requestParams)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class CustomRequest {
 | 
			
		||||
  BASE_API: string
 | 
			
		||||
 | 
			
		||||
  public constructor() {
 | 
			
		||||
    this.BASE_API = process.env.TARO_APP_BASE_API
 | 
			
		||||
    Taro.addInterceptor(requestInterceptor)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private request<T>(url: string, method: keyof Taro.request.Method, options: ApiOptions, params?: object,): Promise<JsonResult<T>> {
 | 
			
		||||
    return new Promise<JsonResult<T>>((resolve, reject) => {
 | 
			
		||||
      if (options.loading) {
 | 
			
		||||
        Taro.showLoading({
 | 
			
		||||
          title: '请求中...',
 | 
			
		||||
        }).then()
 | 
			
		||||
      }
 | 
			
		||||
      Taro.request<JsonResult<T>, object>({
 | 
			
		||||
        url: this.BASE_API + url,
 | 
			
		||||
        data: params,
 | 
			
		||||
        method,
 | 
			
		||||
        ...options,
 | 
			
		||||
        success: (result) => {
 | 
			
		||||
          Taro.hideLoading()
 | 
			
		||||
          const jsonResult = result.data
 | 
			
		||||
          if (jsonResult.code !== 200) {
 | 
			
		||||
            if ([401].includes(jsonResult.code)) {
 | 
			
		||||
              //todo 重新登录 跳转登录页 提示错误
 | 
			
		||||
            }
 | 
			
		||||
            Taro.showToast({
 | 
			
		||||
              title: jsonResult.message,
 | 
			
		||||
              icon: 'none',
 | 
			
		||||
              mask: true,
 | 
			
		||||
              duration: 2000
 | 
			
		||||
            }).then()
 | 
			
		||||
            reject(jsonResult);
 | 
			
		||||
          }
 | 
			
		||||
          resolve(jsonResult);
 | 
			
		||||
        },
 | 
			
		||||
        fail: (res) => {
 | 
			
		||||
          Taro.hideLoading()
 | 
			
		||||
          Taro.showToast({
 | 
			
		||||
            title: res.errMsg,
 | 
			
		||||
            icon: 'none',
 | 
			
		||||
            mask: true,
 | 
			
		||||
            duration: 2000
 | 
			
		||||
          }).then()
 | 
			
		||||
          reject(res.errMsg);
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get<T>(url: string, params?: object, options: ApiOptions = {loading: false}): Promise<JsonResult<T>> {
 | 
			
		||||
    return this.request<T>(url, "GET", options, params)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  post<T>(url: string, params?: object, options: ApiOptions = {loading: false}): Promise<JsonResult<T>> {
 | 
			
		||||
    return this.request<T>(url, "POST", options, params)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  delete<T>(url: string, params?: object, options: ApiOptions = {loading: false}): Promise<JsonResult<T>> {
 | 
			
		||||
    return this.request(url, "DELETE", options, params)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  put<T>(url: string, params?: object, options: ApiOptions = {loading: false}): Promise<JsonResult<T>> {
 | 
			
		||||
    return this.request(url, "PUT", options, params)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const api = new CustomRequest();
 | 
			
		||||
 | 
			
		||||
export default api
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
import {defineStore} from 'pinia'
 | 
			
		||||
 | 
			
		||||
export const useCounterStore = defineStore('counter', {
 | 
			
		||||
  state: () => {
 | 
			
		||||
    return {
 | 
			
		||||
       userInfo:{}
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  actions: {},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,67 @@
 | 
			
		|||
import Taro from "@tarojs/taro";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 授权综合逻辑
 | 
			
		||||
 * @param {*} scope 权限代表
 | 
			
		||||
 * @param {*} successCallback 成功回调
 | 
			
		||||
 * @param {*} failCallback 失败回调
 | 
			
		||||
 */
 | 
			
		||||
export function pullAuth(scope, successCallback, failCallback) {
 | 
			
		||||
    const map = new Map([
 | 
			
		||||
        ['scope.userInfo', '用户信息'],
 | 
			
		||||
        ['scope.userLocation', '地理位置'],
 | 
			
		||||
        ['scope.userLocationBackground', '后台定位'],
 | 
			
		||||
        ['scope.address', '通信地址'],
 | 
			
		||||
        ['scope.record', '录音功能'],
 | 
			
		||||
        ['scope.writePhotosAlbum', '保存到相册'],
 | 
			
		||||
        ['scope.camera', '摄像头'],
 | 
			
		||||
        ['scope.invoice', '获取发票'],
 | 
			
		||||
        ['scope.invoiceTitle', '发票抬头'],
 | 
			
		||||
        ['scope.werun', '微信运动步数'],
 | 
			
		||||
    ])
 | 
			
		||||
    Taro.getSetting({
 | 
			
		||||
        success(res) {
 | 
			
		||||
            if (!res.authSetting[scope]) {
 | 
			
		||||
              Taro.authorize({
 | 
			
		||||
                    scope,
 | 
			
		||||
                    success(){ // 允许授权
 | 
			
		||||
                        successCallback()
 | 
			
		||||
                    },
 | 
			
		||||
                    fail(){    // 拒绝授权
 | 
			
		||||
                        if (map.has(scope)) {
 | 
			
		||||
                            let word = map.get(scope)
 | 
			
		||||
                          Taro.showModal({
 | 
			
		||||
                                content:`检测到您没打开${word}权限,是否去设置打开?`,
 | 
			
		||||
                                confirmText: "确认",
 | 
			
		||||
                                cancelText:'取消',
 | 
			
		||||
                                success: (res) => {
 | 
			
		||||
                                    if(res.confirm){
 | 
			
		||||
                                      Taro.openSetting({
 | 
			
		||||
                                            success: (res) => {
 | 
			
		||||
                                                successCallback()
 | 
			
		||||
                                            },
 | 
			
		||||
                                            fail: () => {
 | 
			
		||||
                                                failCallback()
 | 
			
		||||
                                            },
 | 
			
		||||
                                        })
 | 
			
		||||
                                    }else{
 | 
			
		||||
                                        failCallback()
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            })
 | 
			
		||||
                        } else {
 | 
			
		||||
                            Taro.showToast({
 | 
			
		||||
                                title: '无此授权功能'
 | 
			
		||||
                            })
 | 
			
		||||
                            failCallback()
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                })
 | 
			
		||||
            } else {
 | 
			
		||||
                successCallback()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "target": "es2017",
 | 
			
		||||
    "module": "commonjs",
 | 
			
		||||
    "removeComments": false,
 | 
			
		||||
    "preserveConstEnums": true,
 | 
			
		||||
    "moduleResolution": "node",
 | 
			
		||||
    "experimentalDecorators": true,
 | 
			
		||||
    "noImplicitAny": false,
 | 
			
		||||
    "allowSyntheticDefaultImports": true,
 | 
			
		||||
    "outDir": "lib",
 | 
			
		||||
    "noUnusedLocals": false,
 | 
			
		||||
    "noUnusedParameters": false,
 | 
			
		||||
    "strictNullChecks": true,
 | 
			
		||||
    "sourceMap": true,
 | 
			
		||||
    "rootDir": ".",
 | 
			
		||||
    "jsx": "preserve",
 | 
			
		||||
    "allowJs": true,
 | 
			
		||||
    "resolveJsonModule": true,
 | 
			
		||||
    "typeRoots": ["node_modules/@types"],
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": ["src/*"]
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "include": ["./src", "./types", "./config"],
 | 
			
		||||
  "compileOnSave": false
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
/// <reference types="@tarojs/taro" />
 | 
			
		||||
 | 
			
		||||
declare module '*.png';
 | 
			
		||||
declare module '*.gif';
 | 
			
		||||
declare module '*.jpg';
 | 
			
		||||
declare module '*.jpeg';
 | 
			
		||||
declare module '*.svg';
 | 
			
		||||
declare module '*.css';
 | 
			
		||||
declare module '*.less';
 | 
			
		||||
declare module '*.scss';
 | 
			
		||||
declare module '*.sass';
 | 
			
		||||
declare module '*.styl';
 | 
			
		||||
 | 
			
		||||
declare namespace NodeJS {
 | 
			
		||||
  interface ProcessEnv {
 | 
			
		||||
    /** NODE 内置环境变量, 会影响到最终构建生成产物 */
 | 
			
		||||
    NODE_ENV: 'development' | 'production',
 | 
			
		||||
    /** 当前构建的平台 */
 | 
			
		||||
    TARO_ENV: 'weapp' | 'swan' | 'alipay' | 'h5' | 'rn' | 'tt' | 'quickapp' | 'qq' | 'jd'
 | 
			
		||||
    /**
 | 
			
		||||
     * 当前构建的小程序 appid
 | 
			
		||||
     * @description 若不同环境有不同的小程序,可通过在 env 文件中配置环境变量`TARO_APP_ID`来方便快速切换 appid, 而不必手动去修改 dist/project.config.json 文件
 | 
			
		||||
     * @see https://taro-docs.jd.com/docs/next/env-mode-config#特殊环境变量-taro_app_id
 | 
			
		||||
     */
 | 
			
		||||
    TARO_APP_ID: string,
 | 
			
		||||
    TARO_APP_BASE_API: string
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare module '@tarojs/components' {
 | 
			
		||||
  export * from '@tarojs/components/types/index.vue3'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 选择
 | 
			
		||||
 */
 | 
			
		||||
interface SelectNode<T> {
 | 
			
		||||
  value: T,
 | 
			
		||||
  label: string,
 | 
			
		||||
  options?: SelectNode<T>[]
 | 
			
		||||
  orderIndex?: number,
 | 
			
		||||
  disabled?: boolean,
 | 
			
		||||
  extData?: Record<string, any>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface JsonResult<T> {
 | 
			
		||||
  code: number;
 | 
			
		||||
  data?: T;
 | 
			
		||||
  message: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 树
 | 
			
		||||
 */
 | 
			
		||||
interface TreeNode<T> {
 | 
			
		||||
  value: T,
 | 
			
		||||
  parentValue: T,
 | 
			
		||||
  label: string,
 | 
			
		||||
  orderIndex?: number,
 | 
			
		||||
  extData?: Record<string, any>,
 | 
			
		||||
  children?: TreeNode<T>[]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
interface PersonnelInformation {
 | 
			
		||||
  name: string,
 | 
			
		||||
  sex: number,
 | 
			
		||||
  dataOfBirth: Date | string,
 | 
			
		||||
  idCard: string,
 | 
			
		||||
  phone: string,
 | 
			
		||||
  householdRegistrationAddress: string,
 | 
			
		||||
  streetCommunitySmallCommunityIds: string[],
 | 
			
		||||
  buildingFloorHouseIds: string[]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface EnterUserInfoSaveOrUpdateParams {
 | 
			
		||||
  snowFlakeId?: string,
 | 
			
		||||
 | 
			
		||||
  streetId?: string,
 | 
			
		||||
  communityId?: string,
 | 
			
		||||
  smallCommunityId?: string,
 | 
			
		||||
  buildingId?: string,
 | 
			
		||||
  floorId?: string,
 | 
			
		||||
  houseId?: string,
 | 
			
		||||
 | 
			
		||||
  name: string,
 | 
			
		||||
  sex: number,
 | 
			
		||||
  dateOfBirth?: Date | string
 | 
			
		||||
  idCard: string
 | 
			
		||||
  phone: string
 | 
			
		||||
  householdRegistrationAddress?: string
 | 
			
		||||
 | 
			
		||||
  optFlag: null | 0 | 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface SystemExitsPopulationInformationVo {
 | 
			
		||||
  snowFlakeId: string,
 | 
			
		||||
  name: string,
 | 
			
		||||
  sex: number,
 | 
			
		||||
  residentialDivisionDetail: string,
 | 
			
		||||
  createTime: string,
 | 
			
		||||
  createUserName: string
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
interface LoginUserInfo {
 | 
			
		||||
  name?: string;
 | 
			
		||||
  avatar?: string;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
interface RegisterParams {
 | 
			
		||||
  avatar: string;
 | 
			
		||||
  name: string;
 | 
			
		||||
  sex:number,
 | 
			
		||||
  telephone:string,
 | 
			
		||||
  identity: string;
 | 
			
		||||
  unitId: any
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
import Taro from "@tarojs/taro";
 | 
			
		||||
 | 
			
		||||
export interface ApiOptions
 | 
			
		||||
  extends Omit<
 | 
			
		||||
    Taro.request.Option,
 | 
			
		||||
    "url" | "method" | "data" | "success" | "fail"
 | 
			
		||||
  > {
 | 
			
		||||
  loading?: boolean;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
export {}
 | 
			
		||||
 | 
			
		||||
declare module 'vue' {
 | 
			
		||||
  export interface GlobalComponents extends JSX.IntrinsicElements {
 | 
			
		||||
    /** Note: Vue 在 runtime 中将 JSX.IntrinsicElements 通过 index signature 重复声明标签
 | 
			
		||||
     * 这会导致插件无法正常跳转类型,可以手动覆盖声明标签活得更好的体验,参考如下:
 | 
			
		||||
     * 'scroll-view': JSX.IntrinsicElements['scroll-view']
 | 
			
		||||
     */
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||