diff --git a/.DS_Store b/.DS_Store index ba064f9..ed896a8 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/collect_information/.editorconfig b/collect_information/.editorconfig new file mode 100644 index 0000000..5760be5 --- /dev/null +++ b/collect_information/.editorconfig @@ -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 diff --git a/collect_information/.env.development b/collect_information/.env.development new file mode 100644 index 0000000..f811773 --- /dev/null +++ b/collect_information/.env.development @@ -0,0 +1,2 @@ +TARO_APP_ID="wx8902ddbfddb820d1" +TARO_APP_BASE_API="http://172.10.10.93:8765" diff --git a/collect_information/.env.production b/collect_information/.env.production new file mode 100644 index 0000000..bf2df6e --- /dev/null +++ b/collect_information/.env.production @@ -0,0 +1,2 @@ +TARO_APP_ID="wx24cc8a872b57ac79" +TARO_APP_BASE_API="http://172.10.10.207:7000" diff --git a/collect_information/.env.test b/collect_information/.env.test new file mode 100644 index 0000000..0215b61 --- /dev/null +++ b/collect_information/.env.test @@ -0,0 +1 @@ +# TARO_APP_ID="测试环境下的小程序appid" \ No newline at end of file diff --git a/collect_information/.eslintrc b/collect_information/.eslintrc new file mode 100644 index 0000000..a5306c7 --- /dev/null +++ b/collect_information/.eslintrc @@ -0,0 +1,10 @@ +// ESLint 检查 .vue 文件需要单独配置编辑器: +// https://eslint.vuejs.org/user-guide/#editor-integrations +{ + "extends": [ + "taro/vue3" + ], + "rules": { + "vue/multi-word-component-names": "off" + } +} diff --git a/collect_information/.gitignore b/collect_information/.gitignore new file mode 100644 index 0000000..f54f355 --- /dev/null +++ b/collect_information/.gitignore @@ -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 diff --git a/collect_information/__tests__/index.test.js b/collect_information/__tests__/index.test.js new file mode 100644 index 0000000..c3904d1 --- /dev/null +++ b/collect_information/__tests__/index.test.js @@ -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() + }) + +}) diff --git a/collect_information/babel.config.js b/collect_information/babel.config.js new file mode 100644 index 0000000..dc20faf --- /dev/null +++ b/collect_information/babel.config.js @@ -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 + }] + ] +} diff --git a/collect_information/config/dev.ts b/collect_information/config/dev.ts new file mode 100644 index 0000000..c37eb43 --- /dev/null +++ b/collect_information/config/dev.ts @@ -0,0 +1,9 @@ +import type { UserConfigExport } from "@tarojs/cli"; +export default { + logger: { + quiet: false, + stats: true + }, + mini: {}, + h5: {} +} satisfies UserConfigExport diff --git a/collect_information/config/index.ts b/collect_information/config/index.ts new file mode 100644 index 0000000..54a4b61 --- /dev/null +++ b/collect_information/config/index.ts @@ -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) +}) diff --git a/collect_information/config/prod.ts b/collect_information/config/prod.ts new file mode 100644 index 0000000..c9ba67f --- /dev/null +++ b/collect_information/config/prod.ts @@ -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 diff --git a/collect_information/jest.config.ts b/collect_information/jest.config.ts new file mode 100644 index 0000000..e720a3c --- /dev/null +++ b/collect_information/jest.config.ts @@ -0,0 +1,6 @@ +const defineJestConfig = require('@tarojs/test-utils-vue3/dist/jest.js').default + +module.exports = defineJestConfig({ + testEnvironment: 'jsdom', + testMatch: ['/__tests__/**/*.(spec|test).[jt]s?(x)'] +}) diff --git a/collect_information/package.json b/collect_information/package.json new file mode 100644 index 0000000..9c42ee8 --- /dev/null +++ b/collect_information/package.json @@ -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" + } +} diff --git a/collect_information/project.config.json b/collect_information/project.config.json new file mode 100644 index 0000000..ab4365c --- /dev/null +++ b/collect_information/project.config.json @@ -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 + } +} \ No newline at end of file diff --git a/collect_information/project.private.config.json b/collect_information/project.private.config.json new file mode 100644 index 0000000..3abd2fd --- /dev/null +++ b/collect_information/project.private.config.json @@ -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 + } + ] + } + } +} \ No newline at end of file diff --git a/collect_information/project.tt.json b/collect_information/project.tt.json new file mode 100644 index 0000000..409b7a0 --- /dev/null +++ b/collect_information/project.tt.json @@ -0,0 +1,9 @@ +{ + "miniprogramRoot": "./", + "projectname": "collect_information", + "appid": "testAppId", + "setting": { + "es6": false, + "minified": false + } +} diff --git a/collect_information/src/app.config.ts b/collect_information/src/app.config.ts new file mode 100644 index 0000000..aec9800 --- /dev/null +++ b/collect_information/src/app.config.ts @@ -0,0 +1,40 @@ +export default defineAppConfig({ + pages: [ + 'pages/login/login', + 'pages/register/register', + 'pages/projectManager/index/index', + 'pages/policeManager/index/index', + 'pages/mine/mine', + 'pages/employeeInfo/employeeInfo', + ], + window: { + backgroundTextStyle: 'light', + navigationBarBackgroundColor: '#f7f8fa', + navigationBarTitleText: '', + navigationBarTextStyle: 'black', + }, + tabBar: { + custom: true, + list: [ + { + pagePath: 'pages/projectManager/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" + }, + ] + } + +}) diff --git a/collect_information/src/app.scss b/collect_information/src/app.scss new file mode 100644 index 0000000..0570844 --- /dev/null +++ b/collect_information/src/app.scss @@ -0,0 +1,4 @@ +*{ + margin: 0; + padding: 0; +} diff --git a/collect_information/src/app.ts b/collect_information/src/app.ts new file mode 100644 index 0000000..60b67c5 --- /dev/null +++ b/collect_information/src/app.ts @@ -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 diff --git a/collect_information/src/assets/images/arrow.png b/collect_information/src/assets/images/arrow.png new file mode 100644 index 0000000..521b08a Binary files /dev/null and b/collect_information/src/assets/images/arrow.png differ diff --git a/collect_information/src/assets/images/badge.jpg b/collect_information/src/assets/images/badge.jpg new file mode 100644 index 0000000..ae19643 Binary files /dev/null and b/collect_information/src/assets/images/badge.jpg differ diff --git a/collect_information/src/assets/images/banner.jpg b/collect_information/src/assets/images/banner.jpg new file mode 100644 index 0000000..f29618c Binary files /dev/null and b/collect_information/src/assets/images/banner.jpg differ diff --git a/collect_information/src/assets/mine/my-active.png b/collect_information/src/assets/mine/my-active.png new file mode 100644 index 0000000..907d8a6 Binary files /dev/null and b/collect_information/src/assets/mine/my-active.png differ diff --git a/collect_information/src/assets/mine/my.png b/collect_information/src/assets/mine/my.png new file mode 100644 index 0000000..da73231 Binary files /dev/null and b/collect_information/src/assets/mine/my.png differ diff --git a/collect_information/src/assets/mine/punch-active.png b/collect_information/src/assets/mine/punch-active.png new file mode 100644 index 0000000..0098eb3 Binary files /dev/null and b/collect_information/src/assets/mine/punch-active.png differ diff --git a/collect_information/src/assets/mine/punch.png b/collect_information/src/assets/mine/punch.png new file mode 100644 index 0000000..e8ef36b Binary files /dev/null and b/collect_information/src/assets/mine/punch.png differ diff --git a/collect_information/src/assets/scss/colorui.scss b/collect_information/src/assets/scss/colorui.scss new file mode 100644 index 0000000..199b446 --- /dev/null +++ b/collect_information/src/assets/scss/colorui.scss @@ -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; +} diff --git a/collect_information/src/components/form/PersonnelInformationEntryForm.vue b/collect_information/src/components/form/PersonnelInformationEntryForm.vue new file mode 100644 index 0000000..c283038 --- /dev/null +++ b/collect_information/src/components/form/PersonnelInformationEntryForm.vue @@ -0,0 +1,225 @@ + + diff --git a/collect_information/src/custom-tab-bar/index.json.js b/collect_information/src/custom-tab-bar/index.json.js new file mode 100644 index 0000000..29210de --- /dev/null +++ b/collect_information/src/custom-tab-bar/index.json.js @@ -0,0 +1,3 @@ +export default { + "component": true +} diff --git a/collect_information/src/custom-tab-bar/index.vue b/collect_information/src/custom-tab-bar/index.vue new file mode 100644 index 0000000..b6f6e33 --- /dev/null +++ b/collect_information/src/custom-tab-bar/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/collect_information/src/enums/index.ts b/collect_information/src/enums/index.ts new file mode 100644 index 0000000..f7b0445 --- /dev/null +++ b/collect_information/src/enums/index.ts @@ -0,0 +1,30 @@ +export const SEX: SelectNode[] = [ + { + value: 0, + label: "男", + }, + { + value: 1, + label: "女", + }, +]; + +export const IDENTITY: SelectNode[] = [ + { + label: "公安", + value: "police" + }, + { + label: "项目经理", + value: "project_manager" + }, +] + +export const getLabelByEnumValue = (enums: SelectNode[], value: any): string => { + for (let i = 0; i < enums.length; i++) { + if (enums[i].value === value) { + return enums[i].label + } + } + return '-' +} diff --git a/collect_information/src/index.html b/collect_information/src/index.html new file mode 100644 index 0000000..21009d9 --- /dev/null +++ b/collect_information/src/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + + collect_information + + + +
+ + diff --git a/collect_information/src/pages/employeeInfo/employeeInfo.config.ts b/collect_information/src/pages/employeeInfo/employeeInfo.config.ts new file mode 100644 index 0000000..ca739e2 --- /dev/null +++ b/collect_information/src/pages/employeeInfo/employeeInfo.config.ts @@ -0,0 +1,4 @@ +export default definePageConfig({ + // navigationBarTitleText: '自定义导航栏', + navigationStyle: "custom" +}) diff --git a/collect_information/src/pages/employeeInfo/employeeInfo.scss b/collect_information/src/pages/employeeInfo/employeeInfo.scss new file mode 100644 index 0000000..139597f --- /dev/null +++ b/collect_information/src/pages/employeeInfo/employeeInfo.scss @@ -0,0 +1,2 @@ + + diff --git a/collect_information/src/pages/employeeInfo/employeeInfo.vue b/collect_information/src/pages/employeeInfo/employeeInfo.vue new file mode 100644 index 0000000..77742df --- /dev/null +++ b/collect_information/src/pages/employeeInfo/employeeInfo.vue @@ -0,0 +1,21 @@ + + + diff --git a/collect_information/src/pages/login/login.config.ts b/collect_information/src/pages/login/login.config.ts new file mode 100644 index 0000000..97683f1 --- /dev/null +++ b/collect_information/src/pages/login/login.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '登录', +}) diff --git a/collect_information/src/pages/login/login.scss b/collect_information/src/pages/login/login.scss new file mode 100644 index 0000000..7977430 --- /dev/null +++ b/collect_information/src/pages/login/login.scss @@ -0,0 +1,87 @@ +.SignMultiple { + height: 100vh; + background: #f4f5f7; + position: relative; + + .urlIndex { + display: flex; + justify-content: center; + align-items: center; + padding: 0; + margin: 0; + width: 100%; + height: 440rpx; + background: #3a6bbe; + text-align: center; + overflow: hidden; + + .urlTitle { + width: 100%; + height: 300rpx; + + .urlWelcome { + color: #fff; + font-size: 24px; + } + + .urlHibiscus { + height: 200rpx; + line-height: 58rpx; + //font-size: 38rpx; + margin: 40rpx 20rpx; + border: 2px solid #a1b8e0; + display: flex; + justify-content: center; + + .contact { + height: 100rpx; + width: 100rpx; + border-radius: 50%; + border: solid 1px gray; + + .image { + width: 100%; + height: 100%; + border-radius: 50% + } + } + } + } + } + + .type { + margin: 0 20rpx 0 20rpx; + width: 29%; + text-align: right; + } + + .HiddenEse { + position: absolute; + top: 4px; + right: 0; + width: 76rpx; + height: 40rpx; + + image { + width: 40rpx; + height: 40rpx; + } + } + + .SignItem { + transform: translateY(15%); + display: flex; + flex-direction: column; + margin: 20rpx 48rpx; + border-radius: 20rpx; + } + + .Cancel { + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; + margin: 20rpx 40rpx; + } + +} diff --git a/collect_information/src/pages/login/login.vue b/collect_information/src/pages/login/login.vue new file mode 100644 index 0000000..9320e6b --- /dev/null +++ b/collect_information/src/pages/login/login.vue @@ -0,0 +1,71 @@ + + + diff --git a/collect_information/src/pages/mine/mine.config.ts b/collect_information/src/pages/mine/mine.config.ts new file mode 100644 index 0000000..18e4d2b --- /dev/null +++ b/collect_information/src/pages/mine/mine.config.ts @@ -0,0 +1,5 @@ +export default definePageConfig({ + navigationBarTitleText: '我的', + navigationBarBackgroundColor:'#3d69dc', + navigationBarTextStyle:'white' +}) diff --git a/collect_information/src/pages/mine/mine.scss b/collect_information/src/pages/mine/mine.scss new file mode 100644 index 0000000..810e441 --- /dev/null +++ b/collect_information/src/pages/mine/mine.scss @@ -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; + } + } +} diff --git a/collect_information/src/pages/mine/mine.vue b/collect_information/src/pages/mine/mine.vue new file mode 100644 index 0000000..e85d037 --- /dev/null +++ b/collect_information/src/pages/mine/mine.vue @@ -0,0 +1,17 @@ + + + + diff --git a/collect_information/src/pages/policeManager/index/index.vue b/collect_information/src/pages/policeManager/index/index.vue new file mode 100644 index 0000000..00e3017 --- /dev/null +++ b/collect_information/src/pages/policeManager/index/index.vue @@ -0,0 +1,12 @@ + + + + + + diff --git a/collect_information/src/pages/projectManager/index/index.config.ts b/collect_information/src/pages/projectManager/index/index.config.ts new file mode 100644 index 0000000..6b0b2af --- /dev/null +++ b/collect_information/src/pages/projectManager/index/index.config.ts @@ -0,0 +1,4 @@ + +export default definePageConfig({ + navigationBarTitleText: '首页', +}) diff --git a/collect_information/src/pages/projectManager/index/index.scss b/collect_information/src/pages/projectManager/index/index.scss new file mode 100644 index 0000000..e69de29 diff --git a/collect_information/src/pages/projectManager/index/index.vue b/collect_information/src/pages/projectManager/index/index.vue new file mode 100644 index 0000000..c75437b --- /dev/null +++ b/collect_information/src/pages/projectManager/index/index.vue @@ -0,0 +1,41 @@ + + + + diff --git a/collect_information/src/pages/register/register.config.ts b/collect_information/src/pages/register/register.config.ts new file mode 100644 index 0000000..7632e93 --- /dev/null +++ b/collect_information/src/pages/register/register.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '用户注册' +}) diff --git a/collect_information/src/pages/register/register.scss b/collect_information/src/pages/register/register.scss new file mode 100644 index 0000000..eaa1ebf --- /dev/null +++ b/collect_information/src/pages/register/register.scss @@ -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%; + } +} diff --git a/collect_information/src/pages/register/register.vue b/collect_information/src/pages/register/register.vue new file mode 100644 index 0000000..7bbe165 --- /dev/null +++ b/collect_information/src/pages/register/register.vue @@ -0,0 +1,218 @@ + + + diff --git a/collect_information/src/request/index.ts b/collect_information/src/request/index.ts new file mode 100644 index 0000000..d016e89 --- /dev/null +++ b/collect_information/src/request/index.ts @@ -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(url: string, method: keyof Taro.request.Method, options: ApiOptions, params?: object,): Promise> { + return new Promise>((resolve, reject) => { + if (options.loading) { + Taro.showLoading({ + title: '请求中...', + }).then() + } + Taro.request, 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(url: string, params?: object, options: ApiOptions = {loading: false}): Promise> { + return this.request(url, "GET", options, params) + } + + post(url: string, params?: object, options: ApiOptions = {loading: false}): Promise> { + return this.request(url, "POST", options, params) + } + + delete(url: string, params?: object, options: ApiOptions = {loading: false}): Promise> { + return this.request(url, "DELETE", options, params) + } + + put(url: string, params?: object, options: ApiOptions = {loading: false}): Promise> { + return this.request(url, "PUT", options, params) + } +} + +const api = new CustomRequest(); + +export default api diff --git a/collect_information/src/store/index.ts b/collect_information/src/store/index.ts new file mode 100644 index 0000000..7562b84 --- /dev/null +++ b/collect_information/src/store/index.ts @@ -0,0 +1,19 @@ +import {defineStore} from 'pinia' + +export const useCounterStore = defineStore('counter', { + state: () => { + return { + userInfo: {}, + selected: 0 + } + }, + actions: { + setSelected(index: number) { + this.selected = index + } + }, + getters: { + getSelected: (state) => state.selected + } +}) + diff --git a/collect_information/src/store/userStore.ts b/collect_information/src/store/userStore.ts new file mode 100644 index 0000000..e69de29 diff --git a/collect_information/src/utils/index.ts b/collect_information/src/utils/index.ts new file mode 100644 index 0000000..6fab107 --- /dev/null +++ b/collect_information/src/utils/index.ts @@ -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() + } + } + }) + +} diff --git a/collect_information/tsconfig.json b/collect_information/tsconfig.json new file mode 100644 index 0000000..0db7497 --- /dev/null +++ b/collect_information/tsconfig.json @@ -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 +} diff --git a/collect_information/types/global.d.ts b/collect_information/types/global.d.ts new file mode 100644 index 0000000..fe190e8 --- /dev/null +++ b/collect_information/types/global.d.ts @@ -0,0 +1,62 @@ +/// + +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 { + value: T, + label: string, + options?: SelectNode[] + orderIndex?: number, + disabled?: boolean, + extData?: Record +} + +interface JsonResult { + code: number; + data?: T; + message: string; +} + +/** + * 树 + */ +interface TreeNode { + value: T, + parentValue: T, + label: string, + orderIndex?: number, + extData?: Record, + children?: TreeNode[] +} diff --git a/collect_information/types/pages/index/index.d.ts b/collect_information/types/pages/index/index.d.ts new file mode 100644 index 0000000..f2e0c2f --- /dev/null +++ b/collect_information/types/pages/index/index.d.ts @@ -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 +} diff --git a/collect_information/types/pages/login/index.d.ts b/collect_information/types/pages/login/index.d.ts new file mode 100644 index 0000000..236bff4 --- /dev/null +++ b/collect_information/types/pages/login/index.d.ts @@ -0,0 +1,5 @@ +interface LoginUserInfo { + name?: string; + avatar?: string; +} + diff --git a/collect_information/types/pages/register/index.d.ts b/collect_information/types/pages/register/index.d.ts new file mode 100644 index 0000000..f759fd7 --- /dev/null +++ b/collect_information/types/pages/register/index.d.ts @@ -0,0 +1,8 @@ +interface RegisterParams { + avatar: string; + name: string; + sex:number, + telephone:string, + identity: string; + unitId: any +} diff --git a/collect_information/types/request/index.d.ts b/collect_information/types/request/index.d.ts new file mode 100644 index 0000000..e137c22 --- /dev/null +++ b/collect_information/types/request/index.d.ts @@ -0,0 +1,9 @@ +import Taro from "@tarojs/taro"; + +export interface ApiOptions + extends Omit< + Taro.request.Option, + "url" | "method" | "data" | "success" | "fail" + > { + loading?: boolean; +} diff --git a/collect_information/types/vue.d.ts b/collect_information/types/vue.d.ts new file mode 100644 index 0000000..a97867d --- /dev/null +++ b/collect_information/types/vue.d.ts @@ -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'] + */ + } +} diff --git a/policeManagement/components.d.ts b/policeManagement/components.d.ts index 4c56a83..0127fa7 100644 --- a/policeManagement/components.d.ts +++ b/policeManagement/components.d.ts @@ -18,6 +18,7 @@ declare module 'vue' { ADatePicker: typeof import('ant-design-vue/es')['DatePicker'] ADivider: typeof import('ant-design-vue/es')['Divider'] ADrawer: typeof import('ant-design-vue/es')['Drawer'] + ADropdown: typeof import('ant-design-vue/es')['Dropdown'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] AInput: typeof import('ant-design-vue/es')['Input'] @@ -56,10 +57,12 @@ declare module 'vue' { IconFont: typeof import('./src/components/iconfont/IconFont.vue')['default'] Layout: typeof import('./src/components/layout/layout.vue')['default'] LayoutHeader: typeof import('./src/components/layout/header/LayoutHeader.vue')['default'] + MenuItem: typeof import('./src/components/layout/MenuItem.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] SingleImageFileUpload: typeof import('./src/components/upload/SingleImageFileUpload.vue')['default'] Sliber: typeof import('./src/components/layout/sliber/sliber.vue')['default'] + SystemMenus: typeof import('./src/components/layout/SystemMenus.vue')['default'] TableProMax: typeof import('./src/components/table/TableProMax.vue')['default'] TelephoneLogin: typeof import('./src/components/login/TelephoneLogin.vue')['default'] } diff --git a/policeManagement/src/components/iconfont/IconFont.vue b/policeManagement/src/components/iconfont/IconFont.vue index e67e921..3546c6d 100644 --- a/policeManagement/src/components/iconfont/IconFont.vue +++ b/policeManagement/src/components/iconfont/IconFont.vue @@ -1,12 +1,12 @@ + + diff --git a/policeManagement/src/components/layout/SystemMenus.vue b/policeManagement/src/components/layout/SystemMenus.vue new file mode 100644 index 0000000..2d41687 --- /dev/null +++ b/policeManagement/src/components/layout/SystemMenus.vue @@ -0,0 +1,25 @@ + + + diff --git a/policeManagement/src/components/layout/header/LayoutHeader.vue b/policeManagement/src/components/layout/header/LayoutHeader.vue index 3f087d7..9faea1d 100644 --- a/policeManagement/src/components/layout/header/LayoutHeader.vue +++ b/policeManagement/src/components/layout/header/LayoutHeader.vue @@ -1,20 +1,58 @@