commit 9dac7e5fc9a9452768f7ee90dbf20b97021d18b8 Author: luozhun <2025254074@qq.com> Date: Fri Nov 15 12:23:16 2024 +0800 Initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..8c5b905 Binary files /dev/null and b/.DS_Store differ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b1fac77 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/policeSecurity.iml b/.idea/policeSecurity.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/policeSecurity.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file 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..d7a068a --- /dev/null +++ b/collect_information/.env.development @@ -0,0 +1,10 @@ +# 配置文档参考 https://taro-docs.jd.com/docs/next/env-mode-config +TARO_APP_ID="wx0acd1c4fcf94bdd3" +TARO_APP_BASE_API="http://172.10.10.93:8765" +# TARO_APP_BASE_API="https://www.hnjinglian.cn:5678" + + + +# minio +TARO_APP_MINIO_URL=http://118.253.177.137:9000 +TARO_APP_MINIO_BUCKET=police-security-dev diff --git a/collect_information/.env.production b/collect_information/.env.production new file mode 100644 index 0000000..d614d69 --- /dev/null +++ b/collect_information/.env.production @@ -0,0 +1,6 @@ +# TARO_APP_ID="wx0acd1c4fcf94bdd3" +TARO_APP_BASE_API="https://www.hnjinglian.cn:5678" + +# minio +TARO_APP_MINIO_URL=https://www.hnjinglian.cn:9002 +TARO_APP_MINIO_BUCKET=police-security diff --git a/collect_information/.eslintrc b/collect_information/.eslintrc new file mode 100644 index 0000000..59b61d8 --- /dev/null +++ b/collect_information/.eslintrc @@ -0,0 +1,19 @@ +// ESLint 检查 .vue 文件需要单独配置编辑器: +// https://eslint.vuejs.org/user-guide/#editor-integrations +{ + "extends": [ + "taro/vue3" + ], + "rules": { + // 添加组件命名忽略规则 + "vue/multi-word-component-names": [ + "error", + { + //需要忽略的组件名 + "ignores": [ + "index" + ] + } + ] + } +} diff --git a/collect_information/.gitignore b/collect_information/.gitignore new file mode 100644 index 0000000..63712f5 --- /dev/null +++ b/collect_information/.gitignore @@ -0,0 +1,13 @@ +dist/ +deploy_versions/ +.temp/ +.rn_temp/ +node_modules/ +.DS_Store +.swc +.idea + + +components.d.ts +package-lock.json +yarn.lock 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..3a25c14 --- /dev/null +++ b/collect_information/config/index.ts @@ -0,0 +1,115 @@ +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-9-14', + 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', + // 开启 HTML 插件 + 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..348ad9a --- /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/nutui-taro": "^4.3.13", + "@tarojs/components": "3.6.26", + "@tarojs/helper": "3.6.26", + "@tarojs/plugin-framework-vue3": "3.6.26", + "@tarojs/plugin-html": "^3.6.26", + "@tarojs/plugin-platform-alipay": "3.6.26", + "@tarojs/plugin-platform-h5": "3.6.26", + "@tarojs/plugin-platform-harmony-hybrid": "3.6.26", + "@tarojs/plugin-platform-jd": "3.6.26", + "@tarojs/plugin-platform-qq": "3.6.26", + "@tarojs/plugin-platform-swan": "3.6.26", + "@tarojs/plugin-platform-tt": "3.6.26", + "@tarojs/plugin-platform-weapp": "3.6.26", + "@tarojs/runtime": "3.6.26", + "@tarojs/shared": "3.6.26", + "@tarojs/taro": "3.6.26", + "dayjs": "^1.11.13", + "pinia": "^2.2.2", + "vue": "^3.0.0" + + }, + "devDependencies": { + "@babel/core": "^7.8.0", + "@nutui/auto-import-resolver": "^1.0.0", + "@tarojs/cli": "3.6.26", + "@tarojs/taro-loader": "3.6.26", + "@tarojs/test-utils-vue3": "^0.1.1", + "@tarojs/webpack5-runner": "3.6.26", + "@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.26", + "css-loader": "3.4.2", + "eslint": "^8.12.0", + "eslint-config-taro": "3.6.26", + "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.27.4", + "vue-loader": "^17.1.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..2d18dde --- /dev/null +++ b/collect_information/project.config.json @@ -0,0 +1,15 @@ +{ + "miniprogramRoot": "./dist", + "projectname": "collect_information", + "description": "警保联动小程序", + "appid": "touristappid", + "setting": { + "urlCheck": false, + "es6": false, + "enhance": false, + "compileHotReLoad": false, + "postcss": false, + "minified": false + }, + "compileType": "miniprogram" +} 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..20ebb39 --- /dev/null +++ b/collect_information/src/app.config.ts @@ -0,0 +1,48 @@ +import { MINI_PROGRAM_USER_CONFIG } from "@/config"; + + +const tabBarItems = Object.values(MINI_PROGRAM_USER_CONFIG).map(item => item.tabBarList).flat() + +export default defineAppConfig({ + pages: [ + 'pages/login/login', + 'pages/register/register', + ...tabBarItems.map(i => i.pagePath) + ], + subPackages: [ + { + root: "subPages/projectManager", + pages: [ + 'myProject/myProject', + 'myProject/projectDetails/projectDetails', + 'securityUserForm/securityUserForm', + ] + }, + { + root: "subPages/police", + pages: [ + 'dailyInspection/dailyInspection', + 'myEnterprisesUnit/myEnterprisesUnit', + 'myEnterprisesUnit/projectDetails/projectDetails' + ] + }, + { + root: "subPages/select", + pages: [ + 'dailyLife/dailyLife', + 'signature/signature' + ] + }, + ], + + window: { + backgroundTextStyle: 'light', + navigationBarBackgroundColor: '#4e87ff', + navigationBarTitleText: '', + navigationBarTextStyle: 'white', + }, + tabBar: { + custom: true, + list: tabBarItems + } +}) diff --git a/collect_information/src/app.scss b/collect_information/src/app.scss new file mode 100644 index 0000000..e69de29 diff --git a/collect_information/src/app.ts b/collect_information/src/app.ts new file mode 100644 index 0000000..28f74dd --- /dev/null +++ b/collect_information/src/app.ts @@ -0,0 +1,32 @@ +import {createApp} from 'vue' +import '@/app.scss' +import '@/assets/css/main.css' +import {pinia} from "@/store"; +import Taro from "@tarojs/taro"; +import {MINI_PROGRAM_USER_CONFIG} from "@/config"; +import {useUserStore} from "@/store/userStore"; +import {initEnum} from "@/enums"; + +const App = createApp({ + onLaunch(opt) { + initEnum() + if (opt.path === 'subPages/projectManager/securityUserForm/securityUserForm' && opt.query.type === 'QcCodeInput') { + return + } + const tokenInfo = useUserStore().getTokenInfo(); + if (tokenInfo) { + Taro.switchTab({ + url: MINI_PROGRAM_USER_CONFIG[tokenInfo.extData.identity.value].toIndex + }) + } else { + Taro.navigateTo({ + url: '/pages/login/login', + }) + } + }, + // 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖 +}) + +App.use(pinia) + +export default App diff --git a/collect_information/src/assets/css/main.css b/collect_information/src/assets/css/main.css new file mode 100644 index 0000000..199b446 --- /dev/null +++ b/collect_information/src/assets/css/main.css @@ -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/assets/images/banner.png b/collect_information/src/assets/images/banner.png new file mode 100644 index 0000000..f29618c Binary files /dev/null and b/collect_information/src/assets/images/banner.png differ diff --git a/collect_information/src/assets/images/popuptiobg.png b/collect_information/src/assets/images/popuptiobg.png new file mode 100644 index 0000000..8650666 Binary files /dev/null and b/collect_information/src/assets/images/popuptiobg.png differ diff --git a/collect_information/src/assets/images/project.png b/collect_information/src/assets/images/project.png new file mode 100644 index 0000000..9aef305 Binary files /dev/null and b/collect_information/src/assets/images/project.png differ diff --git a/collect_information/src/assets/images/rotate.png b/collect_information/src/assets/images/rotate.png new file mode 100644 index 0000000..1f52f3e Binary files /dev/null and b/collect_information/src/assets/images/rotate.png differ diff --git a/collect_information/src/assets/images/rotate1.png b/collect_information/src/assets/images/rotate1.png new file mode 100644 index 0000000..58adfbb Binary files /dev/null and b/collect_information/src/assets/images/rotate1.png differ diff --git a/collect_information/src/assets/images/回单.jpg b/collect_information/src/assets/images/回单.jpg new file mode 100644 index 0000000..20479b9 Binary files /dev/null and b/collect_information/src/assets/images/回单.jpg differ diff --git a/collect_information/src/assets/images/工单.jpg b/collect_information/src/assets/images/工单.jpg new file mode 100644 index 0000000..da046c5 Binary files /dev/null and b/collect_information/src/assets/images/工单.jpg differ diff --git a/collect_information/src/assets/images/排名.jpg b/collect_information/src/assets/images/排名.jpg new file mode 100644 index 0000000..96e4510 Binary files /dev/null and b/collect_information/src/assets/images/排名.jpg differ diff --git a/collect_information/src/assets/images/旋转.png b/collect_information/src/assets/images/旋转.png new file mode 100644 index 0000000..d3f7488 Binary files /dev/null and b/collect_information/src/assets/images/旋转.png differ diff --git a/collect_information/src/assets/images/法制宣传.jpg b/collect_information/src/assets/images/法制宣传.jpg new file mode 100644 index 0000000..21d0e0d Binary files /dev/null and b/collect_information/src/assets/images/法制宣传.jpg differ diff --git a/collect_information/src/assets/images/考核监督.jpg b/collect_information/src/assets/images/考核监督.jpg new file mode 100644 index 0000000..0f9f7cc Binary files /dev/null and b/collect_information/src/assets/images/考核监督.jpg differ diff --git a/collect_information/src/assets/images/警保风采.jpg b/collect_information/src/assets/images/警保风采.jpg new file mode 100644 index 0000000..8de01b4 Binary files /dev/null and b/collect_information/src/assets/images/警保风采.jpg differ diff --git a/collect_information/src/assets/logo/avatar1.png b/collect_information/src/assets/logo/avatar1.png new file mode 100644 index 0000000..09cb7a7 Binary files /dev/null and b/collect_information/src/assets/logo/avatar1.png differ diff --git a/collect_information/src/assets/logo/guohui.png b/collect_information/src/assets/logo/guohui.png new file mode 100644 index 0000000..d06ce3a Binary files /dev/null and b/collect_information/src/assets/logo/guohui.png 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/config/index.ts b/collect_information/src/config/index.ts new file mode 100644 index 0000000..ba8500d --- /dev/null +++ b/collect_information/src/config/index.ts @@ -0,0 +1,46 @@ +import {UserConfig} from "@/types/config"; + +/** + * 客户端 + */ +export const CLIENT_TYPE = 'MINI_PROGRAM' + +/** + * 小程序用户配置 + */ +export const MINI_PROGRAM_USER_CONFIG: Record = { + police: { + toIndex: '/pages/police/index/index', + tabBarList: [ + { + pagePath: 'pages/police/index/index', + text: '首页', + iconPath: "assets/mine/punch.png", + selectedIconPath: "assets/mine/punch-active.png" + }, + { + pagePath: 'pages/police/mine/index', + text: '我的', + iconPath: "assets/mine/my.png", + selectedIconPath: "assets/mine/my-active.png" + }, + ] + }, + project_manager: { + toIndex: '/pages/projectManager/index/index', + tabBarList: [ + { + pagePath: 'pages/projectManager/index/index', + text: '首页', + iconPath: "assets/mine/punch.png", + selectedIconPath: "assets/mine/punch-active.png" + }, + { + pagePath: 'pages/projectManager/mine/index', + text: '我的', + iconPath: "assets/mine/my.png", + selectedIconPath: "assets/mine/my-active.png" + }, + ] + } +} diff --git a/collect_information/src/custom-tab-bar/index.json.ts b/collect_information/src/custom-tab-bar/index.json.ts new file mode 100644 index 0000000..29210de --- /dev/null +++ b/collect_information/src/custom-tab-bar/index.json.ts @@ -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..8d062e0 --- /dev/null +++ b/collect_information/src/custom-tab-bar/index.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/collect_information/src/enums/index.ts b/collect_information/src/enums/index.ts new file mode 100644 index 0000000..efdc1ef --- /dev/null +++ b/collect_information/src/enums/index.ts @@ -0,0 +1,40 @@ +import api from "@/request"; +import Taro from "@tarojs/taro"; + +type EnumType = + 'CheckStatus' + | 'DeleteFlag' + | 'IsEnable' + | 'IsOrNot' + | 'Sex' + | 'ServiceProjectType' + | 'MiniProgramUserIdentity' + +export const initEnum = () => { + api.get[]>>('/common/enums').then(resp => { + Taro.setStorageSync('enumMap', resp.data) + }) +}; + +export const enumSelectNodes = (enumType: EnumType): SelectNodeVo[] => Taro.getStorageSync('enumMap')?.[enumType] + +export const getEnumByValue = (enumType: EnumType, value: T): null | SelectNodeVo => { + const enumList = enumSelectNodes(enumType); + if (!enumList) { + return null; + } + for (let i = 0; i < enumList.length; i++) { + if (value === enumList[i].value) { + return enumList[i] + } + } + return null; +}; + +export const getEnumLabelByValue = (enumType: EnumType, value: T): string => { + const enums = getEnumByValue(enumType, value) + if (!enums) { + return '-' + } + return enums.label; +}; 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/login/login.config.ts b/collect_information/src/pages/login/login.config.ts new file mode 100644 index 0000000..9d41d86 --- /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..ed09acd --- /dev/null +++ b/collect_information/src/pages/login/login.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/collect_information/src/pages/police/index/index.config.ts b/collect_information/src/pages/police/index/index.config.ts new file mode 100644 index 0000000..a7c25c7 --- /dev/null +++ b/collect_information/src/pages/police/index/index.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '首页', +}) diff --git a/collect_information/src/pages/police/index/index.scss b/collect_information/src/pages/police/index/index.scss new file mode 100644 index 0000000..6ff67f6 --- /dev/null +++ b/collect_information/src/pages/police/index/index.scss @@ -0,0 +1,76 @@ +.nameTitle { + position: absolute; + top: 19%; + left: 55px; + height: 125rpx; + background-color: #fff; + width: 650rpx; + border-radius: 12rpx; + box-shadow: 0px 10px 10px -4px #e3e3e3; + display: flex; + justify-content: space-between; + align-items: center; + + .itemSchool { + border-right: solid 1.5rpx #dadada; + display: flex; + flex-direction: column; + align-items: center; + width: 25%; + font-size: 24px + } + + .itemSchool text:nth-child(1) { + margin-bottom: 10rpx; + color: #898a8a; + margin-left: -8px; + } +} +.nameTitle .itemSchool:nth-child(4) { + border-right: none; +} +.swiperDemoItem { + color: #3886d0; + display: flex; + padding: 20px 0 0 50px; + overflow: hidden; + height: 70rpx; + margin-top: 70px; + + .swiperDemoIndex { + width: 15px; + height: 45px; + background-image: linear-gradient(to bottom, #5d9cf9, #317ad9); + border-radius: 20px; + margin-right: 15px; + } +} +.Module { + background-color: #fff; + overflow: hidden; + .subModule { + display: flex; + align-items: center; + flex-wrap: wrap; + .subModuleItem { + width: 246rpx; + height: 140rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding-bottom: 10rpx; + .subModuleIndex { + width: 45rpx; + height: 45rpx; + image { + width: 100%; + height: 100%; + } + } + } + } + +} + + diff --git a/collect_information/src/pages/police/index/index.scss.bak b/collect_information/src/pages/police/index/index.scss.bak new file mode 100644 index 0000000..650fcb5 --- /dev/null +++ b/collect_information/src/pages/police/index/index.scss.bak @@ -0,0 +1,47 @@ +.swiperDemoItem { + color: #3886d0; + display: flex; + padding: 20px 0 0 50px; + overflow: hidden; + height: 70rpx; + + .swiperDemoIndex { + width: 15px; + height: 45px; + background-image: linear-gradient(to bottom, #5d9cf9, #317ad9); + //background: rgb(); + border-radius: 20px; + margin-right: 15px; + } +} + +.subModule { + display: flex; + align-items: center; + flex-wrap: wrap; + margin-right: -3px; + margin-left: -1px; + + .subModuleItem { + width: 33%; + height: 180rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding-bottom: 10rpx; + border: 1px solid #ccc; + border-left: 0; + margin-top: -1px; + + .subModuleIndex { + width: 65rpx; + height: 65rpx; + + image { + width: 100%; + height: 100%; + } + } + } +} diff --git a/collect_information/src/pages/police/index/index.vue b/collect_information/src/pages/police/index/index.vue new file mode 100644 index 0000000..3ab9781 --- /dev/null +++ b/collect_information/src/pages/police/index/index.vue @@ -0,0 +1,116 @@ + + diff --git a/collect_information/src/pages/police/index/index.vue.bak b/collect_information/src/pages/police/index/index.vue.bak new file mode 100644 index 0000000..2e7a226 --- /dev/null +++ b/collect_information/src/pages/police/index/index.vue.bak @@ -0,0 +1,108 @@ + + + + + + diff --git a/collect_information/src/pages/police/mine/index.config.ts b/collect_information/src/pages/police/mine/index.config.ts new file mode 100644 index 0000000..a7c25c7 --- /dev/null +++ b/collect_information/src/pages/police/mine/index.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '首页', +}) diff --git a/collect_information/src/pages/police/mine/index.scss b/collect_information/src/pages/police/mine/index.scss new file mode 100644 index 0000000..22a7712 --- /dev/null +++ b/collect_information/src/pages/police/mine/index.scss @@ -0,0 +1,71 @@ +.public { + height: 100vh; + background-color: #fff; +} +.public-container { + height: 320rpx; + display: flex; + align-items: center; + background-image: url('../../../assets/images/banner.png'); + background-repeat: no-repeat; + background-position: right; + overflow: hidden; + padding: 45rpx; + box-sizing: border-box; + .contacts { + height: 75rpx; + width: 75rpx; + border-radius: 50%; + border: solid 1px gray; + .image { + width: 100%; + height: 100%; + } + } + .tips-text { + display: flex; + font-size: 28rpx; + color: #fff; + line-height: 50rpx; + margin-left: 20rpx; + flex-direction: column; + justify-content: space-evenly; + } +} +.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; + color: #7d7d7d; + .exitItem { + display: flex; + align-items: center; + margin-left: 30rpx; + } + .exitItemIndex { + height: 40rpx; + width: 40rpx; + border-radius: 50%; + display: block; + line-height: 48rpx; + image { + width: 100%; + height: 100%; + } + } + .microscope { + 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/police/mine/index.vue b/collect_information/src/pages/police/mine/index.vue new file mode 100644 index 0000000..2f180fa --- /dev/null +++ b/collect_information/src/pages/police/mine/index.vue @@ -0,0 +1,80 @@ + + + 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..a7c25c7 --- /dev/null +++ b/collect_information/src/pages/projectManager/index/index.config.ts @@ -0,0 +1,3 @@ +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..6ff67f6 --- /dev/null +++ b/collect_information/src/pages/projectManager/index/index.scss @@ -0,0 +1,76 @@ +.nameTitle { + position: absolute; + top: 19%; + left: 55px; + height: 125rpx; + background-color: #fff; + width: 650rpx; + border-radius: 12rpx; + box-shadow: 0px 10px 10px -4px #e3e3e3; + display: flex; + justify-content: space-between; + align-items: center; + + .itemSchool { + border-right: solid 1.5rpx #dadada; + display: flex; + flex-direction: column; + align-items: center; + width: 25%; + font-size: 24px + } + + .itemSchool text:nth-child(1) { + margin-bottom: 10rpx; + color: #898a8a; + margin-left: -8px; + } +} +.nameTitle .itemSchool:nth-child(4) { + border-right: none; +} +.swiperDemoItem { + color: #3886d0; + display: flex; + padding: 20px 0 0 50px; + overflow: hidden; + height: 70rpx; + margin-top: 70px; + + .swiperDemoIndex { + width: 15px; + height: 45px; + background-image: linear-gradient(to bottom, #5d9cf9, #317ad9); + border-radius: 20px; + margin-right: 15px; + } +} +.Module { + background-color: #fff; + overflow: hidden; + .subModule { + display: flex; + align-items: center; + flex-wrap: wrap; + .subModuleItem { + width: 246rpx; + height: 140rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding-bottom: 10rpx; + .subModuleIndex { + width: 45rpx; + height: 45rpx; + image { + width: 100%; + height: 100%; + } + } + } + } + +} + + 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..f9bcefe --- /dev/null +++ b/collect_information/src/pages/projectManager/index/index.vue @@ -0,0 +1,100 @@ + + diff --git a/collect_information/src/pages/projectManager/mine/index.config.ts b/collect_information/src/pages/projectManager/mine/index.config.ts new file mode 100644 index 0000000..b4d3feb --- /dev/null +++ b/collect_information/src/pages/projectManager/mine/index.config.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '我的', +}) diff --git a/collect_information/src/pages/projectManager/mine/index.scss b/collect_information/src/pages/projectManager/mine/index.scss new file mode 100644 index 0000000..321b2e7 --- /dev/null +++ b/collect_information/src/pages/projectManager/mine/index.scss @@ -0,0 +1,71 @@ +.mine { + height: 100vh; + background-color: #fff; +} +.mine-container { + height: 320rpx; + display: flex; + align-items: center; + background-image: url('../../../assets/images/banner.png'); + background-repeat: no-repeat; + background-position: right; + overflow: hidden; + padding: 45rpx; + box-sizing: border-box; + .contacts { + height: 75rpx; + width: 75rpx; + border-radius: 50%; + border: solid 1px gray; + .image { + width: 100%; + height: 100%; + } + } + .tips-text { + display: flex; + font-size: 28rpx; + color: #fff; + line-height: 50rpx; + margin-left: 20rpx; + flex-direction: column; + justify-content: space-evenly; + } +} +.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; + color: #7d7d7d; + .exitItem { + display: flex; + align-items: center; + margin-left: 30rpx; + } + .exitItemIndex { + height: 40rpx; + width: 40rpx; + border-radius: 50%; + display: block; + line-height: 48rpx; + image { + width: 100%; + height: 100%; + } + } + .microscope { + 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/projectManager/mine/index.vue b/collect_information/src/pages/projectManager/mine/index.vue new file mode 100644 index 0000000..b85b668 --- /dev/null +++ b/collect_information/src/pages/projectManager/mine/index.vue @@ -0,0 +1,81 @@ + + + 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..1c854c8 --- /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..d3ec4b4 --- /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..7031d06 --- /dev/null +++ b/collect_information/src/pages/register/register.vue @@ -0,0 +1,225 @@ + + diff --git a/collect_information/src/picker-search/picker-search.json.ts b/collect_information/src/picker-search/picker-search.json.ts new file mode 100644 index 0000000..29210de --- /dev/null +++ b/collect_information/src/picker-search/picker-search.json.ts @@ -0,0 +1,3 @@ +export default { + "component": true +} diff --git a/collect_information/src/picker-search/picker-search.scss b/collect_information/src/picker-search/picker-search.scss new file mode 100644 index 0000000..f5ee090 --- /dev/null +++ b/collect_information/src/picker-search/picker-search.scss @@ -0,0 +1,85 @@ +.uiwu-flex-align { + align-items: center; +} + +.uiwu-flex { + display: flex; +} + +.uiwu-flex-space { + align-items: center; + justify-content: space-between; +} + +.uiwu-picker-search { + position: absolute; + height: 1031rpx; + left: 0; + right: 0; + bottom: 0; + background: url('../assets/images/popuptiobg.png') no-repeat 0 0 #fff; + background-size: 100% auto; + border-radius: 30rpx 30rpx 0 0; + + &-btn { + padding: 20rpx 30rpx 40rpx; + + text { + &:nth-child(1) { + color: #999; + } + + &:nth-child(2) { + color: #00bbff; + } + } + } + + &-input { + box-sizing: border-box; + height: 80rpx; + background: rgba(#f3f6fd, 0.6); + border-radius: 16rpx; + margin: 0 30rpx; + padding-left: 24rpx; + padding-right: 10rpx; + + input { + font-size: 28rpx; + width: 100%; + } + } + + .scroll-view { + width: 100%; + height: calc(100% - 212rpx); + margin-top: 30rpx; + } + + .radio-group { + padding: 0 50rpx 30rpx; + + &-item { + margin-bottom: 20rpx; + + text { + font-size: 28rpx; + color: #666; + } + + radio { + transform: scale(0.8); + } + } + } +} + +.searchButton { + height: 60rpx; + width: 200rpx; + border-radius: 10rpx; + line-height: 60rpx; + text-align: center; + color: #fff; + background-color: #00bbff; +} diff --git a/collect_information/src/picker-search/picker-search.vue b/collect_information/src/picker-search/picker-search.vue new file mode 100644 index 0000000..d23edcb --- /dev/null +++ b/collect_information/src/picker-search/picker-search.vue @@ -0,0 +1,90 @@ + + + diff --git a/collect_information/src/request/index.ts b/collect_information/src/request/index.ts new file mode 100644 index 0000000..9c89ee8 --- /dev/null +++ b/collect_information/src/request/index.ts @@ -0,0 +1,112 @@ +import Taro from "@tarojs/taro"; +import { ApiOptions } from "@/types/request"; +import { useUserStore } from "@/store/userStore"; + + +/** + * 请求拦截器 + * @param chain + */ +const requestInterceptor = (chain: Taro.Chain) => { + const requestParams = chain.requestParams + const tokenInfo = useUserStore().getTokenInfo() + const { header } = requestParams; + const customHeader: Record = {} + //添加token + tokenInfo && (customHeader[tokenInfo.name] = tokenInfo.value); + requestParams.header = { + ...header, + ...customHeader + } + return chain.proceed(requestParams) +} + +//所有的拦截器 +const interceptors = [requestInterceptor]; +//注册拦截器 +interceptors.forEach((interceptorItem) => Taro.addInterceptor(interceptorItem)); + +class CustomRequest { + BASE_API: string = process.env.TARO_APP_BASE_API; + + private request(url: string, method: keyof Taro.request.Method, options: ApiOptions, params?: object,): Promise> { + // console.log(this.BASE_API,'0000000') + return new Promise>((resolve, reject) => { + if (options.loading) { + Taro.showLoading({ + title: '请求中...', + }).then() + // Taro.showLoading({ + // title: '请求中...', + // }) + } + Taro.request, object>({ + url: this.BASE_API + url, + data: params, + method, + ...options, + success: (result) => { + Taro.hideLoading() + if (result.header['Content-Type'] === 'application/octet-stream') { + resolve(result.data) + return + } + const jsonResult = result.data + if (jsonResult.code !== 200) { + if ([401].includes(jsonResult.code)) { + // 重新登录 跳转登录页 提示错误 + } + Taro.showToast({ + title: jsonResult.message, + icon: 'none', + mask: true, + duration: 2000 + }).then() + reject(jsonResult); + } else { + 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> { + options.header = { + ...options.header, + "content-type": 'application/x-www-form-urlencoded' + } + 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> { + options.header = { + ...options.header, + "content-type": 'application/x-www-form-urlencoded' + } + 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/daily.ts b/collect_information/src/store/daily.ts new file mode 100644 index 0000000..50b7752 --- /dev/null +++ b/collect_information/src/store/daily.ts @@ -0,0 +1,37 @@ +import { defineStore } from 'pinia' + +export const useDailyStore = defineStore('daily', { + state: () => ({ + userdailyinspection: [], + base64_1: '', + base64_2: '', + }), + actions: { + dailyinspectionList(data) { + this.userdailyinspection = [...data] + }, + change_base64_1(data) { + this.base64_1 = data + }, + change_base64_2(data) { + this.base64_2 = data + }, + clearSignData() { + this.base64_1 = '' + this.base64_2 = '' + }, + + }, + getters: { + getdailyinspection(state) { + return state.userdailyinspection + }, + get_base64_1(state) { + return state.base64_1 + }, + get_base64_2(state) { + return state.base64_2 + }, + + } +}) diff --git a/collect_information/src/store/index.ts b/collect_information/src/store/index.ts new file mode 100644 index 0000000..e917126 --- /dev/null +++ b/collect_information/src/store/index.ts @@ -0,0 +1,3 @@ +import {createPinia} from 'pinia' + +export const pinia = createPinia() diff --git a/collect_information/src/store/tabBarStore.ts b/collect_information/src/store/tabBarStore.ts new file mode 100644 index 0000000..accf8c3 --- /dev/null +++ b/collect_information/src/store/tabBarStore.ts @@ -0,0 +1,14 @@ +import {defineStore} from "pinia"; +import {ref} from "vue"; + +export const useTabBarStore = defineStore('tabBar', () => { + const selected = ref(0) + const setSelected = (index: number) => { + selected.value = index; + } + + return { + selected, + setSelected + } +}) diff --git a/collect_information/src/store/userStore.ts b/collect_information/src/store/userStore.ts new file mode 100644 index 0000000..2dafcb3 --- /dev/null +++ b/collect_information/src/store/userStore.ts @@ -0,0 +1,40 @@ +import {defineStore} from "pinia"; +import {ref} from "vue"; +import Taro from "@tarojs/taro"; + +export const useUserStore = defineStore('userStore', () => { + /** 获取token信息 **/ + const getTokenInfo = (): TokenInfo | null => { + const ti = Taro.getStorageSync('tokenInfo') + // 如果 ti 存在且不是空字符串,则返回 ti,否则返回 null + return (ti !== undefined && ti !== null && ti !== '') ? ti : null; + } + /** 用户token信息 **/ + const tokenInfo = ref(getTokenInfo()) + /** 保存token信息 **/ + const saveTokenInfo = (t: TokenInfo) => { + tokenInfo.value = t; + Taro.setStorageSync('tokenInfo', tokenInfo.value) + } + /** 清楚token信息 */ + const clearTokenInfo = () => { + tokenInfo.value = null + Taro.removeStorageSync('tokenInfo') + } + + + /** + * 重置用户数据 + * 一般用于用户退出登录 重置所有相关数据 + */ + const resetUserInfo = () => { + clearTokenInfo() + } + + return { + tokenInfo, + saveTokenInfo, + getTokenInfo, + resetUserInfo + } +}) diff --git a/collect_information/src/subPages/police/dailyInspection/dailyInspection.scss b/collect_information/src/subPages/police/dailyInspection/dailyInspection.scss new file mode 100644 index 0000000..1d91809 --- /dev/null +++ b/collect_information/src/subPages/police/dailyInspection/dailyInspection.scss @@ -0,0 +1,149 @@ +page { + position: relative; +} + +.container { + width: 100%; + +} + +.picker { + padding: 30rpx 30rpx; + display: flex; + justify-content: space-between; +} + +.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; + + .exitItem { + display: flex; + align-items: center; + } + + .iconoscope { + z-index: 9999; + width: 8px; + height: 8px; + display: inline-block; + border: solid 2px #c2c2c2; + margin-left: 10px; + transform: rotate(45deg); + border-bottom: white; + border-left: white; + } +} + +.sigh_btns { + transform: rotate(-90deg); + transform-origin: center +} + +.sigh_btns_noRotate {} + + + +.input_width { + width: 400rpx; + height: 40rpx; + display: flex; + justify-content: space-between; + align-items: center +} + + + + + +.uiwu-flex-align { + align-items: center; +} + +.uiwu-flex { + display: flex; +} + +.uiwu-flex-space { + align-items: center; + justify-content: space-between; +} + +.uiwu-picker-search { + position: absolute; + height: 1031rpx; + left: 0; + right: 0; + bottom: 0; + background: url('../../../assets/images/popuptiobg.png') no-repeat 0 0 #fff; + background-size: 100% auto; + border-radius: 30rpx 30rpx 0 0; + + &-btn { + padding: 20rpx 30rpx 40rpx; + + text { + &:nth-child(1) { + color: #999; + } + + &:nth-child(2) { + color: rgb(73, 143, 242); + } + } + } + + &-input { + box-sizing: border-box; + height: 80rpx; + background: rgba(#f3f6fd, 0.6); + border-radius: 16rpx; + margin: 0 30rpx; + padding-left: 24rpx; + padding-right: 10rpx; + + input { + font-size: 28rpx; + width: 100%; + } + } + + .scroll-view { + width: 100%; + height: 800rpx; + margin-top: 30rpx; + } + + .radio-group { + padding: 0 50rpx 30rpx; + overflow-y: scroll; + + &-item { + margin-bottom: 20rpx; + + text { + font-size: 28rpx; + color: #666; + } + + radio { + transform: scale(0.8); + } + } + } +} + +.searchButton { + height: 60rpx; + width: 200rpx; + border-radius: 10rpx; + line-height: 60rpx; + text-align: center; + color: #fff; + background-color: rgb(73, 143, 242); +} diff --git a/collect_information/src/subPages/police/dailyInspection/dailyInspection.ts b/collect_information/src/subPages/police/dailyInspection/dailyInspection.ts new file mode 100644 index 0000000..99bd791 --- /dev/null +++ b/collect_information/src/subPages/police/dailyInspection/dailyInspection.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '监督考核', +}) diff --git a/collect_information/src/subPages/police/dailyInspection/dailyInspection.vue b/collect_information/src/subPages/police/dailyInspection/dailyInspection.vue new file mode 100644 index 0000000..6a5ab3f --- /dev/null +++ b/collect_information/src/subPages/police/dailyInspection/dailyInspection.vue @@ -0,0 +1,404 @@ + + + diff --git a/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.scss b/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.scss new file mode 100644 index 0000000..94a2385 --- /dev/null +++ b/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.scss @@ -0,0 +1,31 @@ +page { + background-color: #f0f0f0; +} + +.myProject { + .myProjectItem { + margin: 20px; + border-radius: 10px; + background: #ffffff; + padding: 15px; + font-size: 28px; + line-height: 50px; + color: #333333; + + .myProjectIndex { + color: #9b9b9f; + } + + .project { + //display: flex; + //justify-content: space-between; + //flex-flow: wrap; + //text-align: center; + + view { + width: 100%; + margin: 8px 0 8px 0; + } + } + } +} diff --git a/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.ts b/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.ts new file mode 100644 index 0000000..db6b2a1 --- /dev/null +++ b/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '企事业单位', +}) diff --git a/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.vue b/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.vue new file mode 100644 index 0000000..4ed49dc --- /dev/null +++ b/collect_information/src/subPages/police/myEnterprisesUnit/myEnterprisesUnit.vue @@ -0,0 +1,62 @@ + + + diff --git a/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.scss b/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.scss new file mode 100644 index 0000000..ef412c6 --- /dev/null +++ b/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.scss @@ -0,0 +1,79 @@ +.projectDetails { + height: 100vh; + overflow: hidden; + background: #f1f1f1; + display: flex; + flex-direction: column; + + .projectDetailsItem { + margin: 10px 20px 10px 20px; + border-radius: 10px; + background: #ffffff; + padding: 15px; + font-size: 28px; + line-height: 65px; + color: #333333; + + .projectDetailsIndex { + display: flex; + flex-wrap: wrap; + line-height: 44rpx; + margin-bottom: 20px; + + .content { + color: #9b9b9f; + } + } + } + + .projectDetailsTableDrop { + height: 80%; + + .projectDetailsTable { + margin: 20px; + border-radius: 10px; + background: #ffffff; + padding: 15px; + font-size: 28px; + line-height: 50px; + color: #333333; + + .projectDetailsTableItem { + //display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + font-size: 24px; + margin-bottom: 15px; + + .projectDetailsTableIndex { + display: flex; + justify-content: flex-end; + text-align: center; + + view { + width: 70px; + margin-right: 20px; + } + } + } + } + } + + .projectDetailsButton { + position: fixed; + bottom: 19px; + display: flex; + -webkit-justify-content: space-around; + margin-bottom: 10rpx; + right: 0; + width: 100%; + } + + .nutPopup { + width: 300px; + height: 100px; + display: flex; + flex-wrap: wrap; + } +} diff --git a/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.ts b/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.ts new file mode 100644 index 0000000..463c9fb --- /dev/null +++ b/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '项目详情', +}) diff --git a/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.vue b/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.vue new file mode 100644 index 0000000..306fcdd --- /dev/null +++ b/collect_information/src/subPages/police/myEnterprisesUnit/projectDetails/projectDetails.vue @@ -0,0 +1,142 @@ + + diff --git a/collect_information/src/subPages/projectManager/myProject/myProject.scss b/collect_information/src/subPages/projectManager/myProject/myProject.scss new file mode 100644 index 0000000..d94d1d9 --- /dev/null +++ b/collect_information/src/subPages/projectManager/myProject/myProject.scss @@ -0,0 +1,35 @@ +.myProject { + height: 100vh; + overflow: hidden; + background: #f1f1f1; + + .myProjectItem { + //height: 20%; + margin: 20px; + border-radius: 10px; + background: #ffffff; + padding: 15px; + font-size: 28px; + line-height: 50px; + color: #333333; + + .myProjectIndex { + color: #9b9b9f; + } + + .project { + display: flex; + justify-content: space-between; + flex-flow: wrap; + text-align: center; + + view { + width: 45%; + height: 100rpx; + border: 1px solid #cccccc; + line-height: 100rpx; + margin: 8px 0 8px 0; + } + } + } +} diff --git a/collect_information/src/subPages/projectManager/myProject/myProject.ts b/collect_information/src/subPages/projectManager/myProject/myProject.ts new file mode 100644 index 0000000..7d4dae7 --- /dev/null +++ b/collect_information/src/subPages/projectManager/myProject/myProject.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '我的项目', +}) diff --git a/collect_information/src/subPages/projectManager/myProject/myProject.vue b/collect_information/src/subPages/projectManager/myProject/myProject.vue new file mode 100644 index 0000000..8cdf561 --- /dev/null +++ b/collect_information/src/subPages/projectManager/myProject/myProject.vue @@ -0,0 +1,56 @@ + + + diff --git a/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.scss b/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.scss new file mode 100644 index 0000000..acb1441 --- /dev/null +++ b/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.scss @@ -0,0 +1,105 @@ +.projectDetails { + height: 100vh; + overflow: hidden; + background: #f1f1f1; + display: flex; + flex-direction: column; + + .projectDetailsItem { + margin: 10px 20px 10px 20px; + border-radius: 10px; + background: #ffffff; + padding: 15px; + font-size: 28px; + line-height: 65px; + color: #333333; + + .projectDetailsIndex { + display: flex; + flex-wrap: wrap; + line-height: 44rpx; + margin-bottom: 20px; + + .content { + color: #9b9b9f; + } + } + } + + .projectDetailsTableDrop { + height: 80%; + + .projectDetailsTable { + margin: 20px; + border-radius: 10px; + background: #ffffff; + padding: 15px; + font-size: 28px; + line-height: 50px; + color: #333333; + + .projectDetailsTableItem { + //display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + font-size: 24px; + margin-bottom: 15px; + + .projectDetailsTableIndex { + display: flex; + justify-content: flex-end; + text-align: center; + + view { + width: 70px; + margin-right: 20px; + } + } + } + } + } + + .projectDetailsButton { + position: fixed; + bottom: 19px; + display: flex; + -webkit-justify-content: space-around; + margin-bottom: 10rpx; + right: 0; + width: 100%; + } + + .nutPopup { + width: 300px; + height: 100px; + display: flex; + flex-wrap: wrap; + } + + .qrcodeVisibleUrl { + margin-bottom: 5px; + + image { + width: 100%; + } + } + + .warp { + display: flex; + align-items: center; + justify-content: center; + height: 100vh; + + .warpItem { + width: 90%; + height: 50%; + text-align: center; + + .rect { + width: 100%; + height: 100%; + } + } + } +} diff --git a/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.ts b/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.ts new file mode 100644 index 0000000..463c9fb --- /dev/null +++ b/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '项目详情', +}) diff --git a/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.vue b/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.vue new file mode 100644 index 0000000..b70a065 --- /dev/null +++ b/collect_information/src/subPages/projectManager/myProject/projectDetails/projectDetails.vue @@ -0,0 +1,270 @@ + + + + diff --git a/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.scss b/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.scss new file mode 100644 index 0000000..4dd980a --- /dev/null +++ b/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.scss @@ -0,0 +1,8 @@ +.form { + .formButton { + display: flex; + margin-top: auto; + justify-content: space-around; + margin-bottom: 30px + } +} diff --git a/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.ts b/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.ts new file mode 100644 index 0000000..65ce4c0 --- /dev/null +++ b/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '项目人员录入', +}) diff --git a/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.vue b/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.vue new file mode 100644 index 0000000..98dadd5 --- /dev/null +++ b/collect_information/src/subPages/projectManager/securityUserForm/securityUserForm.vue @@ -0,0 +1,159 @@ + + diff --git a/collect_information/src/subPages/select/dailyLife/dailyLife.scss b/collect_information/src/subPages/select/dailyLife/dailyLife.scss new file mode 100644 index 0000000..64337a3 --- /dev/null +++ b/collect_information/src/subPages/select/dailyLife/dailyLife.scss @@ -0,0 +1,26 @@ +.userinform { + height: 100%; + width: 100%; +} + +.userItem { + color: #7b7b7b; + font-size: 14px; + margin-bottom: 8px; + + .textIndex { + margin-left: 20rpx; + } +} + +.text { + width: 96%; +} + +.singleChoice { + width: 90%; +} + +.label { + margin: 0 20px; +} diff --git a/collect_information/src/subPages/select/dailyLife/dailyLife.ts b/collect_information/src/subPages/select/dailyLife/dailyLife.ts new file mode 100644 index 0000000..457d7f4 --- /dev/null +++ b/collect_information/src/subPages/select/dailyLife/dailyLife.ts @@ -0,0 +1,3 @@ +export default definePageConfig({ + navigationBarTitleText: '', +}) diff --git a/collect_information/src/subPages/select/dailyLife/dailyLife.vue b/collect_information/src/subPages/select/dailyLife/dailyLife.vue new file mode 100644 index 0000000..7ea5510 --- /dev/null +++ b/collect_information/src/subPages/select/dailyLife/dailyLife.vue @@ -0,0 +1,121 @@ + + + diff --git a/collect_information/src/subPages/select/signature/signature.scss b/collect_information/src/subPages/select/signature/signature.scss new file mode 100644 index 0000000..fc3270e --- /dev/null +++ b/collect_information/src/subPages/select/signature/signature.scss @@ -0,0 +1,65 @@ +.sign-box { + position: fixed; + z-index: 100; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.fixedIcon { + z-index: 1000; + position: fixed; + right: 20px; + top: 20px; + height: 100rpx; + width: 100rpx; +} + +.sign-view { + height: 100%; +} + +.sigh_btns_false { + position: absolute; + bottom: 15rpx; + right: 0; + width: 100%; + height: 100rpx; + display: flex; + justify-content: space-evenly; + align-items: center; + +} + +.sigh_btns { + transform: rotate(90deg); + transform-origin: center +} + +.sigh_btns_noRotate {} + +.sigh_btns_true { + position: absolute; + left: 0; + top: 0; + width: 20%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; +} + + +.mycanvas { + width: 100%; + background-color: #ececec; +} + +.canvsborder { + border: 1rpx solid #333; + position: fixed; + top: 0; + left: 10000rpx; +} diff --git a/collect_information/src/subPages/select/signature/signature.ts b/collect_information/src/subPages/select/signature/signature.ts new file mode 100644 index 0000000..5f9871a --- /dev/null +++ b/collect_information/src/subPages/select/signature/signature.ts @@ -0,0 +1,4 @@ +export default definePageConfig({ + navigationBarTitleText: '签名', + disableScroll: true +}) diff --git a/collect_information/src/subPages/select/signature/signature.vue b/collect_information/src/subPages/select/signature/signature.vue new file mode 100644 index 0000000..f0b3643 --- /dev/null +++ b/collect_information/src/subPages/select/signature/signature.vue @@ -0,0 +1,174 @@ + + + diff --git a/collect_information/src/utils/index.ts b/collect_information/src/utils/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/collect_information/tsconfig.json b/collect_information/tsconfig.json new file mode 100644 index 0000000..91cfcd5 --- /dev/null +++ b/collect_information/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "target": "es2017", + "module": "commonjs", + "removeComments": false, + "preserveConstEnums": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "noImplicitAny": false, + "allowSyntheticDefaultImports": true, + "outDir": "lib", + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "sourceMap": true, + "rootDir": ".", + "jsx": "preserve", + "allowJs": true, + "resolveJsonModule": true, + "typeRoots": [ + "node_modules/@types" + ], + "paths": { + // TS5090 leading './' + "@/*": [ + "./src/*" + ], + "@/types/*": [ + "./types/*" + ] + } + }, + "include": [ + "./src", + "./types", + "./config" + ], + "compileOnSave": false +} diff --git a/collect_information/types/config/index.ts b/collect_information/types/config/index.ts new file mode 100644 index 0000000..4069599 --- /dev/null +++ b/collect_information/types/config/index.ts @@ -0,0 +1,8 @@ +import Taro from "@tarojs/taro"; + +export interface UserConfig { + /** 跳转的首页地址 **/ + toIndex: string; + /** 身份对应的tabBar列表 **/ + tabBarList: Taro.TabBarItem[] +} diff --git a/collect_information/types/global.d.ts b/collect_information/types/global.d.ts new file mode 100644 index 0000000..c5cf58f --- /dev/null +++ b/collect_information/types/global.d.ts @@ -0,0 +1,158 @@ +/// + +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' +} + +/** + * 微信小程序用户身份 + */ +type MiniProgramUserIdentity = 'police' | 'project_manager' + +/** + * 选择 + */ +interface SelectNodeVo> { + value: T; + label: string; + orderIndex?: number; + disabled?: boolean; + extData?: E +} + +/** + * 树 + */ +interface TreeNodeVo> { + value: T; + parentValue: T; + label: string; + orderIndex?: number; + children?: TreeNodeVo[] + extData?: E; +} + +/** + * 全局状态返回 + */ +interface JsonResult { + code: number; + data?: T; + message: string; +} + +/** + * 分页对象 + */ +interface PagerVo { + size: number, + total: number; + current: number; + records: T[] +} + +/** + * token信息 + */ +interface TokenInfo { + /** token名称 **/ + name: string; + /** token值 **/ + value: string; + /** 拓展属性 **/ + extData: { + /** 身份 **/ + identity: BaseEnum + } +} + +/** + * 基本枚举类型 + */ +interface BaseEnum> { + value: T; + label: string; + extData: E; +} + +interface StandardList { + ckItemId: string + deductionPoints: number + name: string + snowFlakeId: string + isSelected: boolean +} +interface ItemList { + ckGroupId: string + name: string + remark: string + snowFlakeId: string + standardList: StandardList[] + type: { value: string; label: string } + selectedID: string + selected_points: number + selectedGroup: any[] +} +interface StarRating { + itemList: ItemList[] + name: string + remark: string + snowFlakeId: string + totalScore: number + currentScore: number +} +interface UnitEnterprisesUnitList { + label: string + value: string + extData: { + type: { + label: string + value: string + } + } +} +interface CkProjectListByType { + label: string + value: string + extData: { + createTime: string + remark: string + totalScore: number + type: { + label: string + value: string + } + } +} +interface Item { + itemList: any[] // 根据实际情况调整类型 + snowFlakeId: string +} diff --git a/collect_information/types/pages/police/index.ts b/collect_information/types/pages/police/index.ts new file mode 100644 index 0000000..802c4de --- /dev/null +++ b/collect_information/types/pages/police/index.ts @@ -0,0 +1,13 @@ +export interface DataStatisticsRes { + /*企事业单位数量 */ + enterprisesUnitCount: number; + + /*服务项目数量 */ + serviceProjectCount: number; + + /*保安人员数量 */ + securityUserCount: number; + + /*无证保安人员数量 */ + noCardSecurityUserCount: number; +} diff --git a/collect_information/types/pages/register/index.ts b/collect_information/types/pages/register/index.ts new file mode 100644 index 0000000..b840184 --- /dev/null +++ b/collect_information/types/pages/register/index.ts @@ -0,0 +1,8 @@ +export interface RegisterParams { + avatar: string; + name: string; + sex: number, + telephone: string, + identity: string; + unitId: string +} diff --git a/collect_information/types/request/index.ts b/collect_information/types/request/index.ts new file mode 100644 index 0000000..fb99bfd --- /dev/null +++ b/collect_information/types/request/index.ts @@ -0,0 +1,5 @@ +import Taro from "@tarojs/taro"; + +export interface ApiOptions extends Omit { + loading?: boolean; +} diff --git a/collect_information/types/subPages/projectManager/myProject/index.ts b/collect_information/types/subPages/projectManager/myProject/index.ts new file mode 100644 index 0000000..4bbe728 --- /dev/null +++ b/collect_information/types/subPages/projectManager/myProject/index.ts @@ -0,0 +1,63 @@ +export interface MyProjectList { + item?: any, + address?: string; + city?: string; + cityName?: string; + contactPersonInfo: ContactPersonInfo; + districts?: string; + districtsName?: string; + name: string; + province?: string; + provinceName: string; + remark?: string; + serviceProjectList: ServiceProjectList[]; + snowFlakeId?: string; + securityUnitId: string; + street?: string; + streetName?: string; + type?:any +} + +export interface ContactPersonInfo { + name: string; + telephone: string +} + +export interface ServiceProjectList { + buildingTotal?: number; + houseTotal?: number; + idNumber?: string; + isRecruitSecurity?: null; + name?: string; + remark?: string; + securityUserTotal?: number; + securityUnitName?:string; + serviceArea?: number; + snowFlakeId?: string; + staffTotal?: number; + type?: any; + projectManagerMiniProgramUserInfo?: ProgramUserInfo +} + +export interface ProgramUserInfo { + idCard?: null + name?: string + telephone?: string +} + +export interface ServiceProjectSecurityUserPagerVo { + createTime?: string; + dateOfBirth?: string; + homeAddress?: string; + idCard?: string; + name?: string; + nativePlace?: string; + remark?: string; + securityNumber?: string; + securityUnitId?: string; + securityUnitName?: string; + serviceProjectId?: string; + snowFlakeId: string; + workPost?: string; + sex: BaseEnum +} diff --git a/collect_information/types/subPages/projectManager/securityUserForm/index.ts b/collect_information/types/subPages/projectManager/securityUserForm/index.ts new file mode 100644 index 0000000..e02bb69 --- /dev/null +++ b/collect_information/types/subPages/projectManager/securityUserForm/index.ts @@ -0,0 +1,15 @@ +export interface SecurityUserFormParams { + snowFlakeId?: string; + securityUnitId: string; + serviceProjectId: string; + name?: string; + workPost?: string; + telephone?: string; + sex: number; + nativePlace?: string; + idCard: string; + dateOfBirth?: Date | null; + securityNumber?: string; + remark?: string; + homeAddress?: string +} 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/.env.development b/policeManagement/.env.development new file mode 100644 index 0000000..09fc9f3 --- /dev/null +++ b/policeManagement/.env.development @@ -0,0 +1,13 @@ +VITE_APP_NAME=超级后台 +VITE_APP_ENV=development +VITE_APP_PORT=1000 +VITE_DROP_CONSOLE=false + +# axios +VITE_APP_BASE_API=/api +# VITE_APP_PROXY_URL=http://localhost:8765 +VITE_APP_PROXY_URL=http://172.10.10.93:8765 +# + +# rsa 公钥 +VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJps/EXxxSpEM1Ix4R0NWIOBciHCr7P7coDT8tNKfelgR7txcJOqHCO/MIWe7T04aHQTcpQxqx9hMca7dbqz8TZpz9jvLzE/6ZonVKxHsoFnNlHMp1/CPAJ9f6D9wYicum2KltJkmQ0g//D9W2zPCYoGOmSRFcZx/KEBa4EM53jQIDAQAB diff --git a/policeManagement/.env.production b/policeManagement/.env.production new file mode 100644 index 0000000..d7a7d29 --- /dev/null +++ b/policeManagement/.env.production @@ -0,0 +1,10 @@ +VITE_APP_NAME=超级后台 +VITE_APP_ENV=production +VITE_APP_PORT=1001 +VITE_DROP_CONSOLE=true + +# axios +VITE_APP_BASE_API=/api +VITE_APP_PROXY_URL=http://172.10.10.93:8765 +# rsa 公钥 +VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpu1C3JHZ+Ng/eVVCZtwKsOZv9RktpAL13pKy4FoRHyNv2t8TPV2AMzLzfEzlWx001nBxyVxEMR2N9jAcqFLHv7r16ciOzbtzB9dky2G+bc9jIs4/EdVK5bAZcPRh5Jrb78sC9PHyR4AeceDyCIKHLUbWBJB4NTZE0s1Wh5kMynQIDAQAB \ No newline at end of file diff --git a/policeManagement/.gitignore b/policeManagement/.gitignore new file mode 100644 index 0000000..bb4e3e5 --- /dev/null +++ b/policeManagement/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +policeManagement +package-lock.json +dist-ssr +*.local + +# Editor directories and files +.vscode/* +.vscode +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/policeManagement/README.md b/policeManagement/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/policeManagement/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + Vite + Vue + TS + + +
+ + + diff --git a/policeManagement/package-lock.json b/policeManagement/package-lock.json new file mode 100644 index 0000000..14ee8a0 --- /dev/null +++ b/policeManagement/package-lock.json @@ -0,0 +1,3953 @@ +{ + "name": "supermanagement", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "supermanagement", + "version": "1.0.0", + "dependencies": { + "ant-design-vue": "^4.2.3", + "axios": "^1.7.5", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "pinia": "^2.2.2", + "pinia-plugin-persistedstate": "^3.2.0", + "sass": "^1.77.8", + "vue": "^3.4.37", + "vue-component-type-helpers": "^2.1.2", + "vue-router": "4", + "vue-uuid": "^3.0.0" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.5.1", + "@vitejs/plugin-vue": "^5.1.2", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.10", + "terser": "^5.36.0", + "typescript": "^5.5.3", + "unplugin-vue-components": "^0.27.4", + "vite": "^5.4.1", + "vue-tsc": "^2.0.29" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz", + "integrity": "sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz", + "integrity": "sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz", + "integrity": "sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz", + "integrity": "sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz", + "integrity": "sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz", + "integrity": "sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz", + "integrity": "sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz", + "integrity": "sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz", + "integrity": "sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz", + "integrity": "sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz", + "integrity": "sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz", + "integrity": "sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz", + "integrity": "sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz", + "integrity": "sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz", + "integrity": "sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz", + "integrity": "sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", + "dev": true + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.3.tgz", + "integrity": "sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.0.1.tgz", + "integrity": "sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7", + "@vue/babel-plugin-jsx": "^1.2.2" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.2.tgz", + "integrity": "sha512-sONt5RLvLL1SlBdhyUSthZzuKePbJ7DwFFB9zT0eyWpDl+v7GXGh/RkPxxWaR22bIhYtTzp4Ka1MWatl/53Riw==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.4.2" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.2.tgz", + "integrity": "sha512-qiGfGgeZ5DEarPX3S+HcFktFCjfDrFPCXKeXNbrlB7v8cvtPRm8YVwoXOdGG1NhaL5rMlv5BZPVQyu4EdWWIvA==", + "dev": true + }, + "node_modules/@volar/typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha512-m2uZduhaHO1SZuagi30OsjI/X1gwkaEAC+9wT/nCNAtJ5FqXEkKvUncHmffG7ESDZPlFFUBK4vJ0D9Hfr+f2EA==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.4.2", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz", + "integrity": "sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz", + "integrity": "sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "~7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "@vue/babel-helper-vue-transform-on": "1.2.2", + "@vue/babel-plugin-resolve-type": "1.2.2", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz", + "integrity": "sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/helper-module-imports": "~7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/parser": "^7.23.9", + "@vue/compiler-sfc": "^3.4.15" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.3.tgz", + "integrity": "sha512-adAfy9boPkP233NTyvLbGEqVuIfK/R0ZsBsIOW4BZNfb4BRpRW41Do1u+ozJpsb+mdoy80O20IzAsHaihRb5qA==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.3", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.3.tgz", + "integrity": "sha512-wnzFArg9zpvk/811CDOZOadJRugf1Bgl/TQ3RfV4nKfSPok4hi0w10ziYUQR6LnnBAUlEXYLUfZ71Oj9ds/+QA==", + "dependencies": { + "@vue/compiler-core": "3.5.3", + "@vue/shared": "3.5.3" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.3.tgz", + "integrity": "sha512-P3uATLny2tfyvMB04OQFe7Sczteno7SLFxwrOA/dw01pBWQHB5HL15a8PosoNX2aG/EAMGqnXTu+1LnmzFhpTQ==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.3", + "@vue/compiler-dom": "3.5.3", + "@vue/compiler-ssr": "3.5.3", + "@vue/shared": "3.5.3", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.44", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.3.tgz", + "integrity": "sha512-F/5f+r2WzL/2YAPl7UlKcJWHrvoZN8XwEBLnT7S4BXwncH25iDOabhO2M2DWioyTguJAGavDOawejkFXj8EM1w==", + "dependencies": { + "@vue/compiler-dom": "3.5.3", + "@vue/shared": "3.5.3" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" + }, + "node_modules/@vue/language-core": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.6.tgz", + "integrity": "sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==", + "dev": true, + "dependencies": { + "@volar/language-core": "~2.4.1", + "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.3.tgz", + "integrity": "sha512-2w61UnRWTP7+rj1H/j6FH706gRBHdFVpIqEkSDAyIpafBXYH8xt4gttstbbCWdU3OlcSWO8/3mbKl/93/HSMpw==", + "dependencies": { + "@vue/shared": "3.5.3" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.3.tgz", + "integrity": "sha512-5b2AQw5OZlmCzSsSBWYoZOsy75N4UdMWenTfDdI5bAzXnuVR7iR8Q4AOzQm2OGoA41xjk53VQKrqQhOz2ktWaw==", + "dependencies": { + "@vue/reactivity": "3.5.3", + "@vue/shared": "3.5.3" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.3.tgz", + "integrity": "sha512-wPR1DEGc3XnQ7yHbmkTt3GoY0cEnVGQnARRdAkDzZ8MbUKEs26gogCQo6AOvvgahfjIcnvWJzkZArQ1fmWjcSg==", + "dependencies": { + "@vue/reactivity": "3.5.3", + "@vue/runtime-core": "3.5.3", + "@vue/shared": "3.5.3", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.3.tgz", + "integrity": "sha512-28volmaZVG2PGO3V3+gBPKoSHvLlE8FGfG/GKXKkjjfxLuj/50B/0OQGakM/g6ehQeqCrZYM4eHC4Ks48eig1Q==", + "dependencies": { + "@vue/compiler-ssr": "3.5.3", + "@vue/shared": "3.5.3" + }, + "peerDependencies": { + "vue": "3.5.3" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.3.tgz", + "integrity": "sha512-Jp2v8nylKBT+PlOUjun2Wp/f++TfJVFjshLzNtJDdmFJabJa7noGMncqXRM1vXGX+Yo2V7WykQFNxusSim8SCA==" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ant-design-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.2.3.tgz", + "integrity": "sha512-kqGyWvZtFlSInFP93Ow6wS8LzEsxxUgpI+ZY5jQQkuX8WAcqdwXCA7IcHMpECW6JB89DZMo2Bw85jUg2SjlgQA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001658", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", + "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz", + "integrity": "sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsencrypt": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.3.2.tgz", + "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dev": true, + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.2.tgz", + "integrity": "sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.2.3.tgz", + "integrity": "sha512-Cm819WBj/s5K5DGw55EwbXDtx+EZzM0YR5AZbq9XE3u0xvXwvX2JnWoFpWIcdzISBHqy9H1UiSIUmXyXqWsQRQ==", + "peerDependencies": { + "pinia": "^2.0.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz", + "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.1", + "pathe": "^1.1.2" + } + }, + "node_modules/postcss": { + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.2.tgz", + "integrity": "sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.2", + "@rollup/rollup-android-arm64": "4.21.2", + "@rollup/rollup-darwin-arm64": "4.21.2", + "@rollup/rollup-darwin-x64": "4.21.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.2", + "@rollup/rollup-linux-arm-musleabihf": "4.21.2", + "@rollup/rollup-linux-arm64-gnu": "4.21.2", + "@rollup/rollup-linux-arm64-musl": "4.21.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.2", + "@rollup/rollup-linux-riscv64-gnu": "4.21.2", + "@rollup/rollup-linux-s390x-gnu": "4.21.2", + "@rollup/rollup-linux-x64-gnu": "4.21.2", + "@rollup/rollup-linux-x64-musl": "4.21.2", + "@rollup/rollup-win32-arm64-msvc": "4.21.2", + "@rollup/rollup-win32-ia32-msvc": "4.21.2", + "@rollup/rollup-win32-x64-msvc": "4.21.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz", + "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.4.tgz", + "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz", + "integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unplugin": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.13.1.tgz", + "integrity": "sha512-6Kq1iSSwg7KyjcThRUks9LuqDAKvtnioxbL9iEtB9ctTyBA5OmrB8gZd/d225VJu1w3UpUsKV7eGrvf59J7+VA==", + "dev": true, + "dependencies": { + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.27.4.tgz", + "integrity": "sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.0", + "chokidar": "^3.6.0", + "debug": "^4.3.6", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.11", + "minimatch": "^9.0.5", + "mlly": "^1.7.1", + "unplugin": "^1.12.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz", + "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.3.tgz", + "integrity": "sha512-xvRbd0HpuLovYbOHXRHlSBsSvmUJbo0pzbkKTApWnQGf3/cu5Z39mQeA5cZdLRVIoNf3zI6MSoOgHUT5i2jO+Q==", + "dependencies": { + "@vue/compiler-dom": "3.5.3", + "@vue/compiler-sfc": "3.5.3", + "@vue/runtime-dom": "3.5.3", + "@vue/server-renderer": "3.5.3", + "@vue/shared": "3.5.3" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.1.6.tgz", + "integrity": "sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==" + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz", + "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==", + "dependencies": { + "@vue/devtools-api": "^6.6.3" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.6.tgz", + "integrity": "sha512-f98dyZp5FOukcYmbFpuSCJ4Z0vHSOSmxGttZJCsFeX0M4w/Rsq0s4uKXjcSRsZqsRgQa6z7SfuO+y0HVICE57Q==", + "dev": true, + "dependencies": { + "@volar/typescript": "~2.4.1", + "@vue/language-core": "2.1.6", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vue-tsc/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-uuid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue-uuid/-/vue-uuid-3.0.0.tgz", + "integrity": "sha512-+5DP857xVmTHYd00dMC1c1gVg/nxG6+K4Lepojv9ckHt8w0fDpGc5gQCCttS9D+AkSkTJgb0cekidKjTWu5OQQ==", + "dependencies": { + "@types/uuid": "^8.3.4", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "vue": ">= 3.0.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/policeManagement/package.json b/policeManagement/package.json new file mode 100644 index 0000000..34b3803 --- /dev/null +++ b/policeManagement/package.json @@ -0,0 +1,39 @@ +{ + "name": "supermanagement", + "appName": "超级后台", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build --mode production", + "preview": "vite preview" + }, + "dependencies": { + "ant-design-vue": "^4.2.3", + "axios": "^1.7.5", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "pinia": "^2.2.2", + "pinia-plugin-persistedstate": "^3.2.0", + "sass": "^1.77.8", + "vue": "^3.4.37", + "vue-component-type-helpers": "^2.1.2", + "vue-router": "4", + "vue-uuid": "^3.0.0" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.5.1", + "@vitejs/plugin-vue": "^5.1.2", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.10", + "terser": "^5.36.0", + "typescript": "^5.5.3", + "unplugin-vue-components": "^0.27.4", + "vite": "^5.4.1", + "vue-tsc": "^2.0.29" + } +} diff --git a/policeManagement/postcss.config.js b/policeManagement/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/policeManagement/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/policeManagement/public/vite.svg b/policeManagement/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/policeManagement/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/policeManagement/src/App.vue b/policeManagement/src/App.vue new file mode 100644 index 0000000..86691d8 --- /dev/null +++ b/policeManagement/src/App.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/policeManagement/src/assets/iconfont/demo.css b/policeManagement/src/assets/iconfont/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/policeManagement/src/assets/iconfont/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/policeManagement/src/assets/iconfont/demo_index.html b/policeManagement/src/assets/iconfont/demo_index.html new file mode 100644 index 0000000..c8a01b0 --- /dev/null +++ b/policeManagement/src/assets/iconfont/demo_index.html @@ -0,0 +1,2396 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    大小齿轮
    +
    &#xe6d0;
    +
  • + +
  • + +
    全屏
    +
    &#xe67d;
    +
  • + +
  • + +
    搜索
    +
    &#xe628;
    +
  • + +
  • + +
    消息通知
    +
    &#xeaf8;
    +
  • + +
  • + +
    退出全屏
    +
    &#xe6db;
    +
  • + +
  • + +
    添加
    +
    &#xe695;
    +
  • + +
  • + 𐄗 +
    编辑
    +
    &#x10117;
    +
  • + +
  • + +
    grid
    +
    &#xe8e4;
    +
  • + +
  • + +
    ic_batch
    +
    &#xe739;
    +
  • + +
  • + +
    删除
    +
    &#xfcb6;
    +
  • + +
  • + +
    其他
    +
    &#xe602;
    +
  • + +
  • + +
    全部
    +
    &#xe745;
    +
  • + +
  • + +
    音频
    +
    &#xe603;
    +
  • + +
  • + +
    文档
    +
    &#xe60e;
    +
  • + +
  • + +
    图片
    +
    &#xe606;
    +
  • + +
  • + +
    视频
    +
    &#xfb3c;
    +
  • + +
  • + +
    041_文档
    +
    &#xe6da;
    +
  • + +
  • + +
    关联保安
    +
    &#xe600;
    +
  • + +
  • + +
    保安消防
    +
    &#xe613;
    +
  • + +
  • + +
    右箭头
    +
    &#xe60c;
    +
  • + +
  • + +
    左箭头
    +
    &#xe60d;
    +
  • + +
  • + +
    铃铛
    +
    &#xe649;
    +
  • + +
  • + +
    文件夹
    +
    &#xe662;
    +
  • + +
  • + +
    菜单
    +
    &#xe626;
    +
  • + +
  • + +
    按钮
    +
    &#xe669;
    +
  • + +
  • + +
    资产管理
    +
    &#xe62e;
    +
  • + +
  • + +
    解除固定,图钉
    +
    &#xe9b9;
    +
  • + +
  • + +
    文字大小2
    +
    &#xe854;
    +
  • + +
  • + +
    转移03
    +
    &#xea34;
    +
  • + +
  • + +
    wxb品牌宝
    +
    &#xe620;
    +
  • + +
  • + +
    产品库
    +
    &#xe65f;
    +
  • + +
  • + +
    供应商支付
    +
    &#xe618;
    +
  • + +
  • + +
    KHCFDC_客户
    +
    &#xe6d2;
    +
  • + +
  • + +
    进销存
    +
    &#xe61f;
    +
  • + +
  • + +
    项目管理
    +
    &#xe609;
    +
  • + +
  • + +
    exe
    +
    &#xe63a;
    +
  • + +
  • + +
    mp4
    +
    &#xe639;
    +
  • + +
  • + +
    主图视频
    +
    &#xe612;
    +
  • + +
  • + +
    未知文件
    +
    &#xe61a;
    +
  • + +
  • + +
    Jpg
    +
    &#xe731;
    +
  • + +
  • + +
    Pdf
    +
    &#xe733;
    +
  • + +
  • + +
    svg图标
    +
    &#xe650;
    +
  • + +
  • + +
    doc
    +
    &#xe735;
    +
  • + +
  • + +
    gif
    +
    &#xe6a4;
    +
  • + +
  • + +
    JPEG
    +
    &#xe66d;
    +
  • + +
  • + +
    DOCX
    +
    &#xe672;
    +
  • + +
  • + +
    XLS
    +
    &#xe673;
    +
  • + +
  • + +
    XLSX
    +
    &#xe674;
    +
  • + +
  • + +
    PNG
    +
    &#xe69f;
    +
  • + +
  • + +
    上传文件
    +
    &#xe652;
    +
  • + +
  • + +
    24gl-folderPlus
    +
    &#xeabe;
    +
  • + +
  • + +
    019删除文件
    +
    &#xe7e5;
    +
  • + +
  • + +
    下载文件
    +
    &#xe615;
    +
  • + +
  • + +
    私人文件夹
    +
    &#xe680;
    +
  • + +
  • + +
    事件查询-壹米滴答-01
    +
    &#xe64d;
    +
  • + +
  • + +
    文件
    +
    &#xe62b;
    +
  • + +
  • + +
    系统
    +
    &#xe67c;
    +
  • + +
  • + +
    单位
    +
    &#xe611;
    +
  • + +
  • + +
    警察半身,公安
    +
    &#xe8f1;
    +
  • + +
  • + +
    mysql
    +
    &#xe667;
    +
  • + +
  • + +
    RabbitMQ
    +
    &#xe6a0;
    +
  • + +
  • + +
    断路器
    +
    &#xe60a;
    +
  • + +
  • + +
    白名单
    +
    &#xe643;
    +
  • + +
  • + +
    VPN网关
    +
    &#xe7da;
    +
  • + +
  • + +
    开发者中心
    +
    &#xe70f;
    +
  • + +
  • + +
    控制台
    +
    &#xe651;
    +
  • + +
  • + +
    百度
    +
    &#xe8cb;
    +
  • + +
  • + +
    外部链接
    +
    &#xe858;
    +
  • + +
  • + +
    字典管理
    +
    &#xe625;
    +
  • + +
  • + +
    数据开发—脚本开发
    +
    &#xe65c;
    +
  • + +
  • + +
    产品
    +
    &#xe64f;
    +
  • + +
  • + +
    销售
    +
    &#xe624;
    +
  • + +
  • + +
    测试
    +
    &#xe853;
    +
  • + +
  • + +
    专属经理
    +
    &#xe883;
    +
  • + +
  • + +
    公司
    +
    &#xe679;
    +
  • + +
  • + +
    系统权限
    +
    &#xe61e;
    +
  • + +
  • + +
    日志
    +
    &#xe647;
    +
  • + +
  • + +
    用户管理
    +
    &#xe62d;
    +
  • + +
  • + +
    定时任务
    +
    &#xe6a3;
    +
  • + +
  • + +
    dashboard
    +
    &#xe78b;
    +
  • + +
  • + +
    菜单
    +
    &#xe65d;
    +
  • + +
  • + +
    部门管理
    +
    &#xe61d;
    +
  • + +
  • + +
    角色管理
    +
    &#xe621;
    +
  • + +
  • + +
    系统
    +
    &#xe601;
    +
  • + +
  • + +
    204首页
    +
    &#xe8b9;
    +
  • + +
  • + +
    关于
    +
    &#xe623;
    +
  • + +
  • + +
    DVLINK_大屏
    +
    &#xe627;
    +
  • + +
  • + +
    weixin
    +
    &#xe656;
    +
  • + +
  • + +
    QQ
    +
    &#xe882;
    +
  • + +
  • + +
    content-right
    +
    &#xe67a;
    +
  • + +
  • + +
    主题
    +
    &#xe610;
    +
  • + +
  • + +
    sousuo
    +
    &#xe68a;
    +
  • + +
  • + +
    消息中心
    +
    &#xe8be;
    +
  • + +
  • + +
    中英文
    +
    &#xe605;
    +
  • + +
  • + +
    放大
    +
    &#xe622;
    +
  • + +
  • + +
    全屏缩小
    +
    &#xe62a;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1723194854588') format('woff2'),
+       url('iconfont.woff?t=1723194854588') format('woff'),
+       url('iconfont.ttf?t=1723194854588') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 大小齿轮 +
    +
    .icon-daxiaochilun +
    +
  • + +
  • + +
    + 全屏 +
    +
    .icon-quanping +
    +
  • + +
  • + +
    + 搜索 +
    +
    .icon-sousuo1 +
    +
  • + +
  • + +
    + 消息通知 +
    +
    .icon-xiaoxitongzhi +
    +
  • + +
  • + +
    + 退出全屏 +
    +
    .icon-tuichuquanping +
    +
  • + +
  • + +
    + 添加 +
    +
    .icon-tianjia +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-bianji1 +
    +
  • + +
  • + +
    + grid +
    +
    .icon-grid +
    +
  • + +
  • + +
    + ic_batch +
    +
    .icon-ic_batch +
    +
  • + +
  • + +
    + 删除 +
    +
    .icon-shanchu +
    +
  • + +
  • + +
    + 其他 +
    +
    .icon-qita1 +
    +
  • + +
  • + +
    + 全部 +
    +
    .icon-quanbu +
    +
  • + +
  • + +
    + 音频 +
    +
    .icon-yinpin +
    +
  • + +
  • + +
    + 文档 +
    +
    .icon-wendang +
    +
  • + +
  • + +
    + 图片 +
    +
    .icon-tupian +
    +
  • + +
  • + +
    + 视频 +
    +
    .icon-shipin +
    +
  • + +
  • + +
    + 041_文档 +
    +
    .icon-a-041_wendang +
    +
  • + +
  • + +
    + 关联保安 +
    +
    .icon-guanlianbaoan +
    +
  • + +
  • + +
    + 保安消防 +
    +
    .icon-baoanxiaofang +
    +
  • + +
  • + +
    + 右箭头 +
    +
    .icon-youjiantou +
    +
  • + +
  • + +
    + 左箭头 +
    +
    .icon-zuojiantou +
    +
  • + +
  • + +
    + 铃铛 +
    +
    .icon-lingdang +
    +
  • + +
  • + +
    + 文件夹 +
    +
    .icon-wenjianjia +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-caidan1 +
    +
  • + +
  • + +
    + 按钮 +
    +
    .icon-a-ziyuan4 +
    +
  • + +
  • + +
    + 资产管理 +
    +
    .icon-zichanguanli +
    +
  • + +
  • + +
    + 解除固定,图钉 +
    +
    .icon-fix +
    +
  • + +
  • + +
    + 文字大小2 +
    +
    .icon-wenzidaxiao2 +
    +
  • + +
  • + +
    + 转移03 +
    +
    .icon-zhuanyi03 +
    +
  • + +
  • + +
    + wxb品牌宝 +
    +
    .icon-wxbpinpaibao +
    +
  • + +
  • + +
    + 产品库 +
    +
    .icon-chanpinku +
    +
  • + +
  • + +
    + 供应商支付 +
    +
    .icon-gongyingshangzhifu +
    +
  • + +
  • + +
    + KHCFDC_客户 +
    +
    .icon-kehu +
    +
  • + +
  • + +
    + 进销存 +
    +
    .icon-jinxiaocun +
    +
  • + +
  • + +
    + 项目管理 +
    +
    .icon-xiangmuguanli- +
    +
  • + +
  • + +
    + exe +
    +
    .icon-exe +
    +
  • + +
  • + +
    + mp4 +
    +
    .icon-mp4 +
    +
  • + +
  • + +
    + 主图视频 +
    +
    .icon-zhutushipin +
    +
  • + +
  • + +
    + 未知文件 +
    +
    .icon-weizhiwenjian +
    +
  • + +
  • + +
    + Jpg +
    +
    .icon-Jpg +
    +
  • + +
  • + +
    + Pdf +
    +
    .icon-Pdf +
    +
  • + +
  • + +
    + svg图标 +
    +
    .icon-svgtubiao +
    +
  • + +
  • + +
    + doc +
    +
    .icon-doc +
    +
  • + +
  • + +
    + gif +
    +
    .icon-gif +
    +
  • + +
  • + +
    + JPEG +
    +
    .icon-JPEG +
    +
  • + +
  • + +
    + DOCX +
    +
    .icon-DOCX +
    +
  • + +
  • + +
    + XLS +
    +
    .icon-XLS +
    +
  • + +
  • + +
    + XLSX +
    +
    .icon-XLSX +
    +
  • + +
  • + +
    + PNG +
    +
    .icon-PNG +
    +
  • + +
  • + +
    + 上传文件 +
    +
    .icon-shangchuanwenjian +
    +
  • + +
  • + +
    + 24gl-folderPlus +
    +
    .icon-24gl-folderPlus +
    +
  • + +
  • + +
    + 019删除文件 +
    +
    .icon-019shanchuwenjian +
    +
  • + +
  • + +
    + 下载文件 +
    +
    .icon-xiazaiwenjian +
    +
  • + +
  • + +
    + 私人文件夹 +
    +
    .icon-3333 +
    +
  • + +
  • + +
    + 事件查询-壹米滴答-01 +
    +
    .icon-shijianchaxun-yimidida- +
    +
  • + +
  • + +
    + 文件 +
    +
    .icon-wenjian +
    +
  • + +
  • + +
    + 系统 +
    +
    .icon-xitong1 +
    +
  • + +
  • + +
    + 单位 +
    +
    .icon-danwei +
    +
  • + +
  • + +
    + 警察半身,公安 +
    +
    .icon-policeman-full +
    +
  • + +
  • + +
    + mysql +
    +
    .icon-mysql +
    +
  • + +
  • + +
    + RabbitMQ +
    +
    .icon-RabbitMQ +
    +
  • + +
  • + +
    + 断路器 +
    +
    .icon-duanluqi +
    +
  • + +
  • + +
    + 白名单 +
    +
    .icon-baimingdan +
    +
  • + +
  • + +
    + VPN网关 +
    +
    .icon-VPNwangguan +
    +
  • + +
  • + +
    + 开发者中心 +
    +
    .icon-kaifazhezhongxin +
    +
  • + +
  • + +
    + 控制台 +
    +
    .icon-kongzhitai +
    +
  • + +
  • + +
    + 百度 +
    +
    .icon-baidu +
    +
  • + +
  • + +
    + 外部链接 +
    +
    .icon-waibulianjie +
    +
  • + +
  • + +
    + 字典管理 +
    +
    .icon-zidianguanli +
    +
  • + +
  • + +
    + 数据开发—脚本开发 +
    +
    .icon-shujukaifajiaobenkaifa +
    +
  • + +
  • + +
    + 产品 +
    +
    .icon-chanpin +
    +
  • + +
  • + +
    + 销售 +
    +
    .icon-xiaoshou +
    +
  • + +
  • + +
    + 测试 +
    +
    .icon-ceshi +
    +
  • + +
  • + +
    + 专属经理 +
    +
    .icon-zhuanshujingli +
    +
  • + +
  • + +
    + 公司 +
    +
    .icon-gongsi +
    +
  • + +
  • + +
    + 系统权限 +
    +
    .icon-xitongquanxian +
    +
  • + +
  • + +
    + 日志 +
    +
    .icon-rizhi +
    +
  • + +
  • + +
    + 用户管理 +
    +
    .icon-yonghuguanli_huaban +
    +
  • + +
  • + +
    + 定时任务 +
    +
    .icon-dingshirenwu +
    +
  • + +
  • + +
    + dashboard +
    +
    .icon-dashboard +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-caidan +
    +
  • + +
  • + +
    + 部门管理 +
    +
    .icon-bumenguanli +
    +
  • + +
  • + +
    + 角色管理 +
    +
    .icon-jiaoseguanli +
    +
  • + +
  • + +
    + 系统 +
    +
    .icon-xitong +
    +
  • + +
  • + +
    + 204首页 +
    +
    .icon-shouye +
    +
  • + +
  • + +
    + 关于 +
    +
    .icon-guanyu +
    +
  • + +
  • + +
    + DVLINK_大屏 +
    +
    .icon-DVLINK_daping +
    +
  • + +
  • + +
    + weixin +
    +
    .icon-weixin +
    +
  • + +
  • + +
    + QQ +
    +
    .icon-QQ +
    +
  • + +
  • + +
    + content-right +
    +
    .icon-contentright +
    +
  • + +
  • + +
    + 主题 +
    +
    .icon-zhuti +
    +
  • + +
  • + +
    + sousuo +
    +
    .icon-sousuo +
    +
  • + +
  • + +
    + 消息中心 +
    +
    .icon-xiaoxi +
    +
  • + +
  • + +
    + 中英文 +
    +
    .icon-zhongyingwen +
    +
  • + +
  • + +
    + 放大 +
    +
    .icon-fangda +
    +
  • + +
  • + +
    + 全屏缩小 +
    +
    .icon-suoxiao +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    大小齿轮
    +
    #icon-daxiaochilun
    +
  • + +
  • + +
    全屏
    +
    #icon-quanping
    +
  • + +
  • + +
    搜索
    +
    #icon-sousuo1
    +
  • + +
  • + +
    消息通知
    +
    #icon-xiaoxitongzhi
    +
  • + +
  • + +
    退出全屏
    +
    #icon-tuichuquanping
    +
  • + +
  • + +
    添加
    +
    #icon-tianjia
    +
  • + +
  • + +
    编辑
    +
    #icon-bianji1
    +
  • + +
  • + +
    grid
    +
    #icon-grid
    +
  • + +
  • + +
    ic_batch
    +
    #icon-ic_batch
    +
  • + +
  • + +
    删除
    +
    #icon-shanchu
    +
  • + +
  • + +
    其他
    +
    #icon-qita1
    +
  • + +
  • + +
    全部
    +
    #icon-quanbu
    +
  • + +
  • + +
    音频
    +
    #icon-yinpin
    +
  • + +
  • + +
    文档
    +
    #icon-wendang
    +
  • + +
  • + +
    图片
    +
    #icon-tupian
    +
  • + +
  • + +
    视频
    +
    #icon-shipin
    +
  • + +
  • + +
    041_文档
    +
    #icon-a-041_wendang
    +
  • + +
  • + +
    关联保安
    +
    #icon-guanlianbaoan
    +
  • + +
  • + +
    保安消防
    +
    #icon-baoanxiaofang
    +
  • + +
  • + +
    右箭头
    +
    #icon-youjiantou
    +
  • + +
  • + +
    左箭头
    +
    #icon-zuojiantou
    +
  • + +
  • + +
    铃铛
    +
    #icon-lingdang
    +
  • + +
  • + +
    文件夹
    +
    #icon-wenjianjia
    +
  • + +
  • + +
    菜单
    +
    #icon-caidan1
    +
  • + +
  • + +
    按钮
    +
    #icon-a-ziyuan4
    +
  • + +
  • + +
    资产管理
    +
    #icon-zichanguanli
    +
  • + +
  • + +
    解除固定,图钉
    +
    #icon-fix
    +
  • + +
  • + +
    文字大小2
    +
    #icon-wenzidaxiao2
    +
  • + +
  • + +
    转移03
    +
    #icon-zhuanyi03
    +
  • + +
  • + +
    wxb品牌宝
    +
    #icon-wxbpinpaibao
    +
  • + +
  • + +
    产品库
    +
    #icon-chanpinku
    +
  • + +
  • + +
    供应商支付
    +
    #icon-gongyingshangzhifu
    +
  • + +
  • + +
    KHCFDC_客户
    +
    #icon-kehu
    +
  • + +
  • + +
    进销存
    +
    #icon-jinxiaocun
    +
  • + +
  • + +
    项目管理
    +
    #icon-xiangmuguanli-
    +
  • + +
  • + +
    exe
    +
    #icon-exe
    +
  • + +
  • + +
    mp4
    +
    #icon-mp4
    +
  • + +
  • + +
    主图视频
    +
    #icon-zhutushipin
    +
  • + +
  • + +
    未知文件
    +
    #icon-weizhiwenjian
    +
  • + +
  • + +
    Jpg
    +
    #icon-Jpg
    +
  • + +
  • + +
    Pdf
    +
    #icon-Pdf
    +
  • + +
  • + +
    svg图标
    +
    #icon-svgtubiao
    +
  • + +
  • + +
    doc
    +
    #icon-doc
    +
  • + +
  • + +
    gif
    +
    #icon-gif
    +
  • + +
  • + +
    JPEG
    +
    #icon-JPEG
    +
  • + +
  • + +
    DOCX
    +
    #icon-DOCX
    +
  • + +
  • + +
    XLS
    +
    #icon-XLS
    +
  • + +
  • + +
    XLSX
    +
    #icon-XLSX
    +
  • + +
  • + +
    PNG
    +
    #icon-PNG
    +
  • + +
  • + +
    上传文件
    +
    #icon-shangchuanwenjian
    +
  • + +
  • + +
    24gl-folderPlus
    +
    #icon-24gl-folderPlus
    +
  • + +
  • + +
    019删除文件
    +
    #icon-019shanchuwenjian
    +
  • + +
  • + +
    下载文件
    +
    #icon-xiazaiwenjian
    +
  • + +
  • + +
    私人文件夹
    +
    #icon-3333
    +
  • + +
  • + +
    事件查询-壹米滴答-01
    +
    #icon-shijianchaxun-yimidida-
    +
  • + +
  • + +
    文件
    +
    #icon-wenjian
    +
  • + +
  • + +
    系统
    +
    #icon-xitong1
    +
  • + +
  • + +
    单位
    +
    #icon-danwei
    +
  • + +
  • + +
    警察半身,公安
    +
    #icon-policeman-full
    +
  • + +
  • + +
    mysql
    +
    #icon-mysql
    +
  • + +
  • + +
    RabbitMQ
    +
    #icon-RabbitMQ
    +
  • + +
  • + +
    断路器
    +
    #icon-duanluqi
    +
  • + +
  • + +
    白名单
    +
    #icon-baimingdan
    +
  • + +
  • + +
    VPN网关
    +
    #icon-VPNwangguan
    +
  • + +
  • + +
    开发者中心
    +
    #icon-kaifazhezhongxin
    +
  • + +
  • + +
    控制台
    +
    #icon-kongzhitai
    +
  • + +
  • + +
    百度
    +
    #icon-baidu
    +
  • + +
  • + +
    外部链接
    +
    #icon-waibulianjie
    +
  • + +
  • + +
    字典管理
    +
    #icon-zidianguanli
    +
  • + +
  • + +
    数据开发—脚本开发
    +
    #icon-shujukaifajiaobenkaifa
    +
  • + +
  • + +
    产品
    +
    #icon-chanpin
    +
  • + +
  • + +
    销售
    +
    #icon-xiaoshou
    +
  • + +
  • + +
    测试
    +
    #icon-ceshi
    +
  • + +
  • + +
    专属经理
    +
    #icon-zhuanshujingli
    +
  • + +
  • + +
    公司
    +
    #icon-gongsi
    +
  • + +
  • + +
    系统权限
    +
    #icon-xitongquanxian
    +
  • + +
  • + +
    日志
    +
    #icon-rizhi
    +
  • + +
  • + +
    用户管理
    +
    #icon-yonghuguanli_huaban
    +
  • + +
  • + +
    定时任务
    +
    #icon-dingshirenwu
    +
  • + +
  • + +
    dashboard
    +
    #icon-dashboard
    +
  • + +
  • + +
    菜单
    +
    #icon-caidan
    +
  • + +
  • + +
    部门管理
    +
    #icon-bumenguanli
    +
  • + +
  • + +
    角色管理
    +
    #icon-jiaoseguanli
    +
  • + +
  • + +
    系统
    +
    #icon-xitong
    +
  • + +
  • + +
    204首页
    +
    #icon-shouye
    +
  • + +
  • + +
    关于
    +
    #icon-guanyu
    +
  • + +
  • + +
    DVLINK_大屏
    +
    #icon-DVLINK_daping
    +
  • + +
  • + +
    weixin
    +
    #icon-weixin
    +
  • + +
  • + +
    QQ
    +
    #icon-QQ
    +
  • + +
  • + +
    content-right
    +
    #icon-contentright
    +
  • + +
  • + +
    主题
    +
    #icon-zhuti
    +
  • + +
  • + +
    sousuo
    +
    #icon-sousuo
    +
  • + +
  • + +
    消息中心
    +
    #icon-xiaoxi
    +
  • + +
  • + +
    中英文
    +
    #icon-zhongyingwen
    +
  • + +
  • + +
    放大
    +
    #icon-fangda
    +
  • + +
  • + +
    全屏缩小
    +
    #icon-suoxiao
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/policeManagement/src/assets/iconfont/download.zip b/policeManagement/src/assets/iconfont/download.zip new file mode 100644 index 0000000..c6fadbe Binary files /dev/null and b/policeManagement/src/assets/iconfont/download.zip differ diff --git a/policeManagement/src/assets/iconfont/iconfont.css b/policeManagement/src/assets/iconfont/iconfont.css new file mode 100644 index 0000000..81a7063 --- /dev/null +++ b/policeManagement/src/assets/iconfont/iconfont.css @@ -0,0 +1,399 @@ +@font-face { + font-family: "iconfont"; /* Project id 4036849 */ + src: url('iconfont.woff2?t=1723194854588') format('woff2'), + url('iconfont.woff?t=1723194854588') format('woff'), + url('iconfont.ttf?t=1723194854588') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-daxiaochilun:before { + content: "\e6d0"; +} + +.icon-quanping:before { + content: "\e67d"; +} + +.icon-sousuo1:before { + content: "\e628"; +} + +.icon-xiaoxitongzhi:before { + content: "\eaf8"; +} + +.icon-tuichuquanping:before { + content: "\e6db"; +} + +.icon-tianjia:before { + content: "\e695"; +} + +.icon-bianji1:before { + content: "\10117"; +} + +.icon-grid:before { + content: "\e8e4"; +} + +.icon-ic_batch:before { + content: "\e739"; +} + +.icon-shanchu:before { + content: "\fcb6"; +} + +.icon-qita1:before { + content: "\e602"; +} + +.icon-quanbu:before { + content: "\e745"; +} + +.icon-yinpin:before { + content: "\e603"; +} + +.icon-wendang:before { + content: "\e60e"; +} + +.icon-tupian:before { + content: "\e606"; +} + +.icon-shipin:before { + content: "\fb3c"; +} + +.icon-a-041_wendang:before { + content: "\e6da"; +} + +.icon-guanlianbaoan:before { + content: "\e600"; +} + +.icon-baoanxiaofang:before { + content: "\e613"; +} + +.icon-youjiantou:before { + content: "\e60c"; +} + +.icon-zuojiantou:before { + content: "\e60d"; +} + +.icon-lingdang:before { + content: "\e649"; +} + +.icon-wenjianjia:before { + content: "\e662"; +} + +.icon-caidan1:before { + content: "\e626"; +} + +.icon-a-ziyuan4:before { + content: "\e669"; +} + +.icon-zichanguanli:before { + content: "\e62e"; +} + +.icon-fix:before { + content: "\e9b9"; +} + +.icon-wenzidaxiao2:before { + content: "\e854"; +} + +.icon-zhuanyi03:before { + content: "\ea34"; +} + +.icon-wxbpinpaibao:before { + content: "\e620"; +} + +.icon-chanpinku:before { + content: "\e65f"; +} + +.icon-gongyingshangzhifu:before { + content: "\e618"; +} + +.icon-kehu:before { + content: "\e6d2"; +} + +.icon-jinxiaocun:before { + content: "\e61f"; +} + +.icon-xiangmuguanli-:before { + content: "\e609"; +} + +.icon-exe:before { + content: "\e63a"; +} + +.icon-mp4:before { + content: "\e639"; +} + +.icon-zhutushipin:before { + content: "\e612"; +} + +.icon-weizhiwenjian:before { + content: "\e61a"; +} + +.icon-Jpg:before { + content: "\e731"; +} + +.icon-Pdf:before { + content: "\e733"; +} + +.icon-svgtubiao:before { + content: "\e650"; +} + +.icon-doc:before { + content: "\e735"; +} + +.icon-gif:before { + content: "\e6a4"; +} + +.icon-JPEG:before { + content: "\e66d"; +} + +.icon-DOCX:before { + content: "\e672"; +} + +.icon-XLS:before { + content: "\e673"; +} + +.icon-XLSX:before { + content: "\e674"; +} + +.icon-PNG:before { + content: "\e69f"; +} + +.icon-shangchuanwenjian:before { + content: "\e652"; +} + +.icon-24gl-folderPlus:before { + content: "\eabe"; +} + +.icon-019shanchuwenjian:before { + content: "\e7e5"; +} + +.icon-xiazaiwenjian:before { + content: "\e615"; +} + +.icon-3333:before { + content: "\e680"; +} + +.icon-shijianchaxun-yimidida-:before { + content: "\e64d"; +} + +.icon-wenjian:before { + content: "\e62b"; +} + +.icon-xitong1:before { + content: "\e67c"; +} + +.icon-danwei:before { + content: "\e611"; +} + +.icon-policeman-full:before { + content: "\e8f1"; +} + +.icon-mysql:before { + content: "\e667"; +} + +.icon-RabbitMQ:before { + content: "\e6a0"; +} + +.icon-duanluqi:before { + content: "\e60a"; +} + +.icon-baimingdan:before { + content: "\e643"; +} + +.icon-VPNwangguan:before { + content: "\e7da"; +} + +.icon-kaifazhezhongxin:before { + content: "\e70f"; +} + +.icon-kongzhitai:before { + content: "\e651"; +} + +.icon-baidu:before { + content: "\e8cb"; +} + +.icon-waibulianjie:before { + content: "\e858"; +} + +.icon-zidianguanli:before { + content: "\e625"; +} + +.icon-shujukaifajiaobenkaifa:before { + content: "\e65c"; +} + +.icon-chanpin:before { + content: "\e64f"; +} + +.icon-xiaoshou:before { + content: "\e624"; +} + +.icon-ceshi:before { + content: "\e853"; +} + +.icon-zhuanshujingli:before { + content: "\e883"; +} + +.icon-gongsi:before { + content: "\e679"; +} + +.icon-xitongquanxian:before { + content: "\e61e"; +} + +.icon-rizhi:before { + content: "\e647"; +} + +.icon-yonghuguanli_huaban:before { + content: "\e62d"; +} + +.icon-dingshirenwu:before { + content: "\e6a3"; +} + +.icon-dashboard:before { + content: "\e78b"; +} + +.icon-caidan:before { + content: "\e65d"; +} + +.icon-bumenguanli:before { + content: "\e61d"; +} + +.icon-jiaoseguanli:before { + content: "\e621"; +} + +.icon-xitong:before { + content: "\e601"; +} + +.icon-shouye:before { + content: "\e8b9"; +} + +.icon-guanyu:before { + content: "\e623"; +} + +.icon-DVLINK_daping:before { + content: "\e627"; +} + +.icon-weixin:before { + content: "\e656"; +} + +.icon-QQ:before { + content: "\e882"; +} + +.icon-contentright:before { + content: "\e67a"; +} + +.icon-zhuti:before { + content: "\e610"; +} + +.icon-sousuo:before { + content: "\e68a"; +} + +.icon-xiaoxi:before { + content: "\e8be"; +} + +.icon-zhongyingwen:before { + content: "\e605"; +} + +.icon-fangda:before { + content: "\e622"; +} + +.icon-suoxiao:before { + content: "\e62a"; +} + diff --git a/policeManagement/src/assets/iconfont/iconfont.js b/policeManagement/src/assets/iconfont/iconfont.js new file mode 100644 index 0000000..0e9170f --- /dev/null +++ b/policeManagement/src/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4036849='',function(h){var c=(c=document.getElementsByTagName("script"))[c.length-1],l=c.getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,i,t,v,z,o=function(c,l){l.parentNode.insertBefore(c,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4036849,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?o(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),a()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(t=a,v=h.document,z=!1,s(),v.onreadystatechange=function(){"complete"==v.readyState&&(v.onreadystatechange=null,p())})}function p(){z||(z=!0,t())}function s(){try{v.documentElement.doScroll("left")}catch(c){return void setTimeout(s,50)}p()}}(window); \ No newline at end of file diff --git a/policeManagement/src/assets/iconfont/iconfont.json b/policeManagement/src/assets/iconfont/iconfont.json new file mode 100644 index 0000000..182de05 --- /dev/null +++ b/policeManagement/src/assets/iconfont/iconfont.json @@ -0,0 +1,681 @@ +{ + "id": "4036849", + "name": "luozhun", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "8959587", + "name": "大小齿轮", + "font_class": "daxiaochilun", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "23875177", + "name": "全屏", + "font_class": "quanping", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "25840027", + "name": "搜索", + "font_class": "sousuo1", + "unicode": "e628", + "unicode_decimal": 58920 + }, + { + "icon_id": "29312195", + "name": "消息通知", + "font_class": "xiaoxitongzhi", + "unicode": "eaf8", + "unicode_decimal": 60152 + }, + { + "icon_id": "37425403", + "name": "退出全屏", + "font_class": "tuichuquanping", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "12188081", + "name": "添加", + "font_class": "tianjia", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "34882873", + "name": "编辑", + "font_class": "bianji1", + "unicode": "10117", + "unicode_decimal": 65815 + }, + { + "icon_id": "924384", + "name": "grid", + "font_class": "grid", + "unicode": "e8e4", + "unicode_decimal": 59620 + }, + { + "icon_id": "25944286", + "name": "ic_batch", + "font_class": "ic_batch", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "24473117", + "name": "删除", + "font_class": "shanchu", + "unicode": "fcb6", + "unicode_decimal": 64694 + }, + { + "icon_id": "7632835", + "name": "其他", + "font_class": "qita1", + "unicode": "e602", + "unicode_decimal": 58882 + }, + { + "icon_id": "11412028", + "name": "全部", + "font_class": "quanbu", + "unicode": "e745", + "unicode_decimal": 59205 + }, + { + "icon_id": "12085836", + "name": "音频", + "font_class": "yinpin", + "unicode": "e603", + "unicode_decimal": 58883 + }, + { + "icon_id": "15173237", + "name": "文档", + "font_class": "wendang", + "unicode": "e60e", + "unicode_decimal": 58894 + }, + { + "icon_id": "24110222", + "name": "图片", + "font_class": "tupian", + "unicode": "e606", + "unicode_decimal": 58886 + }, + { + "icon_id": "24111668", + "name": "视频", + "font_class": "shipin", + "unicode": "fb3c", + "unicode_decimal": 64316 + }, + { + "icon_id": "38945085", + "name": "041_文档", + "font_class": "a-041_wendang", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "2667175", + "name": "关联保安", + "font_class": "guanlianbaoan", + "unicode": "e600", + "unicode_decimal": 58880 + }, + { + "icon_id": "12156012", + "name": "保安消防", + "font_class": "baoanxiaofang", + "unicode": "e613", + "unicode_decimal": 58899 + }, + { + "icon_id": "7587762", + "name": "右箭头", + "font_class": "youjiantou", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "7587767", + "name": "左箭头", + "font_class": "zuojiantou", + "unicode": "e60d", + "unicode_decimal": 58893 + }, + { + "icon_id": "2234525", + "name": "铃铛", + "font_class": "lingdang", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "1301378", + "name": "文件夹", + "font_class": "wenjianjia", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "10333707", + "name": "菜单", + "font_class": "caidan1", + "unicode": "e626", + "unicode_decimal": 58918 + }, + { + "icon_id": "27157318", + "name": "按钮", + "font_class": "a-ziyuan4", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "6241686", + "name": "资产管理", + "font_class": "zichanguanli", + "unicode": "e62e", + "unicode_decimal": 58926 + }, + { + "icon_id": "18170419", + "name": "解除固定,图钉", + "font_class": "fix", + "unicode": "e9b9", + "unicode_decimal": 59833 + }, + { + "icon_id": "34198298", + "name": "文字大小2", + "font_class": "wenzidaxiao2", + "unicode": "e854", + "unicode_decimal": 59476 + }, + { + "icon_id": "35102495", + "name": "转移03", + "font_class": "zhuanyi03", + "unicode": "ea34", + "unicode_decimal": 59956 + }, + { + "icon_id": "591724", + "name": "wxb品牌宝", + "font_class": "wxbpinpaibao", + "unicode": "e620", + "unicode_decimal": 58912 + }, + { + "icon_id": "1680680", + "name": "产品库", + "font_class": "chanpinku", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "1964103", + "name": "供应商支付", + "font_class": "gongyingshangzhifu", + "unicode": "e618", + "unicode_decimal": 58904 + }, + { + "icon_id": "9874502", + "name": "KHCFDC_客户", + "font_class": "kehu", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "31313005", + "name": "进销存", + "font_class": "jinxiaocun", + "unicode": "e61f", + "unicode_decimal": 58911 + }, + { + "icon_id": "4657688", + "name": "项目管理", + "font_class": "xiangmuguanli-", + "unicode": "e609", + "unicode_decimal": 58889 + }, + { + "icon_id": "31260962", + "name": "exe", + "font_class": "exe", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "31260975", + "name": "mp4", + "font_class": "mp4", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "22325375", + "name": "主图视频", + "font_class": "zhutushipin", + "unicode": "e612", + "unicode_decimal": 58898 + }, + { + "icon_id": "19145266", + "name": "未知文件", + "font_class": "weizhiwenjian", + "unicode": "e61a", + "unicode_decimal": 58906 + }, + { + "icon_id": "6376407", + "name": "Jpg", + "font_class": "Jpg", + "unicode": "e731", + "unicode_decimal": 59185 + }, + { + "icon_id": "6376410", + "name": "Pdf", + "font_class": "Pdf", + "unicode": "e733", + "unicode_decimal": 59187 + }, + { + "icon_id": "6441713", + "name": "svg图标", + "font_class": "svgtubiao", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "6472244", + "name": "doc", + "font_class": "doc", + "unicode": "e735", + "unicode_decimal": 59189 + }, + { + "icon_id": "17290933", + "name": "gif", + "font_class": "gif", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "22007985", + "name": "JPEG", + "font_class": "JPEG", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "22008512", + "name": "DOCX", + "font_class": "DOCX", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "22008667", + "name": "XLS", + "font_class": "XLS", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "22008680", + "name": "XLSX", + "font_class": "XLSX", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "23182868", + "name": "PNG", + "font_class": "PNG", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "567560", + "name": "上传文件", + "font_class": "shangchuanwenjian", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "7594807", + "name": "24gl-folderPlus", + "font_class": "24gl-folderPlus", + "unicode": "eabe", + "unicode_decimal": 60094 + }, + { + "icon_id": "15816428", + "name": "019删除文件", + "font_class": "019shanchuwenjian", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "27438098", + "name": "下载文件", + "font_class": "xiazaiwenjian", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "406256", + "name": "私人文件夹", + "font_class": "3333", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "11472722", + "name": "事件查询-壹米滴答-01", + "font_class": "shijianchaxun-yimidida-", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "21193294", + "name": "文件", + "font_class": "wenjian", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "1137788", + "name": "系统", + "font_class": "xitong1", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "5650859", + "name": "单位", + "font_class": "danwei", + "unicode": "e611", + "unicode_decimal": 58897 + }, + { + "icon_id": "18167099", + "name": "警察半身,公安", + "font_class": "policeman-full", + "unicode": "e8f1", + "unicode_decimal": 59633 + }, + { + "icon_id": "3876471", + "name": "mysql", + "font_class": "mysql", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "3172487", + "name": "RabbitMQ", + "font_class": "RabbitMQ", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "18337193", + "name": "断路器", + "font_class": "duanluqi", + "unicode": "e60a", + "unicode_decimal": 58890 + }, + { + "icon_id": "29328030", + "name": "白名单", + "font_class": "baimingdan", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "10055646", + "name": "VPN网关", + "font_class": "VPNwangguan", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "1259944", + "name": "开发者中心", + "font_class": "kaifazhezhongxin", + "unicode": "e70f", + "unicode_decimal": 59151 + }, + { + "icon_id": "12975229", + "name": "控制台", + "font_class": "kongzhitai", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "18166606", + "name": "百度", + "font_class": "baidu", + "unicode": "e8cb", + "unicode_decimal": 59595 + }, + { + "icon_id": "34201231", + "name": "外部链接 ", + "font_class": "waibulianjie", + "unicode": "e858", + "unicode_decimal": 59480 + }, + { + "icon_id": "5434087", + "name": "字典管理", + "font_class": "zidianguanli", + "unicode": "e625", + "unicode_decimal": 58917 + }, + { + "icon_id": "4773266", + "name": "数据开发—脚本开发", + "font_class": "shujukaifajiaobenkaifa", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "5121534", + "name": "产品", + "font_class": "chanpin", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "11641886", + "name": "销售", + "font_class": "xiaoshou", + "unicode": "e624", + "unicode_decimal": 58916 + }, + { + "icon_id": "16398952", + "name": "测试", + "font_class": "ceshi", + "unicode": "e853", + "unicode_decimal": 59475 + }, + { + "icon_id": "34453374", + "name": "专属经理", + "font_class": "zhuanshujingli", + "unicode": "e883", + "unicode_decimal": 59523 + }, + { + "icon_id": "9592764", + "name": "公司", + "font_class": "gongsi", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "8225386", + "name": "系统权限", + "font_class": "xitongquanxian", + "unicode": "e61e", + "unicode_decimal": 58910 + }, + { + "icon_id": "6527123", + "name": "日志", + "font_class": "rizhi", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "12753449", + "name": "用户管理", + "font_class": "yonghuguanli_huaban", + "unicode": "e62d", + "unicode_decimal": 58925 + }, + { + "icon_id": "20853327", + "name": "定时任务", + "font_class": "dingshirenwu", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "4765881", + "name": "dashboard", + "font_class": "dashboard", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "5283349", + "name": "菜单", + "font_class": "caidan", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "6627737", + "name": "部门管理", + "font_class": "bumenguanli", + "unicode": "e61d", + "unicode_decimal": 58909 + }, + { + "icon_id": "7274106", + "name": "角色管理", + "font_class": "jiaoseguanli", + "unicode": "e621", + "unicode_decimal": 58913 + }, + { + "icon_id": "1119109", + "name": "系统", + "font_class": "xitong", + "unicode": "e601", + "unicode_decimal": 58881 + }, + { + "icon_id": "1727423", + "name": "204首页", + "font_class": "shouye", + "unicode": "e8b9", + "unicode_decimal": 59577 + }, + { + "icon_id": "11641882", + "name": "关于", + "font_class": "guanyu", + "unicode": "e623", + "unicode_decimal": 58915 + }, + { + "icon_id": "12769434", + "name": "DVLINK_大屏", + "font_class": "DVLINK_daping", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "318438", + "name": "weixin", + "font_class": "weixin", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "4936984", + "name": "QQ", + "font_class": "QQ", + "unicode": "e882", + "unicode_decimal": 59522 + }, + { + "icon_id": "128654", + "name": "content-right", + "font_class": "contentright", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "4608986", + "name": "主题", + "font_class": "zhuti", + "unicode": "e610", + "unicode_decimal": 58896 + }, + { + "icon_id": "10452247", + "name": "sousuo", + "font_class": "sousuo", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "11372726", + "name": "消息中心", + "font_class": "xiaoxi", + "unicode": "e8be", + "unicode_decimal": 59582 + }, + { + "icon_id": "7533292", + "name": "中英文", + "font_class": "zhongyingwen", + "unicode": "e605", + "unicode_decimal": 58885 + }, + { + "icon_id": "3278362", + "name": "放大", + "font_class": "fangda", + "unicode": "e622", + "unicode_decimal": 58914 + }, + { + "icon_id": "5698509", + "name": "全屏缩小", + "font_class": "suoxiao", + "unicode": "e62a", + "unicode_decimal": 58922 + } + ] +} diff --git a/policeManagement/src/assets/iconfont/iconfont.ttf b/policeManagement/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000..cc62999 Binary files /dev/null and b/policeManagement/src/assets/iconfont/iconfont.ttf differ diff --git a/policeManagement/src/assets/iconfont/iconfont.woff b/policeManagement/src/assets/iconfont/iconfont.woff new file mode 100644 index 0000000..5ed6e4a Binary files /dev/null and b/policeManagement/src/assets/iconfont/iconfont.woff differ diff --git a/policeManagement/src/assets/iconfont/iconfont.woff2 b/policeManagement/src/assets/iconfont/iconfont.woff2 new file mode 100644 index 0000000..6c40153 Binary files /dev/null and b/policeManagement/src/assets/iconfont/iconfont.woff2 differ diff --git a/policeManagement/src/assets/images/login/bg.jpg b/policeManagement/src/assets/images/login/bg.jpg new file mode 100644 index 0000000..6bbd1c7 Binary files /dev/null and b/policeManagement/src/assets/images/login/bg.jpg differ diff --git a/policeManagement/src/assets/scss/common.scss b/policeManagement/src/assets/scss/common.scss new file mode 100644 index 0000000..fc7d6cd --- /dev/null +++ b/policeManagement/src/assets/scss/common.scss @@ -0,0 +1,493 @@ +/* flex */ +.flex-center { + display: flex; + align-items: center; + justify-content: center; +} + +.flex-end { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.flex-justify-between { + display: flex; + align-items: center; + justify-content: space-between; +} + +.flex-align-center { + display: flex; + align-items: center; +} + +.flex-column-center { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.w-f { + width: 100%; +} + +.h-f { + height: 100%; +} + +.f-r { + float: right; +} + +.f-l { + float: left; +} + +/* clearfix */ +.clearfix::after { + display: block; + height: 0; + overflow: hidden; + clear: both; + content: ""; +} + +/* 文字单行省略号 */ +.sle { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 文字多行省略号 */ +.mle { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +/* 文字多了自动換行 */ +.break-word { + word-break: break-all; + word-wrap: break-word; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all 0.2s; +} + +.fade-transform-enter-from { + opacity: 0; + transition: all 0.2s; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transition: all 0.2s; + transform: translateX(30px); +} + +/* breadcrumb-transform */ +.breadcrumb-enter-active { + transition: all 0.2s; +} + +.breadcrumb-enter-from, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(10px); +} + +/* 外边距、内边距全局样式 */ +@for $i from 0 through 40 { + .mt#{$i} { + margin-top: #{$i}px !important; + } + .mr#{$i} { + margin-right: #{$i}px !important; + } + .mb#{$i} { + margin-bottom: #{$i}px !important; + } + .ml#{$i} { + margin-left: #{$i}px !important; + } + .pt#{$i} { + padding-top: #{$i}px !important; + } + .pr#{$i} { + padding-right: #{$i}px !important; + } + .pb#{$i} { + padding-bottom: #{$i}px !important; + } + .pl#{$i} { + padding-left: #{$i}px !important; + } +} + +/* -- 内外边距 -- */ + +.margin-0 { + margin: 0; +} + +.margin-xs { + margin: 5px; +} + +.margin-sm { + margin: 10px; +} + +.margin { + margin: 15px; +} + +.margin-lg { + margin: 20px; +} + +.margin-xl { + margin: 25px; +} + +.margin-top-xs { + margin-top: 5px; +} + +.margin-top-sm { + margin-top: 10px; +} + +.margin-top { + margin-top: 15px; +} + +.margin-top-lg { + margin-top: 20px; +} + +.margin-top-xl { + margin-top: 25px; +} + +.margin-right-xs { + margin-right: 5px; +} + +.margin-right-sm { + margin-right: 10px; +} + +.margin-right { + margin-right: 15px; +} + +.margin-right-lg { + margin-right: 20px; +} + +.margin-right-xl { + margin-right: 25px; +} + +.margin-bottom-xs { + margin-bottom: 5px; +} + +.margin-bottom-sm { + margin-bottom: 10px; +} + +.margin-bottom { + margin-bottom: 15px; +} + +.margin-bottom-lg { + margin-bottom: 20px; +} + +.margin-bottom-xl { + margin-bottom: 25px; +} + +.margin-left-xs { + margin-left: 5px; +} + +.margin-left-sm { + margin-left: 10px; +} + +.margin-left { + margin-left: 15px; +} + +.margin-left-lg { + margin-left: 20px; +} + +.margin-left-xl { + margin-left: 25px; +} + +.margin-lr-xs { + margin-left: 5px; + margin-right: 5px; +} + +.margin-lr-sm { + margin-left: 10px; + margin-right: 10px; +} + +.margin-lr { + margin-left: 15px; + margin-right: 15px; +} + +.margin-lr-lg { + margin-left: 20px; + margin-right: 20px; +} + +.margin-lr-xl { + margin-left: 25px; + margin-right: 25px; +} + +.margin-tb-xs { + margin-top: 5px; + margin-bottom: 5px; +} + +.margin-tb-sm { + margin-top: 10px; + margin-bottom: 10px; +} + +.margin-tb { + margin-top: 15px; + margin-bottom: 15px; +} + +.margin-tb-lg { + margin-top: 20px; + margin-bottom: 20px; +} + +.margin-tb-xl { + margin-top: 25px; + margin-bottom: 25px; +} + +.padding-0 { + padding: 0; +} + +.padding-xs { + padding: 5px; +} + +.padding-sm { + padding: 10px; +} + +.padding { + padding: 15px; +} + +.padding-lg { + padding: 20px; +} + +.padding-xl { + padding: 25px; +} + +.padding-top-xs { + padding-top: 5px; +} + +.padding-top-sm { + padding-top: 10px; +} + +.padding-top { + padding-top: 15px; +} + +.padding-top-lg { + padding-top: 20px; +} + +.padding-top-xl { + padding-top: 25px; +} + +.padding-right-xs { + padding-right: 5px; +} + +.padding-right-sm { + padding-right: 10px; +} + +.padding-right { + padding-right: 15px; +} + +.padding-right-lg { + padding-right: 20px; +} + +.padding-right-xl { + padding-right: 25px; +} + +.padding-bottom-xs { + padding-bottom: 5px; +} + +.padding-bottom-sm { + padding-bottom: 10px; +} + +.padding-bottom { + padding-bottom: 15px; +} + +.padding-bottom-lg { + padding-bottom: 20px; +} + +.padding-bottom-xl { + padding-bottom: 25px; +} + +.padding-left-xs { + padding-left: 5px; +} + +.padding-left-sm { + padding-left: 10px; +} + +.padding-left { + padding-left: 15px; +} + +.padding-left-lg { + padding-left: 20px; +} + +.padding-left-xl { + padding-left: 25px; +} + +.padding-lr-xs { + padding-left: 5px; + padding-right: 5px; +} + +.padding-lr-sm { + padding-left: 10px; + padding-right: 10px; +} + +.padding-lr { + padding-left: 15px; + padding-right: 15px; +} + +.padding-lr-lg { + padding-left: 20px; + padding-right: 20px; +} + +.padding-lr-xl { + padding-left: 25px; + padding-right: 25px; +} + +.padding-tb-xs { + padding-top: 5px; + padding-bottom: 5px; +} + +.padding-tb-sm { + padding-top: 10px; + padding-bottom: 10px; +} + +.padding-tb { + padding-top: 15px; + padding-bottom: 15px; +} + +.padding-tb-lg { + padding-top: 20px; + padding-bottom: 20px; +} + +.padding-tb-xl { + padding-top: 25px; + padding-bottom: 25px; +} + +/*高德地图去水印*/ +.amap-logo { + display: none !important; + visibility: hidden !important; +} + +.amap-copyright { + display: none !important; + visibility: hidden !important; +} + +/*高德地图去水印 结束*/ + +::-webkit-scrollbar { + width: 8px; + height: 12px; + background-color: #fff; +} + +/*浏览器滚动条样式*/ +::-webkit-scrollbar-thumb { + display: block; + min-height: 12px; + min-width: 8px; + border-radius: 6px; + background-color: rgb(217, 217, 217); +} + +::-webkit-scrollbar-thumb:hover { + display: block; + min-height: 12px; + min-width: 8px; + border-radius: 6px; + background-color: rgb(159, 159, 159); +} + +/*浏览器滚动条样式 结束*/ + +/* 鼠标悬浮手指 */ +.pointer { + cursor: pointer +} + +.border-table { + thead, th, td { + border: 1px solid black; + padding: 5px; + } +} \ No newline at end of file diff --git a/policeManagement/src/assets/vue.svg b/policeManagement/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/policeManagement/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/policeManagement/src/axios/index.ts b/policeManagement/src/axios/index.ts new file mode 100644 index 0000000..e880ff3 --- /dev/null +++ b/policeManagement/src/axios/index.ts @@ -0,0 +1,85 @@ +import axios, {AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig} from "axios"; +import {message} from "ant-design-vue"; +import {useUserStore} from "@/stores/modules/userStore.ts"; +import router from "@/router"; + +export interface CustomAxiosRequestConfig extends AxiosRequestConfig { + //是否需要全屏禁用 + loading?: boolean, + loadingMessage?: string +} + +export interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig { + //是否需要全屏禁用 + loading?: boolean, + loadingMessage?: string +} + +const axiosConfig: AxiosRequestConfig = { + baseURL: __APP_ENV.VITE_APP_BASE_API, + timeout: __APP_ENV.VITE_APP_ENV === 'production' ? 10 * 1000 : 60 * 1000, + timeoutErrorMessage: "请求超时......" +}; + +class RequestHttp { + + service: AxiosInstance; + + constructor(config: AxiosRequestConfig) { + this.service = axios.create(config); + + this.service.interceptors.request.use((cfg: CustomInternalAxiosRequestConfig) => { + const userStore = useUserStore() + cfg.headers.set(userStore.getTokenInfo?.name as string, userStore.getTokenInfo?.value as string) + return cfg; + }, async (error) => { + message.error(error.message) + return Promise.reject(error); + }) + + this.service.interceptors.response.use(async (resp): Promise => { + const jsonResult: JsonResult = resp.data; + if (jsonResult && jsonResult.code != 200) { + //一些特定的错误需要重新登录 + if ([-1].includes(jsonResult.code)) { + //清除登录信息 + await useUserStore().resetUserInfo(); + //跳转登录页 + await router.push({ + path: '/login' + }) + } + message.error(jsonResult.message) + return Promise.reject(jsonResult); + } + return Promise.resolve(jsonResult); + }, (error) => { + message.error(error.message) + return Promise.reject(error); + }) + } + + /** + * 常用请求方法封装 + */ + get(url: string, params?: object, _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.get(url, {params, ..._object}); + } + + post(url: string, params?: object | object[], _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.post(url, params, _object); + } + + put(url: string, params?: object | object[], _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.put(url, params, _object); + } + + delete(url: string, params?: object, _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.delete(url, {params, ..._object}); + } + +} + +const api = new RequestHttp(axiosConfig); + +export default api diff --git a/policeManagement/src/components/form/FormProMax.vue b/policeManagement/src/components/form/FormProMax.vue new file mode 100644 index 0000000..63361fe --- /dev/null +++ b/policeManagement/src/components/form/FormProMax.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/policeManagement/src/components/iconfont/IconFont.vue b/policeManagement/src/components/iconfont/IconFont.vue new file mode 100644 index 0000000..3546c6d --- /dev/null +++ b/policeManagement/src/components/iconfont/IconFont.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/policeManagement/src/components/layout/MenuItem.vue b/policeManagement/src/components/layout/MenuItem.vue new file mode 100644 index 0000000..5a95b10 --- /dev/null +++ b/policeManagement/src/components/layout/MenuItem.vue @@ -0,0 +1,46 @@ + + + + + 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 new file mode 100644 index 0000000..9faea1d --- /dev/null +++ b/policeManagement/src/components/layout/header/LayoutHeader.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/policeManagement/src/components/layout/layout.vue b/policeManagement/src/components/layout/layout.vue new file mode 100644 index 0000000..d8e7cdf --- /dev/null +++ b/policeManagement/src/components/layout/layout.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/policeManagement/src/components/login/TelephoneLogin.vue b/policeManagement/src/components/login/TelephoneLogin.vue new file mode 100644 index 0000000..0c2d865 --- /dev/null +++ b/policeManagement/src/components/login/TelephoneLogin.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/policeManagement/src/components/table/TableProMax.vue b/policeManagement/src/components/table/TableProMax.vue new file mode 100644 index 0000000..29a68b7 --- /dev/null +++ b/policeManagement/src/components/table/TableProMax.vue @@ -0,0 +1,224 @@ + + + + + diff --git a/policeManagement/src/components/tree/AdministrativeDivisionTree.vue b/policeManagement/src/components/tree/AdministrativeDivisionTree.vue new file mode 100644 index 0000000..c6a45f4 --- /dev/null +++ b/policeManagement/src/components/tree/AdministrativeDivisionTree.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/policeManagement/src/components/tsx/ModalPro.tsx b/policeManagement/src/components/tsx/ModalPro.tsx new file mode 100644 index 0000000..7b82c7d --- /dev/null +++ b/policeManagement/src/components/tsx/ModalPro.tsx @@ -0,0 +1,49 @@ +import { h, Ref, ref, VNode } from 'vue' +import { Modal } from 'ant-design-vue' +import { FormExpose } from 'ant-design-vue/es/form/Form' +import { ExclamationCircleOutlined } from '@ant-design/icons-vue' +import FormProMax from '@/components/form/FormProMax.vue' +import { FormProMaxItemOptions, FormProMaxProps } from '@/types/components/form' + +export function submitSimpleFormModal(props: { + title: string + formParams?: T & Record + formProps?: Omit, 'formItemOptions'> + formOptions: FormProMaxItemOptions + submit: (params: T) => Promise + cancel?: (params: T) => Promise + icon?: () => VNode + maskClosable?: boolean + width?: string | number +}) { + if (!props.formParams) props.formParams = {} as T + if (!props.width) props.width = 520 + + const formRef = ref(null) + const _formParams = ref({ + ...props.formParams, + }) as Ref + + Modal.confirm({ + icon: props.icon ? props.icon() : ' ', + width: props.width, + maskClosable: props.maskClosable ?? true, + title: props.title, + content: () => , + onOk: async () => { + await formRef.value?.validate() + await props.submit(_formParams.value) + }, + onCancel: async () => props.cancel && (await props.cancel(_formParams.value)), + }) +} + +export const deleteDataModal = (name: string, submit: () => Promise, cancel?: () => Promise) => { + Modal.confirm({ + title: `确认删除【${name}】吗?`, + icon: h(ExclamationCircleOutlined), + content: h('div', { style: 'color:red;' }, '此操作将删除数据,且无法找回!'), + onOk: async () => await submit(), + onCancel: async () => cancel && (await cancel()), + }) +} diff --git a/policeManagement/src/components/upload/SingleImageFileUpload.vue b/policeManagement/src/components/upload/SingleImageFileUpload.vue new file mode 100644 index 0000000..da2f465 --- /dev/null +++ b/policeManagement/src/components/upload/SingleImageFileUpload.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/policeManagement/src/config/dict.ts b/policeManagement/src/config/dict.ts new file mode 100644 index 0000000..e27fe55 --- /dev/null +++ b/policeManagement/src/config/dict.ts @@ -0,0 +1,17 @@ +import api from "@/axios"; + +type DictType = + 'CheckStatus' + | 'DeleteFlag' + | 'IsEnable' + | 'IsOrNot' + | 'Sex' + +export const initEnums = () => { + api.get[]>>('/common/enums').then(resp => { + sessionStorage.setItem('dictMap', JSON.stringify(resp.data)) + }) +} + +export const dictSelectNodes = (enumType: DictType): SelectNodeVo[] => JSON.parse(sessionStorage.getItem('dictMap') as string)?.[enumType] || [] + diff --git a/policeManagement/src/config/index.ts b/policeManagement/src/config/index.ts new file mode 100644 index 0000000..84191a1 --- /dev/null +++ b/policeManagement/src/config/index.ts @@ -0,0 +1,33 @@ +export const CLIENT_TYPE = "MANAGEMENT_POLICE"; //登录平台类型 +export const ROUTER_WHITE_LIST: string[] = ['/login', '/test', '/register-index']; +export const SYSTEM_MENUS: SystemMenu[] = [ + // { + // title: '首页', + // name: 'index', + // path: '/index', + // type: "menu", + // component: () => import('@/views/index.vue') + // }, { + // title: '单位管理', + // name: 'unitManage', + // path: '/unitManage', + // type: 'dir', + // children: [ + // { + // title: '公安单位', + // name: 'policeUnit', + // path: '/policeUnit', + // type: 'menu', + // // icon: 'icon-policeman-full', + // // size: '16', + // component: () => import('@/views/unitManage/policeUnit/index.vue') + // }, { + // title: '保安单位', + // name: 'securityUnit', + // path: '/securityUnit', + // type: 'menu', + // component: () => import('@/views/unitManage/securityUnit/index.vue') + // } + // ] + // } +] diff --git a/policeManagement/src/hooks/useTableProMax.ts b/policeManagement/src/hooks/useTableProMax.ts new file mode 100644 index 0000000..e122e5d --- /dev/null +++ b/policeManagement/src/hooks/useTableProMax.ts @@ -0,0 +1,134 @@ +import { ref, Ref } from "vue"; +import { Page, PageParams, PageResult } from "@/types/hooks/useTableProMax.ts"; +import { FormInstance } from "ant-design-vue"; +import { BaseTableRowRecord, RequestApiType } from "@/types/components/table"; + +/** + * + * @param api 查询方法 + * @param searchFormRef 表单校验 + * @param searchParams 查询的参数 + * @param isPageTable 是否分页 + * @param dataCallBack 查询到数据后的回调 + * @param requestError 查询出错回调 + */ +export default | PageParams

>(api: RequestApiType, + searchFormRef: Ref, + searchParams: Ref

, + isPageTable: boolean = true, + dataCallBack?: (data: T[]) => T[], + requestError?: (errorMsg: any) => void) => { + + const dataSource = ref([]) as Ref; + const loading = ref(false); + const pageParams = ref({ + current: 1, + size: 10, + total: 0 + }) + + /** + * 获取表格数据 + */ + const requestGetTableData = async (isInit: boolean = false) => { + try { + //校验表单 + !isInit && await searchFormRef.value?.validate(); + //组装参数 + let totalSearchParams; + if (isPageTable) { + totalSearchParams = { + params: searchParams.value, + page: { + current: pageParams.value.current, + size: pageParams.value.size + } + } as PageParams

; + } else { + totalSearchParams = searchParams.value + } + + loading.value = true; + + const resp = await api(totalSearchParams as P); + let tableData: T[]; + + if (isPageTable) { + const { current, records, size, total } = resp.data as PageResult; + isPageTable && updatePageParams({ + current: parseInt(current), + size: parseInt(size), + total: parseInt(total) + }); + tableData = records; + } else { + tableData = resp.data as T[] + } + dataCallBack && (tableData = dataCallBack(tableData)); + dataSource.value = tableData; + } catch (error) { + requestError && requestError(error); + } finally { + loading.value = false; + } + } + + /** + * 更新分页信息 + */ + const updatePageParams = (ps: Page) => Object.assign(pageParams.value, ps) + + /** + * 重置表格状态 包括 dataSource loading pageParams + */ + const resetState = () => { + dataSource.value = []; + loading.value = false; + pageParams.value = { + current: 1, + size: 10, + total: 0 + } + } + + /** + * 表格数据查询 与 requestGetTableData 区别是会将页面重置为1 + * 如果只做刷新数据请用 requestGetTableData + */ + const search = async () => { + pageParams.value.current = 1; + await requestGetTableData(); + }; + + /** + * @description 每页条数改变 + * @param _ + * @param {Number} size 页显示数量 + */ + const handleSizeChange = async (_: number, size: number) => { + pageParams.value.current = 1; + pageParams.value.size = size; + await requestGetTableData(); + }; + + /** + * @description 当前页改变 + * @param current 当前页 + */ + const handleCurrentChange = async (current: number) => { + pageParams.value.current = current; + await requestGetTableData(); + }; + + return { + dataSource, + loading, + pageParams, + requestGetTableData, + search, + handleSizeChange, + handleCurrentChange, + resetState + }; + +} diff --git a/policeManagement/src/index.css b/policeManagement/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/policeManagement/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/policeManagement/src/main.ts b/policeManagement/src/main.ts new file mode 100644 index 0000000..77bdb85 --- /dev/null +++ b/policeManagement/src/main.ts @@ -0,0 +1,21 @@ +import {createApp} from 'vue' +import App from '@/App.vue' +import '@/reset.css' +import './index.css' +// 公共样式 +import '@/assets/scss/common.scss' +// iconfont css +import "@/assets/iconfont/iconfont.css"; +// vue Router +import router from "@/router"; +// pinia stores +import pinia from "@/stores"; + +const vueApp = createApp(App); +import {initEnums} from "@/config/dict.ts"; + +initEnums() +vueApp + .use(router) + .use(pinia) + .mount('#app') diff --git a/policeManagement/src/reset.css b/policeManagement/src/reset.css new file mode 100644 index 0000000..76d99ae --- /dev/null +++ b/policeManagement/src/reset.css @@ -0,0 +1,57 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/policeManagement/src/router/index.ts b/policeManagement/src/router/index.ts new file mode 100644 index 0000000..bdd4fb3 --- /dev/null +++ b/policeManagement/src/router/index.ts @@ -0,0 +1,50 @@ +import { createRouter, createWebHistory } from "vue-router"; +import { staticRouter } from "@/router/staticRouters.ts"; +import { message, Modal } from "ant-design-vue"; +import { useUserStore } from "@/stores/modules/userStore.ts"; +import { ROUTER_WHITE_LIST } from "@/config"; + +/** + * createWebHistory & createWebHashHistory + * createWebHistory: 路径不带#号,但需要后端进行配置(如nginx配置:try_files $uri $uri/ /index.html last;) + * createWebHashHistory: 路径带#号 这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理,影响SEO + */ +const router = createRouter({ + history: createWebHistory('/policeManagement/'), + routes: [...staticRouter], + strict: false, + scrollBehavior: () => ({ left: 0, top: 0 }) +}); + +// const ROUTER_WHITE_LIST = ['/login', '/registerIndex']; // 将 '/registerIndex' 添加到白名单 +router.beforeEach(async (to, from, next) => { + Modal.destroyAll(); + //判断访问的是不是登录页 + const userStore = useUserStore(); + if (to.path.toLocaleLowerCase() === '/login' && userStore.getTokenInfo?.value) { + //如果已登录 且访问login页面 直接返回当前页面 + await message.warn('当前已登录,请先退出账号'); + return next(from.fullPath) + } + //判断访问路径是不是白名单d + // console.log('访问路径', to.path); + + if (ROUTER_WHITE_LIST.includes(to.path)) { + return next(); + } else { + //不在白名单内需要查看是否携带token 没有token需要返回登录页进行登录 + if (!userStore.getTokenInfo?.value) { + await message.warn('未找到token,请重新登陆!') + return next('/login'); + } + } + + + return next(); +}) + +router.onError(error => { + console.error("路由错误", error.message); +}) + +export default router diff --git a/policeManagement/src/router/staticRouters.ts b/policeManagement/src/router/staticRouters.ts new file mode 100644 index 0000000..45b703d --- /dev/null +++ b/policeManagement/src/router/staticRouters.ts @@ -0,0 +1,175 @@ + + +// name 唯一 +import { RouteRecordRaw } from "vue-router"; +export const Layout = () => import("@/components/layout/layout.vue"); +export const staticRouter: RouteRecordRaw[] = + [ + { + path: '/', + name: 'dashboard', + redirect: '/index', + icon: 'icon-policeman-full', + meta: { + keepalive: true + }, + component: Layout, + children: [ + { + + path: '/index', + name: 'index', + meta: { + title: '首页', + keepalive: true + }, + component: () => import('@/views/dashboard/index.vue') + }, + + + ] + }, + + { + + path: '/user', + name: 'user', + meta: { + title: '用户管理', + keepalive: true + }, + component: Layout, + children: [ + { + path: 'index', + name: 'user-index', + meta: { + title: '后台用户', + keepalive: true + }, + component: () => import('@/views/user/user.vue') + }, + { + path: 'weapp', + name: 'weapp', + meta: { + + title: '小程序用户', + keepalive: true + }, + component: () => import('@/views/user/user-weapp.vue') + }, + ] + }, + + { + + path: '/query-', + name: 'query-', + meta: { + title: '信息查询', + keepalive: true + }, + component: Layout, + children: [ + { + path: 'public-unit', // 这里使用相对路径而不是 '/register' + name: 'public-unit', + meta: { + + title: '企事业单位', + keepalive: true + }, + component: () => import('@/views/query/publicUnit.vue') + }, + // { + // path: 'weapp-user', // 这里使用相对路径而不是 '/register' + // name: 'weapp-user', + // meta: { + // + // title: '微信小程序用户', + // keepalive: true + // }, + // component: () => import('@/views/query/weappUser.vue') + // }, + ] + }, + { + path: '/login', + name: 'login', + meta: { + keepalive: true + }, + component: () => import('@/views/login.vue') + }, + { + + path: '/register-index', + name: 'register-index', + meta: { + }, + component: () => import('@/views/register.vue') + }, + + + { + path: '/law', + name: 'law', + meta: { + + }, + component: Layout, + children: [ + { + path: '/law-index', + name: 'law-index', + meta: { + title: '法制宣传', + keepalive: true + }, + component: () => import('@/views/law/index.vue') + }, + ] + }, + { + path: '/police', + name: 'police', + meta: { + + }, + component: Layout, + children: [ + { + path: '/police-presence', + name: 'police-presence', + meta: { + title: '警保风采', + keepalive: true + }, + component: () => import('@/views/police/index.vue') + }, + ] + }, + { + path: '/warning', + name: 'warning', + meta: { + + }, + component: Layout, + children: [ + { + path: '/early-warning', + name: 'early-warning', + meta: { + title: '三色预警', + keepalive: true + }, + component: () => import('@/views/warning/index.vue') + }, + ] + }, + ] + + + diff --git a/policeManagement/src/stores/index.ts b/policeManagement/src/stores/index.ts new file mode 100644 index 0000000..87b1acc --- /dev/null +++ b/policeManagement/src/stores/index.ts @@ -0,0 +1,8 @@ +import {createPinia} from "pinia"; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' + +//创建store实例 持久化插件 +const pinia = createPinia(); +pinia.use(piniaPluginPersistedstate); + +export default pinia; diff --git a/policeManagement/src/stores/modules/userStore.ts b/policeManagement/src/stores/modules/userStore.ts new file mode 100644 index 0000000..5bc4b67 --- /dev/null +++ b/policeManagement/src/stores/modules/userStore.ts @@ -0,0 +1,31 @@ +import { defineStore } from "pinia"; +import { TokenInfo, UserStore } from "@/types/stores/userStore.ts"; + +export const useUserStore = defineStore({ + id: 'useUserStore', + state: (): UserStore => { + return { + tokenInfo: undefined + } + }, + actions: { + saveTokenInfo(tokenInfo: TokenInfo) { + this.tokenInfo = tokenInfo + }, + async resetUserInfo() { + this.tokenInfo = undefined; + } + }, + getters: { + getTokenInfo: (state): TokenInfo => state.tokenInfo as TokenInfo, + }, + + // persist 是 Pinia 的一个插件 pinia-plugin-persistedstate 提供的功能 + // 用来让状态数据在页面刷新或重新加载时保存在浏览器的存储中 + // 通过这个插件,你可以让 Pinia store 的状态持久化,即即使页面刷新,数据也不会丢失 + persist: { + key: "useUserStore", + storage: window.localStorage, + paths: ["tokenInfo"], + } +}) diff --git a/policeManagement/src/types/components/form/index.ts b/policeManagement/src/types/components/form/index.ts new file mode 100644 index 0000000..36927b9 --- /dev/null +++ b/policeManagement/src/types/components/form/index.ts @@ -0,0 +1,76 @@ +import { + FormProps, + RangePicker, + Input, + InputNumber, + Textarea, + InputPassword, + RadioGroup, + Select, + TreeSelect, + Cascader, + CheckboxGroup, + DatePicker, + FormItem, TimeRangePicker, TimePicker, +} from "ant-design-vue"; +import { Ref, UnwrapRef, VNode } from "vue"; +import { ComponentProps } from "vue-component-type-helpers"; +import AdministrativeDivisionTree from "@/components/tree/AdministrativeDivisionTree.vue"; + +type FormProMaxItemType = + | 'custom' + | 'input' + | 'inputPassword' + | 'inputNumber' + | 'inputTextArea' + | 'radioGroup' + | 'select' + | 'selectIcon' + | 'selectUser' + | 'treeSelect' + | 'cascader' + | 'checkboxGroup' + | 'datePicker' + | 'rangePicker' + | 'timeRangePicker' + | 'timePicker' + | 'administrativeDivisionTree' + +interface FormProMaxItemCommonProps extends ComponentProps { + label?: string, + grid?: Grid, + placeholder?: string, + remarkRender?: () => VNode | string, + customRender?: () => VNode; + options?: (SelectNodeVo | TreeNodeVo)[] | Ref<(SelectNodeVo | TreeNodeVo)[]> +} + +export interface FormProMaxItemProps extends FormProMaxItemCommonProps { + type: T + componentsProps?: C +} + +export type FormProMaxItemOptions = { + [key in keyof T | string]: + FormProMaxItemProps<'custom', ComponentProps>> + | FormProMaxItemProps<'input', ComponentProps> + | FormProMaxItemProps<'inputPassword', ComponentProps> + | FormProMaxItemProps<'inputNumber', ComponentProps> + | FormProMaxItemProps<'inputTextArea', ComponentProps> + | FormProMaxItemProps<'radioGroup', ComponentProps> + | FormProMaxItemProps<'select', ComponentProps> + | FormProMaxItemProps<'treeSelect', ComponentProps> + | FormProMaxItemProps<'cascader', ComponentProps> + | FormProMaxItemProps<'checkboxGroup', ComponentProps> + | FormProMaxItemProps<'datePicker', ComponentProps> + | FormProMaxItemProps<'rangePicker', ComponentProps> + | FormProMaxItemProps<'timeRangePicker', ComponentProps> + | FormProMaxItemProps<'timePicker', ComponentProps> + | FormProMaxItemProps<'administrativeDivisionTree', ComponentProps> +} + +export interface FormProMaxProps extends FormProps { + grid?: Grid + gutter?: number; + formItemOptions?: FormProMaxItemOptions | Ref> | UnwrapRef> +} diff --git a/policeManagement/src/types/components/iconfont/IconFont.ts b/policeManagement/src/types/components/iconfont/IconFont.ts new file mode 100644 index 0000000..501afa8 --- /dev/null +++ b/policeManagement/src/types/components/iconfont/IconFont.ts @@ -0,0 +1,5 @@ +export interface IconFontProps { + fontClass?: string, + size?: number | string, + type?: 'class' | 'svg' +} \ No newline at end of file diff --git a/policeManagement/src/types/components/table/index.ts b/policeManagement/src/types/components/table/index.ts new file mode 100644 index 0000000..4809254 --- /dev/null +++ b/policeManagement/src/types/components/table/index.ts @@ -0,0 +1,55 @@ +import { PaginationProps, Table, TableProps } from "ant-design-vue"; +import { TableRowSelection } from "ant-design-vue/lib/table/interface"; +import { Ref, UnwrapRef } from "vue"; +import { ColumnType } from "ant-design-vue/es/table/interface"; +import { ComponentSlots } from "vue-component-type-helpers"; +import { FormProMaxItemOptions, FormProMaxProps } from "@/types/components/form/index.ts"; +import { PageParams, PageResult } from "@/types/hooks/useTableProMax.ts"; + + +export type TableProMaxColumnType = Omit, 'dataIndex'> & { + dataIndex: keyof T | string | string[] | number | number[]; +} + + +export type TableProMaxProps< + T extends BaseTableRowRecord = {}, + P extends { [key: string]: any } = {} +> = Partial, "dataSource" | 'pagination' | 'loading' | 'rowKey' | 'columns'>> & { + rowKey?: keyof T, + columns?: TableProMaxColumnType[], + searchFormProps?: Omit, 'formItems'> + searchFormOptions?: FormProMaxItemOptions

| Ref> | UnwrapRef>, + defaultSearchParams?: { [key in keyof P | string]: any }; + requestAuto?: boolean, + requestApi: RequestApiType, + requestError?: (errorMsg: any) => void, + dataCallback?: (data: T[]) => T[], + isPagination?: boolean, + paginationProps?: TableProMaxPaginationProps, + isSelection?: boolean, + selectionProps?: TableProMaxRowSelect, + isPrinter?: boolean, + needIndex?: boolean +} + +export type TableProMaxSlots = ComponentSlots & { + tableHeader: (scope: { selectKeys: string[], selectRows: T[] }) => any, + tableHeaderRight: (scope: { selectKeys: string[], selectRows: T[] }) => any, +} + +export type RequestApiType = (params: P | PageParams

) => Promise>>; + +export type TableProMaxPaginationProps = Partial>; + +export type TableProMaxRowSelect = TableRowSelection; + +export interface BaseTableRowRecord { + snowFlakeId?: string; + createUserName?: string; + createTime?: Date | string; + updateUserName?: string; + updateTime?: Date | string +} diff --git a/policeManagement/src/types/config/index.ts b/policeManagement/src/types/config/index.ts new file mode 100644 index 0000000..a2dab60 --- /dev/null +++ b/policeManagement/src/types/config/index.ts @@ -0,0 +1,13 @@ +import { RouteComponent } from "vue-router"; + +export interface SystemMenu { + type: 'dir' | 'menu'; + title: string; + path: string; + name: string; + icon?: string; + + component?: RouteComponent; + children?: SystemMenu[]; +} + diff --git a/policeManagement/src/types/hooks/useTableProMax.ts b/policeManagement/src/types/hooks/useTableProMax.ts new file mode 100644 index 0000000..3989828 --- /dev/null +++ b/policeManagement/src/types/hooks/useTableProMax.ts @@ -0,0 +1,26 @@ +/** + * 分页对象 + */ +export interface Page { + current: number, + size: number, + total: number +} + +/** + * 分页参数 + */ +export interface PageParams = {}> { + params: T & { [key: string]: any }, + page: Omit +} + +/** + * 分页结果 + */ +export interface PageResult { + current: string, + records: T[], + size: string, + total: string +} \ No newline at end of file diff --git a/policeManagement/src/types/stores/userStore.ts b/policeManagement/src/types/stores/userStore.ts new file mode 100644 index 0000000..92073b0 --- /dev/null +++ b/policeManagement/src/types/stores/userStore.ts @@ -0,0 +1,8 @@ +export interface TokenInfo { + name: string; + value: string; +} + +export interface UserStore { + tokenInfo?: TokenInfo; +} diff --git a/policeManagement/src/types/views/login.ts b/policeManagement/src/types/views/login.ts new file mode 100644 index 0000000..03cf720 --- /dev/null +++ b/policeManagement/src/types/views/login.ts @@ -0,0 +1,4 @@ +export interface LoginParams { + accountOrTelephone: string; + password: string; +} diff --git a/policeManagement/src/types/views/publicUnit.ts b/policeManagement/src/types/views/publicUnit.ts new file mode 100644 index 0000000..13708f3 --- /dev/null +++ b/policeManagement/src/types/views/publicUnit.ts @@ -0,0 +1,37 @@ +import { BaseTableRowRecord } from "@/types/components/table"; +// interface BaseEnum { +// value: T; +// label: string +// } +export interface publicUnitPagerQueryParams extends BaseTableRowRecord { +provinceName: any; +[x: string]: any; + /** 名称 **/ + name?: string; + /** 社会编码 **/ + socialCode?: string; + /** 行政区划编码 **/ + administrativeDivisionCodes?: string[]; + /** 是否启用 **/ + isEnable?: BaseEnum; + /** 审核状态 **/ + checkStatus?: number; + /** 账号 **/ + account?: string, + sex?: BaseEnum, + telephone?: string, + createTime?: string, + snowFlakeId?: string, + remark?: string, + isAdmin?: BaseEnum +} + +export interface FromItem { + snowFlakeId?: string, + name: string, + sex: number, + telephone: string, + isEnable: BaseEnum, + remark?: string, +} + diff --git a/policeManagement/src/utils/DB.ts b/policeManagement/src/utils/DB.ts new file mode 100644 index 0000000..babecea --- /dev/null +++ b/policeManagement/src/utils/DB.ts @@ -0,0 +1,69 @@ +const dbName = 'myDatabase' // 定义数据库名称 +const storeName = 'treeStore' // 定义存储空间名称 + +// 打开或创建 IndexedDB 数据库的函数 +export const openDB = () => { + return new Promise((resolve, reject) => { + // 尝试打开名为 'myDatabase' 的数据库,如果不存在则创建 + const request = indexedDB.open(dbName, 1) + + // 如果数据库需要升级(例如第一次打开或版本号增加),会触发此事件 + request.onupgradeneeded = (event) => { + const db = (event.target as IDBOpenDBRequest).result + // 创建一个新的对象存储空间(相当于数据库中的表)名为 'treeStore' + db.createObjectStore(storeName) + } + + // 成功打开数据库后执行此回调 + request.onsuccess = (event) => { + // 将数据库实例传递给 resolve,供后续使用 + resolve((event.target as IDBOpenDBRequest).result) + } + + // 如果打开数据库失败,执行此回调 + request.onerror = (event) => { + // 将错误信息传递给 reject + reject((event.target as IDBOpenDBRequest).error) + } + }) +} + +// 将树形结构数据存储到 IndexedDB 中的函数 +export const storeTreeData = async (data: any) => { + const db = await openDB() // 打开数据库并获取数据库实例 + const transaction = db.transaction(storeName, 'readwrite') // 创建一个读写事务 + const store = transaction.objectStore(storeName) // 获取存储空间 + + // 使用 'treeData' 作为键,将数据存储到存储空间中 + store.put(data, 'treeData') + + // 事务完成后执行的回调 + transaction.oncomplete = () => { + console.log('Data stored successfully') // 数据存储成功后输出信息 + } +} + +// 从 IndexedDB 中加载缓存数据的函数 +export const loadTreeFromCache = async (): Promise => { + const db = await openDB() + const transaction = db.transaction(storeName, 'readonly') + const store = transaction.objectStore(storeName) + + return new Promise((resolve, reject) => { + const request = store.get('treeData') + + request.onsuccess = () => { + if (request.result !== undefined) { + resolve(request.result) // 返回缓存数据 + } else { + resolve(null) // 如果没有缓存数据,返回 null + } + } + + request.onerror = () => { + reject(request.error) + } + }) +} + +// export { openDB, storeTreeData, loadTreeFromCache } \ No newline at end of file diff --git a/policeManagement/src/utils/index.ts b/policeManagement/src/utils/index.ts new file mode 100644 index 0000000..257081a --- /dev/null +++ b/policeManagement/src/utils/index.ts @@ -0,0 +1,17 @@ +import {ceil, divide} from "lodash-es"; + +/** + * 将文件大小转为字符串格式 + * @param fileSizeInBytes + */ +export const convertFileSizeToStr = (fileSizeInBytes: number): string => { + if (fileSizeInBytes < 1024) { + return fileSizeInBytes + "B"; + } else if (fileSizeInBytes < 1024 * 1024) { + return (ceil(divide(fileSizeInBytes, 1024), 2)) + "KB"; + } else if (fileSizeInBytes < 1024 * 1024 * 1024) { + return (ceil(divide(fileSizeInBytes, (1024 * 1024)), 2)) + "MB"; + } else { + return (ceil(divide(fileSizeInBytes, (1024 * 1024 * 1024)), 2)) + "GB"; + } +} diff --git a/policeManagement/src/utils/minioUtil.ts b/policeManagement/src/utils/minioUtil.ts new file mode 100644 index 0000000..34c404d --- /dev/null +++ b/policeManagement/src/utils/minioUtil.ts @@ -0,0 +1,26 @@ +import api from "@/axios"; +import dayjs from "dayjs"; +import { uuid } from "vue-uuid"; + +/** + * 生成一个简单的对象文件地址 + * @param fileName 原始文件名 + * @param parentDir 上级目录 + */ +export const generateSimpleObjectName = (fileName: string, parentDir?: String): string => { + let objectName = parentDir + dayjs().format('/YYYY/MM/DD/') + uuid.v4().replace(/-/g, ''); + if (fileName && fileName.length > 0) { + objectName += fileName.substring(fileName.lastIndexOf('.')) + } + return objectName; +} + +/** + * 获取生成预签名的 URL + */ +export const getResignedObjectUrl = async (bucketName: string, objectName: string): Promise => { + return (await api.get('/common/getResignedObjectUrl', { + bucketName, + objectName + })).data as string; +} diff --git a/policeManagement/src/utils/rsaUtil.ts b/policeManagement/src/utils/rsaUtil.ts new file mode 100644 index 0000000..935502b --- /dev/null +++ b/policeManagement/src/utils/rsaUtil.ts @@ -0,0 +1,16 @@ +import {JSEncrypt} from "jsencrypt"; + +const rsa = new JSEncrypt() +rsa.setPublicKey(__APP_ENV.VITE_APP_RSA_PUBLIC_KEY) + +const encryptStr = (text: string): string => { + const r = rsa.encrypt(text); + if (!r) { + throw "加密失败"; + } + return r; +} + +export default { + encryptStr +} diff --git a/policeManagement/src/views/dashboard/index.vue b/policeManagement/src/views/dashboard/index.vue new file mode 100644 index 0000000..48146d0 --- /dev/null +++ b/policeManagement/src/views/dashboard/index.vue @@ -0,0 +1,14 @@ + + + + + + diff --git a/policeManagement/src/views/law/index.vue b/policeManagement/src/views/law/index.vue new file mode 100644 index 0000000..9c0df41 --- /dev/null +++ b/policeManagement/src/views/law/index.vue @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/policeManagement/src/views/login.vue b/policeManagement/src/views/login.vue new file mode 100644 index 0000000..66f9cda --- /dev/null +++ b/policeManagement/src/views/login.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/policeManagement/src/views/police/index.vue b/policeManagement/src/views/police/index.vue new file mode 100644 index 0000000..e945637 --- /dev/null +++ b/policeManagement/src/views/police/index.vue @@ -0,0 +1,8 @@ + + + diff --git a/policeManagement/src/views/query/publicUnit.vue b/policeManagement/src/views/query/publicUnit.vue new file mode 100644 index 0000000..73137b9 --- /dev/null +++ b/policeManagement/src/views/query/publicUnit.vue @@ -0,0 +1,197 @@ + + + diff --git a/policeManagement/src/views/query/weappUser.vue b/policeManagement/src/views/query/weappUser.vue new file mode 100644 index 0000000..c66c3b6 --- /dev/null +++ b/policeManagement/src/views/query/weappUser.vue @@ -0,0 +1,8 @@ + + + diff --git a/policeManagement/src/views/register.vue b/policeManagement/src/views/register.vue new file mode 100644 index 0000000..5fd490b --- /dev/null +++ b/policeManagement/src/views/register.vue @@ -0,0 +1,304 @@ + + + diff --git a/policeManagement/src/views/user/user-weapp.vue b/policeManagement/src/views/user/user-weapp.vue new file mode 100644 index 0000000..0fbf6b5 --- /dev/null +++ b/policeManagement/src/views/user/user-weapp.vue @@ -0,0 +1,149 @@ + + + diff --git a/policeManagement/src/views/user/user.vue b/policeManagement/src/views/user/user.vue new file mode 100644 index 0000000..d86c914 --- /dev/null +++ b/policeManagement/src/views/user/user.vue @@ -0,0 +1,244 @@ + + + diff --git a/policeManagement/src/views/warning/index.vue b/policeManagement/src/views/warning/index.vue new file mode 100644 index 0000000..e0a2da1 --- /dev/null +++ b/policeManagement/src/views/warning/index.vue @@ -0,0 +1,8 @@ + + + diff --git a/policeManagement/src/vite-env.d.ts b/policeManagement/src/vite-env.d.ts new file mode 100644 index 0000000..afb3748 --- /dev/null +++ b/policeManagement/src/vite-env.d.ts @@ -0,0 +1,35 @@ +/// + +// vue3导入模块报红解决方案——找不到模块“./XXX.vue”或其相应的类型声明 +// 报错原因是:typescript 只能理解 .ts 文件,无法理解 .vue文件 +// 因此需要给.vue文件加上类型说明文件 +declare module '*.vue' { + import type { DefineComponent } from 'vue' + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any> + export default component +} + + +declare module 'lodash-es' { + import { includes, isEmpty, ceil, divide } from 'lodash'; + export { includes, isEmpty, ceil, divide }; +} +interface ImportMetaEnv { + // 项目名称 + readonly VITE_APP_NAME: string; + // 当前环境 + readonly VITE_APP_ENV: 'development' | 'production'; + // 启动端口 + readonly VITE_APP_PORT: number; + + // axios + readonly VITE_APP_BASE_API: string; + readonly VITE_APP_PROXY_URL: string; + + // RSA公钥 + readonly VITE_APP_RSA_PUBLIC_KEY: string; +} + + + diff --git a/policeManagement/tailwind.config.js b/policeManagement/tailwind.config.js new file mode 100644 index 0000000..5eef83c --- /dev/null +++ b/policeManagement/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/policeManagement/tsconfig.app.json b/policeManagement/tsconfig.app.json new file mode 100644 index 0000000..7c336d1 --- /dev/null +++ b/policeManagement/tsconfig.app.json @@ -0,0 +1,82 @@ +{ + "compilerOptions": { + "composite": true, // 标记为复合项目的一部分 [ty-reference](1) + "target": "ES2020", // 设置目标 JavaScript 语言标准版本 + "useDefineForClassFields": true, // 为类字段使用 `defineProperty`,以支持装饰器 + "module": "ESNext", // 设置模块系统 + "lib": [ // 指定要包含的类型库 + "ES2020", // 包含 ES2020 的类型定义 + "DOM", // 包含 DOM 类型定义 + "DOM.Iterable" // 包含 DOM 可迭代类型定义 + ], + "skipLibCheck": true, // 忽略类型库的类型检查 + /* Bundler mode */ + "moduleResolution": "bundler", // 设置模块解析策略为 bundler 模式 + "allowImportingTsExtensions": true, // 允许导入 TypeScript 扩展名 + "isolatedModules": true, // 将每个文件视为一个模块 + "moduleDetection": "force", // 强制将所有模块视为 ESM + "noEmit": false, // 允许发出文件 + "declaration": true, // 如果需要生成 .d.ts 文件 + "emitDeclarationOnly": true, // 只发出声明文件,而不生成 JS 文件 + "jsx": "preserve", // 保留 JSX 节点,不转换 + "jsxImportSource": "vue", // JSX 元素来自 Vue + /* Linting */ + "strict": false, // 开启所有严格类型检查选项 + "noUnusedLocals": true, // 报告未使用的局部变量 + "noUnusedParameters": true, // 报告未使用的参数 + "noFallthroughCasesInSwitch": true, // 报告 switch 语句中的 fallthrough 错误 + "baseUrl": "./", // 设置基础模块解析目录 + /* 配置别名 */ + "paths": { // 设置路径映射 + "@/*": [ // 将 @/ 映射到 src/ 目录 + "./src/*" + ] + }, + "allowSyntheticDefaultImports": true // 允许默认导入 + }, + "include": [ // 指定包含的文件 + "src/**/*.ts", // 包括 src 目录下的所有 TypeScript 文件 + "src/**/*.d.ts", // 包括 src 目录下的所有类型声明文件 + "src/**/*.tsx", // 包括 src 目录下的所有 JSX 文件 + "src/**/*.vue", // 包括 src 目录下的所有 Vue 文件 + "global.d.ts" + ] +} +// // 脚手架自带 配置: +// { +// "compilerOptions": { +// "target": "ES2020", +// "useDefineForClassFields": true, +// "module": "ESNext", +// "lib": [ +// "ES2020", +// "DOM", +// "DOM.Iterable" +// ], +// "skipLibCheck": true, +// /* Bundler mode */ +// "moduleResolution": "bundler", +// "allowImportingTsExtensions": true, +// "isolatedModules": true, +// "moduleDetection": "force", +// "noEmit": true, +// "jsx": "preserve", +// /* Linting */ +// "strict": true, +// "noUnusedLocals": true, +// "noUnusedParameters": true, +// "noFallthroughCasesInSwitch": true, +// "baseUrl": "/", +// /* 配置别名 */ +// "paths": { +// "@/*": [ +// "./src/*" +// ] +// }, +// }, +// "include": [ +// "src/**/*.ts", +// "src/**/*.tsx", +// "src/**/*.vue" +// ] +// } \ No newline at end of file diff --git a/policeManagement/tsconfig.app.tsbuildinfo b/policeManagement/tsconfig.app.tsbuildinfo new file mode 100644 index 0000000..8618372 --- /dev/null +++ b/policeManagement/tsconfig.app.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@vue/shared/dist/shared.d.ts","./node_modules/@vue/reactivity/dist/reactivity.d.ts","./node_modules/@vue/runtime-core/dist/runtime-core.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts","./node_modules/vue/jsx-runtime/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@vue/compiler-core/dist/compiler-core.d.ts","./node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts","./node_modules/vue/dist/vue.d.mts","./node_modules/.vue-global-types/vue_3.5_false.d.ts","./node_modules/ant-design-vue/es/modal/locale.d.ts","./node_modules/ant-design-vue/es/_util/type.d.ts","./node_modules/ant-design-vue/es/form/interface.d.ts","./node_modules/vue-types/dist/types.d.ts","./node_modules/vue-types/dist/utils.d.ts","./node_modules/vue-types/dist/validators/native.d.ts","./node_modules/vue-types/dist/validators/custom.d.ts","./node_modules/vue-types/dist/validators/oneof.d.ts","./node_modules/vue-types/dist/validators/oneoftype.d.ts","./node_modules/vue-types/dist/validators/arrayof.d.ts","./node_modules/vue-types/dist/validators/instanceof.d.ts","./node_modules/vue-types/dist/validators/objectof.d.ts","./node_modules/vue-types/dist/validators/shape.d.ts","./node_modules/vue-types/dist/index.d.ts","./node_modules/ant-design-vue/es/transfer/listbody.d.ts","./node_modules/ant-design-vue/es/transfer/interface.d.ts","./node_modules/ant-design-vue/es/transfer/list.d.ts","./node_modules/ant-design-vue/es/config-provider/renderempty.d.ts","./node_modules/ant-design-vue/es/grid/col.d.ts","./node_modules/ant-design-vue/es/form/formitem.d.ts","./node_modules/scroll-into-view-if-needed/typings/types.d.ts","./node_modules/scroll-into-view-if-needed/typings/index.d.ts","./node_modules/ant-design-vue/es/form/useform.d.ts","./node_modules/ant-design-vue/es/form/form.d.ts","./node_modules/ant-design-vue/es/vc-table/interface.d.ts","./node_modules/ant-design-vue/es/vc-trigger/interface.d.ts","./node_modules/ant-design-vue/es/_util/placements.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/theme/interface.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/theme/theme.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/hooks/usecachetoken.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/cache.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/keyframes.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/interface.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/contentquoteslinter.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/hashedanimationlinter.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/legacynotselectorlinter.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/logicalpropertieslinter.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/parentselectorlinter.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/linters/index.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/transformers/interface.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/stylecontext.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/hooks/usestyleregister/index.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/theme/createtheme.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/theme/themecache.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/theme/index.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/transformers/legacylogicalproperties.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/transformers/px2rem.d.ts","./node_modules/ant-design-vue/es/_util/cssinjs/index.d.ts","./node_modules/ant-design-vue/es/theme/util/gencomponentstylehook.d.ts","./node_modules/ant-design-vue/es/theme/util/statistic.d.ts","./node_modules/ant-design-vue/es/theme/internal.d.ts","./node_modules/ant-design-vue/es/alert/style/index.d.ts","./node_modules/ant-design-vue/es/anchor/style/index.d.ts","./node_modules/ant-design-vue/es/avatar/style/index.d.ts","./node_modules/ant-design-vue/es/button/style/index.d.ts","./node_modules/ant-design-vue/es/float-button/style/index.d.ts","./node_modules/ant-design-vue/es/input/style/index.d.ts","./node_modules/ant-design-vue/es/date-picker/style/index.d.ts","./node_modules/ant-design-vue/es/calendar/style/index.d.ts","./node_modules/ant-design-vue/es/card/style/index.d.ts","./node_modules/ant-design-vue/es/carousel/style/index.d.ts","./node_modules/ant-design-vue/es/cascader/style/index.d.ts","./node_modules/ant-design-vue/es/checkbox/style/index.d.ts","./node_modules/ant-design-vue/es/collapse/style/index.d.ts","./node_modules/ant-design-vue/es/divider/style/index.d.ts","./node_modules/ant-design-vue/es/dropdown/style/index.d.ts","./node_modules/ant-design-vue/es/drawer/style/index.d.ts","./node_modules/ant-design-vue/es/empty/style/index.d.ts","./node_modules/ant-design-vue/es/image/style/index.d.ts","./node_modules/ant-design-vue/es/input-number/style/index.d.ts","./node_modules/ant-design-vue/es/layout/style/index.d.ts","./node_modules/ant-design-vue/es/list/style/index.d.ts","./node_modules/ant-design-vue/es/mentions/style/index.d.ts","./node_modules/ant-design-vue/es/menu/style/index.d.ts","./node_modules/ant-design-vue/es/message/style/index.d.ts","./node_modules/ant-design-vue/es/modal/style/index.d.ts","./node_modules/ant-design-vue/es/notification/style/index.d.ts","./node_modules/ant-design-vue/es/popconfirm/style/index.d.ts","./node_modules/ant-design-vue/es/popover/style/index.d.ts","./node_modules/ant-design-vue/es/progress/style/index.d.ts","./node_modules/ant-design-vue/es/radio/style/index.d.ts","./node_modules/ant-design-vue/es/rate/style/index.d.ts","./node_modules/ant-design-vue/es/result/style/index.d.ts","./node_modules/ant-design-vue/es/segmented/style/index.d.ts","./node_modules/ant-design-vue/es/select/style/index.d.ts","./node_modules/ant-design-vue/es/skeleton/style/index.d.ts","./node_modules/ant-design-vue/es/slider/style/index.d.ts","./node_modules/ant-design-vue/es/space/style/index.d.ts","./node_modules/ant-design-vue/es/spin/style/index.d.ts","./node_modules/ant-design-vue/es/steps/style/index.d.ts","./node_modules/ant-design-vue/es/table/style/index.d.ts","./node_modules/ant-design-vue/es/tabs/style/index.d.ts","./node_modules/ant-design-vue/es/tag/style/index.d.ts","./node_modules/ant-design-vue/es/timeline/style/index.d.ts","./node_modules/ant-design-vue/es/tooltip/style/index.d.ts","./node_modules/ant-design-vue/es/transfer/style/index.d.ts","./node_modules/ant-design-vue/es/typography/style/index.d.ts","./node_modules/ant-design-vue/es/upload/style/index.d.ts","./node_modules/ant-design-vue/es/tour/style/index.d.ts","./node_modules/ant-design-vue/es/qrcode/style/index.d.ts","./node_modules/ant-design-vue/es/app/style/index.d.ts","./node_modules/ant-design-vue/es/_util/wave/style.d.ts","./node_modules/ant-design-vue/es/flex/style/index.d.ts","./node_modules/ant-design-vue/es/theme/interface/components.d.ts","./node_modules/ant-design-vue/es/theme/interface/presetcolors.d.ts","./node_modules/ant-design-vue/es/theme/interface/seeds.d.ts","./node_modules/ant-design-vue/es/theme/interface/maps/size.d.ts","./node_modules/ant-design-vue/es/theme/interface/maps/colors.d.ts","./node_modules/ant-design-vue/es/theme/interface/maps/style.d.ts","./node_modules/ant-design-vue/es/theme/interface/maps/font.d.ts","./node_modules/ant-design-vue/es/theme/interface/maps/index.d.ts","./node_modules/ant-design-vue/es/theme/interface/alias.d.ts","./node_modules/ant-design-vue/es/theme/interface/index.d.ts","./node_modules/ant-design-vue/es/_util/colors.d.ts","./node_modules/ant-design-vue/es/tooltip/abstracttooltipprops.d.ts","./node_modules/ant-design-vue/es/tooltip/tooltip.d.ts","./node_modules/ant-design-vue/es/tooltip/index.d.ts","./node_modules/ant-design-vue/es/_util/eventinterface.d.ts","./node_modules/ant-design-vue/es/checkbox/interface.d.ts","./node_modules/ant-design-vue/es/checkbox/group.d.ts","./node_modules/ant-design-vue/es/checkbox/index.d.ts","./node_modules/ant-design-vue/es/pagination/pagination.d.ts","./node_modules/ant-design-vue/es/pagination/index.d.ts","./node_modules/ant-design-vue/es/_util/responsiveobserve.d.ts","./node_modules/ant-design-vue/es/table/hooks/useselection.d.ts","./node_modules/ant-design-vue/es/table/interface.d.ts","./node_modules/ant-design-vue/es/config-provider/context.d.ts","./node_modules/ant-design-vue/es/config-provider/index.d.ts","./node_modules/ant-design-vue/es/transfer/operation.d.ts","./node_modules/ant-design-vue/es/transfer/search.d.ts","./node_modules/ant-design-vue/es/transfer/index.d.ts","./node_modules/ant-design-vue/es/vc-picker/generate/index.d.ts","./node_modules/ant-design-vue/es/vc-picker/interface.d.ts","./node_modules/ant-design-vue/es/vc-picker/panels/timepanel/index.d.ts","./node_modules/ant-design-vue/es/tag/checkabletag.d.ts","./node_modules/ant-design-vue/es/tag/index.d.ts","./node_modules/ant-design-vue/es/date-picker/pickertag.d.ts","./node_modules/ant-design-vue/es/vc-picker/panels/datepanel/datebody.d.ts","./node_modules/ant-design-vue/es/vc-picker/panels/monthpanel/monthbody.d.ts","./node_modules/ant-design-vue/es/vc-picker/pickerpanel.d.ts","./node_modules/ant-design-vue/es/vc-align/interface.d.ts","./node_modules/ant-design-vue/es/vc-picker/picker.d.ts","./node_modules/ant-design-vue/es/vc-picker/rangepicker.d.ts","./node_modules/dayjs/locale/types.d.ts","./node_modules/dayjs/locale/index.d.ts","./node_modules/dayjs/index.d.ts","./node_modules/ant-design-vue/es/_util/statusutils.d.ts","./node_modules/ant-design-vue/es/date-picker/generatepicker/props.d.ts","./node_modules/ant-design-vue/es/time-picker/time-picker.d.ts","./node_modules/ant-design-vue/es/time-picker/dayjs.d.ts","./node_modules/ant-design-vue/es/time-picker/index.d.ts","./node_modules/ant-design-vue/es/date-picker/generatepicker/interface.d.ts","./node_modules/ant-design-vue/es/button/button-group.d.ts","./node_modules/ant-design-vue/es/button/buttontypes.d.ts","./node_modules/ant-design-vue/es/button/index.d.ts","./node_modules/ant-design-vue/es/date-picker/generatepicker/index.d.ts","./node_modules/ant-design-vue/es/vc-upload/interface.d.ts","./node_modules/ant-design-vue/es/progress/props.d.ts","./node_modules/ant-design-vue/es/progress/index.d.ts","./node_modules/ant-design-vue/es/upload/interface.d.ts","./node_modules/ant-design-vue/es/vc-tour/placements.d.ts","./node_modules/ant-design-vue/es/vc-tour/interface.d.ts","./node_modules/ant-design-vue/es/vc-tour/tour.d.ts","./node_modules/ant-design-vue/es/vc-tour/index.d.ts","./node_modules/ant-design-vue/es/vc-tour/hooks/usetarget.d.ts","./node_modules/ant-design-vue/es/tour/interface.d.ts","./node_modules/ant-design-vue/es/locale/index.d.ts","./node_modules/ant-design-vue/es/locale-provider/index.d.ts","./node_modules/ant-design-vue/es/locale/zh_cn.d.ts","./node_modules/ant-design-vue/es/version/version.d.ts","./node_modules/ant-design-vue/es/version/index.d.ts","./node_modules/ant-design-vue/es/affix/index.d.ts","./node_modules/ant-design-vue/es/anchor/anchorlink.d.ts","./node_modules/ant-design-vue/es/anchor/anchor.d.ts","./node_modules/ant-design-vue/es/anchor/index.d.ts","./node_modules/ant-design-vue/es/vc-virtual-list/list.d.ts","./node_modules/ant-design-vue/es/vc-select/baseselect.d.ts","./node_modules/ant-design-vue/es/vc-select/select.d.ts","./node_modules/ant-design-vue/es/vc-select/option.d.ts","./node_modules/ant-design-vue/es/vc-select/optgroup.d.ts","./node_modules/ant-design-vue/es/vc-select/hooks/usebaseprops.d.ts","./node_modules/ant-design-vue/es/vc-select/index.d.ts","./node_modules/ant-design-vue/es/select/index.d.ts","./node_modules/ant-design-vue/es/auto-complete/option.d.ts","./node_modules/ant-design-vue/es/auto-complete/optgroup.d.ts","./node_modules/ant-design-vue/es/auto-complete/index.d.ts","./node_modules/ant-design-vue/es/vc-tree/tree.d.ts","./node_modules/ant-design-vue/es/vc-tree/treenode.d.ts","./node_modules/ant-design-vue/es/vc-tree/index.d.ts","./node_modules/ant-design-vue/es/vc-tree/props.d.ts","./node_modules/ant-design-vue/es/vc-tree/interface.d.ts","./node_modules/ant-design-vue/es/vc-tree/contexttypes.d.ts","./node_modules/ant-design-vue/es/alert/index.d.ts","./node_modules/ant-design-vue/es/avatar/avatar.d.ts","./node_modules/ant-design-vue/es/avatar/group.d.ts","./node_modules/ant-design-vue/es/avatar/index.d.ts","./node_modules/ant-design-vue/es/badge/ribbon.d.ts","./node_modules/ant-design-vue/es/badge/badge.d.ts","./node_modules/ant-design-vue/es/badge/index.d.ts","./node_modules/ant-design-vue/es/menu/src/menuitem.d.ts","./node_modules/ant-design-vue/es/menu/src/interface.d.ts","./node_modules/ant-design-vue/es/_util/transition.d.ts","./node_modules/ant-design-vue/es/menu/src/hooks/usemenucontext.d.ts","./node_modules/ant-design-vue/es/menu/src/hooks/useitems.d.ts","./node_modules/ant-design-vue/es/menu/src/menu.d.ts","./node_modules/ant-design-vue/es/menu/src/submenu.d.ts","./node_modules/ant-design-vue/es/menu/src/itemgroup.d.ts","./node_modules/ant-design-vue/es/menu/src/divider.d.ts","./node_modules/ant-design-vue/es/menu/index.d.ts","./node_modules/ant-design-vue/es/dropdown/props.d.ts","./node_modules/ant-design-vue/es/breadcrumb/breadcrumbitem.d.ts","./node_modules/ant-design-vue/es/breadcrumb/breadcrumbseparator.d.ts","./node_modules/ant-design-vue/es/breadcrumb/breadcrumb.d.ts","./node_modules/ant-design-vue/es/breadcrumb/index.d.ts","./node_modules/ant-design-vue/es/date-picker/locale/en_us.d.ts","./node_modules/ant-design-vue/es/calendar/locale/en_us.d.ts","./node_modules/ant-design-vue/es/calendar/generatecalendar.d.ts","./node_modules/ant-design-vue/es/calendar/dayjs.d.ts","./node_modules/ant-design-vue/es/calendar/index.d.ts","./node_modules/ant-design-vue/es/card/meta.d.ts","./node_modules/ant-design-vue/es/card/grid.d.ts","./node_modules/ant-design-vue/es/card/card.d.ts","./node_modules/ant-design-vue/es/card/index.d.ts","./node_modules/ant-design-vue/es/collapse/commonprops.d.ts","./node_modules/ant-design-vue/es/collapse/collapsepanel.d.ts","./node_modules/ant-design-vue/es/collapse/collapse.d.ts","./node_modules/ant-design-vue/es/collapse/index.d.ts","./node_modules/ant-design-vue/es/carousel/index.d.ts","./node_modules/ant-design-vue/es/vc-cascader/utils/commonutil.d.ts","./node_modules/ant-design-vue/es/vc-cascader/cascader.d.ts","./node_modules/ant-design-vue/es/vc-cascader/index.d.ts","./node_modules/ant-design-vue/es/cascader/index.d.ts","./node_modules/ant-design-vue/es/grid/row.d.ts","./node_modules/ant-design-vue/es/_util/hooks/usebreakpoint.d.ts","./node_modules/ant-design-vue/es/grid/index.d.ts","./node_modules/ant-design-vue/es/col/index.d.ts","./node_modules/ant-design-vue/es/comment/index.d.ts","./node_modules/ant-design-vue/es/date-picker/dayjs.d.ts","./node_modules/ant-design-vue/es/date-picker/index.d.ts","./node_modules/ant-design-vue/es/descriptions/index.d.ts","./node_modules/ant-design-vue/es/divider/index.d.ts","./node_modules/ant-design-vue/es/dropdown/dropdown-button.d.ts","./node_modules/ant-design-vue/es/dropdown/dropdown.d.ts","./node_modules/ant-design-vue/es/dropdown/index.d.ts","./node_modules/ant-design-vue/es/drawer/index.d.ts","./node_modules/ant-design-vue/es/empty/index.d.ts","./node_modules/ant-design-vue/es/float-button/interface.d.ts","./node_modules/ant-design-vue/es/float-button/floatbuttongroup.d.ts","./node_modules/ant-design-vue/es/float-button/backtop.d.ts","./node_modules/ant-design-vue/es/float-button/index.d.ts","./node_modules/ant-design-vue/es/form/formitemcontext.d.ts","./node_modules/ant-design-vue/es/form/index.d.ts","./node_modules/ant-design-vue/es/input/group.d.ts","./node_modules/ant-design-vue/es/vc-input/utils/commonutils.d.ts","./node_modules/ant-design-vue/es/vc-input/inputprops.d.ts","./node_modules/ant-design-vue/es/input/search.d.ts","./node_modules/ant-design-vue/es/input/inputprops.d.ts","./node_modules/ant-design-vue/es/input/textarea.d.ts","./node_modules/ant-design-vue/es/input/password.d.ts","./node_modules/ant-design-vue/es/input/index.d.ts","./node_modules/ant-design-vue/es/vc-dialog/idialogproptypes.d.ts","./node_modules/ant-design-vue/es/vc-image/src/preview.d.ts","./node_modules/ant-design-vue/es/vc-image/src/previewgroup.d.ts","./node_modules/ant-design-vue/es/vc-image/src/image.d.ts","./node_modules/ant-design-vue/es/image/previewgroup.d.ts","./node_modules/ant-design-vue/es/vc-image/index.d.ts","./node_modules/ant-design-vue/es/image/index.d.ts","./node_modules/ant-design-vue/es/input-number/src/utils/minidecimal.d.ts","./node_modules/ant-design-vue/es/input-number/index.d.ts","./node_modules/ant-design-vue/es/layout/layout.d.ts","./node_modules/ant-design-vue/es/layout/sider.d.ts","./node_modules/ant-design-vue/es/layout/index.d.ts","./node_modules/ant-design-vue/es/list/item.d.ts","./node_modules/ant-design-vue/es/list/itemmeta.d.ts","./node_modules/ant-design-vue/es/spin/spin.d.ts","./node_modules/ant-design-vue/es/list/index.d.ts","./node_modules/ant-design-vue/es/vc-notification/notice.d.ts","./node_modules/ant-design-vue/es/vc-notification/notification.d.ts","./node_modules/ant-design-vue/es/message/interface.d.ts","./node_modules/ant-design-vue/es/message/usemessage.d.ts","./node_modules/ant-design-vue/es/message/index.d.ts","./node_modules/ant-design-vue/es/vc-mentions/src/option.d.ts","./node_modules/ant-design-vue/es/vc-mentions/src/mentionsprops.d.ts","./node_modules/ant-design-vue/es/vc-mentions/src/mentions.d.ts","./node_modules/ant-design-vue/es/vc-mentions/src/util.d.ts","./node_modules/ant-design-vue/es/mentions/index.d.ts","./node_modules/ant-design-vue/es/modal/modal.d.ts","./node_modules/ant-design-vue/es/modal/confirm.d.ts","./node_modules/ant-design-vue/es/modal/usemodal/index.d.ts","./node_modules/ant-design-vue/es/_util/actionbutton.d.ts","./node_modules/ant-design-vue/es/modal/index.d.ts","./node_modules/ant-design-vue/es/statistic/utils.d.ts","./node_modules/ant-design-vue/es/statistic/countdown.d.ts","./node_modules/ant-design-vue/es/statistic/statistic.d.ts","./node_modules/ant-design-vue/es/statistic/index.d.ts","./node_modules/ant-design-vue/es/notification/interface.d.ts","./node_modules/ant-design-vue/es/notification/usenotification.d.ts","./node_modules/ant-design-vue/es/notification/index.d.ts","./node_modules/ant-design-vue/es/page-header/index.d.ts","./node_modules/ant-design-vue/es/popconfirm/index.d.ts","./node_modules/ant-design-vue/es/popover/index.d.ts","./node_modules/ant-design-vue/es/radio/radio.d.ts","./node_modules/ant-design-vue/es/radio/interface.d.ts","./node_modules/ant-design-vue/es/radio/group.d.ts","./node_modules/ant-design-vue/es/radio/radiobutton.d.ts","./node_modules/ant-design-vue/es/radio/index.d.ts","./node_modules/ant-design-vue/es/rate/index.d.ts","./node_modules/ant-design-vue/es/result/nofound.d.ts","./node_modules/ant-design-vue/es/result/servererror.d.ts","./node_modules/ant-design-vue/es/result/unauthorized.d.ts","./node_modules/@ant-design/icons-vue/lib/components/icon.d.ts","./node_modules/@ant-design/icons-svg/lib/types.d.ts","./node_modules/@ant-design/icons-vue/lib/components/twotoneprimarycolor.d.ts","./node_modules/@ant-design/icons-vue/lib/components/antdicon.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checkcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closecirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/exclamationcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/warningfilled.d.ts","./node_modules/ant-design-vue/es/result/index.d.ts","./node_modules/ant-design-vue/es/row/index.d.ts","./node_modules/ant-design-vue/es/skeleton/button.d.ts","./node_modules/ant-design-vue/es/skeleton/element.d.ts","./node_modules/ant-design-vue/es/skeleton/input.d.ts","./node_modules/ant-design-vue/es/skeleton/image.d.ts","./node_modules/ant-design-vue/es/skeleton/avatar.d.ts","./node_modules/ant-design-vue/es/skeleton/title.d.ts","./node_modules/ant-design-vue/es/skeleton/skeleton.d.ts","./node_modules/ant-design-vue/es/skeleton/index.d.ts","./node_modules/ant-design-vue/es/slider/index.d.ts","./node_modules/ant-design-vue/es/space/compact.d.ts","./node_modules/ant-design-vue/es/space/index.d.ts","./node_modules/ant-design-vue/es/spin/index.d.ts","./node_modules/ant-design-vue/es/vc-steps/interface.d.ts","./node_modules/ant-design-vue/es/steps/index.d.ts","./node_modules/ant-design-vue/es/switch/index.d.ts","./node_modules/ant-design-vue/es/vc-table/table.d.ts","./node_modules/ant-design-vue/es/table/table.d.ts","./node_modules/ant-design-vue/es/table/column.d.ts","./node_modules/ant-design-vue/es/vc-table/sugar/columngroup.d.ts","./node_modules/ant-design-vue/es/table/columngroup.d.ts","./node_modules/ant-design-vue/es/vc-table/footer/cell.d.ts","./node_modules/ant-design-vue/es/vc-table/footer/summary.d.ts","./node_modules/ant-design-vue/es/table/index.d.ts","./node_modules/ant-design-vue/es/tree/tree.d.ts","./node_modules/ant-design-vue/es/tree/directorytree.d.ts","./node_modules/ant-design-vue/es/tree/index.d.ts","./node_modules/ant-design-vue/es/vc-tree-select/interface.d.ts","./node_modules/ant-design-vue/es/vc-tree-select/utils/strategyutil.d.ts","./node_modules/ant-design-vue/es/vc-tree-select/treeselect.d.ts","./node_modules/ant-design-vue/es/vc-tree-select/treenode.d.ts","./node_modules/ant-design-vue/es/tree-select/index.d.ts","./node_modules/ant-design-vue/es/tabs/src/tabpanellist/tabpane.d.ts","./node_modules/ant-design-vue/es/tabs/src/interface.d.ts","./node_modules/ant-design-vue/es/tabs/src/tabs.d.ts","./node_modules/ant-design-vue/es/tabs/src/index.d.ts","./node_modules/ant-design-vue/es/tabs/index.d.ts","./node_modules/ant-design-vue/es/timeline/timeline.d.ts","./node_modules/ant-design-vue/es/timeline/timelineitem.d.ts","./node_modules/ant-design-vue/es/timeline/index.d.ts","./node_modules/ant-design-vue/es/typography/typography.d.ts","./node_modules/ant-design-vue/es/typography/base.d.ts","./node_modules/ant-design-vue/es/typography/link.d.ts","./node_modules/ant-design-vue/es/typography/paragraph.d.ts","./node_modules/ant-design-vue/es/typography/text.d.ts","./node_modules/ant-design-vue/es/typography/title.d.ts","./node_modules/ant-design-vue/es/typography/index.d.ts","./node_modules/ant-design-vue/es/upload/index.d.ts","./node_modules/ant-design-vue/es/watermark/index.d.ts","./node_modules/ant-design-vue/es/segmented/src/segmented.d.ts","./node_modules/ant-design-vue/es/segmented/src/index.d.ts","./node_modules/ant-design-vue/es/segmented/index.d.ts","./node_modules/ant-design-vue/es/qrcode/interface.d.ts","./node_modules/ant-design-vue/es/qrcode/index.d.ts","./node_modules/ant-design-vue/es/tour/index.d.ts","./node_modules/ant-design-vue/es/app/context.d.ts","./node_modules/ant-design-vue/es/app/index.d.ts","./node_modules/ant-design-vue/es/flex/interface.d.ts","./node_modules/ant-design-vue/es/flex/index.d.ts","./node_modules/ant-design-vue/es/components.d.ts","./node_modules/ant-design-vue/es/theme/themes/default/index.d.ts","./node_modules/ant-design-vue/es/theme/index.d.ts","./node_modules/ant-design-vue/es/index.d.ts","./src/app.vue","./node_modules/vue-router/dist/vue-router.d.ts","./src/types/components/iconfont/iconfont.ts","./src/components/iconfont/iconfont.vue","./node_modules/@ant-design/icons-vue/lib/icons/accountbookfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/accountbookoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/accountbooktwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/aimoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alertfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alertoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alerttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alibabaoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/aligncenteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alignleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alignrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alipaycirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alipaycircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alipayoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/alipaysquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/aliwangwangfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/aliwangwangoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/aliyunoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/amazoncirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/amazonoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/amazonsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/androidfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/androidoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/antcloudoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/antdesignoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/apartmentoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/apifilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/apioutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/apitwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/applefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/appleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/appstoreaddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/appstorefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/appstoreoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/appstoretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/areachartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/arrowdownoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/arrowleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/arrowrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/arrowupoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/arrowsaltoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/audiofilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/audiomutedoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/audiooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/audiotwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/auditoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/backwardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/backwardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bankfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bankoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/banktwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/barchartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/barcodeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/barsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/behancecirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/behanceoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/behancesquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/behancesquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bellfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/belloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/belltwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bgcolorsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/blockoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/boldoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bookfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bookoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/booktwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderbottomoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderhorizontaloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderinneroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderouteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bordertopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderverticleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/borderlesstableoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/boxplotfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/boxplotoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/boxplottwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/branchesoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bugfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bugoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bugtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/buildfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/buildoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/buildtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bulbfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bulboutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/bulbtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/calculatorfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/calculatoroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/calculatortwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/calendarfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/calendaroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/calendartwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/camerafilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cameraoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cameratwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/carfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cartwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretdownfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretdownoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretleftfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretrightfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretupfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/caretupoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/carryoutfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/carryoutoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/carryouttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checkcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checkcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checksquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checksquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/checksquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/chromefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/chromeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cicirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cicircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cicircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cioutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/citwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clearoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clockcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clockcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clockcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closecircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closecircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closesquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closesquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/closesquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clouddownloadoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cloudfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cloudoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cloudserveroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cloudsyncoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/cloudtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clouduploadoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/clusteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codesandboxcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codesandboxoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codesandboxsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codepencirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codepencircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codepenoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/codepensquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/coffeeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/columnheightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/columnwidthoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/commentoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/compassfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/compassoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/compasstwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/compressoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/consolesqloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/contactsfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/contactsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/contactstwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/containerfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/containeroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/containertwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/controlfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/controloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/controltwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copytwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyrightcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyrightcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyrightcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/copyrighttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/creditcardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/creditcardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/creditcardtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/crownfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/crownoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/crowntwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/customerservicefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/customerserviceoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/customerservicetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dashoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dashboardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dashboardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dashboardtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/databasefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/databaseoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/databasetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deletecolumnoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deletefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deleteoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deleterowoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deletetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deliveredprocedureoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/deploymentunitoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/desktopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/difffilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/diffoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/difftwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dingdingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dingtalkcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dingtalkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dingtalksquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/disconnectoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dislikefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dislikeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/disliketwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dollarcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dollarcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dollarcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dollaroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dollartwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dotchartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/doubleleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/doublerightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downsquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downsquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/downloadoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dragoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dribbblecirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dribbbleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dribbblesquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dribbblesquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dropboxcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dropboxoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/dropboxsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/editfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/editoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/edittwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/ellipsisoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/enteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/environmentfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/environmentoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/environmenttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eurocirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eurocircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eurocircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eurooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eurotwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/exceptionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/exclamationcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/exclamationcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/exclamationoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/expandaltoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/expandoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/experimentfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/experimentoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/experimenttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/exportoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eyefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eyeinvisiblefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eyeinvisibleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eyeinvisibletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eyeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/eyetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/facebookfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/facebookoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/falloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fastbackwardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fastbackwardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fastforwardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fastforwardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fieldbinaryoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fieldnumberoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fieldstringoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fieldtimeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileaddfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileaddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileaddtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filedoneoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileexcelfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileexceloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileexceltwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileexclamationfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileexclamationoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileexclamationtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filegifoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileimagefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileimageoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileimagetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filejpgoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filemarkdownfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filemarkdownoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filemarkdowntwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filepdffilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filepdfoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filepdftwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filepptfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filepptoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileppttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileprotectoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filesearchoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filesyncoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filetextfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filetextoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filetexttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileunknownfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileunknownoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileunknowntwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filewordfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filewordoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filewordtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filezipfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filezipoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fileziptwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filterfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/filtertwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/firefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fireoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/firetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/flagfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/flagoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/flagtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderaddfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderaddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderaddtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderopenfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderopenoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderopentwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/foldertwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/folderviewoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fontcolorsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fontsizeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/forkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/formoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/formatpainterfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/formatpainteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/forwardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/forwardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/frownfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/frownoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/frowntwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fullscreenexitoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fullscreenoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/functionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fundfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fundoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fundprojectionscreenoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fundtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/fundviewoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/funnelplotfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/funnelplotoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/funnelplottwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/gatewayoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/gifoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/giftfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/giftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/gifttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/githubfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/githuboutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/gitlabfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/gitlaboutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/globaloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/goldfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/goldoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/goldtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/goldenfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/googlecirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/googleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/googlepluscirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/googleplusoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/googleplussquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/googlesquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/groupoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hddfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hddtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/heartfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/heartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hearttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/heatmapoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/highlightfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/highlightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/highlighttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/historyoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/holderoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/homefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/homeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hometwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hourglassfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hourglassoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/hourglasstwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/html5filled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/html5outlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/html5twotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/idcardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/idcardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/idcardtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/iecirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/ieoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/iesquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/importoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/inboxoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/infocirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/infocircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/infocircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/infooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insertrowaboveoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insertrowbelowoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insertrowleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insertrowrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/instagramfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/instagramoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insurancefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insuranceoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/insurancetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/interactionfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/interactionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/interactiontwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/issuescloseoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/italicoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/keyoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/laptopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/layoutfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/layoutoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/layouttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftsquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/leftsquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/likefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/likeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/liketwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/linechartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/lineheightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/lineoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/linkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/linkedinfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/linkedinoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/loading3quartersoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/loadingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/lockfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/lockoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/locktwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/loginoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/logoutoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/maccommandfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/maccommandoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mailfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mailoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mailtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/manoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/medicineboxfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/medicineboxoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/medicineboxtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mediumcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mediumoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mediumsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mediumworkmarkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mehfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mehoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mehtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/menufoldoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/menuoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/menuunfoldoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mergecellsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/messagefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/messageoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/messagetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minuscirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minuscircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minuscircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minusoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minussquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minussquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/minussquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mobilefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mobileoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/mobiletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/moneycollectfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/moneycollectoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/moneycollecttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/monitoroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/moreoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/nodecollapseoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/nodeexpandoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/nodeindexoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/notificationfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/notificationoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/notificationtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/numberoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/onetooneoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/orderedlistoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/paperclipoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/partitionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pausecirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pausecircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pausecircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pauseoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/paycirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/paycircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/percentageoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/phonefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/phoneoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/phonetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/piccenteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/picleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/picrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/picturefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pictureoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/picturetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/piechartfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/piechartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/piecharttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/playcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/playcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/playcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/playsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/playsquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/playsquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pluscirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pluscircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pluscircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/plusoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/plussquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/plussquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/plussquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/poundcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/poundcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/poundcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/poundoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/poweroffoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/printerfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/printeroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/printertwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/profilefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/profileoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/profiletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/projectfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/projectoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/projecttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/propertysafetyfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/propertysafetyoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/propertysafetytwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pullrequestoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pushpinfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pushpinoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/pushpintwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/qqcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/qqoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/qqsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/qrcodeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/questioncirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/questioncircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/questioncircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/questionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/radarchartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/radiusbottomleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/radiusbottomrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/radiussettingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/radiusupleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/radiusuprightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/readfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/readoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/reconciliationfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/reconciliationoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/reconciliationtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redenvelopefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redenvelopeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redenvelopetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redditcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redditoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redditsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/redooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/reloadoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/restfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/restoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/resttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/retweetoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightsquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rightsquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/riseoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/robotfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/robotoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rocketfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rocketoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rockettwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rollbackoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rotateleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/rotaterightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/safetycertificatefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/safetycertificateoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/safetycertificatetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/safetyoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/savefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/saveoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/savetwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/scanoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/schedulefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/scheduleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/scheduletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/scissoroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/searchoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/securityscanfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/securityscanoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/securityscantwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/selectoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sendoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/settingfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/settingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/settingtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shakeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sharealtoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shopfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shoptwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shoppingcartoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shoppingfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shoppingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shoppingtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/shrinkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/signalfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sisternodeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sketchcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sketchoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sketchsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/skinfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/skinoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/skintwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/skypefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/skypeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/slackcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/slackoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/slacksquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/slacksquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/slidersfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/slidersoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sliderstwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/smalldashoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/smilefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/smileoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/smiletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/snippetsfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/snippetsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/snippetstwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/solutionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sortascendingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/sortdescendingoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/soundfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/soundoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/soundtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/splitcellsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/starfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/staroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/startwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stepbackwardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stepbackwardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stepforwardfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stepforwardoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stockoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stopfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/stoptwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/strikethroughoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/subnodeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/swapleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/swapoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/swaprightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/switcherfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/switcheroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/switchertwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/syncoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tableoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tabletfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tabletoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tablettwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tagfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tagoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tagtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tagsfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tagsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tagstwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/taobaocirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/taobaocircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/taobaooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/taobaosquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/teamoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/thunderboltfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/thunderboltoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/thunderbolttwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/totopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/toolfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tooloutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/tooltwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trademarkcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trademarkcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trademarkcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trademarkoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/transactionoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/translationoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trophyfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trophyoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/trophytwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/twittercirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/twitteroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/twittersquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/underlineoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/undooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/ungroupoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/unlockfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/unlockoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/unlocktwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/unorderedlistoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upcirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upcircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upcircletwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upsquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upsquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/upsquaretwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/uploadoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/usbfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/usboutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/usbtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/useraddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/userdeleteoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/useroutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/userswitchoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/usergroupaddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/usergroupdeleteoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/verifiedoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/verticalalignbottomoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/verticalalignmiddleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/verticalaligntopoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/verticalleftoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/verticalrightoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/videocameraaddoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/videocamerafilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/videocameraoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/videocameratwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/walletfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/walletoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/wallettwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/warningoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/warningtwotone.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/wechatfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/wechatoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/weibocirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/weibocircleoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/weibooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/weibosquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/weibosquareoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/whatsappoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/wifioutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/windowsfilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/windowsoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/womanoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/yahoofilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/yahoooutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/youtubefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/youtubeoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/yuquefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/yuqueoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/zhihucirclefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/zhihuoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/zhihusquarefilled.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/zoominoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/zoomoutoutlined.d.ts","./node_modules/@ant-design/icons-vue/lib/icons/index.d.ts","./node_modules/@ant-design/icons-vue/lib/components/iconfont.d.ts","./node_modules/@ant-design/icons-vue/lib/index.d.ts","./node_modules/vue-demi/lib/index.d.ts","./node_modules/pinia/dist/pinia.d.ts","./src/types/stores/userstore.ts","./src/stores/modules/userstore.ts","./src/components/layout/header/layoutheader.vue","./src/components/layout/layout.vue","./src/views/dashboard/index.vue","./node_modules/vue-component-type-helpers/index.d.ts","./src/types/components/form/index.ts","./src/components/form/formpromax.vue","./src/types/hooks/usetablepromax.ts","./node_modules/ant-design-vue/lib/vc-table/interface.d.ts","./node_modules/ant-design-vue/lib/_util/type.d.ts","./node_modules/ant-design-vue/lib/vc-trigger/interface.d.ts","./node_modules/ant-design-vue/lib/_util/placements.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/theme/interface.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/theme/theme.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/hooks/usecachetoken.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/cache.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/keyframes.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/interface.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/contentquoteslinter.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/hashedanimationlinter.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/legacynotselectorlinter.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/logicalpropertieslinter.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/parentselectorlinter.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/linters/index.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/transformers/interface.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/stylecontext.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/hooks/usestyleregister/index.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/theme/createtheme.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/theme/themecache.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/theme/index.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/transformers/legacylogicalproperties.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/transformers/px2rem.d.ts","./node_modules/ant-design-vue/lib/_util/cssinjs/index.d.ts","./node_modules/ant-design-vue/lib/theme/util/gencomponentstylehook.d.ts","./node_modules/ant-design-vue/lib/theme/util/statistic.d.ts","./node_modules/ant-design-vue/lib/theme/internal.d.ts","./node_modules/ant-design-vue/lib/alert/style/index.d.ts","./node_modules/ant-design-vue/lib/anchor/style/index.d.ts","./node_modules/ant-design-vue/lib/avatar/style/index.d.ts","./node_modules/ant-design-vue/lib/button/style/index.d.ts","./node_modules/ant-design-vue/lib/float-button/style/index.d.ts","./node_modules/ant-design-vue/lib/input/style/index.d.ts","./node_modules/ant-design-vue/lib/date-picker/style/index.d.ts","./node_modules/ant-design-vue/lib/calendar/style/index.d.ts","./node_modules/ant-design-vue/lib/card/style/index.d.ts","./node_modules/ant-design-vue/lib/carousel/style/index.d.ts","./node_modules/ant-design-vue/lib/cascader/style/index.d.ts","./node_modules/ant-design-vue/lib/checkbox/style/index.d.ts","./node_modules/ant-design-vue/lib/collapse/style/index.d.ts","./node_modules/ant-design-vue/lib/divider/style/index.d.ts","./node_modules/ant-design-vue/lib/dropdown/style/index.d.ts","./node_modules/ant-design-vue/lib/drawer/style/index.d.ts","./node_modules/ant-design-vue/lib/empty/style/index.d.ts","./node_modules/ant-design-vue/lib/image/style/index.d.ts","./node_modules/ant-design-vue/lib/input-number/style/index.d.ts","./node_modules/ant-design-vue/lib/layout/style/index.d.ts","./node_modules/ant-design-vue/lib/list/style/index.d.ts","./node_modules/ant-design-vue/lib/mentions/style/index.d.ts","./node_modules/ant-design-vue/lib/menu/style/index.d.ts","./node_modules/ant-design-vue/lib/message/style/index.d.ts","./node_modules/ant-design-vue/lib/modal/style/index.d.ts","./node_modules/ant-design-vue/lib/notification/style/index.d.ts","./node_modules/ant-design-vue/lib/popconfirm/style/index.d.ts","./node_modules/ant-design-vue/lib/popover/style/index.d.ts","./node_modules/ant-design-vue/lib/progress/style/index.d.ts","./node_modules/ant-design-vue/lib/radio/style/index.d.ts","./node_modules/ant-design-vue/lib/rate/style/index.d.ts","./node_modules/ant-design-vue/lib/result/style/index.d.ts","./node_modules/ant-design-vue/lib/segmented/style/index.d.ts","./node_modules/ant-design-vue/lib/select/style/index.d.ts","./node_modules/ant-design-vue/lib/skeleton/style/index.d.ts","./node_modules/ant-design-vue/lib/slider/style/index.d.ts","./node_modules/ant-design-vue/lib/space/style/index.d.ts","./node_modules/ant-design-vue/lib/spin/style/index.d.ts","./node_modules/ant-design-vue/lib/steps/style/index.d.ts","./node_modules/ant-design-vue/lib/table/style/index.d.ts","./node_modules/ant-design-vue/lib/tabs/style/index.d.ts","./node_modules/ant-design-vue/lib/tag/style/index.d.ts","./node_modules/ant-design-vue/lib/timeline/style/index.d.ts","./node_modules/ant-design-vue/lib/tooltip/style/index.d.ts","./node_modules/ant-design-vue/lib/transfer/style/index.d.ts","./node_modules/ant-design-vue/lib/typography/style/index.d.ts","./node_modules/ant-design-vue/lib/upload/style/index.d.ts","./node_modules/ant-design-vue/lib/tour/style/index.d.ts","./node_modules/ant-design-vue/lib/qrcode/style/index.d.ts","./node_modules/ant-design-vue/lib/app/style/index.d.ts","./node_modules/ant-design-vue/lib/_util/wave/style.d.ts","./node_modules/ant-design-vue/lib/flex/style/index.d.ts","./node_modules/ant-design-vue/lib/theme/interface/components.d.ts","./node_modules/ant-design-vue/lib/theme/interface/presetcolors.d.ts","./node_modules/ant-design-vue/lib/theme/interface/seeds.d.ts","./node_modules/ant-design-vue/lib/theme/interface/maps/size.d.ts","./node_modules/ant-design-vue/lib/theme/interface/maps/colors.d.ts","./node_modules/ant-design-vue/lib/theme/interface/maps/style.d.ts","./node_modules/ant-design-vue/lib/theme/interface/maps/font.d.ts","./node_modules/ant-design-vue/lib/theme/interface/maps/index.d.ts","./node_modules/ant-design-vue/lib/theme/interface/alias.d.ts","./node_modules/ant-design-vue/lib/theme/interface/index.d.ts","./node_modules/ant-design-vue/lib/_util/colors.d.ts","./node_modules/ant-design-vue/lib/tooltip/abstracttooltipprops.d.ts","./node_modules/ant-design-vue/lib/tooltip/tooltip.d.ts","./node_modules/ant-design-vue/lib/tooltip/index.d.ts","./node_modules/ant-design-vue/lib/_util/eventinterface.d.ts","./node_modules/ant-design-vue/lib/checkbox/interface.d.ts","./node_modules/ant-design-vue/lib/checkbox/group.d.ts","./node_modules/ant-design-vue/lib/checkbox/index.d.ts","./node_modules/ant-design-vue/lib/pagination/pagination.d.ts","./node_modules/ant-design-vue/lib/pagination/index.d.ts","./node_modules/ant-design-vue/lib/_util/responsiveobserve.d.ts","./node_modules/ant-design-vue/lib/table/hooks/useselection.d.ts","./node_modules/ant-design-vue/lib/table/interface.d.ts","./src/types/components/table/index.ts","./src/hooks/usetablepromax.ts","./node_modules/@types/lodash/common/common.d.ts","./node_modules/@types/lodash/common/array.d.ts","./node_modules/@types/lodash/common/collection.d.ts","./node_modules/@types/lodash/common/date.d.ts","./node_modules/@types/lodash/common/function.d.ts","./node_modules/@types/lodash/common/lang.d.ts","./node_modules/@types/lodash/common/math.d.ts","./node_modules/@types/lodash/common/number.d.ts","./node_modules/@types/lodash/common/object.d.ts","./node_modules/@types/lodash/common/seq.d.ts","./node_modules/@types/lodash/common/string.d.ts","./node_modules/@types/lodash/common/util.d.ts","./node_modules/@types/lodash/index.d.ts","./node_modules/@types/lodash-es/add.d.ts","./node_modules/@types/lodash-es/after.d.ts","./node_modules/@types/lodash-es/ary.d.ts","./node_modules/@types/lodash-es/assign.d.ts","./node_modules/@types/lodash-es/assignin.d.ts","./node_modules/@types/lodash-es/assigninwith.d.ts","./node_modules/@types/lodash-es/assignwith.d.ts","./node_modules/@types/lodash-es/at.d.ts","./node_modules/@types/lodash-es/attempt.d.ts","./node_modules/@types/lodash-es/before.d.ts","./node_modules/@types/lodash-es/bind.d.ts","./node_modules/@types/lodash-es/bindall.d.ts","./node_modules/@types/lodash-es/bindkey.d.ts","./node_modules/@types/lodash-es/camelcase.d.ts","./node_modules/@types/lodash-es/capitalize.d.ts","./node_modules/@types/lodash-es/castarray.d.ts","./node_modules/@types/lodash-es/ceil.d.ts","./node_modules/@types/lodash-es/chain.d.ts","./node_modules/@types/lodash-es/chunk.d.ts","./node_modules/@types/lodash-es/clamp.d.ts","./node_modules/@types/lodash-es/clone.d.ts","./node_modules/@types/lodash-es/clonedeep.d.ts","./node_modules/@types/lodash-es/clonedeepwith.d.ts","./node_modules/@types/lodash-es/clonewith.d.ts","./node_modules/@types/lodash-es/compact.d.ts","./node_modules/@types/lodash-es/concat.d.ts","./node_modules/@types/lodash-es/cond.d.ts","./node_modules/@types/lodash-es/conforms.d.ts","./node_modules/@types/lodash-es/conformsto.d.ts","./node_modules/@types/lodash-es/constant.d.ts","./node_modules/@types/lodash-es/countby.d.ts","./node_modules/@types/lodash-es/create.d.ts","./node_modules/@types/lodash-es/curry.d.ts","./node_modules/@types/lodash-es/curryright.d.ts","./node_modules/@types/lodash-es/debounce.d.ts","./node_modules/@types/lodash-es/deburr.d.ts","./node_modules/@types/lodash-es/defaults.d.ts","./node_modules/@types/lodash-es/defaultsdeep.d.ts","./node_modules/@types/lodash-es/defaultto.d.ts","./node_modules/@types/lodash-es/defer.d.ts","./node_modules/@types/lodash-es/delay.d.ts","./node_modules/@types/lodash-es/difference.d.ts","./node_modules/@types/lodash-es/differenceby.d.ts","./node_modules/@types/lodash-es/differencewith.d.ts","./node_modules/@types/lodash-es/divide.d.ts","./node_modules/@types/lodash-es/drop.d.ts","./node_modules/@types/lodash-es/dropright.d.ts","./node_modules/@types/lodash-es/droprightwhile.d.ts","./node_modules/@types/lodash-es/dropwhile.d.ts","./node_modules/@types/lodash-es/each.d.ts","./node_modules/@types/lodash-es/eachright.d.ts","./node_modules/@types/lodash-es/endswith.d.ts","./node_modules/@types/lodash-es/entries.d.ts","./node_modules/@types/lodash-es/entriesin.d.ts","./node_modules/@types/lodash-es/eq.d.ts","./node_modules/@types/lodash-es/escape.d.ts","./node_modules/@types/lodash-es/escaperegexp.d.ts","./node_modules/@types/lodash-es/every.d.ts","./node_modules/@types/lodash-es/extend.d.ts","./node_modules/@types/lodash-es/extendwith.d.ts","./node_modules/@types/lodash-es/fill.d.ts","./node_modules/@types/lodash-es/filter.d.ts","./node_modules/@types/lodash-es/find.d.ts","./node_modules/@types/lodash-es/findindex.d.ts","./node_modules/@types/lodash-es/findkey.d.ts","./node_modules/@types/lodash-es/findlast.d.ts","./node_modules/@types/lodash-es/findlastindex.d.ts","./node_modules/@types/lodash-es/findlastkey.d.ts","./node_modules/@types/lodash-es/first.d.ts","./node_modules/@types/lodash-es/flatmap.d.ts","./node_modules/@types/lodash-es/flatmapdeep.d.ts","./node_modules/@types/lodash-es/flatmapdepth.d.ts","./node_modules/@types/lodash-es/flatten.d.ts","./node_modules/@types/lodash-es/flattendeep.d.ts","./node_modules/@types/lodash-es/flattendepth.d.ts","./node_modules/@types/lodash-es/flip.d.ts","./node_modules/@types/lodash-es/floor.d.ts","./node_modules/@types/lodash-es/flow.d.ts","./node_modules/@types/lodash-es/flowright.d.ts","./node_modules/@types/lodash-es/foreach.d.ts","./node_modules/@types/lodash-es/foreachright.d.ts","./node_modules/@types/lodash-es/forin.d.ts","./node_modules/@types/lodash-es/forinright.d.ts","./node_modules/@types/lodash-es/forown.d.ts","./node_modules/@types/lodash-es/forownright.d.ts","./node_modules/@types/lodash-es/frompairs.d.ts","./node_modules/@types/lodash-es/functions.d.ts","./node_modules/@types/lodash-es/functionsin.d.ts","./node_modules/@types/lodash-es/get.d.ts","./node_modules/@types/lodash-es/groupby.d.ts","./node_modules/@types/lodash-es/gt.d.ts","./node_modules/@types/lodash-es/gte.d.ts","./node_modules/@types/lodash-es/has.d.ts","./node_modules/@types/lodash-es/hasin.d.ts","./node_modules/@types/lodash-es/head.d.ts","./node_modules/@types/lodash-es/identity.d.ts","./node_modules/@types/lodash-es/includes.d.ts","./node_modules/@types/lodash-es/indexof.d.ts","./node_modules/@types/lodash-es/initial.d.ts","./node_modules/@types/lodash-es/inrange.d.ts","./node_modules/@types/lodash-es/intersection.d.ts","./node_modules/@types/lodash-es/intersectionby.d.ts","./node_modules/@types/lodash-es/intersectionwith.d.ts","./node_modules/@types/lodash-es/invert.d.ts","./node_modules/@types/lodash-es/invertby.d.ts","./node_modules/@types/lodash-es/invoke.d.ts","./node_modules/@types/lodash-es/invokemap.d.ts","./node_modules/@types/lodash-es/isarguments.d.ts","./node_modules/@types/lodash-es/isarray.d.ts","./node_modules/@types/lodash-es/isarraybuffer.d.ts","./node_modules/@types/lodash-es/isarraylike.d.ts","./node_modules/@types/lodash-es/isarraylikeobject.d.ts","./node_modules/@types/lodash-es/isboolean.d.ts","./node_modules/@types/lodash-es/isbuffer.d.ts","./node_modules/@types/lodash-es/isdate.d.ts","./node_modules/@types/lodash-es/iselement.d.ts","./node_modules/@types/lodash-es/isempty.d.ts","./node_modules/@types/lodash-es/isequal.d.ts","./node_modules/@types/lodash-es/isequalwith.d.ts","./node_modules/@types/lodash-es/iserror.d.ts","./node_modules/@types/lodash-es/isfinite.d.ts","./node_modules/@types/lodash-es/isfunction.d.ts","./node_modules/@types/lodash-es/isinteger.d.ts","./node_modules/@types/lodash-es/islength.d.ts","./node_modules/@types/lodash-es/ismap.d.ts","./node_modules/@types/lodash-es/ismatch.d.ts","./node_modules/@types/lodash-es/ismatchwith.d.ts","./node_modules/@types/lodash-es/isnan.d.ts","./node_modules/@types/lodash-es/isnative.d.ts","./node_modules/@types/lodash-es/isnil.d.ts","./node_modules/@types/lodash-es/isnull.d.ts","./node_modules/@types/lodash-es/isnumber.d.ts","./node_modules/@types/lodash-es/isobject.d.ts","./node_modules/@types/lodash-es/isobjectlike.d.ts","./node_modules/@types/lodash-es/isplainobject.d.ts","./node_modules/@types/lodash-es/isregexp.d.ts","./node_modules/@types/lodash-es/issafeinteger.d.ts","./node_modules/@types/lodash-es/isset.d.ts","./node_modules/@types/lodash-es/isstring.d.ts","./node_modules/@types/lodash-es/issymbol.d.ts","./node_modules/@types/lodash-es/istypedarray.d.ts","./node_modules/@types/lodash-es/isundefined.d.ts","./node_modules/@types/lodash-es/isweakmap.d.ts","./node_modules/@types/lodash-es/isweakset.d.ts","./node_modules/@types/lodash-es/iteratee.d.ts","./node_modules/@types/lodash-es/join.d.ts","./node_modules/@types/lodash-es/kebabcase.d.ts","./node_modules/@types/lodash-es/keyby.d.ts","./node_modules/@types/lodash-es/keys.d.ts","./node_modules/@types/lodash-es/keysin.d.ts","./node_modules/@types/lodash-es/last.d.ts","./node_modules/@types/lodash-es/lastindexof.d.ts","./node_modules/@types/lodash-es/lowercase.d.ts","./node_modules/@types/lodash-es/lowerfirst.d.ts","./node_modules/@types/lodash-es/lt.d.ts","./node_modules/@types/lodash-es/lte.d.ts","./node_modules/@types/lodash-es/map.d.ts","./node_modules/@types/lodash-es/mapkeys.d.ts","./node_modules/@types/lodash-es/mapvalues.d.ts","./node_modules/@types/lodash-es/matches.d.ts","./node_modules/@types/lodash-es/matchesproperty.d.ts","./node_modules/@types/lodash-es/max.d.ts","./node_modules/@types/lodash-es/maxby.d.ts","./node_modules/@types/lodash-es/mean.d.ts","./node_modules/@types/lodash-es/meanby.d.ts","./node_modules/@types/lodash-es/memoize.d.ts","./node_modules/@types/lodash-es/merge.d.ts","./node_modules/@types/lodash-es/mergewith.d.ts","./node_modules/@types/lodash-es/method.d.ts","./node_modules/@types/lodash-es/methodof.d.ts","./node_modules/@types/lodash-es/min.d.ts","./node_modules/@types/lodash-es/minby.d.ts","./node_modules/@types/lodash-es/mixin.d.ts","./node_modules/@types/lodash-es/multiply.d.ts","./node_modules/@types/lodash-es/negate.d.ts","./node_modules/@types/lodash-es/noop.d.ts","./node_modules/@types/lodash-es/now.d.ts","./node_modules/@types/lodash-es/nth.d.ts","./node_modules/@types/lodash-es/ntharg.d.ts","./node_modules/@types/lodash-es/omit.d.ts","./node_modules/@types/lodash-es/omitby.d.ts","./node_modules/@types/lodash-es/once.d.ts","./node_modules/@types/lodash-es/orderby.d.ts","./node_modules/@types/lodash-es/over.d.ts","./node_modules/@types/lodash-es/overargs.d.ts","./node_modules/@types/lodash-es/overevery.d.ts","./node_modules/@types/lodash-es/oversome.d.ts","./node_modules/@types/lodash-es/pad.d.ts","./node_modules/@types/lodash-es/padend.d.ts","./node_modules/@types/lodash-es/padstart.d.ts","./node_modules/@types/lodash-es/parseint.d.ts","./node_modules/@types/lodash-es/partial.d.ts","./node_modules/@types/lodash-es/partialright.d.ts","./node_modules/@types/lodash-es/partition.d.ts","./node_modules/@types/lodash-es/pick.d.ts","./node_modules/@types/lodash-es/pickby.d.ts","./node_modules/@types/lodash-es/property.d.ts","./node_modules/@types/lodash-es/propertyof.d.ts","./node_modules/@types/lodash-es/pull.d.ts","./node_modules/@types/lodash-es/pullall.d.ts","./node_modules/@types/lodash-es/pullallby.d.ts","./node_modules/@types/lodash-es/pullallwith.d.ts","./node_modules/@types/lodash-es/pullat.d.ts","./node_modules/@types/lodash-es/random.d.ts","./node_modules/@types/lodash-es/range.d.ts","./node_modules/@types/lodash-es/rangeright.d.ts","./node_modules/@types/lodash-es/rearg.d.ts","./node_modules/@types/lodash-es/reduce.d.ts","./node_modules/@types/lodash-es/reduceright.d.ts","./node_modules/@types/lodash-es/reject.d.ts","./node_modules/@types/lodash-es/remove.d.ts","./node_modules/@types/lodash-es/repeat.d.ts","./node_modules/@types/lodash-es/replace.d.ts","./node_modules/@types/lodash-es/rest.d.ts","./node_modules/@types/lodash-es/result.d.ts","./node_modules/@types/lodash-es/reverse.d.ts","./node_modules/@types/lodash-es/round.d.ts","./node_modules/@types/lodash-es/sample.d.ts","./node_modules/@types/lodash-es/samplesize.d.ts","./node_modules/@types/lodash-es/set.d.ts","./node_modules/@types/lodash-es/setwith.d.ts","./node_modules/@types/lodash-es/shuffle.d.ts","./node_modules/@types/lodash-es/size.d.ts","./node_modules/@types/lodash-es/slice.d.ts","./node_modules/@types/lodash-es/snakecase.d.ts","./node_modules/@types/lodash-es/some.d.ts","./node_modules/@types/lodash-es/sortby.d.ts","./node_modules/@types/lodash-es/sortedindex.d.ts","./node_modules/@types/lodash-es/sortedindexby.d.ts","./node_modules/@types/lodash-es/sortedindexof.d.ts","./node_modules/@types/lodash-es/sortedlastindex.d.ts","./node_modules/@types/lodash-es/sortedlastindexby.d.ts","./node_modules/@types/lodash-es/sortedlastindexof.d.ts","./node_modules/@types/lodash-es/sorteduniq.d.ts","./node_modules/@types/lodash-es/sorteduniqby.d.ts","./node_modules/@types/lodash-es/split.d.ts","./node_modules/@types/lodash-es/spread.d.ts","./node_modules/@types/lodash-es/startcase.d.ts","./node_modules/@types/lodash-es/startswith.d.ts","./node_modules/@types/lodash-es/stubarray.d.ts","./node_modules/@types/lodash-es/stubfalse.d.ts","./node_modules/@types/lodash-es/stubobject.d.ts","./node_modules/@types/lodash-es/stubstring.d.ts","./node_modules/@types/lodash-es/stubtrue.d.ts","./node_modules/@types/lodash-es/subtract.d.ts","./node_modules/@types/lodash-es/sum.d.ts","./node_modules/@types/lodash-es/sumby.d.ts","./node_modules/@types/lodash-es/tail.d.ts","./node_modules/@types/lodash-es/take.d.ts","./node_modules/@types/lodash-es/takeright.d.ts","./node_modules/@types/lodash-es/takerightwhile.d.ts","./node_modules/@types/lodash-es/takewhile.d.ts","./node_modules/@types/lodash-es/tap.d.ts","./node_modules/@types/lodash-es/template.d.ts","./node_modules/@types/lodash-es/templatesettings.d.ts","./node_modules/@types/lodash-es/throttle.d.ts","./node_modules/@types/lodash-es/thru.d.ts","./node_modules/@types/lodash-es/times.d.ts","./node_modules/@types/lodash-es/toarray.d.ts","./node_modules/@types/lodash-es/tofinite.d.ts","./node_modules/@types/lodash-es/tointeger.d.ts","./node_modules/@types/lodash-es/tolength.d.ts","./node_modules/@types/lodash-es/tolower.d.ts","./node_modules/@types/lodash-es/tonumber.d.ts","./node_modules/@types/lodash-es/topairs.d.ts","./node_modules/@types/lodash-es/topairsin.d.ts","./node_modules/@types/lodash-es/topath.d.ts","./node_modules/@types/lodash-es/toplainobject.d.ts","./node_modules/@types/lodash-es/tosafeinteger.d.ts","./node_modules/@types/lodash-es/tostring.d.ts","./node_modules/@types/lodash-es/toupper.d.ts","./node_modules/@types/lodash-es/transform.d.ts","./node_modules/@types/lodash-es/trim.d.ts","./node_modules/@types/lodash-es/trimend.d.ts","./node_modules/@types/lodash-es/trimstart.d.ts","./node_modules/@types/lodash-es/truncate.d.ts","./node_modules/@types/lodash-es/unary.d.ts","./node_modules/@types/lodash-es/unescape.d.ts","./node_modules/@types/lodash-es/union.d.ts","./node_modules/@types/lodash-es/unionby.d.ts","./node_modules/@types/lodash-es/unionwith.d.ts","./node_modules/@types/lodash-es/uniq.d.ts","./node_modules/@types/lodash-es/uniqby.d.ts","./node_modules/@types/lodash-es/uniqueid.d.ts","./node_modules/@types/lodash-es/uniqwith.d.ts","./node_modules/@types/lodash-es/unset.d.ts","./node_modules/@types/lodash-es/unzip.d.ts","./node_modules/@types/lodash-es/unzipwith.d.ts","./node_modules/@types/lodash-es/update.d.ts","./node_modules/@types/lodash-es/updatewith.d.ts","./node_modules/@types/lodash-es/uppercase.d.ts","./node_modules/@types/lodash-es/upperfirst.d.ts","./node_modules/@types/lodash-es/values.d.ts","./node_modules/@types/lodash-es/valuesin.d.ts","./node_modules/@types/lodash-es/without.d.ts","./node_modules/@types/lodash-es/words.d.ts","./node_modules/@types/lodash-es/wrap.d.ts","./node_modules/@types/lodash-es/xor.d.ts","./node_modules/@types/lodash-es/xorby.d.ts","./node_modules/@types/lodash-es/xorwith.d.ts","./node_modules/@types/lodash-es/zip.d.ts","./node_modules/@types/lodash-es/zipobject.d.ts","./node_modules/@types/lodash-es/zipobjectdeep.d.ts","./node_modules/@types/lodash-es/zipwith.d.ts","./node_modules/@types/lodash-es/index.d.ts","./src/components/table/tablepromax.vue","./node_modules/axios/index.d.ts","./src/axios/index.ts","./src/config/dict.ts","./src/types/views/publicunit.ts","./src/views/user/user.vue","./src/views/user/user-weapp.vue","./src/utils/db.ts","./src/views/query/publicunit.vue","./src/types/views/login.ts","./src/config/index.ts","./node_modules/jsencrypt/lib/lib/jsbn/rng.d.ts","./node_modules/jsencrypt/lib/lib/jsbn/jsbn.d.ts","./node_modules/jsencrypt/lib/lib/jsbn/rsa.d.ts","./node_modules/jsencrypt/lib/jsencryptrsakey.d.ts","./node_modules/jsencrypt/lib/jsencrypt.d.ts","./node_modules/jsencrypt/lib/index.d.ts","./src/utils/rsautil.ts","./src/components/login/telephonelogin.vue","./src/views/login.vue","./src/views/register.vue","./src/views/law/index.vue","./src/views/police/index.vue","./src/views/warning/index.vue","./src/router/staticrouters.ts","./src/router/index.ts","./node_modules/pinia-plugin-persistedstate/dist/index.d.ts","./src/stores/index.ts","./src/main.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/importmeta.d.ts","./node_modules/vite/client.d.ts","./src/vite-env.d.ts","./src/types/config/index.ts","./src/utils/index.ts","./node_modules/@types/uuid/index.d.ts","./node_modules/@types/uuid/index.d.mts","./node_modules/vue-uuid/index.d.ts","./src/utils/minioutil.ts","./src/components/tsx/modalpro.tsx","./src/components/layout/menuitem.vue","./src/components/layout/systemmenus.vue","./src/components/upload/singleimagefileupload.vue","./src/views/query/weappuser.vue","./global.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"4af6b0c727b7a2896463d512fafd23634229adf69ac7c00e2ae15a09cb084fad","affectsGlobalScope":true},{"version":"9c00a480825408b6a24c63c1b71362232927247595d7c97659bc24dc68ae0757","affectsGlobalScope":true},{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"f1c3f5a9d88cce50077ef9e36a962e75a5494c4336659919219c8eb25b798898","925c05af5f8ea4d5e2bb8f06ca9b1b7a023d3e9c5221e8edf8fec8d30dd38a6c",{"version":"ea82cf52e119553916d20c3645d20ab3823e81dac7e79227666d73e8f578636f","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","56fdcc3122159ba7ebe79bde6a741ec8c6324f9460262a787294e50da7a76aaa","9c077ba346f2891d1725d6cbf1ff8bc7ca075ccff10d1ea38eda571245df0eeb","e74998d5cefc2f29d583c10b99c1478fb810f1e46fbb06535bfb0bbba3c84aa5","43d058146b002d075f5d0033a6870321048297f1658eb0db559ba028383803a6","033fa800d58636b734afe1c65d4a6dcd65dba3a7838eb5fb23bce0658c53c0bb","cf76e2f59b26aea7c923015783083b4820d6c0d85cda2fec3a0f232aabfc56c3","c0191592be8eb7906f99ac4b8798d80a585b94001ea1a5f50d6ce5b0d13a5c62",{"version":"57f056439ea12812e570d7047f93314fc39b115a8bec81838dea0dfa62a5c910","affectsGlobalScope":true},"d722c967420ac3134dbbcd8b2fb15a08d43e0f800943290bf477df78ff4d548c","7dabada6188ba830cca861bda243aea9f28c10c7854691ba9e7e1623684c307d","d46c743660b1dbad1aa47c1b7c3cccdd8994ca34c5cef17e2284f2bc81eaccd5","5826bbf307af5b2f2126e06ca1d40f8e638fe0e95482e2297468241a28e31678","cf81339452f76f7df2b1728f367e2a8c23cf02d9fb9e05d0558fcd64ad36c3ed","f8ca96d68bb8a6b4299b23a5d570c6105b302e550aff17293088efc835a4791a","e8d7e7342b7a34652b2583ff32318eed4d7ff43aacd196aa80ff4fc0da31259d","d5df035389711354e9ba20fb09e5629cec6f2dda7b189cb3468f8e04ff31c34c","b5d7e14934636d41f2a906c164375ca28786c3a2b32c00fd88ad4190eee42398","eed731afd9a9921d24e875b2fc6e97f6cbc57449691734a32fe7d52cd2fbe256","9c1fee7edca46c1f7c1820376c0222998a88e1e722536ba38d2a29ca6a2fbfce","5d578199b9480af59ecc84df30861dd9c7810522ebde661af5478d30210b1937","f75051c12fa470e471eba5721dccf404a2d3137cafaf4d0d41e6bc03f096bb4b","0c74f7453c0e9463530908f8a9faaba9ad15b17b19d5707fce94e5eb0c34ee54","aacf041bb8c7889e747b3f8613390686a83fd65dc18abc5ce2307c227eff2269","fad9c83c6a19503ea2003a3494cdaf5153b902876221aa677965f78f5d0d3d87","98f76f86a30ed611494dd62b4b613cf461b2e15c84e160f065f60c61118665a0","80c2907c301adf80c930547cc231cd7e7c4e08fe3ccd8d441d83299a514e99e4","603a3d04c20f55c4fc649ed2080e350735df9027b9d45c97f00bd11be60ea5f7","20fd281715b4331fbeb2ccede4549f5917b1d1b63983aca76354dc00dc09248d","09e633c7a983abbe61ae767c01093d7c4bba69c09b463e5e8dd601dc177f5952","fb23acdb29f02d717ca89706fc4a8482f1105cf0ea74093cda9c92c4b831fb8f","889f0880815e3b427696d4154b64f2e41e2ee1d0a55caae12849bd12df1a57d4","fc21989fa223aef13de5843e8ea5c5c36e86aee1594d1579bbda6cbb8313d9ff","8029f7825e3502ecc564bf73857cd9e66d6200d2c558e87d29e3ad9f28c6c43f","bd76fff9bb2b3202b9abf6f291a8fd6a746d0e64edd54a95df0b3e880c05b6cf","9510c538c3afab4823497ba1159e9548169deafcb4489722ca0ea9510d7218ac","47f30de14aa377b60f0cd43e95402d03166d3723f42043ae654ce0a25bc1b321","0edcda97d090708110daea417cfd75d6fd0c72c9963fec0a1471757b14f28ae5","5b61fb387a3afd0878d80c93cd495bf713255631b350155a14986cf3b90936db","810939b32647051a3618a53de08772a1a1cbf3c58004c618023f5ac7ffba2fbe","f9acf26d0b43ad3903167ac9b5d106e481053d92a1f3ab9fe1a89079e5f16b94","014e069a32d3ac6adde90dd1dfdb6e653341595c64b87f5b1b3e8a7851502028","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","86c8f1a471f03ac5232073884775b77d7673516a1eff3b9c4a866c64a5b1693a","179ec9bf85fbc3df30d76bf9cd5a323793d1c53c0db9df31ee69d661b2645ed6","0d2af812b3894a2daa900a365b727a58cc3cc3f07eb6c114751f9073c8031610","9d81c65d99704c5fd58ef5b04bd2bb938a4d69c440e0fcf3c32ca3c59303d4c8","a4b3c0faa3dfbdd8d1d55e36f8ca69d802db74a1494622da165e845eab41ef01","d0cffd20a0deb57297c2bd8c4cd381ed79de7babf9d81198e28e3f56d9aff0db","77876c19517f1a79067a364423ba9e4f3c6169d01011320a6fde85a95e8f8f5c","06397d7d64845590fc8773d7ba25f906f69843b921b430d55d8cbe7c14123b83","8309b403027c438254d78ca2bb8ddd04bfaf70260a9db37219d9a49ad6df5d80","f400a1539ce94a08fc7e8f6e81a72f7ebb600a5dd78382e84dfa80e448023cae","98f03f763cac47dbbc80dbe11eb5a00d7bf6d3a5d64926755e1de3ee12eea5b5","7132bee1220a53a20f9733a9875c07f4b7d1db9130471d36074fa1214db6675c","ef2ac0bd433b57dec3383a51b851d0a9804266d29b328cf2a9aaa89191b58047","ad1af9027a43ae6a8f9be24145f4845bb31edca21ebdfc75b6295417cb714bce","c630de180667cc81bcc4642cf37ec581f98f575601da4df45b90a17a8d5aa8e2","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","042f5956e7c882bb0580df4cfd7857d26494fa36b67404fcd966a3e60a43806b","92783bcd02ff2a4a53df79e1242102436468c85600cb05d7aef2838fc084ac5d","7dab19f56db3c3ded981c373122ba1e5e1f67474acf3c95a7482e01f8c2dabbb","6879f1a4424d94b2ebb81855a3f1877f6b18088972a87b938f42f96a2842bc4f","62775b9dce86a798384789e4561798d2347216fa30d9fbb4e4e72d2c46c2905f","83992869725857fd9c5dd25f5d16eb4da01ed98830e0315070d9ac3068cf9ef2","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","a7d12223e8210e0cb23bbb542c44abc81e20fad94664ee17df63945dd2321557","ec5444f1dbc6bad68c8a5d95c51db881205c4ee70999ce1fb5b1206b7123249c","4006d7c2d251139974767360fdeffc8267c5cca35626954cd14c2f23b1f03d0e","87ac9d34c6adaa8e43ad7baf1cd48768eda73df328aff4cfa612e52a037046fb","af4991280b62a3c949482af843ac845a32f99531f89da1248cb66a986388b417","1a20de1d748f9c1deafd22b475552c2173efcd9a2ff28f735aeaaf2aad5f558a","cc3e8a3ae279a8f55174fcfaa8b64905d0ff73aaa0f89ce54d1e315d8e4aeba0","400a7addd2712ac1e1028c774cd7d1cf7a4c29a33a94d7dcddd9a6d1724eedc0","7a27cf45a503b6eef08b9405540650459e2b9fae0232cbd1a94bc46187ef175a","325ff2a6d997645c42c313bbcca480428121609e37238f1d2799928eb908f639","563eb9744f81ec9cc67300853c1966938d1d0f564cde9f42b7d895092a0baf5b","08dc456315e7d08517c15c2dadfcbcb50bcc316bb4ce4c6e0d429cb40835fc2d","323195082fd9b9b45e00948ab3350f8765c83a47b386a52fa1118b82cd7b39f1","fa12490296dfebf287271c33aac76b026934b2d9fc2ad76d72012364a757eb65","bce01345fc3809892cfe030d23d74576c063a88a5c04a8bfc151efdfc9b990e5","7842d3c42d7f4d7ae8cd2087f606a00619db8b3210a5f7a4eecf957571da1b7d","d2fda5d7f591500cd6954ec4ac92387f740f025cbbd4db4632681c87218b73a8","d911b8ad0bfc13d5b4fbbb075a5dc39a0c4b56a8cf758394553d3d44750ccd4e","98a33fcdfa4e767ddb8ea155039bee65f823d85deca99ee8306531024e1af02b","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","6faf1c345e9ac68a34afaae4abac11898ab93c60c062c04952af6bc2fd49ed08","22f00cf818ddeda76ebcdd1f2d8dbd6536ba7881f705f722eecff887a7aebef6","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","fb348a1425fda14a7b322fb630b56cc897a598c436fbbc9fc0d9f941328fd63e","d300db2f1427e39e3d6d75a79abeaf2b029e6a4fc759ed972e1fb90de3eb12b8","2bb73619a3257f7b0b70f7cc4963d9cb5156422e8efd08cf999ab4144b3741dd","400a7addd2712ac1e1028c774cd7d1cf7a4c29a33a94d7dcddd9a6d1724eedc0","fed36168ef804525b8375e80e35e6198ef1cfce55b413f4ddfb4fdc0b2d6ffb2","91b535ae5bb95b3827bdcbc22034823db290ad19e84ba6a8b24110163fa4d35e","96e85abf84588f9bbf668db1702cfe7cace619e47cea6af68c2cc1ad45d6edf6","e3413d0b59645ce39ad4d0cc097ebf9c75958c4d8021b837f87606e2cf1b3cc4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","b16f06eb617b23453621541d8a15c5ed949dee4c1d714dbb8f7a41f6ffa90ce4","2cfe02ae04ef78f301c28eca9a752fd54e1d8224a76a4ea7624d7040863f6cab","6dd302e1ac256ce8afa28a675976a9312794c68ea158ef10b670d9bc7bfac382","54401292d135568988d9d83ca3713cf1200f31ce5d017900339629713ed1f23c","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","6faf1c345e9ac68a34afaae4abac11898ab93c60c062c04952af6bc2fd49ed08","14f65273b85ca6af6eedc50480a7b4632a175cbcf84628dc9ef3292aeedd0d1b","ad4c1df293222909de8608ca5a5983b1663f003f2ab9d31490aaf7d16b80b366","136f1b2fe98eef1bc9848a2a43dcf52fffc8b9a7ce4feff8e22c99f0687ecce2","44d313b854af800c84deb38ba4bf7f0d6f0fef45861fafd2b42b608faa2659fb","cf062ed4e4840e048500a58eb1e9ab2630e15bd5d9cd4e73ad69c63ea10fd470","6d71aac36605ae9a33fb0ba14bbc6c776a62af377be50250bcf764a4aec802ac","e03656883f5e5421f78f1636c4a75805eb71f39a17b7a7a8d9c50e1e82fffa61","1ecde6e71f9cda067a455694af81e9b5d003040205dff9f0bd926590040411ae","a0d7e78f4e19c37485328751dee3c86a53e591118a581fd1680b3996c64f26bf","8907a87fd27c400ebfe50819f750c8a1e757b74ffa3f33883ad18e27bce055f0","13289d9990822f173e325b8e1faf991b859c625c1e997dcc9dec0247c61ed298","b7bc517bd3f81b4260d952dddae2e559994e7a187c26b36ef365ee518a105201","7e138dc97e3b2060f77c4b6ab3910b00b7bb3d5f8d8a747668953808694b1938","2c1751915a1491b9d79fc55a6571d1c68cef7ca95fa4caec7cba5fcd389ac97a","4fde9444a416329eaae01156592abdec1332cffbac60cb0415ee5adfd43b4e5b","431398d2fdf20a2d0b5a52f740336f5dd5b85169a467f04cc4cec6407f08eb3e","7c3ad9c70e8255d53cc2c28e06fabed5a5e5fdc0535001aa2e2e829db1020445","63b9aa230b93ac9c805b8496fcf44c583e95670c7217d4cf3d2eee8b6d4273a0","2d1ea94163b36347034f31e1e91585485673e3a9452c9eeed9bb269b929ebfba","b704d6b174db06e0c680183af83d0c4cd23d867360cced0aca221046cbcaa06d","3b0bd1e159a2934f4bad0459e925b3e819c8958da569f5d918e197115fe4a6d8","62eee500d082c67006a5d2b94cdb20630001c5eacafc05e96a61f63eab77ea8a","139543bc42990aa9a1b7d65a3061b7ca58b12dc03a4c9aa03f0a6000ce996fa2","24d37afd6efdb3d01b14df7dee9a12208f1685c9c59043307b8051425b0965eb","bf0c0f9c26b9bf93ee8961048b293caf4eb73a7cf763942362f9cf4a89b232d2","562290abbc8260051dadb3a472f55f98c03bec1a95ebb4a47bf09119eb183a3d","15c2bd55c6547ace4507fb4801be9483b716d2145ab7b73723a74457243fa80b","feee1da1afdd9fd7ae27b9d14bb9c00ae3b903c9c7747ddbb01601164e94b60f","d868076213b37dd4c53dc4df537b0180cf2e7badc11675bf97e83899809543e6","468410d18b5f2999b82f7234e72be312f249840949bb0f6887d115ac2f9f504e","2cc8fc46c0df0c250b7f700edc0b76bf5db40bb6a79eee18c0842b5a1e0c0f6e","a8506f67ebd310a082654bdaf6cd5aba5ab603517119092fb6b198315adcb13a","15f22ab9d87b482759b43306105f7e3edb25b8c7bd8ac73a53ccd134ff83864b","712ec9051ef881ae5610be8ddbb87e20bb1127f584921fecfbd9195a846dde5c","f8aa9b23fb10bda728f3cf5db275f00fbf45cf877b7edfc169baa9252f1f3879","543e393fe09065148fdf3051c38fd4374e685e128bc4425b188690cefd2ea580","3fd84b6c62c704121ae927bf7171abc0173ae228864314c038120765b5ffd95b","2def311caf0ea4093f0cfa7010be6ca16e00f26f2f1bcc4c91973e3e8b0bddf3","a3e4c6ac90f147b22accc94a2aae5117dda2b927a1fd959e9a7456b14c138683","07df9fcf49f4ddfe8500c64980cbfee05b108c2339f3d0f0499ef85692526652","6a961d13c1754fe9d3cdd2a32fac762d8b38407453a93367fbb3f1e226548f34","cf3d1c01f9fcf7700098b8b65cb1c6dd88aa658cd53d8acbeff48c219a9b501a",{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true},"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","3c5bb5207df7095882400323d692957e90ec17323ccff5fd5f29a1ecf3b165d0","08e5a4e27c2da6505a5045e27141d06542dd4970e3cdd88dd936164f53fc947e","3d27a6ce414c909b9d6e10e7c3195f393510f1abd4db90b235fecabab61a4525","646d1721b97629bc109f900cef73f74f30e8b250240c0fe1a3c18f5c05b5e41f","05dbd8777c0922e0ed507f6ea90e93e2dfafe683b3518654b22eacb3d3920f55","1cbc73315b5314a5ffaf8748c1fc5addfd93ab0f959e0231f4f09a0a43f53aa9","84286916d4fa86a84a4439a3461d570fcbec4f65834607f89bab35ed03c9b518","c399e46730aa16bb396d8a1f4d4fb68b7f6835bc7eed1f288e999ec3329622fe","d58e9787ebde044fc88924d0b25c7be5d90073bc609268f48010216989852fb7","675b20e0e5793c74521e2129165b9d1e7c592a5a01b760d96b4c81d89577add9","5418c49a768855c55f44dd6f4e0b6af29b2d720c621e52fa214599bd1f48daa5","d15fb05a0c1f17d0c1fb2e27a965078d83984449555bddacbdd50341e4dca825","2c27a48c17a47333f087717ed5947f772a1f293556444536f0ffa4677768c51d","6a44b1c15e02a8314db381c6c34029ea4a5ef53fb829cfb4393f91351059e904","166840f3653e55034e2473c3d619381cffee54dc61c9654a57933e10d555e0ef","ca3121fc307ffbd6d8c5993461a0792ea616aee1c20e8cd14ff6a2fe52b05df0","889cdf34bec018fa27304c7c17de458a9a5686d124fe70ee61ad1d2e62c934d7","ca5616592e1544298c39fce3bb3045dc365a42bbe14b3897fd6b7c620dbb6d88","92cd4f497c2ada85124d91c643864542dbbc5eadc932d01f4122ddb836eef1e7","1c8f3de78388c9a3a4ac270b755f45dbf577fe21ebbf63b6c2541a12fd98ee04","3c5c6e49e93e41e68217e8f59d273b2b62d542e875447c2424cee4d6336b78db","0db39baefe5ff88b7ee709156164edbe416ed28ec390c5874b0fe6cd00cd4a6b","4916893ac55ffc15a958fa1dffebf768c7ff4fe7fdd4ea67fe09b16ad5c579da","05aa6d13b9ee687a63d632ef5cf7c7f84ca4cf563245adef4c190c8ea466f49d","78c69005b9e1c0ffa6655d9f22f7dcd1a90aecd5c6c2a8f76b38181f9bda42af","39e31b902b6b627350a41b05f9627faf6bb1919ad1d17f0871889e5e6d80663c","a4a4ff62a121c0d722f20c12eb0c19b3553ae6659bb89448638ba58fb1c0d613","636d629469ca9aaeac9cf0120995362751cf577823a7f56a34200dcf564266c5","b1b99d6c3ecddbf365c4345421fee7a1ac5200138a394e69cac3c32c1203a4d9","c2211fbe8e540df5d4de99090652c4309b9ff03b2db5906ad95c99dbfe5f4625","4fa94fa20ed670ac9128d279624fee22e0688542c566dde23d375133124fde2a","e69a6f4c78bc362d0ad2dad4637be579b04bba068b17639d8bae4619f5ec62ee","4ef590005da4c09f3457d84f938fe12ed07bde03436cba3d2e6e49c79f109e7b","6562ee970b54247243445e262185f99efa066aeea4f63b3a5638253b43c2b879","f6bf0cb13bda3b30d43ff73f840685bcfa50854d30bacb693125a3b021c2e4ea","0163d2335d39b3df20897073c0e137a12e0235da329573c806e8bb74eb0252b6","f9d5208cbbbe8c2f63a5e02b8c73046379858a7f818c6a41866b2244f6dfe630","91e7ab7cb94303caa4f956fcb7c512516cbaa50b7149444ef262dc22f71adede","cdd915e7747962e6a40bd123d1f90b4f8c6d9523f8db90555bb7e82d84abd162","d284f30f3e16b0e3c9653da039749e4747ce3b464ddf6544d1bf99876b1100d5","7842486fcd432428f7e079b8dea128ffd27e516aa582a8f1c345110ffdee1b18","6c179bd4ba62b933ce54c6bf5929bbdd24129bbfd30bc20ba02aeb702e22c385","cbfc76623fca2ebf51f66d28c7271721335936008d52132e68de22326435d958","f0236caa32a2cee4161e9a1850167893062559b5e39c7b28a74bef65e1ecc7fb","fc7b65ae4d9b3cf4f4b624a738e338ed59d3827e2dbf543bb00428eff87fd021","4e4b965a2ab026dfafefa8409de65ca8cbb104329c4ffef321cda62e171a4f97","c9767da4ff64fa4900e2beac3f0e57788d467c30f29998bb9bc0ff1c6b2f4d0c","7f348308dc3f8ebceef9633c4450004c5b6873a2bae797657f0cdc48a79cc0f7","93d43f9aa008503f61e7a15d29a9dd2b67384c8f93cbb691b9d72c2293bce7b2","a2b473e8691df855d84172ccd2334199075932dc26b6bd421f2e9cc4ef6dbe34","b84f3a82db6874a0c66fcb68d74ee61dcb9744e8c854ba4bfb7eaa65fecdc834","346be919a036eec1b51de75d0db45b17a2b7548e570cfd5b5f412a30324f68ff","a73b895f99ba0130bd585a07a3894814e333d4cce183947255c4443f72d9e62b","472d55c64222589fd028368784f3da8506a4ae53feee97551f539b04326a6c70","b401337ba97cd3d0cd5c3bb2540dc72e5a21ebd5bc9201dd8fef144f99ee35d1","7f704224a76e184bab04b1a9356c9c8aa655d3585b31dd5d7e22ec96ee4c4ba1","e09ad771bff5ac5e7d904577f5201e51a1848ed31455a618eded0b6ca3fbe059","9dcb42d741aafdd91bd18281f2574aa8589b43478c84f31d69e8b7a79248c354","2c60b8e1425c7e3da13c79417348c75efd8f30b7a8a8d21084aaf8600c477b01","25d14b912c1a6ae7bddf99dd1b39e1ca0addc6b2137bac7b3aff65758cb86f09","0f3d2b3185bfe129b94a3a7cba1fea7bb7c84bef55aaa6a8ba5858bbbef891e5","95fa1c911dc8e70b55750c422b2d021802f74f235be94893bfe6f976ece163a8","e8eb26d0ef2b425bf9635331b9547fbf03a4119093949e487c0b6813e14f6ee7","e121c8510055895c0eb1834ac0d4edd7a2dd975df00883f89f77ed03ce2f15f6","162de8e092a5946e2c9042115d3cc6f210a42376f32e2df17161bdbeb32de439","3d6857e58261840abdcf63d67d5968031f8866964cf74f666856e588b6756d5f","cc718b7f19c40fce021eba32a105f391040bf2de6df9b835019285622a2da63c","0144e2af6496cdc80969a06107683e8691ee1783a67308e92accc2a6276d97c9","8b316f980a9db84ad1a1f3816cbbe665df7879711580f0d42647be3ddbeafad4","6ee8db8631030efcdb6ac806355fd321836b490898d8859f9ba882943cb197eb","e7afb81b739a7b97b17217ce49a44577cfd9d1de799a16a8fc9835eae8bff767","d2c3d8b951e564f325c8dac3f41c8603919383f0c68a20ae296d13fb7b616e3f","08d543f5622ae503ee7a95d0074df6b00174898e9a15916480a84a8037e61149","a2fa353ae2536d6a85fa88cb73355e2deb53eeaa2114279b366bbf6f9a8dbf2a","966f054ac46fd9f45f1c726a998c9fc886e77d9407502428e5872ef7271869ca","edba783bb26be1babae22df8a21a053fe89312d4fb3dce71310feb0941c6a471","78ada1d96e3764cb0c2101c1c09dabc4d144c9974f6f1e36013105b99dff385b","5c7783799b2270289c482a80c1cf46242fa0963eee20f8874fb0d2068391fc8d","ad8536e6caa8b44f04bc37c56bc3f93695b437414f4ccbd10d67e88405c96564","c192bcca6e5cd2ca9266e12e69dc1ccf31ff874ea1896723f9787decdf65f914","f690207b4ee6c8e2452b15e9d71aae80f9c4fa3669edbf00be91ee9404293905","7551dae6b89ed38ce2409132128c26f88338f2447ecd0352c595f17f1a9510e5","5b1131a389602935624405ba50072c0c404070d241c133e81a23e0da9a23e314","63d0114aef68f1e5ea95d2430f9c5972e3ba80c362137ee560a9ef392277d095","f5acae419855ea8cb307de3c5c19880bd515deef522f65bfd781dc28dfbd363d","5cc1d25f2c7379efaf80148e7db3e1c110d68054749cd7218d0fe140d52aee9d","9e42e5481367702169d60a3c1d7b6a03b16e0d9c89d798fc093de8474df0242b","017f14be788265e89f2d15582356af8a57bba7bbe3482cbc85ced34de6f71242","bda2c12c7e5e743b4ef4f0a92d40b945ee3e241781a598950fee2e1518cc790f","21e2db608c624422c485299b954bc30c2b5ee7074d8727f237040a0f69200716","1242f45ab4770d32bb70b2cad64bdaee187c57c67f4c5ddb572482ff06f79ddf","098ed56707fb166af31e4724a29df1f1a89d091bdc513deaeb6079bd9f7ac35c","7c5a98063bcace96e78c6f137ce5382347880c259a14d15318e66fd9f1a4551a","2ef33adebc79fa2abd1f1a00bd2bce4f7946d4323bc6c1899fbbc59b8b01d13c","30bb8ea9960228e3c230edb7002b4618056ba08a3c3265299746fc96252cde3b","cebb1c20e093048a0d532a2787ef04e01af1f580d8d723749061b09f26d23fea","961b2464c19aee6d13c9e06ec32f1ae18ad16c43ea274af54b17025451d8310e","91672000ea52948e20a1d0256169ce13f6f79a716c8ce9f5485833050a3620fe","bc1e72fce8e2c72f5c50adc3f57567e0be8c6c32ad3d855b00f88f9cf261de27","0a497b7f5c551e6c5e2ce6be0e59e0e4ddedb1d6163753e9076230a3888f068c","aae24d06551966ea9485f300aa442e13cae5f6ef850811b8f21956e17ac06bcf","e49de781d51401f9659b79edc03dae73d4a3257f56ff5ca4db822c15a511244d","6909560abcbaabbf50e4fe683db4a6a8e246d6ab6be28d32a8f0d24eb9b3fd1a","f29e01fc8944721f18065125c001fda83b8d52382bf437a82a04cb24de5024f1","479e75705415da230292577db01e2701cc542b98124c894f7b136901dd309645","d6b19e29dcc41d53c499cc7be267bae03fb4232977bb22fe61377bcc613680e8","1af21b6e33068ba071dcbbc474c49752674466762327e5f5c34edc9c6e93f0b2","0433226742810d547b8e40126330b6c93bedd323fb7d14026853c2df5faa4713","672072e14e9947e44cff27771501537829e5f83a41bb7f8bcf679a8d55cfe33d","dbf22578550bde06db8c4fe0e7348146123fdafb9c6058ff8a8cc6d4a7260d71","c7601b63da931f1370de02ccbbc83b9da86f2b52b6b69cb15a4c8989d494bd6f","89017d151c4ee8ef67de0d5513aaa38891153606afbdbe5b70ea8ead64954b09","80e75fd63ad809a832a5ff0f76c17b65d27a67d4ff39b4fbbccb487b3aacd893","4c4fa82a5032cd4725f33d000c07cd39a3e6a20780ed7a5d78f842cbbda491ef","a3b0112fdd52a8700907825903c0a1d4b258e259a8fe4a7f1a8430901e98a42d","2dd69a68f684f141185d08e2d34a92e425f532594bd6d0ff8254a3f34a6f5fed","80453745c43f51624969c01b0a48a08c701d71c6cecf153053b75e34334d8b0d","12062bfb2226f03c9ccf19da912233bbe816b90caad0db12e2d0bbc258899c8d","d24dd8eb9ca2074d8eb98af27a93495ece7e60641bc0faa918221708d675c658","43a638a25383472279f7da7a45882d87e9e01d4d3ebe5e353dfd3b9e73eeebf6","545b9a9895a554a159bd80a715b69b023f8f0082ebe6a11e59a1c57ce904ac1b","9cf076f022198651d00a3b7c3606a3cfa44ab7244f794161bf8a1c6b74b19bdb","341037d1cb03286b99cd04821a9cde8cff5262378364cb6f3cb3d201d1dfdcf1","a78d541ffb194014cb00a4cb6d7c3b9d030637211d2547cbbc742918b4636440","f23e804e9e0c753fca70aee9bb7aed053b14284c212c98f8647860c7b02c0e6a","79f26719bfbea4f4b3381d7a6df71a504f833168624e3b2290e98fd2cc9a7721","1e739502c7aff49521c7ff3a002ef95fe505bed4b2c8eca227f62a2c1070a932","2f3a8943b1b4d176217683f5f1d9aab8d8f224237cc75b0dd3c18b089beb8127","67ac4fe9eebb9a6d442c5ece84f1018cb5dd5dba633f7ca80e90558951d5b25a","e611e74060752472b15a1c1bb1fc57592beb7d31543d351ba8c64559b85e59b8","c7c44c550eb19657461af7c91caa819edea079ccf8369bf830fe772b1f08d494","79b36fbad6900104cf056accaf560016f83fa922c5bc458f547c51677bd019f3","579d0c7f9eeb8fa94e35aa98b79ce1aa2717e963d07215819cbe2671e01f44be","fe24609f820879d967c5baa700a146cc58e499073ad1dafd119727b96f23ea7c","24bd6f64218bf2d79677c53fc13fb93f625d1144152fd5be62795f14b47fe4fc","3b1097576363c10882bbac1fd9794cbf542c31472745a5419f9c8d6323fbaa71","1f3cef8c31dccb902847863e58c3c899b5e06c95e2ad5d814e740faa6c2379de","b2736ae800eea9fba5078d906dc63758687a4b1fc19b407102c3b9b6cb6f220c","b1decd5d7420b89462eda835f45a68579372c28defc032088912ef69aff66780","6af13079337beaaa8fb6f08c13b9c30912bd44e649aca9cdcfac9844f406fbe3","69ead4dbc83f1367a6137b238d6f3b55e738cb668a28455f6b3949ad28419353","326ac9ba1da7c5deba3443e8dacccfd8073a931d1cd36e646719d299f60cddfc","4b81cbed81a6f02f0939e7a7a33f93d44fb0e05de6a16d4681960c6b300f6c4a","9d1d69b53b0eb76b861d22527414dea45c890c0bb328d94cd969ce424fd8954a","e018b364dcd2583075db8540b83fde0f52d293928b0dd986b967246a030ebdc1","6343c363ee5119b0c3240e68630c66e7824fd62792d1fb07b48b44ad374a1b7b","e61fb03f6b133565c4e37c3544317107563e0d130e093221596883785eba3b51","ca0c28c2508ea2a6330d6b04acdf5db65ec84ef53621171efc14f8882efba6ab","74e167a9bc0a5e5089d7927096d7921adbcda12ea7ae93dd0c53202bf9e54340","0dc2b8bbd86c78df8489aefeb2a4740497326eb079b59ec65c1db0eddefc248e","5b771da0649a87c5fe649c75894e7f80ce89b8b2ce1c117e47d231846127be6d","f389161d8594354eaa81d7545ad44f475b2372bc3a3adb5ba600a61ecd15bd43","1bc578c3fe2d026c4a3afa8e5fa20945592b7eb9fdbab8966d020d11cb57068d","fb6065f4cf8c21dfcbe66e9fe7c13cdd264e57b28013f29c68312a4841a20cc4","7bb7cff8745f7c83d8e2ef318515bd80b49e111d6e76925c43bba0c2bbf46244","3bc924f8b745ca8c85a4ef89f810803b7e3c6b1ec6b2309d4a2eb2f5a65f5e94","b4334f7b2f9089e70797ba0f7d63966d5e5f143051f4d1bef83baf29e722ae2d","612fd16a0d05a421a2c5dbc40b44094de0c698448f34d0e1538cb036bdab8db8","c302e13f738fd76471c29a6ae06d8e5b625f5a1c00cc899e73654c63ff3062c4","07e1f4959adea3bbf6fa6602a320e519aea7cafd078132570f6f5e5b02ce745b","ae056a52f0e9366022d98d678c6dfb3896e9dbe03cf9faa47a3341fc21ff0ccf","b848c3e72ca62f07e73fe1edf5966a77e26724b79f1ae01edac31d12b675d694","ff7790b8b9ab5fbf5923cdb076736ae50a9476f2f50d4220eed94bf377756311","42cb83d58522fe75844d6b849e0d7d23d2771e30e272499400163bc6ce5ce11f","1f6e11b6f2af309c5f8d442b7047add4fe01d5979788b6ab759f3d5f54e2615b","82f5577c9d9d9f3cd388a71339712411315e11f451892b60b99411726c3386be","c0ee0c5fe835ba82d9580bff5f1b57f902a5134b617d70c32427aa37706d9ef8","7d202b9cde8d5f98b21d58f3994358b83cc6ae0e2c7906bf1ceaf87a0886facd","8f34d4d2cabb62aa53a3fe3ab8933b34e5ca0a172e43ffdcf04eee3513e3bf6d","58410c2b08333f94b11784bdb8192544035237e0ba6e349641b4fdf024b9fbbf","522520eda393dbcc8555790adbaaf68cc3e103caf88022f1bcb37a6bdf8b4421","e41ced5bab4e00349adaaa7921734e7bc3ea927cbfceff9cc8c832a3d2222436","c5f5c32ccc8e8842396ab18c4b889b9469f98205a7e76ae617ba0f479c9a58ca","fa370376653d4f641c0234fa643f611bb1bebc7f63b197ce1a88105988d22446","f7fe7f8adfc17b10231121f6ad12b5d7e17ad8b4a063e3b031926bd01ca952ec","42f8408d50f377d97439e5212fd355867133fb5dd13d6b5af25568ad64e7ed68","bdf72105e555cb6711074bff924931db0e236c2832147f79fbafa884608fa93e","a9a379445b174f2242cdc165cce1a9a0d44488d2a69a12aaa54c7af1ccdc595e","fa01397b755c110a816cd63866b7da493e2b8e8ed7cb820d9dead3f95abfbee2","e9b684e837d4f041ffe3e8e41ed1badb623f38586c89fa5a0b4c77e40711f402","2697a6e4924f649841027c0ff6a17a4082587e4fbeaf62a20d6cf41da020bc1a","c2a960192bb9738f59ad964af2f5fa59f4333f040140b9b2bf63abdb61ecd303","c6681a628a16510a1a8daa8e12425509e8316a655690c0870f82f2fa1dbf6318","6e857b55a3165305a6393696e3c3edee3f27b1d86fb44895cc793d6eb353150e","1d17b1832e9dd33cbbc084575d74cebb66a03870f66d23ef3b6294387a8cd57c","8f739291f6573546114892d4d9e78119059ae5f38dcf7a711a815efdf660e5ed","ffec437f038917b2353076e01a2951983d81d54f896e941cdeca99581c8b7e86","afdd317bd0ff85071969696d35c2f771c2c9d1be654f65dc956aed6274dc62e9","ab5a05337f190696589cdfbaab1cf2ca955e39710c780b491b6a69d23dabaa68","002bbea7e7afe95fc4ceba8d30b41b937c7f75512e5a76f755204999a86f72fa","414872af8277225e49d44128b31a3f5f7a8b16a055951458e693f76583888740","e6a0c02827178d6eb3bc9e59850e902241b57059c0bdfdcc97f0901df52695dd","13ba1106f656a809754949dfbdca8de4d60cdcf279babe7314ee1f02279f2be4","ea918d0b02d55604bd8895f878bc6fdfa2b7a86cf393e53e5a9945260100e6b9","a98b2bf0520a0a18fde365cbc5b0dfbeb3cc5dfda6aaaa9a510df3393046e185","7fa6fb0bea7179ffbf6e51f840cda6762f0c80923d37154bd1998ad3fa49754d","4e61703f3098856871a00d1cc646ddc3f08673adb2784f2cf6628999b89cd312","4db1bba631227f541d21b799b8abb2767cf7e0bf58e3413017f1c038f075d818","25a6d33e0d5ebe27ba8fcb9f94e93223042e3284572c94037c37fe87b60b1856","2c84a38ece3517d01297ad6a44b8d9da64197859f1b6aeefeabaeb456d872d07","d883caccc9f8e3b454decd3067b6b742a2d8ab3ea7afa26b1ac1be30c632b1ad","0015856fdaa7b930748cea6af2e4076550fa4bbf4494eaaecdde1d47b8d14960","0272cc70ee1e1d2f7623210403296587051a511624b3b1b3cf0b8bb7f928dfc7","88dd7483f89c430275ea2575010d6befb9aa262b7b7dd2d2d00ca976fb84de57","68105f2e5df8c092e17fcac9e2d8d5b93be2113d632efa1e4852925dd55127c4","a72823f6ec9ad7a5cf87d1f02df1722c7c1216a424801607b5a963f5499e8594","26a1dc316b526b7016aed921bf970aa0fa1bc3f119b4dca496490caaab67e244","f9e429565a17bfe1e2d741cda1ec1a0a2963f84f76bbd5d48d59088f54976a58","1424ae3119767d2b335b4862cc8cc27acff1264fb037574d84fef16146ed2e5e","09a7bbce4602f000fb292db39a9e2a087e2c8f4c9fc87a20cf0ad4d239d1b437","c393dda8c5f72573e1ee68450e672611dd61c338f256d0ff8b8fe80c014b3725","4034e9b11079245f78eaf5fd0d14b3c10c60ba63a75d5b8368b39953652c0311","d87853c8dd08269dd3a08f995371a1159b690f01cb66c7374e2555eaf16955b0","5df6851001e3f0336d0c3f7e2d5ebc0650dac269b22fe7410cfeaba43a746e06","82e698b5137e53d8c11f33b929d2f2633f914f38f4b0f273a13ff76e511c1802","a88310fc5ed2e53791b8ba5af40c9c607a4456fa6143075e2b179d8f83857645","16a9d86ea9f940f16839a0f7a344338a19264568a34f5337e3d7c90f4fa2db62","29536d9adaeb959d714d40c982868d7ed9ae7746b081ab625f31b8d97f47133f","157f5e4bb34481051601fd65f12bef3b93e6276d9ee07902d64e5b6aa0793bd9","00e33e5dd4f4edaca2f339568a4e946a0c0618909a086a16657bd1929fcdc13e","efb170552cd43b3af092c66bf386ade951001da41b28391d3dd572beaef57190","43de00c76d07c819f4c818f4a46bcaa904aba68f6c693d962afc95378df8aba3","0b6ac90893f5b49bae1371ec28d13b37592e9e477bd001654a79e4a50dc684f5","f40a455e1b43cde0342bb1b28652625aa0d87789b70abf42347bc39c6e313f3b","5c9e4a4ab3cca712856304266dd00df2b56caeabe5dc0a36eb9b9367dc1fc95c","68a49c328c9121b29ec358e9510039fa308092eacb5f2d537e5b28b0bb59cdfa","1bb407883cd0352d4a992c8e49a188607872e627481688883ea5ee86453e7b9b","6e8327c9b50ed25b535c0da899b5f8ae79a641be6fa9e8d16a25307062d16e80","c30a2b05ae09f653202b5a9a56fd7992894447e38f7280641018a009fe25b6c1","94c3d484077d1ff13d69b8a5e9b8255a95f7255d6991d3ed6dc6ecd9715ee74b","7a95ce82a66555b81ec88d5816c28fe98be9537369e5f3c17a49adb50c37f9d2","c30eb2426ba273e8760c2bda645968a78923654badc2a1575ce5729a8446eee5","9a04066a6936658d75e9ad53e91d7a121325bbe63bf2afb05cf35829f7c38bc7","8d35ba810d00795278e6962a4bb058544baae151e2f6f0e028f80b61079dd701","3ce1188fd214883b087e7feb7bd95dd4a8ce9c1e148951edd454c17a23d54b41","44583acd1588cbc5a62a87064a3eddd15cb186457aad130801345ad4ca6d09aa","b74668c0ac9372b96149c9dee5f900a2db27b80a4dbdf50816141b00087d4d71","a559df872ed78d5bd7c3ef076004fe5cba1d70adcdcef9d3250d9c2613547c1a","05dfc2f063aaeab956a24c6e79f36dff0255036e65ce7a309d712523086cd9f3","2380081c09e7f77879fe40ce411d598446f221077f8c1701f79c1f346b04f714","a85dac49f13170f3754f4a40c31e756568ca1f9d9e2124ee42cd154082cc76ae","99c3616eb6dc45bc678a293c2c2e789c78d307ef49d48bd03f8af056c36f5053","7c11627713d1a07919c1392053a00d383b4fc35908769647b162f417fd674831","dcb626b2f6854104c114fa4921216708745414a6b5f6e596c402facbfaf921e3","35e86224150703d75410e27589723d41af7c8dcf1545ed923954d43dfae32c2b","6634f7f7656cf059606b5d23e87a199ffae2f18269173f8c7a091fbdb8a312c6","b1665c25128fd9450b8864f0d4340eace0292f9226d94e3d2e7edeed5dc042a0","0eda87a57033031a1aba05dbbdde6b3a7e46be82ec94e89d71a05b1a8c6276c9","f96690f32606256b40b584b1ca67205f0b4099c3802e2b6180391152b429d670","6c53b58815544ae2639b5e8f6d4d4eb208756579d599c4efd9134d149afc643d","f6602500f6df9ae79ebff63ef30c9909bd2f039a2efdaea8515b3cf35dcd0859","e91be28daa473c6cf7aa5c555a2cf7ff46116b7fc77bb730a7b8cc1f6b1fb561","987f32e97b6bbd5f6d14b7abf70d297ca52e5e7f4ed4e4471e5588924db7c5a5","43518627285fca53196e8472575a3d71949b118c09129776f6d16c582f0a12f5","6f055777b8ed0734b3ad78273027900c4143a743077210f6a64f183c7525866a","bf32a107054b43ce22398c50a1cd9374500bfdfee6be3e36cf3f7ad31cc5c913","29fdc2bea7c0bad0e57c0046ffe7fcd843c68c3bf45737a185f5ffa4cc159e77","8ac598dd6dc383e336a4924d7c1d5eaa5f87a15e7ab475de7a7228d400db2e4e","917e3c4db1c7083e590814680cf2d1ca0ecce61edc32ba029b2bd80ecf898deb","b0e5f0b9ed365ae6c963d47271aaddd4bc669789cbfb64c4311ca94ef27f6b15","b6c13571866eaf9e2c4e85feea40e8a018c8e4d411e82fae22dffcfe52d43b58","17bc3560a7d0538948e63014f516e4fdb6fa81d5f5021fc6add916c41aafdc4d","b58cada540e613dc861111fd1195baf705b0a854bbe9880b34ccf6425a1ae6e0","4254ab9e7eae410e5a109d64616045d64dde52241a559386647260dac0d4002f","712126493d297e9c3ae6a2a1691cc7dd046d68157c9a213586910e43c2e8f900","dff2df39dd3131d852ae04cd0e18cccf7b13ad57b3390c1366ee20a05fab0fce","4f6c8f7178b38280308acb6461c633f10e315c4e91764b15accb530bf49f6461","c6f824758ddea55edbf636cca33e6968d9d97652c20a81286fe99fabb09acb2e","f8d0a6e12327a2b4e034c4ea1d8ea04cabefd4c93e448df33a262b8069d780a2","2e16358247205683ac876afae302a85c4b5434fad0d263a3d1265c7a9de77296","c74846298b252f99565f10170fb3fc1c1cfc4acc41fd0d459019d7adf1591b73","977d76beee83b192a7df59c7c3f7c2cb8cac5bd1587e7dd66f63a97f2f574142","0fd4a2c4747905287bd7a4bc255472eeffc8978d7cd84eefa41312970ca4792a","8fceb21c9c1618933b9e9f214dc38e48afb9f05904a1106297b8b4b18138f6ed","c3f7544548bb6df94b5d6a868ab02f84158c479c168ead7ae5d00b08569ec94c","f324b2f6e97a83a6d95a710e3f011b00eb3fa838a836e654268445611aa0a855","7860802cb571c864dbd4bd0bbc8a0b145ed5d73974f24b4303dc0e26b846e7f5","6ee53fb28a14458c5b17c9bc8d162238eb9a685f0838d62b1bee61505f45f391","5aaf41a89e6f909bf315f49aaef689bbe9e01a119ac582f305f233cc157bb2a6","6ee53342d6c38c6e8af4fc3565ad6884a7aee5c51315d22336246b0ea37fb552","e9f71f5897e339bf146b00df12f1502276444b0166e759124000ca5b3155962d","b31118ca625ee1a3a7ae0d82ed951e8bac14ee89ac72986a3ac1114e1e9d1f43","3f758b4933b530026eddec92bd20523faee4d0928430f47ff8ded76f93c018ac","655fad803ea230c85001139eecede18035ebde3219cc163211548965793d1a2f","1452b2efdd39696ee57235552a9ca75a90cc511bf236e47c99fb1eaae59ef922","cf40b7d19fe2b281518318471ddb401522446cb187eee4f77d5a8c14cf1ab6c4","7740f299b26584c2fd1df8c4828e4841b8c3114d08091cde4913e26dee31f1ef","1457a48d9c22048da9c4a7f6f0881e0a21fb36dd38f5015d2b2e876925c6d630","ceed0f156acb1ed5db646cd1ddbf0998d7752879b9598043c733fd7d2b8d892a","71ed34c1a75f3642fbf7fd11490da8a7c3f688f37bb9df651b8aa8ec02f9c197","7d9ae62ad3e88c4efa766c65eec36996833a029d3d88f225c86d220ad99c3479","3f200476ecf3cf626a1f87416bd53c7a71275c93eb3cfebc65d1c8663da63ceb","76dcf5136339b8d19a2bd946b1159791aacbede1e5a2eed65477b32da100fecf","29c105f0f346ed61d284182e6b8f08acfff17a46496c603d92d7b0c46c2a7300","e74db0e60a72793701b350e928eb28623970cc10d23c88aa6f985d48519de0ee","432ba75e257724c62bd0dbb18545c84e097d3cd55490490cb73a8e29a5baf178","560d17f9e21f9c206e001de80349f214d82f2b91fccf1372e2a6dd6efdd06255","4bac4e73cd4f87ec3392fcfc71ffc696703b03d33cf13813c38934f79cbe16fe","b0b61f537ec05f38892ceb23b5bd9a10c4bfc1749801c6aaedc219ae224ac92e","e55137f58ea46693486daf0997aa8c4ddfa80367f91cec97bd2b07005b3c8ca0","70d3ba3e2db4bb7ebaef2ec7c757a9972148559ed5937666e9dac3dad7e00d0b","132c634b203b886c2e35db19165181818b38b31b8655af39859a3c9bce92c98c","ab65b306a71e7665c046031d7f8a08265243d3def867e5b1962398d208e32ef7","2e1d527a1e151491e426aecc3b722b73ea859c6109f2ec25250ad9875fbdf527","5dafa4ac5d3fd4dbf82cb6d647237f6d0f61aa0ae9c30950dfe0a91bb579fb25","01dcc83a4e3013824cb1dbb031815ae00ac08c59249c01b0c903303b88bb1da2","9246baf1faf313c11f83b8a77667875e3c5ad7fc133a946f207637e0e04c1377","795360cbfe5cf699294ca96e4a2c53c74868cf0f0c1952a8cd1fe3ed396820af","0b84fce2aa0e80d39b60a841ef1833dc8a9a3464c0ffe540d5106c2a4e85a5b5","6d59a761c259915e5b264c755719b31edba6173a0187c9f8530dc4c882379bff","91b90f342980a1f160ce1858260572e3eb504e1aeacecd45e2937da94a861681","c86cd5af395c9f9488e12bde19de1cb263af78f9096283e5109acac07bf733ce","340907f9249f274e780fd87f244d069bc9823a0e41455b419522699a60c265f5","2dcc49a04e6b18a7d8c9bc712c950b14d1f1b5d74834be9c0d33a2bb94c28190","7dbde58fc09ad7513a61a324c74250e2db16994c558a3195edbbc485b346119a","050b3894511c0c0904ba5774d131a062cee75cd64224bde47ffa6ab17ebe24f2","5456fc8b4c6577f6363bd3ae7e4a87a9bc16cfa4d29e0846e31e6b13cfa017e9","ce89e72a53e691259b131ca487b11e5bf6892d9a13d20572fac02283b6d5ff48","bbbc338d4ef8f35bc81d99b9844743ab0f3476996ba6731853ff634634041c4f","d9630044ed7904c144822c02c9dbde2de1a449ad61b7d8a90a20ba7b447ef3ab","e78b6bd9d5559a30562793168b3a5dec0b0a9ec77bb7f40aac8c2da4e649257a","b1240332c7970cca55b18409370198c67df77315682b1289bbc15f1e29486201","aec5b7da57cb830089a2977aceb7b374c388ed2a5680dca11b6df222c8bdd857","74352ef5fba4c0507051e873eb111ca4daf8cfe8c5a60fad4a052f54043af306","7539fc2c52c292b8036f2e8e69bc215069c49ae32d2c3a8c7d1865216c917f47","66daa6d25a6b63e5b812eb2e08231ad440e12b0dcd5a09134b71caae704e81b5","c693b6a8894d62384df08febb2c0d2842f3a8e207fea3e395ab511c78ac99383","55d146d4cced79dbfa4947ba611a5577b60424bf36d325f569e02d805324b9de","eabb2ec60d131e916918f290e5e512afcb258cf47160f6bf01d2248c3e09be9d","a00c886fe9542c61828ec7bfab39a8fd96b8e9c3c655b78781e37addd6201bb9","0c70031b3647c2ab16ab805060cb9946892914083a85132955fe0673b4abdb48","7fbf96594f55760f0c12ef195a5283136896b98271293eceea043e65445106d1","766a966d8b787b4618cecc7285d4b4d47d31cb8b973b29b9455ba220a753d455","b22feb16cfe344222aa30f16c132f7de24c0cddeb5c99b625019ebc1ff859c32","73c263c6e17d9d779fc4b32f442978f949e254064d6a6082fb2d63b79dc01cb2","e984434af82722c4f37576924ca75a3b5cf9791b08deff17457c8bf7db1b31f2","1d6d529bb120434f80cefb19a5399ea5993f6a3cbfc76c53fb508a49a0f84883","9d495fcb9212c454353c8b0bbdc2edd81aec58daa10c82a41b0bc6e6d32dab24","870d72aa14d18c37bae9e5e048638c655da5860eadcd625ecdde9461bd309eec","285fde625cec96122823b55fe271de8e01d234a102be6b87f0845dbcdd50b477","c4343d99898f580deaac7d40d0f58818b0e477cf304eb784d7b8b695592c8d28","c5f64d2c2fc1d136c035a27b95ed117b55464365f8e50598bd910772470b7409","6911c96abbb9b9e106618321463c817b1c22de6db6094e7dcab464f6d3c74c6c","ef96111abae3fb59d1ccef52716cdde8527e5d08a9b2afb87c43ca56cbd48e95","28163f226ad2248aa6b33707f35dccbfcf330ae6edbeb76cf17cbc14288814f5","6932fc8184941eb0d76fb7e1d4e7f43d01c91ea2dd2d2b09d0df5f986d451944","4980f2b3c2e2bfeff7f61ee03cdca90a6ea0a55edd883ae449ab0d2411410c2d","87053e6f45657c2a12061afed0737f193424a0c1f3dfbe0593d0c7bc0e1683af","37a648fb2faad07b25411e9aea2f51b0ae1b7519f9715ecd848a6d0a20f0bdf9","302c220f59c21e4bd2848fdb5f29072e9ee2c4f8b069eae3eeedb57888198ff5","633e099ce713f7f6b842defe078ceaaa5bcd57ed93f80d9e4a6955733d5c9581","6f30da3feb2367ed088d8abd097c16b94e4384b738be8a1fa1555ca9fb7580fc","9812111449c9d9c3ae77873227a91b292c5ab2287a3b142d41fd9bdc26d3930a","02968ee0de2233039347c21e258c4452805aa2c477da347141e9340a2eb62ec2","2fadddc541ace727cb4150d05bccc96560c5018c89f9efcd9bf5b7eae74c88bf","bc3c2925892ba37559fccbdc6a3090954e41da87f4d5d9838f8332cf7171eb27","0705dbf46aebc143d6a41a20f0623ed23da0c4c75b7d3cd512a73ee63bb28714","67cfd4623ed25341451ac578d82a85d72154b5fa330ba172e369057a1918598c","65acfe395635771c296a804cd3ab0723fec02516228bcc2c080f17ce103b469b","e6c13705d6d34884fc3ab785f237462bd8c46eeea4a8cc1a7f0a2c04a57e710a","fdaa786eba02c9c24567036aaef4dc67e00d75a83eebf0bd46dd87e3d10a9feb","1e372c95fc022ede4c950c42a7d4715eb760d20b92af50e6ad423771b634153d","ea2fabde0a29b069d978cb94bb0c46e83e3ee2494f55ca9c0e76b1b71a5fb91a","6c7716be5a9fc700447b65b4ac75e1f4275639b8650d91c027d49977424d86ff","c3767bacd8926841afa90f85c19381f9ef50fb30281403220bb87e0136418895","c20dbc47bc5165bf674762bab78a3ecc02bb6d437a9ab8774ebb6230eff21d78","dbab042cc5844fc4ad66c6029cd37b1762f4a66999fc99b5c16b1423779bef69","0f301f7bc6e05f3b8668b57325e7e325d54e04a4d64853aa32d827c4b40ee221","4f13e0970ab6ba8cc53928d0433a6aff78ae2b19c37ad694bbd48b443b3467b7","595f552b1812fc6628dbce635e16b14fc695277079b956515d2dc883a9ab7f72","facb8654db6a6edd7369edd62c93abc27e7adf3a5f9b36a69f174659a3a22051","4d89ff2839a667f0facb19b99c0bd38fe298356384d1469b643416378fdd6824","e3205b844ff0b5216744d8469228acce76cc07500f2ffeb64196808c9722421c","bad36e817793cafb471fc7524b4672b0840005fd0f29a6b820f4be1e5fa9b545","7a84b9d1f313adc0afa39d0a1c69a8ca7737366262d4d89ebb26c20bb2fb5d16","cc5161c98fca54240ddcd2c6487d591931ff8c5da6b61bd2529334597f607c5f","1c311cd993f410d94421c58a4e85825e9f9d570464cc0ff4a917b342ea9c89eb","365d9e26d9518bc826b10bc4d0a266c26f7f4d7c655c02901eb147eb066a1058","dfc7e45952c99230e26f4a8a2a3dedf0a689a5d251dd58b9412de78806b35c75","efa0da532cfd766fdf9925998038be8ca7add4d9e52d2ecbef2d4170d8cbbcd8","191a25993ad8be469d9b0998f461813f2d025bdec52745a652a27dc802eb5387","b18518bdbcca97c29d82a368a8a84c13c5aa37765f491cb4e6e8e30553e2a9e1","d35c2563d84592e8b2709ba5736ce38c93f5145bc2ad4e544d3898d63fe5a4a9","3c11b031d38834dfa997816cd4ded889ea8bd4bc47049ce2218b5eacea2ee953","5ad24f459f0398d7f870cedb64238a2102686a1740ba4dd206653b2400e8efc0","1ae7c3bdd5e8b9ab8a7e7541544f1b80fc4bfd336fc8fdd6b09c243b46cb2a27","669a5e6b59c3aeb3435ab4514d94a08dc0821172ebc7b869181fc9a144a49313","c58b94773f6ec073af66cfe2bbfddc2db70c71a0fd3836cfb8cf47b5948bfa4c","ef5336ebd64e8ca1e4ef7614a9be4c1dbc9c3de8bf58ed5973eb61e2fccc6641","1415da354172ae55c2255d24ea69f3cb67d54ba64c7f2d9a0852db2b3a620013","70e9b9596adaef9cae93810acbe932478ef6f0c242a9759dc753c96ced23abdf","27fab6a0d536018031f9831feb95a0dcb5b0c90b8d95331f3e3b5f6d2e789f0a","9f4625a6f5bcee5f65e85421e64c82a885eff18ea7d14e6a51f902cca16362b6","38947991354df2f3edd739d868a67ff7dc2887f058548024dc6fb789d152505c","29e3a01b356e71c4d59e570159f6b9b08118a644827f5ee588b8749d7f253eba","058189b10098b030f6160a8db6fd0572cce148a925561db2e263989d153e9066","019064f3fa2b1c080b3a1f52512f10f336ca0550b9d06ccd89ed4c51cd6fb064","c1c96a7c9833da6e48b78ee083e5088726337df8d57fff8fc8305ae1f7ef18da","611b4552c84be7f22fac85208f20ca8102b184d259fdc2e4615516818d9d8e58","cfea0976d0fd4501d30f077ad3337d8ade851bbbf367ebf06955ce7da7aa7165","0a034cc7e0a3e13cc4487832f263d6b99889c2fdefcc33ef7d8b0e1dc87977ed","803e4eceeabed15aad4b89f7d64cd7d0aded439d255ca03378fb829d88282ed8","c843d506cd553a4b7dab0141250447ad002407e30e2845648a00d5cd1af48831","07af21339a07a3b2ea644c6516fc0f81c30ea38978170672e95e6140884e22da","3e65ad53a1c530261dd4e3480e50a07179a3e47fbdfd7af25cbc20de8028fd61","1aae26976c2298ca2d4218bc5500f741ed1433a93f510a86267c111e3c94f84d","213ae9978e9d91c63c8cc3a05f6a266f1f9253e03786c731ae3967e24f2fb02a","ee2f1b2ed1ef99841639b5eff7d82a63aef83b228035e147b43bedd2184b5716","133f5f9a9b1a57fdf0df79a1d0163d5447ca656fc8bcabe0dc559a39d0865a28","6471baa40b9d9eb9e3df82d82af11945be5d5b6fd4d520e6023d4e5e3ff1da9b","a494926674d1c7d2150656b83640a2dd7912f82eca9b1469aac21bde7bc39434","d3b50ad1cfa47831462464f466bbcbec74c14c65f72fa172cf9cbaf130a2f0b3","c58625a2c60609190ea4712b9eb8889a1fa43d6e72a85c997af7f149104d5739","c0f8dd363ebd35e590f6aa79b4e6662d2b4af7ccf70632d7e609552647c9bc77","4dccbf8d58bcba60e1bab6ea6f1bcc03b956a19c9e0b83c77b7209a85d1d5220","fa9177962dc1ad4cf2e41559ca2814a6be07eb54b519815f6f63ea74a1e3fd99","e28f18b19bab50ba6329fea3ca61f7d0f10b37f6f9383e1878e1dee447d5a638","d9c2ab3ee912feb876035cb4b55345ebd490e054b4f59cecec81a9f0ae57e5ba","3d5381d4713fb7e7a9d0a72e659326e50fd467e9053f182ff63ebf071b6541d8","aa3678ad196ca897136e1ad9a98fd11f8bf54df9d7cf95942801734daa6d9066","8073d6de6bcfa1ca4071338467d9971ae012cd41ad8ad6a55ff7bf10b96b0909","f633781116ae2745b0fd899413f7c8663c3391b433278b0e147468b364644360","4bbb387aafbeedf481f4b5f8e32f5fd3e8dcfc66893b8fea5ff49ee53d98d3d1","d92e1cbe8e84ebce6580ec8b612130d4d0f90fd9ba2ac1ace05e5cbc3b8f4ee4","6998443850ea36afee9b502afcd1a9e148a6faeada6d7bf5c81fd37b13857b2a","ea6a87a2bcac3ad2ee67c72f4b98fab6f7af16c02d6bf55a01eeb639ebc36f5a","0a48fb8a2134d7b4b0be57a7901a8c2d3c688ea5d9e0eaeba95a03ca0475b268","f39c093e274d06b611abc42de6c81782b26c3a801ab2f5c19f8ecfe657c0d849","1d6b310cd14a3d9f2e89c963231210e6eb9358a5a94c7c91961f3cf2cdbfdb50","a3528d20045f767c8180f2b964348d1381334e95618c92a7ba5dcb4d2ea71c96","65e8284e4bec88a2ba96e91d3329ed0bfa22739e6caeede2abf4e564a7a50f64","59e9d8db5c77501b80071010abf9e49e692fe54eec8d28bddd5950395aceabcc","1b464937abeb3d4453f55764096faedcd8033f8352b8936cd79341c6065d14fc","2f8f2380d037a249b716b901b4129c4659ae983ecd2731f9be6a79a2ad1786bc","6c676d017a32f9cc7c37fd2c0d0ab3688f93abacbf08ba306efe0cc0ee4fa44d","ca9bad83a0c0bdf0a6714e3cd8aaa3136121bcefe8e717c2b413a2e1e879db93","32780b45af80f88c55b2e4986cbb9b941934447e7079bddfb87b101e474dc73c","c839053c52aac9587d03f5796844c967f652ba3ae8d0e5d3adcd845b24d01d6c","e39a6712372f77779dc7cb582f94e4d158904bb4106f93be5868a805793643d7","c24d397417c34d476f90e8ab243e9e19d572e7dc0e07003ae557887ae587502c","01a9811e69f80f9350f781d837d8a877039d6e5f708bef07e2cd00f9e5d06a4a","e9311facaf80c84f3fe1a59c78c62248b96bcfc5755f2e216dbdc619680032ee","da807aa75559f98ce6f0e907ef31b9f31aba7118d3fe10ca17360efac1068c8b","3a7acc430adc6f92ec8c024e2402d3f45ea9e2289ffd5751997f3b43c877cf29","cd25568fe8a62c5b93cacca3c87ab97c47d61728bdf91b78a4ffd93f110eaeab","dc3991dc50848f0d6ab700070b323e1fd983164de281c41fa3db933f8d96f8fb","da161ff7d6562d5923aa5b3a236f4ebd48b66ac7172267d1a2cc4d507e5c538a","f2d4561b41d35a23392443a54ee503fc58fda3b1683d6147e69ea507bdde0450","6c94e194b2d1d2647b880c0ebb84a308d2f3faec40914eeb34521cbd9b045084","0da0c7bd5da571b0fa7c32a871346ee6924b29667923b852edadb18d079c4cd5","8071f50abe0b86ca07e9c280252c37f70be5f14433248a861c46e6e3ba4a4b40","f2254ec7fd18e2b8948251221fa27d1374ad1ecea217e7a33942b476a85779ab","e9734c20ef02c9331ed3bb604d7bf922e3bb31050a14ccd8f3b86797c22715be","b0827cde3ff6fa0b1c031ac94dacfa534f4be036d7bb32df7c3e040954e94d44","fef08cfef9e9029173f5acbd10d2d3bc6a69d3436dcd3aba7533fc368d260989","f8d0d547f4982ae0d1289cf9504b408c0b1c111ee234a416cd3ad83cebac95f5","10333e8436e15746ffd9f5537b3cfaa82292c4dcfa602f9b31ee1c44485309db","6b92935210914c9ca379564479e36f65a5231ffe2c918050b5ead3a1a4c34421","2294c2a1fe70acaff38b7bcfdefda94656bddf0ebc3742eed71fc8cad29b12e1","850a3eae12fb8983f79deb45596c23a91dc1f67a24a597632a5137989705dfac","4270fc797185a335a0c89521837187e4f39554d507edcfce484a7f79d3e75c3e","7207a6ce56905a6f8319c1459c2f1f512c89020816caaf0d450155488ea7a604","e9f8d2077f730a5738224233b2f0b7e04b572ae5bee7df56492f870313bac0c6","b725e13d034aa926b6589aa3f3256ceaeea8203649f86223e9f11fa8b960d69d","a891c684070eb9635db7b23076799dc2b22f85e42e2f3ec51918e7f81fb0fc00","17c2109164124a6e025cb605d330056596306e36512cfe95670c3de3286f8780","5e7dc4de0404b00d755be579a35e1bea5ce346caa5fcd68932c004048d22b1ab","f01f7fb9c2d2998af7c5c89ed552a7f3e3d958b273943fa16cffbc76871ab242","e5804fee6612d1027118b80264b9a7eb73f8fc2b9e3d971aded45ce35acefe6d","dc496b5893a9c2b02dd275683916928450a553f0661e5f68b69c82b34f293ec2","5572fdc87990b5ca78e9b32aefdeef33797c5ac456d7ffcced70046fb1909403","456b3f757e1ca60b412dfe0584c44b04b3a05328d6cc2478a480eba9ff107931","a04117ca6406076f66c00fe097be36868d8ebcf3a17d93d06d24d452e97ffb4d","e90dbbd6ec0d8e44c9caf68be9e09df50067ff80b2a4b4c5cacbd6ee0b574418","2c504642a5d7dee1eee23f18f0fb1e42d0aeab67b5ddd4cb97cb3aa59da9100b","0fd3e78741ef3b19b801cec8c3911ffa0d2c69ce17b92369f2ad25d470679c75","3f2bb4f88c41cf6d80f6ad5f3e7ab53e6b6b1ed77177f37329c6f9375f6e8332","32943b460b2a513f9b0fdb2b2f0d98ba7b8ac94396db7e3ec22a4da8a9065991","e5089479fa9217a9b4d02ace9b88ada6baca6253c9004adba2cea33a8dd9cfee","013f45153cd38e69dc622c419de7f52b3f9991a8363e7fa9896a2ed055622bf7","487b588ce1311e1837161af2306a7f9140433a17a10937b3e38322b8012bac11","d0cce730d2abfba0f442cb2e06d0eab5df633a9df12f29d98fd20d534a0a4d87","36bc3716dc61cbe43eafa0891f9d0966ec905443ec36d9e42b027d667f68f6c7","51fe30fa04dd620e06f0be8dcf94d905d3aad5e924de1a53a506e95e431abf0e","38a2baae962d0e8939df77ff4581459b4937777c0f78696c0162edfce759e419","d59ceb78e555a398769ee7803ead5f717a6726f1722bc3421af5352868241b32","5a5364849a84a2a889cc82e2b1d19a7fe254b66d777c3cd382e509f9b05afce4","1ce3f65f7992668c401eecab3311094558cfb0bef4ca83c1d8d74fdd57992db2","e01c15db85fd3abc6ca9431b28f3dfed563bef5ce9dcb8c72bc7b01ea7b2a3ca","b3ccb696ab703b8ddad9dbe287518e66ba050f045ad32e9087db129cde591a18","28f2b8a1edc34941457c28c30de3926cf9a97b43b6b6c4839587032a8b37d58c","a382cbd1fe35c6d9f156cac7451a5c407ec148641fb59dee3cfe9e5a4ba8af29","2dcadf82861fbeb6471f9804ece9841490b4b373a72b61bc50c63eb926e631e5","3d186015a373ce14b824b168c1ab8d0271efe71f604a5942ba0cfe11ab2ac93a","02649070f9c1dbfd9e0b12e6170e5dcb829fd0400c5077593ef8b04d152a4f13","53c8ef3a62b595e709f739799bd391d84609f6c1dcd7dc1438dd70e230fce487","1eff327ae4c16691998f9459afb22179fef95837207b60b4bef70e4a90eaf142","b6ca27137819501eadc30fbae132cf77fc3fc5f8ff27ed823e8727ab532d1b6b","778e483f9e483a30a384cafdf4bd8e7284643970d53363275c4c1827c3fe5e4b","7e03642aa9058f7f47a88cbe40b31ee15b49b3a00e77bb259eb21293a5161764","f0c3584f442905afd05348ee8081e2ac55ab66999f19617d5bf5cfc34988c6f8","d3304645095e9d9028f223b7ac705766723306b249986d03689480dd38a583fe","8377575d663c1b08e2e80bf0631bb0aa11ee240749d995486fd9010000d2e1dd","bd6bfde135cccfd4eedd1b8ed03a003bdd4ce192c721fa3c3f374535a6d5cde0","c0a80308676b0669b1e3bdb3f6f18b9de3b5a03742fa24a3d866a6cca031e746","115513f3b9be8a6ee0627806747f88cdbe06424cd09bdb2a1f54e5d5de3bd7c0","43d97c80e8d164494dea6acb78f8bbfc16c130637c24c701790ee3e2f3a2990f","514bb90783254618275f222dc617f56d39b968d2d47e819aa4c39e910e75c3c2","f3a1844142e8390b0137452c1144c2a0cfa149367ef2d75399b12f51eb824fd5","74651dc76c242c2468081add0cdf71ef1fd29e702476fdccf6f1319aab7567eb","7413b7126b0d500bd5940162fef56a903321b35366a1e31a1bdc935a88f0458a","414b005673f20f89045f51079fde10e23f56ba2ad6eb8f61e545c0d9e3fc4bdf","8dfebf64417a6df7f1c252d150e348549ed9ad0b2fd9556059d19e1c5c7f52f0","abb0d92743dba4bc1977c9d1333ab0c91984a86847152e933ae1d6edae23bb84","e6075f549b3c6015527672c03a635dcf78be0d13b919490fc5e3ed69501c4c1a","ec86e21344e3d56f8ca5e3c71d7f722ea14b0d77cfa4e30bcfab34f8d7d79698","f4c98f485295f9c9af08088a3266f4f92cdc9a6c0f01c145a9ed1971bc27f357","655af9fba84630215adc31062a83a4e1414897d2db8e4ea766d6c1371ed1e135","5ac47668377352a181e362ba93dd3aa1d63ba33385675c00305ed369366c6d3b","6e4326520ea729b2bc9142ee5e53747893cc4a3d5cc72f275ff1eef4a0baad6f","409e86484c2c5188a3d3f0bceec07773b3d5805672e7b000d5a93f02d5ee2ab6","aae89de1fd810697cc6ea0d4fb77752962a00cd0f05a5dd904bbf51622a0a520","cb6a225b52de9fad976ddb6d53e1e9fe3ed9f8182e9691ace92ddabd17f50118","9f3a18a761f8b245b959744cf9471887b58cb2bc5cb2250dd65364cdf718da5c","dd8fffe1ee243cb43016c886e775966068aa78d4b1bebe18e2b34cb3866dd050","5cf7ff6ff461fc0cc2fbb4ea8122d68d2cedcba0926f2863d180690b7da63422","0c53e775d8aa537c650ddea712a9a877f9bfe7d532dd602a032b24928a9e3cfb","8f352ba2ca6907eeb17293e677c050197c541888c6bd2e7aed9c622138f1af7b","5c6713f4ed2ea1e499aef1e975f7507a8eb905a8fc80e640d05a293fa329ae95","73268a0db28fd60badb98925102561edbb15a7251108b813acd7c1613df1bc6b","fff84360dd58dd9c2507b1bd948e3703d0a821b1e60f60d40f54b9603aa0e186","e42c7f0abc53f9031494200a2df8d3d5ba9ae3e1548433e0b092eb966eb5286a","a38d81b529f072ee8834f696ecd925067eb967b47d8f9cd9bf6d101df4125f1b","6821947f8f192811cb08c57985404f28d3a63b14780b8e1b70f9cb32af6b44f4","8d85366ab4e4c1cbe25e161cbf96be4322166ff32e9b0ae70270539097d90e49","8545f9c8becc270a427c15afd1e1ab7f0bd064b598594161ece293c2f6961059","49508d34071950e8e3abd988ff8130c4d78518ec5424419c7cc7fbdc6041a602","de94ce98d1661ae19208debe76f5cdf3b56edfefcd4c653d537a3a4daf3dae58","eaaf581880585a2f4c41bd689f9ac201ec02c604c10a230c852a8572f829ff23","fdc60cb95940a38b8888b0ae1a2b3e64717124bf615005d02d43eb2c75b9ac02","813f57e11b545fb83ab9868061c54fe5aed1998f0b33229b7a5371a7542a3d26","8febfe068b4ea72fe8daa5bd5ac73ba3576d99e9076dde1bd6dfa777ebcb87e8","c45fd607e9115b6c1f93d83b04858d9c41b22bb1fb973e6c32676862485b3590","3efd644894ac3687942b9bfad88b7d3eb84c58eccac6e2f95b8330f3bb0b4fb3","cea875b88ca49d45af66ecabc3d929371c62d570e465131a44995bc74a470d4d","244a64f6a2fe544f75fbc37a3e22bd32cee273f1c85ee734e0da670e0f95572f","cc15cb3e621ab7be6d1d7e1c1140ed1384b9dcc28bc99b95d40146dbee0eb980","dac6eda2f30e6a2ff2397cbdf8408fedd435fc29af8a00bf224687cb2acced6d","72c197a44aa9a89b75a862bdab27cdc9eb18a5315a1d679a23251e1b9c54b80b","843b854a221e46b2f3539ce6b8cbaeaa537cf2bc5b1ee55464514b9b92ebf28f","636f6c8a07ca3a13112f25335f3a809778458f4cb75060215814d91b04070a7e","1af778bceeda4116639dbd791fabf852e62bc46b54e25df71fcaf85063fefc5f","acb0629a882066f57aebf558b419f0451fe0c298ffd042ffa13ff43a664fb502","ceb2c10076724167a327aabdd9c7f2cc162050fe1e067223ab277658ffddfe3f","b0b9bf232555f2a5d6938f32501729718e8fda0b3b19fceb40e1dc36e4082f86","d4a4216afaf2598a3be0e30b41966d6fbc8e855aa8dd6b07243f8ae1adcc48ba","d7934082710d464e1d1323614e1c0eedffe924840e221378f66b132b5d4b54f4","6653cc5b58f1fad340468027af7094d82b5c78bf5a6fe9432a2bb2a5781a36f8","f21355cf837e5afc274098b757907c9b799e5f9e069814d71055294c9765446d","e31e3b2dddb7ac8d85b355f3e588f6929490f48c9d84c06b3851c265568977e5","971b726308b8c63760cbf8842f1a6ad184a694564f37cba8fda58be70b534d09","94bb77de4f8cf6d226f4c9e72eeac0ec035d821c951d5360b61534e53c836240","fc447099e3b4c114f26386cf4847e90b48ab6daf1e30480c82bbc1394dea6a4f","4ba7d97f2a3f6b000d0e9d908d98095145ce01f36cb4fc123a09bd7be4dd6e81","2320d37d68aa4e0e4aab4fdb4a52f5b56a625df5715296426f32bd15014e2a27","8a97556111ff393c10c636d87f83257ad9c39ceb6378b5a679f51e3bbb0aacbf","78d6f8359c7533f9218d6b8d7001845a213d742b1c6027194add310cf5c2bac9","94545371d0a3a2d2a4b8970327f03192b9b43713cac737ef76d5f47db24322ba","9696db0f332efc9005424325495a958ba8d42e42d91ec78c2db03baf7cba350d","2fdf63913209869188ed5f2068666e081333723fa133ae40028973189e19ac64","b5940a91e269693d039e8a692ba04e00aa01c8cb7e232f6ebeb567c1a76fecdf","6274132411322e401c860249131b466491e81d128f9bb9711602860e812f7b4c","733fb32c6e11f9526b8081cd4a160bbf70c9677426c7324eaab494015f25d02d","9d19cb87d49d02f5aba95484ea069656f74fb855a84267b798c8db9ab252d7d2","a7f39d048faae6862f06649b6eb76363803e3476705953c612abbf55b6df8ae0","071d32084a993920292baec18a1db410acfff8c6ca72e2c88fc2f41e1fb87e34","b928ca7215d671017aaee0a96626c920f57123087dc1d659c5beed135e79066e","0021d7dd2a42421a2bb57ae9ec120e4b9bf39680eeb940926e1562d6ba7a06fb","d5d5c2eacbbb2b1a4588bea78f6879634483430eb991eccb423970b5cb634bfc","31823385b970b912d1060be90269f6189f13e41652c75562100ff43d99dc7643","c56e95f5f0508c6047fa034d73759c3c3b4424b60e1eb0b991860272d70d8c5a","05f8fa1fcdc1724ba844aec4e5f9e1cd86d2da5864560d77a1392d9d86a1a136","b28a4546fb6f1cbee654b3a854b0784ce09102ab80aa1cfdd17103eba4ef3aa8","bfcb18c8711ec0be1cc4156ef3cc8c1d9fe90020ff74bff09ea8656a3fac357a","b8bb71a31e604fcfd62cbc011a8c6554768a50fbec02102df6b9467945b71566","0ecff8cd1be2f834cd4c8088533ba96dc1816072c2a72e6351b17f968ebfcbc4","dc94aab1dfb4008cce7707b7ff573a8de8b60f4c5bd7a3a5b5c3e611309ad3fc","e72eead87672e2f084c04b32632b830c3de5a5d8af9b85e9047b58ea027f01ca","eaaf6f50fbdf13bce2e9bc5eda65151e588a6871da5ae2d71f5a0936bb30b9b3","7035913a3659a5ecd2ea7d0153e275c80dcad4c41930776797a56438abf083c3","d45d8c0f237f3662520bdf5fcbcb274d531cef7716c5b7429c3afa2a3e1c069c","08875684f8a414c7991976cfb428b482639b08cccd5b0188883f367a283c58b8","6e5dee56b662d97aa0399a9539de9da95aecc08eaf2a848111e46f5dcd414778","93aafbd1415b1d07ec1fda7143a7002332d4c80a1284308220ca0a694415418e","50eb99eef81d55c5c820f35625264d988e35648dcc58b65742bfdbd85d995cb6","393639fa8cea06dbfdd3e57aaf80256b09b69161b413466c92bf105b4e8c0476","125e287c2dd77cb88c000a278a0e5e62ba55ed2a7a0ecaff32eaf812f09122f9","1ba686d11a9c7992dfec8c1f4aa84358bdb487c31831e42082749e7e7acfbc41","f34fb377e1a4479512a1c5c5092f9df50180d7e2bcfe25ccacd755bbaeee85db","c8417481ed46fe65ffb95852a2b8f13980e3eda0386e8859e7f1f643b31022e2","9c0881e572887ea7db824e3bbff6f366d0beaed917f74ab89f4cac18cf6681ed","1e67d5bcb1aecc4c8358829351cc8e1368cf8811325ce6ab1cb3208ec30d487b","1381e7105540aed62e84238a87d5c3013b9b252c14cc8a93937f48ea6dd65875","fce39f2bdad0a7b69416b77a4e4c64892f33b4fd8db7ad24bdee4818512fb222","db37bfb0b7bcaebd5bf614212cebbd2ea4f6c78313f4cb1e9bb1b23343d2c41e","078fde83cf3046c404cb9eaed9060fd03e6cee658b564cf84600f1ed1e9719bb","01ab6c96d5e7bb10c467eb1968155e4d5185fa65d781e38440b9a9101d3f389c","5103521f99b3f825c5a3403faac2c65977695469f3f8e67725dc7fcc458b55ed","e6d27362f4c6f1bc458244a3685a3aaf91292fc5c7bc4bfef15fe55804ab668e","3b97b829c6c235075ea3ff4ecf692017348ebfde7c6c388a9b208208055c8caf","69b7094066d4d81a9a07cac5a931d07862e612377aca0f442d5416dc50a4514f","3a7c778ae87796d15740c10571caed9988d1d910b234d84cb8ca53100bd2cb58","dab472507f4343fe7dea6249106c8e4ac6a4f804ce1c14d29cdd020f72056ef3","306d29ea5c1af7ddc5d836211081487ae09a8708199667d9b5dc61aa5e28fa90","67614aa3e091fd1a6ee8644817ff6367ab71d4ae9b94482084d8c9307d19991b","25d8baa25eda9927b7697e45fc61ee42e2fd18bfd4a19bc9afd51145c7ebdf9b","6117e8bb1dd865d96c06b3f379afde87f9630236c539810ee4762d8f4ae01525","02c805356fb80a11386fde02c9f6197cc8ef57ed1c66e477bead46a10ec58694","d3088cc43d201314f21bfaaf0fab3f5ed52f1d67dfc6906bf9ea2b8e4589d3fa","1239d769db4556b7dfd74903b65d15db38046291951f6603add11a8e7b2955b7","3a9a88a5fd336bf1d3cbaadb0bf6cef53ea1e509d31be3aef616ba4165b3849d","145069008f5f02334b346a1330ba96f5dac43146003b8e63a25fc9a3be984d38","222cab5829f861675ccb987da8be91481251e0d6f7f73f5f3648614b94ea9805","ed6b75f46bf8b7d8ee54af3c0cf2b50e9de254047f4d8a8a2c8740f564527fc3","56fd679723ab9eb4d981cdc57001a226b02ad542eae5ca2e55c463bbec12d10a","1b80bb01e4fdf27ed922fd1bafaa449ad46eeabab93affc77b7782aefd62990d","3c94dd6f11455a9469a7d3c845b1059bbe0db90b3782b48cf6e581afb7b57dfb","965d0eb9456a8aa97c0a1a1cf7fb65658a17cba76420279c46d10385d7169eec","12fac77bd24b5f7a9fd034e888e2a9b91f689022e1e65d154ea10f334b716b0e","2ee4af62a12e9f1e273a7666fa86bfc1fd000565d859aefac04d6b90beb2770d","b25919362d6efd1255f526b312640522d0ac969bdc60e077cebb159dc27ba084","fdf60b5bb292d9dd4165744282668c03487e3fb855fbb251a35cefaaef1906df","ec7f6d0989aac29a703c78c76a710643620469291be807e118425b6ccd5d52ca","c12d30de43f7a3fa150d92bcabedb12ea73f1222acf0817040b9e1ab2d1a7973","9d722968bcde0140f44e70b9b6532854123248d39f7430852c188ced4cc5b84e","6d41670ab92e4fdc2d1bc5d80bed91b61454a1ffe7b12c5a15d3176a284ca0b1","b1e41e6457565466a8dec0245e69472884084461665c60bdfcbf1c455f19b08e","93a41f284424ace85934cb50588347b7190044936d1175a56f895d61e4a4d24f","d29703757b8defc5d7d701c2bbe1162f0128e659ecedf3777cf847f80de452ef","f774121d6855289840fea7020fee35f44f2fc0d18f79246203ac6288a14a9b33","eab25dfb030e8bae5693dbdd12c5e769785a5aa6246e8ea9f1c7dcceeffe2b71","2eda671fd581cb1211b9b990a2abda164a7ed6cd111af754628061392c0a440f","8e911d00dde2fb2e228900aad72d682ca549e18866a5ca16fd497a41b9e3fd45","249e3e6702dec3975584149eb00fae9cbffa6f83fa02289d15339325bb5a204b","94337b63242135649c803875ce728b80dc8047db27da54e03ce771e6295d20c9","403b8a874b6572197a32bd643485237b836a4ed4e8272308698947c9c960c992","fab4b40b6aa7898c24d9ed3bf815fb26ae6a17b7c0ae0154f5cd766ad8e45b87","4f851da7ab4f19d0804b1f1b8fe7f1a33e4b3584cd96f8f1b76568b3e6a3778d","68d61b1f240d4397428c7b9acd0e60be6e3510536d51a61ab4d4e128a1b97c65","1cd12988a05cf35477491b133993cf3679878b5ecf311f39815a4a99ffed8e29","c4cddbbb0f80f4d8f28ee4ed415a749e68a7e349e5ef8a3384b784b5d81855b5","47942d838b436e1d516bffdeb41f7a3e6f98ce67505bb83d728f0bdeb21ff42f","454a4a9350b8cc0e721f9ffb9884ef8b58bbdb2a3a9f76cf9c9c181b8ae2fb01","b6f320a0c19052fbdd8003080af23df142d1d47e70700b2564c8bdab70bce395","01d5169b737d649dd36a046a3f667ff396d0a31dd4788d292cf524be31d433f2","1bd4e3a70708ea79184e9ced780b60ca3af098272ce5db089849b18bf9be9723","e3b4f2f0e477ee9cfe8c12d9312d4a7ffbcb08d00f9e58f605af71b83bca26fc","f47549c3d296b6bb7be926598872ca8d9b774266aea082ffaf5f178d56c944d1","7362b418f59e49b833125a7e98c21b611eb62eee14a29eab9042386f8e230c30","ecd6fa93cae553eeac90e90356aca3c83bb5a45339d8cf1d446161df0dbecfdd","dded8d0c11435292a3656c63385189452bbd2eb2d3133ccc7d41b72bd23e8346","e6b962d6efc1664378ef855ebf3a1e9b081564f283f200d1441b3ca22844c74e","8713bf36010845a664e52c7bfc2e9e8b6a13ecf7f643b36e0ac8c06a1ba76be8","ccd4ba1f9214b5caab1112023c7dfe56b239f7fce227014e0815001d76fa891f","2e4c53f9800a9c24f8675019364a6e4bb7169c244da98bbe4e9d499d0b5972e2","30e19709a36915c2f5ca50a12d4aa0f3b8ffdf138a56d5cd9f4901e8a3e6ab0e","9372860fbe0c5bde0c5d483c94655a8275d21972e5ba150666f71f2b6373402c","bd7ed63a7313d190798920933ec4a505a4dcc8b3f360b42dfb7a3b943daf22b3","08d95bb1a6b7710ad9c573ca25e89402f155eba7977347db9f200ff8834f4950","cfbec48d45c7a198264782f00b7eae3504e7b4af10f4d7a784ac80810c116f23","6178c73b3c9a298a40c970f2ae768adeb9d20448b0381a3ea89835ea5423a44f","76a0e9ab8d35c4a2c456d259a96c741d0545d2361ec65331bbe1da26488a0e1d","22e7a0a81b26a223e9f1a2d985969d7383e5532b761a97c3a4ae968e73958f88","c25614a9df74684e51ca26161ced3d3c978f2ba93a43d7d03d2d1eb5f41e114f","8e6d6ed5c499e32f484b778ae7d02f80e2dbfed9980b2835667137a932f333f3","dac7248d0dfb1af364d43eb7ad96705cb19758ecc86483e1bc10a729fe27faab","d387263515db44ee519814729dea1e59af301852a58f6ba351c1c89ae390bd4d","eaa043acdef10dc79473551a2f6075b564cec957265562cbf27efa7cbc8ce3f2","a8b1b504da9dfe08266da51a1f6e5fda12566d091385b0ff1be7629d53f4089d","1648d75f027956c913aaf8a96195e440f7b7f5fa426a79f41c8d692769278587","e1f34139e0d93ed520f04c7548fc05520fbcc41d2ca368e76d538a6079136730","a548c051845d08491bf4104c4c8e62dc15d1d0bf9fba11bfd5b4af801d1bacc5","b1513548aa88d090201bf271dbf6428be484db7a442e7c9351939130701e61a6","a19051e072f8f26888d5a62090ac970341fecb382224f09a7a048474ee2b2045","c321941a835816d5c33b8287132b7c21a2f113d2d032abe650e5d282a897ed30","d4d9976aa0cd0cedba40eaa52882f535b613f741f344e452fdc6899e4fadd9cb","7c19af2c0752c8e585c9c1a7bb8483957fbfb5b403521ca2b2d512aa53d747c1","217de8c7e407c8ac793783b663c4143ad61d990ebbe28ca5e05f2a120ef96177","8505e2f816984ab9803c934c156f90ac75f43eb15aaa11377cc4035a88b31292","cfd24d94a1f61ddc66c915a68a5c645081c020ed5291413f72f162a818d88aae","09c6c2d82adc6b637f3ecdac60c507fc4e8f230c9da4cccdd8221c49152549c1","8c46b0f7617ff8df01d6ce9a56483c0b10d3a7a9dbb52213a96492cfa0a230a4","eff3892e94774b8f0857fca079e5360f9aabe70fb290c29fec31d9a190d4c4f4","45b6071b12ca4007b3196712868c42072aea933e581ce97823aa658683baa662","95cc2eaab3da653a6a19f7608f8b46c2a7d1feb3a34172fa29cb26750978e40b","a0f69b203e4a98fa91d916c174118f7f574afd5ce580ef68a2479ec4f2b6633a","616f8460aeb202977fbd9969278d016a97412ccf82376904615d97fecf5b99fd","42993fd96306e6cdab96594461f677f431adb3f2bb17a5c854b589d79277df15","dd1f8c82325bfbaf70caea341312aa3caa28659366dc4cc68c39cf25aa253fe6","15aa9fc01f1b556d8fddf73b669f278399d0a7ac254eafe9a534ec3bead4d610","ec1cccbb0d24e2174d8d42a4e07424ba9bd62dd8baadb4f7f9eab7c993d42e2a","f69cb670f8957ac58b8db415d0af4e818471e9cfe9ee121b154cc5eda55fffb6","62ab8f06fe33bd597f7ff28f92bbf8f322a89926b8ae3d0f91b505c2446c4e1e","83cd4ff41bab06607d4caa6dd402d5f05f8e8906ae6a133f2ed0d5a0ec6ff837","d36dbb407efbfbf6559660660e62bca0894bab8fdf82dc30e15675f488699ddf","c16da82f4c94caf887cf193a026499e6ae15787ea33a3d1cc637535a23f5a059","8bb6c0cf5283137e00fa99f14769091abdba2466effabb8b8045e2a91cd28ecb","3617f058baa4cbf029c28985929335442dcfbd5a073244ae9b61505692c02310","711372a01605bc38b3196ec6d15e562b155b1265c2ccd14dec5b6a29352cc43c","b94538026af4a4fa8658655d8434027c0529e30926769491d270af79e6758830","f6b046d93ef712b9ecfa62bbf1e52dd314ace16e7cacd2efac6ec56a7de67375","9f8b8c66fea59ac6dc30b69f1e8cda5e33271c94bf52dfb389da33d7b378095b","37f82d6220bc0421cd147cc9431f93ac4a660601cb940012e288e4ff589c4d99","1f9b109f987b34dce0ce0d621760f8d1697f6c587f839355c995663468cf1812","15d0b5f357a7c35068230fd28d556142faf0fe174141f0b2923062523dfcd6dd","cfb4ac475f6d92d7e4c07f606fbf81bfc64f2a9b032303b12bb055beaf0e3e78","b7617d04e1a4512e6092cbade4bd6ac9971a60802a1796c1bba59d2c94dd055b","6199fd2495022ba5852eca172262e8285097eaa81961bd4710581a7504e4fef3","3aa5fbccba7a03dacc3e1de931e5c88f00f31efd5c6fa1f1a4e71fe826cd3567","5a2f915e4a9532eb2a7e6f1229a006211f36fbe2f670357911d5445a96f1239f","bc10480ddba90ae8f9e770a24d094aa746591b88e219885da7226f79e54a9311","d458c937652cf639076d2480774d6ab106f6c58d0f4c5112694424b0a4cc951e","ae58c24bdeda72f966a48200b59e988223f2529aa83882b692700db3b29d3ae7","3d4d557c70d8a41caad699a646b392b9411a417ec074a45aa45b49b345967433","78820a1dd392368b801143e03986e14704f434512d1e2da743b83807df7fb83d","af90d4d1b6d0a6ee28fa1120a4ccf2f13eadfcf2feef4f044f89dca997f6b0ca","09e97678fcbcde6d448d4d9a97e55d698d667d4f06bca62f8ee73bf47d64acce","b00f8043b47fd2fc11381e4f26ba026283afa1372e8bef4bb0123fb0a1be3e69","dea1f59db558138a58df47b92989c32394cd0a7e28f07e180d10dc2cbfa95216","faa18bd37cc5bee60e17c4846d632b53268c85bdaeda978b669f1a2d8601715a","62c22f8ca950a340a2fb0ad81a53ce8dd1898d098af7f67663d2404e4ef3fd4b","6c2ca1020eee01089d50849efb06bffd04df4f0fa00bc599b2d45a08972859d1","7afe38cc24db4b4008e360696fdea08f0b35ef1fec6b74a5eb4cd3474b09330b","f4a3f8ab559bdfd06db4135643e667e1d33ea035975d159ccf121f8dcfaa52e9","d3dd7ef52c496d07fd1d669e61cf13b29dfb6e8cebf6c8a171f981f0097f945d","e1b3445b71ef98db1432871dbe66a9ab5d32c9b9343c3f43c48e19a51d64567b","b74e8d8ca7f6ac753bf6f188d89243abb6f20bc7c03bc6c81590be0fd5bb4f22","1c26823539deb76e09fef509671071969074d72d565f81d39e0c7ad68dde8057","f927c2fc7b6ad6dcb77f12277d289157287ab75b20d23cb0987a85f1dd90b588","76380afab32fef201c3fa9fe99780d4879dfd94cf06a039240d043fddc66bd6f","a0fa3a51077e8de312e073f548ae4eb7f1b977efb2bb4bfcd56dfe85b0044e15","6d05452f98f4b6c6b6a156a3f250a0e2823eadeb587ef336529ab319b3b532c6","6680ea0cf46f73c9efb21018754e568da48d97f7f9af79f9af181552182e21a8","84819e0e230d0b3315c66e69f1ecb1c233f900b3131bb7b17bf4309648c6f6d3","bd764f5070952921f93576f615478b83ead879863bf4cf62ef46d75c271e3d8c","df0b5da0c88529f47297375f0c8e68f61a6ddc4b4fa313222ba1551b119b2ce2","791d5d7514fb9da84f8e42b457a15db4a53f1059a7a3c2d2297c5341de577c75","c1ad81a455895b4fa9c49d61a7225796a19b34199f1abdea37ff8a1e28db00ed","11e9729d6a7bd22f2e10db86b13533c5f12d4422b304f973cf454312e5ac4ca8","6b10176927db41dc0f9b108d18f6c3dd04c029d946553f67d3fdef020fc6165c","e4838629acbb5a2a8109d9eccf287419ca644411700cfaf6cab919bcaa0e3d6d","43249d5299f06b4bae005ba40a5cc9f9f12263e4f38608efe9c046c04b763142","628401ba8297f31a40beb68774ed68121197b478f0fff60fdff265868a3d8c70","fe8efdd6ab497fc79e172f04b8ff6d25958bdfa862cda45194c9e6f2d7145c2c","388c5724e109d7d792e02d872cc280d5690c60177585acff6017e2a1df4e83a7","b7ad57dff0a28a0a8b0f33ecd648509351bdaf96ee079d7e7b69e7e4bb2a3b02","47ffb64f7ec516714637f2e7b2823996198726ea2e9be36c1072f77e7d51082b","2bc6f30e35d8987c58ad54c11187d7ed4e239d4aeae897bde1c7924dd5342f4c","53e7f2d769910886efd3a6841b792eb98c17be203e7c2779593e32350a70a7bd","832e0277136ab3531d46727831671e6866937c40cc16cea57a4e4c89bfbd736d","fc8778e00056cdc00afd97d8195a17a200cb01943db04f871e4b2d9a84d300d5","537974962e03a0387e6c36e1a5b27bbe506e4eabf5360f0d50e1b2c5a9a1dc91","e19355bab0aa43fd0623b5ee5a8b6daa67cb6c09ef36247972863f3ad6c6ab04","6af8087913e5e377f21bfe12562a6a9d8a606dc7a5e17e42b7cf2e9a409ee65f","0642fe85adc8809813d388fd785f0713685b94e04e9804fd48c122afe8f5fbf8","e4b840910f97c593c344abb21bd5b4a2253bc820ee6e224448ccde6f7735b919","bb264d984ac173feaa189b66d1e884ce364bd3af2f1e2f1b210a117a3366c414","ce3550253830b03d7f0998321b45bfee3cb42ea2440b5e8ad3c212623da8de38","19487a124b02df8944bfa84cbdc7dac75f25889e33788846e9dae6a07f5874aa","c16a2d21aadefdf513d078e531729f7e1bc4701e0bd2e738a4a40b4f0c120123","449b4468fe2b90b30a333c5c0ec920db1dba858905405cedd2f823acf2c6e8b7","13483d82fea9368999da7cb5b014eed189b278d8fdd3640f112f8a00f5545f2d","d94c222cff57cb20ddd565f16af93769f197afa8a7f94379a8935ca7720551f7","edff8f573c862f6c899648184f03d48ab5b2a0f7996b40d9042b9ed3e2183763","692d2759b6a6438f0bbd4e048444219e2ac812006577e3c744b921b757db5ad7","bf8b6460bca912fe05acdd8ecca0ca39dc8392640fb375f5a5cd8bc27c1bbd16","a7ffdc6744a57ae84fd1bf3280ffe7f699ca59ee280da392c52df31882a0f453","e19631d365e4290ed2938388cea938c24a941fbd7e36fc701fc15a50f2ed7a61","98441931439e467d5c7f3345c9401ee1853a6cef0a4ed55346e6677f3292d37d","1a2e1013bd81ce59c0aae50a7087c0ac46ada7780a027e770e46ad59737a9278","b37abef495c4164d7332822e167eed2df667408f9c43142e41559d34754819a1","66fbaddaad362a70062484a7fa0851e51527065bb29e73e495e0b8c6ab64d025","0d8fb2af4531cf18752b2735282a5d2b8e424a5ca17bcda1fc225eb137932d28","92e0cc2141085f4a480519c2bacdf202a05f626844928c9a03a4718fd6c70234","a035a22077c87c284cd17c7db9fed5e2f421a9255674d015a85dcd2e48fc474a","bea96ee1afdfd6023950d5512d85ead19816d5518f437366cf4c91cf282e6ff5","64a148e75a4460823591665d5543ae90f76e897f65a0435e915d9ab45343026e","052a775687c0a54a3885c286a930c9a03600cbc696ed34251b69b00f440ce904","16535d32a3a8458345f7956d1c76af60a1d624a1c6d0706faac719c78f43812f","f734b610bd57cbadda6eaaf6699f13d7b0e1db0de3b7d160993510f2e5c2e1fa","54b5d1ae28a647b0cc8711ef1d63279c00670710a63e6f12fff413bd5d0e259d","5ef747605f6b7d0dea4d09b829e80552cad5c0e250619be29237c672d49e92ee","8ac6bd9d4fa0a799190a3db7ef236593797332d2bd9914c13b7ff5d657179c94","fb8ef886e9a7ba331230b23ff052603320e1ee78befbdc4fbb466dbc5b4e4800","c869e1800c57497bdf511737ff69662e339ff11fe6676ed5ab2f6d50899a1016","489e5667e684ad2afb47892464d5d6daacc0c16237531a507a0734085c2c11c9","b74704b55258ed517e487996d73ec0ce287b84420c646bfd30061e55af7bcb03","afe5a660c04e3c89d046549c2fa41dcdd8b9a3a01f7a0e5433c2c18667df816d","5d323378d1082865197a5660b7b54627bd4d2ea0f18b2600e7842b26fca48580","aa58fe89b745367056c3cfedcc8134ea2a4acc54fafc19b0a4ffbf2d1cc0738e","d8faa827e42333125cbf36a1ecccd8cb2e286a23c7d435a9ff76187b2099eb5b","bb39fdd2e56ffb6732e977edb1c3b422ba7d2037c768f67214ef57beab5774e5","5adb89beea39d18641cee20b7d787ffb8a18ee05df146d73304402e188fb88c6","06f080257275642fdde0b7aeffa39972d368550b99520d19fce10abb1a455057","a8dd3442e387b3980f7256034e967181defd24a4ca52024ed2183e95f9969028","083978facae4158a5386b35e4c3fc2ee0f6ca5e48715de1863dd519992fa30cd","63b6ac856df1f5887cdd6bf8301427e6e3197cd559121c15f1b01b341500f474","8fe63414a8df632fb42a3dbe3ba76674dd967dab423a5020fd01bb50609b1b14","1d240c4f6f1446d0a073d09fdc49d6b0246732e1219aa2ddb7ea4f116a92f850","c45507c9f91926f252289ebb5add8e9d7632c93d1ee5fa4d58fff8d731b5042c","a8d0195dcb0f817925da7126b1539f93a33a0d9478432e0a7395bbc35a6c21ec","e527dff3cf4c67c30e31ffe2bd969c71051d4b21163741d7eed7aaa5f11042ba","7834bed41573edd4690d180eb1452ec76e46dc3586e105f5b031243f0ef3309b","fd7b3f40160f1c1f24a47e0c1fab121ab691bad34168d691cbc25bab5b8326bc","4dc7d9d902f84fed6258128bd6c3a5e6508fdfe25aa9673d26f19020d5cdb810","f4ddf3bbc5d44fac7592abbc8513d1e038feb68bb5584b8075ca60581d297991","f2abf4fc100b1ca8b05cb3b4bb6b10522184dc2a9ba83e26d27a6591689924a1","3fcdf260e9d3e8b41af211c97a05664443505d65e17159e0465de7d73271c29c","951ebeee856bf6777943211010a4552addb898cb7c87a972f03281437ba7828a","3a103c6dd44719ca7a5b80fd3f6894ed4aa9349870eb4c950149c888e7a37e7d","d8ee4054105a6f8385ea5fe86d32642ef8624be8758fef7c0ec0035b35971733","4c52964644b0fa25eac9e3a44b26be91ced6897a4619716512a0004f6710a81a","6aa8f554edfac044338b68fef52f5f9bdabb5610aba7a792f493427d5c923a53","4bc065a5431a7192d0d5e1d1923a286e1e88593d35f771363a4648a5c897cdb6","a396001961d329cff4bbd548c233233f0027c5c96d95e4768dd27873aa313180","a5647ff6a6fa142f0fe08ab5af5d56982d844f3c2db3b12072f5cf2ef0400511","cfc61ab7ef726cc6a724f46359362945554fb8176018a033e22d1647023ee650","0530742234fe86f38d1752f207f7184d38497bca34bab1ad9580637e543ba80e","b086bc66f4d6f1ca77e1f71195ec1f4b90a267ebecbd78421cd21dec51592425","21dff2345756f467649fccea50703098d4f0ef13ccd1eae2556ec405851a798b","e9939f04f9ee8b8c1b07660142f0ba0ba930f033fe545b69cc897be730c5ce71","825487fe3a1bef066136db1ce94f053ad1bc1c75a1c1c5350c4ddeaef9b7d2bc","8ac6af2b416ae4d298f9c4dbae157099fb815b57d211b4e95b63f0c3ac1e1e13","0d116c24bcd006a66b6ac29d9492362d24e8c9b75204e874c306ba6fad2cd78b","3ef67f9e6d8371d2e2dfdbf635c9b21999c8e7f30b4a2406585bae7cd781cf4e","4fd0895099afa1dbf8ee312de9089ee16e74ae479373be90be35bfa34cd4a134","d545375cbf0a7a0d24c0f4b04f3aa4573ea17bd88f6f2e2f9e0f7e38f8c380f5","42c9f90756173537a91308cec3ec903b34878be4e24cfe73b986a4054dac8433","c53b6f9ee915e739ce8dccbda482381740152ea9b7096f2d08f664cdc4a692c6","8e65cd258e511bab0b06ae99c5370fcfb610a4af8fd7ca4682d9ad7211be9b5e","59221bd13eb8fa459320412140f0e6b2000843f30d93cc0f08355117d13f6a04","317130d2041d229697db4be0877e287dedd7f6245a0c4e18963680bab68c2c44","a90f17a56d19b09f7f26e13e8e68288b229ed41788f4cd25473819d214540280","7b9b815405b54cade3905909311be94d92f2ab7ae94a259dc89e1e0bfd0777c9","bdc83efc66b5ef47d1d3ba14e23dcf0954b55cfa164691098f5baa0da3100c5a","67bb1d9dd9e47be3e7fc6b1fcff5cc1e884cd90fdb17f72cfee0ba1410190e7b","e95302451bd3e9e1715d99e11ba2cd442aba8a37cfdd0dbf24c25c1549c105c6","5ecda5b0920af05a731cedcad7f488f8c6e87beeb0b316ddeea48d4b6366cc40","20a44906bb19fe54157536b7f73fe1fd7a48e44e98304227ad61771292a7959c","57cee3c8c4d8db5507634ed2b66793c6f91952dc4ea5e0ecc2e5c011fa48a6ca","70ae0fd56b20735438b6e142dedec1c9ec28c7e6f26444d4c490021978089d8c","0214739f3c8ac66c6149c687e6336f267e1e3caed232e8dbd0cf1813b42344ae","d6349b2ab65d0a2a089272dccceefe7fc9b84e3d7d23e59b5f7df265b5dbad23","340b7d3e490090e7c0c77b22d847a010c1e6aba3ab726c070585293527664539","35e5651aef66fd309f92360f187ef3125a44cb18a7ed2a3bed5f39f8705c8bcd","b20666d926a49d0b8fb6cdadf3c1069d9e81ef519e9462b8f2026f0572d361a3","431ddc7bcbd2784a2b4ec53ef6d8a9f17556816b0e976151e8a32c46061e1a24","dc8557c3f4df4a7087b44f11454c179e25560b5e2b23280e477184d65086b1df","f0bcc1b5fd5ba66fd5013632f5d9464ebc05399483459c99f773d08614ef9081","9f898398563c3f6ae1ab329c2161e630c56581fdf7d2a9e90a1a6502b82a6aaf","791907bea3a49604cddc0a1bede53e7f7a9a2ae87e950d897ee42276192005c0","64e19d1601ae4f63115a89a2a9296b5bd20da14109e710cd68bf3d6a708bbf03","467873f30321536af9a30983c4cbb54ee1d8dd2f38edc9328ef667521469c32e","da49ae7df50882ae2bee8ad50ef0f8f54d7a374af87d6f8f941076da77f47f92","7a06e12e5627f182fafca69e6b3f517bc102a29c4f1120f728c88cb1c113202d","2bb177f53eae169c57e76f80fb730477d8e51e1e095acd624f34b536e2847ecf","2d5c752dadaac0a5cd40aa78f9df06be17df1594ee106e19b7557e977acdb115","f5c2a22793bf3ba4d3e55644657b06f821e4c227df8dc75d8b87ebc9bc86ba61","f50753d07e239b1442af2bf61ef46700fb866216101b0cae301cbdcc79d7321c","682cada494c499a30cfc90d6b4d446f80da8e589349d70ba73fa76d4117f1975","c7cae13354619014b976a91b910061ffc8da2c5646c104a0b2df748cec93d548","cc7d686850ac1b3368334958f5ca2f8d3150a5a56defc35ac439a952acd362d2","58b60df261ab920b92471da9db073cdf7f97c3073c7d6fcd7508440489636418","9137a1356bfdacfcb545577647c9ad10946171ff525d5a091ded6095a1c5fcad","bdbfa169ec742224da9aeefe19971bc123d995ce38c03799f74a855543f1f4b8","20128bf9853eeb47827963cfe013b355bcc3a9f124a8b7337172efe2ae5eee67","6bfcbdbd8998f2da240c976698671e93388a97a3353f9567ee4662c58d38a383","67dc43898ff23d5c6fd1301a35cb4258737ddbe7663e10533ac52207eead16e4","6c38f671749a16c7beef9dc7c9b4fbed74b8d65c74dce90b7b6c29f5cce9a598","e13dbd05cbe7953af79c8a8b3e96128649ecaa1b12ff4d4744151fa3535d7dab","7b1f53100e5cf8d6a078aa4c2717d358005bd1a39f2e3e56b2c97b3356bb32cb","7c05df5e4f80ff74418cf5bbf583a1943da65a6130df44c23918b3958835eeab","aff20aaf619b61bf6c68758a3c5602af9a625a933ea1391d3a65d82f82ebf992","80ab994346e92a367510d2bb2750a6a1d88f694f72b247286c322170d73712c0","ceea648804d88dac96da38272287a1ab3498661c340ed009cea7ca0e89d9733c","611c51b639d1fa4ea109ae4b25f9d75834c6b5468cf90cf87c9fb1fa0f0e7689","a8dfd5ee1025d051766b42bcfd90b60fab1f5c17d9250474e6b394dd1616617d","ab0e38b1692cb2367b64ac03f7dca494857a7e625a6fa5a2c1303c1005171544","a219a386f3695b3aa29087ad6fed06babf01cbdb59cdc26a167dd98fa3421bb7","a7446672c8246a094f48974d799f13ea962c5628827e9057309616d854fde9a1","b206796cba5fd4280d684e12f4f37e7c01b679f1c69f454684966d5c54f9b354","ed8cb056df221d67267cfdb3a6f6e99062c090afe531a0f294edd07d0b71d34d","62016d2acbd9b1fbd84d60535209abf3c8b23ebdaab85c4b8b260dea535d9c7f","f90e9be348ec386a80448b886435c116c0509accf6fc13966af06b95a2961026","3dc0247bb12948aac9f8fd4b13b39a3d4bc3841088722a75393fe055ff78ed74","bdf2a16d826988ca6551e8582193a82717042a926d965e7eb58fa9feadee57a2","dd42b464e0d9023598e28d47a382ee0ad59502a131a20257cc93f0685d0dfa03","703d0776f6c242805770d11a62547763d385132822262083d26800f5a73fbb81","78e506d77fc00bd3037392dc54a62102ace204cdf02f5ccb8ad5d988f9cb9036","2a96050845d44dc68ca929dc3a5875d0bb35102235cbf4657464a0a443ac3134","8d9ead3b0888cf439ed0d47986b5f54d104daab7403997748c3d35d0c1360213","92319ad786d20c63fafbf891d74937a98d9433627e0917bc24bcaccc058030e4","0ac0a3b67faa9531b284cd284fbc8b6a1073aa210b74552efa5d570fbc884ef3","4c9f57a5e43db24a52e1102da9a238cab7108061064d05ce0cb7e028d6de9c7d","7408bd5a4c49b45e8de7e2530465b58fad371ccc764625753b2bcee58cf6ae24","7905c468fb6a77420ac0fcc71c6a66820f638add7cbfc007b8b31427df65163d","f7483c3bb6359d0819c6560555fe2f0c402c8bbaa5140881af80965134944c53","661afefd8dbccdd28cf416ce0b2fb92a668f2d9760f42ca35ebdd741ee681bca","33bdf66433ccb85b5ac0d26340263b3ad2eb4cfe935d856c56fadca1272b1b0c","8829282b8415325b5731e0a9c8f43bef2deced4373c7c4372ff4bb856a8f8e86","a26372e8d752091a6047620b392b25a1fba5c242d0b30fe8bd65e1d616e4fcd5","346ada4e6070b8420916f64966367f802be34d9f2f56420496f290cf557b0e08","21b850de06a9dde4653dd64d31387a5dcf96fd49f31542ac2c3b19c4889609fc","d13ec4037db414c42cc9816406967b06acc1a6b13d0ad4f87a2a63bfac6efdc0","c9413b3311676faea92caede55922910c5d9e365bce93e504dbd4d1b934ee4e1","d642287092ea3a6ed72084cf378bad732c2de952ae44705eaaba4b8e9e419ba6","1fcb7216780a9f4ae6ee3abf21daa03abf5b72f9c207e4119ce02e518cc16c13","edb91d6443b7a37739d79980f3d6183391c33388800792069a23bc11d672110d","39983b06374e02249a39e74279a661a4fcd0f21cec66ef88588fde819870ec7b","cc335cc1aee53dbbcb9413041f9e827738a24011c3ebaf4c625ef77aebbb82e0","8a4c4083618f22e37454de36ab6657e3fe635e9b19b353e40aafa42c949afbb4","cf6f394e324711ea71c973531205dde27e944b3aac9f21d85a3c3f985f186878","81f932323b7cb7a1ee854c1f7de8dc65957ac011c5b8774c7f7f9fcc9cd3fa59","5a17b3f03933506fd3f9c3025e6b3f91e31168d59482b1e43cee0449b1c33435","0f788e72a819add0f7afc55cc4183cc10efb4dafb8aeec7e8d09a04bc5a81334","b5ccfb93dc1d5f5186064bde9b8967cca6e13e8939c933665f442e4aa8476d74","78e5cfa69fe6e74056986da86eb9a1512dbb6b000aff86afdc49a7f8aa6bf8e6","bbebca003e7d1cbc668e87e04e42df580e059f8765fe9ceac2c44271bffa74f4","d24884c6c7b8a694fde714ed097fcac4d36134c67f5e48f68bc26dcd4de1fc3c","e2add9d677c8422d8706d3cdbcc8cb4e26e9740f2a26655a48a42cbf7ac21110","dc6d9c754ba55c12d091ded1e7e719fad6a89f1c4fa90567e6cd68b8b059cf1b","bc517c67aec564d15e4723b6e41b56a647034bfc4060e7bdf3c9fb141bad847d","2945ab3f37fea0d57d98586495f92ccb14752ada030033552d05f134977abc03","07943ab54fa00e5e3183b15a2ffc2f759967a188f97ac31d3ac3a418bb26a26b","206e6b0b670138f7a41bfca6af1ae54d495ea82dcff08e298d134112f066c134","97d0285e0492f0fb7fdfb37ca0e5688256377b8e57ebed8473963cd77b333f52","e8f43cfa183340b991e4e30806aeabdd11ae4080c2dd1ee006d14deadc35ebda","3c578c7c338f31563b06f7299ae1c56c51c3ee1f32323b737b0214bf9be460c5","d8c7c3288dcbae96911e535d73163b0e14b246c21b5b8926da1c62aa5b2c90fa","e4aba2a6c0632783ace187820c90fbf939ab5cb8e41e9ef03ef8791ec4efd9ac","9220f4d12abac95894ac2b65bf0780d64ad9b89cbaddb35de0eff461719741a4","af91f9841fda1b29cf269e47e26406527d3ea27d63af6c3a58fe058be6ea9a2a","54fc4b44e5a4507c6015752748293a5650664c2310ce508e1f485635bfeec5a4","3322d2188e5d54334dc16e8f06ecdc84337ddfbe3184d2d7efa1600ab10aeab0","64986d564381857dcb1122781de7347e13f4c9b14512f32b9d8a62708edac96b","7c2ed0cf6b70c6feb78cd92cf81496133bd14694bb378f84dd545d18a5601dcd","dcb6cd29d254cff79ff215163fe31032e5ad4c2066b3cbef159bb9ca072e47ba","caeb54112e39bfa50d6b9f7564e19a330992466bed218f59abef8473ecb4b944","7fab42d70e6cd361f56f9eaf0deaf9048f0e73dabe6ed10d564b7c9f53efa11e","acd9197750e033be5c22fbc49860b53ed0a89fc6aaea7a88265e87bcd45bf59f","49dc773e61aa29aa5f1f010affecbd400676fbb39658360bc111d1f4f5158aff","ec8f1d24bcc4491c5fb7b8ddee19122754084e95cadfbcbb67c987f04e546bb7","7c09cd70845ab5c6a633e502bd8b4b523b3b49c36018aa93a284713584cfbe29","b4d0bf5c5d830dc3f4c3bd54dd2d14c9f92eb5e1576401149503a071d1634870","3fd2129a789f2bf403a7148e24f446e4326d8afd919a47d44fae6b1d08428c8d","42ebbcfbdc794d48baff8a392d4c8ce2d58fcec5178d03fd0190ef09522f8e4f","a6b6cf12788133206dce3ec7f2d18b563964475c32028569b3f37c75ca6502a5","8c0ad91e7a93e2a0eacf33a970e05f2ee6e1d003c5a770145abb974bfcdee212","19c07d4cf045fca535dd56359cf92c5a7d88a955b92ef14562127cddafe163bb","a351a7b4fd103a5e80cae0a140c800ce30628cdf04985efdc049032f3c4899b9","62740afcb19ef0e9b339c5cdad0a05688bd0586fe3a9886777ef8ee5364d9871","bf53460ad26b4dd3813abfcf62f6c392798c2c792f1694254976550b53ea4a3d","1022254137dc67340a7297d6a3d9674fd900f4d7e416ac045dcfd372d15b5e95","3867f187615708f814b97d96034dbdcacf84a599f417af0b86684ef9939ce0dc","e5fb9017a018da8d0ced9842f343638e77418fc84c463a96f2a8e9a148e47392","bc2df297583d60d167ca69f1f357e9f6fdebeb93b114e0d2cc47db7579c541bb","3635251dd00bde77fd4941c226ca34598ff320a880208dfa6f7bcd7056dd2755","3634cf0b0523589df0ee877636c9f4228e42b074f4fb3e90ebb30a6ad3823c2f","bcd48178a2f9b2352e1d2a3a0864178ad95856e10108076a5f806e426aec51ac","386e6456b652187481deb1d51281673da90957a5507215da77bdc24cdabf099a","c086eef98d9d25142790e2722c463d90d9bd01cf2f47ef78d83afce1da89e6e7","f5a3a8c51422d4e534444f8a0ce4f73b4420534b6a3a97a421c49f36d1cc22d7","c782fdcc034d384e170d6805f73e09697afb1b3b9f87805deb4941bf16dfc020","a95ab6a999e420069cfc350f4ecf182ccc924fae67aa0334201ec8676e47e03a","50f2f3a6e42771f717e795380aaa011daa917831d40be8d4b56f5c605111ebbe","ae3fd33cec57824912cf22407f1dc7b303b7d4d872b8ea26f092ad7090178613","135215460a67312511d4dc569f90b7d148d3b6f49c862cabfb235dc00cd4f838","38ac0fc62942aba0ddce41fdb6d8159466e32bd7dff673f1df4b22d5ef9cd8b8","5d3c74828203b9ea6dd40f440136702b1af271ec9543384293a8ac4fc5b82a0f","e7113957226712320507718857d40f9ad2a7e108d0dd11c93933da14dd729c7d","ae594cd23fac6ff2b691901abe6302395915ab4cbd7255f84a0ff7e420944350","fe22ae79cc1427a7455c4bcd6169dc0614a5ed7262200f4d6a169579ae04c7b9","a8df7026e2fb9b80ab3aea1bd12293e4c6beab74f7b94fef3c11f98222515bc4","b5a0a91d240dfe297f7f2f0b9cc2a20bc8936e0f6c08b7b0f39df56787c01b70","a8f7a252a8716ce2ce1f40273635eb9e339cfbb13c044d18132643c8aaa042d0","0b1ba5ffd3243b96479f3667c7cce9e48805111a705dade0b996f25745729a74","dcca443352e9dd6ed2d1db95aa68b9a8ded4e807e7ce0f4e601460723838886a","35e92576bcf4f6158bf369798ff82a801bc1bf6f901d6e208f674a52e5f209ba","16e49d18ebb4021242978d77a33d03314de474c049679c558938f0eea41d8a45","f1325bdf5849e75a2ea865f99fe12ef12d4283721eb219711e00feeabbce2ae7","07d4bb4a785728cc8ad5f8dc63c0d41798eb58570153a0554283e5896bab184a","138b243804d2c6a8a134f041737f003aebc2b5b5d42eea274a74cc3502e14410","c72a06f23e76651cb5bd2deabbb4f779349f3fcee2448af986b5ab2583b0aab3","84110644ed77ecba6d0190656c7a58ed8e9286ee01060382a4f777805f15c7d2","309c60474c651f75daef231e639daac4027b74519d31d622e18fdd129f73d881","54bfffc778e472e009c4152c9dc819c77ea7c99e5de87de2685efdcf68d5d43e","eef5d38d4560013e2a4b8218b0b920a44ba1022f24e8c3a85ea0c1029ea85162","49f9fa16eb032e91ef2140513274c52f799112a819bd1e8c8ab856a5ff8f90a4","b15ee6b9fd3cf2faea7e69929d1050a732a0447b712b7c4c7002419dd8bbcbd0","7374c3b18fc86060c780548df25f2860065ece1bce322932bba8a09fd4ff00a6","b2a00bdcb3821561d327ba300c1e6e859963cc85e43c2cbd6a784554c72907a8","ebb0b43da0bf368bb141304d20e9c18ab7b558e49739273651fec6d05f8bdceb","4538858592a13dfdb271b4941cfea775c0c18f2ff5552b054683ddb16eead285","5c57a4715eb44ec6e3113be5705bac14ebf8a906c8a96577acce026400e3f2fb","0dd4396189f71746ae2e14e00fbfeacb5d82e40af16ae55ee0eed0c49a8380ea","f5963234a3b6dcdecd3e6c2febd34c77723b9af38bfbe5665b620a9f09cc7674","acbd777a4242a0ba0db2afa8920281ac75a66f82a46ca5a68cfee7ec7287a815","b23c708477bbd3eb80ede2710a7f1a53bbb579a9ffa4212190a71a950787fb52","68094d5662781d2723a03ad217328a85bf494cc9a2d687545e47a77c566d5450","3387a64ba3a57e6748e5b19e10dcaafea959016f520a93b12416fd2b3a2249f6","2008a35867d14366e47630595e501fa1541ff7e32f8d8cf616ea8fa7f0e4dba8","40da67e8fc1a6a70b36861a37d2b0ae60672d2eea78b8982d4e9aba1ad38a562","c2d883a6515a1ce440246c02da8443f9d252b9f8989339622d3f79f546dbedfb","57b6df298eb24f33eb0611408f08df09a214103a111273cd15a77263f51a9d8f","e9894cfac109684dd0b761610799a8df728c79f72c680c3619711d150a51053f","64628bad070fcba99b8d28594f791d00662f6a83892f9f700f1f8f40db936f60","26d27d61e712ef05eaced9ac7d79a3daddf6a56e21f19b99599b20099c440111","4e832e2d7eb68763f8c115e2bdd73d1870fe4b803a68c652ecb7f1380cbe2e99","8847d9e4948bceb614e55bf777eba43775a8f9854c1272568a2abd03ca2c2cdf","bb26ce6885c2e4421b8bb8cd87e456deee20304155012ca2d2e41c83c4061130","f1dab9e5fef52bfce2bf10f7ba0520b5b2bfbd2e6e5f754a7b2ca8ac13215405","51730df4913133f68a61f56499848afe49dd6fad29f5a16054b790f625c781bc","a6aaee46b74812a68b4d3dca16b0478ba04dc074e5f96156b0285b5bb60adaae","11804ff395933bc789d1c90cf8b0d9a6afb8793503677284d7070f2661f27389","09f318aac57c2547f2034b4213bd97c1d6417604504248bb9786ba65702e1f13","f6b77f48d113fd545871b64f70c0679cf2ed0dd1540ddb643823b810f2c22cb7","da2772ac3fa5c883f752af050fa1c9945c4e591b0563fa36a9ca0bdc52c86263","b0c2950999e7d87d6924ec378a582751f8b6bc3b84f06aef97eba498a8aad719","8c23d25c4a578f6734f2511d14b431f68ea3871057bd98e9a1eaf0f7e072a859","52f5c39e78a90c1d8ed7db18f39d890b2e8464a3f44d4233617893f6648e317d","4d7e23535352bb573ad1e92ca8a91ab8ccb984777029d04adca0e60aab175404","534c481c63a338d1e6d9dc4d73ed8bf113bd98f78710d1b4f03d07519f9061f7","906297c407ce1bd48a1674d622ba78c754b9ec85ce49515abaf0f1dee630ce51","01514e08982bf6f0a8095d3381e9138d9b35321f94c81c5191d1cee06817ef31","92e0db27e6b040238bb6968e9ba49db25a2a959782a31f51a4c65b817209e9d9","adb1b79e8d8c2ee484e114f7c1d2b97d6908c6f25d0927b0b2a94ed53d0967ea","c9e5389f4e0f036272d6727fa4fed52e66cdca30f5dbe323ff54e6f7e3b99c11","2895993a03e4036e651eed047d421fb4a6e82a58925e91579790c224c188da51","98431037927d22b49ba9637d12a122167c6b4481ce416df2fa619fa1b066f159","c0a79117937a6b5e330ecb2ad2f23184fe667bee621b86013675603ad55ae282","8029f7825e3502ecc564bf73857cd9e66d6200d2c558e87d29e3ad9f28c6c43f","7dabada6188ba830cca861bda243aea9f28c10c7854691ba9e7e1623684c307d","bd76fff9bb2b3202b9abf6f291a8fd6a746d0e64edd54a95df0b3e880c05b6cf","9510c538c3afab4823497ba1159e9548169deafcb4489722ca0ea9510d7218ac","47f30de14aa377b60f0cd43e95402d03166d3723f42043ae654ce0a25bc1b321","0edcda97d090708110daea417cfd75d6fd0c72c9963fec0a1471757b14f28ae5","5b61fb387a3afd0878d80c93cd495bf713255631b350155a14986cf3b90936db","810939b32647051a3618a53de08772a1a1cbf3c58004c618023f5ac7ffba2fbe","f9acf26d0b43ad3903167ac9b5d106e481053d92a1f3ab9fe1a89079e5f16b94","014e069a32d3ac6adde90dd1dfdb6e653341595c64b87f5b1b3e8a7851502028","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","ac46b462f6ae83bee6d3f61176f8da916c6fd43774b79142a6d1508745fbd152","86c8f1a471f03ac5232073884775b77d7673516a1eff3b9c4a866c64a5b1693a","179ec9bf85fbc3df30d76bf9cd5a323793d1c53c0db9df31ee69d661b2645ed6","0d2af812b3894a2daa900a365b727a58cc3cc3f07eb6c114751f9073c8031610","9d81c65d99704c5fd58ef5b04bd2bb938a4d69c440e0fcf3c32ca3c59303d4c8","a4b3c0faa3dfbdd8d1d55e36f8ca69d802db74a1494622da165e845eab41ef01","d0cffd20a0deb57297c2bd8c4cd381ed79de7babf9d81198e28e3f56d9aff0db","77876c19517f1a79067a364423ba9e4f3c6169d01011320a6fde85a95e8f8f5c","06397d7d64845590fc8773d7ba25f906f69843b921b430d55d8cbe7c14123b83","8309b403027c438254d78ca2bb8ddd04bfaf70260a9db37219d9a49ad6df5d80","f400a1539ce94a08fc7e8f6e81a72f7ebb600a5dd78382e84dfa80e448023cae","98f03f763cac47dbbc80dbe11eb5a00d7bf6d3a5d64926755e1de3ee12eea5b5","7132bee1220a53a20f9733a9875c07f4b7d1db9130471d36074fa1214db6675c","ef2ac0bd433b57dec3383a51b851d0a9804266d29b328cf2a9aaa89191b58047","ad1af9027a43ae6a8f9be24145f4845bb31edca21ebdfc75b6295417cb714bce","c630de180667cc81bcc4642cf37ec581f98f575601da4df45b90a17a8d5aa8e2","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","042f5956e7c882bb0580df4cfd7857d26494fa36b67404fcd966a3e60a43806b","92783bcd02ff2a4a53df79e1242102436468c85600cb05d7aef2838fc084ac5d","7dab19f56db3c3ded981c373122ba1e5e1f67474acf3c95a7482e01f8c2dabbb","6879f1a4424d94b2ebb81855a3f1877f6b18088972a87b938f42f96a2842bc4f","62775b9dce86a798384789e4561798d2347216fa30d9fbb4e4e72d2c46c2905f","83992869725857fd9c5dd25f5d16eb4da01ed98830e0315070d9ac3068cf9ef2","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","a7d12223e8210e0cb23bbb542c44abc81e20fad94664ee17df63945dd2321557","ec5444f1dbc6bad68c8a5d95c51db881205c4ee70999ce1fb5b1206b7123249c","4006d7c2d251139974767360fdeffc8267c5cca35626954cd14c2f23b1f03d0e","87ac9d34c6adaa8e43ad7baf1cd48768eda73df328aff4cfa612e52a037046fb","af4991280b62a3c949482af843ac845a32f99531f89da1248cb66a986388b417","1a20de1d748f9c1deafd22b475552c2173efcd9a2ff28f735aeaaf2aad5f558a","cc3e8a3ae279a8f55174fcfaa8b64905d0ff73aaa0f89ce54d1e315d8e4aeba0","400a7addd2712ac1e1028c774cd7d1cf7a4c29a33a94d7dcddd9a6d1724eedc0","7a27cf45a503b6eef08b9405540650459e2b9fae0232cbd1a94bc46187ef175a","325ff2a6d997645c42c313bbcca480428121609e37238f1d2799928eb908f639","563eb9744f81ec9cc67300853c1966938d1d0f564cde9f42b7d895092a0baf5b","08dc456315e7d08517c15c2dadfcbcb50bcc316bb4ce4c6e0d429cb40835fc2d","323195082fd9b9b45e00948ab3350f8765c83a47b386a52fa1118b82cd7b39f1","fa12490296dfebf287271c33aac76b026934b2d9fc2ad76d72012364a757eb65","bce01345fc3809892cfe030d23d74576c063a88a5c04a8bfc151efdfc9b990e5","7842d3c42d7f4d7ae8cd2087f606a00619db8b3210a5f7a4eecf957571da1b7d","d2fda5d7f591500cd6954ec4ac92387f740f025cbbd4db4632681c87218b73a8","d911b8ad0bfc13d5b4fbbb075a5dc39a0c4b56a8cf758394553d3d44750ccd4e","98a33fcdfa4e767ddb8ea155039bee65f823d85deca99ee8306531024e1af02b","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","6faf1c345e9ac68a34afaae4abac11898ab93c60c062c04952af6bc2fd49ed08","22f00cf818ddeda76ebcdd1f2d8dbd6536ba7881f705f722eecff887a7aebef6","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","fb348a1425fda14a7b322fb630b56cc897a598c436fbbc9fc0d9f941328fd63e","d300db2f1427e39e3d6d75a79abeaf2b029e6a4fc759ed972e1fb90de3eb12b8","2bb73619a3257f7b0b70f7cc4963d9cb5156422e8efd08cf999ab4144b3741dd","400a7addd2712ac1e1028c774cd7d1cf7a4c29a33a94d7dcddd9a6d1724eedc0","fed36168ef804525b8375e80e35e6198ef1cfce55b413f4ddfb4fdc0b2d6ffb2","91b535ae5bb95b3827bdcbc22034823db290ad19e84ba6a8b24110163fa4d35e","96e85abf84588f9bbf668db1702cfe7cace619e47cea6af68c2cc1ad45d6edf6","e3413d0b59645ce39ad4d0cc097ebf9c75958c4d8021b837f87606e2cf1b3cc4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","b16f06eb617b23453621541d8a15c5ed949dee4c1d714dbb8f7a41f6ffa90ce4","2cfe02ae04ef78f301c28eca9a752fd54e1d8224a76a4ea7624d7040863f6cab","6dd302e1ac256ce8afa28a675976a9312794c68ea158ef10b670d9bc7bfac382","54401292d135568988d9d83ca3713cf1200f31ce5d017900339629713ed1f23c","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","1e5559afe55f781f220ec40d6c33475896c324b362298b9c4ac3431d35f812a4","6faf1c345e9ac68a34afaae4abac11898ab93c60c062c04952af6bc2fd49ed08","14f65273b85ca6af6eedc50480a7b4632a175cbcf84628dc9ef3292aeedd0d1b","ad4c1df293222909de8608ca5a5983b1663f003f2ab9d31490aaf7d16b80b366","136f1b2fe98eef1bc9848a2a43dcf52fffc8b9a7ce4feff8e22c99f0687ecce2","44d313b854af800c84deb38ba4bf7f0d6f0fef45861fafd2b42b608faa2659fb","cf062ed4e4840e048500a58eb1e9ab2630e15bd5d9cd4e73ad69c63ea10fd470","6d71aac36605ae9a33fb0ba14bbc6c776a62af377be50250bcf764a4aec802ac","e03656883f5e5421f78f1636c4a75805eb71f39a17b7a7a8d9c50e1e82fffa61","1ecde6e71f9cda067a455694af81e9b5d003040205dff9f0bd926590040411ae","a0d7e78f4e19c37485328751dee3c86a53e591118a581fd1680b3996c64f26bf","8907a87fd27c400ebfe50819f750c8a1e757b74ffa3f33883ad18e27bce055f0","13289d9990822f173e325b8e1faf991b859c625c1e997dcc9dec0247c61ed298","b7bc517bd3f81b4260d952dddae2e559994e7a187c26b36ef365ee518a105201","7e138dc97e3b2060f77c4b6ab3910b00b7bb3d5f8d8a747668953808694b1938","2c1751915a1491b9d79fc55a6571d1c68cef7ca95fa4caec7cba5fcd389ac97a","4fde9444a416329eaae01156592abdec1332cffbac60cb0415ee5adfd43b4e5b","431398d2fdf20a2d0b5a52f740336f5dd5b85169a467f04cc4cec6407f08eb3e","7c3ad9c70e8255d53cc2c28e06fabed5a5e5fdc0535001aa2e2e829db1020445","63b9aa230b93ac9c805b8496fcf44c583e95670c7217d4cf3d2eee8b6d4273a0","2d1ea94163b36347034f31e1e91585485673e3a9452c9eeed9bb269b929ebfba","b704d6b174db06e0c680183af83d0c4cd23d867360cced0aca221046cbcaa06d","3b0bd1e159a2934f4bad0459e925b3e819c8958da569f5d918e197115fe4a6d8","62eee500d082c67006a5d2b94cdb20630001c5eacafc05e96a61f63eab77ea8a","139543bc42990aa9a1b7d65a3061b7ca58b12dc03a4c9aa03f0a6000ce996fa2","24d37afd6efdb3d01b14df7dee9a12208f1685c9c59043307b8051425b0965eb","bf0c0f9c26b9bf93ee8961048b293caf4eb73a7cf763942362f9cf4a89b232d2","0d59fec1fd05e84be844d3ee2705659fedaf447bdebc5c8dcac62fbc76005d41","3b9b86d34a23cddf729d979c761062df73fc99b96d3eb652ac5fa6b984b3af77","ff81bffa4ecfceae2e86b5920c3fcb250b66b1d6ed72944dffdf58123be2481b","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","bdf0ed7d9ebae6175a5d1b4ec4065d07f8099379370a804b1faff05004dc387d","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","cf93e7b09b66e142429611c27ba2cbf330826057e3c793e1e2861e976fae3940","90e727d145feb03695693fdc9f165a4dc10684713ee5f6aa81e97a6086faa0f8","ee2c6ec73c636c9da5ab4ce9227e5197f55a57241d66ea5828f94b69a4a09a2d","afaf64477630c7297e3733765046c95640ab1c63f0dfb3c624691c8445bc3b08","5aa03223a53ad03171988820b81a6cae9647eabcebcb987d1284799de978d8e3","7f50c8914983009c2b940923d891e621db624ba32968a51db46e0bf480e4e1cb","90fc18234b7d2e19d18ac026361aaf2f49d27c98dc30d9f01e033a9c2b01c765","a980e4d46239f344eb4d5442b69dcf1d46bd2acac8d908574b5a507181f7e2a1","bbbfa4c51cdaa6e2ef7f7be3ae199b319de6b31e3b5afa7e5a2229c14bb2568a","bc7bfe8f48fa3067deb3b37d4b511588b01831ba123a785ea81320fe74dd9540","fd60c0aaf7c52115f0e7f367d794657ac18dbb257255777406829ab65ca85746","15c17866d58a19f4a01a125f3f511567bd1c22235b4fd77bf90c793bf28388c3","51301a76264b1e1b4046f803bda44307fba403183bc274fe9e7227252d7315cb","ddef23e8ace6c2b2ddf8d8092d30b1dd313743f7ff47b2cbb43f36c395896008","9e42df47111429042b5e22561849a512ad5871668097664b8fb06a11640140ac","391fcc749c6f94c6c4b7f017c6a6f63296c1c9ae03fa639f99337dddb9cc33fe","ac4706eb1fb167b19f336a93989763ab175cd7cc6227b0dcbfa6a7824c6ba59a","633220dc1e1a5d0ccf11d3c3e8cadc9124daf80fef468f2ff8186a2775229de3","6de22ad73e332e513454f0292275155d6cb77f2f695b73f0744928c4ebb3a128","ebe0e3c77f5114b656d857213698fade968cff1b3a681d1868f3cfdd09d63b75","22c27a87488a0625657b52b9750122814c2f5582cac971484cda0dcd7a46dc3b","7e7a817c8ec57035b2b74df8d5dbcc376a4a60ad870b27ec35463536158e1156","0e2061f86ca739f34feae42fd7cce27cc171788d251a587215b33eaec456e786","91659b2b090cadffdb593736210910508fc5b77046d4ce180b52580b14b075ec","d0f6c657c45faaf576ca1a1dc64484534a8dc74ada36fd57008edc1aab65a02b","ce0c52b1ebc023b71d3c1fe974804a2422cf1d85d4af74bb1bced36ff3bff8b5","9c6acb4a388887f9a5552eda68987ee5d607152163d72f123193a984c48157c9","90d0a9968cbb7048015736299f96a0cceb01cf583fd2e9a9edbc632ac4c81b01","49abec0571c941ab6f095885a76828d50498511c03bb326eec62a852e58000c5","8eeb4a4ff94460051173d561749539bca870422a6400108903af2fb7a1ffe3d7","49e39b284b87452fed1e27ac0748ba698f5a27debe05084bc5066b3ecf4ed762","59dcf835762f8df90fba5a3f8ba87941467604041cf127fb456543c793b71456","33e0c4c683dcaeb66bedf5bb6cc35798d00ac58d7f3bc82aadb50fa475781d60","605839abb6d150b0d83ed3712e1b3ffbeb309e382770e7754085d36bc2d84a4c","a862dcb740371257e3dae1ab379b0859edcb5119484f8359a5e6fb405db9e12e","0f0a16a0e8037c17e28f537028215e87db047eba52281bd33484d5395402f3c1","cf533aed4c455b526ddccbb10dae7cc77e9269c3d7862f9e5cedbd4f5c92e05e","f8a60ca31702a0209ef217f8f3b4b32f498813927df2304787ac968c78d8560d","530192961885d3ddad87bf9c4390e12689fa29ff515df57f17a57c9125fc77c3","165ba9e775dd769749e2177c383d24578e3b212e4774b0a72ad0f6faee103b68","61448f238fdfa94e5ccce1f43a7cced5e548b1ea2d957bec5259a6e719378381","69fa523e48131ced0a52ab1af36c3a922c5fd7a25e474d82117329fe051f5b85","fa10b79cd06f5dd03435e184fb05cc5f0d02713bfb4ee9d343db527501be334c","c6fb591e363ee4dea2b102bb721c0921485459df23a2d2171af8354cacef4bce","ea7e1f1097c2e61ed6e56fa04a9d7beae9d276d87ac6edb0cd39a3ee649cddfe","e8cf2659d87462aae9c7647e2a256ac7dcaf2a565a9681bfb49328a8a52861e8","7e374cb98b705d35369b3c15444ef2ff5ff983bd2fbb77a287f7e3240abf208c","ca75ba1519f9a426b8c512046ebbad58231d8627678d054008c93c51bc0f3fa5","ff63760147d7a60dcfc4ac16e40aa2696d016b9ffe27e296b43655dfa869d66b","4d434123b16f46b290982907a4d24675442eb651ca95a5e98e4c274be16f1220","57263d6ba38046e85f499f3c0ab518cfaf0a5f5d4f53bdae896d045209ab4aff","d3a535f2cd5d17f12b1abf0b19a64e816b90c8c10a030b58f308c0f7f2acfe2c","be26d49bb713c13bd737d00ae8a61aa394f0b76bc2d5a1c93c74f59402eb8db3","c7012003ac0c9e6c9d3a6418128ddebf6219d904095180d4502b19c42f46a186","d58c55750756bcf73f474344e6b4a9376e5381e4ba7d834dc352264b491423b6","01e2aabfabe22b4bf6d715fc54d72d32fa860a3bd1faa8974e0d672c4b565dfe","ba2c489bb2566c16d28f0500b3d98013917e471c40a4417c03991460cb248e88","39f94b619f0844c454a6f912e5d6868d0beb32752587b134c3c858b10ecd7056","0d2d8b0477b1cf16b34088e786e9745c3e8145bc8eea5919b700ad054e70a095","2a5e963b2b8f33a50bb516215ba54a20801cb379a8e9b1ae0b311e900dc7254c","d8307f62b55feeb5858529314761089746dce957d2b8fd919673a4985fa4342a","bf449ec80fc692b2703ad03e64ae007b3513ecd507dc2ab77f39be6f578e6f5c","f780213dd78998daf2511385dd51abf72905f709c839a9457b6ba2a55df57be7","2b7843e8a9a50bdf511de24350b6d429a3ee28430f5e8af7d3599b1e9aa7057f","05d95be6e25b4118c2eb28667e784f0b25882f6a8486147788df675c85391ab7","62d2721e9f2c9197c3e2e5cffeb2f76c6412121ae155153179049890011eb785","ff5668fb7594c02aca5e7ba7be6c238676226e450681ca96b457f4a84898b2d9","59fd37ea08657fef36c55ddea879eae550ffe21d7e3a1f8699314a85a30d8ae9","84e23663776e080e18b25052eb3459b1a0486b5b19f674d59b96347c0cb7312a","43e5934c7355731eec20c5a2aa7a859086f19f60a4e5fcd80e6684228f6fb767","a49c210c136c518a7c08325f6058fc648f59f911c41c93de2026db692bba0e47","1a92f93597ebc451e9ef4b158653c8d31902de5e6c8a574470ecb6da64932df4","256513ad066ac9898a70ca01e6fbdb3898a4e0fe408fbf70608fdc28ac1af224","d9835850b6cc05c21e8d85692a8071ebcf167a4382e5e39bf700c4a1e816437e","e5ab7190f818442e958d0322191c24c2447ddceae393c4e811e79cda6bd49836","91b4b77ef81466ce894f1aade7d35d3589ddd5c9981109d1dea11f55a4b807a0","03abb209bed94c8c893d9872639e3789f0282061c7aa6917888965e4047a8b5f","e97a07901de562219f5cba545b0945a1540d9663bd9abce66495721af3903eec","bf39ed1fdf29bc8178055ec4ff32be6725c1de9f29c252e31bdc71baf5c227e6","985eabf06dac7288fc355435b18641282f86107e48334a83605739a1fe82ac15","6112d33bcf51e3e6f6a81e419f29580e2f8e773529d53958c7c1c99728d4fb2e","89e9f7e87a573504acc2e7e5ad727a110b960330657d1b9a6d3526e77c83d8be","44bbb88abe9958c7c417e8687abf65820385191685009cc4b739c2d270cb02e9","ab4b506b53d2c4aec4cc00452740c540a0e6abe7778063e95c81a5cd557c19eb","858757bde6d615d0d1ee474c972131c6d79c37b0b61897da7fbd7110beb8af12","60b9dea33807b086a1b4b4b89f72d5da27ad0dd36d6436a6e306600c47438ac4","409c963b1166d0c1d49fdad1dfeb4de27fd2d6662d699009857de9baf43ca7c3","b7674ecfeb5753e965404f7b3d31eec8450857d1a23770cb867c82f264f546ab","c9800b9a9ad7fcdf74ed8972a5928b66f0e4ff674d55fd038a3b1c076911dcbe","99864433e35b24c61f8790d2224428e3b920624c01a6d26ea8b27ee1f62836bb","c391317b9ff8f87d28c6bfe4e50ed92e8f8bfab1bb8a03cd1fe104ff13186f83","42bdc3c98446fdd528e2591213f71ce6f7008fb9bb12413bd57df60d892a3fb5","542d2d689b58c25d39a76312ccaea2fcd10a45fb27b890e18015399c8032e2d9","97d1656f0a563dbb361d22b3d7c2487427b0998f347123abd1c69a4991326c96","d4f53ed7960c9fba8378af3fa28e3cc483d6c0b48e4a152a83ff0973d507307d","0665de5280d65ec32776dc55fb37128e259e60f389cde5b9803cf9e81ad23ce0","b6dc8fd1c6092da86725c338ca6c263d1c6dd3073046d3ec4eb2d68515062da2","d9198a0f01f00870653347560e10494efeca0bfa2de0988bd5d883a9d2c47edb","d4279865b926d7e2cfe8863b2eae270c4c035b6e923af8f9d7e6462d68679e07","73b6945448bb3425b764cfe7b1c4b0b56c010cc66e5f438ef320c53e469797eb","cf72fd8ffa5395f4f1a26be60246ec79c5a9ad201579c9ba63fd2607b5daf184","301a458744666096f84580a78cc3f6e8411f8bab92608cdaa33707546ca2906f","711e70c0916ff5f821ea208043ecd3e67ed09434b8a31d5616286802b58ebebe","e1f2fd9f88dd0e40c358fbf8c8f992211ab00a699e7d6823579b615b874a8453","17db3a9dcb2e1689ff7ace9c94fa110c88da64d69f01dc2f3cec698e4fc7e29e","73fb07305106bb18c2230890fcacf910fd1a7a77d93ac12ec40bc04c49ee5b8e","2c5f341625a45530b040d59a4bc2bc83824d258985ede10c67005be72d3e21d0","c4a262730d4277ecaaf6f6553dabecc84dcca8decaebbf2e16f1df8bbd996397","c23c533d85518f3358c55a7f19ab1a05aad290251e8bba0947bd19ea3c259467","5d0322a0b8cdc67b8c71e4ccaa30286b0c8453211d4c955a217ac2d3590e911f","f5e4032b6e4e116e7fec5b2620a2a35d0b6b8b4a1cc9b94a8e5ee76190153110","9ab26cb62a0e86ab7f669c311eb0c4d665457eb70a103508aa39da6ccee663da","5f64d1a11d8d4ce2c7ee3b72471df76b82d178a48964a14cdfdc7c5ef7276d70","24e2fbc48f65814e691d9377399807b9ec22cd54b51d631ba9e48ee18c5939dd","bfa2648b2ee90268c6b6f19e84da3176b4d46329c9ec0555d470e647d0568dfb","75ef3cb4e7b3583ba268a094c1bd16ce31023f2c3d1ac36e75ca65aca9721534","3be6b3304a81d0301838860fd3b4536c2b93390e785808a1f1a30e4135501514","da66c1b3e50ef9908e31ce7a281b137b2db41423c2b143c62524f97a536a53d9","3ada1b216e45bb9e32e30d8179a0a95870576fe949c33d9767823ccf4f4f4c97","1ace2885dffab849f7c98bffe3d1233260fbf07ee62cb58130167fd67a376a65","2126e5989c0ca5194d883cf9e9c10fe3e5224fbd3e4a4a6267677544e8be0aae","41a6738cf3c756af74753c5033e95c5b33dfc1f6e1287fa769a1ac4027335bf5","6e8630be5b0166cbc9f359b9f9e42801626d64ff1702dcb691af811149766154","e36b77c04e00b4a0bb4e1364f2646618a54910c27f6dc3fc558ca2ced8ca5bc5","2c4ea7e9f95a558f46c89726d1fedcb525ef649eb755a3d7d5055e22b80c2904","4875d65190e789fad05e73abd178297b386806b88b624328222d82e455c0f2e7","bf5302ecfaacee37c2316e33703723d62e66590093738c8921773ee30f2ecc38","62684064fe034d54b87f62ad416f41b98a405dee4146d0ec03b198c3634ea93c","be02cbdb1688c8387f8a76a9c6ed9d75d8bb794ec5b9b1d2ba3339a952a00614","cefaff060473a5dbf4939ee1b52eb900f215f8d6249dc7c058d6b869d599983c","b2797235a4c1a7442a6f326f28ffb966226c3419399dbb33634b8159af2c712f","164d633bbd4329794d329219fc173c3de85d5ad866d44e5b5f0fb60c140e98f2","b74300dd0a52eaf564b3757c07d07e1d92def4e3b8708f12eedb40033e4cafe9","a792f80b1e265b06dce1783992dbee2b45815a7bdc030782464b8cf982337cf2","8816b4b3a87d9b77f0355e616b38ed5054f993cc4c141101297f1914976a94b1","0f35e4da974793534c4ca1cdd9491eab6993f8cf47103dadfc048b899ed9b511","0ccdfcaebf297ec7b9dde20bbbc8539d5951a3d8aaa40665ca469da27f5a86e1","7fcb05c8ce81f05499c7b0488ae02a0a1ac6aebc78c01e9f8c42d98f7ba68140","81c376c9e4d227a4629c7fca9dde3bbdfa44bd5bd281aee0ed03801182368dc5","0f2448f95110c3714797e4c043bbc539368e9c4c33586d03ecda166aa9908843","b2f1a443f7f3982d7325775906b51665fe875c82a62be3528a36184852faa0bb","7568ff1f23363d7ee349105eb936e156d61aea8864187a4c5d85c60594b44a25","8c4d1d9a4eba4eac69e6da0f599a424b2689aee55a455f0b5a7f27a807e064db","e1beb9077c100bdd0fc8e727615f5dae2c6e1207de224569421907072f4ec885","3dda13836320ec71b95a68cd3d91a27118b34c05a2bfda3e7e51f1d8ca9b960b","fedc79cb91f2b3a14e832d7a8e3d58eb02b5d5411c843fcbdc79e35041316b36","99f395322ffae908dcdfbaa2624cc7a2a2cb7b0fbf1a1274aca506f7b57ebcb5","5e1f7c43e8d45f2222a5c61cbc88b074f4aaf1ca4b118ac6d6123c858efdcd71","7388273ab71cb8f22b3f25ffd8d44a37d5740077c4d87023da25575204d57872","0a48ceb01a0fdfc506aa20dfd8a3563edbdeaa53a8333ddf261d2ee87669ea7b","3182d06b874f31e8e55f91ea706c85d5f207f16273480f46438781d0bd2a46a1","ccd47cab635e8f71693fa4e2bbb7969f559972dae97bd5dbd1bbfee77a63b410","89770fa14c037f3dc3882e6c56be1c01bb495c81dec96fa29f868185d9555a5d","7048c397f08c54099c52e6b9d90623dc9dc6811ea142f8af3200e40d66a972e1","512120cd6f026ce1d3cf686c6ab5da80caa40ef92aa47466ec60ba61a48b5551","6cd0cb7f999f221e984157a7640e7871960131f6b221d67e4fdc2a53937c6770","f48b84a0884776f1bc5bf0fcf3f69832e97b97dc55d79d7557f344de900d259b","dca490d986411644b0f9edf6ea701016836558e8677c150dca8ad315178ec735","a028a04948cf98c1233166b48887dad324e8fe424a4be368a287c706d9ccd491","3046ed22c701f24272534b293c10cfd17b0f6a89c2ec6014c9a44a90963dfa06","394da10397d272f19a324c95bea7492faadf2263da157831e02ae1107bd410f5","0580595a99248b2d30d03f2307c50f14eb21716a55beb84dd09d240b1b087a42","a7da9510150f36a9bea61513b107b59a423fdff54429ad38547c7475cd390e95","659615f96e64361af7127645bb91f287f7b46c5d03bea7371e6e02099226d818","1f2a42974920476ce46bb666cd9b3c1b82b2072b66ccd0d775aa960532d78176","500b3ae6095cbab92d81de0b40c9129f5524d10ad955643f81fc07d726c5a667","a957ad4bd562be0662fb99599dbcf0e16d1631f857e5e1a83a3f3afb6c226059","e57a4915266a6a751c6c172e8f30f6df44a495608613e1f1c410196207da9641","7a12e57143b7bc5a52a41a8c4e6283a8f8d59a5e302478185fb623a7157fff5e","17b3426162e1d9cb0a843e8d04212aabe461d53548e671236de957ed3ae9471b","f38e86eb00398d63180210c5090ef6ed065004474361146573f98b3c8a96477d","231d9e32382d3971f58325e5a85ba283a2021243651cb650f82f87a1bf62d649","6532e3e87b87c95f0771611afce929b5bad9d2c94855b19b29b3246937c9840b","65704bbb8f0b55c73871335edd3c9cead7c9f0d4b21f64f5d22d0987c45687f0","787232f574af2253ac860f22a445c755d57c73a69a402823ae81ba0dfdd1ce23","5e63903cd5ebce02486b91647d951d61a16ad80d65f9c56581cd624f39a66007","bcc89a120d8f3c02411f4df6b1d989143c01369314e9b0e04794441e6b078d22","d17531ef42b7c76d953f63bd5c5cd927c4723e62a7e0b2badf812d5f35f784eb","6d4ee1a8e3a97168ea4c4cc1c68bb61a3fd77134f15c71bb9f3f63df3d26b54c","1eb04fea6b47b16922ed79625d90431a8b2fc7ba9d5768b255e62df0c96f1e3a","de0c2eece83bd81b8682f4496f558beb728263e17e74cbc4910e5c9ce7bef689","98866542d45306dab48ecc3ddd98ee54fa983353bc3139dfbc619df882f54d90","9e04c7708917af428c165f1e38536ddb2e8ecd576f55ed11a97442dc34b6b010","31fe6f6d02b53c1a7c34b8d8f8c87ee9b6dd4b67f158cbfff3034b4f3f69c409","2e1d853f84188e8e002361f4bfdd892ac31c68acaeac426a63cd4ff7abf150d0","666b5289ec8a01c4cc0977c62e3fd32e89a8e3fd9e97c8d8fd646f632e63c055","a1107bbb2b10982dba1f7958a6a5cf841e1a19d6976d0ecdc4c43269c7b0eaf2","07fa6122f7495331f39167ec9e4ebd990146a20f99c16c17bc0a98aa81f63b27","39c1483481b35c2123eaab5094a8b548a0c3f1e483ab7338102c3291f1ab18bf","b73e6242c13796e7d5fba225bf1c07c8ee66d31b7bb65f45be14226a9ae492d2","f2931608d541145d189390d6cfb74e1b1e88f73c0b9a80c4356a4daa7fa5e005","8684656fe3bf1425a91bd62b8b455a1c7ec18b074fd695793cfae44ae02e381a","ccf0b9057dd65c7fb5e237de34f706966ebc30c6d3669715ed05e76225f54fbd","d930f077da575e8ea761e3d644d4c6279e2d847bae2b3ea893bbd572315acc21","19b0616946cb615abde72c6d69049f136cc4821b784634771c1d73bec8005f73","553312560ad0ef97b344b653931935d6e80840c2de6ab90b8be43cbacf0d04cf","1225cf1910667bfd52b4daa9974197c3485f21fe631c3ce9db3b733334199faa","f7cb9e46bd6ab9d620d68257b525dbbbbc9b0b148adf500b819d756ebc339de0","e46d6c3120aca07ae8ec3189edf518c667d027478810ca67a62431a0fa545434","9d234b7d2f662a135d430d3190fc21074325f296273125244b2bf8328b5839a0","0554ef14d10acea403348c53436b1dd8d61e7c73ef5872e2fe69cc1c433b02f8","2f6ae5538090db60514336bd1441ca208a8fab13108cfa4b311e61eaca5ff716","17bf4ce505a4cff88fb56177a8f7eb48aa55c22ccc4cce3e49cc5c8ddc54b07d","3d735f493d7da48156b79b4d8a406bf2bbf7e3fe379210d8f7c085028143ee40","41de1b3ddd71bd0d9ed7ac217ca1b15b177dd731d5251cde094945c20a715d03","17d9c562a46c6a25bc2f317c9b06dd4e8e0368cbe9bdf89be6117aeafd577b36","ded799031fe18a0bb5e78be38a6ae168458ff41b6c6542392b009d2abe6a6f32","ed48d467a7b25ee1a2769adebc198b647a820e242c96a5f96c1e6c27a40ab131","b914114df05f286897a1ae85d2df39cfd98ed8da68754d73cf830159e85ddd15","73881e647da3c226f21e0b80e216feaf14a5541a861494c744e9fbe1c3b3a6af","d79e1d31b939fa99694f2d6fbdd19870147401dbb3f42214e84c011e7ec359ab","4f71097eae7aa37941bab39beb2e53e624321fd341c12cc1d400eb7a805691ff","58ebb4f21f3a90dda31a01764462aa617849fdb1b592f3a8d875c85019956aff","a8e8d0e6efff70f3c28d3e384f9d64530c7a7596a201e4879a7fd75c7d55cbb5","df5cbb80d8353bf0511a4047cc7b8434b0be12e280b6cf3de919d5a3380912c0","256eb0520e822b56f720962edd7807ed36abdf7ea23bcadf4a25929a3317c8cf","9cf2cbc9ceb5f718c1705f37ce5454f14d3b89f690d9864394963567673c1b5c","07d3dd790cf1e66bb6fc9806d014dd40bb2055f8d6ca3811cf0e12f92ba4cb9a","1f99fd62e9cff9b50c36f368caf3b9fb79fc6f6c75ca5d3c2ec4afaea08d9109","6558faaacba5622ef7f1fdfb843cd967af2c105469b9ff5c18a81ce85178fca7","34e7f17ae9395b0269cd3f2f0af10709e6dc975c5b44a36b6b70442dc5e25a38","a4295111b54f84c02c27e46b0855b02fad3421ae1d2d7e67ecf16cb49538280a","ce9746b2ceae2388b7be9fe1f009dcecbc65f0bdbc16f40c0027fab0fb848c3b","35ce823a59f397f0e85295387778f51467cea137d787df385be57a2099752bfb","2e5acd3ec67bc309e4f679a70c894f809863c33b9572a8da0b78db403edfa106","1872f3fcea0643d5e03b19a19d777704320f857d1be0eb4ee372681357e20c88","9689628941205e40dcbb2706d1833bd00ce7510d333b2ef08be24ecbf3eb1a37","0317a72a0b63094781476cf1d2d27585d00eb2b0ca62b5287124735912f3d048","6ce4c0ab3450a4fff25d60a058a25039cffd03141549589689f5a17055ad0545","9153ec7b0577ae77349d2c5e8c5dd57163f41853b80c4fb5ce342c7a431cbe1e","f490dfa4619e48edd594a36079950c9fca1230efb3a82aaf325047262ba07379","674f00085caff46d2cbc76fc74740fd31f49d53396804558573421e138be0c12","41d029194c4811f09b350a1e858143c191073007a9ee836061090ed0143ad94f","44a6259ffd6febd8510b9a9b13a700e1d022530d8b33663f0735dbb3bee67b3d","6f4322500aff8676d9b8eef7711c7166708d4a0686b792aa4b158e276ed946a7","e829ff9ecffa3510d3a4d2c3e4e9b54d4a4ccfef004bacbb1d6919ce3ccca01f","62e6fec9dbd012460b47af7e727ec4cd34345b6e4311e781f040e6b640d7f93e","4d180dd4d0785f2cd140bc069d56285d0121d95b53e4348feb4f62db2d7035d3","f1142cbba31d7f492d2e7c91d82211a8334e6642efe52b71d9a82cb95ba4e8ae","279cac827be5d48c0f69fe319dc38c876fdd076b66995d9779c43558552d8a50","a70ff3c65dc0e7213bfe0d81c072951db9f5b1e640eb66c1eaed0737879c797b","f75d3303c1750f4fdacd23354657eca09aae16122c344e65b8c14c570ff67df5","3ebae6a418229d4b303f8e0fdb14de83f39fba9f57b39d5f213398bca72137c7","21ba07e33265f59d52dece5ac44f933b2b464059514587e64ad5182ddf34a9b0","2d3d96efba00493059c460fd55e6206b0667fc2e73215c4f1a9eb559b550021f","d23d4a57fff5cec5607521ba3b72f372e3d735d0f6b11a4681655b0bdd0505f4","395c1f3da7e9c87097c8095acbb361541480bf5fd7fa92523985019fef7761dd","d61f3d719293c2f92a04ba73d08536940805938ecab89ac35ceabc8a48ccb648","ca693235a1242bcd97254f43a17592aa84af66ccb7497333ccfea54842fde648","cd41cf040b2e368382f2382ec9145824777233730e3965e9a7ba4523a6a4698e","2e7a9dba6512b0310c037a28d27330520904cf5063ca19f034b74ad280dbfe71","9f2a38baf702e6cb98e0392fa39d25a64c41457a827b935b366c5e0980a6a667","c1dc37f0e7252928f73d03b0d6b46feb26dea3d8737a531ca4c0ec4105e33120","25126b80243fb499517e94fc5afe5c9c5df3a0105618e33581fb5b2f2622f342","d332c2ddcb64012290eb14753c1b49fe3eee9ca067204efba1cf31c1ce1ee020","1be8da453470021f6fe936ba19ee0bfebc7cfa2406953fa56e78940467c90769","7c9f2d62d83f1292a183a44fb7fb1f16eb9037deb05691d307d4017ac8af850a","d0163ab7b0de6e23b8562af8b5b4adea4182884ca7543488f7ac2a3478f3ae6e","05224e15c6e51c4c6cd08c65f0766723f6b39165534b67546076c226661db691","a5f7158823c7700dd9fc1843a94b9edc309180c969fbfa6d591aeb0b33d3b514","7d30937f8cf9bb0d4b2c2a8fb56a415d7ef393f6252b24e4863f3d7b84285724","e04d074584483dc9c59341f9f36c7220f16eed09f7af1fa3ef9c64c26095faec","619697e06cbc2c77edda949a83a62047e777efacde1433e895b904fe4877c650","88d9a8593d2e6aee67f7b15a25bda62652c77be72b79afbee52bea61d5ffb39e","044d7acfc9bd1af21951e32252cf8f3a11c8b35a704169115ddcbde9fd717de2","a4ca8f13a91bd80e6d7a4f013b8a9e156fbf579bbec981fe724dad38719cfe01","5a216426a68418e37e55c7a4366bc50efc99bda9dc361eae94d7e336da96c027","13b65b640306755096d304e76d4a237d21103de88b474634f7ae13a2fac722d5","7478bd43e449d3ce4e94f3ed1105c65007b21f078b3a791ea5d2c47b30ea6962","601d3e8e71b7d6a24fc003aca9989a6c25fa2b3755df196fd0aaee709d190303","168e0850fcc94011e4477e31eca81a8a8a71e1aed66d056b7b50196b877e86c8","37ba82d63f5f8c6b4fc9b756f24902e47f62ea66aae07e89ace445a54190a86e","f5b66b855f0496bc05f1cd9ba51a6a9de3d989b24aa36f6017257f01c8b65a9f","823b16d378e8456fcc5503d6253c8b13659be44435151c6b9f140c4a38ec98c1","b58b254bf1b586222844c04b3cdec396e16c811463bf187615bb0a1584beb100","a367c2ccfb2460e222c5d10d304e980bd172dd668bcc02f6c2ff626e71e90d75","0718623262ac94b016cb0cfd8d54e4d5b7b1d3941c01d85cf95c25ec1ba5ed8d","d4f3c9a0bd129e9c7cbfac02b6647e34718a2b81a414d914e8bd6b76341172e0","824306df6196f1e0222ff775c8023d399091ada2f10f2995ce53f5e3d4aff7a4","84ca07a8d57f1a6ba8c0cf264180d681f7afae995631c6ca9f2b85ec6ee06c0f","35755e61e9f4ec82d059efdbe3d1abcccc97a8a839f1dbf2e73ac1965f266847","64a918a5aa97a37400ec085ffeea12a14211aa799cd34e5dc828beb1806e95bb","0c8f5489ba6af02a4b1d5ba280e7badd58f30dc8eb716113b679e9d7c31185e5","7b574ca9ae0417203cdfa621ab1585de5b90c4bc6eea77a465b2eb8b92aa5380","3334c03c15102700973e3e334954ac1dffb7be7704c67cc272822d5895215c93","aabcb169451df7f78eb43567fab877a74d134a0a6d9850aa58b38321374ab7c0","1b5effdd8b4e8d9897fc34ab4cd708a446bf79db4cb9a3467e4a30d55b502e14","d772776a7aea246fd72c5818de72c3654f556b2cf0d73b90930c9c187cc055fc","dbd4bd62f433f14a419e4c6130075199eb15f2812d2d8e7c9e1f297f4daac788","427df949f5f10c73bcc77b2999893bc66c17579ad073ee5f5270a2b30651c873","c4c1a5565b9b85abfa1d663ca386d959d55361e801e8d49155a14dd6ca41abe1","7a45a45c277686aaff716db75a8157d0458a0d854bacf072c47fee3d499d7a99","57005b72bce2dc26293e8924f9c6be7ee3a2c1b71028a680f329762fa4439354","8f53b1f97c53c3573c16d0225ee3187d22f14f01421e3c6da1a26a1aace32356","810fdc0e554ed7315c723b91f6fa6ef3a6859b943b4cd82879641563b0e6c390","87a36b177b04d23214aa4502a0011cd65079e208cd60654aefc47d0d65da68ea","28a1c17fcbb9e66d7193caca68bbd12115518f186d90fc729a71869f96e2c07b","cc2d2abbb1cc7d6453c6fee760b04a516aa425187d65e296a8aacff66a49598a","d2413645bc4ab9c3f3688c5281232e6538684e84b49a57d8a1a8b2e5cf9f2041","4e6e21a0f9718282d342e66c83b2cd9aa7cd777dfcf2abd93552da694103b3dc","9006cc15c3a35e49508598a51664aa34ae59fc7ab32d6cc6ea2ec68d1c39448e","74467b184eadee6186a17cac579938d62eceb6d89c923ae67d058e2bcded254e","4169b96bb6309a2619f16d17307da341758da2917ff40c615568217b14357f5e","4a94d6146b38050de0830019a1c6a7820c2e2b90eba1a5ee4e4ab3bc30a72036","48a35ece156203abf19864daa984475055bbed4dc9049d07f4462100363f1e85","5ea9d6f986f2d8473f74850eb049c31c45e45f5ca2c9abfb42d1ca198dbdde55","01ba761ce6d75a4142858a053f45d64d255e057049ab1cc4d9a93e76b8b5c444","99ccecc75602eac5f4b153f8a4e5548c423c815695fb92e410986ea00fc40506","3765041b67d733cc716ec817a9e23da8847a4008b5e068dad5ce13fca224f088","77c2f81fdca0757ac5a3127fcff42c4819909aa4fd0a767f468ddd1aade0426b","9ffcc9d45cc0f9854827ec2f469d0cfd9c702efb9ef317130e89d175a32edf85","af736c073d3bd27699e44d1f74ead11420a58d569b941c9784a1bbda888540b6","d0578fea64103214fbc12640c09bf02c1eff7a0ef5b821e04006afeb14fb54d5","dc7f474e01169140e44a6b7156c49425c21763b4d4a730af60e4bfdfd277766a","cea8445fd947f6130ce786bbcddc2c3973dc87a37b17204e0f0593b606878c7f","e97503febf438183c49d3e2802bf6710daaa9b2cf23a1f53df932bbca814b7fc","59c3e25dfb32de37a04b3a383571f7eea0a8e8fb69d45002daf601ebcbbd9bbc","f4e6998b79a1b5c5ba4778bf6e6e7f3d578421aeb1dcdbdcb48052d1454c0e86","0a773952200c60db032cf5ca81caad4d8f6bf4f84401e2a7787f634fbd61dde8","9ecc6634ada19ca70aa34fe92474dcdd6c7eeff43764fb639821c66b97ccb866","5c67c1c9a41403e163e643bf30c81e9534d60d01395d96ad9efa294e100f5091","a6685e7f433a6dc1ac80efee6ca89ca81e9ec3c51ae638fc3e3128199c820037","c636a843d99ff4bb3152bea2f495916555fd07b4a5cec8c8ac647dbb57dbfc1c","bb7febd3ddb82eab494ddd5d79fc6b4881e94e19c884e779908f442cc2b09971","7806920cb7b68c6fb0af6ec3eac5374e73e395b4cfd2dc23c1ca17f165dbc2b5","fe2c127008bc4beb78142810277113ec563c4e60ead841be23b8effc02c195a1","6602cb6c49fbc0a066784c5b65b392c2c3a7e5dcc2e277257ada3ddb2175c542","66ea335d7e4271487f8690420c1fb08ef63bedf210ae7a0f40a8cfee71e99489","690f4634bbf09684e15e6ba28d166bb69069816dcff2702647147254c887cf0e","956bf0f14bb1e624f62244685ff278a55e74c9ec169931a0fae10f235974fe2f","e707a7268fa01459ab710d2dfac80a65410431079b1ed6870beeb794f82b2999","0f95204d20f5adbe5b1a4832c6693f5aca6e629618c210e340f339ea5c8e4be7","78e72809811a509761ef51bc399df4fc519a7325cd753a652e870fbc7f4217d4","0e10905b897b9fb4e8c10f145066f2d6adb2d6319d3298ee9ab12eb7cfe1248d","282f98006ed7fa9bb2cd9bdbe2524595cfc4bcd58a0bb3232e4519f2138df811","6222e987b58abfe92597e1273ad7233626285bc2d78409d4a7b113d81a83496b","cbe726263ae9a7bf32352380f7e8ab66ee25b3457137e316929269c19e18a2be","7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea",{"version":"4025a454b1ca489b179ee8c684bdd70ff8c1967e382076ade53e7e4653e1daec","affectsGlobalScope":true},{"version":"984c09345059b76fc4221c2c54e53511f4c27a0794dfd6e9f81dc60f0b564e05","affectsGlobalScope":true},{"version":"162598d0f572e7cd76e2d78fa2ac04f1753df007bdd79f899c7539d84a3bddd6","affectsGlobalScope":true},"c270821a87ad25fbeaa17f9e28b463ce61f085aac388bdfb5242493b265ce5a7","13daee704ef398953ac1afa073cc8c670cbeee05df1b1ef46d7f4d385e30b988","fab58e600970e66547644a44bc9918e3223aa2cbd9e8763cec004b2cfb48827e","27c7c17a5dfd59eedb5a17f17245612eda203b09acd148456a90e12cdbd73769","96f8ddf12c40a0e868184e39ce1d88dc6600fecd37dd1e39da74959375bc11cf","fc0d619307939a2230dd8af6511a4cbc63a2b01b5231d7496d27270648ecc766","9355da7b837d1e6420dfd575f598e352b49d9cdcf38607579c9dbece880a0c0e","9acbf08ad86f86c9671c1a2fbd6b5bd9dc46ac3992e18269b07218b6dfca62c3","d256b460a51b16cfcaf595f88872630eb9061f7f56936f0474da303be7292cc2","ad0f0fb9e0b571a9691d86327266bb5280bccd203e692c991d4ee8d312c04132","9931538a9581db95a60d6c403faf826a5989bb3295ef5a83f23df8670cbc47f0",{"version":"baff9871542ed137e47760e1b6a811d355447c6539405682cc095259a9104b4c","affectsGlobalScope":true},"ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","e142fda89ed689ea53d6f2c93693898464c7d29a0ae71c6dc8cdfe5a1d76c775","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107",{"version":"964f307d249df0d7e8eb16d594536c0ac6cc63c8d467edf635d05542821dec8e","affectsGlobalScope":true},"db3ec8993b7596a4ef47f309c7b25ee2505b519c13050424d9c34701e5973315",{"version":"6a1ebd564896d530364f67b3257c62555b61d60494a73dfe8893274878c6589d","affectsGlobalScope":true},"af49b066a76ce26673fe49d1885cc6b44153f1071ed2d952f2a90fccba1095c9","f22fd1dc2df53eaf5ce0ff9e0a3326fc66f880d6a652210d50563ae72625455f",{"version":"3ddbdb519e87a7827c4f0c4007013f3628ca0ebb9e2b018cf31e5b2f61c593f1","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"6d498d4fd8036ea02a4edcae10375854a0eb1df0496cf0b9d692577d3c0fd603","affectsGlobalScope":true},"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","fd09b892597ab93e7f79745ce725a3aaf6dd005e8db20f0c63a5d10984cba328","a3be878ff1e1964ab2dc8e0a3b67087cf838731c7f3d8f603337e7b712fdd558","5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","9be74296ee565af0c12d7071541fdd23260f53c3da7731fb6361f61150a791f6",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},{"version":"f501a53b94ba382d9ba396a5c486969a3abc68309828fa67f916035f5d37fe2b","affectsGlobalScope":true},"aa658b5d765f630c312ac9202d110bbaf2b82d180376457f0a9d57b42629714a","312ac7cbd070107766a9886fd27f9faad997ef57d93fdfb4095df2c618ac8162","2e9b4e7f9942af902eb85bae6066d04ef1afee51d61554a62d144df3da7dec94","672ad3045f329e94002256f8ed460cfd06173a50c92cde41edaadfacffd16808","64da4965d1e0559e134d9c1621ae400279a216f87ed00c4cce4f2c7c78021712","2205527b976f4f1844adc46a3f0528729fb68cac70027a5fb13c49ca23593797",{"version":"0166fce1204d520fdfd6b5febb3cda3deee438bcbf8ce9ffeb2b1bcde7155346","affectsGlobalScope":true},"d8b13eab85b532285031b06a971fa051bf0175d8fff68065a24a6da9c1c986cf","50c382ba1827988c59aa9cc9d046e386d55d70f762e9e352e95ee8cb7337cdb8","bb9627ab9d078c79bb5623de4ac8e5d08f806ec9b970962dfc83b3211373690d",{"version":"21d7e87f271e72d02f8d167edc902f90b04525edc7918f00f01dd0bd00599f7e","affectsGlobalScope":true},{"version":"6f6abdaf8764ef01a552a958f45e795b5e79153b87ddad3af5264b86d2681b72","affectsGlobalScope":true},"a215554477f7629e3dcbc8cde104bec036b78673650272f5ffdc5a2cee399a0a","c3497fc242aabfedcd430b5932412f94f157b5906568e737f6a18cc77b36a954","cdc1de3b672f9ef03ff15c443aa1b631edca35b6ae6970a7da6400647ff74d95","139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","bf01fdd3b93cf633b3f7420718457af19c57ab8cbfea49268df60bae2e84d627","15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","5f461d6f5d9ff474f1121cc3fd86aa3cd67476c701f55c306d323c5112201207","65b39cc6b610a4a4aecc321f6efb436f10c0509d686124795b4c36a5e915b89e","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633",{"version":"83fe38aa2243059ea859325c006da3964ead69b773429fe049ebb0426e75424d","affectsGlobalScope":true},"d3edb86744e2c19f2c1503849ac7594a5e06024f2451bacae032390f2e20314a",{"version":"e501cbca25bd54f0bcb89c00f092d3cae227e970b93fd76207287fd8110b123d","affectsGlobalScope":true},{"version":"8a3e61347b8f80aa5af532094498bceb0c0b257b25a6aa8ab4880fd6ed57c95a","affectsGlobalScope":true},"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","950f6810f7c80e0cffefcf1bcc6ade3485c94394720e334c3c2be3c16b6922fb","5475df7cfc493a08483c9d7aa61cc04791aecba9d0a2efc213f23c4006d4d3cd","000720870b275764c65e9f28ac97cc9e4d9e4a36942d4750ca8603e416e9c57c",{"version":"54412c70bacb9ed547ed6caae8836f712a83ccf58d94466f3387447ec4e82dc3","affectsGlobalScope":true},{"version":"e74e7b0baa7a24f073080091427d36a75836d584b9393e6ac2b1daf1647fe65a","affectsGlobalScope":true},"4c48e931a72f6971b5add7fdb1136be1d617f124594e94595f7114af749395e0","478eb5c32250678a906d91e0529c70243fc4d75477a08f3da408e2615396f558","e686a88c9ee004c8ba12ffc9d674ca3192a4c50ed0ca6bd5b2825c289e2b2bfe",{"version":"0d27932df2fbc3728e78b98892540e24084424ce12d3bd32f62a23cf307f411f","affectsGlobalScope":true},"4423fb3d6abe6eefb8d7f79eb2df9510824a216ec1c6feee46718c9b18e6d89f",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"01c47d1c006b3a15b51d89d7764fff7e4fabc4e412b3a61ee5357bd74b822879"],"root":[442,444,445,[1236,1240],[1242,1244],1348,1349,1668,[1670,1678],[1685,1693],1695,1696,[1703,1705],[1709,1715]],"options":{"allowImportingTsExtensions":true,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"emitDeclarationOnly":true,"jsx":1,"jsxImportSource":"vue","module":99,"noFallthroughCasesInSwitch":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":false,"target":7,"useDefineForClassFields":true},"fileIdsList":[[53,58,443,1235],[58,370,371,372,443,1235],[58,443,1235],[58,370,443,1235],[58,373,443,1235],[374,375,376,377,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230],[370,372,1231,1232],[54],[1362],[1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666],[1350,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362],[1350,1351,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362],[1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362],[1350,1351,1352,1354,1355,1356,1357,1358,1359,1360,1361,1362],[1350,1351,1352,1353,1355,1356,1357,1358,1359,1360,1361,1362],[1350,1351,1352,1353,1354,1356,1357,1358,1359,1360,1361,1362],[1350,1351,1352,1353,1354,1355,1357,1358,1359,1360,1361,1362],[1350,1351,1352,1353,1354,1355,1356,1358,1359,1360,1361,1362],[1350,1351,1352,1353,1354,1355,1356,1357,1359,1360,1361,1362],[1350,1351,1352,1353,1354,1355,1356,1357,1358,1360,1361,1362],[1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1361,1362],[1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1362],[1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361],[1717],[1757],[1758,1763,1793],[1759,1764,1770,1771,1778,1790,1801],[1759,1760,1770,1778],[1761,1802],[1762,1763,1771,1779],[1763,1790,1798],[1764,1766,1770,1778],[1757,1765],[1766,1767],[1770],[1768,1770],[1757,1770],[1770,1771,1772,1790,1801],[1770,1771,1772,1785,1790,1793],[1755,1806],[1755,1766,1770,1773,1778,1790,1801],[1770,1771,1773,1774,1778,1790,1798,1801],[1773,1775,1790,1798,1801],[1717,1718,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808],[1770,1776],[1777,1801,1806],[1766,1770,1778,1790],[1779],[1780],[1757,1781],[1717,1718,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807],[1783],[1784],[1770,1785,1786],[1785,1787,1802,1804],[1758,1770,1790,1791,1792,1793],[1758,1790,1792],[1790,1791],[1793],[1794],[1717,1790],[1770,1796,1797],[1796,1797],[1763,1778,1790,1798],[1799],[1778,1800],[1758,1773,1784,1801],[1763,1802],[1790,1803],[1777,1804],[1805],[1758,1763,1770,1772,1781,1790,1801,1804,1806],[1790,1807],[1706],[48,54,55],[56],[48],[48,49,50,52,1708],[49,50,51,52,1708],[53,58,73,177,213,214,443,1235],[172],[58,88,443,1235],[51,58,61,90,91,98,100,107,443,1235],[58,89,90,91,98,99,100,101,104,105,106,443,1235],[101],[92],[92,93,94,95,96,97],[107],[58,90,92,99,443,1235],[87,88],[87,88,102,103],[87],[99],[58,183,443,1235],[79],[58,110,443,1235],[58,61,443,1235],[58,61,73,251,443,1235],[58,61,73,232,443,1235],[53,58,61,101,443,1235],[58,61,73,232,233,443,1235],[58,338,347,355,443,1235],[58,61,338,355,434,443,1235],[53,58,61,73,85,187,236,237,242,243,244,443,1235],[58,242,443,1235],[58,237,443,1235],[58,61,73,183,443,1235],[58,61,183,253,443,1235],[58,61,73,253,254,443,1235],[58,61,73,443,1235],[58,61,73,256,257,443,1235],[58,61,73,173,443,1235],[53,58,61,73,177,260,261,269,441,443,1235],[58,61,73,270,271,272,443,1235],[53,58,187,443,1235],[58,73,177,187,443,1235],[58,61,73,177,187,212,213,443,1235],[58,205,276,443,1235],[58,61,191,199,275,443,1235],[277],[274],[58,107,110,116,117,443,1235],[58,61,73,279,280,281,443,1235],[53,58,61,443,1235],[58,61,73,85,187,236,289,290,443,1235],[58,61,178,443,1235],[58,61,73,177,178,179,443,1235],[58,61,73,177,443,1235],[58,107,110,443,1235],[58,61,294,443,1235],[58,61,73,283,284,443,1235],[53,58,61,73,283,443,1235],[58,61,73,283,284,285,443,1235],[176,180,182,187,190,195,210,214,218,227,231,234,242,245,252,255,258,268,273,278,282,286,287,291,294,295,296,298,299,300,303,304,305,306,309,311,319,326,328,331,335,340,345,350,354,357,358,359,360,365,366,378,379,387,388,390,391,393,394,402,405,410,415,418,425,426,427,430,432,433,435,437],[58,61,62,77,83,107,110,172,185,227,443,1235],[53,58,62,77,83,185,186,227,443,1235],[53,61],[58,61,177,187,192,193,197,198,202,205,207,215,443,1235],[58,61,73,177,187,191,192,193,196,197,198,202,211,213,214,443,1235],[187,192,201,202,210],[58,61,177,187,192,193,197,198,202,206,215,443,1235],[297],[215],[53,195],[58,107,108,110,116,172,443,1235],[58,61,73,177,213,214,260,261,269,441,443,1235],[58,61,73,177,260,261,269,441,443,1235],[58,61,73,177,260,261,269,301,302,441,443,1235],[58,61,73,177,213,260,261,268,443,1235],[51,58,61,436,443,1235],[51,58,443,1235],[58,61,73,177,306,443,1235],[58,61,73,177,187,306,307,308,443,1235],[58,73,177,258,443,1235],[58,61,62,73,78,79,81,82,187,443,1235],[58,61,62,73,78,443,1235],[58,79,443,1235],[58,61,62,73,79,81,82,83,187,294,310,443,1235],[61],[58,62,79,443,1235],[78,292,293],[58,61,183,443,1235],[58,177,323,324,325,443,1235],[53,58,61,322,443,1235],[58,107,230,438,440,443,1235],[58,61,73,177,187,327,443,1235],[58,61,187,443,1235],[58,61,73,177,187,312,314,315,316,317,318,443,1235],[58,61,73,177,187,314,443,1235],[53,58,73,177,187,314,443,1235],[53,58,73,177,214,314,443,1235],[58,107,110,172,443,1235],[58,61,73,177,187,314,316,443,1235],[53,58,73,329,330,443,1235],[53,58,73,443,1235],[58,61,73,181,332,333,334,443,1235],[53,58,61,73,335,443,1235],[53,58,61,73,443,1235],[226],[58,60,62,181,185,190,215,219,225,443,1235],[227],[58,61,73,177,341,342,344,443,1235],[58,61,177,259,260,261,263,264,265,266,267,443,1235],[58,61,260,262,264,443,1235],[58,61,260,261,443,1235],[58,61,259,443,1235],[58,61,73,260,443,1235],[58,61,177,260,261,263,443,1235],[53,58,61,73,177,260,443,1235],[58,61,73,177,260,443,1235],[58,61,337,339,443,1235],[58,338,443,1235],[346],[58,61,73,177,187,213,214,346,348,349,443,1235],[58,61,73,177,187,213,214,443,1235],[58,108,110,443,1235],[61,346,347],[58,61,337,356,443,1235],[58,355,443,1235],[58,61,73,177,255,443,1235],[58,61,181,443,1235],[58,61,73,85,86,173,174,177,213,214,443,1235],[58,61,85,173,174,176,443,1235],[58,61,217,443,1235],[58,61,431,443,1235],[58,61,73,362,443,1235],[58,61,73,177,361,362,363,364,443,1235],[58,361,443,1235],[58,61,73,177,362,443,1235],[53,58,73,177,362,443,1235],[58,61,73,177,187,443,1235],[53,58,61,73,367,368,369,374,375,376,377,443,1235],[53],[58,61,183,292,294,443,1235],[58,61,428,429,443,1235],[428],[58,61,73,85,187,236,237,238,241,443,1235],[58,61,381,443,1235],[58,61,380,382,383,384,385,386,443,1235],[58,61,384,443,1235],[58,61,175,177,443,1235],[58,61,73,187,443,1235],[53,58,61,73,187,389,443,1235],[58,61,73,334,443,1235],[53,58,61,351,443,1235],[58,61,351,352,353,443,1235],[58,61,351,443,1235],[58,61,177,392,443,1235],[58,185,443,1235],[58,398,443,1235],[53,58,61,73,84,85,173,174,176,185,187,334,396,397,398,399,400,401,443,1235],[58,61,84,176,180,182,183,184,443,1235],[53,58,61,73,84,85,173,174,176,185,187,334,391,395,443,1235],[53,58,61,73,177,187,412,413,414,443,1235],[411,413],[61,411],[53,58,61,73,177,187,412,443,1235],[58,61,73,173,194,443,1235],[58,110,172,439,441,443,1235],[58,170,443,1235],[111,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162],[163,164,165,170,171],[164,165,166,167,168,169],[164],[58,61,107,108,109,172,443,1235],[58,205,208,215,443,1235],[209],[58,191,192,207,215,443,1235],[58,61,73,416,417,443,1235],[58,61,85,86,173,443,1235],[58,61,73,85,173,174,175,443,1235],[58,61,73,85,86,173,174,443,1235],[58,61,73,220,224,225,443,1235],[58,61,73,220,224,443,1235],[58,61,73,74,75,76,188,189,443,1235],[53,58,61,73,190,443,1235],[58,187,443,1235],[58,61,73,85,187,236,237,241,242,249,406,407,408,409,443,1235],[53,58,61,73,177,249,250,251,403,443,1235],[53,58,61,73,177,249,250,251,403,404,443,1235],[58,61,73,177,249,250,251,443,1235],[53,58,177,316,419,443,1235],[58,61,187,419,420,421,422,423,424,443,1235],[58,420,443,1235],[53,58,61,216,219,443,1235],[58,61,216,218,443,1235],[53,58,61,73,85,236,241,288,443,1235],[289],[58,73,443,1235],[323],[53,58,73,177,320,321,322,443,1235],[53,58,73,320,443,1235],[53,58,321,323,443,1235],[58,61,73,177,187,313,443,1235],[53,58,73,341,342,344,443,1235],[58,73,341,344,443,1235],[341,343],[58,61,177,443,1235],[58,61,336,443,1235],[58,61,191,443,1235],[53,61,191,192],[53,192],[58,61,177,192,193,199,200,443,1235],[58,61,191,192,193,197,198,443,1235],[58,61,177,192,193,201,443,1235],[58,61,73,85,177,235,237,443,1235],[236],[236,237,238,239,240],[53,58,61,73,85,236,443,1235],[58,84,443,1235],[58,223,443,1235],[221,222],[58,61,220,443,1235],[85],[53,58,61,73,220,221,224,443,1235],[58,406,443,1235],[53,58,61,73,85,236,237,242,249,406,407,443,1235],[250,406,408],[58,61,246,250,443,1235],[246,247,249,250],[58,235,249,443,1235],[58,73,177,248,250,251,443,1235],[53,58,73,177,249,250,251,443,1235],[53,58,73,177,250,443,1235],[229],[1334],[58,443,1235,1250],[51,58,443,1235,1246,1252,1253,1260,1262,1269],[58,443,1235,1251,1252,1253,1260,1261,1262,1263,1266,1267,1268],[1263],[1254],[1254,1255,1256,1257,1258,1259],[1269],[58,443,1235,1252,1254,1261],[1249,1250],[1249,1250,1264,1265],[1249],[1261],[58,443,1235,1272],[58,443,1235,1269,1272,1278,1279],[58,443,1235,1246,1340],[58,73,443,1235,1246,1339,1340,1341],[58,73,443,1235,1246,1339],[58,443,1235,1269,1272],[58,443,1235,1269,1270,1272,1278,1334],[58,443,1235,1269,1272,1334],[58,443,1235,1270,1272],[58,443,1235,1246,1343],[58,443,1235,1246],[58,443,1235,1347],[58,443,1235,1245,1246,1338,1342,1344,1345,1346],[58,443,1235,1332],[1273,1274,1275,1276,1277,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324],[1325,1326,1327,1332,1333],[1326,1327,1328,1329,1330,1331],[1326],[58,443,1235,1246,1269,1270,1271,1334],[58,443,1235,1246,1247,1248,1335],[58,73,443,1235,1246,1247,1335,1336,1337],[58,73,443,1235,1246,1247,1248,1335,1336],[58,73,443,1235,1246],[204],[203],[1683],[1682],[1681],[1679],[1680],[1235,1694],[58,443,1234],[80],[1727,1731,1801],[1727,1790,1801],[1722],[1724,1727,1798,1801],[1778,1798],[1809],[1722,1809],[1724,1727,1778,1801],[1719,1720,1723,1726,1758,1770,1790,1801],[1727,1734],[1719,1725],[1727,1748,1749],[1723,1727,1758,1793,1801,1809],[1758,1809],[1748,1758,1809],[1721,1722,1809],[1727],[1721,1722,1723,1724,1725,1726,1727,1728,1729,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1750,1751,1752,1753,1754],[1727,1742],[1727,1734,1735],[1725,1727,1735,1736],[1726],[1719,1722,1727],[1727,1731,1735,1736],[1731],[1725,1727,1730,1801],[1719,1724,1727,1734],[1758,1790],[1722,1727,1748,1758,1806,1809],[1701],[1697],[1698],[1699,1700],[63,64,65,66,67,68,69,70,71,72],[63],[50,52,58,443,1235,1707],[52,57],[52],[53,58,59,204,205,228,441,443,1235],[53,441,1237,1669,1693],[53,58,59,83,441,443,1233,1235,1242],[53,58,59,443,444,1235],[53,58,59,441,443,1233,1235,1237,1693],[53,58,59,443,445,1233,1235,1238,1692],[53,58,59,443,445,1235,1704],[53,58,59,443,1235,1678,1711],[53,58,59,311,441,443,1235,1236,1237,1670,1677,1678,1685],[53,58,59,441,443,1233,1235,1243,1348,1349,1703],[53,58,83,441,443,1233,1235,1242,1243],[53,58,59,441,443,1235,1669,1705,1709],[53,1670],[53,58,441,443,1235,1244,1348],[53,58,442,443,1235,1671,1693,1695,1702],[53,441,443,1237,1678,1692],[53,443,1239,1240,1673,1674,1676,1687,1688,1689,1690,1691],[53,1235,1694],[53,1235,1236,1694],[53,58,441,443,1235,1241],[53,58,185,441,443,1235,1241,1242,1244,1347],[53,443],[53,1348],[53,1703],[53,205,1670,1708],[53,1684],[53,58,59,443,1235],[53,58,59,443,1233,1235,1686],[53,58,59,83,441,443,1235,1241,1242,1348,1668,1670,1671,1672,1675],[53,58,59,291,311,441,443,1233,1235,1237,1670,1675],[53,58,59,83,441,443,1235,1241,1348,1668,1670,1671,1672],[53,58,59,83,441,443,1235,1242,1243,1348,1668,1670,1671,1672],[58,443,1235,1362,1702]],"referencedMap":[[59,1],[373,2],[370,3],[1232,4],[446,5],[447,5],[448,5],[449,5],[450,5],[451,5],[452,5],[453,5],[454,5],[455,5],[456,5],[457,5],[458,5],[459,5],[460,5],[461,5],[462,5],[463,5],[464,5],[465,5],[466,5],[467,5],[468,5],[469,5],[470,5],[471,5],[472,5],[473,5],[474,5],[475,5],[476,5],[477,5],[478,5],[479,5],[480,5],[481,5],[482,5],[483,5],[484,5],[486,5],[485,5],[487,5],[488,5],[489,5],[490,5],[491,5],[492,5],[493,5],[494,5],[495,5],[496,5],[497,5],[498,5],[499,5],[500,5],[501,5],[502,5],[503,5],[504,5],[505,5],[506,5],[507,5],[508,5],[509,5],[510,5],[511,5],[512,5],[513,5],[514,5],[515,5],[516,5],[522,5],[517,5],[518,5],[519,5],[520,5],[521,5],[523,5],[524,5],[525,5],[526,5],[527,5],[528,5],[529,5],[530,5],[531,5],[532,5],[533,5],[534,5],[535,5],[536,5],[537,5],[538,5],[539,5],[540,5],[541,5],[542,5],[543,5],[544,5],[548,5],[549,5],[550,5],[551,5],[552,5],[553,5],[554,5],[555,5],[545,5],[546,5],[556,5],[557,5],[558,5],[547,5],[374,5],[559,5],[560,5],[561,5],[562,5],[563,5],[564,5],[565,5],[566,5],[567,5],[568,5],[569,5],[570,5],[571,5],[572,5],[573,5],[574,5],[575,5],[375,5],[576,5],[577,5],[578,5],[579,5],[580,5],[581,5],[582,5],[583,5],[584,5],[585,5],[586,5],[587,5],[588,5],[589,5],[590,5],[591,5],[596,5],[597,5],[598,5],[599,5],[592,5],[593,5],[594,5],[595,5],[600,5],[601,5],[602,5],[603,5],[604,5],[605,5],[606,5],[607,5],[608,5],[609,5],[610,5],[611,5],[612,5],[613,5],[614,5],[615,5],[616,5],[617,5],[618,5],[619,5],[621,5],[622,5],[623,5],[624,5],[625,5],[620,5],[626,5],[627,5],[628,5],[629,5],[630,5],[631,5],[632,5],[633,5],[634,5],[636,5],[637,5],[638,5],[635,5],[639,5],[640,5],[641,5],[642,5],[643,5],[644,5],[645,5],[646,5],[647,5],[648,5],[649,5],[650,5],[651,5],[652,5],[653,5],[654,5],[655,5],[656,5],[657,5],[658,5],[659,5],[660,5],[661,5],[662,5],[663,5],[664,5],[665,5],[666,5],[667,5],[668,5],[669,5],[670,5],[671,5],[676,5],[672,5],[673,5],[674,5],[675,5],[677,5],[678,5],[679,5],[680,5],[681,5],[682,5],[683,5],[684,5],[685,5],[686,5],[687,5],[688,5],[689,5],[690,5],[691,5],[692,5],[693,5],[694,5],[695,5],[696,5],[697,5],[698,5],[376,5],[699,5],[700,5],[701,5],[702,5],[703,5],[704,5],[705,5],[706,5],[707,5],[708,5],[709,5],[710,5],[711,5],[712,5],[713,5],[714,5],[715,5],[716,5],[717,5],[718,5],[719,5],[720,5],[721,5],[722,5],[723,5],[724,5],[725,5],[726,5],[727,5],[728,5],[729,5],[730,5],[731,5],[732,5],[733,5],[734,5],[735,5],[736,5],[737,5],[738,5],[739,5],[740,5],[741,5],[742,5],[743,5],[744,5],[745,5],[746,5],[747,5],[748,5],[749,5],[750,5],[751,5],[752,5],[753,5],[754,5],[755,5],[756,5],[757,5],[758,5],[759,5],[760,5],[761,5],[762,5],[763,5],[764,5],[765,5],[766,5],[767,5],[768,5],[769,5],[770,5],[771,5],[772,5],[773,5],[774,5],[775,5],[776,5],[777,5],[778,5],[779,5],[780,5],[781,5],[782,5],[783,5],[784,5],[785,5],[786,5],[787,5],[788,5],[790,5],[791,5],[789,5],[792,5],[793,5],[794,5],[795,5],[796,5],[797,5],[798,5],[799,5],[800,5],[801,5],[802,5],[803,5],[804,5],[805,5],[806,5],[807,5],[808,5],[809,5],[810,5],[811,5],[812,5],[813,5],[814,5],[815,5],[816,5],[817,5],[821,5],[818,5],[819,5],[820,5],[822,5],[823,5],[824,5],[825,5],[826,5],[827,5],[828,5],[829,5],[830,5],[831,5],[832,5],[833,5],[834,5],[835,5],[836,5],[837,5],[838,5],[839,5],[840,5],[841,5],[842,5],[843,5],[844,5],[845,5],[846,5],[847,5],[848,5],[849,5],[850,5],[851,5],[852,5],[853,5],[854,5],[855,5],[856,5],[857,5],[1231,6],[858,5],[859,5],[860,5],[861,5],[862,5],[863,5],[864,5],[865,5],[866,5],[867,5],[868,5],[869,5],[870,5],[871,5],[872,5],[873,5],[874,5],[875,5],[876,5],[877,5],[878,5],[879,5],[880,5],[881,5],[882,5],[883,5],[884,5],[885,5],[886,5],[887,5],[888,5],[889,5],[890,5],[891,5],[892,5],[893,5],[895,5],[896,5],[894,5],[897,5],[898,5],[899,5],[900,5],[901,5],[902,5],[903,5],[904,5],[905,5],[906,5],[907,5],[908,5],[909,5],[910,5],[911,5],[912,5],[913,5],[914,5],[915,5],[916,5],[917,5],[918,5],[919,5],[920,5],[921,5],[922,5],[923,5],[924,5],[925,5],[926,5],[927,5],[928,5],[929,5],[930,5],[931,5],[932,5],[933,5],[934,5],[935,5],[936,5],[937,5],[938,5],[939,5],[940,5],[941,5],[942,5],[943,5],[944,5],[945,5],[946,5],[947,5],[948,5],[949,5],[950,5],[951,5],[952,5],[953,5],[954,5],[955,5],[956,5],[957,5],[958,5],[959,5],[960,5],[961,5],[962,5],[963,5],[964,5],[965,5],[966,5],[967,5],[968,5],[969,5],[970,5],[971,5],[972,5],[973,5],[974,5],[975,5],[976,5],[977,5],[978,5],[979,5],[980,5],[981,5],[982,5],[983,5],[984,5],[985,5],[986,5],[987,5],[988,5],[989,5],[990,5],[991,5],[992,5],[993,5],[994,5],[995,5],[996,5],[997,5],[998,5],[999,5],[1000,5],[1001,5],[1002,5],[1003,5],[1004,5],[1005,5],[1006,5],[1007,5],[1008,5],[1009,5],[1010,5],[1011,5],[1012,5],[1013,5],[1014,5],[1015,5],[1016,5],[1017,5],[1018,5],[1019,5],[1020,5],[1021,5],[1022,5],[1023,5],[1024,5],[1028,5],[1029,5],[1030,5],[1025,5],[1026,5],[1027,5],[1031,5],[1032,5],[1033,5],[1034,5],[1035,5],[1036,5],[1037,5],[1038,5],[1039,5],[1040,5],[1041,5],[1042,5],[1043,5],[1044,5],[1045,5],[1046,5],[1047,5],[1048,5],[1049,5],[1050,5],[1051,5],[1052,5],[1053,5],[1054,5],[1055,5],[1056,5],[1057,5],[1058,5],[1059,5],[1060,5],[1061,5],[1062,5],[1063,5],[1064,5],[1065,5],[1066,5],[1067,5],[1068,5],[1069,5],[1070,5],[1071,5],[1072,5],[1073,5],[1074,5],[1075,5],[1076,5],[1077,5],[1079,5],[1080,5],[1081,5],[1082,5],[1078,5],[1083,5],[1084,5],[1085,5],[1086,5],[1087,5],[1088,5],[1089,5],[1090,5],[1091,5],[1092,5],[1093,5],[1094,5],[1095,5],[1096,5],[1097,5],[1098,5],[1099,5],[1100,5],[1101,5],[1102,5],[1103,5],[1104,5],[1105,5],[1106,5],[1107,5],[1108,5],[1109,5],[1110,5],[1111,5],[1112,5],[1113,5],[1114,5],[1115,5],[1116,5],[1117,5],[1118,5],[1119,5],[1120,5],[1121,5],[1122,5],[1123,5],[1124,5],[1125,5],[1126,5],[1127,5],[1128,5],[1129,5],[1130,5],[1131,5],[1132,5],[1133,5],[1134,5],[1135,5],[1136,5],[1137,5],[1138,5],[1139,5],[1140,5],[1142,5],[1143,5],[1144,5],[1141,5],[1145,5],[1146,5],[1147,5],[1148,5],[1149,5],[1150,5],[1151,5],[1152,5],[1154,5],[1155,5],[1156,5],[1153,5],[1157,5],[1158,5],[1159,5],[1160,5],[1161,5],[1162,5],[1163,5],[1164,5],[1165,5],[1166,5],[1167,5],[1168,5],[1169,5],[1170,5],[1171,5],[1172,5],[1173,5],[1174,5],[1175,5],[1176,5],[1177,5],[1178,5],[1183,5],[1179,5],[1180,5],[1181,5],[1182,5],[1184,5],[1185,5],[1186,5],[1187,5],[1188,5],[1191,5],[1192,5],[1189,5],[1190,5],[1193,5],[1194,5],[1195,5],[1196,5],[1197,5],[1198,5],[1199,5],[1200,5],[1201,5],[1202,5],[1203,5],[1204,5],[1205,5],[377,5],[1206,5],[1207,5],[1208,5],[1209,5],[1210,5],[1211,5],[1212,5],[1213,5],[1214,5],[1215,5],[1216,5],[1217,5],[1218,5],[1219,5],[1220,5],[1221,5],[1222,5],[1223,5],[1224,5],[1225,5],[1226,5],[1227,5],[1228,5],[1229,5],[1230,5],[1233,7],[55,8],[1363,9],[1364,9],[1365,9],[1366,9],[1367,9],[1368,9],[1369,9],[1370,9],[1371,9],[1372,9],[1373,9],[1374,9],[1375,9],[1376,9],[1377,9],[1378,9],[1379,9],[1380,9],[1381,9],[1382,9],[1383,9],[1384,9],[1385,9],[1386,9],[1387,9],[1388,9],[1389,9],[1390,9],[1391,9],[1392,9],[1393,9],[1394,9],[1395,9],[1396,9],[1397,9],[1398,9],[1399,9],[1400,9],[1401,9],[1402,9],[1403,9],[1404,9],[1405,9],[1406,9],[1407,9],[1408,9],[1409,9],[1410,9],[1411,9],[1412,9],[1413,9],[1414,9],[1415,9],[1416,9],[1417,9],[1418,9],[1419,9],[1420,9],[1421,9],[1422,9],[1423,9],[1424,9],[1425,9],[1426,9],[1427,9],[1428,9],[1429,9],[1430,9],[1431,9],[1432,9],[1433,9],[1434,9],[1435,9],[1436,9],[1437,9],[1438,9],[1439,9],[1440,9],[1441,9],[1442,9],[1443,9],[1444,9],[1445,9],[1446,9],[1447,9],[1448,9],[1449,9],[1450,9],[1451,9],[1452,9],[1453,9],[1454,9],[1455,9],[1456,9],[1457,9],[1458,9],[1459,9],[1667,10],[1460,9],[1461,9],[1462,9],[1463,9],[1464,9],[1465,9],[1466,9],[1467,9],[1468,9],[1469,9],[1470,9],[1471,9],[1472,9],[1473,9],[1474,9],[1475,9],[1476,9],[1477,9],[1478,9],[1479,9],[1480,9],[1481,9],[1482,9],[1483,9],[1484,9],[1485,9],[1486,9],[1487,9],[1488,9],[1489,9],[1490,9],[1491,9],[1492,9],[1493,9],[1494,9],[1495,9],[1496,9],[1497,9],[1498,9],[1499,9],[1500,9],[1501,9],[1502,9],[1503,9],[1504,9],[1505,9],[1506,9],[1507,9],[1508,9],[1509,9],[1510,9],[1511,9],[1512,9],[1513,9],[1514,9],[1515,9],[1516,9],[1517,9],[1518,9],[1519,9],[1520,9],[1521,9],[1522,9],[1523,9],[1524,9],[1525,9],[1526,9],[1527,9],[1528,9],[1529,9],[1530,9],[1531,9],[1532,9],[1533,9],[1534,9],[1535,9],[1536,9],[1537,9],[1538,9],[1539,9],[1540,9],[1541,9],[1542,9],[1543,9],[1544,9],[1545,9],[1546,9],[1547,9],[1548,9],[1549,9],[1550,9],[1551,9],[1552,9],[1553,9],[1554,9],[1555,9],[1556,9],[1557,9],[1558,9],[1559,9],[1560,9],[1561,9],[1562,9],[1563,9],[1564,9],[1565,9],[1566,9],[1567,9],[1568,9],[1569,9],[1570,9],[1571,9],[1572,9],[1573,9],[1574,9],[1575,9],[1576,9],[1577,9],[1578,9],[1579,9],[1580,9],[1581,9],[1582,9],[1583,9],[1584,9],[1585,9],[1586,9],[1587,9],[1588,9],[1589,9],[1590,9],[1591,9],[1592,9],[1593,9],[1594,9],[1595,9],[1596,9],[1597,9],[1598,9],[1599,9],[1600,9],[1601,9],[1602,9],[1603,9],[1604,9],[1605,9],[1606,9],[1607,9],[1608,9],[1609,9],[1610,9],[1611,9],[1612,9],[1613,9],[1614,9],[1615,9],[1616,9],[1617,9],[1618,9],[1619,9],[1620,9],[1621,9],[1622,9],[1623,9],[1624,9],[1625,9],[1626,9],[1627,9],[1628,9],[1629,9],[1630,9],[1631,9],[1632,9],[1633,9],[1634,9],[1635,9],[1636,9],[1637,9],[1638,9],[1639,9],[1640,9],[1641,9],[1642,9],[1643,9],[1644,9],[1645,9],[1646,9],[1647,9],[1648,9],[1649,9],[1650,9],[1651,9],[1652,9],[1653,9],[1654,9],[1655,9],[1656,9],[1657,9],[1658,9],[1659,9],[1660,9],[1661,9],[1662,9],[1663,9],[1664,9],[1665,9],[1666,9],[1351,11],[1352,12],[1350,13],[1353,14],[1354,15],[1355,16],[1356,17],[1357,18],[1358,19],[1359,20],[1360,21],[1361,22],[1362,23],[1717,24],[1718,24],[1757,25],[1758,26],[1759,27],[1760,28],[1761,29],[1762,30],[1763,31],[1764,32],[1765,33],[1766,34],[1767,34],[1769,35],[1768,36],[1770,37],[1771,38],[1772,39],[1756,40],[1773,41],[1774,42],[1775,43],[1809,44],[1776,45],[1777,46],[1778,47],[1779,48],[1780,49],[1781,50],[1782,51],[1783,52],[1784,53],[1785,54],[1786,54],[1787,55],[1790,56],[1792,57],[1791,58],[1793,59],[1794,60],[1795,61],[1796,62],[1797,63],[1798,64],[1799,65],[1800,66],[1801,67],[1802,68],[1803,69],[1804,70],[1805,71],[1806,72],[1807,73],[1707,74],[56,75],[57,76],[49,77],[50,78],[52,79],[349,80],[173,81],[89,82],[101,83],[107,84],[91,85],[93,86],[94,86],[98,87],[95,86],[96,86],[97,88],[100,89],[102,90],[104,91],[88,92],[103,90],[99,88],[105,93],[106,93],[293,94],[183,3],[206,95],[261,3],[61,3],[161,96],[231,97],[252,98],[111,96],[233,99],[232,100],[234,101],[112,96],[434,102],[435,103],[160,96],[245,104],[244,105],[243,106],[253,107],[254,108],[255,109],[113,96],[257,110],[258,111],[256,112],[272,110],[270,113],[271,1],[273,114],[212,115],[213,116],[214,117],[114,96],[277,118],[276,119],[278,120],[275,121],[118,122],[281,110],[280,1],[282,123],[279,124],[119,96],[287,110],[120,96],[291,125],[121,96],[179,126],[180,127],[178,128],[122,129],[295,130],[285,131],[284,132],[283,110],[286,133],[123,96],[296,110],[438,134],[186,135],[187,136],[77,137],[297,138],[215,139],[211,140],[207,141],[298,142],[274,143],[196,144],[117,145],[299,107],[300,97],[124,96],[304,128],[126,96],[301,146],[302,147],[303,148],[269,149],[125,96],[305,97],[127,96],[437,150],[436,151],[162,96],[308,152],[307,152],[309,153],[306,154],[115,96],[83,155],[79,156],[310,157],[311,158],[62,159],[82,160],[78,97],[294,161],[292,162],[326,163],[324,164],[128,129],[441,165],[328,166],[129,96],[312,167],[319,168],[316,169],[318,170],[315,171],[116,172],[317,173],[331,174],[329,1],[330,175],[130,96],[335,176],[332,177],[333,178],[131,96],[227,179],[226,180],[228,181],[345,182],[132,96],[268,183],[267,1],[263,184],[262,185],[260,186],[266,187],[264,188],[259,189],[265,190],[133,96],[340,191],[338,97],[134,96],[339,192],[347,193],[350,194],[346,195],[135,196],[348,197],[357,198],[355,97],[136,96],[356,199],[358,200],[182,201],[181,97],[359,202],[137,96],[360,203],[138,96],[218,204],[217,97],[139,96],[432,205],[431,3],[159,96],[363,206],[365,207],[362,208],[361,209],[364,210],[140,96],[366,211],[141,96],[378,212],[367,213],[368,213],[142,96],[369,213],[379,214],[430,215],[429,216],[428,97],[143,96],[242,217],[144,96],[384,97],[380,97],[381,3],[383,218],[387,219],[382,218],[386,220],[145,96],[385,1],[388,221],[146,96],[389,222],[390,223],[147,96],[391,224],[334,110],[148,96],[352,225],[354,226],[353,227],[351,3],[393,228],[149,96],[394,128],[397,229],[399,230],[184,229],[402,231],[185,232],[150,96],[396,233],[415,234],[414,235],[412,236],[411,178],[413,237],[151,96],[194,97],[195,238],[152,96],[440,239],[171,240],[163,241],[172,242],[170,243],[165,244],[110,245],[439,81],[108,172],[209,246],[210,247],[208,248],[418,249],[153,96],[416,110],[417,178],[174,250],[176,251],[154,96],[175,252],[433,253],[225,254],[158,96],[190,255],[76,256],[74,175],[188,257],[189,1],[155,96],[410,258],[404,259],[405,260],[403,261],[420,262],[425,263],[421,264],[422,264],[156,96],[423,264],[424,264],[419,167],[426,265],[219,266],[157,96],[289,267],[290,268],[288,268],[320,269],[325,270],[323,271],[321,272],[322,273],[314,274],[343,275],[342,276],[341,97],[344,277],[336,278],[337,279],[192,280],[197,281],[198,281],[193,282],[201,283],[199,284],[202,285],[236,286],[240,287],[241,288],[239,106],[238,106],[237,289],[400,290],[401,3],[84,3],[398,290],[395,290],[224,291],[223,292],[221,293],[220,294],[222,295],[409,296],[408,297],[407,298],[251,299],[248,300],[250,301],[249,302],[246,303],[247,304],[85,110],[216,3],[235,110],[230,305],[427,1],[1335,306],[1251,307],[1263,308],[1269,309],[1253,310],[1255,311],[1256,311],[1260,312],[1257,311],[1258,311],[1259,313],[1262,314],[1264,315],[1266,316],[1250,317],[1265,315],[1261,313],[1267,318],[1268,318],[1345,3],[1246,3],[1323,319],[1273,319],[1274,319],[1322,319],[1275,319],[1276,319],[1280,320],[1281,319],[1282,319],[1283,319],[1341,321],[1342,322],[1340,323],[1284,324],[1285,319],[1279,325],[1286,319],[1288,319],[1287,319],[1289,319],[1324,319],[1277,319],[1290,324],[1291,319],[1278,326],[1292,319],[1293,319],[1294,319],[1295,319],[1296,319],[1297,327],[1298,319],[1344,328],[1343,329],[1299,319],[1300,319],[1301,319],[1321,319],[1302,319],[1303,319],[1304,319],[1305,319],[1306,319],[1307,319],[1308,319],[1309,319],[1310,319],[1311,319],[1346,330],[1347,331],[1312,319],[1313,319],[1314,319],[1333,332],[1325,333],[1334,334],[1332,335],[1327,336],[1272,337],[1270,326],[1315,319],[1336,338],[1338,339],[1316,319],[1337,340],[1320,319],[1317,319],[1318,319],[1319,319],[1245,3],[1247,341],[205,342],[204,343],[1684,344],[1683,345],[1682,346],[1680,347],[1681,348],[1694,349],[1235,350],[81,351],[1734,352],[1744,353],[1733,352],[1754,354],[1725,355],[1724,356],[1753,357],[1747,358],[1752,359],[1727,360],[1741,361],[1726,362],[1750,363],[1722,364],[1721,365],[1751,366],[1723,367],[1728,368],[1732,368],[1755,369],[1745,370],[1736,371],[1737,372],[1739,373],[1735,374],[1738,375],[1748,357],[1730,376],[1731,377],[1740,378],[1720,379],[1743,370],[1742,368],[1749,380],[1702,381],[1698,382],[1699,383],[1701,384],[1234,3],[443,3],[73,385],[63,3],[64,386],[69,386],[66,386],[70,386],[65,386],[71,386],[67,386],[68,386],[72,386],[1708,387],[58,388],[53,389],[442,390],[1670,391],[1243,392],[445,393],[1238,394],[1239,395],[1711,396],[1712,397],[1686,398],[1668,399],[1710,400],[1713,401],[1671,402],[1678,213],[1349,403],[1696,404],[1693,405],[1692,406],[1695,407],[1237,408],[1242,409],[444,213],[1348,410],[1704,411],[1244,213],[1236,213],[1677,213],[1672,412],[1675,213],[1705,413],[1709,414],[1685,415],[1240,416],[1689,416],[1687,417],[1690,416],[1676,418],[1714,416],[1688,419],[1674,420],[1673,421],[1691,416],[1703,422]],"semanticDiagnosticsPerFile":[[1239,[{"start":2841,"length":58,"messageText":"'IconFont' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":3026,"length":16,"messageText":"'AppstoreOutlined' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":3156,"length":8,"messageText":"'computed' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true}]],[1242,[{"start":850,"length":4,"messageText":"Cannot find name 'Grid'.","category":1,"code":2304},{"start":974,"length":12,"messageText":"Cannot find name 'SelectNodeVo'.","category":1,"code":2304},{"start":998,"length":10,"messageText":"Cannot find name 'TreeNodeVo'.","category":1,"code":2304},{"start":1028,"length":12,"messageText":"Cannot find name 'SelectNodeVo'.","category":1,"code":2304},{"start":1052,"length":10,"messageText":"Cannot find name 'TreeNodeVo'.","category":1,"code":2304},{"start":2461,"length":4,"messageText":"Cannot find name 'Grid'.","category":1,"code":2304}]],[1243,[{"start":6134,"length":4,"messageText":"Cannot find name 'Grid'.","category":1,"code":2304}]],[1348,[{"start":1921,"length":10,"messageText":"Cannot find name 'JsonResult'.","category":1,"code":2304}]],[1670,[{"start":1409,"length":10,"messageText":"Cannot find name 'JsonResult'.","category":1,"code":2304},{"start":2254,"length":10,"messageText":"Cannot find name 'JsonResult'.","category":1,"code":2304},{"start":2444,"length":10,"messageText":"Cannot find name 'JsonResult'.","category":1,"code":2304},{"start":2629,"length":10,"messageText":"Cannot find name 'JsonResult'.","category":1,"code":2304},{"start":2805,"length":10,"messageText":"Cannot find name 'JsonResult'.","category":1,"code":2304}]],[1671,[{"start":199,"length":12,"messageText":"Cannot find name 'SelectNodeVo'.","category":1,"code":2304},{"start":393,"length":12,"messageText":"Cannot find name 'SelectNodeVo'.","category":1,"code":2304}]],[1672,[{"start":429,"length":8,"messageText":"Cannot find name 'BaseEnum'.","category":1,"code":2304},{"start":543,"length":8,"messageText":"Cannot find name 'BaseEnum'.","category":1,"code":2304},{"start":676,"length":8,"messageText":"Cannot find name 'BaseEnum'.","category":1,"code":2304},{"start":839,"length":8,"messageText":"Cannot find name 'BaseEnum'.","category":1,"code":2304}]],[1673,[{"start":1239,"length":8,"messageText":"'reactive' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":1249,"length":9,"messageText":"'onMounted' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":1559,"length":16,"messageText":"Cannot find name 'ComponentExposed'.","category":1,"code":2304},{"start":2497,"length":4,"messageText":"'rule' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true}]],[1674,[{"start":600,"length":8,"messageText":"'FromItem' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":719,"length":5,"messageText":"'Modal' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":758,"length":7,"messageText":"'formRef' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":1409,"length":7,"code":2339,"category":1,"messageText":"Property 'extData' does not exist on type 'number'."},{"start":1494,"length":5,"code":2339,"category":1,"messageText":"Property 'label' does not exist on type 'number'."},{"start":1564,"length":5,"code":2339,"category":1,"messageText":"Property 'label' does not exist on type 'number'."},{"start":1961,"length":5,"code":2551,"category":1,"messageText":"Property 'value' does not exist on type 'number'. Did you mean 'valueOf'?","relatedInformation":[{"file":"./node_modules/typescript/lib/lib.es5.d.ts","start":23495,"length":18,"messageText":"'valueOf' is declared here.","category":3,"code":2728}]}]],[1676,[{"start":1290,"length":38,"messageText":"'message' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":1338,"length":7,"messageText":"'formRef' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":3132,"length":17,"messageText":"'addUserManagement' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":3693,"length":10,"code":2339,"category":1,"messageText":{"messageText":"Property 'treeSelect' does not exist on type 'Reactive | Ref, FormProMaxItemOptions<{}>>>'.","category":1,"code":2339,"next":[{"messageText":"Property 'treeSelect' does not exist on type 'Ref, FormProMaxItemOptions<{}>>'.","category":1,"code":2339}]}},{"start":4228,"length":10,"messageText":"'formParams' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true},{"start":4562,"length":15,"messageText":"'formItemOptions' is declared but its value is never read.","category":1,"code":6133,"reportsUnnecessary":true}]],[1678,[{"start":170,"length":10,"messageText":"Cannot find name 'SystemMenu'.","category":1,"code":2304}]],[1686,[{"start":2621,"length":2,"code":2345,"category":1,"messageText":"Argument of type 'undefined[]' is not assignable to parameter of type 'string'."},{"start":2666,"length":2,"code":2345,"category":1,"messageText":"Argument of type 'undefined[]' is not assignable to parameter of type 'string'."}]],[1688,[{"start":8486,"length":10,"messageText":"Cannot find name 'dataStatus'.","category":1,"code":2304},{"start":8593,"length":10,"messageText":"Cannot find name 'dataStatus'.","category":1,"code":2304},{"start":8772,"length":10,"messageText":"Cannot find name 'dataStatus'.","category":1,"code":2304}]],[1692,[{"start":299,"length":4,"code":2353,"category":1,"messageText":"Object literal may only specify known properties, and 'icon' does not exist in type 'RouteRecordRaw'."}]],[1711,[{"start":592,"length":4,"code":2339,"category":1,"messageText":"Property 'size' does not exist on type 'SystemMenu'."}]]],"affectedFilesPendingEmit":[442,1670,1243,445,1238,1239,1711,1712,1686,1668,1710,1713,1671,1678,1349,1696,1693,1692,1695,1237,1242,444,1348,1704,1244,1236,1677,1672,1675,1705,1709,1685,1240,1689,1687,1690,1676,1714,1688,1674,1673,1691],"emitSignatures":[442,444,445,1236,1237,1238,1239,1240,1242,1243,1244,1348,1349,1668,1670,1671,1672,1673,1674,1675,1676,1677,1678,1685,1686,1687,1688,1689,1690,1691,1692,1693,1695,1696,1704,1705,1709,1710,1711,1712,1713,1714]},"version":"5.5.4"} \ No newline at end of file diff --git a/policeManagement/tsconfig.json b/policeManagement/tsconfig.json new file mode 100644 index 0000000..80e1767 --- /dev/null +++ b/policeManagement/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "baseUrl": "/", // 确保相对路径从根目录开始 + "paths": { // 设置路径映射 + "@/*": [ // 将 @/ 映射到 src/ 目录 + "./src/*" + ] + } + }, + "files": [], // 可以留空,表示不显式指定任何文件 + "references": [ // 引用其他 tsconfig 文件 + { + "path": "./tsconfig.app.json" // 引用 tsconfig.app.json + }, + { + "path": "./tsconfig.node.json" // 引用 tsconfig.node.json + } + ], + "include": [ // 指定包含的文件 + "env.d.ts", // 包括环境类型的声明文件 + "src/vite-env.d.ts", // 包括 Vite 环境类型的声明文件 + "src/**/*.ts", // 包括 src 目录下的所有 TypeScript 文件 + "src/**/*.tsx", // 包括 src 目录下的所有 JSX 文件 + "src/**/*.vue", // 包括 src 目录下的所有 Vue 文件 + "global.d.ts", // 确保 global.d.ts 文件被包含 + "vite.config.ts" // Node 配置文件 + ] +} +// // 脚手架自带 配置: +// { +// "files": [], +// "references": [ +// { +// "path": "./tsconfig.app.json" +// }, +// { +// "path": "./tsconfig.node.json" +// } +// ] +// } \ No newline at end of file diff --git a/policeManagement/tsconfig.node.json b/policeManagement/tsconfig.node.json new file mode 100644 index 0000000..2ce7ab2 --- /dev/null +++ b/policeManagement/tsconfig.node.json @@ -0,0 +1,47 @@ +{ + "compilerOptions": { + "composite": true, // 标记为复合项目的一部分 [ty-reference](1) + "target": "ES2022", // 设置目标 JavaScript 语言标准版本 + "lib": [ // 指定要包含的类型库 + "ES2023" // 包含 ES2023 的类型定义 + ], + "module": "ESNext", // 设置模块系统 + "skipLibCheck": true, // 忽略类型库的类型检查 + /* Bundler mode */ + "moduleResolution": "bundler", // 设置模块解析策略为 bundler 模式 + "allowImportingTsExtensions": true, // 允许导入 TypeScript 扩展名 + "isolatedModules": true, // 将每个文件视为一个模块 + "moduleDetection": "force", // 强制将所有模块视为 ESM + "noEmit": false, // 允许发出文件 + "declaration": true, // 如果需要生成 .d.ts 文件 + "emitDeclarationOnly": true, // 只发出声明文件,而不生成 JS 文件 + "strict": true, // 开启所有严格类型检查选项 + "noUnusedLocals": true, // 报告未使用的局部变量 + "noUnusedParameters": true, // 报告未使用的参数 + "noFallthroughCasesInSwitch": true // 报告 switch 语句中的 fallthrough 错误 + }, + "include": [ // 指定包含的文件 + "vite.config.ts" // 包括 Vite 配置文件 + ] +} +// 脚手架自带 配置: +// { +// "compilerOptions": { +// "target": "ES2022", +// "lib": ["ES2023"], +// "module": "ESNext", +// "skipLibCheck": true, +// /* Bundler mode */ +// "moduleResolution": "bundler", +// "allowImportingTsExtensions": true, +// "isolatedModules": true, +// "moduleDetection": "force", +// "noEmit": true, +// /* Linting */ +// "strict": true, +// "noUnusedLocals": true, +// "noUnusedParameters": true, +// "noFallthroughCasesInSwitch": true +// }, +// "include": ["vite.config.ts"] +// } \ No newline at end of file diff --git a/policeManagement/tsconfig.node.tsbuildinfo b/policeManagement/tsconfig.node.tsbuildinfo new file mode 100644 index 0000000..9f80a70 --- /dev/null +++ b/policeManagement/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/dom-events.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/globals.global.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/rollup/dist/rollup.d.ts","./node_modules/rollup/dist/parseast.d.ts","./node_modules/vite/types/hmrpayload.d.ts","./node_modules/vite/types/customevent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/types.d-agj9qkwt.d.ts","./node_modules/esbuild/lib/main.d.ts","./node_modules/source-map-js/source-map.d.ts","./node_modules/postcss/lib/previous-map.d.ts","./node_modules/postcss/lib/input.d.ts","./node_modules/postcss/lib/css-syntax-error.d.ts","./node_modules/postcss/lib/declaration.d.ts","./node_modules/postcss/lib/root.d.ts","./node_modules/postcss/lib/warning.d.ts","./node_modules/postcss/lib/lazy-result.d.ts","./node_modules/postcss/lib/no-work-result.d.ts","./node_modules/postcss/lib/processor.d.ts","./node_modules/postcss/lib/result.d.ts","./node_modules/postcss/lib/document.d.ts","./node_modules/postcss/lib/rule.d.ts","./node_modules/postcss/lib/node.d.ts","./node_modules/postcss/lib/comment.d.ts","./node_modules/postcss/lib/container.d.ts","./node_modules/postcss/lib/at-rule.d.ts","./node_modules/postcss/lib/list.d.ts","./node_modules/postcss/lib/postcss.d.ts","./node_modules/postcss/lib/postcss.d.mts","./node_modules/vite/dist/node/runtime.d.ts","./node_modules/vite/types/importglob.d.ts","./node_modules/vite/types/metadata.d.ts","./node_modules/vite/dist/node/index.d.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@vue/shared/dist/shared.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@vue/compiler-core/dist/compiler-core.d.ts","./node_modules/magic-string/dist/magic-string.es.d.mts","./node_modules/typescript/lib/typescript.d.ts","./node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts","./node_modules/vue/compiler-sfc/index.d.mts","./node_modules/@vitejs/plugin-vue/dist/index.d.mts","./node_modules/@rollup/pluginutils/types/index.d.ts","./node_modules/webpack-virtual-modules/lib/index.d.ts","./node_modules/unplugin/dist/index.d.mts","./node_modules/@antfu/utils/dist/index.d.mts","./node_modules/unplugin-vue-components/dist/types.d.ts","./node_modules/unplugin-vue-components/dist/vite.d.ts","./node_modules/unplugin-vue-components/dist/resolvers.d.ts","./node_modules/@vue/babel-plugin-resolve-type/dist/index.d.mts","./node_modules/@vue/babel-plugin-jsx/dist/index.d.ts","./node_modules/@vitejs/plugin-vue-jsx/dist/index.d.mts","./vite.config.ts","./node_modules/@types/lodash/common/common.d.ts","./node_modules/@types/lodash/common/array.d.ts","./node_modules/@types/lodash/common/collection.d.ts","./node_modules/@types/lodash/common/date.d.ts","./node_modules/@types/lodash/common/function.d.ts","./node_modules/@types/lodash/common/lang.d.ts","./node_modules/@types/lodash/common/math.d.ts","./node_modules/@types/lodash/common/number.d.ts","./node_modules/@types/lodash/common/object.d.ts","./node_modules/@types/lodash/common/seq.d.ts","./node_modules/@types/lodash/common/string.d.ts","./node_modules/@types/lodash/common/util.d.ts","./node_modules/@types/lodash/index.d.ts","./node_modules/@types/lodash-es/add.d.ts","./node_modules/@types/lodash-es/after.d.ts","./node_modules/@types/lodash-es/ary.d.ts","./node_modules/@types/lodash-es/assign.d.ts","./node_modules/@types/lodash-es/assignin.d.ts","./node_modules/@types/lodash-es/assigninwith.d.ts","./node_modules/@types/lodash-es/assignwith.d.ts","./node_modules/@types/lodash-es/at.d.ts","./node_modules/@types/lodash-es/attempt.d.ts","./node_modules/@types/lodash-es/before.d.ts","./node_modules/@types/lodash-es/bind.d.ts","./node_modules/@types/lodash-es/bindall.d.ts","./node_modules/@types/lodash-es/bindkey.d.ts","./node_modules/@types/lodash-es/camelcase.d.ts","./node_modules/@types/lodash-es/capitalize.d.ts","./node_modules/@types/lodash-es/castarray.d.ts","./node_modules/@types/lodash-es/ceil.d.ts","./node_modules/@types/lodash-es/chain.d.ts","./node_modules/@types/lodash-es/chunk.d.ts","./node_modules/@types/lodash-es/clamp.d.ts","./node_modules/@types/lodash-es/clone.d.ts","./node_modules/@types/lodash-es/clonedeep.d.ts","./node_modules/@types/lodash-es/clonedeepwith.d.ts","./node_modules/@types/lodash-es/clonewith.d.ts","./node_modules/@types/lodash-es/compact.d.ts","./node_modules/@types/lodash-es/concat.d.ts","./node_modules/@types/lodash-es/cond.d.ts","./node_modules/@types/lodash-es/conforms.d.ts","./node_modules/@types/lodash-es/conformsto.d.ts","./node_modules/@types/lodash-es/constant.d.ts","./node_modules/@types/lodash-es/countby.d.ts","./node_modules/@types/lodash-es/create.d.ts","./node_modules/@types/lodash-es/curry.d.ts","./node_modules/@types/lodash-es/curryright.d.ts","./node_modules/@types/lodash-es/debounce.d.ts","./node_modules/@types/lodash-es/deburr.d.ts","./node_modules/@types/lodash-es/defaults.d.ts","./node_modules/@types/lodash-es/defaultsdeep.d.ts","./node_modules/@types/lodash-es/defaultto.d.ts","./node_modules/@types/lodash-es/defer.d.ts","./node_modules/@types/lodash-es/delay.d.ts","./node_modules/@types/lodash-es/difference.d.ts","./node_modules/@types/lodash-es/differenceby.d.ts","./node_modules/@types/lodash-es/differencewith.d.ts","./node_modules/@types/lodash-es/divide.d.ts","./node_modules/@types/lodash-es/drop.d.ts","./node_modules/@types/lodash-es/dropright.d.ts","./node_modules/@types/lodash-es/droprightwhile.d.ts","./node_modules/@types/lodash-es/dropwhile.d.ts","./node_modules/@types/lodash-es/each.d.ts","./node_modules/@types/lodash-es/eachright.d.ts","./node_modules/@types/lodash-es/endswith.d.ts","./node_modules/@types/lodash-es/entries.d.ts","./node_modules/@types/lodash-es/entriesin.d.ts","./node_modules/@types/lodash-es/eq.d.ts","./node_modules/@types/lodash-es/escape.d.ts","./node_modules/@types/lodash-es/escaperegexp.d.ts","./node_modules/@types/lodash-es/every.d.ts","./node_modules/@types/lodash-es/extend.d.ts","./node_modules/@types/lodash-es/extendwith.d.ts","./node_modules/@types/lodash-es/fill.d.ts","./node_modules/@types/lodash-es/filter.d.ts","./node_modules/@types/lodash-es/find.d.ts","./node_modules/@types/lodash-es/findindex.d.ts","./node_modules/@types/lodash-es/findkey.d.ts","./node_modules/@types/lodash-es/findlast.d.ts","./node_modules/@types/lodash-es/findlastindex.d.ts","./node_modules/@types/lodash-es/findlastkey.d.ts","./node_modules/@types/lodash-es/first.d.ts","./node_modules/@types/lodash-es/flatmap.d.ts","./node_modules/@types/lodash-es/flatmapdeep.d.ts","./node_modules/@types/lodash-es/flatmapdepth.d.ts","./node_modules/@types/lodash-es/flatten.d.ts","./node_modules/@types/lodash-es/flattendeep.d.ts","./node_modules/@types/lodash-es/flattendepth.d.ts","./node_modules/@types/lodash-es/flip.d.ts","./node_modules/@types/lodash-es/floor.d.ts","./node_modules/@types/lodash-es/flow.d.ts","./node_modules/@types/lodash-es/flowright.d.ts","./node_modules/@types/lodash-es/foreach.d.ts","./node_modules/@types/lodash-es/foreachright.d.ts","./node_modules/@types/lodash-es/forin.d.ts","./node_modules/@types/lodash-es/forinright.d.ts","./node_modules/@types/lodash-es/forown.d.ts","./node_modules/@types/lodash-es/forownright.d.ts","./node_modules/@types/lodash-es/frompairs.d.ts","./node_modules/@types/lodash-es/functions.d.ts","./node_modules/@types/lodash-es/functionsin.d.ts","./node_modules/@types/lodash-es/get.d.ts","./node_modules/@types/lodash-es/groupby.d.ts","./node_modules/@types/lodash-es/gt.d.ts","./node_modules/@types/lodash-es/gte.d.ts","./node_modules/@types/lodash-es/has.d.ts","./node_modules/@types/lodash-es/hasin.d.ts","./node_modules/@types/lodash-es/head.d.ts","./node_modules/@types/lodash-es/identity.d.ts","./node_modules/@types/lodash-es/includes.d.ts","./node_modules/@types/lodash-es/indexof.d.ts","./node_modules/@types/lodash-es/initial.d.ts","./node_modules/@types/lodash-es/inrange.d.ts","./node_modules/@types/lodash-es/intersection.d.ts","./node_modules/@types/lodash-es/intersectionby.d.ts","./node_modules/@types/lodash-es/intersectionwith.d.ts","./node_modules/@types/lodash-es/invert.d.ts","./node_modules/@types/lodash-es/invertby.d.ts","./node_modules/@types/lodash-es/invoke.d.ts","./node_modules/@types/lodash-es/invokemap.d.ts","./node_modules/@types/lodash-es/isarguments.d.ts","./node_modules/@types/lodash-es/isarray.d.ts","./node_modules/@types/lodash-es/isarraybuffer.d.ts","./node_modules/@types/lodash-es/isarraylike.d.ts","./node_modules/@types/lodash-es/isarraylikeobject.d.ts","./node_modules/@types/lodash-es/isboolean.d.ts","./node_modules/@types/lodash-es/isbuffer.d.ts","./node_modules/@types/lodash-es/isdate.d.ts","./node_modules/@types/lodash-es/iselement.d.ts","./node_modules/@types/lodash-es/isempty.d.ts","./node_modules/@types/lodash-es/isequal.d.ts","./node_modules/@types/lodash-es/isequalwith.d.ts","./node_modules/@types/lodash-es/iserror.d.ts","./node_modules/@types/lodash-es/isfinite.d.ts","./node_modules/@types/lodash-es/isfunction.d.ts","./node_modules/@types/lodash-es/isinteger.d.ts","./node_modules/@types/lodash-es/islength.d.ts","./node_modules/@types/lodash-es/ismap.d.ts","./node_modules/@types/lodash-es/ismatch.d.ts","./node_modules/@types/lodash-es/ismatchwith.d.ts","./node_modules/@types/lodash-es/isnan.d.ts","./node_modules/@types/lodash-es/isnative.d.ts","./node_modules/@types/lodash-es/isnil.d.ts","./node_modules/@types/lodash-es/isnull.d.ts","./node_modules/@types/lodash-es/isnumber.d.ts","./node_modules/@types/lodash-es/isobject.d.ts","./node_modules/@types/lodash-es/isobjectlike.d.ts","./node_modules/@types/lodash-es/isplainobject.d.ts","./node_modules/@types/lodash-es/isregexp.d.ts","./node_modules/@types/lodash-es/issafeinteger.d.ts","./node_modules/@types/lodash-es/isset.d.ts","./node_modules/@types/lodash-es/isstring.d.ts","./node_modules/@types/lodash-es/issymbol.d.ts","./node_modules/@types/lodash-es/istypedarray.d.ts","./node_modules/@types/lodash-es/isundefined.d.ts","./node_modules/@types/lodash-es/isweakmap.d.ts","./node_modules/@types/lodash-es/isweakset.d.ts","./node_modules/@types/lodash-es/iteratee.d.ts","./node_modules/@types/lodash-es/join.d.ts","./node_modules/@types/lodash-es/kebabcase.d.ts","./node_modules/@types/lodash-es/keyby.d.ts","./node_modules/@types/lodash-es/keys.d.ts","./node_modules/@types/lodash-es/keysin.d.ts","./node_modules/@types/lodash-es/last.d.ts","./node_modules/@types/lodash-es/lastindexof.d.ts","./node_modules/@types/lodash-es/lowercase.d.ts","./node_modules/@types/lodash-es/lowerfirst.d.ts","./node_modules/@types/lodash-es/lt.d.ts","./node_modules/@types/lodash-es/lte.d.ts","./node_modules/@types/lodash-es/map.d.ts","./node_modules/@types/lodash-es/mapkeys.d.ts","./node_modules/@types/lodash-es/mapvalues.d.ts","./node_modules/@types/lodash-es/matches.d.ts","./node_modules/@types/lodash-es/matchesproperty.d.ts","./node_modules/@types/lodash-es/max.d.ts","./node_modules/@types/lodash-es/maxby.d.ts","./node_modules/@types/lodash-es/mean.d.ts","./node_modules/@types/lodash-es/meanby.d.ts","./node_modules/@types/lodash-es/memoize.d.ts","./node_modules/@types/lodash-es/merge.d.ts","./node_modules/@types/lodash-es/mergewith.d.ts","./node_modules/@types/lodash-es/method.d.ts","./node_modules/@types/lodash-es/methodof.d.ts","./node_modules/@types/lodash-es/min.d.ts","./node_modules/@types/lodash-es/minby.d.ts","./node_modules/@types/lodash-es/mixin.d.ts","./node_modules/@types/lodash-es/multiply.d.ts","./node_modules/@types/lodash-es/negate.d.ts","./node_modules/@types/lodash-es/noop.d.ts","./node_modules/@types/lodash-es/now.d.ts","./node_modules/@types/lodash-es/nth.d.ts","./node_modules/@types/lodash-es/ntharg.d.ts","./node_modules/@types/lodash-es/omit.d.ts","./node_modules/@types/lodash-es/omitby.d.ts","./node_modules/@types/lodash-es/once.d.ts","./node_modules/@types/lodash-es/orderby.d.ts","./node_modules/@types/lodash-es/over.d.ts","./node_modules/@types/lodash-es/overargs.d.ts","./node_modules/@types/lodash-es/overevery.d.ts","./node_modules/@types/lodash-es/oversome.d.ts","./node_modules/@types/lodash-es/pad.d.ts","./node_modules/@types/lodash-es/padend.d.ts","./node_modules/@types/lodash-es/padstart.d.ts","./node_modules/@types/lodash-es/parseint.d.ts","./node_modules/@types/lodash-es/partial.d.ts","./node_modules/@types/lodash-es/partialright.d.ts","./node_modules/@types/lodash-es/partition.d.ts","./node_modules/@types/lodash-es/pick.d.ts","./node_modules/@types/lodash-es/pickby.d.ts","./node_modules/@types/lodash-es/property.d.ts","./node_modules/@types/lodash-es/propertyof.d.ts","./node_modules/@types/lodash-es/pull.d.ts","./node_modules/@types/lodash-es/pullall.d.ts","./node_modules/@types/lodash-es/pullallby.d.ts","./node_modules/@types/lodash-es/pullallwith.d.ts","./node_modules/@types/lodash-es/pullat.d.ts","./node_modules/@types/lodash-es/random.d.ts","./node_modules/@types/lodash-es/range.d.ts","./node_modules/@types/lodash-es/rangeright.d.ts","./node_modules/@types/lodash-es/rearg.d.ts","./node_modules/@types/lodash-es/reduce.d.ts","./node_modules/@types/lodash-es/reduceright.d.ts","./node_modules/@types/lodash-es/reject.d.ts","./node_modules/@types/lodash-es/remove.d.ts","./node_modules/@types/lodash-es/repeat.d.ts","./node_modules/@types/lodash-es/replace.d.ts","./node_modules/@types/lodash-es/rest.d.ts","./node_modules/@types/lodash-es/result.d.ts","./node_modules/@types/lodash-es/reverse.d.ts","./node_modules/@types/lodash-es/round.d.ts","./node_modules/@types/lodash-es/sample.d.ts","./node_modules/@types/lodash-es/samplesize.d.ts","./node_modules/@types/lodash-es/set.d.ts","./node_modules/@types/lodash-es/setwith.d.ts","./node_modules/@types/lodash-es/shuffle.d.ts","./node_modules/@types/lodash-es/size.d.ts","./node_modules/@types/lodash-es/slice.d.ts","./node_modules/@types/lodash-es/snakecase.d.ts","./node_modules/@types/lodash-es/some.d.ts","./node_modules/@types/lodash-es/sortby.d.ts","./node_modules/@types/lodash-es/sortedindex.d.ts","./node_modules/@types/lodash-es/sortedindexby.d.ts","./node_modules/@types/lodash-es/sortedindexof.d.ts","./node_modules/@types/lodash-es/sortedlastindex.d.ts","./node_modules/@types/lodash-es/sortedlastindexby.d.ts","./node_modules/@types/lodash-es/sortedlastindexof.d.ts","./node_modules/@types/lodash-es/sorteduniq.d.ts","./node_modules/@types/lodash-es/sorteduniqby.d.ts","./node_modules/@types/lodash-es/split.d.ts","./node_modules/@types/lodash-es/spread.d.ts","./node_modules/@types/lodash-es/startcase.d.ts","./node_modules/@types/lodash-es/startswith.d.ts","./node_modules/@types/lodash-es/stubarray.d.ts","./node_modules/@types/lodash-es/stubfalse.d.ts","./node_modules/@types/lodash-es/stubobject.d.ts","./node_modules/@types/lodash-es/stubstring.d.ts","./node_modules/@types/lodash-es/stubtrue.d.ts","./node_modules/@types/lodash-es/subtract.d.ts","./node_modules/@types/lodash-es/sum.d.ts","./node_modules/@types/lodash-es/sumby.d.ts","./node_modules/@types/lodash-es/tail.d.ts","./node_modules/@types/lodash-es/take.d.ts","./node_modules/@types/lodash-es/takeright.d.ts","./node_modules/@types/lodash-es/takerightwhile.d.ts","./node_modules/@types/lodash-es/takewhile.d.ts","./node_modules/@types/lodash-es/tap.d.ts","./node_modules/@types/lodash-es/template.d.ts","./node_modules/@types/lodash-es/templatesettings.d.ts","./node_modules/@types/lodash-es/throttle.d.ts","./node_modules/@types/lodash-es/thru.d.ts","./node_modules/@types/lodash-es/times.d.ts","./node_modules/@types/lodash-es/toarray.d.ts","./node_modules/@types/lodash-es/tofinite.d.ts","./node_modules/@types/lodash-es/tointeger.d.ts","./node_modules/@types/lodash-es/tolength.d.ts","./node_modules/@types/lodash-es/tolower.d.ts","./node_modules/@types/lodash-es/tonumber.d.ts","./node_modules/@types/lodash-es/topairs.d.ts","./node_modules/@types/lodash-es/topairsin.d.ts","./node_modules/@types/lodash-es/topath.d.ts","./node_modules/@types/lodash-es/toplainobject.d.ts","./node_modules/@types/lodash-es/tosafeinteger.d.ts","./node_modules/@types/lodash-es/tostring.d.ts","./node_modules/@types/lodash-es/toupper.d.ts","./node_modules/@types/lodash-es/transform.d.ts","./node_modules/@types/lodash-es/trim.d.ts","./node_modules/@types/lodash-es/trimend.d.ts","./node_modules/@types/lodash-es/trimstart.d.ts","./node_modules/@types/lodash-es/truncate.d.ts","./node_modules/@types/lodash-es/unary.d.ts","./node_modules/@types/lodash-es/unescape.d.ts","./node_modules/@types/lodash-es/union.d.ts","./node_modules/@types/lodash-es/unionby.d.ts","./node_modules/@types/lodash-es/unionwith.d.ts","./node_modules/@types/lodash-es/uniq.d.ts","./node_modules/@types/lodash-es/uniqby.d.ts","./node_modules/@types/lodash-es/uniqueid.d.ts","./node_modules/@types/lodash-es/uniqwith.d.ts","./node_modules/@types/lodash-es/unset.d.ts","./node_modules/@types/lodash-es/unzip.d.ts","./node_modules/@types/lodash-es/unzipwith.d.ts","./node_modules/@types/lodash-es/update.d.ts","./node_modules/@types/lodash-es/updatewith.d.ts","./node_modules/@types/lodash-es/uppercase.d.ts","./node_modules/@types/lodash-es/upperfirst.d.ts","./node_modules/@types/lodash-es/values.d.ts","./node_modules/@types/lodash-es/valuesin.d.ts","./node_modules/@types/lodash-es/without.d.ts","./node_modules/@types/lodash-es/words.d.ts","./node_modules/@types/lodash-es/wrap.d.ts","./node_modules/@types/lodash-es/xor.d.ts","./node_modules/@types/lodash-es/xorby.d.ts","./node_modules/@types/lodash-es/xorwith.d.ts","./node_modules/@types/lodash-es/zip.d.ts","./node_modules/@types/lodash-es/zipobject.d.ts","./node_modules/@types/lodash-es/zipobjectdeep.d.ts","./node_modules/@types/lodash-es/zipwith.d.ts","./node_modules/@types/lodash-es/index.d.ts","./node_modules/@types/uuid/index.d.ts"],"fileInfos":[{"version":"44e584d4f6444f58791784f1d530875970993129442a847597db702a073ca68c","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","5514e54f17d6d74ecefedc73c504eadffdeda79c7ea205cf9febead32d45c4bc","27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10",{"version":"6920e1448680767498a0b77c6a00a8e77d14d62c3da8967b171f1ddffa3c18e4","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"ea011c76963fb15ef1cdd7ce6a6808b46322c527de2077b6cfdf23ae6f5f9ec7","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true},{"version":"ae37d6ccd1560b0203ab88d46987393adaaa78c919e51acf32fb82c86502e98c","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"5e07ed3809d48205d5b985642a59f2eba47c402374a7cf8006b686f79efadcbd","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"479553e3779be7d4f68e9f40cdb82d038e5ef7592010100410723ceced22a0f7","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"d3d7b04b45033f57351c8434f60b6be1ea71a2dfec2d0a0c3c83badbb0e3e693","affectsGlobalScope":true},{"version":"956d27abdea9652e8368ce029bb1e0b9174e9678a273529f426df4b3d90abd60","affectsGlobalScope":true},{"version":"4fa6ed14e98aa80b91f61b9805c653ee82af3502dc21c9da5268d3857772ca05","affectsGlobalScope":true},{"version":"e6633e05da3ff36e6da2ec170d0d03ccf33de50ca4dc6f5aeecb572cedd162fb","affectsGlobalScope":true},{"version":"d8670852241d4c6e03f2b89d67497a4bbefe29ecaa5a444e2c11a9b05e6fccc6","affectsGlobalScope":true},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true},{"version":"caccc56c72713969e1cfe5c3d44e5bab151544d9d2b373d7dbe5a1e4166652be","affectsGlobalScope":true},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true},{"version":"9d540251809289a05349b70ab5f4b7b99f922af66ab3c39ba56a475dcf95d5ff","affectsGlobalScope":true},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"e142fda89ed689ea53d6f2c93693898464c7d29a0ae71c6dc8cdfe5a1d76c775","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107",{"version":"964f307d249df0d7e8eb16d594536c0ac6cc63c8d467edf635d05542821dec8e","affectsGlobalScope":true},"db3ec8993b7596a4ef47f309c7b25ee2505b519c13050424d9c34701e5973315",{"version":"6a1ebd564896d530364f67b3257c62555b61d60494a73dfe8893274878c6589d","affectsGlobalScope":true},"af49b066a76ce26673fe49d1885cc6b44153f1071ed2d952f2a90fccba1095c9","f22fd1dc2df53eaf5ce0ff9e0a3326fc66f880d6a652210d50563ae72625455f",{"version":"3ddbdb519e87a7827c4f0c4007013f3628ca0ebb9e2b018cf31e5b2f61c593f1","affectsGlobalScope":true},"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb",{"version":"6d498d4fd8036ea02a4edcae10375854a0eb1df0496cf0b9d692577d3c0fd603","affectsGlobalScope":true},"24642567d3729bcc545bacb65ee7c0db423400c7f1ef757cab25d05650064f98","fd09b892597ab93e7f79745ce725a3aaf6dd005e8db20f0c63a5d10984cba328","a3be878ff1e1964ab2dc8e0a3b67087cf838731c7f3d8f603337e7b712fdd558","5433f7f77cd1fd53f45bd82445a4e437b2f6a72a32070e907530a4fea56c30c8","9be74296ee565af0c12d7071541fdd23260f53c3da7731fb6361f61150a791f6",{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true},{"version":"f501a53b94ba382d9ba396a5c486969a3abc68309828fa67f916035f5d37fe2b","affectsGlobalScope":true},"aa658b5d765f630c312ac9202d110bbaf2b82d180376457f0a9d57b42629714a","312ac7cbd070107766a9886fd27f9faad997ef57d93fdfb4095df2c618ac8162","2e9b4e7f9942af902eb85bae6066d04ef1afee51d61554a62d144df3da7dec94","672ad3045f329e94002256f8ed460cfd06173a50c92cde41edaadfacffd16808","64da4965d1e0559e134d9c1621ae400279a216f87ed00c4cce4f2c7c78021712","2205527b976f4f1844adc46a3f0528729fb68cac70027a5fb13c49ca23593797",{"version":"0166fce1204d520fdfd6b5febb3cda3deee438bcbf8ce9ffeb2b1bcde7155346","affectsGlobalScope":true},"d8b13eab85b532285031b06a971fa051bf0175d8fff68065a24a6da9c1c986cf","50c382ba1827988c59aa9cc9d046e386d55d70f762e9e352e95ee8cb7337cdb8","bb9627ab9d078c79bb5623de4ac8e5d08f806ec9b970962dfc83b3211373690d",{"version":"21d7e87f271e72d02f8d167edc902f90b04525edc7918f00f01dd0bd00599f7e","affectsGlobalScope":true},{"version":"6f6abdaf8764ef01a552a958f45e795b5e79153b87ddad3af5264b86d2681b72","affectsGlobalScope":true},"a215554477f7629e3dcbc8cde104bec036b78673650272f5ffdc5a2cee399a0a","c3497fc242aabfedcd430b5932412f94f157b5906568e737f6a18cc77b36a954","cdc1de3b672f9ef03ff15c443aa1b631edca35b6ae6970a7da6400647ff74d95","139ad1dc93a503da85b7a0d5f615bddbae61ad796bc68fedd049150db67a1e26","bf01fdd3b93cf633b3f7420718457af19c57ab8cbfea49268df60bae2e84d627","15c5e91b5f08be34a78e3d976179bf5b7a9cc28dc0ef1ffebffeb3c7812a2dca","5f461d6f5d9ff474f1121cc3fd86aa3cd67476c701f55c306d323c5112201207","65b39cc6b610a4a4aecc321f6efb436f10c0509d686124795b4c36a5e915b89e","269929a24b2816343a178008ac9ae9248304d92a8ba8e233055e0ed6dbe6ef71","93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633",{"version":"83fe38aa2243059ea859325c006da3964ead69b773429fe049ebb0426e75424d","affectsGlobalScope":true},"d3edb86744e2c19f2c1503849ac7594a5e06024f2451bacae032390f2e20314a",{"version":"e501cbca25bd54f0bcb89c00f092d3cae227e970b93fd76207287fd8110b123d","affectsGlobalScope":true},{"version":"8a3e61347b8f80aa5af532094498bceb0c0b257b25a6aa8ab4880fd6ed57c95a","affectsGlobalScope":true},"98e00f3613402504bc2a2c9a621800ab48e0a463d1eed062208a4ae98ad8f84c","950f6810f7c80e0cffefcf1bcc6ade3485c94394720e334c3c2be3c16b6922fb","5475df7cfc493a08483c9d7aa61cc04791aecba9d0a2efc213f23c4006d4d3cd","000720870b275764c65e9f28ac97cc9e4d9e4a36942d4750ca8603e416e9c57c",{"version":"54412c70bacb9ed547ed6caae8836f712a83ccf58d94466f3387447ec4e82dc3","affectsGlobalScope":true},{"version":"e74e7b0baa7a24f073080091427d36a75836d584b9393e6ac2b1daf1647fe65a","affectsGlobalScope":true},"4c48e931a72f6971b5add7fdb1136be1d617f124594e94595f7114af749395e0","478eb5c32250678a906d91e0529c70243fc4d75477a08f3da408e2615396f558","e686a88c9ee004c8ba12ffc9d674ca3192a4c50ed0ca6bd5b2825c289e2b2bfe",{"version":"0d27932df2fbc3728e78b98892540e24084424ce12d3bd32f62a23cf307f411f","affectsGlobalScope":true},"4423fb3d6abe6eefb8d7f79eb2df9510824a216ec1c6feee46718c9b18e6d89f",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"01c47d1c006b3a15b51d89d7764fff7e4fabc4e412b3a61ee5357bd74b822879","ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea",{"version":"297357003eaebc557bc00920d14a1296f5191e0ba44e768499b33f59a738e615","affectsGlobalScope":true},"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","282f98006ed7fa9bb2cd9bdbe2524595cfc4bcd58a0bb3232e4519f2138df811","6222e987b58abfe92597e1273ad7233626285bc2d78409d4a7b113d81a83496b","cbe726263ae9a7bf32352380f7e8ab66ee25b3457137e316929269c19e18a2be","8b96046bf5fb0a815cba6b0880d9f97b7f3a93cf187e8dcfe8e2792e97f38f87",{"version":"bacf2c84cf448b2cd02c717ad46c3d7fd530e0c91282888c923ad64810a4d511","affectsGlobalScope":true},"858d0d831826c6eb563df02f7db71c90e26deadd0938652096bea3cc14899700","8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","4d979e3c12ffb6497d2b1dc5613130196d986fff764c4526360c0716a162e7e7","e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","80781460eca408fe8d2937d9fdbbb780d6aac35f549621e6200c9bee1da5b8fe","4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","b9261ac3e9944d3d72c5ee4cf888ad35d9743a5563405c6963c4e43ee3708ca4","c84fd54e8400def0d1ef1569cafd02e9f39a622df9fa69b57ccc82128856b916","a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","2ed6489ef46eb61442d067c08e87e3db501c0bfb2837eee4041a27bf3e792bb0","644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","d60fe6d59d4e19ecc65359490b8535e359ca4b760d2cdb56897ca75d09d41ba3","f45a2a8b1777ecb50ed65e1a04bb899d4b676529b7921bd5d69b08573a00c832","774b783046ba3d473948132d28a69f52a295b2f378f2939304118ba571b1355e","b5734e05c787a40e4f9efe71f16683c5f7dc3bdb0de7c04440c855bd000f8fa7","14ba97f0907144771331e1349fdccb5a13526eba0647e6b447e572376d811b6f","2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","7165050eddaed878c2d2cd3cafcaf171072ac39e586a048c0603712b5555f536","26e629be9bbd94ea1d465af83ce5a3306890520695f07be6eb016f8d734d02be","82e687ebd99518bc63ea04b0c3810fb6e50aa6942decd0ca6f7a56d9b9a212a6","7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","8f07f2b6514744ac96e51d7cb8518c0f4de319471237ea10cf688b8d0e9d0225","9ae0ca65717af0d3b554a26fd333ad9c78ad3910ad4b22140ff02acb63076927","e74998d5cefc2f29d583c10b99c1478fb810f1e46fbb06535bfb0bbba3c84aa5","f1c3f5a9d88cce50077ef9e36a962e75a5494c4336659919219c8eb25b798898","43d058146b002d075f5d0033a6870321048297f1658eb0db559ba028383803a6","033fa800d58636b734afe1c65d4a6dcd65dba3a7838eb5fb23bce0658c53c0bb","aa9556edc011a3cd32acf420a6b48860465af09c4c3b77e1e1e6672720ca9706","8eb142d9d0e29220c562296bdbed6b2c228df84589ce5d0c74ed7c333c1ba6cd","bfc4c31c2830191811e2a1687fb91412e18132d97e98d05d32deaf469c4d8f8f","3feec212c0aeb91e5a6e62caaf9f128954590210f8c302910ea377c088f6b61a","c0ec545175a178e203bc08665125a8bbdb2ed7960c015a58c1c0a229b0a9668d","77b55f8bfab90aa408704132d98b72f8762e2fe955eeda093ace44120d6adc1a","768fd34f23de8dc5f5df6cd45f044bb4193105b5964e4ef734dbfc1a1f8e6223","8c7a445b153f9c77db186ff8b5f007e2fb6e2a4e4395da1001180a7f69be4e62","b9ba8aa67fb572718564ab01bac8683f5f444cfab277fe1cfa9de7a38a78faf9","e6a19d01e1db2ef7c859be5a21adf342e434fd11ed31c94bab0e96403fa8f718","de7bcfd21379f7b75718cb9c5d9d8288adbab83d622562707b19e29c008d3bae","865f33be275e0f88caef563e402724cb39db4be3507dd59199f7de75ef5e68a8","2a003e24da976ca911c438e77b1c3a6105d2bd754a2ae3ccfa06aab4ead25c52","76a8a1816d5d2e84871285e962506d34c7728a6bff1130726e56804a78e222f5","1e1713dc243d6738b738126f786533bee9d1053cbef9fdbe045b75dc97c7c4ca",{"version":"9e588cd66bbf86c656efa5677e8381749303a0b91e63f2ca9c399cae25767f28","signature":"f1a1b21a223c18a29308ebff0b002317e4bb8aa5e350164f8c8c3b8bde33a535"},"ff81bffa4ecfceae2e86b5920c3fcb250b66b1d6ed72944dffdf58123be2481b","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","bdf0ed7d9ebae6175a5d1b4ec4065d07f8099379370a804b1faff05004dc387d","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","cf93e7b09b66e142429611c27ba2cbf330826057e3c793e1e2861e976fae3940","90e727d145feb03695693fdc9f165a4dc10684713ee5f6aa81e97a6086faa0f8","ee2c6ec73c636c9da5ab4ce9227e5197f55a57241d66ea5828f94b69a4a09a2d","afaf64477630c7297e3733765046c95640ab1c63f0dfb3c624691c8445bc3b08","5aa03223a53ad03171988820b81a6cae9647eabcebcb987d1284799de978d8e3","7f50c8914983009c2b940923d891e621db624ba32968a51db46e0bf480e4e1cb","90fc18234b7d2e19d18ac026361aaf2f49d27c98dc30d9f01e033a9c2b01c765","a980e4d46239f344eb4d5442b69dcf1d46bd2acac8d908574b5a507181f7e2a1","bbbfa4c51cdaa6e2ef7f7be3ae199b319de6b31e3b5afa7e5a2229c14bb2568a","bc7bfe8f48fa3067deb3b37d4b511588b01831ba123a785ea81320fe74dd9540","fd60c0aaf7c52115f0e7f367d794657ac18dbb257255777406829ab65ca85746","15c17866d58a19f4a01a125f3f511567bd1c22235b4fd77bf90c793bf28388c3","51301a76264b1e1b4046f803bda44307fba403183bc274fe9e7227252d7315cb","ddef23e8ace6c2b2ddf8d8092d30b1dd313743f7ff47b2cbb43f36c395896008","9e42df47111429042b5e22561849a512ad5871668097664b8fb06a11640140ac","391fcc749c6f94c6c4b7f017c6a6f63296c1c9ae03fa639f99337dddb9cc33fe","ac4706eb1fb167b19f336a93989763ab175cd7cc6227b0dcbfa6a7824c6ba59a","633220dc1e1a5d0ccf11d3c3e8cadc9124daf80fef468f2ff8186a2775229de3","6de22ad73e332e513454f0292275155d6cb77f2f695b73f0744928c4ebb3a128","ebe0e3c77f5114b656d857213698fade968cff1b3a681d1868f3cfdd09d63b75","22c27a87488a0625657b52b9750122814c2f5582cac971484cda0dcd7a46dc3b","7e7a817c8ec57035b2b74df8d5dbcc376a4a60ad870b27ec35463536158e1156","0e2061f86ca739f34feae42fd7cce27cc171788d251a587215b33eaec456e786","91659b2b090cadffdb593736210910508fc5b77046d4ce180b52580b14b075ec","d0f6c657c45faaf576ca1a1dc64484534a8dc74ada36fd57008edc1aab65a02b","ce0c52b1ebc023b71d3c1fe974804a2422cf1d85d4af74bb1bced36ff3bff8b5","9c6acb4a388887f9a5552eda68987ee5d607152163d72f123193a984c48157c9","90d0a9968cbb7048015736299f96a0cceb01cf583fd2e9a9edbc632ac4c81b01","49abec0571c941ab6f095885a76828d50498511c03bb326eec62a852e58000c5","8eeb4a4ff94460051173d561749539bca870422a6400108903af2fb7a1ffe3d7","49e39b284b87452fed1e27ac0748ba698f5a27debe05084bc5066b3ecf4ed762","59dcf835762f8df90fba5a3f8ba87941467604041cf127fb456543c793b71456","33e0c4c683dcaeb66bedf5bb6cc35798d00ac58d7f3bc82aadb50fa475781d60","605839abb6d150b0d83ed3712e1b3ffbeb309e382770e7754085d36bc2d84a4c","a862dcb740371257e3dae1ab379b0859edcb5119484f8359a5e6fb405db9e12e","0f0a16a0e8037c17e28f537028215e87db047eba52281bd33484d5395402f3c1","cf533aed4c455b526ddccbb10dae7cc77e9269c3d7862f9e5cedbd4f5c92e05e","f8a60ca31702a0209ef217f8f3b4b32f498813927df2304787ac968c78d8560d","530192961885d3ddad87bf9c4390e12689fa29ff515df57f17a57c9125fc77c3","165ba9e775dd769749e2177c383d24578e3b212e4774b0a72ad0f6faee103b68","61448f238fdfa94e5ccce1f43a7cced5e548b1ea2d957bec5259a6e719378381","69fa523e48131ced0a52ab1af36c3a922c5fd7a25e474d82117329fe051f5b85","fa10b79cd06f5dd03435e184fb05cc5f0d02713bfb4ee9d343db527501be334c","c6fb591e363ee4dea2b102bb721c0921485459df23a2d2171af8354cacef4bce","ea7e1f1097c2e61ed6e56fa04a9d7beae9d276d87ac6edb0cd39a3ee649cddfe","e8cf2659d87462aae9c7647e2a256ac7dcaf2a565a9681bfb49328a8a52861e8","7e374cb98b705d35369b3c15444ef2ff5ff983bd2fbb77a287f7e3240abf208c","ca75ba1519f9a426b8c512046ebbad58231d8627678d054008c93c51bc0f3fa5","ff63760147d7a60dcfc4ac16e40aa2696d016b9ffe27e296b43655dfa869d66b","4d434123b16f46b290982907a4d24675442eb651ca95a5e98e4c274be16f1220","57263d6ba38046e85f499f3c0ab518cfaf0a5f5d4f53bdae896d045209ab4aff","d3a535f2cd5d17f12b1abf0b19a64e816b90c8c10a030b58f308c0f7f2acfe2c","be26d49bb713c13bd737d00ae8a61aa394f0b76bc2d5a1c93c74f59402eb8db3","c7012003ac0c9e6c9d3a6418128ddebf6219d904095180d4502b19c42f46a186","d58c55750756bcf73f474344e6b4a9376e5381e4ba7d834dc352264b491423b6","01e2aabfabe22b4bf6d715fc54d72d32fa860a3bd1faa8974e0d672c4b565dfe","ba2c489bb2566c16d28f0500b3d98013917e471c40a4417c03991460cb248e88","39f94b619f0844c454a6f912e5d6868d0beb32752587b134c3c858b10ecd7056","0d2d8b0477b1cf16b34088e786e9745c3e8145bc8eea5919b700ad054e70a095","2a5e963b2b8f33a50bb516215ba54a20801cb379a8e9b1ae0b311e900dc7254c","d8307f62b55feeb5858529314761089746dce957d2b8fd919673a4985fa4342a","bf449ec80fc692b2703ad03e64ae007b3513ecd507dc2ab77f39be6f578e6f5c","f780213dd78998daf2511385dd51abf72905f709c839a9457b6ba2a55df57be7","2b7843e8a9a50bdf511de24350b6d429a3ee28430f5e8af7d3599b1e9aa7057f","05d95be6e25b4118c2eb28667e784f0b25882f6a8486147788df675c85391ab7","62d2721e9f2c9197c3e2e5cffeb2f76c6412121ae155153179049890011eb785","ff5668fb7594c02aca5e7ba7be6c238676226e450681ca96b457f4a84898b2d9","59fd37ea08657fef36c55ddea879eae550ffe21d7e3a1f8699314a85a30d8ae9","84e23663776e080e18b25052eb3459b1a0486b5b19f674d59b96347c0cb7312a","43e5934c7355731eec20c5a2aa7a859086f19f60a4e5fcd80e6684228f6fb767","a49c210c136c518a7c08325f6058fc648f59f911c41c93de2026db692bba0e47","1a92f93597ebc451e9ef4b158653c8d31902de5e6c8a574470ecb6da64932df4","256513ad066ac9898a70ca01e6fbdb3898a4e0fe408fbf70608fdc28ac1af224","d9835850b6cc05c21e8d85692a8071ebcf167a4382e5e39bf700c4a1e816437e","e5ab7190f818442e958d0322191c24c2447ddceae393c4e811e79cda6bd49836","91b4b77ef81466ce894f1aade7d35d3589ddd5c9981109d1dea11f55a4b807a0","03abb209bed94c8c893d9872639e3789f0282061c7aa6917888965e4047a8b5f","e97a07901de562219f5cba545b0945a1540d9663bd9abce66495721af3903eec","bf39ed1fdf29bc8178055ec4ff32be6725c1de9f29c252e31bdc71baf5c227e6","985eabf06dac7288fc355435b18641282f86107e48334a83605739a1fe82ac15","6112d33bcf51e3e6f6a81e419f29580e2f8e773529d53958c7c1c99728d4fb2e","89e9f7e87a573504acc2e7e5ad727a110b960330657d1b9a6d3526e77c83d8be","44bbb88abe9958c7c417e8687abf65820385191685009cc4b739c2d270cb02e9","ab4b506b53d2c4aec4cc00452740c540a0e6abe7778063e95c81a5cd557c19eb","858757bde6d615d0d1ee474c972131c6d79c37b0b61897da7fbd7110beb8af12","60b9dea33807b086a1b4b4b89f72d5da27ad0dd36d6436a6e306600c47438ac4","409c963b1166d0c1d49fdad1dfeb4de27fd2d6662d699009857de9baf43ca7c3","b7674ecfeb5753e965404f7b3d31eec8450857d1a23770cb867c82f264f546ab","c9800b9a9ad7fcdf74ed8972a5928b66f0e4ff674d55fd038a3b1c076911dcbe","99864433e35b24c61f8790d2224428e3b920624c01a6d26ea8b27ee1f62836bb","c391317b9ff8f87d28c6bfe4e50ed92e8f8bfab1bb8a03cd1fe104ff13186f83","42bdc3c98446fdd528e2591213f71ce6f7008fb9bb12413bd57df60d892a3fb5","542d2d689b58c25d39a76312ccaea2fcd10a45fb27b890e18015399c8032e2d9","97d1656f0a563dbb361d22b3d7c2487427b0998f347123abd1c69a4991326c96","d4f53ed7960c9fba8378af3fa28e3cc483d6c0b48e4a152a83ff0973d507307d","0665de5280d65ec32776dc55fb37128e259e60f389cde5b9803cf9e81ad23ce0","b6dc8fd1c6092da86725c338ca6c263d1c6dd3073046d3ec4eb2d68515062da2","d9198a0f01f00870653347560e10494efeca0bfa2de0988bd5d883a9d2c47edb","d4279865b926d7e2cfe8863b2eae270c4c035b6e923af8f9d7e6462d68679e07","73b6945448bb3425b764cfe7b1c4b0b56c010cc66e5f438ef320c53e469797eb","cf72fd8ffa5395f4f1a26be60246ec79c5a9ad201579c9ba63fd2607b5daf184","301a458744666096f84580a78cc3f6e8411f8bab92608cdaa33707546ca2906f","711e70c0916ff5f821ea208043ecd3e67ed09434b8a31d5616286802b58ebebe","e1f2fd9f88dd0e40c358fbf8c8f992211ab00a699e7d6823579b615b874a8453","17db3a9dcb2e1689ff7ace9c94fa110c88da64d69f01dc2f3cec698e4fc7e29e","73fb07305106bb18c2230890fcacf910fd1a7a77d93ac12ec40bc04c49ee5b8e","2c5f341625a45530b040d59a4bc2bc83824d258985ede10c67005be72d3e21d0","c4a262730d4277ecaaf6f6553dabecc84dcca8decaebbf2e16f1df8bbd996397","c23c533d85518f3358c55a7f19ab1a05aad290251e8bba0947bd19ea3c259467","5d0322a0b8cdc67b8c71e4ccaa30286b0c8453211d4c955a217ac2d3590e911f","f5e4032b6e4e116e7fec5b2620a2a35d0b6b8b4a1cc9b94a8e5ee76190153110","9ab26cb62a0e86ab7f669c311eb0c4d665457eb70a103508aa39da6ccee663da","5f64d1a11d8d4ce2c7ee3b72471df76b82d178a48964a14cdfdc7c5ef7276d70","24e2fbc48f65814e691d9377399807b9ec22cd54b51d631ba9e48ee18c5939dd","bfa2648b2ee90268c6b6f19e84da3176b4d46329c9ec0555d470e647d0568dfb","75ef3cb4e7b3583ba268a094c1bd16ce31023f2c3d1ac36e75ca65aca9721534","3be6b3304a81d0301838860fd3b4536c2b93390e785808a1f1a30e4135501514","da66c1b3e50ef9908e31ce7a281b137b2db41423c2b143c62524f97a536a53d9","3ada1b216e45bb9e32e30d8179a0a95870576fe949c33d9767823ccf4f4f4c97","1ace2885dffab849f7c98bffe3d1233260fbf07ee62cb58130167fd67a376a65","2126e5989c0ca5194d883cf9e9c10fe3e5224fbd3e4a4a6267677544e8be0aae","41a6738cf3c756af74753c5033e95c5b33dfc1f6e1287fa769a1ac4027335bf5","6e8630be5b0166cbc9f359b9f9e42801626d64ff1702dcb691af811149766154","e36b77c04e00b4a0bb4e1364f2646618a54910c27f6dc3fc558ca2ced8ca5bc5","2c4ea7e9f95a558f46c89726d1fedcb525ef649eb755a3d7d5055e22b80c2904","4875d65190e789fad05e73abd178297b386806b88b624328222d82e455c0f2e7","bf5302ecfaacee37c2316e33703723d62e66590093738c8921773ee30f2ecc38","62684064fe034d54b87f62ad416f41b98a405dee4146d0ec03b198c3634ea93c","be02cbdb1688c8387f8a76a9c6ed9d75d8bb794ec5b9b1d2ba3339a952a00614","cefaff060473a5dbf4939ee1b52eb900f215f8d6249dc7c058d6b869d599983c","b2797235a4c1a7442a6f326f28ffb966226c3419399dbb33634b8159af2c712f","164d633bbd4329794d329219fc173c3de85d5ad866d44e5b5f0fb60c140e98f2","b74300dd0a52eaf564b3757c07d07e1d92def4e3b8708f12eedb40033e4cafe9","a792f80b1e265b06dce1783992dbee2b45815a7bdc030782464b8cf982337cf2","8816b4b3a87d9b77f0355e616b38ed5054f993cc4c141101297f1914976a94b1","0f35e4da974793534c4ca1cdd9491eab6993f8cf47103dadfc048b899ed9b511","0ccdfcaebf297ec7b9dde20bbbc8539d5951a3d8aaa40665ca469da27f5a86e1","7fcb05c8ce81f05499c7b0488ae02a0a1ac6aebc78c01e9f8c42d98f7ba68140","81c376c9e4d227a4629c7fca9dde3bbdfa44bd5bd281aee0ed03801182368dc5","0f2448f95110c3714797e4c043bbc539368e9c4c33586d03ecda166aa9908843","b2f1a443f7f3982d7325775906b51665fe875c82a62be3528a36184852faa0bb","7568ff1f23363d7ee349105eb936e156d61aea8864187a4c5d85c60594b44a25","8c4d1d9a4eba4eac69e6da0f599a424b2689aee55a455f0b5a7f27a807e064db","e1beb9077c100bdd0fc8e727615f5dae2c6e1207de224569421907072f4ec885","3dda13836320ec71b95a68cd3d91a27118b34c05a2bfda3e7e51f1d8ca9b960b","fedc79cb91f2b3a14e832d7a8e3d58eb02b5d5411c843fcbdc79e35041316b36","99f395322ffae908dcdfbaa2624cc7a2a2cb7b0fbf1a1274aca506f7b57ebcb5","5e1f7c43e8d45f2222a5c61cbc88b074f4aaf1ca4b118ac6d6123c858efdcd71","7388273ab71cb8f22b3f25ffd8d44a37d5740077c4d87023da25575204d57872","0a48ceb01a0fdfc506aa20dfd8a3563edbdeaa53a8333ddf261d2ee87669ea7b","3182d06b874f31e8e55f91ea706c85d5f207f16273480f46438781d0bd2a46a1","ccd47cab635e8f71693fa4e2bbb7969f559972dae97bd5dbd1bbfee77a63b410","89770fa14c037f3dc3882e6c56be1c01bb495c81dec96fa29f868185d9555a5d","7048c397f08c54099c52e6b9d90623dc9dc6811ea142f8af3200e40d66a972e1","512120cd6f026ce1d3cf686c6ab5da80caa40ef92aa47466ec60ba61a48b5551","6cd0cb7f999f221e984157a7640e7871960131f6b221d67e4fdc2a53937c6770","f48b84a0884776f1bc5bf0fcf3f69832e97b97dc55d79d7557f344de900d259b","dca490d986411644b0f9edf6ea701016836558e8677c150dca8ad315178ec735","a028a04948cf98c1233166b48887dad324e8fe424a4be368a287c706d9ccd491","3046ed22c701f24272534b293c10cfd17b0f6a89c2ec6014c9a44a90963dfa06","394da10397d272f19a324c95bea7492faadf2263da157831e02ae1107bd410f5","0580595a99248b2d30d03f2307c50f14eb21716a55beb84dd09d240b1b087a42","a7da9510150f36a9bea61513b107b59a423fdff54429ad38547c7475cd390e95","659615f96e64361af7127645bb91f287f7b46c5d03bea7371e6e02099226d818","1f2a42974920476ce46bb666cd9b3c1b82b2072b66ccd0d775aa960532d78176","500b3ae6095cbab92d81de0b40c9129f5524d10ad955643f81fc07d726c5a667","a957ad4bd562be0662fb99599dbcf0e16d1631f857e5e1a83a3f3afb6c226059","e57a4915266a6a751c6c172e8f30f6df44a495608613e1f1c410196207da9641","7a12e57143b7bc5a52a41a8c4e6283a8f8d59a5e302478185fb623a7157fff5e","17b3426162e1d9cb0a843e8d04212aabe461d53548e671236de957ed3ae9471b","f38e86eb00398d63180210c5090ef6ed065004474361146573f98b3c8a96477d","231d9e32382d3971f58325e5a85ba283a2021243651cb650f82f87a1bf62d649","6532e3e87b87c95f0771611afce929b5bad9d2c94855b19b29b3246937c9840b","65704bbb8f0b55c73871335edd3c9cead7c9f0d4b21f64f5d22d0987c45687f0","787232f574af2253ac860f22a445c755d57c73a69a402823ae81ba0dfdd1ce23","5e63903cd5ebce02486b91647d951d61a16ad80d65f9c56581cd624f39a66007","bcc89a120d8f3c02411f4df6b1d989143c01369314e9b0e04794441e6b078d22","d17531ef42b7c76d953f63bd5c5cd927c4723e62a7e0b2badf812d5f35f784eb","6d4ee1a8e3a97168ea4c4cc1c68bb61a3fd77134f15c71bb9f3f63df3d26b54c","1eb04fea6b47b16922ed79625d90431a8b2fc7ba9d5768b255e62df0c96f1e3a","de0c2eece83bd81b8682f4496f558beb728263e17e74cbc4910e5c9ce7bef689","98866542d45306dab48ecc3ddd98ee54fa983353bc3139dfbc619df882f54d90","9e04c7708917af428c165f1e38536ddb2e8ecd576f55ed11a97442dc34b6b010","31fe6f6d02b53c1a7c34b8d8f8c87ee9b6dd4b67f158cbfff3034b4f3f69c409","2e1d853f84188e8e002361f4bfdd892ac31c68acaeac426a63cd4ff7abf150d0","666b5289ec8a01c4cc0977c62e3fd32e89a8e3fd9e97c8d8fd646f632e63c055","a1107bbb2b10982dba1f7958a6a5cf841e1a19d6976d0ecdc4c43269c7b0eaf2","07fa6122f7495331f39167ec9e4ebd990146a20f99c16c17bc0a98aa81f63b27","39c1483481b35c2123eaab5094a8b548a0c3f1e483ab7338102c3291f1ab18bf","b73e6242c13796e7d5fba225bf1c07c8ee66d31b7bb65f45be14226a9ae492d2","f2931608d541145d189390d6cfb74e1b1e88f73c0b9a80c4356a4daa7fa5e005","8684656fe3bf1425a91bd62b8b455a1c7ec18b074fd695793cfae44ae02e381a","ccf0b9057dd65c7fb5e237de34f706966ebc30c6d3669715ed05e76225f54fbd","d930f077da575e8ea761e3d644d4c6279e2d847bae2b3ea893bbd572315acc21","19b0616946cb615abde72c6d69049f136cc4821b784634771c1d73bec8005f73","553312560ad0ef97b344b653931935d6e80840c2de6ab90b8be43cbacf0d04cf","1225cf1910667bfd52b4daa9974197c3485f21fe631c3ce9db3b733334199faa","f7cb9e46bd6ab9d620d68257b525dbbbbc9b0b148adf500b819d756ebc339de0","e46d6c3120aca07ae8ec3189edf518c667d027478810ca67a62431a0fa545434","9d234b7d2f662a135d430d3190fc21074325f296273125244b2bf8328b5839a0","0554ef14d10acea403348c53436b1dd8d61e7c73ef5872e2fe69cc1c433b02f8","2f6ae5538090db60514336bd1441ca208a8fab13108cfa4b311e61eaca5ff716","17bf4ce505a4cff88fb56177a8f7eb48aa55c22ccc4cce3e49cc5c8ddc54b07d","3d735f493d7da48156b79b4d8a406bf2bbf7e3fe379210d8f7c085028143ee40","41de1b3ddd71bd0d9ed7ac217ca1b15b177dd731d5251cde094945c20a715d03","17d9c562a46c6a25bc2f317c9b06dd4e8e0368cbe9bdf89be6117aeafd577b36","ded799031fe18a0bb5e78be38a6ae168458ff41b6c6542392b009d2abe6a6f32","ed48d467a7b25ee1a2769adebc198b647a820e242c96a5f96c1e6c27a40ab131","b914114df05f286897a1ae85d2df39cfd98ed8da68754d73cf830159e85ddd15","73881e647da3c226f21e0b80e216feaf14a5541a861494c744e9fbe1c3b3a6af","d79e1d31b939fa99694f2d6fbdd19870147401dbb3f42214e84c011e7ec359ab","4f71097eae7aa37941bab39beb2e53e624321fd341c12cc1d400eb7a805691ff","58ebb4f21f3a90dda31a01764462aa617849fdb1b592f3a8d875c85019956aff","a8e8d0e6efff70f3c28d3e384f9d64530c7a7596a201e4879a7fd75c7d55cbb5","df5cbb80d8353bf0511a4047cc7b8434b0be12e280b6cf3de919d5a3380912c0","256eb0520e822b56f720962edd7807ed36abdf7ea23bcadf4a25929a3317c8cf","9cf2cbc9ceb5f718c1705f37ce5454f14d3b89f690d9864394963567673c1b5c","07d3dd790cf1e66bb6fc9806d014dd40bb2055f8d6ca3811cf0e12f92ba4cb9a","1f99fd62e9cff9b50c36f368caf3b9fb79fc6f6c75ca5d3c2ec4afaea08d9109","6558faaacba5622ef7f1fdfb843cd967af2c105469b9ff5c18a81ce85178fca7","34e7f17ae9395b0269cd3f2f0af10709e6dc975c5b44a36b6b70442dc5e25a38","a4295111b54f84c02c27e46b0855b02fad3421ae1d2d7e67ecf16cb49538280a","ce9746b2ceae2388b7be9fe1f009dcecbc65f0bdbc16f40c0027fab0fb848c3b","35ce823a59f397f0e85295387778f51467cea137d787df385be57a2099752bfb","2e5acd3ec67bc309e4f679a70c894f809863c33b9572a8da0b78db403edfa106","1872f3fcea0643d5e03b19a19d777704320f857d1be0eb4ee372681357e20c88","9689628941205e40dcbb2706d1833bd00ce7510d333b2ef08be24ecbf3eb1a37","0317a72a0b63094781476cf1d2d27585d00eb2b0ca62b5287124735912f3d048","6ce4c0ab3450a4fff25d60a058a25039cffd03141549589689f5a17055ad0545","9153ec7b0577ae77349d2c5e8c5dd57163f41853b80c4fb5ce342c7a431cbe1e","f490dfa4619e48edd594a36079950c9fca1230efb3a82aaf325047262ba07379","674f00085caff46d2cbc76fc74740fd31f49d53396804558573421e138be0c12","41d029194c4811f09b350a1e858143c191073007a9ee836061090ed0143ad94f","44a6259ffd6febd8510b9a9b13a700e1d022530d8b33663f0735dbb3bee67b3d","6f4322500aff8676d9b8eef7711c7166708d4a0686b792aa4b158e276ed946a7","e829ff9ecffa3510d3a4d2c3e4e9b54d4a4ccfef004bacbb1d6919ce3ccca01f","62e6fec9dbd012460b47af7e727ec4cd34345b6e4311e781f040e6b640d7f93e","4d180dd4d0785f2cd140bc069d56285d0121d95b53e4348feb4f62db2d7035d3","f1142cbba31d7f492d2e7c91d82211a8334e6642efe52b71d9a82cb95ba4e8ae","279cac827be5d48c0f69fe319dc38c876fdd076b66995d9779c43558552d8a50","a70ff3c65dc0e7213bfe0d81c072951db9f5b1e640eb66c1eaed0737879c797b","f75d3303c1750f4fdacd23354657eca09aae16122c344e65b8c14c570ff67df5","3ebae6a418229d4b303f8e0fdb14de83f39fba9f57b39d5f213398bca72137c7","21ba07e33265f59d52dece5ac44f933b2b464059514587e64ad5182ddf34a9b0","2d3d96efba00493059c460fd55e6206b0667fc2e73215c4f1a9eb559b550021f","d23d4a57fff5cec5607521ba3b72f372e3d735d0f6b11a4681655b0bdd0505f4","395c1f3da7e9c87097c8095acbb361541480bf5fd7fa92523985019fef7761dd","d61f3d719293c2f92a04ba73d08536940805938ecab89ac35ceabc8a48ccb648","ca693235a1242bcd97254f43a17592aa84af66ccb7497333ccfea54842fde648","cd41cf040b2e368382f2382ec9145824777233730e3965e9a7ba4523a6a4698e","2e7a9dba6512b0310c037a28d27330520904cf5063ca19f034b74ad280dbfe71","9f2a38baf702e6cb98e0392fa39d25a64c41457a827b935b366c5e0980a6a667","c1dc37f0e7252928f73d03b0d6b46feb26dea3d8737a531ca4c0ec4105e33120","25126b80243fb499517e94fc5afe5c9c5df3a0105618e33581fb5b2f2622f342","d332c2ddcb64012290eb14753c1b49fe3eee9ca067204efba1cf31c1ce1ee020","1be8da453470021f6fe936ba19ee0bfebc7cfa2406953fa56e78940467c90769","7c9f2d62d83f1292a183a44fb7fb1f16eb9037deb05691d307d4017ac8af850a","d0163ab7b0de6e23b8562af8b5b4adea4182884ca7543488f7ac2a3478f3ae6e","05224e15c6e51c4c6cd08c65f0766723f6b39165534b67546076c226661db691","a5f7158823c7700dd9fc1843a94b9edc309180c969fbfa6d591aeb0b33d3b514","7d30937f8cf9bb0d4b2c2a8fb56a415d7ef393f6252b24e4863f3d7b84285724","e04d074584483dc9c59341f9f36c7220f16eed09f7af1fa3ef9c64c26095faec","619697e06cbc2c77edda949a83a62047e777efacde1433e895b904fe4877c650","88d9a8593d2e6aee67f7b15a25bda62652c77be72b79afbee52bea61d5ffb39e","044d7acfc9bd1af21951e32252cf8f3a11c8b35a704169115ddcbde9fd717de2","a4ca8f13a91bd80e6d7a4f013b8a9e156fbf579bbec981fe724dad38719cfe01","5a216426a68418e37e55c7a4366bc50efc99bda9dc361eae94d7e336da96c027","13b65b640306755096d304e76d4a237d21103de88b474634f7ae13a2fac722d5","7478bd43e449d3ce4e94f3ed1105c65007b21f078b3a791ea5d2c47b30ea6962","601d3e8e71b7d6a24fc003aca9989a6c25fa2b3755df196fd0aaee709d190303","168e0850fcc94011e4477e31eca81a8a8a71e1aed66d056b7b50196b877e86c8","37ba82d63f5f8c6b4fc9b756f24902e47f62ea66aae07e89ace445a54190a86e","f5b66b855f0496bc05f1cd9ba51a6a9de3d989b24aa36f6017257f01c8b65a9f","823b16d378e8456fcc5503d6253c8b13659be44435151c6b9f140c4a38ec98c1","b58b254bf1b586222844c04b3cdec396e16c811463bf187615bb0a1584beb100","a367c2ccfb2460e222c5d10d304e980bd172dd668bcc02f6c2ff626e71e90d75","0718623262ac94b016cb0cfd8d54e4d5b7b1d3941c01d85cf95c25ec1ba5ed8d","d4f3c9a0bd129e9c7cbfac02b6647e34718a2b81a414d914e8bd6b76341172e0","824306df6196f1e0222ff775c8023d399091ada2f10f2995ce53f5e3d4aff7a4","84ca07a8d57f1a6ba8c0cf264180d681f7afae995631c6ca9f2b85ec6ee06c0f","35755e61e9f4ec82d059efdbe3d1abcccc97a8a839f1dbf2e73ac1965f266847","64a918a5aa97a37400ec085ffeea12a14211aa799cd34e5dc828beb1806e95bb","0c8f5489ba6af02a4b1d5ba280e7badd58f30dc8eb716113b679e9d7c31185e5","7b574ca9ae0417203cdfa621ab1585de5b90c4bc6eea77a465b2eb8b92aa5380","3334c03c15102700973e3e334954ac1dffb7be7704c67cc272822d5895215c93","aabcb169451df7f78eb43567fab877a74d134a0a6d9850aa58b38321374ab7c0","1b5effdd8b4e8d9897fc34ab4cd708a446bf79db4cb9a3467e4a30d55b502e14","d772776a7aea246fd72c5818de72c3654f556b2cf0d73b90930c9c187cc055fc","dbd4bd62f433f14a419e4c6130075199eb15f2812d2d8e7c9e1f297f4daac788","427df949f5f10c73bcc77b2999893bc66c17579ad073ee5f5270a2b30651c873","c4c1a5565b9b85abfa1d663ca386d959d55361e801e8d49155a14dd6ca41abe1","7a45a45c277686aaff716db75a8157d0458a0d854bacf072c47fee3d499d7a99","57005b72bce2dc26293e8924f9c6be7ee3a2c1b71028a680f329762fa4439354","8f53b1f97c53c3573c16d0225ee3187d22f14f01421e3c6da1a26a1aace32356","810fdc0e554ed7315c723b91f6fa6ef3a6859b943b4cd82879641563b0e6c390","87a36b177b04d23214aa4502a0011cd65079e208cd60654aefc47d0d65da68ea","28a1c17fcbb9e66d7193caca68bbd12115518f186d90fc729a71869f96e2c07b","cc2d2abbb1cc7d6453c6fee760b04a516aa425187d65e296a8aacff66a49598a","d2413645bc4ab9c3f3688c5281232e6538684e84b49a57d8a1a8b2e5cf9f2041","4e6e21a0f9718282d342e66c83b2cd9aa7cd777dfcf2abd93552da694103b3dc","9006cc15c3a35e49508598a51664aa34ae59fc7ab32d6cc6ea2ec68d1c39448e","74467b184eadee6186a17cac579938d62eceb6d89c923ae67d058e2bcded254e","4169b96bb6309a2619f16d17307da341758da2917ff40c615568217b14357f5e","4a94d6146b38050de0830019a1c6a7820c2e2b90eba1a5ee4e4ab3bc30a72036","48a35ece156203abf19864daa984475055bbed4dc9049d07f4462100363f1e85","fab58e600970e66547644a44bc9918e3223aa2cbd9e8763cec004b2cfb48827e"],"root":[207],"options":{"allowImportingTsExtensions":true,"composite":true,"declaration":true,"emitDeclarationOnly":true,"module":99,"noFallthroughCasesInSwitch":true,"noUnusedLocals":true,"noUnusedParameters":true,"skipLibCheck":true,"strict":true,"target":9},"fileIdsList":[[188],[156,157],[220],[221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524],[208,210,211,212,213,214,215,216,217,218,219,220],[208,209,211,212,213,214,215,216,217,218,219,220],[209,210,211,212,213,214,215,216,217,218,219,220],[208,209,210,212,213,214,215,216,217,218,219,220],[208,209,210,211,213,214,215,216,217,218,219,220],[208,209,210,211,212,214,215,216,217,218,219,220],[208,209,210,211,212,213,215,216,217,218,219,220],[208,209,210,211,212,213,214,216,217,218,219,220],[208,209,210,211,212,213,214,215,217,218,219,220],[208,209,210,211,212,213,214,215,216,218,219,220],[208,209,210,211,212,213,214,215,216,217,219,220],[208,209,210,211,212,213,214,215,216,217,218,220],[208,209,210,211,212,213,214,215,216,217,218,219],[63],[103],[104,109,139],[105,110,116,117,124,136,147],[105,106,116,124],[107,148],[108,109,117,125],[109,136,144],[110,112,116,124],[103,111],[112,113],[116],[114,116],[103,116],[116,117,118,136,147],[116,117,118,131,136,139],[101,152],[101,112,116,119,124,136,147],[116,117,119,120,124,136,144,147],[119,121,136,144,147],[63,64,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154],[116,122],[123,147,152],[112,116,124,136],[125],[126],[103,127],[63,64,103,104,105,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153],[129],[130],[116,131,132],[131,133,148,150],[104,116,136,137,138,139],[104,136,138],[136,137],[139],[140],[63,136],[116,142,143],[142,143],[109,124,136,144],[145],[124,146],[104,119,130,147],[109,148],[136,149],[123,150],[151],[104,109,116,118,127,136,147,150,152],[136,153],[187,205],[187,195],[204],[194],[188,189,190],[183,188,190,191,192,193],[179],[177,179],[168,176,177,178,180],[166],[169,174,179,182],[165,182],[169,170,173,174,175,182],[169,170,171,173,174,182],[166,167,168,169,170,174,175,176,178,179,180,182],[182],[164,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181],[164,182],[169,171,172,174,175,182],[173,182],[174,175,179,182],[167,177],[157,186],[164],[73,77,147],[73,136,147],[68],[70,73,144,147],[124,144],[155],[68,155],[70,73,124,147],[65,66,69,72,104,116,136,147],[73,80],[65,71],[73,94,95],[69,73,104,139,147,155],[104,155],[94,104,155],[67,68,155],[73],[67,68,69,70,71,72,73,74,75,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100],[73,88],[73,80,81],[71,73,81,82],[72],[65,68,73],[73,77,81,82],[77],[71,73,76,147],[65,70,73,80],[104,136],[68,73,94,104,152,155],[197,199,200,201],[197,199,200],[187,197,199,200,201],[157,163,186,187,198],[116,117,119,120,121,124,136,144,147,153,155,157,158,159,160,161,162,163,183,184,185,186],[159,160,161,162],[159,160,161],[159],[160],[157],[126,187,196,202,203,206]],"referencedMap":[[190,1],[197,2],[221,3],[222,3],[223,3],[224,3],[225,3],[226,3],[227,3],[228,3],[229,3],[230,3],[231,3],[232,3],[233,3],[234,3],[235,3],[236,3],[237,3],[238,3],[239,3],[240,3],[241,3],[242,3],[243,3],[244,3],[245,3],[246,3],[247,3],[248,3],[249,3],[250,3],[251,3],[252,3],[253,3],[254,3],[255,3],[256,3],[257,3],[258,3],[259,3],[260,3],[261,3],[262,3],[263,3],[264,3],[265,3],[266,3],[267,3],[268,3],[269,3],[270,3],[271,3],[272,3],[273,3],[274,3],[275,3],[276,3],[277,3],[278,3],[279,3],[280,3],[281,3],[282,3],[283,3],[284,3],[285,3],[286,3],[287,3],[288,3],[289,3],[290,3],[291,3],[292,3],[293,3],[294,3],[295,3],[296,3],[297,3],[298,3],[299,3],[300,3],[301,3],[302,3],[303,3],[304,3],[305,3],[306,3],[307,3],[308,3],[309,3],[310,3],[311,3],[312,3],[313,3],[314,3],[315,3],[316,3],[317,3],[525,4],[318,3],[319,3],[320,3],[321,3],[322,3],[323,3],[324,3],[325,3],[326,3],[327,3],[328,3],[329,3],[330,3],[331,3],[332,3],[333,3],[334,3],[335,3],[336,3],[337,3],[338,3],[339,3],[340,3],[341,3],[342,3],[343,3],[344,3],[345,3],[346,3],[347,3],[348,3],[349,3],[350,3],[351,3],[352,3],[353,3],[354,3],[355,3],[356,3],[357,3],[358,3],[359,3],[360,3],[361,3],[362,3],[363,3],[364,3],[365,3],[366,3],[367,3],[368,3],[369,3],[370,3],[371,3],[372,3],[373,3],[374,3],[375,3],[376,3],[377,3],[378,3],[379,3],[380,3],[381,3],[382,3],[383,3],[384,3],[385,3],[386,3],[387,3],[388,3],[389,3],[390,3],[391,3],[392,3],[393,3],[394,3],[395,3],[396,3],[397,3],[398,3],[399,3],[400,3],[401,3],[402,3],[403,3],[404,3],[405,3],[406,3],[407,3],[408,3],[409,3],[410,3],[411,3],[412,3],[413,3],[414,3],[415,3],[416,3],[417,3],[418,3],[419,3],[420,3],[421,3],[422,3],[423,3],[424,3],[425,3],[426,3],[427,3],[428,3],[429,3],[430,3],[431,3],[432,3],[433,3],[434,3],[435,3],[436,3],[437,3],[438,3],[439,3],[440,3],[441,3],[442,3],[443,3],[444,3],[445,3],[446,3],[447,3],[448,3],[449,3],[450,3],[451,3],[452,3],[453,3],[454,3],[455,3],[456,3],[457,3],[458,3],[459,3],[460,3],[461,3],[462,3],[463,3],[464,3],[465,3],[466,3],[467,3],[468,3],[469,3],[470,3],[471,3],[472,3],[473,3],[474,3],[475,3],[476,3],[477,3],[478,3],[479,3],[480,3],[481,3],[482,3],[483,3],[484,3],[485,3],[486,3],[487,3],[488,3],[489,3],[490,3],[491,3],[492,3],[493,3],[494,3],[495,3],[496,3],[497,3],[498,3],[499,3],[500,3],[501,3],[502,3],[503,3],[504,3],[505,3],[506,3],[507,3],[508,3],[509,3],[510,3],[511,3],[512,3],[513,3],[514,3],[515,3],[516,3],[517,3],[518,3],[519,3],[520,3],[521,3],[522,3],[523,3],[524,3],[209,5],[210,6],[208,7],[211,8],[212,9],[213,10],[214,11],[215,12],[216,13],[217,14],[218,15],[219,16],[220,17],[63,18],[64,18],[103,19],[104,20],[105,21],[106,22],[107,23],[108,24],[109,25],[110,26],[111,27],[112,28],[113,28],[115,29],[114,30],[116,31],[117,32],[118,33],[102,34],[119,35],[120,36],[121,37],[155,38],[122,39],[123,40],[124,41],[125,42],[126,43],[127,44],[128,45],[129,46],[130,47],[131,48],[132,48],[133,49],[136,50],[138,51],[137,52],[139,53],[140,54],[141,55],[142,56],[143,57],[144,58],[145,59],[146,60],[147,61],[148,62],[149,63],[150,64],[151,65],[152,66],[153,67],[206,68],[196,69],[205,70],[204,71],[191,72],[194,73],[180,74],[178,75],[179,76],[167,77],[168,75],[175,78],[166,79],[171,80],[172,81],[177,82],[183,83],[182,84],[165,85],[173,86],[174,87],[169,88],[176,74],[170,89],[158,90],[157,2],[164,91],[80,92],[90,93],[79,92],[100,94],[71,95],[70,96],[99,97],[93,98],[98,99],[73,100],[87,101],[72,102],[96,103],[68,104],[67,105],[97,106],[69,107],[74,108],[78,108],[101,109],[91,110],[82,111],[83,112],[85,113],[81,114],[84,115],[94,97],[76,116],[77,117],[86,118],[66,119],[89,110],[88,108],[95,120],[203,121],[201,122],[202,123],[199,124],[187,125],[184,126],[162,127],[160,128],[161,129],[186,130],[195,71],[207,131]],"latestChangedDtsFile":"./vite.config.d.ts"},"version":"5.5.4"} \ No newline at end of file diff --git a/policeManagement/vite.config.d.ts b/policeManagement/vite.config.d.ts new file mode 100644 index 0000000..089eeef --- /dev/null +++ b/policeManagement/vite.config.d.ts @@ -0,0 +1,2 @@ +declare const _default: import("vite").UserConfigFnObject; +export default _default; diff --git a/policeManagement/vite.config.ts b/policeManagement/vite.config.ts new file mode 100644 index 0000000..06cccca --- /dev/null +++ b/policeManagement/vite.config.ts @@ -0,0 +1,89 @@ +import { defineConfig, loadEnv } from 'vite' +import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite'; +import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'; +import * as path from "node:path"; +import vueJsx from '@vitejs/plugin-vue-jsx' + +// const pathSrc = path.resolve(__dirname, 'src'); + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => { + const env: Record = loadEnv(mode, process.cwd(), '') + return { + define: { + __APP_ENV: JSON.stringify(env) + }, + // base: './', + base: '/policeManagement/', + // base: '/', + + + plugins: [ + vue(), + vueJsx(), + Components({ + resolvers: [ + AntDesignVueResolver({ importStyle: false }) + ] + }) + ], + resolve: { + alias: { + "@": path.resolve(__dirname, './src') + // '@': pathSrc, + // '@': '/src' + } + }, + server: { + host: '0.0.0.0', + port: parseInt(env['VITE_APP_PORT']), + open: false, + proxy: { + [env["VITE_APP_BASE_API"]]: { + target: env["VITE_APP_PROXY_URL"], + changeOrigin: true, + secure: false, + rewrite: path => path.replace(RegExp(`^${env['VITE_APP_BASE_API']}`), '') + } + } + }, + build: { + outDir: 'policeManagement', + target: 'modules', + chunkSizeWarningLimit: 1500, + minify: 'terser', + terserOptions: { + compress: { + //生产环境时移除console + drop_console: env['VITE_DROP_CONSOLE'] as unknown as boolean, + drop_debugger: env['VITE_DROP_CONSOLE'] as unknown as boolean, + }, + format: { + //删除注释 + comments: false + } + }, + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + return id + .toString() + .split('node_modules/')[1] + .split('/')[0] + .toString(); + } + }, + chunkFileNames(chunkInfo) { + const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : []; + const fileName = + facadeModuleId[facadeModuleId.length - 2] || '[name]'; + return `js/${fileName}/[name].[hash].js`; + } + } + } + }, + } + +}) diff --git a/policeSecurityServer/.DS_Store b/policeSecurityServer/.DS_Store new file mode 100644 index 0000000..8ed5856 Binary files /dev/null and b/policeSecurityServer/.DS_Store differ diff --git a/policeSecurityServer/.gitignore b/policeSecurityServer/.gitignore new file mode 100644 index 0000000..30e9ad5 --- /dev/null +++ b/policeSecurityServer/.gitignore @@ -0,0 +1,5 @@ +.idea +target +logs +temp +HELP.md \ No newline at end of file diff --git a/policeSecurityServer/Jenkinsfile b/policeSecurityServer/Jenkinsfile new file mode 100644 index 0000000..040cad9 --- /dev/null +++ b/policeSecurityServer/Jenkinsfile @@ -0,0 +1,56 @@ +pipeline { + agent any + tools { + jdk "jdk-17.0.11" + maven "apache-maven-3.8.8" + } + stages { + stage('拉取代码') { + steps { + echo '开始拉取代码' + checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: '3', url: 'http://175.6.124.250:3100/luozhun/policeSecurity.git']]) + echo '代码拉取成功' + } + } + stage('构建后台服务') { + steps{ + echo '开始构建后台服务' + sh 'cd /var/jenkins_home/workspace/警保联动后端服务/policeSecurityServer && mvn clean -DskipTests=true package -P prod' + echo '后台服务构建完成' + } + } + stage('ssh远程推送代码'){ + steps{ + echo '开始推送构建产物' + script{ + def remote = [:] + remote.name = 'server-118.253.177.137' + remote.host = '118.253.177.137' + remote.port = 55555 + remote.allowAnyHosts = true + withCredentials([usernamePassword(credentialsId: '4', passwordVariable: 'password', usernameVariable: 'username')]) { + remote.user = "${username}" + remote.password = "${password}" + } + sshCommand remote: remote, command: 'pwd=$(pwd) echo "ssh连接成功!当前工作目录:$(pwd)"' + + sshCommand remote: remote, command: 'echo "停止后台服务..."' + sshCommand remote: remote, command: '''docker stop policeSecurityServer''' + sshCommand remote: remote, command: 'echo "后台服务已停止..."' + + sshCommand remote: remote, command: 'echo "删除原来的server.jar..."' + sshRemove remote: remote, path: '/home/javaProject/policeSecurity/policeSecurityServer.jar' + sshCommand remote: remote, command: 'echo "server.jar删除成功!"' + + sshCommand remote: remote, command: 'echo "将构建的server.jar发送到服务器..."' + sshPut remote: remote, from: '/var/jenkins_home/workspace/警保联动后端服务/policeSecurityServer/target/policeSecurityServer.jar', into: '/home/javaProject/policeSecurity' + sshCommand remote: remote, command: 'echo "server.jar发送成功!"' + + sshCommand remote: remote, command: 'echo "启动后台服务..."' + sshCommand remote: remote, command: '''docker start policeSecurityServer''' + sshCommand remote: remote, command: 'echo "后台服务启动成功!"' + } + } + } + } +} \ No newline at end of file diff --git a/policeSecurityServer/pom.xml b/policeSecurityServer/pom.xml new file mode 100644 index 0000000..140472e --- /dev/null +++ b/policeSecurityServer/pom.xml @@ -0,0 +1,356 @@ + + 4.0.0 + + com.changhu + policeSecurityServer + 1.0-SNAPSHOT + jar + + policeSecurityServer + + + 17 + UTF-8 + UTF-8 + 3.2.2 + + 5.8.27 + 4.5.0 + 3.3.3 + 2.5.1 + 2.0.50 + 3.3.4 + 8.0.32 + 3.5.7 + 25.2 + 1.2.20 + 8.4.3 + 4.8.1 + 1.38.0 + 4.6.0 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-logging + + + + org.springframework.boot + spring-boot-starter-json + + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-websocket + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.apache.commons + commons-pool2 + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.projectlombok + lombok + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + ${knife4j.version} + + + + com.alibaba.fastjson2 + fastjson2-extension-spring6 + ${fastjson2.version} + + + + com.alibaba + easyexcel + ${easyexcel.version} + + + + cn.hutool + hutool-all + ${hutool.version} + + + + com.google.zxing + core + ${zxing.version} + + + + com.belerweb + pinyin4j + ${pinyin4j.version} + + + + cn.dev33 + sa-token-spring-boot3-starter + ${sa.token.version} + + + + cn.dev33 + sa-token-redis + ${sa.token.version} + + + + cn.dev33 + sa-token-jwt + ${sa.token.version} + + + cn.hutool + hutool-core + + + cn.hutool + hutool-crypto + + + cn.hutool + hutool-json + + + cn.hutool + hutool-jwt + + + + + + com.mysql + mysql-connector-j + ${mysql.driver.version} + + + + com.alibaba + druid-spring-boot-3-starter + ${druid.version} + + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis.plus.version} + + + + org.geotools + gt-main + ${geotools.version} + + + org.geotools + gt-geojson + ${geotools.version} + + + + io.minio + minio + ${minio.version} + + + com.squareup.okhttp3 + okhttp + ${okhttp.version} + + + + com.github.binarywang + weixin-java-miniapp + ${wx.miniapp.version} + + + + + + osgeo + OSGeo Release Repository + https://repo.osgeo.org/repository/release/ + + false + + + true + + + + osgeo-snapshot + OSGeo Snapshot Repository + https://repo.osgeo.org/repository/snapshot/ + + true + + + false + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + ${maven.compiler.source} + ${maven.compiler.target} + + + -parameters + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + + + repackage + + + + + + + + + + + ${project.basedir}/src/main/resources/${profiles.environment} + + + + ${project.basedir}/src/main/resources/META-INF + META-INF + + + + ${project.basedir}/src/main/resources/static + static + + + + ${project.basedir}/src/main/resources/conf + conf + + + + ${project.basedir}/src/main/resources/mapper + mapper + + + ${project.basedir}/src/main/resources/templates + templates + + + + + + + + dev + + env/dev + + + + true + + + + + + local + + env/local + + + + + + prod + + env/prod + + + + diff --git a/policeSecurityServer/src/main/java/com/changhu/PoliceSecurityServerApp.java b/policeSecurityServer/src/main/java/com/changhu/PoliceSecurityServerApp.java new file mode 100644 index 0000000..3a9559c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/PoliceSecurityServerApp.java @@ -0,0 +1,47 @@ +package com.changhu; + +import cn.hutool.core.util.StrUtil; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.socket.config.annotation.EnableWebSocket; + +import java.net.InetAddress; + +/** + * Hello world! + */ +@Slf4j +@SpringBootApplication +@EnableTransactionManagement +@EnableScheduling +@EnableCaching +@EnableWebSocket +public class PoliceSecurityServerApp { + @SneakyThrows + public static void main(String[] args) { + SpringApplication app = new SpringApplication(PoliceSecurityServerApp.class); + ConfigurableApplicationContext application = app.run(args); + Environment env = application.getEnvironment(); + log.info(StrUtil.format(""" + \n---------------------------------------------------------- + \tApplication '{}' is running! Access URLs: + \tLocal: \t\thttp://localhost:{} + \tExternal: \thttp://{}:{} + \tDoc: \t\thttp://{}:{}/doc.html + """, + env.getProperty("spring.application.name"), + env.getProperty("server.port"), + InetAddress.getLocalHost().getHostAddress(), + env.getProperty("server.port"), + InetAddress.getLocalHost().getHostAddress(), + env.getProperty("server.port") + )); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckOpenApi.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckOpenApi.java new file mode 100644 index 0000000..18f25e1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckOpenApi.java @@ -0,0 +1,17 @@ +package com.changhu.common.annotation; + +import com.changhu.common.enums.OpenApiType; + +import java.lang.annotation.*; + +/** + * @author 20252 + * @createTime 2024/10/9 下午5:14 + * @desc 检查openApi + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface CheckOpenApi { + OpenApiType value(); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java new file mode 100644 index 0000000..0af45e3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java @@ -0,0 +1,28 @@ +package com.changhu.common.annotation; + +import com.changhu.common.db.enums.UserType; +import org.springframework.web.bind.annotation.RestController; + +import java.lang.annotation.*; + +/** + * @author 20252 + * @createTime 2024/9/4 下午4:01 + * @desc 检查访问接口的用户类型 + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@RestController +public @interface CheckUserType { + + /** + * 是否需要校验客户端类型 + */ + boolean value() default true; + + /** + * 需要的客户端类型 + */ + UserType[] userTypes() default {}; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/Desensitized.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/Desensitized.java new file mode 100644 index 0000000..66611fc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/Desensitized.java @@ -0,0 +1,19 @@ +package com.changhu.common.annotation; + +import cn.hutool.core.util.DesensitizedUtil; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * author: luozhun + * desc: 脱敏注解 + * createTime: 2023/9/13 16:45 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Desensitized { + DesensitizedUtil.DesensitizedType value(); +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/IsExtData.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/IsExtData.java new file mode 100644 index 0000000..0a2f145 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/IsExtData.java @@ -0,0 +1,15 @@ +package com.changhu.common.annotation; + +import java.lang.annotation.*; + +/** + * author: luozhun + * desc: 是拓展属性 + * createTime: 2023/11/1 17:25 + */ +@Documented +@Retention(value = RetentionPolicy.RUNTIME) +@Target(value = {ElementType.FIELD}) +public @interface IsExtData { + boolean value() default true; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/JsonBody.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/JsonBody.java new file mode 100644 index 0000000..c53df87 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/JsonBody.java @@ -0,0 +1,18 @@ +package com.changhu.common.annotation; + +import org.springframework.web.bind.annotation.RestController; + +import java.lang.annotation.*; + +/** + * author: luozhun + * desc: JsonResult + * createTime: 2023/8/18 10:47 + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@RestController +public @interface JsonBody { + boolean value() default true; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/RealDelete.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/RealDelete.java new file mode 100644 index 0000000..755883d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/RealDelete.java @@ -0,0 +1,14 @@ +package com.changhu.common.annotation; + +import java.lang.annotation.*; + +/** + * @author 20252 + * @createTime 2024/6/26 上午9:41 + * @desc RealDelete... + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RealDelete { +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/cache/GlobalCacheManager.java b/policeSecurityServer/src/main/java/com/changhu/common/cache/GlobalCacheManager.java new file mode 100644 index 0000000..6738b5a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/cache/GlobalCacheManager.java @@ -0,0 +1,79 @@ +package com.changhu.common.cache; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ReflectUtil; +import com.changhu.common.annotation.IsExtData; +import com.changhu.common.db.BaseEnum; +import com.changhu.common.pojo.vo.SelectNodeVo; +import lombok.extern.slf4j.Slf4j; +import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author 20252 + * @createTime 2024/11/15 上午9:03 + * @desc GlobalCacheManager... + */ +@Slf4j +public class GlobalCacheManager { + /** + * 枚举缓存 + */ + public static final Map, Map, SelectNodeVo>> ENUM_CACHE = new ConcurrentHashMap<>(); + + static { + //初始化枚举数据 + initEnum(); + } + + static void initEnum() { + log.info("初始化枚举字典数据----"); + Set> classes = ClassUtil.scanPackageBySuper("com.changhu.common.db.enums", BaseEnum.class); + Method superSerializer = ClassUtil.getDeclaredMethod(BaseEnum.class, "serializer"); + for (Class aClass : classes) { + Method childrenSerializer = ClassUtil.getDeclaredMethod(aClass, "serializer"); + BaseEnum[] enumConstants = (BaseEnum[]) aClass.getEnumConstants(); + if (enumConstants == null) { + continue; + } + // 获取所有字段 + Field[] fields = aClass.getDeclaredFields(); + // 过滤出非静态字段并带有 IsExtData 注解的字段 + List extDataFields = Arrays.stream(fields) + .filter(field -> !Modifier.isStatic(field.getModifiers())) + .filter(field -> field.getAnnotation(IsExtData.class) != null) + .collect(Collectors.toList()); + + Map, SelectNodeVo> map = new LinkedHashMap<>(); + + Stream.of(enumConstants).forEach(v -> { + //如果子类重写父类的方法 则直接使用子类的结果 + if (!superSerializer.equals(childrenSerializer)) { + map.put(v, v.serializer()); + } else { + SelectNodeVo vo = new SelectNodeVo<>(); + vo.setValue(v.getValue()); + vo.setLabel(v.getLabel()); + if (CollUtil.isNotEmpty(extDataFields)) { + Dict extData = Dict.create(); + for (Field extDataField : extDataFields) { + extData.put(extDataField.getName(), ReflectUtil.getFieldValue(v, extDataField)); + } + vo.setExtData(extData); + } + map.put(v, vo); + } + }); + GlobalCacheManager.ENUM_CACHE.put(aClass, map); + } + log.info("初始化枚举字典数据----完成"); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/BaseEnum.java b/policeSecurityServer/src/main/java/com/changhu/common/db/BaseEnum.java new file mode 100644 index 0000000..df0235a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/BaseEnum.java @@ -0,0 +1,51 @@ +package com.changhu.common.db; + +import cn.hutool.core.util.ObjectUtil; +import com.changhu.common.cache.GlobalCacheManager; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; + +import java.util.Map; + +/** + * author: luozhun + * desc: BaseEnum + * createTime: 2023/8/16 17:38 + */ +public interface BaseEnum { + + /** + * 获取值 + * + * @return V + */ + V getValue(); + + /** + * 获取文本 + * + * @return string + */ + String getLabel(); + + @SuppressWarnings("unchecked") + static > T valueOf(Class> enumType, P code) { + Map, SelectNodeVo> nodeVoMap = GlobalCacheManager.ENUM_CACHE.get(enumType); + for (Map.Entry, SelectNodeVo> mapEntry : nodeVoMap.entrySet()) { + if (ObjectUtil.equals(code, mapEntry.getValue().getValue())) { + return (T) mapEntry.getKey(); + } + } + throw new MessageException("不存在值为:{} 的【{}】对象!", code.toString(), enumType.componentType().getSimpleName()); + } + + @SuppressWarnings("unchecked") + default SelectNodeVo serializer() { + Map, SelectNodeVo> map = GlobalCacheManager.ENUM_CACHE.get(this.getClass()); + if (map != null) { + return (SelectNodeVo) map.get(this); + } + return null; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/CheckStatus.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/CheckStatus.java new file mode 100644 index 0000000..b52332d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/CheckStatus.java @@ -0,0 +1,27 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.annotation.IsExtData; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/8/28 下午3:51 + * @desc CheckStatus... + */ +@Getter +@AllArgsConstructor +public enum CheckStatus implements BaseEnum, IEnum { + + checked(0, "已审核", "success"), + unChecked(1, "未审核", "error"), + ; + + private final Integer value; + private final String label; + @IsExtData + private final String color; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/DeleteFlag.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/DeleteFlag.java new file mode 100644 index 0000000..bc77c58 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/DeleteFlag.java @@ -0,0 +1,24 @@ +package com.changhu.common.db.enums; + +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: DeleteFlag + * createTime: 2023/8/16 17:39 + */ +@Getter +@AllArgsConstructor +public enum DeleteFlag implements BaseEnum { + + FALSE(0, "未删除"), + TRUE(1, "已删除"), + ; + + private final Integer value; + private final String label; + +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java new file mode 100644 index 0000000..91a36c4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java @@ -0,0 +1,54 @@ +package com.changhu.common.db.enums; + +import cn.hutool.core.lang.Dict; +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.annotation.IsExtData; +import com.changhu.common.db.BaseEnum; +import com.changhu.common.pojo.vo.SelectNodeVo; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/11/5 下午4:22 + * @desc EnterprisesUnitType... + */ +@Getter +@AllArgsConstructor +public enum EnterprisesUnitType implements BaseEnum, IEnum { + + party_government("party_government", "党政机关", "party_government.png"), + medical("medical", "医疗机构", "medical.png"), + residential("residential", "小区", "residential.png"), + higher_learning("higher_learning", "高等院校", "higher_learning.png"), + primary_and_secondary("primary_and_secondary", "中小学幼儿园", "primary_and_secondary.png"), + shopping_supermarkets("shopping_supermarkets", "商场超市", "shopping_supermarkets.png"), + financial("financial", "金融机构", "financial.png"), + hydropower("hydropower", "水电油气", "hydropower.png"), + key_projects("key_projects", "重点工程建设单位", "key_projects.png"), + delivery_logistics("delivery_logistics", "寄递物流", "delivery_logistics.png"), + military("military", "军工、科研单位", "military.png"), + wen_bo("wen_bo", "文博单位", "wen_bo.png"), + important_news("important_news ", "重要新闻单位", "important_news.png"), + large_scale_material("large_scale_material ", "大型物资储备", "large_scale_material.png"), + transportation("transportation", "交通运输企业", "transportation.png"), + industrial_park("industrial_park", "工业园区企业", "industrial_park.png"), + complex_public_security("complex_public_security", "治安复杂场所", "complex_public_security.png"), + making_explosive_easily("making_explosive_easily ", "易制爆", "making_explosive_easily.png"), + hazardous_materials("hazardous_materials ", "危化物品存放场所", "hazardous_materials.png"), + other("other", "其他单位", "other.png"); + + private final String value; + private final String label; + @IsExtData + private final String icon; + + @Override + public SelectNodeVo serializer() { + return SelectNodeVo.builder() + .value(this.getValue()) + .label(this.getLabel()) + .extData(Dict.of("icon", "/resources/icon/gaode/marker/" + this.icon)) + .build(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/IsEnable.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/IsEnable.java new file mode 100644 index 0000000..5244f02 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/IsEnable.java @@ -0,0 +1,27 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.annotation.IsExtData; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: IsEnable + * createTime: 2023/8/22 9:52 + */ +@Getter +@AllArgsConstructor +public enum IsEnable implements BaseEnum, IEnum { + + TRUE(0, "启用", "success"), + FALSE(1, "禁用", "error"), + ; + + private final Integer value; + private final String label; + @IsExtData + private final String color; + +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/IsOrNot.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/IsOrNot.java new file mode 100644 index 0000000..7472b62 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/IsOrNot.java @@ -0,0 +1,23 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: IsOrNot + * createTime: 2023/9/21 16:42 + */ +@Getter +@AllArgsConstructor +public enum IsOrNot implements BaseEnum, IEnum { + IS(0, "是"), + NOT(1, "否"), + ; + + private final Integer value; + private final String label; +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/MiniProgramUserIdentity.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/MiniProgramUserIdentity.java new file mode 100644 index 0000000..f4d97ce --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/MiniProgramUserIdentity.java @@ -0,0 +1,22 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/9/5 上午11:50 + * @desc MiniProgramUserIdentity... + */ +@AllArgsConstructor +@Getter +public enum MiniProgramUserIdentity implements BaseEnum, IEnum { + + POLICE("police", "公安"), + PROJECT_MANAGER("project_manager", "项目经理"); + + private final String value; + private final String label; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java new file mode 100644 index 0000000..abdc606 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java @@ -0,0 +1,25 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: 单选或多选 + * createTime: 2023/8/16 17:39 + */ +@Getter +@AllArgsConstructor +public enum SelectType implements BaseEnum, IEnum { + + RADIO("radio", "单选"), + MULTIPLE("multiple", "多选"), + ; + + private final String value; + private final String label; + +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/ServiceProjectType.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/ServiceProjectType.java new file mode 100644 index 0000000..d7d3961 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/ServiceProjectType.java @@ -0,0 +1,24 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/9/5 上午11:04 + * @desc 服务项目类型 + */ +@AllArgsConstructor +@Getter +public enum ServiceProjectType implements BaseEnum, IEnum { + + SECURITY("security", "安保"), + PROPERTY("property", "物业"), + ; + + + private final String value; + private final String label; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/Sex.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/Sex.java new file mode 100644 index 0000000..066664c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/Sex.java @@ -0,0 +1,24 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * fileName: Sex + * author: LuoZhun + * createTime: 2023/11/8 17:14 + * description: 性别 + */ +@Getter +@AllArgsConstructor +public enum Sex implements BaseEnum, IEnum { + MAN(0, "男"), + WOMAN(1, "女"), + UNKNOWN(2, "隐藏"); + + private final Integer value; + private final String label; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/UserType.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/UserType.java new file mode 100644 index 0000000..5a8d11e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/UserType.java @@ -0,0 +1,24 @@ +package com.changhu.common.db.enums; + +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/9/6 上午11:13 + * @desc UserType... + */ +@AllArgsConstructor +@Getter +public enum UserType implements BaseEnum { + MANAGEMENT_POLICE("management_police", "公安后台用户"), + MANAGEMENT_SECURITY("management_security", "保安后台用户"), + MANAGEMENT_SUPER("management_super", "超级后台用户"), + + MINI_PROGRAM_POLICE("mini_program_police", "小程序公安用户"), + MINI_PROGRAM_PROJECT_MANAGE("mini_program_project_manage", "小程序项目经理"); + + private final String value; + private final String label; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/enums/CaptchaType.java b/policeSecurityServer/src/main/java/com/changhu/common/enums/CaptchaType.java new file mode 100644 index 0000000..ffe961b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/enums/CaptchaType.java @@ -0,0 +1,21 @@ +package com.changhu.common.enums; + +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: CaptchaType + * createTime: 2023/9/19 19:15 + */ +@Getter +@AllArgsConstructor +public enum CaptchaType implements BaseEnum { + + LOGIN("login", "登录验证码"), + ; + + private final String value; + private final String label; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/enums/OpenApiType.java b/policeSecurityServer/src/main/java/com/changhu/common/enums/OpenApiType.java new file mode 100644 index 0000000..db2de04 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/enums/OpenApiType.java @@ -0,0 +1,22 @@ +package com.changhu.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/10/9 下午5:10 + * @desc OpenApiType... + */ +@Getter +@AllArgsConstructor +public enum OpenApiType { + Information_on_enterprises_and_institutions("获取企事业单位信息", Arrays.asList("1fe0aaf3-45a4-4be3-a989-75e914a3f36e", "1fe0aaf3-45a4-a989-75e914a3f36e")), + data_view("数据总览", List.of("8da74bbf-c686-4393-b4ec-692091e6d381")); + + private final String desc; + private final List openApiKeys; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/enums/ResultCode.java b/policeSecurityServer/src/main/java/com/changhu/common/enums/ResultCode.java new file mode 100644 index 0000000..bbade1b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/enums/ResultCode.java @@ -0,0 +1,62 @@ +package com.changhu.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: ResultCode + * createTime: 2023/8/16 17:30 + */ +@Getter +@AllArgsConstructor +public enum ResultCode { + /** + * 常见状态码 + */ + SUCCESS(200, "操作成功!"), + ERROR(500, "操作失败!"), + WARN(555, "出现警告!"), + + /** + * 权限相关 -1错误需要重新返回登录页面 进行认证 + */ + NOT_TOKEN(-1, "未能读取到有效 token"), + INVALID_TOKEN(-1, "token 无效"), + TOKEN_TIMEOUT(-1, "token 已过期"), + BE_REPLACED(-1, "token 已被顶下线"), + KICK_OUT(-1, "token 已被踢下线"), + TOKEN_FREEZE(-1, "token 已被冻结"), + NO_PREFIX(-1, "未按照指定前缀提交 token"), + OTHER_TOKEN_ERROR(-1, "当前会话未登录"), + + + /** + * 加密解密 + */ + DECRYPT_ERROR(301, "解码失败"), + ENCIPHER_ERROR(302, "编码失败"), + + /** + * 系统相关 + */ + USER_NOT_FOUND(402, "用户不存在"), + PASSWORD_ERROR(403, "密码错误"), + NOT_FOUND_404(404, "找不到资源"), + USER_IS_DISABLE(405, "用户已禁用"), + ROLE_IS_DISABLE(405, "角色已禁用"), + CODE_ERROR(406, "验证码错误"), + DATA_NOT_FOUND(407, "数据不存在"), + + + /** + * 参数校验 + */ + PARAM_ERROR(502, "参数错误"), + REQUIRED_PARAM_MISSING(503, "未找到必填参数"), + + ; + + private final Integer code; + private final String message; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/exception/MessageException.java b/policeSecurityServer/src/main/java/com/changhu/common/exception/MessageException.java new file mode 100644 index 0000000..bb29525 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/exception/MessageException.java @@ -0,0 +1,71 @@ +package com.changhu.common.exception; + +import cn.hutool.core.util.StrUtil; +import com.changhu.common.enums.ResultCode; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Arrays; +import java.util.Objects; + +/** + * author: luozhun + * desc: MessageException + * createTime: 2023/8/16 17:27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class MessageException extends RuntimeException { + + private Integer code = ResultCode.ERROR.getCode(); + private String message = ResultCode.ERROR.getMessage(); + private Object data; + + public MessageException(String errorMessage) { + this.message = errorMessage; + } + + public MessageException(Integer errorCode, String errorMessage) { + this.code = errorCode; + this.message = errorMessage; + } + + public MessageException(Integer errorCode, String template, String... errorMessage) { + this.code = errorCode; + this.message = StrUtil.format(template, Arrays.stream(errorMessage).toArray()); + } + + public MessageException(String template, String... errorMessage) { + this.message = StrUtil.format(template, Arrays.stream(errorMessage).toArray()); + } + + public MessageException(ResultCode resultCode, String errorMessage) { + this.code = resultCode.getCode(); + this.message = errorMessage; + } + + public MessageException(ResultCode resultCode, Object data, String errorMessage) { + this.code = resultCode.getCode(); + this.message = errorMessage; + this.data = data; + } + + public MessageException(ResultCode resultCode, Object data) { + this.code = resultCode.getCode(); + this.data = data; + } + + public MessageException(ResultCode resultCode) { + this.code = resultCode.getCode(); + this.message = resultCode.getMessage(); + } + + public MessageException() { + + } + + @Override + public String toString() { + return StrUtil.format("业务错误:错误代码:{},错误内容:{}", Objects.isNull(this.code) ? 500 : this.code, this.message); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/pojo/model/JsonResult.java b/policeSecurityServer/src/main/java/com/changhu/common/pojo/model/JsonResult.java new file mode 100644 index 0000000..1c84e42 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/pojo/model/JsonResult.java @@ -0,0 +1,117 @@ +package com.changhu.common.pojo.model; + +import com.changhu.common.enums.ResultCode; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * author: luozhun + * desc: JsonResult + * createTime: 2023/8/16 17:29 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class JsonResult implements java.io.Serializable { + + /** + * 响应编码 + */ + private Integer code; + + /** + * 返回消息 + */ + private String message; + + /** + * 返回数据 + */ + private T data; + + public JsonResult(Integer code, String message) { + this.code = code; + this.message = message; + } + + public JsonResult(ResultCode resultCode, T data) { + this.code = resultCode.getCode(); + this.message = resultCode.getMessage(); + this.data = data; + } + + /** + * 成功信息 + */ + public static JsonResult success() { + return new JsonResult<>(ResultCode.SUCCESS, null); + } + + public static JsonResult successMsg(String message) { + return new JsonResult<>(ResultCode.SUCCESS.getCode(), message); + } + + public static JsonResult success(O data) { + return new JsonResult<>(ResultCode.SUCCESS, data); + } + + /** + * 操作失败 + */ + public static JsonResult error() { + return new JsonResult<>(ResultCode.ERROR, null); + } + + public static JsonResult errorMsg(String message) { + return new JsonResult<>(ResultCode.ERROR.getCode(), message); + } + + public static JsonResult error(O data) { + return new JsonResult<>(ResultCode.ERROR, data); + } + + /** + * 警告信息 + */ + public static JsonResult warn() { + return new JsonResult<>(ResultCode.WARN, null); + } + + public static JsonResult warnMsg(String message) { + return new JsonResult<>(ResultCode.WARN.getCode(), message); + } + + public static JsonResult warn(O data) { + return new JsonResult<>(ResultCode.WARN, data); + } + + /** + * 自定义信息 + */ + public static JsonResult custom(Integer code, String message, O data) { + return new JsonResult<>(code, message, data); + } + + public static JsonResult custom(Integer code, String message) { + return new JsonResult<>(code, message, null); + } + + public static JsonResult custom(ResultCode resultCode) { + return new JsonResult<>(resultCode, null); + } + + public static JsonResult custom(ResultCode resultCode, O data) { + return new JsonResult<>(resultCode, data); + } + + public static JsonResult custom(Boolean result) { + return new JsonResult<>(result ? ResultCode.SUCCESS : ResultCode.ERROR, null); + } + + public static JsonResult custom(Integer count) { + return new JsonResult<>(count > 0 ? ResultCode.SUCCESS : ResultCode.ERROR, null); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/CreateOrUpdateUser.java b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/CreateOrUpdateUser.java new file mode 100644 index 0000000..e6dd8fe --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/CreateOrUpdateUser.java @@ -0,0 +1,20 @@ +package com.changhu.common.pojo.vo; + +import com.changhu.common.db.enums.UserType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/12 下午3:27 + * @desc 通过视图去找出数据创建人 + */ +@Data +public class CreateOrUpdateUser { + @Schema(description = "用户id") + private Long snowFlakeId; + @Schema(description = "用户名字") + private String name; + @Schema(description = "用户类型") + private UserType type; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/SelectGroupNodeVo.java b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/SelectGroupNodeVo.java new file mode 100644 index 0000000..e520e55 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/SelectGroupNodeVo.java @@ -0,0 +1,40 @@ +package com.changhu.common.pojo.vo; + +import cn.hutool.core.lang.Dict; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * author: luozhun + * desc: SelectNodeVo + * createTime: 2023/9/22 9:53 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SelectGroupNodeVo implements Serializable { + /** + * 选择的值 + */ + private T value; + /** + * 显示文本 + */ + private String label; + + /** + * 分组选项 + */ + private List> options; + + /** + * 拓展属性 + */ + private Dict extData; +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/SelectNodeVo.java b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/SelectNodeVo.java new file mode 100644 index 0000000..84919ca --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/SelectNodeVo.java @@ -0,0 +1,33 @@ +package com.changhu.common.pojo.vo; + +import cn.hutool.core.lang.Dict; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * author: luozhun + * desc: SelectNodeVo + * createTime: 2023/9/22 9:53 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SelectNodeVo implements Serializable { + /** + * 选择的值 + */ + private T value; + /** + * 显示文本 + */ + private String label; + /** + * 拓展属性 + */ + private Dict extData; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/TokenInfo.java b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/TokenInfo.java new file mode 100644 index 0000000..e8b8aae --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/TokenInfo.java @@ -0,0 +1,32 @@ +package com.changhu.common.pojo.vo; + +import cn.hutool.core.lang.Dict; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/8/29 下午2:55 + * @desc TokenInfo... + */ +@Data +public class TokenInfo { + + @Schema(description = "token的名字") + private String name; + @Schema(description = "token的值") + private String value; + @Schema(description = "拓展属性") + private Dict extData; + + public TokenInfo(String name, String value) { + this.name = name; + this.value = value; + } + + public TokenInfo(String name, String value, Dict dict) { + this.name = name; + this.value = value; + this.extData = dict; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/TreeNodeVo.java b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/TreeNodeVo.java new file mode 100644 index 0000000..96a7780 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/pojo/vo/TreeNodeVo.java @@ -0,0 +1,184 @@ +package com.changhu.common.pojo.vo; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.lang.NonNull; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * author: luozhun + * desc: TreeNodeVo + * createTime: 2023/9/4 16:38 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(description = "json树形数据") +public class TreeNodeVo implements Serializable { + /** + * 值 + */ + @Schema(description = "节点的唯一value") + private T value; + /** + * 父节点的值 + */ + @Schema(description = "父节点的value") + private T parentValue; + /** + * 显示文本 + */ + @Schema(description = "节点名称") + private String label; + /** + * 是否是叶子节点 + */ + @Schema(description = "是否是叶子节点") + private Boolean isLeaf; + /** + * 排序 + */ + @Builder.Default + @Schema(description = "排序") + private Integer orderIndex = 0; + /** + * 拓展属性 + */ + @Schema(description = "拓展属性") + private Dict extData; + /** + * 子节点 + */ + @Schema(description = "子节点") + private List> children; + + /** + * 树构建 + */ + public static List> buildTree(List> data, @NonNull T rootKey) { + //数据为空 直接返回空 + if (CollUtil.isEmpty(data)) { + return new ArrayList<>(); + } + //先将数据根据parentValue分组 + Map>> groupData = data.stream().collect(Collectors.groupingBy(TreeNodeVo::getParentValue)); + //组装树 + return data.stream() + .filter(e -> ObjectUtil.equals(e.getParentValue(), rootKey)) + .peek(d -> d.setChildren(children(groupData, d))) + .sorted((a, b) -> NumberUtil.compare(b.getOrderIndex(), a.getOrderIndex())) + .collect(Collectors.toList()); + } + + private static List> children(Map>> groupData, TreeNodeVo node) { + List> treeNodeVos = groupData.get(node.getValue()); + if (CollUtil.isEmpty(treeNodeVos)) { + return null; + } + return treeNodeVos.stream() + .peek(p -> p.setChildren(children(groupData, p))) + .sorted((a, b) -> NumberUtil.compare(b.getOrderIndex(), a.getOrderIndex())) + .toList(); + } + + /** + * 自定义树构建 + */ + public static List> buildTree(List data, @NonNull String key, @NonNull String parentKey, @NonNull T rootKey) { + if (CollUtil.isEmpty(data)) { + return new ArrayList<>(); + } + //先将数据转 对象为map + List> mapListData = data.stream().map(BeanUtil::beanToMap).toList(); + //将map集合根据parentKey分组 + Map>> collect = mapListData.stream().collect(Collectors.groupingBy(e -> e.get(parentKey))); + + return mapListData.stream() + .filter(e -> ObjectUtil.equals(e.get(parentKey), rootKey)) + .peek(e -> e.put("children", children(collect, e, key))) + .collect(Collectors.toList()); + } + + private static List> children(Map>> groupData, Map node, String key) { + List> treeNodeVos = groupData.get(node.get(key)); + if (CollUtil.isEmpty(treeNodeVos)) { + return null; + } + + return treeNodeVos.stream() + .peek(p -> p.put("children", children(groupData, p, key))) + .toList(); + } + + /** + * 生成随机字符串 + * + * @param len 长度 + * @param fun 校验方法 + */ + public static String generateCode(Integer len, Function fun) { + StringBuilder sb = new StringBuilder(); + // 生成三位字符串 + for (int i = 0; i < len; i++) { + // 生成随机索引,范围是0到35(26个字母加10个数字) + int index = (int) (Math.random() * 36); + char ch; + if (index < 26) { + // 生成字母 + ch = (char) ('a' + index); // 将索引转换为字母 + } else { + // 生成数字 + ch = (char) ('0' + (index - 26)); // 将索引转换为数字 + } + sb.append(ch); // 将生成的字符添加到字符串中 + } + String result = sb.toString(); + boolean b = fun.apply(result); + if (b) { + result = generateCode(len, fun); + } + return result; + } + + /** + * 生成随机字符串 + * + * @param fun 校验方法 + */ + public static String generateCode(Function fun) { + return generateCode(3, fun); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + TreeNodeVo that = (TreeNodeVo) o; + return Objects.equals(value, that.value) && Objects.equals(label, that.label); + } + + @Override + public int hashCode() { + return Objects.hash(value, label); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/properties/Fastjson2Properties.java b/policeSecurityServer/src/main/java/com/changhu/common/properties/Fastjson2Properties.java new file mode 100644 index 0000000..3917461 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/properties/Fastjson2Properties.java @@ -0,0 +1,17 @@ +package com.changhu.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * author: luozhun + * desc: some... + * createTime: 2023/12/15 10:43 + */ +@Data +@Component +@ConfigurationProperties(prefix = "project.fastjson2") +public class Fastjson2Properties { + private String dateFormat; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/properties/ProjectEnv.java b/policeSecurityServer/src/main/java/com/changhu/common/properties/ProjectEnv.java new file mode 100644 index 0000000..b94d615 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/properties/ProjectEnv.java @@ -0,0 +1,21 @@ +package com.changhu.common.properties; + +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: some... + * createTime: 2023/11/29 15:34 + */ +@Getter +@AllArgsConstructor +public enum ProjectEnv implements BaseEnum { + + DEV("开发环境", "dev"), + PROD("生产环境", "prod"); + + private final String label; + private final String value; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/properties/ProjectProperties.java b/policeSecurityServer/src/main/java/com/changhu/common/properties/ProjectProperties.java new file mode 100644 index 0000000..09f8f07 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/properties/ProjectProperties.java @@ -0,0 +1,33 @@ +package com.changhu.common.properties; + +import com.changhu.common.exception.MessageException; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +/** + * author: luozhun + * desc: some... + * createTime: 2023/11/29 15:42 + */ +@Slf4j +@Data +@Component +@ConfigurationProperties(prefix = "project") +public class ProjectProperties { + /** + * 项目运行环境 + */ + private ProjectEnv env; + + @Bean + public ProjectEnv projectEnv() { + if (env == null) { + throw new MessageException("当前环境没有配置【projectEnv】请配置"); + } + log.info("当前运行环境:【{} ({})】", env.getValue(), env.getLabel()); + return env; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/properties/ThreadProperties.java b/policeSecurityServer/src/main/java/com/changhu/common/properties/ThreadProperties.java new file mode 100644 index 0000000..e26a1c6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/properties/ThreadProperties.java @@ -0,0 +1,36 @@ +package com.changhu.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * author: luozhun + * desc: some... + * createTime: 2023/12/15 10:46 + */ +@Data +@Component +@ConfigurationProperties(prefix = "project.thread-pool") +public class ThreadProperties { + /** + * 线程名字前缀 + */ + private String threadNamePrefix; + /** + * 核心线程数 + */ + private Integer corePoolSize; + /** + * 最大线程数 + */ + private Integer maxPoolSize; + /** + * 阻塞队列容量 + */ + private Integer queueCapacity; + /** + * 空闲线程存活时间 + */ + private Integer keepAliveSeconds; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/AesUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/AesUtil.java new file mode 100644 index 0000000..8d95d30 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/AesUtil.java @@ -0,0 +1,64 @@ +package com.changhu.common.utils; + +import cn.hutool.crypto.Mode; +import cn.hutool.crypto.Padding; +import cn.hutool.crypto.symmetric.AES; +import cn.hutool.setting.Setting; +import cn.hutool.setting.SettingUtil; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import lombok.extern.slf4j.Slf4j; + +import java.nio.charset.StandardCharsets; + +/** + * author: luozhun + * desc: 加密解密工具 + * createTime: 2023/8/19 12:21 + */ +@Slf4j +public class AesUtil { + + /** + * 配置文件 + */ + private static final Setting setting = SettingUtil.get("aes"); + + /** + * AES实例 + */ + private static final AES aes = new AES( + Mode.CBC, + Padding.PKCS5Padding, + setting.getStr("secretKey").getBytes(StandardCharsets.UTF_8), + setting.getStr("secretIv").getBytes(StandardCharsets.UTF_8) + ); + + /** + * 加密 明文 -> 密文 + * + * @param text 加密字符串 + * @return 加密的结果 + */ + public static String encrypt(String text) { + try { + return aes.encryptHex(text); + } catch (Exception e) { + log.error("加密失败: {}", e.getMessage()); + throw new MessageException(ResultCode.ENCIPHER_ERROR); + } + } + + /** + * 解密: 密文 -> 明文 + */ + public static String decrypt(String cipherString) { + try { + return aes.decryptStr(cipherString); + } catch (Exception e) { + log.error("解密失败: {}", e.getMessage()); + throw new MessageException(ResultCode.DECRYPT_ERROR); + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java new file mode 100644 index 0000000..fc330d7 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java @@ -0,0 +1,428 @@ +package com.changhu.common.utils; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.exception.MessageException; +import lombok.extern.slf4j.Slf4j; +import org.geotools.geojson.geom.GeometryJSON; +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; +import org.geotools.referencing.GeodeticCalculator; +import org.locationtech.jts.geom.*; +import org.locationtech.jts.io.ParseException; +import org.locationtech.jts.io.WKBReader; +import org.locationtech.jts.io.WKTReader; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import java.awt.geom.Point2D; +import java.io.IOException; +import java.io.StringReader; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.List; +import java.util.Objects; + +/** + * author: luozhun + * desc: GeometryUtil + * createTime: 2023/8/25 18:03 + */ +@Slf4j +public class GeometryUtil { + + /** + * - WGS 84(srid=4326):用于全球地理坐标系统的标准参考坐标系。 + * - 美国地理参考系统(srid=4269):用于美国本土的地图和地理数据。 + * - 欧洲地理参考系统(srid=4258):用于欧洲地图和地理数据。 + * - 中国国家大地坐标系(srid=4490):用于中国的地图和地理数据。 + */ + public static final int SRID = 4326; + public static final String ST_GeomFromText = StrUtil.format("ST_GeomFromText({},{},{})", "?", SRID, "'axis-order=long-lat'"); + private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory(new PrecisionModel(), SRID); + private static final GeometryFactory LOCATION_TECH_GEOMETRY_FACTORY = new GeometryFactory(new PrecisionModel(), SRID); + + /** + * 空对象,因为简历空间索引不能为空 Mysql 不支持创建 Empty 的数据 这里自定义一个类型 标识为null + */ + public static Point emptyPoint() { + return createPoint("POINT(0 0)"); + } + + public static Polygon emptyPolygon() { + return createPolygon("POLYGON((0 0, 0 0, 0 0, 0 0))"); + } + + public static LineString emptyLineString() { + return createLineString("LINESTRING(0 0, 0 0)"); + } + + public static MultiPoint emptyMultiPoint() { + return createMultiPoint("MULTIPOINT((0 0))"); + } + + public static MultiPolygon emptyMultiPolygon() { + return createMultiPolygon("MULTIPOLYGON(((0 0, 0 0, 0 0, 0 0)))"); + } + + public static MultiLineString emptyMultiLineString() { + return createMultiLineString("MULTILINESTRING(((0 0, 0 0)))"); + } + + + public static boolean equals(Geometry geometry1, Geometry geometry2) { + return StrUtil.equals(geometry1.toText(), geometry2.toText()); + } + + //** 点 **\\ + + /** + * 创建点对象 + */ + public static Point createPoint(List param) { + if (param == null) { + return null; + } + BigDecimal longitude = param.get(0); + BigDecimal latitude = param.get(1); + if (longitude == null || latitude == null) { + return null; + } + Coordinate coordinate = new Coordinate(longitude.doubleValue(), latitude.doubleValue()); + return GEOMETRY_FACTORY.createPoint(coordinate); + } + + public static Point createPoint(double longitude, double latitude) { + Coordinate coordinate = new Coordinate(longitude, latitude); + return GEOMETRY_FACTORY.createPoint(coordinate); + } + + /** + * 从WKT创建点对象 + * + * @param wkt 注WKT类似: POINT(109.013388 32.715519) + */ + public static Point createPoint(String wkt) { + return createGeometryFromWkt(wkt, Point.class); + } + + /** + * 从WKT创建点对象 + * + * @param bytes 数据库二进制数据 + */ + public static Point createPoint(byte[] bytes) { + return createGeometryFromBytes(bytes, Point.class); + } + + + //** 多边形 **\\ + + /** + * 创建多边形对象 + *

+ * 注:后面可能考虑兼容折线类型,如果是折线类型那么需要规范首尾结点要相同才能构成 polygon 否则构成 polyline + * 目前暂时没有做这方面的规划,用代码兼容了首尾不相等的情况构成polygon + */ + public static Polygon createPolygon(List> params) { + if (params == null || params.size() < 4) { + throw new MessageException("构成多边形至少需要三个有效坐标,并且保证尾部坐标和首部坐标相同"); + } + // 检测首尾是否相等,不相等则补充尾坐标 + List startPoint = params.get(0); + List entPoint = params.get(params.size() - 1); + if (!Objects.equals(startPoint.get(0), entPoint.get(0)) + || !Objects.equals(startPoint.get(1), entPoint.get(1))) { + params.add(params.get(0)); + } + Coordinate[] coordinates = convertBigDecimalList2CoordinateArray(params); + return GEOMETRY_FACTORY.createPolygon(coordinates); + } + + public static Polygon createPolygonWithDouble(List> params) { + if (params == null || params.size() < 4) { + throw new MessageException("构成多边形至少需要三个有效坐标,并且保证尾部坐标和首部坐标相同"); + } + // 检测首尾是否相等,不相等则补充尾坐标 + List startPoint = params.get(0); + List entPoint = params.get(params.size() - 1); + if (!Objects.equals(startPoint.get(0), entPoint.get(0)) + || !Objects.equals(startPoint.get(1), entPoint.get(1))) { + params.add(params.get(0)); + } + Coordinate[] coordinates = convertDoubleList2CoordinateArray(params); + return GEOMETRY_FACTORY.createPolygon(coordinates); + } + + /** + * 从WKT创建多边形对象 + * + * @param wkt 注WKT类似:POLYGON((20 10, 30 0, 40 10, 30 20, 20 10)) + */ + public static Polygon createPolygon(String wkt) { + return createGeometryFromWkt(wkt, Polygon.class); + } + + /** + * 创建多边形对象 + * + * @param bytes 数据库二进制数据 + */ + public static Polygon createPolygon(byte[] bytes) { + return createGeometryFromBytes(bytes, Polygon.class); + } + + //** 折线 **\\ + + /** + * 创建折线对象 + */ + public static LineString createLineString(List> params) { + if (params == null || params.size() < 2) { + throw new MessageException("构成折线至少需要两个有效坐标"); + } + Coordinate[] coordinates = convertBigDecimalList2CoordinateArray(params); + return GEOMETRY_FACTORY.createLineString(coordinates); + } + + /** + * 从 wkt 创建折线对象 + */ + public static LineString createLineString(String wkt) { + return createGeometryFromWkt(wkt, LineString.class); + } + + /** + * 从 bytes 创建折线对象 + */ + public static LineString createLineString(byte[] bytes) { + return createGeometryFromBytes(bytes, LineString.class); + } + + + //** 多点 **\\ + + /** + * 创建多点对象 + */ + public static MultiPoint createMultiPoint(List> multiParam) { + int size = multiParam.size(); + Point[] points = new Point[size]; + for (int i = 0; i < size; i++) { + points[i] = createPoint(multiParam.get(i)); + } + return GEOMETRY_FACTORY.createMultiPoint(points); + } + + + /** + * 从 wkt 创建多点对象 + */ + public static MultiPoint createMultiPoint(String wkt) { + return createGeometryFromWkt(wkt, MultiPoint.class); + } + + + /** + * 从 bytes 创建多点对象 + */ + public static MultiPoint createMultiPoint(byte[] bytes) { + return createGeometryFromBytes(bytes, MultiPoint.class); + } + + + //** 多折线 **\\ + + /** + * 创建多折线对象 + */ + public static MultiLineString createMultiLineString(List>> multiParams) { + int size = multiParams.size(); + LineString[] lineStrings = new LineString[size]; + for (int i = 0; i < size; i++) { + lineStrings[i] = createLineString(multiParams.get(i)); + } + return GEOMETRY_FACTORY.createMultiLineString(lineStrings); + } + + /** + * 从 wkt 创建多折线对象 + */ + public static MultiLineString createMultiLineString(String wkt) { + return createGeometryFromWkt(wkt, MultiLineString.class); + } + + /** + * 从 wkt 创建多折线对象 + */ + public static MultiLineString createMultiLineString(byte[] bytes) { + return createGeometryFromBytes(bytes, MultiLineString.class); + } + + //** 多多边形 **\\ + + /** + * 创建多多边形 + */ + public static MultiPolygon createMultiPolygon(List>> multiParams) { + int size = multiParams.size(); + Polygon[] polygons = new Polygon[size]; + for (int i = 0; i < size; i++) { + polygons[i] = createPolygon(multiParams.get(i)); + } + return GEOMETRY_FACTORY.createMultiPolygon(polygons); + } + + /** + * 从 wkt 创建多多边形 + */ + public static MultiPolygon createMultiPolygon(String wkt) { + return createGeometryFromWkt(wkt, MultiPolygon.class); + } + + /** + * 从 bytes 创建多多边形 + */ + public static MultiPolygon createMultiPolygon(byte[] bytes) { + return createGeometryFromBytes(bytes, MultiPolygon.class); + } + + //** 通用工具 **\\ + + + /** + * bytes 创建空间对象 + * + * @param bytes 数据库的二进制数据 + */ + public static T createGeometryFromBytes(byte[] bytes, Class clazz) { + if (bytes == null) { + return null; + } + try { + WKBReader wkbReader = new WKBReader(GEOMETRY_FACTORY); + byte[] geomBytes = ByteBuffer.allocate(bytes.length - 4).order(ByteOrder.LITTLE_ENDIAN) + .put(bytes, 4, bytes.length - 4).array(); + Geometry geometry = wkbReader.read(geomBytes); + return Convert.convert(clazz, geometry); + } catch (Exception e) { + throw new MessageException("从 Bytes 创建空间对象 {} 时出现错误:{}", clazz.getSimpleName(), e.getMessage()); + } + } + + /** + * 从 wkt 创建空间对象 + * + * @param wkt 类似:POLYGON((20 10, 30 0, 40 10, 30 20, 20 10)) , POINT(109.013388 32.715519) 等 + * @param clazz 继承 + */ + public static T createGeometryFromWkt(String wkt, Class clazz) { + if (wkt == null || StrUtil.isBlank(wkt)) { + return null; + } + try { + WKTReader reader = new WKTReader(GEOMETRY_FACTORY); + Geometry geometry = reader.read(wkt); + return Convert.convert(clazz, geometry); + } catch (ParseException e) { + throw new MessageException("从WKT创建空间对象 {} 时出现错误。wkt:{}", clazz.getSimpleName(), wkt); + } + } + + /** + * 从 GeoJson 创建空间对象 + */ + public static T createGeometryFromGeoJson(String geoJson, Class clazz) { + try { + GeometryJSON geometryJson = new GeometryJSON(20); + Geometry read = geometryJson.read(new StringReader(geoJson)); + return createGeometryFromWkt(read.toString(), clazz); + } catch (IOException e) { + log.error("从 GeoJson 创建空间对象出错:{}", e.getMessage()); + } + return null; + } + + /** + * 将 List 转化为 Coordinate[] + */ + private static Coordinate[] convertBigDecimalList2CoordinateArray(List> params) { + int size = params.size(); + Coordinate[] coordinates = new Coordinate[size]; + for (int i = 0; i < params.size(); i++) { + List param = params.get(i); + Coordinate coordinate = new Coordinate(param.get(0).doubleValue(), param.get(1).doubleValue()); + coordinates[i] = coordinate; + } + return coordinates; + } + + private static Coordinate[] convertDoubleList2CoordinateArray(List> params) { + int size = params.size(); + Coordinate[] coordinates = new Coordinate[size]; + for (int i = 0; i < params.size(); i++) { + List param = params.get(i); + Coordinate coordinate = new Coordinate(param.get(0), param.get(1)); + coordinates[i] = coordinate; + } + return coordinates; + } + + /** + * 计算面积 平方米 + * 28155 .195928.042862 + */ + public static BigDecimal getApproximateArea(Geometry geometry) { + try { + String wkt = geometry.toText(); + WKTReader wktReader = new WKTReader(LOCATION_TECH_GEOMETRY_FACTORY); + Geometry geom = wktReader.read(wkt); + // WGS84(一般项目中常用的是CSR:84和EPSG:4326) + CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326"); + // Pseudo-Mercator(墨卡托投影) + CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4490"); + MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true); + Geometry geometryMercator = JTS.transform(geom, transform); + // 面积、周长 + return BigDecimal.valueOf(geometryMercator.getArea()); + } catch (FactoryException | TransformException | ParseException e) { + log.error("计算面积出错:{}", e.getMessage()); + } + return null; + } + + /** + * 当前数据库的数据来源都是高德数据源 坐标系为GCJ02 如果来源是其他的地图的需要根据规则转换成GCJ02 + * 同理如果需要转换到其他的数据源的坐标系也需要进行转换 + */ + public static T convertWgs84ToGcj02(T geometry) { + log.info("原始数据:{}", geometry.toText()); + Coordinate[] coordinates = geometry.getCoordinates(); + for (Coordinate coordinate : coordinates) { + double lon = coordinate.x; + double lat = coordinate.y; + double[] doubles = GpsConvertUtil.wgs84ToGcj02(lon, lat); + coordinate.x = doubles[0]; + coordinate.y = doubles[1]; + } + log.info("转后数据:{}", geometry.toText()); + return geometry; + } + + public static double distance(Point p0, Point p1) { + GeodeticCalculator calculator = new GeodeticCalculator(); + calculator.setStartingGeographicPoint(p0.getX(), p0.getY()); + calculator.setDestinationGeographicPoint(p1.getX(), p1.getY()); + return calculator.getOrthodromicDistance(); + } + + public static Point2D calculateEndingGlobalCoordinates(double longitude, double latitude, double azi, double dis) { + GeodeticCalculator calculator = new GeodeticCalculator(); + calculator.setStartingGeographicPoint(longitude, latitude); + calculator.setDirection(azi, dis); + return calculator.getDestinationGeographicPoint(); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java new file mode 100644 index 0000000..e524a80 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java @@ -0,0 +1,135 @@ +package com.changhu.common.utils; + +/** + * author: luozhun + * desc: 坐标系转换 + * createTime: 2023/8/25 18:18 + */ +public class GpsConvertUtil { + public static final double pi = 3.1415926535897932384626; + public static final double xpi = 3.14159265358979324 * 3000.0 / 180.0; + public static final double a = 6378245.0; + public static final double ee = 0.00669342162296594323; + + public static double transformLat(double x, double y) { + double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; + return ret; + } + + public static double transformLon(double x, double y) { + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 + * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 + * pi)) * 2.0 / 3.0; + return ret; + } + + public static double[] transform(double lon, double lat) { + if (outOfChina(lon, lat)) { + return new double[]{lon, lat}; + } + double dLat = transformLat(lon - 105.0, lat - 35.0); + double dLon = transformLon(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * pi; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double mgLat = lat + dLat; + double mgLon = lon + dLon; + return new double[]{mgLon, mgLat}; + } + + public static boolean outOfChina(double lon, double lat) { + if (lon < 72.004 || lon > 137.8347) + return true; + return lat < 0.8293 || lat > 55.8271; + } + + /** + * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System + */ + public static double[] wgs84ToGcj02(double lon, double lat) { + if (outOfChina(lon, lat)) { + return new double[]{lon, lat}; + } + double dLat = transformLat(lon - 105.0, lat - 35.0); + double dLon = transformLon(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * pi; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double mgLat = lat + dLat; + double mgLon = lon + dLon; + return new double[]{mgLon, mgLat}; + } + + /** + * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return + */ + public static double[] gcj02ToWgs84(double lon, double lat) { + double[] gps = transform(lon, lat); + double longitude = lon * 2 - gps[0]; + double latitude = lat * 2 - gps[1]; + return new double[]{longitude, latitude}; + } + + /** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 + */ + public static double[] gcj02ToBd09(double lon, double lat) { + double z = Math.sqrt(lon * lon + lat * lat) + 0.00002 * Math.sin(lat * xpi); + double theta = Math.atan2(lat, lon) + 0.000003 * Math.cos(lon * xpi); + double tempLon = z * Math.cos(theta) + 0.0065; + double tempLat = z * Math.sin(theta) + 0.006; + return new double[]{tempLon, tempLat}; + } + + /** + * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param + * bdlat * @param bdlon * @return + */ + public static double[] bd09ToGcj02(double lon, double lat) { + double x = lon - 0.0065, y = lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xpi); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xpi); + double tempLon = z * Math.cos(theta); + double tempLat = z * Math.sin(theta); + return new double[]{tempLon, tempLat}; + } + + /** + * 将wgs84转为bd09 + */ + public static double[] wgs84ToBd09(double lon, double lat) { + double[] gcj02 = wgs84ToGcj02(lon, lat); + return gcj02ToBd09(gcj02[0], gcj02[1]); + } + + public static double[] bd09ToWgs84(double lon, double lat) { + double[] gcj02 = bd09ToGcj02(lon, lat); + double[] wgs84 = gcj02ToWgs84(gcj02[0], gcj02[1]); + // 保留小数点后六位 + wgs84[1] = retain6(wgs84[1]); + wgs84[0] = retain6(wgs84[0]); + return wgs84; + } + + /** + * 保留小数点后六位 + */ + private static double retain6(double num) { + String result = String.format("%.6f", num); + return Double.parseDouble(result); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/IpUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/IpUtil.java new file mode 100644 index 0000000..5d13296 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/IpUtil.java @@ -0,0 +1,52 @@ +package com.changhu.common.utils; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * author: luozhun + * desc: some... + * createTime: 2023/12/26 15:49 + */ +@Slf4j +public class IpUtil { + + public static String getIp(HttpServletRequest request) { + String ipAddress; + try { + ipAddress = request.getHeader("x-forwarded-for"); + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getRemoteAddr(); + if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) { + try { + ipAddress = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.error("未知的host:{}", e.getMessage()); + } + } + } + // 通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 + if (ipAddress != null) { + if (ipAddress.contains(",")) { + return ipAddress.split(",")[0]; + } else { + return ipAddress; + } + } else { + return ""; + } + } catch (Exception e) { + log.error("ip获取失败:{}", e.getMessage()); + return ""; + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/JavaClassToTsUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/JavaClassToTsUtil.java new file mode 100644 index 0000000..059ce7a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/JavaClassToTsUtil.java @@ -0,0 +1,99 @@ +package com.changhu.common.utils; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Set; +import java.util.stream.Stream; + +/** + * @author 20252 + * @createTime 2024/8/5 下午4:11 + * @desc JavaClassToTsUtils... + */ +public class JavaClassToTsUtil { + + public static String parse(Class tClass) { + //类名字 + StringBuilder tsInterface = new StringBuilder("interface " + tClass.getSimpleName() + " {"); + //获取class所有属性 + Field[] fields = tClass.getDeclaredFields(); + + for (Field field : fields) { + tsInterface + .append("\n\t") + .append("/** ") + .append(field.getAnnotation(Schema.class) != null ? field.getAnnotation(Schema.class).description() : field.getName()) + .append(" **/") + .append("\n\t") + .append(field.getName()) + .append(isMust(field) ? "" : "?") + .append(":") + .append(convertJavaTypeToTS(field.getType())) + .append(";"); + } + return tsInterface + .append("\n") + .append("}") + .toString(); + } + + /** + * 将Java类型转化未ts类型 + * + * @param type Java类型 + * @return ts类型 + */ + private static String convertJavaTypeToTS(Class type) { + Set> stringList = Set.of( + String.class, + LocalDateTime.class, + LocalDate.class, + LocalTime.class + ); + Set> boolList = Set.of( + Boolean.class, + boolean.class + ); + Set> numberList = Set.of( + Integer.class, int.class, + Double.class, double.class, + Float.class, float.class, + Long.class, long.class, + Short.class, short.class, + BigDecimal.class, + Byte.class, byte.class + ); + if (stringList.contains(type)) { + return "string"; + } else if (boolList.contains(type)) { + return "boolean"; + } else if (numberList.contains(type)) { + return "number"; + } else { + return "unsupported"; + } + } + + /** + * 检查字段是否必须 + * + * @param field 字段 + * @return 是否必须 + */ + private static boolean isMust(Field field) { + return Stream.of( + NotNull.class, + NotEmpty.class, + NotBlank.class + ).anyMatch(field::isAnnotationPresent); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/RsaUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/RsaUtil.java new file mode 100644 index 0000000..ec36116 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/RsaUtil.java @@ -0,0 +1,61 @@ +package com.changhu.common.utils; + +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import cn.hutool.setting.Setting; +import cn.hutool.setting.SettingUtil; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import lombok.extern.slf4j.Slf4j; + + +/** + * @author 20252 + * @createTime 2024/8/20 下午4:57 + * @desc rsa加密工具类 + */ +@Slf4j +public class RsaUtil { + + /** + * rsa密钥配置文件 + */ + private static final Setting setting = SettingUtil.get("rsa"); + + /** + * rsa实例 + */ + private static final RSA rsa = new RSA(setting.getStr("privateKey"), setting.getStr("publicKey")); + + + /** + * 通过公钥进行加密 + * + * @param text 需要加密的密码 + * @return 加密的结果 + */ + public static String encipher(String text) { + try { + return rsa.encryptHex(text, KeyType.PublicKey); + } catch (Exception e) { + log.error("加密失败: {}", e.getMessage()); + throw new MessageException(ResultCode.ENCIPHER_ERROR); + } + } + + /** + * 通过私钥解密 + * + * @param encryptedString 加密后的字符串 + * @return 解密后的结果 + */ + public static String decrypt(String encryptedString) { + try { + return rsa.decryptStr(encryptedString, KeyType.PrivateKey); + } catch (Exception e) { + log.error("解码失败: {}", e.getMessage()); + throw new MessageException(ResultCode.DECRYPT_ERROR); + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/SnowFlakeIdUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/SnowFlakeIdUtil.java new file mode 100644 index 0000000..3b3bf7a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/SnowFlakeIdUtil.java @@ -0,0 +1,37 @@ +package com.changhu.common.utils; + +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * author: luozhun + * desc: SnowFlakeIdUtil + * createTime: 2023/8/16 17:33 + */ +@Slf4j +public class SnowFlakeIdUtil { + + //todo 暂时先固定靶 + private static final Snowflake snowflake = IdUtil.getSnowflake(1, 0); + + /** + * 系统默认雪花id生成 + * + * @return 雪花id + */ + public static synchronized long snowflakeId() { + return snowflake.nextId(); + } + + /** + * 指定生成雪花id + * + * @param workerId 机器id + * @param datacenterId 数据中心id + * @return 雪花id + */ + public static synchronized long snowflakeId(long workerId, long datacenterId) { + return IdUtil.getSnowflake(workerId, datacenterId).nextId(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/UserUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/UserUtil.java new file mode 100644 index 0000000..7cca7ec --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/UserUtil.java @@ -0,0 +1,147 @@ +package com.changhu.common.utils; + +import cn.dev33.satoken.stp.SaLoginConfig; +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import lombok.extern.slf4j.Slf4j; + +import java.util.Optional; + +/** + * author: luozhun + * desc: some... + * createTime: 2023/12/15 11:30 + */ +@Slf4j +public class UserUtil { + + public static final String DEFAULT_PASSWORD = "123456"; + + public static final Long ERROR_USER_ID = -1L; + + /** + * 用户登录 保存信息 + * + * @param userId 用户id + */ + public static void login(Long userId) { + StpUtil.login(userId); + } + + /** + * 登录并且返回SaTokenInfo + * + * @param userId 用户id + * @return SaTokenInfo + */ + public static SaTokenInfo loginAndTokenInfo(Long userId) { + login(userId); + return getTokenInfo(); + } + + public static SaTokenInfo loginAndTokenInfo(Long userId, UserType userType, Long unitId) { + StpUtil.login(userId, SaLoginConfig.setExtra("userType", userType).setExtra("unitId", unitId)); + return getTokenInfo(); + } + + /** + * 获取用户类型 + */ + public static UserType getUserType() { + Object clientType = StpUtil.getExtra("userType"); + if (clientType instanceof String ct) { + return UserType.valueOf(ct); + } + throw new MessageException("获取不到用户类型"); + } + + /** + * 获取单位id + */ + public static Long getUnitId() { + return Long.parseLong(StpUtil.getExtra("unitId") + ""); + } + + /** + * 用户登出 + */ + public static void logout() { + StpUtil.logout(); + } + + /** + * 获取用户id + */ + public static Long getUserId() { + return StpUtil.getLoginIdAsLong(); + } + + /** + * 获取当前用户token + * + * @return token + */ + public static String getToken() { + return StpUtil.getTokenValue(); + } + + /** + * 根据token获取id + * + * @param token token + * @return id + */ + public static Long getUserIdByToken(String token) { + return Long.parseLong(Optional.ofNullable(StpUtil.getLoginIdByToken(token)) + .map(Object::toString) + .orElseThrow(() -> new MessageException(ResultCode.NOT_TOKEN))); + } + + /** + * 获取token信息 + * + * @return token信息 + */ + public static SaTokenInfo getTokenInfo() { + return StpUtil.getTokenInfo(); + } + + /** + * 加密明文密码 + * + * @param plainTextPassWord 明文密码 + * @return 盐 + 加密后的密码 + */ + public static String passWordEncrypt(String plainTextPassWord) { + //随机盐值 + String salt = IdUtil.simpleUUID(); + //生成密文密码 + String ciphertextPassWord = SecureUtil.md5(salt + plainTextPassWord); + return salt + "$$" + ciphertextPassWord; + } + + /** + * 解密密码 校验密码是否正确 + * + * @param plainTextPassWord 明文密码 + * @param salt 盐 + * @param ciphertextPassWord 密文密码 + * @return 比对结果 + */ + public static boolean verifyPassWord(String plainTextPassWord, String salt, String ciphertextPassWord) { + boolean result = false; + if (StrUtil.isAllNotEmpty(plainTextPassWord, salt, ciphertextPassWord)) { + // 使用同样的加密算法和随机盐值生成最终加密的密码 + if (StrUtil.equals(SecureUtil.md5(salt + plainTextPassWord), ciphertextPassWord)) { + result = true; + } + } + return result; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/ValidatorUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/ValidatorUtil.java new file mode 100644 index 0000000..0ff896f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/ValidatorUtil.java @@ -0,0 +1,32 @@ +package com.changhu.common.utils; + +import cn.hutool.core.collection.CollUtil; +import com.changhu.common.exception.MessageException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; + +import java.util.Set; +import java.util.stream.Collectors; + +/** + * author: luozhun + * desc: ValidatorUtil + * createTime: 2023/8/22 9:39 + */ +public class ValidatorUtil { + /** + * 手动校验 + */ + public static void manual(T params) { + try (ValidatorFactory vf = Validation.buildDefaultValidatorFactory()) { + Validator validator = vf.getValidator(); + Set> validateResult = validator.validate(params); + if (CollUtil.isNotEmpty(validateResult)) { + String errMessage = validateResult.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(",")); + throw new MessageException(errMessage); + } + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/validator/IdCardValidator.java b/policeSecurityServer/src/main/java/com/changhu/common/validator/IdCardValidator.java new file mode 100644 index 0000000..a3fd201 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/validator/IdCardValidator.java @@ -0,0 +1,35 @@ +package com.changhu.common.validator; + +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.validator.annotation.IdCard; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +/** + * @author 20252 + * @createTime 2024/8/21 下午3:41 + * @desc IdCardValidator... + */ +public class IdCardValidator implements ConstraintValidator { + + private boolean required; + + @Override + public void initialize(IdCard constraintAnnotation) { + required = constraintAnnotation.required(); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (required) { + return Validator.isCitizenId(value); + } else { + if (StrUtil.isBlank(value)) { + return true; + } else { + return Validator.isCitizenId(value); + } + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/validator/IsMobileValidator.java b/policeSecurityServer/src/main/java/com/changhu/common/validator/IsMobileValidator.java new file mode 100644 index 0000000..7efd4a4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/validator/IsMobileValidator.java @@ -0,0 +1,37 @@ +package com.changhu.common.validator; + +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.validator.annotation.IsMobile; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +/** + * author: luozhun + * desc: IsMobileValidator + * createTime: 2023/8/22 9:38 + */ +public class IsMobileValidator implements ConstraintValidator { + private boolean required; + + @Override + public void initialize(IsMobile constraintAnnotation) { + //初始化时先获取他是否为必填信息 + required = constraintAnnotation.required(); + } + + @Override + public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { + if (required) { + //必填则校验手机号 + return Validator.isMobile(s); + } else { + //非必填直接返回ture + if (StrUtil.isBlank(s)) { + return true; + } else { + return Validator.isMobile(s); + } + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/validator/OnlyInValueValidator.java b/policeSecurityServer/src/main/java/com/changhu/common/validator/OnlyInValueValidator.java new file mode 100644 index 0000000..31d872a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/validator/OnlyInValueValidator.java @@ -0,0 +1,57 @@ +package com.changhu.common.validator; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.validator.annotation.OnlyInValue; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + +/** + * author: luozhun + * desc: OnlyInValueValidator + * createTime: 2023/8/22 9:40 + */ +public class OnlyInValueValidator implements ConstraintValidator { + private boolean required = false; + private String[] strValues; + private int[] intValues; + + @Override + public void initialize(OnlyInValue constraintAnnotation) { + required = constraintAnnotation.required(); + strValues = constraintAnnotation.strValues(); + intValues = constraintAnnotation.intValues(); + } + + @Override + public boolean isValid(Object value, ConstraintValidatorContext context) { + if (required) { + return valid(value); + } else { + if (ObjectUtil.isNull(value)) { + return true; + } else { + return valid(value); + } + } + } + + private boolean valid(Object value) { + if (value instanceof String) { + for (String str : strValues) { + if (StrUtil.equals(str, value + "")) { + return true; + } + } + } else if (value instanceof Integer) { + for (int num : intValues) { + if (NumberUtil.equals(num, (int) value)) { + return true; + } + } + } + return false; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/IdCard.java b/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/IdCard.java new file mode 100644 index 0000000..b9d0228 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/IdCard.java @@ -0,0 +1,31 @@ +package com.changhu.common.validator.annotation; + +import com.changhu.common.validator.IdCardValidator; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * @author 20252 + * @createTime 2024/8/21 下午3:34 + * @desc IdCard... + */ +@Documented +@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) +@Retention(RUNTIME) +@Constraint(validatedBy = {IdCardValidator.class}) +public @interface IdCard { + boolean required() default true; + + String message() default "身份证格式错误!"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/IsMobile.java b/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/IsMobile.java new file mode 100644 index 0000000..f6df75f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/IsMobile.java @@ -0,0 +1,27 @@ +package com.changhu.common.validator.annotation; + +import com.changhu.common.validator.IsMobileValidator; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; + +/** + * author: luozhun + * desc: IsMobile + * createTime: 2023/8/22 9:38 + */ +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = {IsMobileValidator.class}) +public @interface IsMobile { + boolean required() default true; + + String message() default "手机号码格式错误!"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/OnlyInValue.java b/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/OnlyInValue.java new file mode 100644 index 0000000..06be0ee --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/validator/annotation/OnlyInValue.java @@ -0,0 +1,34 @@ +package com.changhu.common.validator.annotation; + +import com.changhu.common.validator.OnlyInValueValidator; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + +import java.lang.annotation.*; + +/** + * author: luozhun + * desc: 只能为定义的值 比如[1,0] + * createTime: 2023/8/22 9:41 + */ +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint( + validatedBy = { + OnlyInValueValidator.class + } +) +public @interface OnlyInValue { + boolean required() default true; + + String message() default "必须为指定值"; + + String[] strValues() default {}; + + int[] intValues() default {}; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/config/ThreadPollConfig.java b/policeSecurityServer/src/main/java/com/changhu/config/ThreadPollConfig.java new file mode 100644 index 0000000..18aa26e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/config/ThreadPollConfig.java @@ -0,0 +1,55 @@ +package com.changhu.config; + +import com.changhu.common.properties.ThreadProperties; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * author: luozhun + * desc: 线程池配置 + * createTime: 2023/8/23 18:12 + */ +@Slf4j +@Configuration +@EnableAsync +public class ThreadPollConfig { + + @Resource + private ThreadProperties threadProperties; + + @Bean + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + + log.info("已加载 【{}】 的配置 【{}】:", "线 程 池", threadProperties); + + ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + // 配置核心线程数 + threadPoolTaskExecutor.setCorePoolSize(threadProperties.getCorePoolSize()); + // 配置最大线程数 + threadPoolTaskExecutor.setMaxPoolSize(threadProperties.getMaxPoolSize()); + // 配置队列大小 + threadPoolTaskExecutor.setQueueCapacity(threadProperties.getQueueCapacity()); + // 配置存活时间 + threadPoolTaskExecutor.setKeepAliveSeconds(threadProperties.getKeepAliveSeconds()); + // 配置线程池中的线程的名称前缀 + threadPoolTaskExecutor.setThreadNamePrefix(threadProperties.getThreadNamePrefix()); + + /* + * rejection-policy:当pool已经达到max size的时候,如何处理新任务? + * 1.ThreadPoolExecutor.AbortPolicy 丢弃任务并抛出RejectedExecutionException异常(默认)。 + * 2.ThreadPoolExecutor.DiscardPolicy 丢弃任务,但是不抛出异常。 + * 3.ThreadPoolExecutor.DiscardOldestPolicy 丢弃队列最前面的任务,然后重新尝试执行任务 + * 4.ThreadPoolExecutor.CallerRunsPolicy 由调用线程处理该任务 + */ + threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 执行初始化 + threadPoolTaskExecutor.initialize(); + return threadPoolTaskExecutor; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/config/WebConfig.java b/policeSecurityServer/src/main/java/com/changhu/config/WebConfig.java new file mode 100644 index 0000000..48c4125 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/config/WebConfig.java @@ -0,0 +1,87 @@ +package com.changhu.config; + +import cn.dev33.satoken.interceptor.SaInterceptor; +import cn.dev33.satoken.stp.StpUtil; +import com.changhu.support.interceptor.JsonBodyInterceptor; +import com.changhu.support.interceptor.OpenApiInterceptor; +import com.changhu.support.interceptor.UserTypeInterceptor; +import org.jetbrains.annotations.NotNull; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.ArrayList; +import java.util.List; + +/** + * author: luozhun + * desc: WebConfig + * createTime: 2023/8/18 10:56 + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + + private final List whiteList = new ArrayList<>(); + + public WebConfig() { + whiteList.add("/common/**"); + whiteList.add("/open/**"); + whiteList.add("/test/**"); + whiteList.add("/login"); + whiteList.add("/logout"); + whiteList.add("/favicon.ico"); + //druid console + whiteList.add("/druid/**"); + //knife4j + whiteList.add("/doc.html/**"); + whiteList.add("/static/**"); + whiteList.add("/swagger-resources"); + whiteList.add("/**webjars/**"); + whiteList.add("/v3/**"); + //获取企业注册审核状态 + whiteList.add("/management/getCheckStatus"); + //微信小程序注册 + whiteList.add("/miniProgramUser/register"); + //二维码表单录入保安人员 + whiteList.add("/miniProgramUser/qrCodeFormInputSecurityUser"); + } + + @Override + public void addInterceptors(@NotNull InterceptorRegistry registry) { + // 注册 Sa-Token 拦截器,校验规则为 StpUtil.checkLogin() 登录校验。 + registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin())) + .addPathPatterns("/**") + .excludePathPatterns(whiteList); + // 注册jsonBody 拦截器 用于标识是否需要JsonResult返回 + registry.addInterceptor(new JsonBodyInterceptor()); + // 注册clientType 拦截器 用于校验当前用户是否匹配操作客户端 + registry.addInterceptor(new UserTypeInterceptor()); + // 注册开放接口 拦截器 用于校验第三方是否携带指定apiKey + registry.addInterceptor(new OpenApiInterceptor()) + .addPathPatterns("/open/**"); + } + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOriginPatterns("*") + .allowedMethods("GET", "POST", "OPTION", "PUT", "DELETE") + .allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method", + "Access-Control-Request-Headers", "Authorization", "Token", "*") + .allowCredentials(true) + .maxAge(3600); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("doc.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/controller/CommonController.java b/policeSecurityServer/src/main/java/com/changhu/controller/CommonController.java new file mode 100644 index 0000000..ed3ed63 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/controller/CommonController.java @@ -0,0 +1,94 @@ +package com.changhu.controller; + +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.cache.GlobalCacheManager; +import com.changhu.common.pojo.model.JsonResult; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.common.pojo.vo.TreeNodeVo; +import com.changhu.pojo.params.PoliceUnitRegisterParams; +import com.changhu.pojo.params.SecurityUnitRegisterParams; +import com.changhu.pojo.queryParams.QueryUnitListByIdentityQueryParams; +import com.changhu.service.AdministrativeDivisionService; +import com.changhu.service.CommonService; +import com.changhu.support.minio.service.MinioService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author 20252 + * @createTime 2024/8/30 下午2:16 + * @desc CommonController... + */ +@Tag(name = "公共接口") +@RequestMapping("/common") +@JsonBody +public class CommonController { + + @Autowired + private CommonService commonService; + + @Autowired + private MinioService minioService; + + @Autowired + private AdministrativeDivisionService administrativeDivisionService; + + @Cacheable(value = "common", key = "'AdministrativeDivisionLevel' + #level + 'Tree'") + @Operation(summary = "行政区划树") + @GetMapping("/administrativeDivisionTree") + public List> AdministrativeDivisionTree(@Schema(description = "等级") @RequestParam(defaultValue = "4") Integer level) { + return administrativeDivisionService.tree(level); + } + + @Operation(summary = "根据父编码查询子级行政区划") + @GetMapping("/administrativeDivisionByParentCode") + public List> administrativeDivisionByParentCode(@Schema(description = "父编码") @RequestParam(defaultValue = "0") String parentCode) { + return administrativeDivisionService.administrativeDivisionByParentCode(parentCode); + } + + @Operation(summary = "保安单位注册") + @PostMapping("/securityUnitRegister") + public JsonResult securityUnitRegister(@RequestBody @Valid SecurityUnitRegisterParams params) { + return commonService.securityUnitRegister(params); + } + + @Operation(summary = "公安单位注册") + @PostMapping("/policeUnitRegister") + public JsonResult policeUnitRegister(@RequestBody @Valid PoliceUnitRegisterParams params) { + return commonService.policeUnitRegister(params); + } + + @Operation(summary = "获取临时上传地址") + @GetMapping("/getResignedObjectUrl") + public String getResignedObjectUrl(@RequestParam @Schema(description = "bucketName") String bucketName, + @RequestParam @Schema(description = "对象地址") String objectName) { + return minioService.getResignedObjectUrl(bucketName, objectName); + } + + @Operation(summary = "根据身份查询单位列表") + @PostMapping("/queryUnitListByIdentity") + public List> queryUnitListByIdentity(@RequestBody QueryUnitListByIdentityQueryParams queryParams) { + return commonService.queryUnitListByIdentity(queryParams); + } + + + @Operation(summary = "字典数据") + @GetMapping("/enums") + public Map>> enums() { + // 初始化 enumsResult + Map>> enumsResult = new HashMap<>(); + //将缓存的数据转换 + GlobalCacheManager.ENUM_CACHE.forEach((aClass, item) -> enumsResult.put(aClass.getSimpleName(), item.values().stream().toList())); + return enumsResult; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/controller/LoginController.java b/policeSecurityServer/src/main/java/com/changhu/controller/LoginController.java new file mode 100644 index 0000000..3694b31 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/controller/LoginController.java @@ -0,0 +1,37 @@ +package com.changhu.controller; + +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.pojo.params.LoginParams; +import com.changhu.service.LoginService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:12 + * @desc LoginController... + */ +@Tag(name = "登录相关") +@JsonBody +public class LoginController { + + @Autowired + private LoginService loginService; + + @Operation(summary = "登录") + @PostMapping("/login") + public TokenInfo login(@RequestBody LoginParams loginParams) { + return loginService.login(loginParams); + } + + @Operation(summary = "登出") + @GetMapping("/logout") + public void logout() { + loginService.logout(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/controller/OpenController.java b/policeSecurityServer/src/main/java/com/changhu/controller/OpenController.java new file mode 100644 index 0000000..f8a5b92 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/controller/OpenController.java @@ -0,0 +1,53 @@ +package com.changhu.controller; + +import com.changhu.common.annotation.CheckOpenApi; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.enums.OpenApiType; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.pojo.dto.DataViewDTO; +import com.changhu.pojo.dto.EnterprisesUnitDetailDTO; +import com.changhu.service.OpenApiService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/10/9 下午5:02 + * @desc 可以给第三方对接的controller + */ +@Tag(name = "开放接口") +@JsonBody +@RequestMapping("/open") +public class OpenController { + + @Autowired + private OpenApiService openApiService; + + @Operation(summary = "获取企事业单位列表") + @CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions) + @GetMapping("/getEnterprisesUnit") + public List> getEnterprisesUnit(@Schema(description = "公安单位机构代码") @RequestParam String policeCode) { + return openApiService.getEnterprisesUnit(policeCode); + } + + @Operation(summary = "企事业单位详情") + @CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions) + @GetMapping("/enterprisesUnitDetailById") + public EnterprisesUnitDetailDTO enterprisesUnitDetailById(@Schema(description = "企事业单位id") @RequestParam Long enterprisesUnitId) { + return openApiService.enterprisesUnitDetailById(enterprisesUnitId); + } + + @Operation(summary = "数据总览") + @CheckOpenApi(value = OpenApiType.data_view) + @GetMapping("/dataView") + public DataViewDTO dataView() { + return openApiService.dataView(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/ClientType.java b/policeSecurityServer/src/main/java/com/changhu/enums/ClientType.java new file mode 100644 index 0000000..bfdf768 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/enums/ClientType.java @@ -0,0 +1,23 @@ +package com.changhu.enums; + +import com.changhu.enums.handler.*; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:19 + * @desc ClientType... + */ +@Getter +@AllArgsConstructor +public enum ClientType { + MANAGEMENT_SUPER("超级后台", ManagementSuperLogin.instance), + MANAGEMENT_POLICE("公安后台", ManagementPoliceUnitLogin.instance), + MANAGEMENT_SECURITY("保安后台", ManagementSecurityUnitLogin.instance), + MINI_PROGRAM("微信小程序", MiniProgramUserLogin.instance), + ; + + private final String remark; + private final AbstractLoginHandler loginHandler; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/handler/AbstractLoginHandler.java b/policeSecurityServer/src/main/java/com/changhu/enums/handler/AbstractLoginHandler.java new file mode 100644 index 0000000..4341284 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/enums/handler/AbstractLoginHandler.java @@ -0,0 +1,22 @@ +package com.changhu.enums.handler; + +import com.alibaba.fastjson2.JSONObject; +import com.changhu.common.pojo.vo.TokenInfo; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:24 + * @desc AbstractLoginHandler... + */ +public abstract class AbstractLoginHandler { + + + /** + * 统一登录方法 + * + * @param jsonObject 登录参数 + * @return token + */ + public abstract TokenInfo login(JSONObject jsonObject); + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementPoliceUnitLogin.java b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementPoliceUnitLogin.java new file mode 100644 index 0000000..3b49c5f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementPoliceUnitLogin.java @@ -0,0 +1,78 @@ +package com.changhu.enums.handler; + +import cn.dev33.satoken.stp.SaTokenInfo; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.common.utils.RsaUtil; +import com.changhu.common.utils.UserUtil; +import com.changhu.common.utils.ValidatorUtil; +import com.changhu.module.management.pojo.entity.ManagementPoliceUnitUser; +import com.changhu.module.management.pojo.entity.PoliceUnit; +import com.changhu.pojo.params.ManagementPoliceUnitLoginParams; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; + +/** + * @author 20252 + * @createTime 2024/9/2 下午4:52 + * @desc ManagementPoliceUnitLogin... + */ +public class ManagementPoliceUnitLogin extends AbstractLoginHandler { + + public static final ManagementPoliceUnitLogin instance = new ManagementPoliceUnitLogin(); + + private ManagementPoliceUnitLogin() { + } + + + @Override + public TokenInfo login(JSONObject jsonObject) { + ManagementPoliceUnitLoginParams managementPoliceUnitLoginParams = jsonObject.to(ManagementPoliceUnitLoginParams.class); + ValidatorUtil.manual(managementPoliceUnitLoginParams); + + String accountOrTelephone = managementPoliceUnitLoginParams.getAccountOrTelephone(); + String password = RsaUtil.decrypt(managementPoliceUnitLoginParams.getPassword()); + + //查看 账号/手机号 是否存在 + ManagementPoliceUnitUser managementPoliceUnitUser = Db.lambdaQuery(ManagementPoliceUnitUser.class) + .eq(ManagementPoliceUnitUser::getAccount, accountOrTelephone) + .or() + .eq(ManagementPoliceUnitUser::getTelephone, accountOrTelephone) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); + + //判断用户是否禁用 + if (managementPoliceUnitUser.getIsEnable().equals(IsEnable.FALSE)) { + throw new MessageException(ResultCode.USER_IS_DISABLE); + } + + //判断单位是否禁用 + IsEnable unitEnable = Db.lambdaQuery(PoliceUnit.class) + .eq(BaseEntity::getSnowFlakeId, managementPoliceUnitUser.getPoliceUnitId()) + .oneOpt() + .map(PoliceUnit::getIsEnable) + .orElseThrow(() -> new MessageException("单位不存在")); + if (unitEnable.equals(IsEnable.FALSE)) { + throw new MessageException("单位被禁用"); + } + + + //判断密码是否正确 + if (!UserUtil.verifyPassWord(password, managementPoliceUnitUser.getSalt(), managementPoliceUnitUser.getPassword())) { + throw new MessageException(ResultCode.PASSWORD_ERROR); + } + + //登录 + SaTokenInfo saTokenInfo = UserUtil.loginAndTokenInfo( + managementPoliceUnitUser.getSnowFlakeId(), + UserType.MANAGEMENT_POLICE, + managementPoliceUnitUser.getPoliceUnitId() + ); + //返回token + return new TokenInfo(saTokenInfo.getTokenName(), saTokenInfo.getTokenValue()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java new file mode 100644 index 0000000..8390ba4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java @@ -0,0 +1,76 @@ +package com.changhu.enums.handler; + +import cn.dev33.satoken.stp.SaTokenInfo; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.common.utils.RsaUtil; +import com.changhu.common.utils.UserUtil; +import com.changhu.common.utils.ValidatorUtil; +import com.changhu.module.management.pojo.entity.ManagementSecurityUnitUser; +import com.changhu.module.management.pojo.entity.SecurityUnit; +import com.changhu.pojo.params.ManagementSecurityUnitLoginParams; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; + +/** + * @author 20252 + * @createTime 2024/9/2 下午5:48 + * @desc ManagementSecurityUnitLogin... + */ +public class ManagementSecurityUnitLogin extends AbstractLoginHandler { + + public static final ManagementSecurityUnitLogin instance = new ManagementSecurityUnitLogin(); + + private ManagementSecurityUnitLogin() { + } + + @Override + public TokenInfo login(JSONObject jsonObject) { + ManagementSecurityUnitLoginParams loginParams = jsonObject.to(ManagementSecurityUnitLoginParams.class); + ValidatorUtil.manual(loginParams); + + String accountOrTelephone = loginParams.getAccountOrTelephone(); + String password = RsaUtil.decrypt(loginParams.getPassword()); + + //查看 账号/手机号 是否存在 + ManagementSecurityUnitUser managementSecurityUnitUser = Db.lambdaQuery(ManagementSecurityUnitUser.class) + .eq(ManagementSecurityUnitUser::getAccount, accountOrTelephone) + .or() + .eq(ManagementSecurityUnitUser::getTelephone, accountOrTelephone) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); + + //判断用户是否禁用 + if (managementSecurityUnitUser.getIsEnable().equals(IsEnable.FALSE)) { + throw new MessageException(ResultCode.USER_IS_DISABLE); + } + + //判断单位是否禁用 + IsEnable unitEnable = Db.lambdaQuery(SecurityUnit.class) + .eq(BaseEntity::getSnowFlakeId, managementSecurityUnitUser.getSecurityUnitId()) + .oneOpt() + .map(SecurityUnit::getIsEnable) + .orElseThrow(() -> new MessageException("单位不存在")); + if (unitEnable.equals(IsEnable.FALSE)) { + throw new MessageException("单位被禁用"); + } + + //判断密码是否正确 + if (!UserUtil.verifyPassWord(password, managementSecurityUnitUser.getSalt(), managementSecurityUnitUser.getPassword())) { + throw new MessageException(ResultCode.PASSWORD_ERROR); + } + + //登录 + SaTokenInfo saTokenInfo = UserUtil.loginAndTokenInfo( + managementSecurityUnitUser.getSnowFlakeId(), + UserType.MANAGEMENT_SECURITY, + managementSecurityUnitUser.getSecurityUnitId() + ); + //返回token + return new TokenInfo(saTokenInfo.getTokenName(), saTokenInfo.getTokenValue()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSuperLogin.java b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSuperLogin.java new file mode 100644 index 0000000..a1acfd7 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSuperLogin.java @@ -0,0 +1,53 @@ +package com.changhu.enums.handler; + +import cn.dev33.satoken.stp.SaTokenInfo; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.common.utils.RsaUtil; +import com.changhu.common.utils.UserUtil; +import com.changhu.common.utils.ValidatorUtil; +import com.changhu.module.management.pojo.entity.ManagementSuperUser; +import com.changhu.pojo.params.ManagementSuperLoginParams; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:25 + * @desc ManagementSuperLogin... + */ +public class ManagementSuperLogin extends AbstractLoginHandler { + + public static final ManagementSuperLogin instance = new ManagementSuperLogin(); + + private ManagementSuperLogin() { + } + + @Override + public TokenInfo login(JSONObject jsonObject) { + ManagementSuperLoginParams loginParams = jsonObject.to(ManagementSuperLoginParams.class); + ValidatorUtil.manual(loginParams); + String telephone = loginParams.getTelephone(); + String password = RsaUtil.decrypt(loginParams.getPassword()); + + //用户是否存在 + ManagementSuperUser user = Db.lambdaQuery(ManagementSuperUser.class) + .eq(ManagementSuperUser::getTelephone, telephone) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); + + //判断密码是否正确 + if (!UserUtil.verifyPassWord(password, user.getSalt(), user.getPassword())) { + throw new MessageException(ResultCode.PASSWORD_ERROR); + } + //登录 + SaTokenInfo saTokenInfo = UserUtil.loginAndTokenInfo( + user.getSnowFlakeId(), + UserType.MANAGEMENT_SUPER, + null); + //返回token + return new TokenInfo(saTokenInfo.getTokenName(), saTokenInfo.getTokenValue()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/handler/MiniProgramUserLogin.java b/policeSecurityServer/src/main/java/com/changhu/enums/handler/MiniProgramUserLogin.java new file mode 100644 index 0000000..f3bdf79 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/enums/handler/MiniProgramUserLogin.java @@ -0,0 +1,81 @@ +package com.changhu.enums.handler; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.common.utils.UserUtil; +import com.changhu.common.utils.ValidatorUtil; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import com.changhu.pojo.params.MiniProgramUserLoginParams; +import me.chanjar.weixin.common.error.WxErrorException; + +/** + * @author 20252 + * @createTime 2024/9/10 上午10:00 + * @desc MiniProgramUserLogin... + */ +public class MiniProgramUserLogin extends AbstractLoginHandler { + + public static final MiniProgramUserLogin instance = new MiniProgramUserLogin(); + + private MiniProgramUserLogin() { + } + + @Override + public TokenInfo login(JSONObject jsonObject) { + MiniProgramUserLoginParams loginParams = jsonObject.to(MiniProgramUserLoginParams.class); + ValidatorUtil.manual(loginParams); + String code = loginParams.getCode(); + + String openId; + final WxMaService wxMaService = SpringUtil.getBean(WxMaService.class); + + try { + WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code); + openId = sessionInfo.getOpenid(); + } catch (WxErrorException e) { + throw new MessageException(e.getMessage()); + } + + MiniProgramUser miniProgramUser = Db.lambdaQuery(MiniProgramUser.class) + .eq(MiniProgramUser::getOpenId, openId) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); + + if (CheckStatus.unChecked.equals(miniProgramUser.getCheckStatus())) { + throw new MessageException("该账号还未审核"); + } + + if (IsEnable.FALSE.equals(miniProgramUser.getIsEnable())) { + throw new MessageException(ResultCode.USER_IS_DISABLE); + } + + UserType userType = switch (miniProgramUser.getIdentity()) { + case POLICE -> UserType.MINI_PROGRAM_POLICE; + case PROJECT_MANAGER -> UserType.MINI_PROGRAM_PROJECT_MANAGE; + }; + + //登录 + SaTokenInfo saTokenInfo = UserUtil.loginAndTokenInfo( + miniProgramUser.getSnowFlakeId(), + userType, + miniProgramUser.getUnitId()); + //返回token + return new TokenInfo( + saTokenInfo.getTokenName(), + saTokenInfo.getTokenValue(), + Dict.of(LambdaUtil.getFieldName(MiniProgramUser::getIdentity), miniProgramUser.getIdentity()) + ); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/mapper/AdministrativeDivisionMapper.java b/policeSecurityServer/src/main/java/com/changhu/mapper/AdministrativeDivisionMapper.java new file mode 100644 index 0000000..2e53acb --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/mapper/AdministrativeDivisionMapper.java @@ -0,0 +1,34 @@ +package com.changhu.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.common.pojo.vo.TreeNodeVo; +import com.changhu.pojo.entity.AdministrativeDivision; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * administrative_division (全国行政区划表(2023/12/04)) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface AdministrativeDivisionMapper extends BaseMapper { + + /** + * 树列表 + * + * @param level 等级 + * @return 结果 + */ + List> treeList(@Param("level") Integer level); + + /** + * 根据父编码查询子级行政区划 + * + * @param parentCode 父编码 + * @return 结果 + */ + List> administrativeDivisionByParentCode(@Param("parentCode") String parentCode); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java new file mode 100644 index 0000000..4165e9d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java @@ -0,0 +1,134 @@ +package com.changhu.module.assessmentCriteria.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; +import com.changhu.module.assessmentCriteria.pojo.params.*; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentCriteriaRuleVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import com.changhu.module.assessmentCriteria.service.AssessmentCriteriaService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:02 + * @desc AssessmentCriteriaController... + */ +@Tag(name = "考核标准") +@JsonBody +@RequestMapping("/assessmentCriteria") +@CheckUserType(userTypes = UserType.MANAGEMENT_SUPER) +public class AssessmentCriteriaController { + + @Autowired + private AssessmentCriteriaService assessmentCriteriaService; + + @Operation(summary = "根据类型获取考核项目列表") + @GetMapping("/ckProjectListByType") + @CheckUserType(value = false) + public List> ckProjectListByType(@RequestParam EnterprisesUnitType type) { + return assessmentCriteriaService.assessmentCriteriaListByType(type); + } + + @Operation(summary = "根据考核项目获取考核规则") + @GetMapping("/assessmentCriteriaRulesByCkProjectId") + @CheckUserType(value = false) + public List assessmentCriteriaRulesByCkProjectId(@RequestParam Long ckProjectId) { + return assessmentCriteriaService.assessmentCriteriaRulesByCkProjectId(ckProjectId); + } + + @Operation(summary = "提交考核记录") + @PostMapping("/submitAssessmentRecord") + @CheckUserType(value = false) + public void submitAssessmentRecord(@Validated @RequestBody AssessmentRecordParams params) { + assessmentCriteriaService.submitAssessmentRecord(params); + } + + @Operation(summary = "考核项目分页查询") + @PostMapping("/ckProjectPagerVoPager") + public Page ckProjectPagerVoPager(@RequestBody PageParams queryParams) { + return assessmentCriteriaService.ckProjectPagerVoPager(queryParams); + } + + @Operation(summary = "新增或修改考核项目") + @PostMapping("/saveOrUpdateCkProject") + public void saveOrUpdateCkProject(@Valid @RequestBody CkProjectSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkProject(params); + } + + @Operation(summary = "删除考核项目") + @DeleteMapping("/deleteCkProjectById") + public void deleteCkProjectById(@RequestParam Long ckProjectId) { + assessmentCriteriaService.deleteCkProjectById(ckProjectId); + } + + @Operation(summary = "考核项目详情") + @GetMapping("/ckProjectDetail") + public List ckProjectDetail(@RequestParam Long ckProjectId) { + return assessmentCriteriaService.ckProjectDetail(ckProjectId); + } + + @Operation(summary = "新增或修改考核分组") + @PostMapping("/saveOrUpdateCkGroup") + public void saveOrUpdateCkGroup(@Valid @RequestBody CkGroupSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkGroup(params); + } + + @Operation(summary = "新增或修改考核项") + @PostMapping("/saveOrUpdateCkItem") + public void saveOrUpdateCkItem(@Valid @RequestBody CkItemSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkItem(params); + } + + @Operation(summary = "新增或修改考核标准") + @PostMapping("/saveOrUpdateCkStandard") + public void saveOrUpdateCkStandard(@Valid @RequestBody CkStandardSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkStandard(params); + } + + @Operation(summary = "删除考核分组") + @DeleteMapping("/deleteCkGroupById") + public void deleteCkGroupById(@RequestParam Long ckGroupId) { + boolean b = Db.removeById(ckGroupId, CkGroup.class); + if (!b) { + throw new MessageException(); + } + } + + @Operation(summary = "删除考核项") + @DeleteMapping("/deleteCkItemById") + public void deleteCkItemById(@RequestParam Long ckItemId) { + boolean b = Db.removeById(ckItemId, CkItem.class); + if (!b) { + throw new MessageException(); + } + } + + @Operation(summary = "删除考核标准") + @DeleteMapping("/deleteCkStandardById") + public void deleteCkStandardById(@RequestParam Long ckStandardId) { + boolean b = Db.removeById(ckStandardId, CkStandard.class); + if (!b) { + throw new MessageException(); + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentRecordController.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentRecordController.java new file mode 100644 index 0000000..7cfb7fc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentRecordController.java @@ -0,0 +1,42 @@ +package com.changhu.module.assessmentCriteria.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.JsonBody; +import com.changhu.module.assessmentCriteria.pojo.queryParams.AssessmentRecordPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordDetailVo; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordPagerVo; +import com.changhu.module.assessmentCriteria.service.CkAssessmentRecordService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/8 下午3:51 + * @desc AssessmentRecordController... + */ +@Tag(name = "考核记录详情") +@JsonBody +@RequestMapping("/assessmentRecord") +public class AssessmentRecordController { + + @Autowired + private CkAssessmentRecordService assessmentRecordService; + + @Operation(summary = "考核记录分页") + @PostMapping("/pager") + public Page pager(@RequestBody PageParams queryParams) { + return assessmentRecordService.pager(queryParams); + } + + @Operation(summary = "扣分详情") + @GetMapping("/deductedDetail") + public List deductedDetail(@RequestParam Long assessmentRecordId) { + return assessmentRecordService.deductedDetail(assessmentRecordId); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java new file mode 100644 index 0000000..a3d91bc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_assessment_record_details (考核记录明细) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkAssessmentRecordDetailsMapper extends BaseMapper { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java new file mode 100644 index 0000000..13bc5c3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java @@ -0,0 +1,28 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecord; +import com.changhu.module.assessmentCriteria.pojo.queryParams.AssessmentRecordPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * ck_assessment_record (考核记录) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkAssessmentRecordMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") AssessmentRecordPagerQueryParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java new file mode 100644 index 0000000..eb83633 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_group (考核组) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkGroupMapper extends BaseMapper { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java new file mode 100644 index 0000000..027c61d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_item (分组内的考核项) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkItemMapper extends BaseMapper{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java new file mode 100644 index 0000000..0827f55 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java @@ -0,0 +1,39 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.assessmentCriteria.pojo.entity.CkProject; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * ck_project (考核项目) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkProjectMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @return 分页数据 + */ + Page pager(@Param("page") Page page, + @Param("params") CkProjectPagerQueryParams params); + + /** + * 考核项目详情 + * + * @param ckProjectId 考核项目id + * @return 详情 + */ + List ckProjectDetail(@Param("ckProjectId") Long ckProjectId); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java new file mode 100644 index 0000000..fa97775 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_standard (扣分标准) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkStandardMapper extends BaseMapper{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java new file mode 100644 index 0000000..e3113b2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java @@ -0,0 +1,57 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 考核记录 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkAssessmentRecord extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 企事业单位id + */ + private Long enterprisesUnitId; + + /** + * 考核项目id + */ + private Long ckProjectId; + + /** + * 考核人员签字 + */ + private String assessmentUserSignature; + + /** + * 被考核单位人员签字 + */ + private String byAssessmentEnterprisesUnitUserSignature; + + /** + * 考核备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java new file mode 100644 index 0000000..cc758cb --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java @@ -0,0 +1,57 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 考核记录明细 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkAssessmentRecordDetails extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核记录id + */ + private Long ckAssessmentRecordId; + + /** + * 考核项目id + */ + private Long ckProjectId; + + /** + * 考核分组id + */ + private Long ckGroupId; + + /** + * 考核项id + */ + private Long ckItemId; + + /** + * 考核标准id + */ + private Long ckStandardId; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java new file mode 100644 index 0000000..454b0bd --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java @@ -0,0 +1,52 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 考核组 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkGroup extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核项目id + */ + private Long ckProjectId; + + /** + * 考核组名称 + */ + private String name; + + /** + * 总分 + */ + private Integer totalScore; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java new file mode 100644 index 0000000..53710ae --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java @@ -0,0 +1,53 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.SelectType; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 分组内的考核项 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkItem extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核组id + */ + private Long ckGroupId; + + /** + * 考核项名称 + */ + private String name; + + /** + * 单选或多选 + */ + private SelectType type; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java new file mode 100644 index 0000000..56467bd --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java @@ -0,0 +1,53 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 考核项目 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkProject extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核项目名字 + */ + private String name; + + /** + * 类型(对应企事业单位类型) + */ + private EnterprisesUnitType type; + + /** + * 总分 + */ + private Integer totalScore; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java new file mode 100644 index 0000000..e4b6848 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java @@ -0,0 +1,46 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 扣分标准 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkStandard extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核项id + */ + private Long ckItemId; + + /** + * 条件 + */ + private String name; + + /** + * 扣多少分 + */ + private Double deductionPoints; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java new file mode 100644 index 0000000..af66d88 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java @@ -0,0 +1,54 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/7 上午11:15 + * @desc AssessmentRecordParams... + */ +@Data +public class AssessmentRecordParams { + @Schema(description = "企事业单位id") + @NotNull(message = "被考核单位不能为空") + private Long enterprisesUnitId; + + @Schema(description = "考核项目") + @NotNull(message = "考核项目不能为空") + private Long ckProjectId; + + @Schema(description = "考核人员签字") + @NotEmpty(message = "考核人员需签字") + private String assessmentUserSignature; + @Schema(description = "被考核单位人员签字") + @NotEmpty(message = "被考核单位需人员签字") + private String byAssessmentEnterprisesUnitUserSignature; + + @Schema(description = "考核备注") + private String remark; + + @Valid + @Schema(description = "考核记录详情") + private List assessmentRecordDetails; + + @Data + public static class RecordDetailParams { + @NotNull(message = "考核分组不能为空") + @Schema(description = "考核分组id") + private Long ckGroupId; + + @NotNull(message = "考核项不能为空") + @Schema(description = "考核项id") + private Long ckItemId; + + @NotNull(message = "考核标准不能为空") + @Schema(description = "考核标准id") + private Long ckStandardId; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java new file mode 100644 index 0000000..66560c5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java @@ -0,0 +1,32 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:31 + * @desc CkProjectSaveOrUpdateParams... + */ +@Data +public class CkGroupSaveOrUpdateParams { + @Schema(description = "考核分组id") + private Long snowFlakeId; + + @Schema(description = "考核项目id") + @NotNull(message = "所属考核项目不能为空") + private Long ckProjectId; + + @NotBlank(message = "考核组名不能为空") + @Schema(description = "考核组名称") + private String name; + + @NotNull(message = "考核组分数不能为空") + @Schema(description = "考核组总分") + private Integer totalScore; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java new file mode 100644 index 0000000..9f9868e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java @@ -0,0 +1,33 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午11:51 + * @desc CkItemSaveOrUpdateParams... + */ +@Data +public class CkItemSaveOrUpdateParams { + @Schema(description = "id") + private Long snowFlakeId; + + @NotNull(message = "考核组不能为空") + @Schema(description = "考核组id") + private Long ckGroupId; + + @NotBlank(message = "考核项名称不能为空") + @Schema(description = "考核项名称") + private String name; + + @NotNull(message = "组件类型不能为空") + @Schema(description = "组件类型") + private SelectType type; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java new file mode 100644 index 0000000..1c3d654 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java @@ -0,0 +1,33 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:31 + * @desc CkProjectSaveOrUpdateParams... + */ +@Data +public class CkProjectSaveOrUpdateParams { + @Schema(description = "考核项目id") + private Long snowFlakeId; + + @NotBlank(message = "考核项目名不能为空") + @Schema(description = "考核项目名称") + private String name; + + @NotNull(message = "单位类型不能为空") + @Schema(description = "对应企事业单位类型") + private EnterprisesUnitType type; + + @NotNull(message = "考核分数不能为空") + @Schema(description = "考核总分") + private Integer totalScore; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java new file mode 100644 index 0000000..f03d7c6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java @@ -0,0 +1,30 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 下午2:50 + * @desc CkStandardSaveOrUpdateParams... + */ +@Data +public class CkStandardSaveOrUpdateParams { + @Schema(description = "考核标准id") + private Long snowFlakeId; + + @NotNull + @Schema(description = "考核项id") + private Long ckItemId; + + @NotBlank(message = "标准名不能为空") + @Schema(description = "标准名") + private String name; + + @NotNull(message = "扣分值不能为空") + @Schema(description = "扣分值") + private Double deductionPoints; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/AssessmentRecordPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/AssessmentRecordPagerQueryParams.java new file mode 100644 index 0000000..ff6d855 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/AssessmentRecordPagerQueryParams.java @@ -0,0 +1,16 @@ +package com.changhu.module.assessmentCriteria.pojo.queryParams; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/8 下午3:52 + * @desc AssessmentRecordPagerQueryParams... + */ +@Data +public class AssessmentRecordPagerQueryParams { + @Schema(description = "企事业单位类型") + private EnterprisesUnitType type; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java new file mode 100644 index 0000000..30b42d7 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.pojo.queryParams; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:09 + * @desc CkProjectPagerQueryParams... + */ +@Data +public class CkProjectPagerQueryParams { + private String name; + private EnterprisesUnitType type; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java new file mode 100644 index 0000000..8295151 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java @@ -0,0 +1,57 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/7 上午10:00 + * @desc 考核标准规则 + */ +@Data +public class AssessmentCriteriaRuleVo { + @Schema(description = "考核组id") + private Long snowFlakeId; + @Schema(description = "考核组名称") + private String name; + @Schema(description = "考核组总成绩") + private Integer totalScore; + @Schema(description = "考核组备注") + private String remark; + + @Schema(description = "考核项") + private List itemList; + + @Data + public static class Item { + @Schema(description = "考核项id") + private Long snowFlakeId; + @Schema(description = "考核分组id") + private Long ckGroupId; + @Schema(description = "考核项名称") + private String name; + @Schema(description = "考核项组件类型") + private SelectType type; + @Schema(description = "考核项备注") + private String remark; + + @Schema(description = "考核标准") + private List standardList; + } + + @Data + public static class Standard { + @Schema(description = "考核标准id") + private Long snowFlakeId; + @Schema(description = "考核项id") + private Long ckItemId; + @Schema(description = "考核标准名字") + private String name; + @Schema(description = "扣分值") + private Double deductionPoints; + } + +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentRecordDetailVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentRecordDetailVo.java new file mode 100644 index 0000000..6630a70 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentRecordDetailVo.java @@ -0,0 +1,43 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/11 上午9:39 + * @desc AssessmentRecordDetailVo... + */ +@Data +public class AssessmentRecordDetailVo { + + @Schema(description = "考核分组id") + private Long ckGroupId; + @Schema(description = "考核分组名字") + private String groupName; + @Schema(description = "考核分组总分") + private Integer groupTotalScore; + @Schema(description = "考核分组备注") + private String groupRemark; + + @Schema(description = "考核项id") + private Long ckItemId; + @Schema(description = "考核项名字") + private String itemName; + @Schema(description = "组件类型") + private SelectType itemType; + @Schema(description = "考核项备注") + private String itemRemark; + + @Schema(description = "考核标准id") + private Long ckStandardId; + @Schema(description = "考核标准") + private String standardName; + @Schema(description = "扣分数") + private Double deductionPoints; + + + @Schema(description = "是否选中") + public Boolean isSelected; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentRecordPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentRecordPagerVo.java new file mode 100644 index 0000000..ce1159f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentRecordPagerVo.java @@ -0,0 +1,47 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/11/8 下午3:53 + * @desc AssessmentRecordPagerVo... + */ +@Data +public class AssessmentRecordPagerVo { + @Schema(description = "考核记录id") + private Long snowFlakeId; + @Schema(description = "企事业单位名称") + private String enterprisesUnitName; + + @Schema(description = "考核项目名称") + private String ckProjectName; + @Schema(description = "考核项目总分") + private Integer totalScore; + @Schema(description = "考核项目类型") + private EnterprisesUnitType type; + @Schema(description = "考核项目备注") + private String ckProjectRemark; + + @Schema(description = "公安单位名称") + private String policeUnitName; + @Schema(description = "在这是考核人") + private String createUserName; + @Schema(description = "在这是考核时间") + private LocalDateTime createTime; + + @Schema(description = "考核人员签字") + private String assessmentUserSignature; + @Schema(description = "被考核单位人员签字") + private String byAssessmentEnterprisesUnitUserSignature; + @Schema(description = "考核备注") + private String remark; + + @Schema(description = "总扣分") + private Double deductionPointsTotal; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java new file mode 100644 index 0000000..c8d9514 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java @@ -0,0 +1,39 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午11:03 + * @desc CkProjectDetailTableVo... + */ +@Data +public class CkProjectDetailTableVo { + + @Schema(description = "考核分组id") + private Long ckGroupId; + @Schema(description = "考核分组名字") + private String groupName; + @Schema(description = "考核分组总分") + private Integer groupTotalScore; + @Schema(description = "考核分组备注") + private String groupRemark; + + @Schema(description = "考核项id") + private Long ckItemId; + @Schema(description = "考核项名字") + private String itemName; + @Schema(description = "组件类型") + private SelectType itemType; + @Schema(description = "考核项备注") + private String itemRemark; + + @Schema(description = "考核标准id") + private Long ckStandardId; + @Schema(description = "考核标准") + private String standardName; + @Schema(description = "扣分数") + private Double deductionPoints; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java new file mode 100644 index 0000000..43589d1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java @@ -0,0 +1,31 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:05 + * @desc CkProjectPagerVo... + */ +@Data +public class CkProjectPagerVo { + + @Schema(description = "考核项目id") + private Long snowFlakeId; + @Schema(description = "考核项目名称") + private String name; + @Schema(description = "对应企事业单位类型") + private EnterprisesUnitType type; + @Schema(description = "考核总分") + private Integer totalScore; + @Schema(description = "备注") + private String remark; + @Schema(description = "创建时间") + private LocalDateTime createTime; + @Schema(description = "创建人名字") + private String createUserName; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java new file mode 100644 index 0000000..d752efa --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java @@ -0,0 +1,95 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.assessmentCriteria.pojo.params.*; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentCriteriaRuleVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:07 + * @desc AssessmentCriteriaService... + */ +public interface AssessmentCriteriaService { + + /** + * 根据类型获取考核标准列表 + * + * @param type 类型 + * @return 结果 + */ + List> assessmentCriteriaListByType(EnterprisesUnitType type); + + /** + * 根据考核项目获取考核规则 + * + * @param ckProjectId 考核项目id + * @return 结果 + */ + List assessmentCriteriaRulesByCkProjectId(Long ckProjectId); + + /** + * 考核项目分页查询 + * + * @param queryParams 查询参数 + * @return 查询结果 + */ + Page ckProjectPagerVoPager(PageParams queryParams); + + /** + * 新增或修改考核项目 + * + * @param params 参数 + */ + void saveOrUpdateCkProject(CkProjectSaveOrUpdateParams params); + + /** + * 删除考核项目 + * + * @param ckProjectId 考核项目id + */ + void deleteCkProjectById(Long ckProjectId); + + /** + * 考核项目详情 + * + * @param ckProjectId 考核项目id + * @return 结果 + */ + List ckProjectDetail(Long ckProjectId); + + /** + * 新增或修改考核分组 + * + * @param params 参数 + */ + void saveOrUpdateCkGroup(CkGroupSaveOrUpdateParams params); + + /** + * 新增或修改考核项 + * + * @param params 参数 + */ + void saveOrUpdateCkItem(CkItemSaveOrUpdateParams params); + + /** + * 新增或修改考核标准 + * + * @param params 参数 + */ + void saveOrUpdateCkStandard(CkStandardSaveOrUpdateParams params); + + /** + * 提交考核记录 + * + * @param params 参数 + */ + void submitAssessmentRecord(AssessmentRecordParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java new file mode 100644 index 0000000..03e198c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; + +/** + * ck_assessment_record_details (考核记录明细) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkAssessmentRecordDetailsService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java new file mode 100644 index 0000000..d2418bf --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java @@ -0,0 +1,35 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecord; +import com.changhu.module.assessmentCriteria.pojo.queryParams.AssessmentRecordPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordDetailVo; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +import java.util.List; + +/** + * ck_assessment_record (考核记录) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkAssessmentRecordService extends IService { + + /** + * 分页查询 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page pager(PageParams queryParams); + + /** + * 扣分详情 + * + * @param assessmentRecordId 考核记录id + * @return 结果 + */ + List deductedDetail(Long assessmentRecordId); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java new file mode 100644 index 0000000..db87089 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; + +/** + * ck_group (考核组) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkGroupService extends IService{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java new file mode 100644 index 0000000..4cc3fba --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; + +/** + * ck_item (分组内的考核项) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkItemService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java new file mode 100644 index 0000000..0357d50 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkProject; + +/** + * ck_project (考核项目) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkProjectService extends IService{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java new file mode 100644 index 0000000..12559a6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; + +/** + * ck_standard (扣分标准) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkStandardService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java new file mode 100644 index 0000000..517e38f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java @@ -0,0 +1,211 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.common.utils.SnowFlakeIdUtil; +import com.changhu.module.assessmentCriteria.mapper.CkProjectMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.*; +import com.changhu.module.assessmentCriteria.pojo.params.*; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentCriteriaRuleVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import com.changhu.module.assessmentCriteria.service.AssessmentCriteriaService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:08 + * @desc AssessmentCriteriaServiceImpl... + */ +@Service +public class AssessmentCriteriaServiceImpl implements AssessmentCriteriaService { + + @Autowired + private CkProjectMapper ckProjectMapper; + + @Override + public List> assessmentCriteriaListByType(EnterprisesUnitType type) { + return Db.lambdaQuery(CkProject.class).eq(CkProject::getType, type).list() + .stream() + .map(e -> SelectNodeVo.builder() + .value(e.getSnowFlakeId()) + .label(e.getName()) + .extData(Dict.create() + .set(LambdaUtil.getFieldName(CkProject::getRemark), e.getRemark()) + .set(LambdaUtil.getFieldName(CkProject::getTotalScore), e.getTotalScore()) + .set(LambdaUtil.getFieldName(CkProject::getType), e.getType()) + .set(LambdaUtil.getFieldName(CkProject::getCreateTime), e.getCreateTime()) + ) + .build()) + .toList(); + } + + @Override + public List assessmentCriteriaRulesByCkProjectId(Long ckProjectId) { + //根据考核项目拿到考核分组 + List groupList = Db.lambdaQuery(CkGroup.class) + .eq(CkGroup::getCkProjectId, ckProjectId) + .orderByAsc(BaseEntity::getCreateTime) + .list() + .stream() + .map(e -> { + AssessmentCriteriaRuleVo assessmentCriteriaRuleVo = new AssessmentCriteriaRuleVo(); + assessmentCriteriaRuleVo.setSnowFlakeId(e.getSnowFlakeId()); + assessmentCriteriaRuleVo.setName(e.getName()); + assessmentCriteriaRuleVo.setTotalScore(e.getTotalScore()); + assessmentCriteriaRuleVo.setRemark(e.getRemark()); + return assessmentCriteriaRuleVo; + }).toList(); + if (groupList.isEmpty()) { + throw new MessageException("该考核项目内暂未制定规则"); + } + //根据考核分组拿到考核项 + List itemList = Db.lambdaQuery(CkItem.class) + .in(CkItem::getCkGroupId, groupList.stream().map(AssessmentCriteriaRuleVo::getSnowFlakeId).toList()) + .orderByAsc(BaseEntity::getCreateTime) + .list() + .stream() + .map(e -> { + AssessmentCriteriaRuleVo.Item item = new AssessmentCriteriaRuleVo.Item(); + item.setSnowFlakeId(e.getSnowFlakeId()); + item.setCkGroupId(e.getCkGroupId()); + item.setName(e.getName()); + item.setType(e.getType()); + item.setRemark(e.getRemark()); + return item; + }).toList(); + if (itemList.isEmpty()) { + throw new MessageException("该考核项目内未制定考核项"); + } + //根据考核项拿到考核标准 + List standardList = Db.lambdaQuery(CkStandard.class) + .in(CkStandard::getCkItemId, itemList.stream().map(AssessmentCriteriaRuleVo.Item::getSnowFlakeId).toList()) + .orderByAsc(BaseEntity::getCreateTime) + .list().stream() + .map(e -> { + AssessmentCriteriaRuleVo.Standard standard = new AssessmentCriteriaRuleVo.Standard(); + standard.setSnowFlakeId(e.getSnowFlakeId()); + standard.setCkItemId(e.getCkItemId()); + standard.setName(e.getName()); + standard.setDeductionPoints(e.getDeductionPoints()); + return standard; + }).toList(); + if (standardList.isEmpty()) { + throw new MessageException("该考核项目内未制定考核标准"); + } + //先将考核标准塞到考核项内 + Map> standardMap = standardList.stream().collect(Collectors.groupingBy(AssessmentCriteriaRuleVo.Standard::getCkItemId)); + itemList.forEach(e -> e.setStandardList(standardMap.get(e.getSnowFlakeId()))); + //将考核项塞到考核分组内 + Map> itemMap = itemList.stream().collect(Collectors.groupingBy(AssessmentCriteriaRuleVo.Item::getCkGroupId)); + groupList.forEach(e -> e.setItemList(itemMap.get(e.getSnowFlakeId()))); + + return groupList; + } + + @Override + public Page ckProjectPagerVoPager(PageParams queryParams) { + return ckProjectMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkProject(CkProjectSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkProject.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteCkProjectById(Long ckProjectId) { + boolean b = Db.removeById(ckProjectId, CkProject.class); + if (!b) { + throw new MessageException(); + } + } + + @Override + public List ckProjectDetail(Long ckProjectId) { + return ckProjectMapper.ckProjectDetail(ckProjectId); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkGroup(CkGroupSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkGroup.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkItem(CkItemSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkItem.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkStandard(CkStandardSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkStandard.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void submitAssessmentRecord(AssessmentRecordParams params) { + CkAssessmentRecord ckAssessmentRecord = CkAssessmentRecord.builder() + .snowFlakeId(SnowFlakeIdUtil.snowflakeId()) + .enterprisesUnitId(params.getEnterprisesUnitId()) + .ckProjectId(params.getCkProjectId()) + .assessmentUserSignature(params.getAssessmentUserSignature()) + .byAssessmentEnterprisesUnitUserSignature(params.getByAssessmentEnterprisesUnitUserSignature()) + .remark(params.getRemark()) + .build(); + //保存考核记录 + boolean save = Db.save(ckAssessmentRecord); + if (!save) { + throw new MessageException(); + } + List assessmentRecordDetails = params.getAssessmentRecordDetails(); + if (CollUtil.isEmpty(assessmentRecordDetails)) { + return; + } + //保存考核明细 + boolean b = Db.saveBatch(assessmentRecordDetails.stream() + .map(e -> CkAssessmentRecordDetails.builder() + .ckAssessmentRecordId(ckAssessmentRecord.getSnowFlakeId()) + .ckProjectId(ckAssessmentRecord.getCkProjectId()) + .ckGroupId(e.getCkGroupId()) + .ckItemId(e.getCkItemId()) + .ckStandardId(e.getCkStandardId()) + .build()) + .toList()); + if (!b) { + throw new MessageException(); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java new file mode 100644 index 0000000..5b8e36a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkAssessmentRecordDetailsMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; +import com.changhu.module.assessmentCriteria.service.CkAssessmentRecordDetailsService; +import org.springframework.stereotype.Service; + +/** + * ck_assessment_record_details (考核记录明细) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkAssessmentRecordDetailsServiceImpl extends ServiceImpl implements CkAssessmentRecordDetailsService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java new file mode 100644 index 0000000..de08d5b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java @@ -0,0 +1,68 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.module.assessmentCriteria.mapper.CkAssessmentRecordMapper; +import com.changhu.module.assessmentCriteria.mapper.CkProjectMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecord; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; +import com.changhu.module.assessmentCriteria.pojo.queryParams.AssessmentRecordPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordDetailVo; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentRecordPagerVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.service.CkAssessmentRecordService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * ck_assessment_record (考核记录) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkAssessmentRecordServiceImpl extends ServiceImpl implements CkAssessmentRecordService { + + @Autowired + private CkProjectMapper ckProjectMapper; + + @Override + public Page pager(PageParams queryParams) { + return baseMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Override + public List deductedDetail(Long assessmentRecordId) { + CkAssessmentRecord ckAssessmentRecord = Db.lambdaQuery(CkAssessmentRecord.class) + .eq(BaseEntity::getSnowFlakeId, assessmentRecordId) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + + List ckProjectDetailTableVos = ckProjectMapper.ckProjectDetail(ckAssessmentRecord.getCkProjectId()); + + List assessmentRecordDetailCkStandardIds = Db.lambdaQuery(CkAssessmentRecordDetails.class) + .select(CkAssessmentRecordDetails::getCkStandardId) + .eq(CkAssessmentRecordDetails::getCkAssessmentRecordId, assessmentRecordId) + .list() + .stream() + .map(CkAssessmentRecordDetails::getCkStandardId) + .toList(); + + return ckProjectDetailTableVos.stream() + .map(item -> { + AssessmentRecordDetailVo assessmentRecordDetailVo = BeanUtil.copyProperties(item, AssessmentRecordDetailVo.class); + if (assessmentRecordDetailCkStandardIds.contains(item.getCkStandardId())) { + assessmentRecordDetailVo.setIsSelected(true); + } + return assessmentRecordDetailVo; + }) + .toList(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java new file mode 100644 index 0000000..fb5e43b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkGroupMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; +import com.changhu.module.assessmentCriteria.service.CkGroupService; +import org.springframework.stereotype.Service; + +/** + * ck_group (考核组) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkGroupServiceImpl extends ServiceImpl implements CkGroupService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java new file mode 100644 index 0000000..f89df12 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkItemMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; +import com.changhu.module.assessmentCriteria.service.CkItemService; +import org.springframework.stereotype.Service; + +/** + * ck_item (分组内的考核项) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkItemServiceImpl extends ServiceImpl implements CkItemService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java new file mode 100644 index 0000000..660fc01 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkProjectMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkProject; +import com.changhu.module.assessmentCriteria.service.CkProjectService; +import org.springframework.stereotype.Service; + +/** + * ck_project (考核项目) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkProjectServiceImpl extends ServiceImpl implements CkProjectService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java new file mode 100644 index 0000000..16d8dc1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkStandardMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; +import com.changhu.module.assessmentCriteria.service.CkStandardService; +import org.springframework.stereotype.Service; + +/** + * ck_standard (扣分标准) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkStandardServiceImpl extends ServiceImpl implements CkStandardService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/controller/EnterprisesUnitController.java b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/EnterprisesUnitController.java new file mode 100644 index 0000000..54ea62d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/EnterprisesUnitController.java @@ -0,0 +1,73 @@ +package com.changhu.module.management.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.params.EnterprisesUnitSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.EnterprisesUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.EnterprisesUnitPagerVo; +import com.changhu.module.management.service.EnterprisesUnitService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/3 上午10:17 + * @desc EnterprisesUnitController... + */ +@Tag(name = "企事业单位") +@JsonBody +@RequestMapping("/enterprisesUnit") +public class EnterprisesUnitController { + + @Autowired + private EnterprisesUnitService enterprisesUnitService; + + @Operation(summary = "分页查询") + @PostMapping("/pager") + @CheckUserType(userTypes = {UserType.MANAGEMENT_POLICE, UserType.MANAGEMENT_SUPER}) + public Page pager(@RequestBody PageParams queryParams) { + return enterprisesUnitService.pager(queryParams); + } + + @Operation(summary = "新增或保存") + @PostMapping("/saveOrUpdate") + @CheckUserType(userTypes = {UserType.MANAGEMENT_POLICE, UserType.MANAGEMENT_SUPER}) + public void saveOrUpdate(@RequestBody @Valid EnterprisesUnitSaveOrUpdateParams params) { + enterprisesUnitService.saveOrUpdate(params); + } + + @Operation(summary = "根据id删除") + @DeleteMapping("/deleteById") + @CheckUserType(userTypes = {UserType.MANAGEMENT_POLICE, UserType.MANAGEMENT_SUPER}) + public void deleteById(@RequestParam @Schema(description = "企事业单位id") Long enterprisesUnitId) { + boolean b = enterprisesUnitService.removeById(enterprisesUnitId); + if (!b) { + throw new MessageException(); + } + } + + @Operation(summary = "根据行政区划编码查询下面的企事业单位") + @PostMapping("/queryListByAdministrativeDivisionCodes") + public List> queryListByAdministrativeDivisionCodes(@RequestBody @Schema(description = "行政区划编码") List administrativeDivisionCodes) { + return enterprisesUnitService.queryListByAdministrativeDivisionCodes(administrativeDivisionCodes); + } + + @Operation(summary = "企事业单位地图点位") + @GetMapping("/mapPoint") + public List mapPoint() { + return enterprisesUnitService.list(); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/controller/ManagementController.java b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/ManagementController.java new file mode 100644 index 0000000..c04c24b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/ManagementController.java @@ -0,0 +1,76 @@ +package com.changhu.module.management.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.module.management.pojo.params.IndexCheckPassParams; +import com.changhu.module.management.pojo.params.IndexCheckStatusParams; +import com.changhu.module.management.pojo.params.IndexDisableOrEnableParams; +import com.changhu.module.management.pojo.queryParams.UnitMiniProgramUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.UnitCheckStatusVo; +import com.changhu.module.management.pojo.vo.UnitMiniProgramUserPagerVo; +import com.changhu.module.management.service.ManagementService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:48 + * @desc IndexController... + */ +@Tag(name = "后台-通用接口") +@JsonBody +@RequestMapping("/management") +public class ManagementController { + + @Autowired + private ManagementService managementService; + + @Operation(summary = "审核通过") + @PostMapping("/checkPass") + @CheckUserType(userTypes = UserType.MANAGEMENT_SUPER) + public void checkPass(@RequestBody @Valid IndexCheckPassParams params) { + managementService.checkPass(params); + } + + @Operation(summary = "获取审核状态") + @PostMapping("/getCheckStatus") + public UnitCheckStatusVo getCheckStatus(@RequestBody @Valid IndexCheckStatusParams params) { + return managementService.getCheckStatus(params); + } + + @Operation(summary = "启用或禁用状态") + @PostMapping("/disableOrEnable") + @CheckUserType(userTypes = UserType.MANAGEMENT_SUPER) + public void disableOrEnable(@RequestBody @Valid IndexDisableOrEnableParams params) { + managementService.disableOrEnable(params); + } + + @Operation(summary = "查询单位下的小程序用户") + @PostMapping("/miniProgramUserPager") + @CheckUserType(userTypes = {UserType.MANAGEMENT_POLICE, UserType.MANAGEMENT_SECURITY}) + public Page miniProgramUserPager(@RequestBody PageParams queryParams) { + return managementService.miniProgramUserPager(queryParams); + } + + @Operation(summary = "审核通过小程序用户") + @PostMapping("/passMiniProgramUser") + @CheckUserType(userTypes = {UserType.MANAGEMENT_POLICE, UserType.MANAGEMENT_SECURITY}) + public void passMiniProgramUser(@RequestBody @Valid IndexDisableOrEnableParams params) { + managementService.passMiniProgramUser(params); + } + + @Operation(summary = "禁用或启用小程序用户") + @PostMapping("/disableOrEnableMiniProgramUser") + @CheckUserType(userTypes = {UserType.MANAGEMENT_POLICE, UserType.MANAGEMENT_SECURITY}) + public void disableOrEnableMiniProgramUser(@RequestBody @Valid IndexDisableOrEnableParams params) { + managementService.disableOrEnableMiniProgramUser(params); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/controller/PoliceController.java b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/PoliceController.java new file mode 100644 index 0000000..578b327 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/PoliceController.java @@ -0,0 +1,51 @@ +package com.changhu.module.management.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.module.management.pojo.params.ManagementPoliceUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ManagementPoliceUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementPoliceUnitUserPagerVo; +import com.changhu.module.management.service.PoliceService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:39 + * @desc PoliceController... + */ +@Tag(name = "后台-公安") +@JsonBody +@RequestMapping("/management/police") +@CheckUserType(userTypes = UserType.MANAGEMENT_POLICE) +public class PoliceController { + + @Autowired + private PoliceService policeService; + + @Operation(summary = "新增或保存后台用户") + @PostMapping("/user/saveOrUpdate") + public void userSaveOrUpdate(@RequestBody @Valid ManagementPoliceUserSaveOrUpdateParams params) { + policeService.userSaveOrUpdate(params); + } + + @Operation(summary = "分页查询后台用户") + @PostMapping("/user/pager") + public Page userPager(@RequestBody PageParams queryParams) { + return policeService.userPager(queryParams); + } + + @Operation(summary = "根据id删除后台用户") + @DeleteMapping("/user/deleteById") + public void userDeleteById(@RequestParam @Schema(description = "后台公安用户id") Long managementPoliceUnitUserId) { + policeService.userDeleteById(managementPoliceUnitUserId); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/controller/SecurityController.java b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/SecurityController.java new file mode 100644 index 0000000..9b8470f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/SecurityController.java @@ -0,0 +1,59 @@ +package com.changhu.module.management.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.management.pojo.params.ManagementSecurityUnitUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ManagementSecurityUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementSecurityUnitUserPagerVo; +import com.changhu.module.management.service.SecurityService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:39 + * @desc SecurityController... + */ +@Tag(name = "后台-保安") +@JsonBody +@RequestMapping("/management/security") +@CheckUserType(userTypes = UserType.MANAGEMENT_SECURITY) +public class SecurityController { + + @Autowired + private SecurityService securityService; + + @Operation(summary = "新增或修改后台用户") + @PostMapping("/user/saveOrUpdate") + public void userSaveOrUpdate(@RequestBody @Valid ManagementSecurityUnitUserSaveOrUpdateParams saveOrUpdateParams) { + securityService.userSaveOrUpdate(saveOrUpdateParams); + } + + @Operation(summary = "分页查询后台用户") + @PostMapping("/user/pager") + public Page userPager(@RequestBody PageParams queryParams) { + return securityService.userPager(queryParams); + } + + @Operation(summary = "根据id删除后台用户") + @DeleteMapping("/user/deleteById") + public void userDeleteById(@RequestParam @Schema(description = "后台保安用户id") Long managementSecurityUnitUserId) { + securityService.userDeleteById(managementSecurityUnitUserId); + } + + @Operation(summary = "查询单位下的项目经理") + @GetMapping("/listProjectManager") + public List> listProjectManager() { + return securityService.listProjectManager(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/controller/ServiceProjectController.java b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/ServiceProjectController.java new file mode 100644 index 0000000..9e495a4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/ServiceProjectController.java @@ -0,0 +1,52 @@ +package com.changhu.module.management.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.exception.MessageException; +import com.changhu.module.management.pojo.params.ServiceProjectSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams; +import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo; +import com.changhu.module.management.service.ServiceProjectService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @author 20252 + * @createTime 2024/9/5 上午11:09 + * @desc ServiceProjectController... + */ +@Tag(name = "服务项目") +@JsonBody +@RequestMapping("/serviceProject") +@CheckUserType(userTypes = UserType.MANAGEMENT_SECURITY) +public class ServiceProjectController { + + @Autowired + private ServiceProjectService serviceProjectService; + + @Operation(summary = "分页查询") + @PostMapping("/pager") + public Page pager(@RequestBody PageParams queryParams) { + return serviceProjectService.pager(queryParams); + } + + @Operation(summary = "新增或者保存") + @PostMapping("/saveOrUpdate") + public void saveOrUpdate(@RequestBody ServiceProjectSaveOrUpdateParams params) { + serviceProjectService.saveOrUpdate(params); + } + + @Operation(summary = "根据id删除") + @DeleteMapping("/deleteById") + public void deleteById(@RequestParam Long serviceProjectId) { + boolean b = serviceProjectService.removeById(serviceProjectId); + if (!b) { + throw new MessageException(); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/controller/SuperController.java b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/SuperController.java new file mode 100644 index 0000000..cbc7440 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/controller/SuperController.java @@ -0,0 +1,54 @@ +package com.changhu.module.management.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.module.management.pojo.params.ManagementSuperUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.PoliceUnitPagerQueryParams; +import com.changhu.module.management.pojo.queryParams.SecurityUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.PoliceUnitPagerVo; +import com.changhu.module.management.pojo.vo.SecurityUnitPagerVo; +import com.changhu.module.management.service.SuperService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:38 + * @desc ManagementSuperController... + */ +@Tag(name = "超级后台") +@JsonBody +@RequestMapping("/management/super") +@CheckUserType(userTypes = UserType.MANAGEMENT_SUPER) +public class SuperController { + + @Autowired + private SuperService superService; + + @Operation(summary = "新增或保存后台用户") + @PostMapping("/saveOrUpdateUser") + public void saveOrUpdateUser(@RequestBody @Valid ManagementSuperUserSaveOrUpdateParams params) { + superService.saveOrUpdateUser(params); + } + + @Operation(summary = "公安单位分页查询") + @PostMapping("/policeUnit/pager") + public Page policeUnitPager(@RequestBody PageParams queryParams) { + return superService.policeUnitPager(queryParams); + } + + @Operation(summary = "保安单位分页查询") + @PostMapping("/securityUnit/pager") + public Page securityUnitPager(@RequestBody PageParams queryParams) { + return superService.securityUnitPager(queryParams); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/enums/UnitOptType.java b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/UnitOptType.java new file mode 100644 index 0000000..d6116e2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/UnitOptType.java @@ -0,0 +1,22 @@ +package com.changhu.module.management.enums; + +import com.changhu.module.management.enums.handler.AbstractUnitTypeHandler; +import com.changhu.module.management.enums.handler.PoliceUnitTypeHandler; +import com.changhu.module.management.enums.handler.SecurityUnitTypeHandler; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:51 + * @desc IndexCheckPass... + */ +@AllArgsConstructor +@Getter +public enum UnitOptType { + + SECURITY_UNIT(new SecurityUnitTypeHandler()), + POLICE_UNIT(new PoliceUnitTypeHandler()); + + private final AbstractUnitTypeHandler handler; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/AbstractUnitTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/AbstractUnitTypeHandler.java new file mode 100644 index 0000000..8413f1e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/AbstractUnitTypeHandler.java @@ -0,0 +1,49 @@ +package com.changhu.module.management.enums.handler; + +import cn.hutool.extra.spring.SpringUtil; +import com.changhu.module.management.pojo.vo.UnitCheckStatusVo; +import org.springframework.transaction.PlatformTransactionManager; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:53 + * @desc AbstractCheckPassHandler... + */ +public abstract class AbstractUnitTypeHandler { + + final PlatformTransactionManager transactionManager = SpringUtil.getBean(PlatformTransactionManager.class); + + /** + * 通过 + */ + public abstract void pass(Long checkDataId); + + /** + * 获取审核状态 + * + * @param onlyCode 唯一代码 + * @return 审核状态 + */ + public abstract UnitCheckStatusVo getCheckStatus(String onlyCode); + + /** + * 启用或者禁用状态 + * + * @param unitId 单位id + */ + public abstract void disableOrEnable(Long unitId); + + /** + * 审核通过单位内的小程序用户 + * + * @param miniProgramUserId 小程序用户id + */ + public abstract void passMiniProgramUser(Long miniProgramUserId); + + /** + * 启用或禁用小程序用户 + * + * @param miniProgramUserId 小程序用户id + */ + public abstract void disableOrEnableMiniProgramUser(Long miniProgramUserId); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/PoliceUnitTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/PoliceUnitTypeHandler.java new file mode 100644 index 0000000..0f1c7df --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/PoliceUnitTypeHandler.java @@ -0,0 +1,163 @@ +package com.changhu.module.management.enums.handler; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.changhu.common.db.enums.*; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.pojo.entity.ManagementPoliceUnitUser; +import com.changhu.module.management.pojo.entity.PoliceUnit; +import com.changhu.module.management.pojo.vo.UnitCheckStatusVo; +import com.changhu.module.management.service.ManagementPoliceUnitUserService; +import com.changhu.module.management.service.PoliceUnitService; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import com.changhu.module.miniProgram.service.MiniProgramUserService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.DefaultTransactionDefinition; + +import java.util.List; + + +/** + * @author 20252 + * @createTime 2024/9/2 上午11:03 + * @desc PoliceUnitTypeHandler... + */ +@Slf4j +public class PoliceUnitTypeHandler extends AbstractUnitTypeHandler { + + private final PoliceUnitService policeUnitService = SpringUtil.getBean(PoliceUnitService.class); + + private final ManagementPoliceUnitUserService policeUnitUserService = SpringUtil.getBean(ManagementPoliceUnitUserService.class); + + private final MiniProgramUserService miniProgramUserService = SpringUtil.getBean(MiniProgramUserService.class); + + @Override + public void pass(Long checkDataId) { + DefaultTransactionDefinition def = new DefaultTransactionDefinition(); + TransactionStatus status = transactionManager.getTransaction(def); + + try { + PoliceUnit policeUnit = policeUnitService.getOptById(checkDataId).orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + //更新状态 + boolean update = policeUnitService.lambdaUpdate() + .set(PoliceUnit::getCheckStatus, CheckStatus.checked) + .eq(BaseEntity::getSnowFlakeId, checkDataId) + .update(); + if (!update) { + throw new MessageException(ResultCode.ERROR); + } + //生成管理员账号密码 + String passWordEncrypt = UserUtil.passWordEncrypt(UserUtil.DEFAULT_PASSWORD); + List saltAndPassWord = StrUtil.split(passWordEncrypt, "$$"); + + ManagementPoliceUnitUser managementPoliceUnitUser = new ManagementPoliceUnitUser(); + managementPoliceUnitUser.setPoliceUnitId(policeUnit.getSnowFlakeId()); + managementPoliceUnitUser.setName("超级管理员"); + managementPoliceUnitUser.setSex(Sex.UNKNOWN); + managementPoliceUnitUser.setAccount(RandomUtil.randomString(6)); + managementPoliceUnitUser.setTelephone(""); + managementPoliceUnitUser.setSalt(saltAndPassWord.get(0)); + managementPoliceUnitUser.setPassword(saltAndPassWord.get(1)); + managementPoliceUnitUser.setIsAdmin(IsOrNot.IS); + + boolean save = policeUnitUserService.save(managementPoliceUnitUser); + if (!save) { + throw new MessageException(ResultCode.ERROR); + } + + //提交事务 + transactionManager.commit(status); + } catch (Exception e) { + //回滚事务 + transactionManager.rollback(status); + log.error("公安单位审核通过错误:{}", e.getMessage()); + throw new MessageException(e.getMessage()); + } + } + + @Override + public UnitCheckStatusVo getCheckStatus(String onlyCode) { + PoliceUnit policeUnit = policeUnitService.lambdaQuery() + .eq(PoliceUnit::getCode, onlyCode) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + + UnitCheckStatusVo unitCheckStatusVo = new UnitCheckStatusVo(); + unitCheckStatusVo.setCheckStatus(policeUnit.getCheckStatus()); + + if (policeUnit.getCheckStatus().equals(CheckStatus.checked)) { + ManagementPoliceUnitUser managementPoliceUnitUser = policeUnitUserService.lambdaQuery() + .eq(ManagementPoliceUnitUser::getPoliceUnitId, policeUnit.getSnowFlakeId()) + .eq(ManagementPoliceUnitUser::getIsAdmin, IsOrNot.IS) + .oneOpt() + .orElseThrow(() -> new MessageException("超管账号未初始化 请联系管理员")); + unitCheckStatusVo.setAccount(managementPoliceUnitUser.getAccount()); + unitCheckStatusVo.setRemark("恭喜!单位审核通过了,请使用管理员账号前往登录页进行登录."); + } else { + unitCheckStatusVo.setPassword(null); + unitCheckStatusVo.setRemark("单位注册申请正在审核中..."); + } + return unitCheckStatusVo; + } + + @Override + public void disableOrEnable(Long unitId) { + PoliceUnit policeUnit = policeUnitService.lambdaQuery() + .eq(BaseEntity::getSnowFlakeId, unitId) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + //取反 + IsEnable isEnable = switch (policeUnit.getIsEnable()) { + case TRUE -> IsEnable.FALSE; + case FALSE -> IsEnable.TRUE; + }; + + boolean update = policeUnitService.lambdaUpdate() + .set(PoliceUnit::getIsEnable, isEnable) + .eq(BaseEntity::getSnowFlakeId, unitId) + .update(); + if (!update) { + throw new MessageException(); + } + } + + @Override + public void passMiniProgramUser(Long miniProgramUserId) { + boolean update = miniProgramUserService.lambdaUpdate() + .set(MiniProgramUser::getCheckStatus, CheckStatus.checked) + .eq(BaseEntity::getSnowFlakeId, miniProgramUserId) + .eq(MiniProgramUser::getIdentity, MiniProgramUserIdentity.POLICE) + .update(); + if (!update) { + throw new MessageException(); + } + } + + @Override + public void disableOrEnableMiniProgramUser(Long miniProgramUserId) { + MiniProgramUser miniProgramUser = miniProgramUserService.lambdaQuery() + .eq(BaseEntity::getSnowFlakeId, miniProgramUserId) + .eq(MiniProgramUser::getIdentity, MiniProgramUserIdentity.POLICE) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + + //取反 + IsEnable isEnable = switch (miniProgramUser.getIsEnable()) { + case TRUE -> IsEnable.FALSE; + case FALSE -> IsEnable.TRUE; + }; + + boolean update = miniProgramUserService.lambdaUpdate() + .set(MiniProgramUser::getIsEnable, isEnable) + .eq(BaseEntity::getSnowFlakeId, miniProgramUserId) + .update(); + if (!update) { + throw new MessageException(); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/SecurityUnitTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/SecurityUnitTypeHandler.java new file mode 100644 index 0000000..dd5aac8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/enums/handler/SecurityUnitTypeHandler.java @@ -0,0 +1,166 @@ +package com.changhu.module.management.enums.handler; + +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.changhu.common.db.enums.*; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.pojo.entity.ManagementSecurityUnitUser; +import com.changhu.module.management.pojo.entity.SecurityUnit; +import com.changhu.module.management.pojo.vo.UnitCheckStatusVo; +import com.changhu.module.management.service.ManagementSecurityUnitUserService; +import com.changhu.module.management.service.SecurityUnitService; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import com.changhu.module.miniProgram.service.MiniProgramUserService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.DefaultTransactionDefinition; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:55 + * @desc SecurityCheckPassHandler... + */ +@Slf4j +public class SecurityUnitTypeHandler extends AbstractUnitTypeHandler { + + private final SecurityUnitService securityUnitService = SpringUtil.getBean(SecurityUnitService.class); + + private final ManagementSecurityUnitUserService securityUnitUserService = SpringUtil.getBean(ManagementSecurityUnitUserService.class); + + private final MiniProgramUserService miniProgramUserService = SpringUtil.getBean(MiniProgramUserService.class); + + @Override + public void pass(Long checkDataId) { + DefaultTransactionDefinition def = new DefaultTransactionDefinition(); + TransactionStatus status = transactionManager.getTransaction(def); + + try { + SecurityUnit securityUnit = securityUnitService.getOptById(checkDataId).orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + //更新状态 + boolean update = securityUnitService.lambdaUpdate() + .set(SecurityUnit::getCheckStatus, CheckStatus.checked) + .eq(BaseEntity::getSnowFlakeId, checkDataId) + .update(); + if (!update) { + throw new MessageException(ResultCode.ERROR); + } + //生成简单的超级管理员账号密码 + String passWordEncrypt = UserUtil.passWordEncrypt(UserUtil.DEFAULT_PASSWORD); + List saltAndPassWord = StrUtil.split(passWordEncrypt, "$$"); + + ManagementSecurityUnitUser managementSecurityUnitUser = new ManagementSecurityUnitUser(); + managementSecurityUnitUser.setSecurityUnitId(securityUnit.getSnowFlakeId()); + managementSecurityUnitUser.setName("超级管理员"); + managementSecurityUnitUser.setSex(Sex.UNKNOWN); + managementSecurityUnitUser.setAccount(RandomUtil.randomString(6)); + managementSecurityUnitUser.setTelephone(""); + managementSecurityUnitUser.setSalt(saltAndPassWord.get(0)); + managementSecurityUnitUser.setPassword(saltAndPassWord.get(1)); + managementSecurityUnitUser.setIsEnable(IsEnable.TRUE); + managementSecurityUnitUser.setIsAdmin(IsOrNot.IS); + managementSecurityUnitUser.setRemark("单位审核通过 默认分配超管账号"); + boolean save = securityUnitUserService.save(managementSecurityUnitUser); + if (!save) { + throw new MessageException(ResultCode.ERROR); + } + + //提交事务 + transactionManager.commit(status); + } catch (Exception e) { + //回滚事务 + transactionManager.rollback(status); + log.error("保安单位审核通过错误:{}", e.getMessage()); + throw new MessageException(e.getMessage()); + } + } + + @Override + public UnitCheckStatusVo getCheckStatus(String onlyCode) { + SecurityUnit securityUnit = securityUnitService.lambdaQuery() + .eq(SecurityUnit::getSocialCode, onlyCode) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + + UnitCheckStatusVo unitCheckStatusVo = new UnitCheckStatusVo(); + unitCheckStatusVo.setCheckStatus(securityUnit.getCheckStatus()); + + if (securityUnit.getCheckStatus().equals(CheckStatus.checked)) { + ManagementSecurityUnitUser managementSecurityUnitUser = securityUnitUserService.lambdaQuery() + .eq(ManagementSecurityUnitUser::getSecurityUnitId, securityUnit.getSnowFlakeId()) + .eq(ManagementSecurityUnitUser::getIsAdmin, IsOrNot.IS) + .oneOpt() + .orElseThrow(() -> new MessageException("超管账号未初始化 请联系管理员")); + unitCheckStatusVo.setAccount(managementSecurityUnitUser.getAccount()); + unitCheckStatusVo.setRemark("恭喜!单位审核通过了,请使用管理员账号前往登录页进行登录."); + } else { + unitCheckStatusVo.setPassword(null); + unitCheckStatusVo.setRemark("单位注册申请正在审核中..."); + } + + return unitCheckStatusVo; + } + + @Override + public void disableOrEnable(Long unitId) { + SecurityUnit securityUnit = securityUnitService.lambdaQuery() + .eq(BaseEntity::getSnowFlakeId, unitId) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + //取反 + IsEnable isEnable = switch (securityUnit.getIsEnable()) { + case TRUE -> IsEnable.FALSE; + case FALSE -> IsEnable.TRUE; + }; + + boolean update = securityUnitService.lambdaUpdate() + .set(SecurityUnit::getIsEnable, isEnable) + .eq(BaseEntity::getSnowFlakeId, unitId) + .update(); + if (!update) { + throw new MessageException(); + } + } + + @Override + public void passMiniProgramUser(Long miniProgramUserId) { + boolean update = miniProgramUserService.lambdaUpdate() + .set(MiniProgramUser::getCheckStatus, CheckStatus.checked) + .eq(BaseEntity::getSnowFlakeId, miniProgramUserId) + .eq(MiniProgramUser::getIdentity, MiniProgramUserIdentity.PROJECT_MANAGER) + .update(); + if (!update) { + throw new MessageException(); + } + } + + @Override + public void disableOrEnableMiniProgramUser(Long miniProgramUserId) { + MiniProgramUser miniProgramUser = miniProgramUserService.lambdaQuery() + .eq(BaseEntity::getSnowFlakeId, miniProgramUserId) + .eq(MiniProgramUser::getIdentity, MiniProgramUserIdentity.PROJECT_MANAGER) + .oneOpt() + .orElseThrow(() -> new MessageException(ResultCode.DATA_NOT_FOUND)); + + //取反 + IsEnable isEnable = switch (miniProgramUser.getIsEnable()) { + case TRUE -> IsEnable.FALSE; + case FALSE -> IsEnable.TRUE; + }; + + boolean update = miniProgramUserService.lambdaUpdate() + .set(MiniProgramUser::getIsEnable, isEnable) + .eq(BaseEntity::getSnowFlakeId, miniProgramUserId) + .update(); + if (!update) { + throw new MessageException(); + } + + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/EnterprisesUnitMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/EnterprisesUnitMapper.java new file mode 100644 index 0000000..9d9104d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/EnterprisesUnitMapper.java @@ -0,0 +1,30 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.queryParams.EnterprisesUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.EnterprisesUnitPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * enterprises_unit (企事业单位) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface EnterprisesUnitMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("unitId") Long unitId, + @Param("params") EnterprisesUnitPagerQueryParams params); + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementPoliceUnitUserMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementPoliceUnitUserMapper.java new file mode 100644 index 0000000..0c60b83 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementPoliceUnitUserMapper.java @@ -0,0 +1,28 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.entity.ManagementPoliceUnitUser; +import com.changhu.module.management.pojo.queryParams.ManagementPoliceUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementPoliceUnitUserPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * management_police_user (后台-公安单位用户表) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface ManagementPoliceUnitUserMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") ManagementPoliceUnitUserPagerQueryParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementSecurityUnitUserMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementSecurityUnitUserMapper.java new file mode 100644 index 0000000..d87e762 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementSecurityUnitUserMapper.java @@ -0,0 +1,28 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.entity.ManagementSecurityUnitUser; +import com.changhu.module.management.pojo.queryParams.ManagementSecurityUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementSecurityUnitUserPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * management_security_unit_user (后台-保安单位用户表) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface ManagementSecurityUnitUserMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") ManagementSecurityUnitUserPagerQueryParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementSuperUserMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementSuperUserMapper.java new file mode 100644 index 0000000..bf086ea --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ManagementSuperUserMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.management.pojo.entity.ManagementSuperUser; +import org.apache.ibatis.annotations.Mapper; + +/** + * management_super_user (后台-超级后台) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface ManagementSuperUserMapper extends BaseMapper { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/PoliceUnitMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/PoliceUnitMapper.java new file mode 100644 index 0000000..7626c2c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/PoliceUnitMapper.java @@ -0,0 +1,28 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.entity.PoliceUnit; +import com.changhu.module.management.pojo.queryParams.PoliceUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.PoliceUnitPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * police_unit (公安单位) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface PoliceUnitMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") PoliceUnitPagerQueryParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/SecurityUnitMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/SecurityUnitMapper.java new file mode 100644 index 0000000..cf0e1fe --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/SecurityUnitMapper.java @@ -0,0 +1,28 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.entity.SecurityUnit; +import com.changhu.module.management.pojo.queryParams.SecurityUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.SecurityUnitPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * security_unit (保安单位) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface SecurityUnitMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") SecurityUnitPagerQueryParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ServiceProjectMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ServiceProjectMapper.java new file mode 100644 index 0000000..9850bf1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/mapper/ServiceProjectMapper.java @@ -0,0 +1,48 @@ +package com.changhu.module.management.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.entity.ServiceProject; +import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams; +import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; +import com.changhu.pojo.dto.ServiceProjectDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * service_project (服务项目) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface ServiceProjectMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param params 查询参数 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") ServiceProjectPagerQueryParams params); + + /** + * 获取服务项目 + * + * @return 服务项目列表 + */ + List getServiceProjectList(@Param("policeUnitId") Long policeUnitId, + @Param("projectManagerMiniProgramUserId") Long projectManagerMiniProgramUserId); + + /** + * 获取企事业单位下的服务项目 + * + * @param enterprisesUnitId 企事业单位id + * @return 服务项目列表 + */ + List getServiceProjectByEnterprisesUnitId(@Param("enterprisesUnitId") Long enterprisesUnitId); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java new file mode 100644 index 0000000..9b3fc65 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java @@ -0,0 +1,94 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.locationtech.jts.geom.Point; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 企事业单位 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class EnterprisesUnit extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 所属公安机关id + */ + private Long policeUnitId; + + /** + * 名称 + */ + private String name; + + + /** + * 企事业单位类型 + */ + private EnterprisesUnitType type; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 区/县 + */ + private String districts; + + /** + * 街道 + */ + private String street; + + /** + * 详细地址 + */ + private String address; + + /** + * 坐标 + */ + private Point point; + + /** + * 联系人 + */ + @TableField(typeHandler = Fastjson2TypeHandler.class) + private ContactPersonInfo contactPersonInfo; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementPoliceUnitUser.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementPoliceUnitUser.java new file mode 100644 index 0000000..a43b52b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementPoliceUnitUser.java @@ -0,0 +1,80 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.Sex; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 后台-公安单位用户表 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class ManagementPoliceUnitUser extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 所属公安机关id + */ + private Long policeUnitId; + + /** + * 名称 + */ + private String name; + + /** + * 性别 + */ + private Sex sex; + + /** + * 账号 + */ + private String account; + + /** + * 手机号 + */ + private String telephone; + + /** + * 盐值 + */ + private String salt; + + /** + * 密码 + */ + private String password; + + /** + * 是否启用 + */ + private IsEnable isEnable; + + /** + * 是否是超管 + */ + private IsOrNot isAdmin; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementSecurityUnitUser.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementSecurityUnitUser.java new file mode 100644 index 0000000..4619b82 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementSecurityUnitUser.java @@ -0,0 +1,85 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.Sex; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 后台-保安单位用户表 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class ManagementSecurityUnitUser extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 所属保安公司id + */ + private Long securityUnitId; + + /** + * 名称 + */ + private String name; + + /** + * 性别 + */ + private Sex sex; + + /** + * 账号 + */ + private String account; + + /** + * 手机号 + */ + private String telephone; + + /** + * 盐值 + */ + private String salt; + + /** + * 密码 + */ + private String password; + + /** + * 是否启用 + */ + private IsEnable isEnable; + + /** + * 是否是超管 + */ + private IsOrNot isAdmin; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementSuperUser.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementSuperUser.java new file mode 100644 index 0000000..a2a4e1e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ManagementSuperUser.java @@ -0,0 +1,58 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 后台-超级后台 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class ManagementSuperUser extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 名称 + */ + private String name; + + /** + * 手机号 + */ + private String telephone; + + /** + * 盐值 + */ + private String salt; + + /** + * 密码 + */ + private String password; + + /** + * 是否启用 + */ + private IsEnable isEnable; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/PoliceUnit.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/PoliceUnit.java new file mode 100644 index 0000000..6598f97 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/PoliceUnit.java @@ -0,0 +1,88 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler; +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 公安单位 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class PoliceUnit extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 名称 + */ + private String name; + + /** + * 代码 + */ + private String code; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 区/县 + */ + private String districts; + + /** + * 街道 + */ + private String street; + + /** + * 详细地址 + */ + private String address; + + /** + * 联系人 + */ + @TableField(typeHandler = Fastjson2TypeHandler.class) + private ContactPersonInfo contactPersonInfo; + + /** + * 是否启用 + */ + private IsEnable isEnable; + + /** + * 审核状态 + */ + private CheckStatus checkStatus; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/SecurityUnit.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/SecurityUnit.java new file mode 100644 index 0000000..ae2445b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/SecurityUnit.java @@ -0,0 +1,98 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler; +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.module.management.pojo.model.LegalPersonInfo; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 保安单位 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class SecurityUnit extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 名称 + */ + private String name; + + /** + * 统一社会编码 + */ + private String socialCode; + + /** + * 营业执照 + */ + private String businessLicense; + + /** + * 法人信息 + */ + @TableField(typeHandler = Fastjson2TypeHandler.class) + private LegalPersonInfo legalPersonInfo; + + /** + * 省 + */ + private String province; + + /** + * 市 + */ + private String city; + + /** + * 区/县 + */ + private String districts; + + /** + * 街道 + */ + private String street; + + /** + * 详细地址 + */ + private String address; + + /** + * 公司性质 + */ + private String nature; + + /** + * 是否启用 + */ + private IsEnable isEnable; + + /** + * 审核状态 + */ + private CheckStatus checkStatus; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ServiceProject.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ServiceProject.java new file mode 100644 index 0000000..3adb2ba --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/ServiceProject.java @@ -0,0 +1,99 @@ +package com.changhu.module.management.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.ServiceProjectType; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 服务项目 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class ServiceProject extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 保安单位id + */ + private Long securityUnitId; + + /** + * 企事业单位id + */ + private Long enterprisesUnitId; + + /** + * 项目经理小程序用户id + */ + private Long projectManagerMiniProgramUserId; + + /** + * 名称 + */ + private String name; + + /** + * 服务类型 + */ + private ServiceProjectType type; + + /** + * 是否自招保安(只有当type为property 此字段必填) + */ + private IsOrNot isRecruitSecurity; + + /** + * 证件号(服务类型为保安必填 服务类型为物业则需自招保安为必填) + */ + private String idNumber; + + /** + * 服务区域面积 + */ + private Double serviceArea; + + /** + * 楼栋数量 + */ + private Integer buildingTotal; + + /** + * 户数 + */ + private Integer houseTotal; + + /** + * 工作人员数量 + */ + private Integer staffTotal; + + /** + * 保安人员数量 + */ + private Integer securityUserTotal; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/model/ContactPersonInfo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/model/ContactPersonInfo.java new file mode 100644 index 0000000..28ef868 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/model/ContactPersonInfo.java @@ -0,0 +1,22 @@ +package com.changhu.module.management.pojo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/8/30 下午3:43 + * @desc ContactPersonInfo... + */ +@Data +public class ContactPersonInfo { + + @NotBlank(message = "名字不能为空") + @Schema(description = "名字") + private String name; + + @NotBlank(message = "手机号不能为空") + @Schema(description = "手机号") + private String telephone; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/model/LegalPersonInfo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/model/LegalPersonInfo.java new file mode 100644 index 0000000..df816c3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/model/LegalPersonInfo.java @@ -0,0 +1,20 @@ +package com.changhu.module.management.pojo.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/8/30 上午11:01 + * @desc 法人信息 + */ +@Data +public class LegalPersonInfo { + + @Schema(description = "名字") + private String name; + + @Schema(description = "电话") + private String telephone; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java new file mode 100644 index 0000000..f27bd6a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java @@ -0,0 +1,51 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.locationtech.jts.geom.Point; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/3 下午4:06 + * @desc EnterprisesUnitSaveOrUpdateParams... + */ +@Data +public class EnterprisesUnitSaveOrUpdateParams { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "公安单位id") + private Long policeUnitId; + + @Schema(description = "名称") + @NotBlank(message = "名称不能为空") + private String name; + + @Schema(description = "类型") + @NotNull(message = "类型不能为空") + private EnterprisesUnitType type; + + @Schema(description = "行政区划编码") + @NotEmpty(message = "行政区划不能为空") + private List administrativeDivisionCodes; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "坐标") + private Point point; + + @Schema(description = "联系人") + private ContactPersonInfo contactPersonInfo; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexCheckPassParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexCheckPassParams.java new file mode 100644 index 0000000..adb448b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexCheckPassParams.java @@ -0,0 +1,22 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.module.management.enums.UnitOptType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:59 + * @desc IndexCheckPassParams... + */ +@Data +public class IndexCheckPassParams { + @Schema(description = "审核数据的id") + @NotNull(message = "审核数据的id不能为空") + private Long checkDataId; + + @Schema(description = "单位类型") + @NotNull(message = "单位类型不能为空") + private UnitOptType unitOptType; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexCheckStatusParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexCheckStatusParams.java new file mode 100644 index 0000000..7cce7c9 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexCheckStatusParams.java @@ -0,0 +1,23 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.module.management.enums.UnitOptType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/2 上午10:51 + * @desc IndexCheckStatusParams... + */ +@Data +public class IndexCheckStatusParams { + + @Schema(description = "审核数据的唯一标识") + @NotNull(message = "唯一标识不能为空") + private String onlyCode; + + @Schema(description = "单位类型") + @NotNull(message = "单位类型不能为空") + private UnitOptType unitOptType; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexDisableOrEnableParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexDisableOrEnableParams.java new file mode 100644 index 0000000..f00c4ef --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/IndexDisableOrEnableParams.java @@ -0,0 +1,22 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.module.management.enums.UnitOptType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/3 上午9:28 + * @desc IndexDisableOrEnableParams... + */ +@Data +public class IndexDisableOrEnableParams { + @Schema(description = "数据id") + @NotNull(message = "数据id不能为空") + private Long dataId; + + @Schema(description = "单位类型") + @NotNull(message = "单位类型不能为空") + private UnitOptType unitOptType; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementPoliceUserSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementPoliceUserSaveOrUpdateParams.java new file mode 100644 index 0000000..13a1e2a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementPoliceUserSaveOrUpdateParams.java @@ -0,0 +1,39 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.Sex; +import com.changhu.common.validator.annotation.IsMobile; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/4 下午3:04 + * @desc ManagementPoliceUserSaveOrUpdateParams... + */ +@Data +public class ManagementPoliceUserSaveOrUpdateParams { + + @Schema(description = "id") + private Long snowFlakeId; + + @NotNull(message = "名称不能为空") + @Schema(description = "名称") + private String name; + + @NotNull(message = "性别不能为空") + @Schema(description = "性别") + private Sex sex; + + @IsMobile + @NotBlank(message = "手机号不能为空") + @Schema(description = "手机号") + private String telephone; + + @NotNull(message = "是否启用不能为空") + @Schema(description = "是否启用") + private IsEnable isEnable; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementSecurityUnitUserSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementSecurityUnitUserSaveOrUpdateParams.java new file mode 100644 index 0000000..9e35740 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementSecurityUnitUserSaveOrUpdateParams.java @@ -0,0 +1,41 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.Sex; +import com.changhu.common.validator.annotation.IsMobile; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/3 上午10:26 + * @desc ManagementSecurityUnitUserSaveOrUpdateParams... + */ +@Data +public class ManagementSecurityUnitUserSaveOrUpdateParams { + + @Schema(description = "id") + private Long snowFlakeId; + + @NotBlank(message = "名称不能为空") + @Schema(description = "名称") + private String name; + + @Schema(description = "性别") + @NotNull(message = "性别不能为空") + private Sex sex; + + @IsMobile + @NotBlank(message = "手机号不能为空") + private String telephone; + + @NotNull(message = "启用状态不能为空") + @Schema(description = "启用状态") + private IsEnable isEnable; + + @Schema(description = "备注") + private String remark; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementSuperUserSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementSuperUserSaveOrUpdateParams.java new file mode 100644 index 0000000..3668686 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ManagementSuperUserSaveOrUpdateParams.java @@ -0,0 +1,26 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.common.validator.annotation.IsMobile; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:47 + * @desc ManagementSuperUserSaveOrUpdateParams... + */ +@Data +public class ManagementSuperUserSaveOrUpdateParams { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "名称") + @NotNull(message = "用户名不能为空") + private String name; + + @Schema(description = "手机号") + @IsMobile + private String telephone; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ServiceProjectSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ServiceProjectSaveOrUpdateParams.java new file mode 100644 index 0000000..2e83f4b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/ServiceProjectSaveOrUpdateParams.java @@ -0,0 +1,58 @@ +package com.changhu.module.management.pojo.params; + +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.ServiceProjectType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/5 上午11:36 + * @desc ServiceProjectSaveOrUpdateParams... + */ +@Data +public class ServiceProjectSaveOrUpdateParams { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "企事业单位id") + @NotNull(message = "企事业单位不能为空") + private Long enterprisesUnitId; + + @Schema(description = "项目经理小程序用户id") + private Long projectManagerMiniProgramUserId; + + @Schema(description = "名称") + @NotNull(message = "名称不能为空") + private String name; + + @Schema(description = "服务类型") + @NotNull(message = "服务类型不能为空") + private ServiceProjectType type; + + @Schema(description = "是否自招保安(只有当type为property 此字段必填)") + private IsOrNot isRecruitSecurity; + + @Schema(description = "证件号(服务类型为保安必填 服务类型为物业则需自招保安为必填)") + private String idNumber; + + @Schema(description = "服务区域面积") + private Double serviceArea; + + @Schema(description = "楼栋数量") + private Integer buildingTotal; + + @Schema(description = "户数") + private Integer houseTotal; + + @Schema(description = "工作人员数量") + private Integer staffTotal; + + @Schema(description = "保安人员数量") + private Integer securityUserTotal; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/EnterprisesUnitPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/EnterprisesUnitPagerQueryParams.java new file mode 100644 index 0000000..67d2138 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/EnterprisesUnitPagerQueryParams.java @@ -0,0 +1,23 @@ +package com.changhu.module.management.pojo.queryParams; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/3 下午3:27 + * @desc EnterprisesUnitPagerQueryParams... + */ +@Data +public class EnterprisesUnitPagerQueryParams { + + @Schema(description = "公安单位id") + private Long policeUnitId; + + @Schema(description = "名称") + private String name; + @Schema(description = "详细地址") + private String address; + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ManagementPoliceUnitUserPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ManagementPoliceUnitUserPagerQueryParams.java new file mode 100644 index 0000000..815a0ab --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ManagementPoliceUnitUserPagerQueryParams.java @@ -0,0 +1,23 @@ +package com.changhu.module.management.pojo.queryParams; + +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/4 下午3:22 + * @desc ManagementPoliceUnitUserPagerQueryParams... + */ +@Data +public class ManagementPoliceUnitUserPagerQueryParams { + @Schema(description = "名字") + private String name; + @Schema(description = "手机号") + private String telephone; + @Schema(description = "性别") + private Sex sex; + @Schema(description = "是否启用") + private IsEnable isEnable; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ManagementSecurityUnitUserPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ManagementSecurityUnitUserPagerQueryParams.java new file mode 100644 index 0000000..4d7b2cd --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ManagementSecurityUnitUserPagerQueryParams.java @@ -0,0 +1,20 @@ +package com.changhu.module.management.pojo.queryParams; + +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/3 上午11:02 + * @desc ManagementSecurityUnitUserPagerQueryParams... + */ +@Data +public class ManagementSecurityUnitUserPagerQueryParams { + @Schema(description = "名字") + private String name; + @Schema(description = "手机号") + private String telephone; + @Schema(description = "性别") + private Sex sex; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/PoliceUnitPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/PoliceUnitPagerQueryParams.java new file mode 100644 index 0000000..178e81f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/PoliceUnitPagerQueryParams.java @@ -0,0 +1,32 @@ +package com.changhu.module.management.pojo.queryParams; + +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/8/30 下午3:55 + * @desc PoliceUnitPagerQueryParams... + */ +@Data +public class PoliceUnitPagerQueryParams { + + @Schema(description = "名称") + private String name; + + @Schema(description = "代码") + private String code; + + @Schema(description = "行政区划") + private List administrativeDivisionCodes; + + @Schema(description = "是否启用") + private IsEnable isEnable; + + @Schema(description = "审核状态") + private CheckStatus checkStatus; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/SecurityUnitPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/SecurityUnitPagerQueryParams.java new file mode 100644 index 0000000..253c23b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/SecurityUnitPagerQueryParams.java @@ -0,0 +1,27 @@ +package com.changhu.module.management.pojo.queryParams; + +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/8/30 上午11:03 + * @desc SecurityUnitPagerQueryParams... + */ +@Data +public class SecurityUnitPagerQueryParams { + @Schema(description = "名称") + private String name; + @Schema(description = "社会编码") + private String socialCode; + @Schema(description = "行政区划编码") + private List administrativeDivisionCodes; + @Schema(description = "是否启用") + private IsEnable isEnable; + @Schema(description = "审核状态") + private CheckStatus checkStatus; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ServiceProjectPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ServiceProjectPagerQueryParams.java new file mode 100644 index 0000000..545ef53 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/ServiceProjectPagerQueryParams.java @@ -0,0 +1,22 @@ +package com.changhu.module.management.pojo.queryParams; + +import com.changhu.common.db.enums.ServiceProjectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/5 上午11:15 + * @desc ServiceProjectPagerQueryParams... + */ +@Data +public class ServiceProjectPagerQueryParams { + @Schema(description = "服务项目名称") + private String name; + @Schema(description = "服务项目类型") + private ServiceProjectType type; + @Schema(description = "备注") + private String remark; + @Schema(description = "项目经理小程序用户名称") + private String projectManagerMiniProgramUserName; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/UnitMiniProgramUserPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/UnitMiniProgramUserPagerQueryParams.java new file mode 100644 index 0000000..e01b151 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/queryParams/UnitMiniProgramUserPagerQueryParams.java @@ -0,0 +1,23 @@ +package com.changhu.module.management.pojo.queryParams; + +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/6 下午4:53 + * @desc UnitMiniProgramUserPagerQueryParams... + */ +@Data +public class UnitMiniProgramUserPagerQueryParams { + @Schema(description = "名称") + private String name; + @Schema(description = "性别") + private Sex sex; + @Schema(description = "手机号") + private String telephone; + @Schema(description = "是否启用") + private IsEnable isEnable; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java new file mode 100644 index 0000000..11c2e6e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java @@ -0,0 +1,65 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.pojo.vo.CreateOrUpdateUser; +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.locationtech.jts.geom.Point; + +/** + * @author 20252 + * @createTime 2024/9/3 下午3:22 + * @desc EnterprisesUnitPagerVo... + */ +@Data +public class EnterprisesUnitPagerVo { + @Schema(description = "id") + private Long snowFlakeId; + @Schema(description = "名字") + private String name; + + @Schema(description = "类型") + private EnterprisesUnitType type; + + @Schema(description = "公安单位id") + private Long policeUnitId; + + @Schema(description = "省编码") + private String province; + @Schema(description = "省名称") + private String provinceName; + + @Schema(description = "市编码") + private String city; + @Schema(description = "市名称") + private String cityName; + + @Schema(description = "区编码") + private String districts; + @Schema(description = "区名称") + private String districtsName; + + @Schema(description = "街编码") + private String street; + @Schema(description = "街名称") + private String streetName; + + @Schema(description = "地址") + private String address; + + @Schema(description = "位置") + private Point point; + + @Schema(description = "联系方式") + private ContactPersonInfo contactPersonInfo; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建人") + private CreateOrUpdateUser createUser; + @Schema(description = "创建时间") + private String createTime; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ManagementPoliceUnitUserPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ManagementPoliceUnitUserPagerVo.java new file mode 100644 index 0000000..8866963 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ManagementPoliceUnitUserPagerVo.java @@ -0,0 +1,46 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/9/3 上午10:59 + * @desc ManagementSecurityUnitUserPagerVo... + */ +@Data +public class ManagementPoliceUnitUserPagerVo { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "性别") + private Sex sex; + + @Schema(description = "账号") + private String account; + + @Schema(description = "手机号") + private String telephone; + + + @Schema(description = "是否启用") + private IsEnable isEnable; + + @Schema(description = "是否是超管") + private IsOrNot isAdmin; + + @Schema(description = "创建人") + private String createUserName; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ManagementSecurityUnitUserPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ManagementSecurityUnitUserPagerVo.java new file mode 100644 index 0000000..d62c7af --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ManagementSecurityUnitUserPagerVo.java @@ -0,0 +1,49 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/9/3 上午10:59 + * @desc ManagementSecurityUnitUserPagerVo... + */ +@Data +public class ManagementSecurityUnitUserPagerVo { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "性别") + private Sex sex; + + @Schema(description = "账号") + private String account; + + @Schema(description = "手机号") + private String telephone; + + + @Schema(description = "是否启用") + private IsEnable isEnable; + + @Schema(description = "是否是超管") + private IsOrNot isAdmin; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建人") + private String createUserName; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/PoliceUnitPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/PoliceUnitPagerVo.java new file mode 100644 index 0000000..e78fd8c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/PoliceUnitPagerVo.java @@ -0,0 +1,62 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/8/30 下午3:55 + * @desc PoliceUnitPagerVo... + */ +@Data +public class PoliceUnitPagerVo { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "代码") + private String code; + + @Schema(description = "省编码") + private String province; + @Schema(description = "省名字") + private String provinceName; + + @Schema(description = "市编码") + private String city; + @Schema(description = "市名字") + private String cityName; + + @Schema(description = "区/县编码") + private String districts; + @Schema(description = "区/县名字") + private String districtsName; + + @Schema(description = "街道编码") + private String street; + @Schema(description = "街道编码") + private String streetName; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "联系人") + private ContactPersonInfo contactPersonInfo; + + @Schema(description = "是否启用") + private IsEnable isEnable; + + @Schema(description = "审核状态") + private CheckStatus checkStatus; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/SecurityUnitPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/SecurityUnitPagerVo.java new file mode 100644 index 0000000..57a09f3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/SecurityUnitPagerVo.java @@ -0,0 +1,67 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.module.management.pojo.model.LegalPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/8/30 上午10:50 + * @desc SecurityUnitPagerVo... + */ +@Data +public class SecurityUnitPagerVo { + @Schema(description = "雪花id") + private Long snowFlakeId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "社会编码") + private String socialCode; + + @Schema(description = "营业执照") + private String businessLicense; + + @Schema(description = "法人信息") + private LegalPersonInfo legalPersonInfo; + + @Schema(description = "省编码") + private String province; + @Schema(description = "省名字") + private String provinceName; + + @Schema(description = "市编码") + private String city; + @Schema(description = "市名字") + private String cityName; + + @Schema(description = "区/县编码") + private String districts; + @Schema(description = "区/县名字") + private String districtsName; + + @Schema(description = "街道编码") + private String street; + @Schema(description = "街道编码") + private String streetName; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "公司性质") + private String nature; + + @Schema(description = "是否启用") + private IsEnable isEnable; + + @Schema(description = "审核状态") + private CheckStatus checkStatus; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ServiceProjectPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ServiceProjectPagerVo.java new file mode 100644 index 0000000..61fc824 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/ServiceProjectPagerVo.java @@ -0,0 +1,69 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.ServiceProjectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/5 上午11:15 + * @desc ServiceProjectPagerVo... + */ +@Data +public class ServiceProjectPagerVo { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "企事业单位id") + private Long enterprisesUnitId; + @Schema(description = "企事业单位名称") + private String enterprisesUnitName; + @Schema(description = "企事业单位行政区划编码") + private List enterprisesUnitAdministrativeDivisionCodes; + + @Schema(description = "项目经理小程序用户id") + private Long projectManagerMiniProgramUserId; + @Schema(description = "项目经理小程序用户名称") + private String projectManagerMiniProgramUserName; + + @Schema(description = "服务项目名称") + private String name; + + @Schema(description = "服务类型") + private ServiceProjectType type; + + @Schema(description = "是否自招保安(只有当type为property 此字段必填)") + private IsOrNot isRecruitSecurity; + + @Schema(description = "证件号(服务类型为保安必填 服务类型为物业则需自招保安为必填)") + private String idNumber; + + @Schema(description = "服务区域面积") + private Double serviceArea; + + @Schema(description = "楼栋数量") + private Integer buildingTotal; + + @Schema(description = "户数") + private Integer houseTotal; + + @Schema(description = "工作人员数量") + private Integer staffTotal; + + @Schema(description = "保安人员数量") + private Integer securityUserTotal; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建人名称") + private String createUserName; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/UnitCheckStatusVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/UnitCheckStatusVo.java new file mode 100644 index 0000000..de656c9 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/UnitCheckStatusVo.java @@ -0,0 +1,22 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.utils.UserUtil; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/2 上午10:42 + * @desc SecurityUnitCheckStatusVo... + */ +@Data +public class UnitCheckStatusVo { + + private CheckStatus checkStatus; + + private String remark; + + private String account; + + private String password = UserUtil.DEFAULT_PASSWORD; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/UnitMiniProgramUserPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/UnitMiniProgramUserPagerVo.java new file mode 100644 index 0000000..9511ae7 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/UnitMiniProgramUserPagerVo.java @@ -0,0 +1,46 @@ +package com.changhu.module.management.pojo.vo; + +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/9/6 下午4:32 + * @desc 单位下的微信小程序用户 + */ +@Data +public class UnitMiniProgramUserPagerVo { + + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "名称") + private String name; + + @Schema(description = "手机号") + private String telephone; + + @Schema(description = "性别") + private Sex sex; + + @Schema(description = "身份证") + private String idCard; + + @Schema(description = "身份") + private MiniProgramUserIdentity identity; + + @Schema(description = "审核状态") + private CheckStatus checkStatus; + + @Schema(description = "是否启用") + private IsEnable isEnable; + + @Schema(description = ":创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/EnterprisesUnitService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/EnterprisesUnitService.java new file mode 100644 index 0000000..5a8524c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/EnterprisesUnitService.java @@ -0,0 +1,43 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.params.EnterprisesUnitSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.EnterprisesUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.EnterprisesUnitPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +import java.util.List; + +/** + * enterprises_unit (企事业单位) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface EnterprisesUnitService extends IService { + + /** + * 分页查询 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page pager(PageParams queryParams); + + /** + * 新增或保存 + * + * @param params 参数 + */ + void saveOrUpdate(EnterprisesUnitSaveOrUpdateParams params); + + /** + * 根据行政区划编码查询下面的企事业单位 + * + * @param administrativeDivisionCodes 行政区划编码 + * @return 结果 + */ + List> queryListByAdministrativeDivisionCodes(List administrativeDivisionCodes); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementPoliceUnitUserService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementPoliceUnitUserService.java new file mode 100644 index 0000000..d70efca --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementPoliceUnitUserService.java @@ -0,0 +1,13 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.management.pojo.entity.ManagementPoliceUnitUser; + +/** + * management_police_user (后台-公安单位用户表) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface ManagementPoliceUnitUserService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementSecurityUnitUserService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementSecurityUnitUserService.java new file mode 100644 index 0000000..bcee24a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementSecurityUnitUserService.java @@ -0,0 +1,13 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.management.pojo.entity.ManagementSecurityUnitUser; + +/** + * management_security_unit_user (后台-保安单位用户表) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface ManagementSecurityUnitUserService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementService.java new file mode 100644 index 0000000..9fd2787 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementService.java @@ -0,0 +1,63 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.params.IndexCheckPassParams; +import com.changhu.module.management.pojo.params.IndexCheckStatusParams; +import com.changhu.module.management.pojo.params.IndexDisableOrEnableParams; +import com.changhu.module.management.pojo.queryParams.UnitMiniProgramUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.UnitCheckStatusVo; +import com.changhu.module.management.pojo.vo.UnitMiniProgramUserPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:49 + * @desc IndexService... + */ +public interface ManagementService { + + /** + * 审核通过 + * + * @param params 审核参数 + */ + void checkPass(IndexCheckPassParams params); + + /** + * 获取审核状态 + * + * @param params 参数 + * @return 结果 + */ + UnitCheckStatusVo getCheckStatus(IndexCheckStatusParams params); + + /** + * 启用或者禁用单位 + * + * @param params 参数 + */ + void disableOrEnable(IndexDisableOrEnableParams params); + + /** + * 查询单位下的小程序用户 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page miniProgramUserPager(PageParams queryParams); + + /** + * 审核通过小程序用户 + * + * @param params 参数 + */ + void passMiniProgramUser(IndexDisableOrEnableParams params); + + /** + * 禁用或启用小程序用户 + * + * @param params 参数 + */ + void disableOrEnableMiniProgramUser(IndexDisableOrEnableParams params); + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementSuperUserService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementSuperUserService.java new file mode 100644 index 0000000..90d8e43 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ManagementSuperUserService.java @@ -0,0 +1,13 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.management.pojo.entity.ManagementSuperUser; + +/** + * management_super_user (后台-超级后台) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface ManagementSuperUserService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/PoliceService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/PoliceService.java new file mode 100644 index 0000000..2f129f8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/PoliceService.java @@ -0,0 +1,37 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.params.ManagementPoliceUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ManagementPoliceUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementPoliceUnitUserPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:59 + * @desc MPoliceService... + */ +public interface PoliceService { + /** + * 新增或保存后台用户 + * + * @param params 参数 + */ + void userSaveOrUpdate(ManagementPoliceUserSaveOrUpdateParams params); + + /** + * 后台用户分页查询 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page userPager(PageParams queryParams); + + /** + * 根据id删除后台用户 + * + * @param managementPoliceUnitUserId 后台用户id + */ + void userDeleteById(Long managementPoliceUnitUserId); + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/PoliceUnitService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/PoliceUnitService.java new file mode 100644 index 0000000..5ebe889 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/PoliceUnitService.java @@ -0,0 +1,14 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.management.pojo.entity.PoliceUnit; + +/** + * police_unit (公安单位) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface PoliceUnitService extends IService { + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/SecurityService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/SecurityService.java new file mode 100644 index 0000000..fde7bda --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/SecurityService.java @@ -0,0 +1,46 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.management.pojo.params.ManagementSecurityUnitUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ManagementSecurityUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementSecurityUnitUserPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午10:17 + * @desc SecurityService... + */ +public interface SecurityService { + /** + * 新增或修改后台用户 + * + * @param saveOrUpdateParams 参数 + */ + void userSaveOrUpdate(ManagementSecurityUnitUserSaveOrUpdateParams saveOrUpdateParams); + + /** + * 分页查询后台用户 + * + * @param queryParams 分页查询后台用户 + * @return 结果 + */ + Page userPager(PageParams queryParams); + + /** + * 根据id删除后台用户 + * + * @param managementSecurityUnitUserId 用户id + */ + void userDeleteById(Long managementSecurityUnitUserId); + + /** + * 查询单位下的项目经理 + * + * @return 项目经理 + */ + List> listProjectManager(); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/SecurityUnitService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/SecurityUnitService.java new file mode 100644 index 0000000..cc3b160 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/SecurityUnitService.java @@ -0,0 +1,13 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.management.pojo.entity.SecurityUnit; + +/** + * security_unit (保安单位) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface SecurityUnitService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/ServiceProjectService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ServiceProjectService.java new file mode 100644 index 0000000..8f8d735 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/ServiceProjectService.java @@ -0,0 +1,43 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.management.pojo.entity.ServiceProject; +import com.changhu.module.management.pojo.params.ServiceProjectSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams; +import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo; +import com.changhu.pojo.dto.ServiceProjectDTO; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +import java.util.List; + +/** + * service_project (服务项目) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface ServiceProjectService extends IService { + + /** + * 分页查询 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page pager(PageParams queryParams); + + /** + * 新增或者修改 + * + * @param params 参数 + */ + void saveOrUpdate(ServiceProjectSaveOrUpdateParams params); + + /** + * 获取企事业单位下的服务项目 + * + * @param enterprisesUnitId 企事业单位id + * @return 服务项目列表 + */ + List getServiceProjectByEnterprisesUnitId(Long enterprisesUnitId); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/SuperService.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/SuperService.java new file mode 100644 index 0000000..abf8694 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/SuperService.java @@ -0,0 +1,40 @@ +package com.changhu.module.management.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.management.pojo.params.ManagementSuperUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.PoliceUnitPagerQueryParams; +import com.changhu.module.management.pojo.queryParams.SecurityUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.PoliceUnitPagerVo; +import com.changhu.module.management.pojo.vo.SecurityUnitPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.apache.ibatis.annotations.Param; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:52 + * @desc SuperService... + */ +public interface SuperService { + /** + * 新增或保存后台用户 + * + * @param params 参数 + */ + void saveOrUpdateUser(ManagementSuperUserSaveOrUpdateParams params); + + /** + * 公安单位分页查询 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page policeUnitPager(@Param("queryParams") PageParams queryParams); + + /** + * 保安单位分页查询 + * + * @param queryParams 查询参数 + * @return 结果 + */ + Page securityUnitPager(PageParams queryParams); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/EnterprisesUnitServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/EnterprisesUnitServiceImpl.java new file mode 100644 index 0000000..c291287 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/EnterprisesUnitServiceImpl.java @@ -0,0 +1,91 @@ +package com.changhu.module.management.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.EnterprisesUnitMapper; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.params.EnterprisesUnitSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.EnterprisesUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.EnterprisesUnitPagerVo; +import com.changhu.module.management.service.EnterprisesUnitService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * enterprises_unit (企事业单位) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class EnterprisesUnitServiceImpl extends ServiceImpl implements EnterprisesUnitService { + + @Override + public Page pager(PageParams queryParams) { + return switch (UserUtil.getUserType()) { + case MANAGEMENT_POLICE -> baseMapper.pager(queryParams.getPage(), UserUtil.getUnitId(), queryParams.getParams()); + case MANAGEMENT_SUPER -> baseMapper.pager(queryParams.getPage(), null, queryParams.getParams()); + default -> throw new MessageException(); + }; + } + + @Override + public void saveOrUpdate(EnterprisesUnitSaveOrUpdateParams params) { + EnterprisesUnit enterprisesUnit = BeanUtil.copyProperties(params, EnterprisesUnit.class); + //需要将行政区划编码转换为省市区 + Optional.ofNullable(params.getAdministrativeDivisionCodes()) + .ifPresent(codes -> { + if (!codes.isEmpty()) { + enterprisesUnit.setProvince(codes.get(0)); + } + if (codes.size() >= 2) { + enterprisesUnit.setCity(codes.get(1)); + } + if (codes.size() >= 3) { + enterprisesUnit.setDistricts(codes.get(2)); + } + if (codes.size() >= 4) { + enterprisesUnit.setStreet(codes.get(3)); + } + }); + //如果身份是公安的 是不会携带单位id的 从用户信息里取出来 + if (UserType.MANAGEMENT_POLICE.equals(UserUtil.getUserType())) { + enterprisesUnit.setPoliceUnitId(UserUtil.getUnitId()); + } + boolean b = this.saveOrUpdate(enterprisesUnit); + if (!b) { + throw new MessageException(); + } + } + + @Override + public List> queryListByAdministrativeDivisionCodes(List administrativeDivisionCodes) { + String addr = LambdaUtil.getFieldName(EnterprisesUnit::getAddress); + String rem = LambdaUtil.getFieldName(EnterprisesUnit::getRemark); + return this.lambdaQuery() + .eq(!administrativeDivisionCodes.isEmpty(), EnterprisesUnit::getProvince, administrativeDivisionCodes.get(0)) + .eq(administrativeDivisionCodes.size() >= 2, EnterprisesUnit::getCity, administrativeDivisionCodes.get(1)) + .eq(administrativeDivisionCodes.size() >= 3, EnterprisesUnit::getDistricts, administrativeDivisionCodes.get(2)) + .eq(administrativeDivisionCodes.size() >= 4, EnterprisesUnit::getStreet, administrativeDivisionCodes.get(3)) + .list() + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .extData(Dict.of( + addr, item.getAddress(), + rem, item.getRemark() + )) + .build()) + .toList(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementPoliceUnitUserServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementPoliceUnitUserServiceImpl.java new file mode 100644 index 0000000..3d6d0e5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementPoliceUnitUserServiceImpl.java @@ -0,0 +1,18 @@ +package com.changhu.module.management.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.management.mapper.ManagementPoliceUnitUserMapper; +import com.changhu.module.management.pojo.entity.ManagementPoliceUnitUser; +import com.changhu.module.management.service.ManagementPoliceUnitUserService; +import org.springframework.stereotype.Service; + + +/** + * management_police_user (后台-公安单位用户表) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class ManagementPoliceUnitUserServiceImpl extends ServiceImpl implements ManagementPoliceUnitUserService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementSecurityUnitUserServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementSecurityUnitUserServiceImpl.java new file mode 100644 index 0000000..38a4fc6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementSecurityUnitUserServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.management.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.management.mapper.ManagementSecurityUnitUserMapper; +import com.changhu.module.management.pojo.entity.ManagementSecurityUnitUser; +import com.changhu.module.management.service.ManagementSecurityUnitUserService; +import org.springframework.stereotype.Service; + +/** + * management_security_unit_user (后台-保安单位用户表) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class ManagementSecurityUnitUserServiceImpl extends ServiceImpl implements ManagementSecurityUnitUserService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementServiceImpl.java new file mode 100644 index 0000000..48a7fad --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementServiceImpl.java @@ -0,0 +1,76 @@ +package com.changhu.module.management.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.pojo.params.IndexCheckPassParams; +import com.changhu.module.management.pojo.params.IndexCheckStatusParams; +import com.changhu.module.management.pojo.params.IndexDisableOrEnableParams; +import com.changhu.module.management.pojo.queryParams.UnitMiniProgramUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.UnitCheckStatusVo; +import com.changhu.module.management.pojo.vo.UnitMiniProgramUserPagerVo; +import com.changhu.module.management.service.ManagementService; +import com.changhu.module.miniProgram.mapper.MiniProgramUserMapper; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author 20252 + * @createTime 2024/9/2 上午9:49 + * @desc IndexServiceImpl... + */ +@Service +public class ManagementServiceImpl implements ManagementService { + + @Autowired + private MiniProgramUserMapper miniProgramUserMapper; + + @Override + public void checkPass(IndexCheckPassParams params) { + params.getUnitOptType() + .getHandler() + .pass(params.getCheckDataId()); + } + + @Override + public UnitCheckStatusVo getCheckStatus(IndexCheckStatusParams params) { + return params.getUnitOptType() + .getHandler() + .getCheckStatus(params.getOnlyCode()); + } + + @Override + public void disableOrEnable(IndexDisableOrEnableParams params) { + params.getUnitOptType() + .getHandler() + .disableOrEnable(params.getDataId()); + } + + @Override + public Page miniProgramUserPager(PageParams queryParams) { + UserType userType = UserUtil.getUserType(); + MiniProgramUserIdentity identity = switch (userType) { + case MANAGEMENT_POLICE -> MiniProgramUserIdentity.POLICE; + case MANAGEMENT_SECURITY -> MiniProgramUserIdentity.PROJECT_MANAGER; + default -> throw new MessageException("用户类型不匹配"); + }; + return miniProgramUserMapper.pager(queryParams.getPage(), queryParams.getParams(), identity); + } + + @Override + public void passMiniProgramUser(IndexDisableOrEnableParams params) { + params.getUnitOptType() + .getHandler() + .passMiniProgramUser(params.getDataId()); + } + + @Override + public void disableOrEnableMiniProgramUser(IndexDisableOrEnableParams params) { + params.getUnitOptType() + .getHandler() + .disableOrEnableMiniProgramUser(params.getDataId()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementSuperUserServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementSuperUserServiceImpl.java new file mode 100644 index 0000000..501cab0 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ManagementSuperUserServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.management.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.management.mapper.ManagementSuperUserMapper; +import com.changhu.module.management.pojo.entity.ManagementSuperUser; +import com.changhu.module.management.service.ManagementSuperUserService; +import org.springframework.stereotype.Service; + +/** + * management_super_user (后台-超级后台) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class ManagementSuperUserServiceImpl extends ServiceImpl implements ManagementSuperUserService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/PoliceServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/PoliceServiceImpl.java new file mode 100644 index 0000000..685d9ae --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/PoliceServiceImpl.java @@ -0,0 +1,94 @@ +package com.changhu.module.management.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.EnterprisesUnitMapper; +import com.changhu.module.management.mapper.ManagementPoliceUnitUserMapper; +import com.changhu.module.management.pojo.entity.ManagementPoliceUnitUser; +import com.changhu.module.management.pojo.params.ManagementPoliceUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ManagementPoliceUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementPoliceUnitUserPagerVo; +import com.changhu.module.management.service.PoliceService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:59 + * @desc MPoliceServiceImpl... + */ +@Service +public class PoliceServiceImpl implements PoliceService { + + @Autowired + private ManagementPoliceUnitUserMapper managementPoliceUnitUserMapper; + + @Autowired + private EnterprisesUnitMapper enterprisesUnitMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public void userSaveOrUpdate(ManagementPoliceUserSaveOrUpdateParams params) { + //查看手机号是否存在 + boolean exists = Db.lambdaQuery(ManagementPoliceUnitUser.class) + .ne(params.getSnowFlakeId() != null, BaseEntity::getSnowFlakeId, params.getSnowFlakeId()) + .eq(ManagementPoliceUnitUser::getTelephone, params.getTelephone()) + .exists(); + if (exists) { + throw new MessageException("该手机号已存在"); + } + ManagementPoliceUnitUser managementPoliceUnitUser = BeanUtil.copyProperties(params, ManagementPoliceUnitUser.class); + //新增 补全信息 + if (managementPoliceUnitUser.getSnowFlakeId() == null) { + String account = RandomUtil.randomString(6); + boolean accExits = Db.lambdaQuery(ManagementPoliceUnitUser.class).eq(ManagementPoliceUnitUser::getAccount, account).exists(); + if (accExits) { + throw new MessageException("生成的账号已存在 请重新提交生成"); + } + //生成账号 + managementPoliceUnitUser.setAccount(account); + //补全单位 + managementPoliceUnitUser.setPoliceUnitId(UserUtil.getUnitId()); + //生成密码 + String passWordEncrypt = UserUtil.passWordEncrypt(UserUtil.DEFAULT_PASSWORD); + List saltAndPassWord = StrUtil.split(passWordEncrypt, "$$"); + managementPoliceUnitUser.setSalt(saltAndPassWord.get(0)); + managementPoliceUnitUser.setPassword(saltAndPassWord.get(1)); + } + Db.saveOrUpdate(managementPoliceUnitUser); + } + + @Override + public Page userPager(PageParams queryParams) { + return managementPoliceUnitUserMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Override + public void userDeleteById(Long managementPoliceUnitUserId) { + Long unitId = UserUtil.getUnitId(); + Long l = Db.lambdaQuery(ManagementPoliceUnitUser.class) + .eq(BaseEntity::getSnowFlakeId, managementPoliceUnitUserId) + .oneOpt() + .map(ManagementPoliceUnitUser::getPoliceUnitId) + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); + if (!unitId.equals(l)) { + throw new MessageException("单位不匹配,无权操作"); + } + boolean b = Db.removeById(managementPoliceUnitUserId, ManagementPoliceUnitUser.class); + if (!b) { + throw new MessageException(); + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/PoliceUnitServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/PoliceUnitServiceImpl.java new file mode 100644 index 0000000..32716b8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/PoliceUnitServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.management.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.management.mapper.PoliceUnitMapper; +import com.changhu.module.management.pojo.entity.PoliceUnit; +import com.changhu.module.management.service.PoliceUnitService; +import org.springframework.stereotype.Service; + +/** + * police_unit (公安单位) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class PoliceUnitServiceImpl extends ServiceImpl implements PoliceUnitService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SecurityServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SecurityServiceImpl.java new file mode 100644 index 0000000..573a796 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SecurityServiceImpl.java @@ -0,0 +1,127 @@ +package com.changhu.module.management.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.ManagementSecurityUnitUserMapper; +import com.changhu.module.management.pojo.entity.ManagementSecurityUnitUser; +import com.changhu.module.management.pojo.params.ManagementSecurityUnitUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ManagementSecurityUnitUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.ManagementSecurityUnitUserPagerVo; +import com.changhu.module.management.service.SecurityService; +import com.changhu.module.miniProgram.mapper.MiniProgramUserMapper; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午10:17 + * @desc SecurityServiceImpl... + */ +@Service +public class SecurityServiceImpl implements SecurityService { + + @Autowired + private ManagementSecurityUnitUserMapper managementSecurityUnitUserMapper; + + @Autowired + private MiniProgramUserMapper miniProgramUserMapper; + + @Transactional(rollbackFor = Exception.class) + @Override + public void userSaveOrUpdate(ManagementSecurityUnitUserSaveOrUpdateParams saveOrUpdateParams) { + //查看手机号是否已存在 + boolean exists = Db.lambdaQuery(ManagementSecurityUnitUser.class) + .ne(saveOrUpdateParams.getSnowFlakeId() != null, BaseEntity::getSnowFlakeId, saveOrUpdateParams.getSnowFlakeId()) + .eq(ManagementSecurityUnitUser::getTelephone, saveOrUpdateParams.getTelephone()) + .exists(); + if (exists) { + throw new MessageException("该手机号已存在"); + } + + ManagementSecurityUnitUser managementSecurityUnitUser = BeanUtil.copyProperties(saveOrUpdateParams, ManagementSecurityUnitUser.class); + //新增 需要补全一些信息 + if (managementSecurityUnitUser.getSnowFlakeId() == null) { + String account = RandomUtil.randomString(6); + boolean accExits = Db.lambdaQuery(ManagementSecurityUnitUser.class) + .eq(ManagementSecurityUnitUser::getAccount, account) + .exists(); + if (accExits) { + throw new MessageException("生成的账号已存在 请重新提交生成"); + } + //生成账号 + managementSecurityUnitUser.setAccount(account); + if (!UserType.MANAGEMENT_SECURITY.equals(UserUtil.getUserType())) { + throw new MessageException("客户端类型不对"); + } + //补全单位 + managementSecurityUnitUser.setSecurityUnitId(UserUtil.getUnitId()); + //生成密码 + String passWordEncrypt = UserUtil.passWordEncrypt(UserUtil.DEFAULT_PASSWORD); + List saltAndPassWord = StrUtil.split(passWordEncrypt, "$$"); + managementSecurityUnitUser.setSalt(saltAndPassWord.get(0)); + managementSecurityUnitUser.setPassword(saltAndPassWord.get(1)); + } + Db.saveOrUpdate(managementSecurityUnitUser); + } + + @Override + public Page userPager(PageParams queryParams) { + return managementSecurityUnitUserMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Override + public void userDeleteById(Long managementSecurityUnitUserId) { + Long unitId = UserUtil.getUnitId(); + Long l = Db.lambdaQuery(ManagementSecurityUnitUser.class) + .eq(BaseEntity::getSnowFlakeId, managementSecurityUnitUserId) + .oneOpt() + .map(ManagementSecurityUnitUser::getSecurityUnitId) + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); + if (!unitId.equals(l)) { + throw new MessageException("单位不匹配,无权操作"); + } + boolean b = Db.removeById(managementSecurityUnitUserId, ManagementSecurityUnitUser.class); + if (!b) { + throw new MessageException(); + } + } + + @Override + public List> listProjectManager() { + String tel = LambdaUtil.getFieldName(MiniProgramUser::getTelephone); + String sex = LambdaUtil.getFieldName(MiniProgramUser::getSex); + return miniProgramUserMapper.selectList(Wrappers.lambdaQuery() + .eq(MiniProgramUser::getIsEnable, IsEnable.TRUE) + .eq(MiniProgramUser::getIdentity, MiniProgramUserIdentity.PROJECT_MANAGER) + .eq(MiniProgramUser::getUnitId, UserUtil.getUnitId())) + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .extData(Dict.of( + tel, item.getTelephone(), + sex, item.getSex() + )) + .build()) + .toList(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SecurityUnitServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SecurityUnitServiceImpl.java new file mode 100644 index 0000000..a5d45a0 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SecurityUnitServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.management.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.management.mapper.SecurityUnitMapper; +import com.changhu.module.management.pojo.entity.SecurityUnit; +import com.changhu.module.management.service.SecurityUnitService; +import org.springframework.stereotype.Service; + +/** + * security_unit (保安单位) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class SecurityUnitServiceImpl extends ServiceImpl implements SecurityUnitService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ServiceProjectServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ServiceProjectServiceImpl.java new file mode 100644 index 0000000..15453f5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/ServiceProjectServiceImpl.java @@ -0,0 +1,47 @@ +package com.changhu.module.management.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.ServiceProjectMapper; +import com.changhu.module.management.pojo.entity.ServiceProject; +import com.changhu.module.management.pojo.params.ServiceProjectSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.ServiceProjectPagerQueryParams; +import com.changhu.module.management.pojo.vo.ServiceProjectPagerVo; +import com.changhu.module.management.service.ServiceProjectService; +import com.changhu.pojo.dto.ServiceProjectDTO; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * service_project (服务项目) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class ServiceProjectServiceImpl extends ServiceImpl implements ServiceProjectService { + + @Override + public Page pager(PageParams queryParams) { + return baseMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Override + public void saveOrUpdate(ServiceProjectSaveOrUpdateParams params) { + ServiceProject serviceProject = BeanUtil.copyProperties(params, ServiceProject.class); + serviceProject.setSecurityUnitId(UserUtil.getUnitId()); + boolean b = this.saveOrUpdate(serviceProject); + if (!b) { + throw new MessageException(); + } + } + + @Override + public List getServiceProjectByEnterprisesUnitId(Long enterprisesUnitId) { + return baseMapper.getServiceProjectByEnterprisesUnitId(enterprisesUnitId); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SuperServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SuperServiceImpl.java new file mode 100644 index 0000000..37395fb --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/service/impl/SuperServiceImpl.java @@ -0,0 +1,81 @@ +package com.changhu.module.management.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.PoliceUnitMapper; +import com.changhu.module.management.mapper.SecurityUnitMapper; +import com.changhu.module.management.pojo.entity.ManagementSuperUser; +import com.changhu.module.management.pojo.params.ManagementSuperUserSaveOrUpdateParams; +import com.changhu.module.management.pojo.queryParams.PoliceUnitPagerQueryParams; +import com.changhu.module.management.pojo.queryParams.SecurityUnitPagerQueryParams; +import com.changhu.module.management.pojo.vo.PoliceUnitPagerVo; +import com.changhu.module.management.pojo.vo.SecurityUnitPagerVo; +import com.changhu.module.management.service.SuperService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午9:52 + * @desc SuperServiceImpl... + */ +@Service +public class SuperServiceImpl implements SuperService { + + @Autowired + private PoliceUnitMapper policeUnitMapper; + + @Autowired + private SecurityUnitMapper securityUnitMapper; + + @Override + public void saveOrUpdateUser(ManagementSuperUserSaveOrUpdateParams params) { + //查看手机号是否存在 + boolean exists = Db.lambdaQuery(ManagementSuperUser.class) + .eq(ManagementSuperUser::getTelephone, params.getTelephone()) + .exists(); + if (exists) { + throw new MessageException("手机号已注册"); + } + + //构建用户 + ManagementSuperUser managementSuperUser = ManagementSuperUser.builder() + .snowFlakeId(params.getSnowFlakeId()) + .name(params.getName()) + .telephone(params.getTelephone()) + .build(); + + //如果是新增需要初始化密码 + if (managementSuperUser.getSnowFlakeId() == null) { + //生成加密密码: salt$$uuid + String passWordEncrypt = UserUtil.passWordEncrypt(UserUtil.DEFAULT_PASSWORD); + List saltAndPassWord = StrUtil.split(passWordEncrypt, "$$"); + if (CollUtil.size(saltAndPassWord) != 2) { + throw new MessageException(ResultCode.ERROR); + } + managementSuperUser.setSalt(saltAndPassWord.get(0)); + managementSuperUser.setPassword(saltAndPassWord.get(1)); + } + + //保存到数据库 + Db.saveOrUpdate(managementSuperUser); + } + + @Override + public Page policeUnitPager(PageParams queryParams) { + return policeUnitMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Override + public Page securityUnitPager(PageParams queryParams) { + return securityUnitMapper.pager(queryParams.getPage(), queryParams.getParams()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/MiniProgramUserController.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/MiniProgramUserController.java new file mode 100644 index 0000000..467439a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/MiniProgramUserController.java @@ -0,0 +1,49 @@ +package com.changhu.module.miniProgram.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.annotation.JsonBody; +import com.changhu.module.miniProgram.pojo.params.MiniProgramUserRegisterParams; +import com.changhu.module.miniProgram.pojo.params.SaveOrUpdateSecurityUserParams; +import com.changhu.module.miniProgram.pojo.queryParams.ServiceProjectSecurityUserPagerQueryParams; +import com.changhu.module.miniProgram.pojo.vo.ServiceProjectSecurityUserPagerVo; +import com.changhu.module.miniProgram.service.MiniProgramUserService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author 20252 + * @createTime 2024/9/6 上午10:42 + * @desc MiniProgramUserController... + */ +@Tag(name = "小程序用户接口") +@JsonBody +@RequestMapping("/miniProgramUser") +public class MiniProgramUserController { + + @Autowired + private MiniProgramUserService miniProgramUserService; + + @Operation(summary = "注册") + @PostMapping("/register") + public void register(@RequestBody @Valid MiniProgramUserRegisterParams params) { + miniProgramUserService.register(params); + } + + @Operation(summary = "二维码表单录入保安人员") + @PostMapping("/qrCodeFormInputSecurityUser") + public void qrCodeFormInputSecurityUser(@RequestBody @Valid SaveOrUpdateSecurityUserParams params) { + miniProgramUserService.qrCodeFormInputSecurityUser(params); + } + + @Operation(summary = "服务项目保安人员分页") + @PostMapping("/securityUserPager") + public Page securityUserPager(@RequestBody PageParams queryParams) { + return miniProgramUserService.securityUserPager(queryParams); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java new file mode 100644 index 0000000..bde2ec2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java @@ -0,0 +1,51 @@ +package com.changhu.module.miniProgram.controller; + +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.miniProgram.pojo.vo.IndexDataStatisticsVo; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; +import com.changhu.module.miniProgram.service.MPoliceService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午10:44 + * @desc PoliceIndexController... + */ +@Tag(name = "公安人员首页") +@JsonBody +@RequestMapping("/policeIndex") +public class PoliceIndexController { + + @Autowired + private MPoliceService policeIndexService; + + @Operation(summary = "首页数据统计") + @GetMapping("/dataStatistics") + @CheckUserType(userTypes = UserType.MINI_PROGRAM_POLICE) + public IndexDataStatisticsVo dataStatistics() { + return policeIndexService.dataStatistics(); + } + + @Operation(summary = "获取单位内的服务项目") + @GetMapping("/getUnitServiceProjectList") + @CheckUserType(userTypes = UserType.MINI_PROGRAM_POLICE) + public List getUnitServiceProjectList() { + return policeIndexService.getUnitServiceProjectList(); + } + + @Operation(summary = "获取单位内的企事业单位列表") + @GetMapping("/getUnitEnterprisesUnitList") + @CheckUserType(userTypes = UserType.MINI_PROGRAM_POLICE) + public List> getUnitEnterprisesUnitList() { + return policeIndexService.getUnitEnterprisesUnitList(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/ProjectManageIndexController.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/ProjectManageIndexController.java new file mode 100644 index 0000000..1c3ee25 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/ProjectManageIndexController.java @@ -0,0 +1,59 @@ +package com.changhu.module.miniProgram.controller; + +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.db.enums.UserType; +import com.changhu.module.miniProgram.pojo.params.SaveOrUpdateSecurityUserParams; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; +import com.changhu.module.miniProgram.service.ProjectManageIndexService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/10 下午3:48 + * @desc 项目经理首页控制器 + */ +@Tag(name = "项目经理首页") +@JsonBody +@RequestMapping("/projectManageIndex") +public class ProjectManageIndexController { + + @Autowired + private ProjectManageIndexService projectManageIndexService; + + @Operation(summary = "获取我的服务项目") + @GetMapping("/getMyServiceProject") + @CheckUserType(userTypes = UserType.MINI_PROGRAM_PROJECT_MANAGE) + public List getMyServiceProjectList() { + return projectManageIndexService.getMyServiceProjectList(); + } + + @Operation(summary = "根据id删除保安人员") + @DeleteMapping("/deleteSecurityUserByServiceProjectId") + public void deleteSecurityUserById(@RequestParam @Schema(description = "保安人员id") Long securityUserId) { + projectManageIndexService.deleteSecurityUserByServiceProjectId(securityUserId); + } + + @Operation(summary = "保存或更新保安人员") + @PostMapping("/saveOrUpdateSecurityUser") + public void saveOrUpdateSecurityUser(@RequestBody @Valid SaveOrUpdateSecurityUserParams params) { + projectManageIndexService.saveOrUpdateSecurityUser(params); + } + + @JsonBody(value = false) + @Operation(summary = "获取表单分享二维码") + @GetMapping(value = "/shareForm_QR_Code") + public ResponseEntity shareForm_QR_Code(@Schema(description = "要生成的路径") @RequestParam String path, + @Schema(description = "生成二维码的宽度") @RequestParam(defaultValue = "430") Integer width) { + return projectManageIndexService.shareForm_QR_Code(path, width); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/mapper/MiniProgramUserMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/mapper/MiniProgramUserMapper.java new file mode 100644 index 0000000..4ae4e0c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/mapper/MiniProgramUserMapper.java @@ -0,0 +1,31 @@ +package com.changhu.module.miniProgram.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import com.changhu.module.management.pojo.queryParams.UnitMiniProgramUserPagerQueryParams; +import com.changhu.module.management.pojo.vo.UnitMiniProgramUserPagerVo; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * mini_program_user (小程序用户) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface MiniProgramUserMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @param identity 用户身份 + * @return 结果 + */ + Page pager(@Param("page") Page page, + @Param("params") UnitMiniProgramUserPagerQueryParams params, + @Param("identity") MiniProgramUserIdentity identity); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/mapper/SecurityUserMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/mapper/SecurityUserMapper.java new file mode 100644 index 0000000..52472a8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/mapper/SecurityUserMapper.java @@ -0,0 +1,27 @@ +package com.changhu.module.miniProgram.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; +import com.changhu.module.miniProgram.pojo.queryParams.ServiceProjectSecurityUserPagerQueryParams; +import com.changhu.module.miniProgram.pojo.vo.ServiceProjectSecurityUserPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * security_user (保安人员) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface SecurityUserMapper extends BaseMapper { + /** + * 服务项目内的保安人员分页 + * + * @param page 分页对象 + * @param params 查询参数 + * @return 人员 + */ + Page securityUserPager(@Param("page") Page page, + @Param("params") ServiceProjectSecurityUserPagerQueryParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/entity/MiniProgramUser.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/entity/MiniProgramUser.java new file mode 100644 index 0000000..d2d2944 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/entity/MiniProgramUser.java @@ -0,0 +1,85 @@ +package com.changhu.module.miniProgram.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import com.changhu.common.db.enums.Sex; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 小程序用户 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class MiniProgramUser extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 名称 + */ + private String name; + + /** + * 手机号 + */ + private String telephone; + + /** + * 性别 + */ + private Sex sex; + + /** + * 身份证 + */ + private String idCard; + + /** + * 小程序唯一标识 + */ + private String openId; + + /** + * 会话密钥 + */ + private String sessionKey; + + /** + * 身份 + */ + private MiniProgramUserIdentity identity; + + /** + * 所属单位id + */ + private Long unitId; + + /** + * 是否启用 + */ + private IsEnable isEnable; + + /** + * 审核状态 + */ + private CheckStatus checkStatus; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/entity/SecurityUser.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/entity/SecurityUser.java new file mode 100644 index 0000000..fb8a58c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/entity/SecurityUser.java @@ -0,0 +1,93 @@ +package com.changhu.module.miniProgram.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.common.db.enums.Sex; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 保安人员 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class SecurityUser extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 所属保安单位id + */ + private Long securityUnitId; + + /** + * 服务项目id + */ + private Long serviceProjectId; + + /** + * 名称 + */ + private String name; + + /** + * 手机号 + */ + private String telephone; + + /** + * 工作岗位 + */ + private String workPost; + + /** + * 性别 + */ + private Sex sex; + + /** + * 籍贯 + */ + private String nativePlace; + + /** + * 身份证 + */ + private String idCard; + + /** + * 出生日期 + */ + private java.time.LocalDate dateOfBirth; + + /** + * 保安证号 + */ + private String securityNumber; + + /** + * 家庭住址 + */ + private String homeAddress; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/params/MiniProgramUserRegisterParams.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/params/MiniProgramUserRegisterParams.java new file mode 100644 index 0000000..39a67e2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/params/MiniProgramUserRegisterParams.java @@ -0,0 +1,39 @@ +package com.changhu.module.miniProgram.pojo.params; + +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/6 上午10:47 + * @desc MiniProgramUserRegisterParams... + */ +@Data +public class MiniProgramUserRegisterParams { + @Schema(description = "微信code") + @NotBlank(message = "code不能为空") + private String code; + + @Schema(description = "名称") + @NotBlank(message = "名称不能为空") + private String name; + + @Schema(description = "性别") + @NotNull(message = "性别不能为空") + private Sex sex; + + @Schema(description = "手机号") + private String telephone; + + @Schema(description = "身份") + @NotNull(message = "身份不能为空") + private MiniProgramUserIdentity identity; + + @Schema(description = "单位id") + @NotNull(message = "单位不能为空") + private Long unitId; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/params/SaveOrUpdateSecurityUserParams.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/params/SaveOrUpdateSecurityUserParams.java new file mode 100644 index 0000000..0b4dc16 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/params/SaveOrUpdateSecurityUserParams.java @@ -0,0 +1,66 @@ +package com.changhu.module.miniProgram.pojo.params; + +import com.changhu.common.db.enums.Sex; +import com.changhu.common.validator.annotation.IdCard; +import com.changhu.common.validator.annotation.IsMobile; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + + +/** + * @author 20252 + * @createTime 2024/9/12 上午9:57 + * @desc SaveOrUpdateSecurityUserParams... + */ +@Data +public class SaveOrUpdateSecurityUserParams { + @Schema(description = "id") + private Long snowFlakeId; + + @NotNull(message = "服务项目不能为空") + @Schema(description = "服务项目id") + private Long serviceProjectId; + + @NotNull(message = "保安单位不能为空") + @Schema(description = "保安单位id") + private Long securityUnitId; + + @NotBlank(message = "名字不能为空") + @Schema(description = "名称") + private String name; + + @NotBlank(message = "手机号不能为空") + @IsMobile + @Schema(description = "手机号") + private String telephone; + + @Schema(description = "工作岗位") + private String workPost; + + @NotNull(message = "性别不能为空") + @Schema(description = "性别") + private Sex sex; + + @Schema(description = "籍贯") + private String nativePlace; + + @NotBlank(message = "身份证不能为空") + @IdCard + @Schema(description = "身份证") + private String idCard; + + @Schema(description = "出生日期") + private java.time.LocalDate dateOfBirth; + + @Schema(description = "保安证号") + private String securityNumber; + + @Schema(description = "家庭住址") + private String homeAddress; + + @Schema(description = "备注") + private String remark; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/queryParams/ServiceProjectSecurityUserPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/queryParams/ServiceProjectSecurityUserPagerQueryParams.java new file mode 100644 index 0000000..eecba3c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/queryParams/ServiceProjectSecurityUserPagerQueryParams.java @@ -0,0 +1,15 @@ +package com.changhu.module.miniProgram.pojo.queryParams; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/12 上午9:41 + * @desc ServiceProjectSecurityUserPagerQueryParams... + */ +@Data +public class ServiceProjectSecurityUserPagerQueryParams { + @Schema(description = "服务项目id") + private Long serviceProjectId; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java new file mode 100644 index 0000000..5de0f7a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java @@ -0,0 +1,21 @@ +package com.changhu.module.miniProgram.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/7 下午2:23 + * @desc IndexDataStatisticsVo... + */ +@Data +public class IndexDataStatisticsVo { + @Schema(description = "企事业单位数量") + private Integer enterprisesUnitCount = 0; + @Schema(description = "服务项目数量") + private Integer serviceProjectCount = 0; + @Schema(description = "保安人员数量") + private Integer securityUserCount = 0; + @Schema(description = "无证保安人员数量") + private Integer noCardSecurityUserCount = 0; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java new file mode 100644 index 0000000..c265925 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java @@ -0,0 +1,90 @@ +package com.changhu.module.miniProgram.pojo.vo; + +import cn.hutool.core.lang.Dict; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.ServiceProjectType; +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/10 下午3:55 + * @desc 首页服务项目列表 + */ +@Data +public class IndexServiceProjectListVo { + + @Schema(description = "企事业单位id") + private Long snowFlakeId; + @Schema(description = "企事业单位名称") + private String name; + @Schema(description = "单位类型") + private EnterprisesUnitType type; + + @Schema(description = "省编码") + private String province; + @Schema(description = "省名字") + private String provinceName; + @Schema(description = "市编码") + private String city; + @Schema(description = "市名字") + private String cityName; + @Schema(description = "区编码") + private String districts; + @Schema(description = "区名字") + private String districtsName; + @Schema(description = "街道编码") + private String street; + @Schema(description = "街道名字") + private String streetName; + + @Schema(description = "详细地址") + private String address; + @Schema(description = "联系人") + private ContactPersonInfo contactPersonInfo; + @Schema(description = "备注") + private String remark; + + @Schema(description = "服务项目列表") + private List serviceProjectList; + + @Data + static class ServiceProjectVo { + @Schema(description = "服务项目id") + private Long snowFlakeId; + + @Schema(description = "保安单位id") + private Long securityUnitId; + @Schema(description = "保安单位名字") + private String securityUnitName; + + @Schema(description = "项目经理信息") + private Dict projectManagerMiniProgramUserInfo; + + @Schema(description = "服务项目名称") + private String name; + @Schema(description = "服务项目类型") + private ServiceProjectType type; + @Schema(description = "是否自招保安(只有当type为property 此字段必填)") + private IsOrNot isRecruitSecurity; + @Schema(description = "证件号(服务类型为保安必填 服务类型为物业则需自招保安为必填)") + private String idNumber; + @Schema(description = "服务区域面积") + private Double serviceArea; + @Schema(description = "楼栋数量") + private Integer buildingTotal; + @Schema(description = "户数") + private Integer houseTotal; + @Schema(description = "工作人员数量") + private Integer staffTotal; + @Schema(description = "保安人员数量") + private Integer securityUserTotal; + @Schema(description = "备注") + private String remark; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/ServiceProjectSecurityUserPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/ServiceProjectSecurityUserPagerVo.java new file mode 100644 index 0000000..283d75e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/ServiceProjectSecurityUserPagerVo.java @@ -0,0 +1,63 @@ +package com.changhu.module.miniProgram.pojo.vo; + +import cn.hutool.core.util.DesensitizedUtil; +import com.changhu.common.annotation.Desensitized; +import com.changhu.common.db.enums.Sex; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/9/12 上午9:41 + * @desc ServiceProjectSecurityUserPagerVo... + */ +@Data +public class ServiceProjectSecurityUserPagerVo { + @Schema(description = "id") + private Long snowFlakeId; + + @Schema(description = "所属保安单位id") + private Long securityUnitId; + @Schema(description = "保安单位名字") + private String securityUnitName; + + @Schema(description = "服务项目id") + private Long serviceProjectId; + + @Schema(description = "名称") + private String name; + + @Desensitized(value = DesensitizedUtil.DesensitizedType.MOBILE_PHONE) + @Schema(description = "手机号") + private String telephone; + + @Schema(description = "工作岗位") + private String workPost; + + @Schema(description = "性别") + private Sex sex; + + @Schema(description = "籍贯") + private String nativePlace; + + @Desensitized(value = DesensitizedUtil.DesensitizedType.ID_CARD) + @Schema(description = "身份证") + private String idCard; + + @Schema(description = "出生日期") + private java.time.LocalDate dateOfBirth; + + @Schema(description = "保安证号") + private String securityNumber; + + @Schema(description = "家庭住址") + private String homeAddress; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java new file mode 100644 index 0000000..43ed4ac --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java @@ -0,0 +1,37 @@ +package com.changhu.module.miniProgram.service; + +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.miniProgram.pojo.vo.IndexDataStatisticsVo; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午10:52 + * @desc MPoliceService... + */ +public interface MPoliceService { + + /** + * 首页数据统计 + * + * @return 首页数据统计 + */ + IndexDataStatisticsVo dataStatistics(); + + /** + * 获取单位内的服务项目 + * + * @return 服务项目 + */ + List getUnitServiceProjectList(); + + /** + * 获取单位内的企事业单位列表 + * + * @return 企事业单位列表 + */ + List> getUnitEnterprisesUnitList(); + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MiniProgramUserService.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MiniProgramUserService.java new file mode 100644 index 0000000..543e642 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MiniProgramUserService.java @@ -0,0 +1,40 @@ +package com.changhu.module.miniProgram.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import com.changhu.module.miniProgram.pojo.params.MiniProgramUserRegisterParams; +import com.changhu.module.miniProgram.pojo.params.SaveOrUpdateSecurityUserParams; +import com.changhu.module.miniProgram.pojo.queryParams.ServiceProjectSecurityUserPagerQueryParams; +import com.changhu.module.miniProgram.pojo.vo.ServiceProjectSecurityUserPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +/** + * mini_program_user (小程序用户) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface MiniProgramUserService extends IService { + + /** + * 注册 + * + * @param params 参数 + */ + void register(MiniProgramUserRegisterParams params); + + /** + * 服务项目内的保安人员分页 + * + * @param queryParams 查询参数 + * @return 保安人员 + */ + Page securityUserPager(PageParams queryParams); + + /** + * 二维码表单录入保安人员 + * + * @param params 参数 + */ + void qrCodeFormInputSecurityUser(SaveOrUpdateSecurityUserParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/ProjectManageIndexService.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/ProjectManageIndexService.java new file mode 100644 index 0000000..a1c7cd8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/ProjectManageIndexService.java @@ -0,0 +1,41 @@ +package com.changhu.module.miniProgram.service; + +import com.changhu.module.miniProgram.pojo.params.SaveOrUpdateSecurityUserParams; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; +import org.springframework.core.io.Resource; +import org.springframework.http.ResponseEntity; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/10 下午3:49 + * @desc ProjectManageIndexService... + */ +public interface ProjectManageIndexService { + /** + * 获取我的服务项目 + * + * @return 服务项目列表 + */ + List getMyServiceProjectList(); + + /** + * 根据id删除保安人员 + * + * @param securityUserId 保安人员id + */ + void deleteSecurityUserByServiceProjectId(Long securityUserId); + + /** + * 保存或更新保安人员 + * + * @param params 保安人员参数 + */ + void saveOrUpdateSecurityUser(SaveOrUpdateSecurityUserParams params); + + /** + * 分享表单录入的二维码 + */ + ResponseEntity shareForm_QR_Code(String path, Integer width); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/SecurityUserService.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/SecurityUserService.java new file mode 100644 index 0000000..208698b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/SecurityUserService.java @@ -0,0 +1,13 @@ +package com.changhu.module.miniProgram.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; + +/** + * security_user (保安人员) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface SecurityUserService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java new file mode 100644 index 0000000..1877493 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java @@ -0,0 +1,89 @@ +package com.changhu.module.miniProgram.service.impl; + +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.ServiceProjectMapper; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.entity.ServiceProject; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; +import com.changhu.module.miniProgram.pojo.vo.IndexDataStatisticsVo; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; +import com.changhu.module.miniProgram.service.MPoliceService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/11 上午10:53 + * @desc MPoliceServiceImpl... + */ +@Service +public class MPoliceServiceImpl implements MPoliceService { + + @Autowired + private ServiceProjectMapper serviceProjectMapper; + + @Override + public IndexDataStatisticsVo dataStatistics() { + Long unitId = UserUtil.getUnitId(); + IndexDataStatisticsVo indexDataStatisticsVo = new IndexDataStatisticsVo(); + List enterprisesUnitIds = Db.lambdaQuery(EnterprisesUnit.class) + .eq(EnterprisesUnit::getPoliceUnitId, unitId) + .list() + .stream().map(BaseEntity::getSnowFlakeId) + .toList(); + if (enterprisesUnitIds.isEmpty()) { + return indexDataStatisticsVo; + } + indexDataStatisticsVo.setEnterprisesUnitCount(enterprisesUnitIds.size()); + + List serviceProjectIds = Db.lambdaQuery(ServiceProject.class) + .in(ServiceProject::getEnterprisesUnitId, enterprisesUnitIds) + .list() + .stream() + .map(BaseEntity::getSnowFlakeId) + .toList(); + if (serviceProjectIds.isEmpty()) { + return indexDataStatisticsVo; + } + indexDataStatisticsVo.setServiceProjectCount(serviceProjectIds.size()); + + Long securityUserCount = Db.lambdaQuery(SecurityUser.class) + .in(SecurityUser::getServiceProjectId, serviceProjectIds) + .count(); + indexDataStatisticsVo.setSecurityUserCount(securityUserCount.intValue()); + + Long noCardSecurityUserCount = Db.lambdaQuery(SecurityUser.class) + .in(SecurityUser::getServiceProjectId, serviceProjectIds) + .isNull(SecurityUser::getSecurityNumber) + .count(); + indexDataStatisticsVo.setNoCardSecurityUserCount(noCardSecurityUserCount.intValue()); + + return indexDataStatisticsVo; + } + + @Override + public List getUnitServiceProjectList() { + return serviceProjectMapper.getServiceProjectList(UserUtil.getUnitId(), null); + } + + @Override + public List> getUnitEnterprisesUnitList() { + return Db.lambdaQuery(EnterprisesUnit.class) + .eq(EnterprisesUnit::getPoliceUnitId, UserUtil.getUnitId()) + .list() + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .extData(Dict.of(LambdaUtil.getFieldName(EnterprisesUnit::getType), item.getType())) + .build()) + .toList(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MiniProgramUserServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MiniProgramUserServiceImpl.java new file mode 100644 index 0000000..be7f6e2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MiniProgramUserServiceImpl.java @@ -0,0 +1,73 @@ +package com.changhu.module.miniProgram.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.SnowFlakeIdUtil; +import com.changhu.module.miniProgram.mapper.MiniProgramUserMapper; +import com.changhu.module.miniProgram.mapper.SecurityUserMapper; +import com.changhu.module.miniProgram.pojo.entity.MiniProgramUser; +import com.changhu.module.miniProgram.pojo.params.MiniProgramUserRegisterParams; +import com.changhu.module.miniProgram.pojo.params.SaveOrUpdateSecurityUserParams; +import com.changhu.module.miniProgram.pojo.queryParams.ServiceProjectSecurityUserPagerQueryParams; +import com.changhu.module.miniProgram.pojo.vo.ServiceProjectSecurityUserPagerVo; +import com.changhu.module.miniProgram.service.MiniProgramUserService; +import com.changhu.module.miniProgram.service.ProjectManageIndexService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * mini_program_user (小程序用户) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class MiniProgramUserServiceImpl extends ServiceImpl implements MiniProgramUserService { + + @Autowired + private WxMaService wxMaService; + + @Autowired + private SecurityUserMapper securityUserMapper; + + @Autowired + private ProjectManageIndexService projectManageIndexService; + + @Override + public void register(MiniProgramUserRegisterParams params) { + MiniProgramUser miniProgramUser = BeanUtil.copyProperties(params, MiniProgramUser.class); + try { + WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(params.getCode()); + miniProgramUser.setOpenId(sessionInfo.getOpenid()); + miniProgramUser.setSessionKey(sessionInfo.getSessionKey()); + } catch (WxErrorException e) { + throw new MessageException(e.getMessage()); + } + boolean exists = baseMapper.exists(Wrappers.lambdaQuery().eq(MiniProgramUser::getOpenId, miniProgramUser.getOpenId())); + if (exists) { + throw new MessageException("该用户已存在,请勿重复注册!"); + } + long userId = SnowFlakeIdUtil.snowflakeId(); + miniProgramUser.setSnowFlakeId(userId); + boolean save = this.save(miniProgramUser); + if (!save) { + throw new MessageException(); + } + } + + @Override + public Page securityUserPager(PageParams queryParams) { + return securityUserMapper.securityUserPager(queryParams.getPage(), queryParams.getParams()); + } + + @Override + public void qrCodeFormInputSecurityUser(SaveOrUpdateSecurityUserParams params) { + projectManageIndexService.saveOrUpdateSecurityUser(params); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/ProjectManageIndexServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/ProjectManageIndexServiceImpl.java new file mode 100644 index 0000000..ab64842 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/ProjectManageIndexServiceImpl.java @@ -0,0 +1,101 @@ +package com.changhu.module.miniProgram.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaQrcodeService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import com.changhu.module.management.mapper.ServiceProjectMapper; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; +import com.changhu.module.miniProgram.pojo.params.SaveOrUpdateSecurityUserParams; +import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; +import com.changhu.module.miniProgram.service.ProjectManageIndexService; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/10 下午3:50 + * @desc ProjectManageIndexServiceImpl... + */ +@Slf4j +@Service +public class ProjectManageIndexServiceImpl implements ProjectManageIndexService { + + @Autowired + private ServiceProjectMapper serviceProjectMapper; + + @Autowired + private WxMaService wxMaService; + + @Override + public List getMyServiceProjectList() { + return serviceProjectMapper.getServiceProjectList(null, UserUtil.getUserId()); + } + + @Override + public void deleteSecurityUserByServiceProjectId(Long securityUserId) { + boolean b = Db.removeById(securityUserId, SecurityUser.class); + if (!b) { + throw new MessageException(); + } + } + + @Override + public void saveOrUpdateSecurityUser(SaveOrUpdateSecurityUserParams params) { + SecurityUser securityUser = BeanUtil.copyProperties(params, SecurityUser.class); + //新增的情况 + Long snowFlakeId = securityUser.getSnowFlakeId(); + if (snowFlakeId == null) { + //判断是否已经存在 + boolean exists = Db.lambdaQuery(SecurityUser.class) + .eq(SecurityUser::getServiceProjectId, securityUser.getServiceProjectId()) + .eq(SecurityUser::getIdCard, securityUser.getIdCard()) + .exists(); + if (exists) { + throw new MessageException("服务项目下已经存在该人员"); + } + } else { + //如果修改了身份证 需要查重 + SecurityUser byId = Db.getById(snowFlakeId, SecurityUser.class); + if (!securityUser.getIdCard().equals(byId.getIdCard())) { + boolean exists = Db.lambdaQuery(SecurityUser.class) + .eq(SecurityUser::getServiceProjectId, securityUser.getServiceProjectId()) + .eq(SecurityUser::getIdCard, securityUser.getIdCard()) + .exists(); + if (exists) { + throw new MessageException("服务项目下已经存在该人员"); + } + } + } + boolean b = Db.saveOrUpdate(securityUser); + if (!b) { + throw new MessageException(); + } + } + + @Override + public ResponseEntity shareForm_QR_Code(String path, Integer width) { + WxMaQrcodeService qrcodeService = wxMaService.getQrcodeService(); + try { + File qrcodeFile = qrcodeService.createQrcode(path, width); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + qrcodeFile.getName()) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(new FileSystemResource(qrcodeFile)); + } catch (WxErrorException e) { + throw new MessageException("生成表单二维码失败:{}", e.getMessage()); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/SecurityUserServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/SecurityUserServiceImpl.java new file mode 100644 index 0000000..e7c7be0 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/SecurityUserServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.miniProgram.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.miniProgram.mapper.SecurityUserMapper; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; +import com.changhu.module.miniProgram.service.SecurityUserService; +import org.springframework.stereotype.Service; + +/** + * security_user (保安人员) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class SecurityUserServiceImpl extends ServiceImpl implements SecurityUserService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/dto/DataViewDTO.java b/policeSecurityServer/src/main/java/com/changhu/pojo/dto/DataViewDTO.java new file mode 100644 index 0000000..8fa6a12 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/dto/DataViewDTO.java @@ -0,0 +1,23 @@ +package com.changhu.pojo.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/11 上午11:16 + * @desc DataViewDTO... + */ +@Data +public class DataViewDTO { + @Schema(description = "公安单位数量") + private Integer policeUnitCount; + @Schema(description = "保安单位数量") + private Integer securityUnitCount; + @Schema(description = "企事业单位数量") + private Integer enterprisesUnitCount; + @Schema(description = "保安人员总数") + private Integer securityUserTotal; + @Schema(description = "无证保安数量") + private Integer noCardSecurityUserCount; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/dto/EnterprisesUnitDetailDTO.java b/policeSecurityServer/src/main/java/com/changhu/pojo/dto/EnterprisesUnitDetailDTO.java new file mode 100644 index 0000000..65161b0 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/dto/EnterprisesUnitDetailDTO.java @@ -0,0 +1,38 @@ +package com.changhu.pojo.dto; + +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/10/10 上午9:13 + * @desc EnterprisesUnitDetailDTO... + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EnterprisesUnitDetailDTO { + @Schema(description = "企事业单位id") + private Long snowFlakeId; + @Schema(description = "名字") + private String name; + @Schema(description = "地址") + private String address; + @Schema(description = "联系人") + private ContactPersonInfo contactPersonInfo; + @Schema(description = "备注") + private String remark; + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "服务项目列表") + private List serviceProjectList; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/dto/ServiceProjectDTO.java b/policeSecurityServer/src/main/java/com/changhu/pojo/dto/ServiceProjectDTO.java new file mode 100644 index 0000000..7a10a63 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/dto/ServiceProjectDTO.java @@ -0,0 +1,110 @@ +package com.changhu.pojo.dto; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.changhu.common.db.enums.IsOrNot; +import com.changhu.common.db.enums.ServiceProjectType; +import com.changhu.common.db.enums.Sex; +import com.changhu.module.management.pojo.model.LegalPersonInfo; +import com.changhu.support.fastjson2.serializer.MinioPrefixSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/10/10 上午9:35 + * @desc ServiceProjectDTO... + */ +@Data +public class ServiceProjectDTO { + @Schema(description = "服务项目id") + private Long snowFlakeId; + @Schema(description = "项目经理信息") + private ProjectManagerInfo projectManagerInfo; + @Schema(description = "保安单位信息") + private SecurityUnitInfo securityUnitInfo; + @Schema(description = "名字") + private String name; + @Schema(description = "类型") + private ServiceProjectType type; + @Schema(description = "是否自招保安") + private IsOrNot isRecruitSecurity; + @Schema(description = "保安证号") + private String idNumber; + @Schema(description = "服务面积") + private Double serviceArea; + @Schema(description = "楼栋数量") + private Integer buildingTotal; + @Schema(description = "户数") + private Integer houseTotal; + @Schema(description = "工作人员数量") + private Integer staffTotal; + @Schema(description = "保安人员数量") + private Integer securityUserTotal; + @Schema(description = "备注") + private String remark; + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @Schema(description = "保安人员列表") + private List securityUserList; + + @Data + static class SecurityUnitInfo { + @Schema(description = "保安单位名称") + private String name; + @Schema(description = "统一社会编码") + private String socialCode; + @JSONField(serializeUsing = MinioPrefixSerializer.class) + @Schema(description = "营业执照") + private String businessLicense; + @Schema(description = "法人信息") + private LegalPersonInfo legalPersonInfo; + @Schema(description = "详细地址") + private String address; + @Schema(description = "公司性质") + private String nature; + } + + @Data + static class ProjectManagerInfo { + @Schema(description = "名称") + private String name; + @Schema(description = "性别") + private Sex sex; + @Schema(description = "手机号") + private String telephone; + @Schema(description = "身份证") + private String idCard; + } + + @Data + static class SecurityUserInfo { + @Schema(description = "id") + private Long snowFlakeId; + @Schema(description = "名字") + private String name; + @Schema(description = "手机号") + private String telephone; + @Schema(description = "工作岗位") + private String workPost; + @Schema(description = "性别") + private Sex sex; + @Schema(description = "户籍地") + private String nativePlace; + @Schema(description = "身份证") + private String idCard; + @Schema(description = "出身日期") + private java.time.LocalDate dateOfBirth; + @Schema(description = "保安证号") + private String securityNumber; + @Schema(description = "家庭住址") + private String homeAddress; + @Schema(description = "备注") + private String remark; + @Schema(description = "创建时间") + private String createTime; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/entity/AdministrativeDivision.java b/policeSecurityServer/src/main/java/com/changhu/pojo/entity/AdministrativeDivision.java new file mode 100644 index 0000000..ee5ea03 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/entity/AdministrativeDivision.java @@ -0,0 +1,57 @@ +package com.changhu.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 全国行政区划表(2023/12/04) 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class AdministrativeDivision extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 区划名称 + */ + private String name; + + /** + * 区划编码 + */ + private String code; + + /** + * 上级行政区划编码 + */ + private String parentCode; + + /** + * 区划级别: 1:省/自治区/直辖市 2:市级 3:区/县级 4:街道级 + */ + private Integer level; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/LoginParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/LoginParams.java new file mode 100644 index 0000000..717aa1b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/LoginParams.java @@ -0,0 +1,16 @@ +package com.changhu.pojo.params; + +import com.alibaba.fastjson2.JSONObject; +import com.changhu.enums.ClientType; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:18 + * @desc LoginParams... + */ +@Data +public class LoginParams { + private ClientType clientType; + private JSONObject loginParams; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementPoliceUnitLoginParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementPoliceUnitLoginParams.java new file mode 100644 index 0000000..30baccf --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementPoliceUnitLoginParams.java @@ -0,0 +1,19 @@ +package com.changhu.pojo.params; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/2 下午4:53 + * @desc ManagementPoliceUnitLoginParams... + */ +@Data +public class ManagementPoliceUnitLoginParams { + + @NotBlank(message = "账号/手机号不能为空") + private String accountOrTelephone; + + @NotBlank(message = "密码不能为空") + private String password; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementSecurityUnitLoginParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementSecurityUnitLoginParams.java new file mode 100644 index 0000000..aa2c917 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementSecurityUnitLoginParams.java @@ -0,0 +1,19 @@ +package com.changhu.pojo.params; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/2 下午4:53 + * @desc ManagementPoliceUnitLoginParams... + */ +@Data +public class ManagementSecurityUnitLoginParams { + + @NotBlank(message = "账号/手机号不能为空") + private String accountOrTelephone; + + @NotBlank(message = "密码不能为空") + private String password; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementSuperLoginParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementSuperLoginParams.java new file mode 100644 index 0000000..637ebe5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/ManagementSuperLoginParams.java @@ -0,0 +1,20 @@ +package com.changhu.pojo.params; + +import com.changhu.common.validator.annotation.IsMobile; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:26 + * @desc ManagementSuperLoginParams... + */ +@Data +public class ManagementSuperLoginParams { + + @IsMobile + private String telephone; + + @NotBlank(message = "密码不能为空") + private String password; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/MiniProgramUserLoginParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/MiniProgramUserLoginParams.java new file mode 100644 index 0000000..4339437 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/MiniProgramUserLoginParams.java @@ -0,0 +1,15 @@ +package com.changhu.pojo.params; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/9/10 上午10:00 + * @desc MiniProgramUserLoginParams... + */ +@Data +public class MiniProgramUserLoginParams { + @NotBlank(message = "code不能为空") + private String code; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/PoliceUnitRegisterParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/PoliceUnitRegisterParams.java new file mode 100644 index 0000000..a0ca769 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/PoliceUnitRegisterParams.java @@ -0,0 +1,35 @@ +package com.changhu.pojo.params; + +import com.changhu.module.management.pojo.model.ContactPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/8/30 下午4:47 + * @desc PoliceUnitRegisterParams... + */ +@Data +public class PoliceUnitRegisterParams { + @NotBlank(message = "单位名称不能为空") + @Schema(description = "单位名称") + private String name; + + @NotBlank(message = "单位代码不能为空") + @Schema(description = "单位代码") + private String code; + + @NotEmpty(message = "行政区划不能为空") + @Schema(description = "行政区划") + private List administrativeDivisionCodes; + + @Schema(description = "详细地址") + private String address; + + @Schema(description = "联系人") + private ContactPersonInfo contactPersonInfo; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/params/SecurityUnitRegisterParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/params/SecurityUnitRegisterParams.java new file mode 100644 index 0000000..0947412 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/params/SecurityUnitRegisterParams.java @@ -0,0 +1,46 @@ +package com.changhu.pojo.params; + +import com.changhu.module.management.pojo.model.LegalPersonInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/8/30 下午3:16 + * @desc SecurityUnitRegisterParams... + */ +@Data +public class SecurityUnitRegisterParams { + @Schema(description = "id") + private Long snowFlakeId; + + @NotBlank(message = "名字不能为空") + @Schema(description = "名称") + private String name; + + @NotBlank(message = "社会编码不能为空") + @Schema(description = "社会编码") + private String socialCode; + + @NotBlank(message = "营业执照不能为空") + @Schema(description = "营业执照") + private String businessLicense; + + @Schema(description = "法人信息") + private LegalPersonInfo legalPersonInfo; + + @NotBlank(message = "公司性质不能为空") + @Schema(description = "性质") + private String nature; + + @NotEmpty(message = "行政区划不能为空") + @Schema(description = "行政区划编码") + private List administrativeDivisionCodes; + + @Schema(description = "详细地址") + private String address; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/pojo/queryParams/QueryUnitListByIdentityQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/pojo/queryParams/QueryUnitListByIdentityQueryParams.java new file mode 100644 index 0000000..dc077bd --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/pojo/queryParams/QueryUnitListByIdentityQueryParams.java @@ -0,0 +1,27 @@ +package com.changhu.pojo.queryParams; + +import com.changhu.common.db.enums.MiniProgramUserIdentity; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/9/6 下午3:43 + * @desc QueryUnitListByIdentityQueryParams... + */ +@Data +public class QueryUnitListByIdentityQueryParams { + + @NotNull(message = "身份不能为空") + @Schema(description = "身份") + private MiniProgramUserIdentity identity; + + @NotEmpty(message = "行政区划编码不能为空") + @Schema(description = "行政区划编码") + private List administrativeDivisionCodes; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/AdministrativeDivisionService.java b/policeSecurityServer/src/main/java/com/changhu/service/AdministrativeDivisionService.java new file mode 100644 index 0000000..1cb42d3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/AdministrativeDivisionService.java @@ -0,0 +1,31 @@ +package com.changhu.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.common.pojo.vo.TreeNodeVo; +import com.changhu.pojo.entity.AdministrativeDivision; + +import java.util.List; + +/** + * administrative_division (全国行政区划表(2023/12/04)) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface AdministrativeDivisionService extends IService { + + /** + * 全国行政区划树 + * + * @param level 需要几级数据 + * @return 全国行政区划树 + */ + List> tree(Integer level); + + /** + * 根据父编码查询子级(懒加载) + * + * @param parentCode 父编码 + * @return 子级 + */ + List> administrativeDivisionByParentCode(String parentCode); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/CommonService.java b/policeSecurityServer/src/main/java/com/changhu/service/CommonService.java new file mode 100644 index 0000000..12dbb2d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/CommonService.java @@ -0,0 +1,39 @@ +package com.changhu.service; + +import com.changhu.common.pojo.model.JsonResult; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.pojo.params.PoliceUnitRegisterParams; +import com.changhu.pojo.params.SecurityUnitRegisterParams; +import com.changhu.pojo.queryParams.QueryUnitListByIdentityQueryParams; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/8/30 下午3:18 + * @desc CommonService... + */ +public interface CommonService { + + /** + * 保安单位注册 + * + * @param params 注册参数 + */ + JsonResult securityUnitRegister(SecurityUnitRegisterParams params); + + /** + * 公安单位注册 + * + * @param params 注册参数 + */ + JsonResult policeUnitRegister(PoliceUnitRegisterParams params); + + /** + * 根据身份查询单位列表 + * + * @param queryParams 查询参数 + * @return 结果 + */ + List> queryUnitListByIdentity(QueryUnitListByIdentityQueryParams queryParams); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/LoginService.java b/policeSecurityServer/src/main/java/com/changhu/service/LoginService.java new file mode 100644 index 0000000..2015363 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/LoginService.java @@ -0,0 +1,24 @@ +package com.changhu.service; + +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.pojo.params.LoginParams; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:28 + * @desc LoginService... + */ +public interface LoginService { + /** + * 用户登录 + * + * @param loginParams 登录参数 + * @return token + */ + TokenInfo login(LoginParams loginParams); + + /** + * 登出 + */ + void logout(); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/OpenApiService.java b/policeSecurityServer/src/main/java/com/changhu/service/OpenApiService.java new file mode 100644 index 0000000..c471c95 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/OpenApiService.java @@ -0,0 +1,37 @@ +package com.changhu.service; + +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.pojo.dto.DataViewDTO; +import com.changhu.pojo.dto.EnterprisesUnitDetailDTO; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/10/9 下午5:28 + * @desc 开放接口 + */ +public interface OpenApiService { + /** + * 获取企事业单位列表 + * + * @param policeCode 公安机构代码 + * @return 企事业单位列表 + */ + List> getEnterprisesUnit(String policeCode); + + /** + * 企事业单位详情 + * + * @param enterprisesUnitId 单位id + * @return 企事业单位详情 + */ + EnterprisesUnitDetailDTO enterprisesUnitDetailById(Long enterprisesUnitId); + + /** + * 数据总览 + * + * @return 数据总览 + */ + DataViewDTO dataView(); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/impl/AdministrativeDivisionServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/service/impl/AdministrativeDivisionServiceImpl.java new file mode 100644 index 0000000..c389d9e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/impl/AdministrativeDivisionServiceImpl.java @@ -0,0 +1,30 @@ +package com.changhu.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.common.pojo.vo.TreeNodeVo; +import com.changhu.mapper.AdministrativeDivisionMapper; +import com.changhu.pojo.entity.AdministrativeDivision; +import com.changhu.service.AdministrativeDivisionService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * administrative_division (全国行政区划表(2023/12/04)) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class AdministrativeDivisionServiceImpl extends ServiceImpl implements AdministrativeDivisionService { + + @Override + public List> tree(Integer level) { + List> treeNodeVos = baseMapper.treeList(level); + return TreeNodeVo.buildTree(treeNodeVos, "0"); + } + + @Override + public List> administrativeDivisionByParentCode(String parentCode) { + return baseMapper.administrativeDivisionByParentCode(parentCode); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/impl/CommonServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/service/impl/CommonServiceImpl.java new file mode 100644 index 0000000..cc6d256 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/impl/CommonServiceImpl.java @@ -0,0 +1,134 @@ +package com.changhu.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.changhu.common.db.enums.CheckStatus; +import com.changhu.common.db.enums.IsEnable; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.model.JsonResult; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.management.mapper.PoliceUnitMapper; +import com.changhu.module.management.mapper.SecurityUnitMapper; +import com.changhu.module.management.pojo.entity.PoliceUnit; +import com.changhu.module.management.pojo.entity.SecurityUnit; +import com.changhu.pojo.params.PoliceUnitRegisterParams; +import com.changhu.pojo.params.SecurityUnitRegisterParams; +import com.changhu.pojo.queryParams.QueryUnitListByIdentityQueryParams; +import com.changhu.service.CommonService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * @author 20252 + * @createTime 2024/8/30 下午3:18 + * @desc CommonServiceImpl... + */ +@Service +public class CommonServiceImpl implements CommonService { + + @Autowired + private SecurityUnitMapper securityUnitMapper; + + @Autowired + private PoliceUnitMapper policeUnitMapper; + + + @Override + public JsonResult securityUnitRegister(SecurityUnitRegisterParams params) { + //先查看该社会编码是否存在 + boolean exists = securityUnitMapper.exists(Wrappers.lambdaQuery().eq(SecurityUnit::getSocialCode, params.getSocialCode())); + if (exists) { + throw new MessageException("该单位已存在或已提交申请!"); + } + SecurityUnit securityUnit = BeanUtil.copyProperties(params, SecurityUnit.class); + Optional.ofNullable(params.getAdministrativeDivisionCodes()) + .ifPresent(codes -> { + if (!codes.isEmpty()) { + securityUnit.setProvince(codes.get(0)); + } + if (codes.size() >= 2) { + securityUnit.setCity(codes.get(1)); + } + if (codes.size() >= 3) { + securityUnit.setDistricts(codes.get(2)); + } + if (codes.size() >= 4) { + securityUnit.setStreet(codes.get(3)); + } + }); + int i = securityUnitMapper.insert(securityUnit); + if (i <= 0) { + throw new MessageException(ResultCode.ERROR); + } + + return JsonResult.successMsg("申请已提交,请等待审核"); + } + + @Override + public JsonResult policeUnitRegister(PoliceUnitRegisterParams params) { + //先查看该公安单位是否存在 + boolean exists = policeUnitMapper.exists(Wrappers.lambdaQuery().eq(PoliceUnit::getCode, params.getCode())); + if (exists) { + throw new MessageException("该单位已存在或已提交申请!"); + } + PoliceUnit policeUnit = BeanUtil.copyProperties(params, PoliceUnit.class); + Optional.ofNullable(params.getAdministrativeDivisionCodes()) + .ifPresent(codes -> { + if (!codes.isEmpty()) { + policeUnit.setProvince(codes.get(0)); + } + if (codes.size() >= 2) { + policeUnit.setCity(codes.get(1)); + } + if (codes.size() >= 3) { + policeUnit.setDistricts(codes.get(2)); + } + if (codes.size() >= 4) { + policeUnit.setStreet(codes.get(3)); + } + }); + int i = policeUnitMapper.insert(policeUnit); + if (i <= 0) { + throw new MessageException(ResultCode.ERROR); + } + + return JsonResult.successMsg("申请已提交,请等待审核"); + } + + @Override + public List> queryUnitListByIdentity(QueryUnitListByIdentityQueryParams queryParams) { + List administrativeDivisionCodes = queryParams.getAdministrativeDivisionCodes(); + return switch (queryParams.getIdentity()) { + case POLICE -> policeUnitMapper.selectList(Wrappers.lambdaQuery() + .eq(PoliceUnit::getIsEnable, IsEnable.TRUE) + .eq(PoliceUnit::getCheckStatus, CheckStatus.checked) + .eq(!administrativeDivisionCodes.isEmpty(), PoliceUnit::getProvince, administrativeDivisionCodes.get(0)) + .eq(administrativeDivisionCodes.size() >= 2, PoliceUnit::getCity, administrativeDivisionCodes.get(1)) + .eq(administrativeDivisionCodes.size() >= 3, PoliceUnit::getDistricts, administrativeDivisionCodes.get(2)) + .eq(administrativeDivisionCodes.size() >= 4, PoliceUnit::getStreet, administrativeDivisionCodes.get(3))) + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .build()) + .toList(); + case PROJECT_MANAGER -> securityUnitMapper.selectList(Wrappers.lambdaQuery() + .eq(SecurityUnit::getIsEnable, IsEnable.TRUE) + .eq(SecurityUnit::getCheckStatus, CheckStatus.checked) + .eq(!administrativeDivisionCodes.isEmpty(), SecurityUnit::getProvince, administrativeDivisionCodes.get(0)) + .eq(administrativeDivisionCodes.size() >= 2, SecurityUnit::getCity, administrativeDivisionCodes.get(1)) + .eq(administrativeDivisionCodes.size() >= 3, SecurityUnit::getDistricts, administrativeDivisionCodes.get(2)) + .eq(administrativeDivisionCodes.size() >= 4, SecurityUnit::getStreet, administrativeDivisionCodes.get(3))) + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .build()) + .toList(); + }; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/impl/LoginServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..df74e8f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/impl/LoginServiceImpl.java @@ -0,0 +1,27 @@ +package com.changhu.service.impl; + +import com.changhu.common.pojo.vo.TokenInfo; +import com.changhu.common.utils.UserUtil; +import com.changhu.pojo.params.LoginParams; +import com.changhu.service.LoginService; +import org.springframework.stereotype.Service; + +/** + * @author 20252 + * @createTime 2024/8/28 下午5:29 + * @desc LoginServiceImpl... + */ +@Service +public class LoginServiceImpl implements LoginService { + @Override + public TokenInfo login(LoginParams loginParams) { + return loginParams.getClientType() + .getLoginHandler() + .login(loginParams.getLoginParams()); + } + + @Override + public void logout() { + UserUtil.logout(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/service/impl/OpenApiServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/service/impl/OpenApiServiceImpl.java new file mode 100644 index 0000000..12843aa --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/service/impl/OpenApiServiceImpl.java @@ -0,0 +1,101 @@ +package com.changhu.service.impl; + +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.entity.PoliceUnit; +import com.changhu.module.management.pojo.entity.SecurityUnit; +import com.changhu.module.management.service.ServiceProjectService; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; +import com.changhu.pojo.dto.DataViewDTO; +import com.changhu.pojo.dto.EnterprisesUnitDetailDTO; +import com.changhu.service.OpenApiService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.CountDownLatch; + +/** + * @author 20252 + * @createTime 2024/10/9 下午5:29 + * @desc OpenApiServiceImpl... + */ +@Service +public class OpenApiServiceImpl implements OpenApiService { + + @Autowired + private ServiceProjectService serviceProjectService; + + @Override + public List> getEnterprisesUnit(String policeCode) { + PoliceUnit policeUnit = Db.lambdaQuery(PoliceUnit.class).eq(PoliceUnit::getCode, policeCode).oneOpt().orElseThrow(() -> new MessageException("当前系统没有该派出所")); + return Db.lambdaQuery(EnterprisesUnit.class) + .eq(EnterprisesUnit::getPoliceUnitId, policeUnit.getSnowFlakeId()) + .list() + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .build()) + .toList(); + } + + @Override + public EnterprisesUnitDetailDTO enterprisesUnitDetailById(Long enterprisesUnitId) { + return Db.lambdaQuery(EnterprisesUnit.class) + .eq(BaseEntity::getSnowFlakeId, enterprisesUnitId) + .oneOpt() + .map(item -> EnterprisesUnitDetailDTO.builder() + .snowFlakeId(item.getSnowFlakeId()) + .name(item.getName()) + .address(item.getAddress()) + .contactPersonInfo(item.getContactPersonInfo()) + .remark(item.getRemark()) + .serviceProjectList(serviceProjectService.getServiceProjectByEnterprisesUnitId(item.getSnowFlakeId())) + .createTime(item.getCreateTime()) + .build()) + .orElseThrow(() -> new MessageException("企事业单位不存在")); + } + + @SneakyThrows + @Override + public DataViewDTO dataView() { + DataViewDTO dataViewDTO = new DataViewDTO(); + CountDownLatch countDownLatch = new CountDownLatch(5); + try { + dataViewDTO.setPoliceUnitCount(Db.lambdaQuery(PoliceUnit.class).count().intValue()); + } finally { + countDownLatch.countDown(); + } + try { + dataViewDTO.setSecurityUnitCount(Db.lambdaQuery(SecurityUnit.class).count().intValue()); + } finally { + countDownLatch.countDown(); + } + try { + dataViewDTO.setEnterprisesUnitCount(Db.lambdaQuery(EnterprisesUnit.class).count().intValue()); + } finally { + countDownLatch.countDown(); + } + try { + dataViewDTO.setSecurityUserTotal(Db.lambdaQuery(SecurityUser.class).count().intValue()); + } finally { + countDownLatch.countDown(); + } + try { + dataViewDTO.setNoCardSecurityUserCount(Db.lambdaQuery(SecurityUser.class) + .isNull(SecurityUser::getSecurityNumber) + .or() + .eq(SecurityUser::getSecurityNumber, "") + .count().intValue()); + } finally { + countDownLatch.countDown(); + } + countDownLatch.await(); + return dataViewDTO; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java new file mode 100644 index 0000000..10cf050 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java @@ -0,0 +1,121 @@ +package com.changhu.support.fastjson2; + +import cn.hutool.core.util.ClassUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.support.config.FastJsonConfig; +import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageConverter; +import com.changhu.common.db.BaseEnum; +import com.changhu.common.properties.Fastjson2Properties; +import com.changhu.support.fastjson2.deserialze.DbEnumDeserializer; +import com.changhu.support.fastjson2.deserialze.LatitudeDeserializer; +import com.changhu.support.fastjson2.deserialze.LongitudeDeserializer; +import com.changhu.support.fastjson2.deserialze.PointDeserializer; +import com.changhu.support.fastjson2.filter.DesensitizedFilter; +import com.changhu.support.fastjson2.serializer.DbEnumSerializer; +import com.changhu.support.fastjson2.serializer.LatitudeSerializer; +import com.changhu.support.fastjson2.serializer.LongitudeSerializer; +import com.changhu.support.fastjson2.serializer.PointSerializer; +import lombok.extern.slf4j.Slf4j; +import org.geotools.measure.Latitude; +import org.geotools.measure.Longitude; +import org.locationtech.jts.geom.Point; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.StringHttpMessageConverter; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Set; + +/** + * author: luozhun + * desc: FastJson2Config + * createTime: 2023/8/26 16:08 + */ +@Slf4j +@Configuration +public class FastJson2Config { + + @Autowired + private Fastjson2Properties fastjson2Properties; + + //全局序列化默认配置 + static { + /* + * !!!注意 在fastjson1中 可使用 SerializeConfig ParserConfig进行序列化与反序列化的配置 + * 在fastjson2中 目前找到的方案是使用JSON.register(type,ObjectWriter)去对属性与 序列化/反序列化 进行绑定 + */ + //序列化配置 + Set> baseEnumClasses = ClassUtil.scanPackageBySuper("com.changhu.common.db", BaseEnum.class); + baseEnumClasses.forEach(clazz -> { + JSON.register(clazz, DbEnumSerializer.instance); + JSON.register(clazz, DbEnumDeserializer.instance); + }); + + JSON.register(Latitude.class, LatitudeSerializer.instance); + JSON.register(Longitude.class, LongitudeSerializer.instance); + JSON.register(Point.class, PointSerializer.instance); + + //反序列化配置 + JSON.register(Latitude.class, LatitudeDeserializer.instance); + JSON.register(Longitude.class, LongitudeDeserializer.instance); + JSON.register(Point.class, PointDeserializer.instance); + + JSON.config(JSONWriter.Feature.WriteLongAsString); + + } + + @Bean + public HttpMessageConverters fastJsonHttpMessageConverters() { + //getFastJsonHttpMessageConverter 自定义的fastjson转换器 + //StringHttpMessageConverter 支持text 转string + return new HttpMessageConverters(this.getFastJsonHttpMessageConverter(), new StringHttpMessageConverter()); + } + + public FastJsonHttpMessageConverter getFastJsonHttpMessageConverter() { + //1.定义一个转换消息的对象 + FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); + //在转换器中添加配置信息 + fastConverter.setDefaultCharset(StandardCharsets.UTF_8); + + fastConverter.setFastJsonConfig(this.getFastJsonConfig()); + + //4.解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json" + fastConverter.setSupportedMediaTypes(List.of( + MediaType.APPLICATION_JSON + )); + return fastConverter; + } + + private FastJsonConfig getFastJsonConfig() { + FastJsonConfig fastJsonConfig = new FastJsonConfig(); + + //配置全局日期格式 + fastJsonConfig.setDateFormat(fastjson2Properties.getDateFormat()); + + //配置序列化的指定行为 + fastJsonConfig.setWriterFeatures( + //将Long序列化为String long 转 string 丢失精度问题 + JSONWriter.Feature.WriteLongAsString, + //将List类型字段的空值序列化输出为空数组”[]” + JSONWriter.Feature.WriteNullListAsEmpty, + //将String类型字段的空值序列化输出为空字符串”” + JSONWriter.Feature.WriteNullStringAsEmpty, + //在大范围超过JavaScript支持的整数,输出为字符串格式 + JSONWriter.Feature.BrowserCompatible, + //保留map空的字段 + JSONWriter.Feature.WriteMapNullValue + ); + + //配置序列化过滤器 + fastJsonConfig.setWriterFilters( + DesensitizedFilter.instance + ); + + return fastJsonConfig; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/DbEnumDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/DbEnumDeserializer.java new file mode 100644 index 0000000..b33bb94 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/DbEnumDeserializer.java @@ -0,0 +1,30 @@ +package com.changhu.support.fastjson2.deserialze; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import com.changhu.common.db.BaseEnum; + +import java.lang.reflect.Type; + +/** + * @author 20252 + * @createTime 2024/8/28 下午4:39 + * @desc DbEnumDeserializer... + */ +public class DbEnumDeserializer implements ObjectReader> { + + public static final DbEnumDeserializer instance = new DbEnumDeserializer(); + + private DbEnumDeserializer() { + } + + @SuppressWarnings("unchecked") + @Override + public BaseEnum readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + Object value = jsonReader.readAny(); + if (value == null) { + return null; + } + return BaseEnum.valueOf((Class>) fieldType, value); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java new file mode 100644 index 0000000..98c55b4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java @@ -0,0 +1,31 @@ +package com.changhu.support.fastjson2.deserialze; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import org.geotools.measure.Latitude; + +import java.lang.reflect.Type; +import java.math.BigDecimal; + +/** + * author: luozhun + * desc: LatitudeDeserializer + * createTime: 2023/8/26 16:10 + */ +public class LatitudeDeserializer implements ObjectReader { + + public static final LatitudeDeserializer instance = new LatitudeDeserializer(); + + private LatitudeDeserializer() { + } + + @Override + public Latitude readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + //读取为BigDecimal来确保精度和避免浮点数的舍入误差 + BigDecimal value = jsonReader.readBigDecimal(); + if (value == null) { + return null; + } + return new Latitude(value.doubleValue()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java new file mode 100644 index 0000000..b8ba7fe --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java @@ -0,0 +1,31 @@ +package com.changhu.support.fastjson2.deserialze; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import org.geotools.measure.Longitude; + +import java.lang.reflect.Type; +import java.math.BigDecimal; + +/** + * author: luozhun + * desc: LongitudeDeserializer + * createTime: 2023/8/26 16:15 + */ +public class LongitudeDeserializer implements ObjectReader { + + public static final LongitudeDeserializer instance = new LongitudeDeserializer(); + + private LongitudeDeserializer() { + } + + @Override + public Longitude readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + //读取为BigDecimal来确保精度和避免浮点数的舍入误差 + BigDecimal value = jsonReader.readBigDecimal(); + if (value == null) { + return null; + } + return new Longitude(value.doubleValue()); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java new file mode 100644 index 0000000..c1c4f13 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java @@ -0,0 +1,35 @@ +package com.changhu.support.fastjson2.deserialze; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import com.changhu.common.utils.GeometryUtil; +import org.locationtech.jts.geom.Point; + +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * author: luozhun + * desc: PointDeserializer + * createTime: 2023/8/26 16:28 + */ +public class PointDeserializer implements ObjectReader { + + public static final PointDeserializer instance = new PointDeserializer(); + + private PointDeserializer() { + } + + @Override + public Point readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + List list = new ArrayList<>(); + jsonReader.readArray(list, BigDecimal.class); + if (CollUtil.isEmpty(list)) { + return null; + } + return GeometryUtil.createPoint(list); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/filter/DesensitizedFilter.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/filter/DesensitizedFilter.java new file mode 100644 index 0000000..b4a0ff0 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/filter/DesensitizedFilter.java @@ -0,0 +1,60 @@ +package com.changhu.support.fastjson2.filter; + +import cn.hutool.core.util.DesensitizedUtil; +import com.alibaba.fastjson2.filter.ValueFilter; +import com.changhu.common.annotation.Desensitized; +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * author: luozhun + * desc: 数据加敏过滤器 + * createTime: 2023/9/13 16:44 + */ +@Slf4j +public class DesensitizedFilter implements ValueFilter { + + public static final DesensitizedFilter instance = new DesensitizedFilter(); + + private final Map cache = new ConcurrentHashMap<>(); + + private DesensitizedFilter() { + } + + @Override + public Object apply(Object object, String name, Object value) { + //只针对string类型生效 + if (value instanceof String strValue && !strValue.isEmpty()) { + try { + String path = object.getClass().getName() + "$$" + name; + //先看是否有缓存 + if (cache.containsKey(path)) { + return DesensitizedUtil.desensitized(strValue, cache.get(path)); + } + Class aClass = object.getClass(); + Field declaredField = aClass.getDeclaredField(name); + Desensitized annotation = declaredField.getAnnotation(Desensitized.class); + if (annotation == null) { + return value; + } + //加入缓存 + cache.put(path, annotation.value()); + return DesensitizedUtil.desensitized(strValue, annotation.value()); + } catch (NoSuchFieldException e) { + return value; + } catch (SecurityException e) { + log.error("字段:{} 安全异常: {}", name, e.getMessage()); + return null; + } catch (Exception e) { + log.error("数据脱敏失败:{}", e.getMessage()); + return null; + } + } else { + return value; + } + } + +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/DbEnumSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/DbEnumSerializer.java new file mode 100644 index 0000000..4b27a9e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/DbEnumSerializer.java @@ -0,0 +1,28 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import com.changhu.common.db.BaseEnum; + +import java.lang.reflect.Type; + +/** + * @author 20252 + * @createTime 2024/8/28 下午4:19 + * @desc 数据库枚举到前端 + */ +public class DbEnumSerializer implements ObjectWriter> { + public static final DbEnumSerializer instance = new DbEnumSerializer(); + + private DbEnumSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeAny(((BaseEnum) object).serializer()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java new file mode 100644 index 0000000..55deee1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java @@ -0,0 +1,30 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import org.geotools.measure.Latitude; + +import java.lang.reflect.Type; + +/** + * author: luozhun + * desc: LatitudeSerializer + * createTime: 2023/8/26 15:44 + */ +public class LatitudeSerializer implements ObjectWriter { + + public static final LatitudeSerializer instance = new LatitudeSerializer(); + + private LatitudeSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeDouble(((Latitude) object).degrees()); + } +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java new file mode 100644 index 0000000..42b27df --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java @@ -0,0 +1,30 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import org.geotools.measure.Longitude; + +import java.lang.reflect.Type; + +/** + * author: luozhun + * desc: LongitudeSerializer + * createTime: 2023/8/26 15:46 + */ +public class LongitudeSerializer implements ObjectWriter { + + public static final LongitudeSerializer instance = new LongitudeSerializer(); + + private LongitudeSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeDouble(((Longitude) object).degrees()); + } +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/MinioPrefixSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/MinioPrefixSerializer.java new file mode 100644 index 0000000..5142540 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/MinioPrefixSerializer.java @@ -0,0 +1,27 @@ +package com.changhu.support.fastjson2.serializer; + +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; + +import java.lang.reflect.Type; + +/** + * @author 20252 + * @createTime 2024/10/10 下午3:19 + * @desc MinioPrefixSerializer... + */ +public class MinioPrefixSerializer implements ObjectWriter { + + private final String minioPrefix = SpringUtil.getProperty("minio.url"); + + public static final MinioPrefixSerializer instance = new MinioPrefixSerializer(); + + private MinioPrefixSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + jsonWriter.writeString(minioPrefix + object); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java new file mode 100644 index 0000000..3815c21 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java @@ -0,0 +1,45 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import com.changhu.common.utils.GeometryUtil; +import org.geotools.measure.Latitude; +import org.geotools.measure.Longitude; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Point; + +import java.lang.reflect.Type; +import java.util.Arrays; + +/** + * author: luozhun + * desc: PointSerializer + * createTime: 2023/8/26 15:59 + */ +public class PointSerializer implements ObjectWriter { + + public static final PointSerializer instance = new PointSerializer(); + + private PointSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + Point point = (Point) object; + if (GeometryUtil.equals(GeometryUtil.emptyPoint(), point)) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeAny( + Arrays.asList( + new Longitude(point.getCoordinate().getOrdinate(Coordinate.X)).degrees(), + new Latitude(point.getCoordinate().getOrdinate(Coordinate.Y)).degrees() + ) + ); + } +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/handler/GlobalExceptionHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..05ba1d5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/handler/GlobalExceptionHandler.java @@ -0,0 +1,170 @@ +package com.changhu.support.handler; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.enums.ResultCode; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.model.JsonResult; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.http.converter.HttpMessageNotWritableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.bind.support.WebExchangeBindException; +import org.springframework.web.server.ResponseStatusException; +import org.springframework.web.servlet.NoHandlerFoundException; + +import java.util.stream.Collectors; + +/** + * author: luozhun + * desc: GlobalExceptionHandler + * createTime: 2023/8/16 18:47 + */ +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(Throwable.class) + public JsonResult throwableHandler(Throwable throwable) { + String errorLabel = "系统错误:" + ExceptionUtil.getMessage(throwable); + log.error("系统错误:", throwable); + return JsonResult.custom(ResultCode.ERROR.getCode(), errorLabel); + } + + @ExceptionHandler(NoHandlerFoundException.class) + public JsonResult handlerNoFoundException(NoHandlerFoundException e) { + log.error("找不到资源:{}", e.getMessage()); + return JsonResult.custom(ResultCode.NOT_FOUND_404); + } + + @ExceptionHandler(HttpMessageNotWritableException.class) + public void HttpMessageNotWritableException(HttpMessageNotWritableException e) { + log.error("HttpMessageNotWritableException", e); + } + + /** + * 空指针错误 + */ + @ExceptionHandler(NullPointerException.class) + public JsonResult nullPointerException(NullPointerException exception) { + String errorLabel = "空指针错误:" + ExceptionUtil.getMessage(exception); + log.error("空指针错误:", exception); + return JsonResult.custom(ResultCode.ERROR.getCode(), errorLabel); + } + + /** + * 业务异常 + */ + @ExceptionHandler(MessageException.class) + public JsonResult messageExceptionHandler(MessageException exception) { + String errorLabel = "业务异常:" + exception.getMessage(); + log.error("业务异常:", exception); + return JsonResult.custom(exception.getCode(), errorLabel); + } + + @ExceptionHandler(ResponseStatusException.class) + public JsonResult responseExceptionHandler(ResponseStatusException exception) { + int code = exception.getStatusCode().value(); + String message = "响应异常:" + exception.getReason(); + log.error("响应异常:{}", ExceptionUtil.stacktraceToString(exception)); + return JsonResult.custom(code, message); + } + + /** + * httpMessage + */ + @ExceptionHandler(HttpMessageNotReadableException.class) + public JsonResult httpMessageNotReadableException(HttpMessageNotReadableException exception) { + String message = exception.getMessage(); + log.error(message); + if (StrUtil.contains(message, "Required request body is missing")) { + return JsonResult.custom(ResultCode.REQUIRED_PARAM_MISSING); + } + return JsonResult.custom(ResultCode.PARAM_ERROR); + } + + /** + * 处理请求参数格式错误 @RequestBody上使用@Valid 实体上使用@NotNull等,验证失败后抛出的异常是MethodArgumentNotValidException异常 + */ + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public JsonResult exceptionHandler(MethodArgumentNotValidException exception) { + String message = exception.getAllErrors().stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.joining(",", ResultCode.PARAM_ERROR.getMessage() + ": 【", "】")); + log.error(message); + return JsonResult.custom(ResultCode.PARAM_ERROR.getCode(), message); + } + + /** + * 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常 + */ + @ExceptionHandler(value = BindException.class) + public JsonResult validExceptionHandler(BindException exception) { + String message = exception.getAllErrors().stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.joining(",", ResultCode.PARAM_ERROR.getMessage() + ": 【", "】")); + log.error(message); + return JsonResult.custom(ResultCode.PARAM_ERROR.getCode(), message); + } + + /** + * 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是ConstraintViolationException + */ + @ExceptionHandler(ConstraintViolationException.class) + public JsonResult ConstraintViolationExceptionHandler(ConstraintViolationException e) { + String message = e.getConstraintViolations().stream() + .map(ConstraintViolation::getMessage) + .collect(Collectors.joining(",", ResultCode.PARAM_ERROR.getMessage() + ": 【", "】")); + log.error(message); + return JsonResult.custom(ResultCode.PARAM_ERROR.getCode(), message); + } + + /** + * 全局参数校验错误,处理返回 + */ + @ExceptionHandler(WebExchangeBindException.class) + public JsonResult handleValidationException(WebExchangeBindException e) { + BindingResult bindingResult = e.getBindingResult(); + StringBuilder errorMessage = new StringBuilder(ResultCode.PARAM_ERROR.getMessage() + ": 【"); + for (FieldError fieldError : bindingResult.getFieldErrors()) { + errorMessage.append(fieldError.getDefaultMessage()).append(","); + } + log.error("{}】", errorMessage.substring(0, errorMessage.length() - 1)); + return JsonResult.custom(ResultCode.PARAM_ERROR.getCode(), errorMessage.substring(0, errorMessage.length() - 1) + "】"); + } + + @ExceptionHandler(NotLoginException.class) + public JsonResult handlerNotLoginException(NotLoginException nle) { + log.error(nle.getMessage()); + // 判断场景值,定制化异常信息 + ResultCode resultCode; + if (nle.getType().equals(NotLoginException.NOT_TOKEN)) { + resultCode = ResultCode.NOT_TOKEN; + } else if (nle.getType().equals(NotLoginException.INVALID_TOKEN)) { + resultCode = ResultCode.INVALID_TOKEN; + } else if (nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) { + resultCode = ResultCode.TOKEN_TIMEOUT; + } else if (nle.getType().equals(NotLoginException.BE_REPLACED)) { + resultCode = ResultCode.BE_REPLACED; + } else if (nle.getType().equals(NotLoginException.KICK_OUT)) { + resultCode = ResultCode.KICK_OUT; + } else if (nle.getType().equals(NotLoginException.TOKEN_FREEZE)) { + resultCode = ResultCode.TOKEN_FREEZE; + } else if (nle.getType().equals(NotLoginException.NO_PREFIX)) { + resultCode = ResultCode.NO_PREFIX; + } else { + resultCode = ResultCode.OTHER_TOKEN_ERROR; + } + return JsonResult.custom(resultCode); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/handler/JsonBodyHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/handler/JsonBodyHandler.java new file mode 100644 index 0000000..550cf15 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/handler/JsonBodyHandler.java @@ -0,0 +1,42 @@ +package com.changhu.support.handler; + +import com.changhu.common.pojo.model.JsonResult; +import com.changhu.support.interceptor.JsonBodyInterceptor; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +/** + * author: luozhun + * desc: 处理被标记的方法,将其包装为JsonResult + * createTime: 2023/8/18 11:45 + */ +@Slf4j +@RestControllerAdvice +public class JsonBodyHandler implements ResponseBodyAdvice { + + @Autowired + private HttpServletRequest request; + + @Override + public boolean supports(@NotNull MethodParameter methodParameter, @NotNull Class> aClass) { + return request.getAttribute(JsonBodyInterceptor.RESPONSE_ATTRIBUTE) != null && (Boolean) request.getAttribute(JsonBodyInterceptor.RESPONSE_ATTRIBUTE); + } + + @Override + public Object beforeBodyWrite(Object result, MethodParameter methodParameter, @NotNull MediaType mediaType, @NotNull Class> aClass, @NotNull ServerHttpRequest serverHttpRequest, @NotNull ServerHttpResponse serverHttpResponse) { + return switch (methodParameter.getParameterType().getSimpleName()) { + case "void" -> JsonResult.success(); + case "JsonResult" -> result; + default -> JsonResult.success(result); + }; + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/interceptor/JsonBodyInterceptor.java b/policeSecurityServer/src/main/java/com/changhu/support/interceptor/JsonBodyInterceptor.java new file mode 100644 index 0000000..64449a2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/interceptor/JsonBodyInterceptor.java @@ -0,0 +1,63 @@ +package com.changhu.support.interceptor; + +import cn.hutool.core.collection.ConcurrentHashSet; +import com.changhu.common.annotation.JsonBody; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.util.Set; + +/** + * author: luozhun + * desc: 方法或者类上是否添加JsonBody注解,如果有 需要进行标记 + * createTime: 2023/8/18 10:50 + */ +@Slf4j +public class JsonBodyInterceptor implements HandlerInterceptor { + + public static final String RESPONSE_ATTRIBUTE = "ResponseAttribute"; + + private static final Set cache = new ConcurrentHashSet<>(); + + @Override + public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { + if (handler instanceof HandlerMethod handlerMethod) { + //com.xxx.xxController#methodName(params1 , params2) + String methodDescription = handlerMethod.toString(); + //如果缓存有标识 则直接返回 + if (cache.contains(methodDescription)) { + request.setAttribute(RESPONSE_ATTRIBUTE, true); + return true; + } + + boolean b = false; + + JsonBody clazzJsonBody = handlerMethod.getBeanType().getAnnotation(JsonBody.class); + JsonBody methodJsonBody = handlerMethod.getMethodAnnotation(JsonBody.class); + if (clazzJsonBody != null) { + //默认是当前controller下的所有方法都以JsonResult输出 为了兼容部分不需要包装的方法 需要判断方法上是否有JsonBody(value=false) + if (methodJsonBody == null) { + b = true; + } else if (methodJsonBody.value()) { + b = true; + } + } else { + if (methodJsonBody != null && methodJsonBody.value()) { + b = true; + } + } + + if (b) { + //添加Attribute,便于后续JsonBodyAdvice处理 + request.setAttribute(RESPONSE_ATTRIBUTE, true); + //缓存 + cache.add(methodDescription); + } + } + return true; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/interceptor/OpenApiInterceptor.java b/policeSecurityServer/src/main/java/com/changhu/support/interceptor/OpenApiInterceptor.java new file mode 100644 index 0000000..e0cc567 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/interceptor/OpenApiInterceptor.java @@ -0,0 +1,38 @@ +package com.changhu.support.interceptor; + +import com.changhu.common.annotation.CheckOpenApi; +import com.changhu.common.exception.MessageException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/10/9 下午5:05 + * @desc OpenApiInterceptor... + */ +@Slf4j +public class OpenApiInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { + String header = request.getHeader("X-API-KEY"); + log.info("apiKey:{} {} 请求:{}", header, LocalDateTime.now(), request.getRequestURI()); + if (handler instanceof HandlerMethod handlerMethod) { + CheckOpenApi methodAnnotation = handlerMethod.getMethodAnnotation(CheckOpenApi.class); + if (methodAnnotation != null) { + List openApiKeys = methodAnnotation.value().getOpenApiKeys(); + if (!openApiKeys.contains(header)) { + throw new MessageException("openApiKey error!"); + } + } + } + return true; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/interceptor/UserTypeInterceptor.java b/policeSecurityServer/src/main/java/com/changhu/support/interceptor/UserTypeInterceptor.java new file mode 100644 index 0000000..fd54d67 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/interceptor/UserTypeInterceptor.java @@ -0,0 +1,55 @@ +package com.changhu.support.interceptor; + +import cn.hutool.core.util.ArrayUtil; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.db.enums.UserType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.utils.UserUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +/** + * @author 20252 + * @createTime 2024/9/4 下午4:00 + * @desc UserTypeInterceptor... + */ +public class UserTypeInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(@NotNull HttpServletRequest request, + @NotNull HttpServletResponse response, + @NotNull Object handler) { + if (handler instanceof HandlerMethod handlerMethod) { + boolean b = false; + UserType[] uts = null; + + CheckUserType clazzJsonBody = handlerMethod.getBeanType().getAnnotation(CheckUserType.class); + CheckUserType methodJsonBody = handlerMethod.getMethodAnnotation(CheckUserType.class); + + if (clazzJsonBody != null) { + if (methodJsonBody == null) { + b = true; + uts = clazzJsonBody.userTypes(); + } else if (methodJsonBody.value()) { + b = true; + uts = methodJsonBody.userTypes(); + } + } else { + if (methodJsonBody != null && methodJsonBody.value()) { + b = true; + uts = methodJsonBody.userTypes(); + } + } + + if (b && ArrayUtil.isNotEmpty(uts)) { + if (!ArrayUtil.contains(uts, UserUtil.getUserType())) { + throw new MessageException("客户端类型不对"); + } + } + } + return true; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/knife4j/Knefe4jConfig.java b/policeSecurityServer/src/main/java/com/changhu/support/knife4j/Knefe4jConfig.java new file mode 100644 index 0000000..4475426 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/knife4j/Knefe4jConfig.java @@ -0,0 +1,37 @@ +package com.changhu.support.knife4j; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author 20252 + * @createTime 2024/7/18 下午5:08 + * @desc Knefe4jConfig... + */ +@Configuration +public class Knefe4jConfig { + + + @Value("${spring.application.name}") + private String applicationName; + + @Bean + public OpenAPI openAPI() { + return new OpenAPI() + .info(new Info() // 基本信息配置 + .title(applicationName + "接口文档") // 标题 + .description("包含此项目的所有接口文档示例") // 描述Api接口文档的基本信息 + .version("v1") // 版本 + // 设置OpenAPI文档的联系信息,包括联系人姓名为"robin",邮箱为"robin@gmail.com"。 + .contact(new Contact().name("罗准").email("2025254074@qq.com")) + // 设置OpenAPI文档的许可证信息,包括许可证名称为"Apache 2.0",许可证URL为"http://springdoc.org"。 + .license(new License().name("Apache 2.0").url("http://springdoc.org")) + ); + + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/minio/MinioProperties.java b/policeSecurityServer/src/main/java/com/changhu/support/minio/MinioProperties.java new file mode 100644 index 0000000..28f907d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/minio/MinioProperties.java @@ -0,0 +1,89 @@ +package com.changhu.support.minio; + +import io.minio.MinioClient; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.cert.X509Certificate; + +/** + * fileName: MinioProperties + * author: LuoZhun + * createTime: 2023/11/10 17:26 + * description: some... + */ +@Slf4j +@Data +@Configuration +@ConfigurationProperties(prefix = "minio") +public class MinioProperties { + + /** + * minio服务器地址 + */ + private String url; + + /** + * 账号 + */ + private String accessKey; + + /** + * 密码 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + @Bean + public MinioClient minioClient() { + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + public void checkClientTrusted(X509Certificate[] certs, String authType) { + // Do nothing (trust any client certificate) + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) { + // Do nothing (trust any server certificate) + } + } + }; + + // Install the all-trusting trust manager + SSLContext sslContext = null; + try { + sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + } catch (Exception e) { + log.error("Install the all-trusting trust manager error:{}", e.getMessage()); + } + + + // Create a custom OkHttpClient that trusts all certificates + OkHttpClient customHttpClient = new OkHttpClient.Builder() + .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) + .hostnameVerifier((hostname, session) -> true) + .build(); + + return MinioClient.builder() + .endpoint(url) + .credentials(accessKey, secretKey) + .httpClient(customHttpClient) + .build(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/minio/service/MinioService.java b/policeSecurityServer/src/main/java/com/changhu/support/minio/service/MinioService.java new file mode 100644 index 0000000..86559a4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/minio/service/MinioService.java @@ -0,0 +1,84 @@ +package com.changhu.support.minio.service; + +import io.minio.messages.Bucket; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Set; + +/** + * fileName: MinioService + * author: LuoZhun + * createTime: 2023/11/10 17:30 + * description: minio service + */ +public interface MinioService { + + /** + * 查看指定bucket是否存在 + * + * @param bucketName 桶名称 + * @return 是否存在 + */ + boolean bucketExists(String bucketName); + + /** + * 创建桶 + * + * @param bucketName 桶名称 + * @return 床架结果 + */ + boolean createBucket(String bucketName); + + /** + * 删除bucket + * + * @param bucketName 桶名称 + * @return 删除结果 + */ + boolean removeBucket(String bucketName); + + /** + * 获取所有的bucket + * + * @return bucket列表 + */ + List getAllBuckets(); + + /** + * 文件上传 + * + * @param file 需要上传的文件 + * @return 服务器地址 + */ + String upload(MultipartFile file); + + String upload(MultipartFile file, String baseDir); + + String upload(File file, String baseDir); + + void removeFile(String path); + + void removeFiles(Set paths); + + /** + * 预览文件 + * + * @param fileName 文件名 + * @return 预览地址 + */ + String preview(String fileName); + + /** + * 下载文件 + * + * @param fileName 文件名 + * @param res 响应流 + */ + void download(String fileName, HttpServletResponse res); + + String getResignedObjectUrl(String bucketName, String objectName); + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/minio/service/impl/MinioServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/support/minio/service/impl/MinioServiceImpl.java new file mode 100644 index 0000000..bd3a686 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/minio/service/impl/MinioServiceImpl.java @@ -0,0 +1,190 @@ +package com.changhu.support.minio.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.exception.MessageException; +import com.changhu.support.minio.MinioProperties; +import com.changhu.support.minio.service.MinioService; +import io.minio.*; +import io.minio.http.Method; +import io.minio.messages.Bucket; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * fileName: MinioServiceImpl + * author: LuoZhun + * createTime: 2023/11/10 17:36 + * description: some... + */ +@Slf4j +@Service +public class MinioServiceImpl implements MinioService { + + @Autowired + private MinioProperties minioProperties; + + @Autowired + private MinioClient minioClient; + + @Override + public boolean bucketExists(String bucketName) { + try { + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + } catch (Exception e) { + log.error(e.getMessage()); + return false; + } + } + + @Override + public boolean createBucket(String bucketName) { + try { + minioClient.makeBucket(MakeBucketArgs.builder() + .bucket(bucketName).build()); + } catch (Exception e) { + log.error(e.getMessage()); + return false; + } + return true; + } + + @Override + public boolean removeBucket(String bucketName) { + try { + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); + } catch (Exception e) { + log.error(e.getMessage()); + return false; + } + return true; + } + + @Override + public List getAllBuckets() { + try { + return minioClient.listBuckets(); + } catch (Exception e) { + log.error(e.getMessage()); + return null; + } + } + + @Override + public String upload(MultipartFile file) { + return upload(file, ""); + } + + @Override + public String upload(MultipartFile file, String baseDir) { + String originalFilename = file.getOriginalFilename(); + if (StrUtil.isBlank(originalFilename)) { + return null; + } + try { + PutObjectArgs objectArgs = PutObjectArgs.builder() + .bucket(minioProperties.getBucketName()) + .object(baseDir + LocalDateTime.now().format(DateTimeFormatter.ofPattern("/yyyy/MM/dd/")) + + IdUtil.simpleUUID() + + originalFilename.substring(originalFilename.lastIndexOf("."))) + .stream(file.getInputStream(), file.getSize(), -1) + .contentType(file.getContentType()) + .build(); + ObjectWriteResponse objectWriteResponse = minioClient.putObject(objectArgs); + String objectPath = StrUtil.startWith(objectWriteResponse.object(), "/") ? objectWriteResponse.object() : "/" + objectWriteResponse.object(); + return "/" + objectWriteResponse.bucket() + objectPath; + } catch (Exception e) { + log.error(e.getMessage()); + return null; + } + } + + @Override + public String upload(File file, String baseDir) { + String fileName = file.getName(); + if (StrUtil.isBlank(fileName)) { + return null; + } + try { + PutObjectArgs objectArgs = PutObjectArgs.builder() + .bucket(minioProperties.getBucketName()) + .object(baseDir + LocalDateTime.now().format(DateTimeFormatter.ofPattern("/yyyy/MM/dd/")) + + IdUtil.simpleUUID() + + fileName.substring(fileName.lastIndexOf("."))) + .stream(new FileInputStream(file), file.length(), -1) + .build(); + ObjectWriteResponse objectWriteResponse = minioClient.putObject(objectArgs); + String objectPath = StrUtil.startWith(objectWriteResponse.object(), "/") ? objectWriteResponse.object() : "/" + objectWriteResponse.object(); + return "/" + objectWriteResponse.bucket() + objectPath; + } catch (Exception e) { + log.error(e.getMessage()); + return null; + } + } + + @Override + public void removeFile(String path) { + try { + //找出第二个/的位置 + int index = path.indexOf('/', 1); + minioClient.removeObject(RemoveObjectArgs.builder() + //第一个/与第二个/之间的是bucketName + .bucket(path.substring(1, index)) + //第二个/之后的path是objectName + .object(path.substring(index)) + .build()); + } catch (Exception e) { + log.error("文件删除失败:{}", e.getMessage()); + } + } + + @Override + public void removeFiles(Set paths) { + paths.forEach(this::removeFile); + } + + @Override + public String preview(String fileName) { + GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder() + .bucket(minioProperties.getBucketName()) + .object(fileName) + .method(Method.GET) + .build(); + try { + return minioClient.getPresignedObjectUrl(build); + } catch (Exception e) { + log.error("minio预览异常:{}", e.getMessage()); + } + return null; + } + + @Override + public void download(String fileName, HttpServletResponse res) { + + } + + @Override + public String getResignedObjectUrl(String bucketName, String objectName) { + try { + return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder() + .method(Method.PUT) + .bucket(bucketName) + .object(objectName) + .expiry(10, TimeUnit.SECONDS) + .build()); + } catch (Exception e) { + throw new MessageException("获取临时上传地址失败:{}", e.getMessage()); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/annotation/DataScope.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/annotation/DataScope.java new file mode 100644 index 0000000..15edce3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/annotation/DataScope.java @@ -0,0 +1,18 @@ +package com.changhu.support.mybatisplus.annotation; + +import com.changhu.support.mybatisplus.handler.permission.AbstractDataPermissionHandler; + +import java.lang.annotation.*; + +/** + * @author 20252 + * @createTime 2024/8/8 下午4:07 + * @desc DataScope... + */ +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface DataScope { + Class permissionHandler(); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomIdGenerator.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomIdGenerator.java new file mode 100644 index 0000000..6fc73bd --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomIdGenerator.java @@ -0,0 +1,18 @@ +package com.changhu.support.mybatisplus.config; + +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; +import com.changhu.common.utils.SnowFlakeIdUtil; +import org.springframework.context.annotation.Configuration; + +/** + * author: luozhun + * desc: 自定义id生成器 + * createTime: 2023/12/1 16:45 + */ +@Configuration +public class CustomIdGenerator implements IdentifierGenerator { + @Override + public Long nextId(Object entity) { + return SnowFlakeIdUtil.snowflakeId(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMetaObjectHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMetaObjectHandler.java new file mode 100644 index 0000000..a5df64f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMetaObjectHandler.java @@ -0,0 +1,61 @@ +package com.changhu.support.mybatisplus.config; + +import cn.hutool.core.lang.func.LambdaUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.changhu.common.db.enums.DeleteFlag; +import com.changhu.common.utils.UserUtil; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDateTime; + +/** + * author: luozhun + * desc: CustomMetaObjectHandler + * createTime: 2023/12/1 17:16 + */ +@Slf4j +@Configuration +public class CustomMetaObjectHandler implements MetaObjectHandler { + + private final String createBy = LambdaUtil.getFieldName(BaseEntity::getCreateBy); + private final String updateBy = LambdaUtil.getFieldName(BaseEntity::getUpdateBy); + private final String createTime = LambdaUtil.getFieldName(BaseEntity::getCreateTime); + private final String updateTime = LambdaUtil.getFieldName(BaseEntity::getUpdateTime); + private final String deleteFlag = LambdaUtil.getFieldName(BaseEntity::getDeleteFlag); + + @Override + public void insertFill(MetaObject metaObject) { + Long userId; + try { + userId = UserUtil.getUserId(); + } catch (Exception e) { + log.warn("无用户数据状态下插入数据:{},原因:{}", metaObject.toString(), e.getMessage()); + userId = UserUtil.ERROR_USER_ID; + } + + this.strictInsertFill(metaObject, createBy, Long.class, userId); + this.strictInsertFill(metaObject, updateBy, Long.class, userId); + + LocalDateTime now = LocalDateTime.now(); + this.strictInsertFill(metaObject, createTime, LocalDateTime.class, now); + this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, now); + this.strictInsertFill(metaObject, deleteFlag, Integer.class, DeleteFlag.FALSE.getValue()); + } + + @Override + public void updateFill(MetaObject metaObject) { + Long userId; + try { + userId = UserUtil.getUserId(); + } catch (Exception e) { + log.warn("无用户数据状态下更新数据:{},原因:{}", metaObject.toString(), e.getMessage()); + userId = UserUtil.ERROR_USER_ID; + } + + this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); + this.strictUpdateFill(metaObject, updateBy, Long.class, userId); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java new file mode 100644 index 0000000..6421501 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java @@ -0,0 +1,66 @@ +package com.changhu.support.mybatisplus.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; +import com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.changhu.support.mybatisplus.interceptor.CustomDataPermissionHandler; +import com.changhu.support.mybatisplus.interceptor.GeometryInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * author: luozhun + * desc: CustomMybatisPlusConfig + * createTime: 2023/8/16 17:08 + */ +@Configuration +public class CustomMybatisPlusConfig { + + /** + * 新的分页插件,一缓和二缓遵循mybatis的规则 + * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(paginationInterceptor(DbType.MYSQL)); + // sql性能规范 + // interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor()); + // 地理位置支持 配合 + interceptor.addInnerInterceptor(new GeometryInnerInterceptor()); + interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); + //乐观锁插件 + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + //数据权限插件 + interceptor.addInnerInterceptor(new DataPermissionInterceptor(new CustomDataPermissionHandler())); + return interceptor; + } + + /** + * 分页插件 + */ + public PaginationInnerInterceptor paginationInterceptor(DbType dbType) { + PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(); + paginationInterceptor.setDbType(dbType); + // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false + paginationInterceptor.setOverflow(false); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInterceptor.setMaxLimit(500L); + // 开启 count 的 join 优化,只针对部分 left join + paginationInterceptor.setOptimizeJoin(true); + return paginationInterceptor; + } + + /** + * 解决Map映射非驼峰 + */ + @Bean + public ConfigurationCustomizer mybatisConfigurationCustomizer() { + return configuration -> configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/DataScopeManage.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/DataScopeManage.java new file mode 100644 index 0000000..06c182e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/DataScopeManage.java @@ -0,0 +1,73 @@ +package com.changhu.support.mybatisplus.config; + +import cn.hutool.core.util.ReflectUtil; +import com.changhu.support.mybatisplus.annotation.DataScope; +import com.changhu.support.mybatisplus.handler.permission.AbstractDataPermissionHandler; +import org.jetbrains.annotations.NotNull; +import org.mybatis.spring.mapper.MapperFactoryBean; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +/** + * @author 20252 + * @createTime 2024/8/8 下午4:08 + * @desc 数据权限管理器 + */ +@Component +public class DataScopeManage implements BeanPostProcessor { + + /** + * mappedStatementId 对应的 权限处理器 + */ + private static final Map dataScopeMethods = new HashMap<>(); + + /** + * 可以向权限处理器传递参数 + */ + private static final ThreadLocal paramsHolder = new ThreadLocal<>(); + + public static void setParams(Object params) { + paramsHolder.set(params); + } + + public static Object getParams() { + return paramsHolder.get(); + } + + public void removeParams() { + paramsHolder.remove(); + } + + /** + * 获取数据权限处理器 + * + * @param mappedStatementId key + * @return 权限处理器 + */ + public static AbstractDataPermissionHandler getDataScopeHandler(String mappedStatementId) { + return dataScopeMethods.get(mappedStatementId); + } + + @Override + public Object postProcessBeforeInitialization(@NotNull Object bean, @NotNull String beanName) throws BeansException { + if (bean instanceof MapperFactoryBean) { + Class mapperInterface = ((MapperFactoryBean) bean).getMapperInterface(); + Method[] methods = mapperInterface.getDeclaredMethods(); + for (Method method : methods) { + Optional.ofNullable(method.getAnnotation(DataScope.class)) + .ifPresent(dataScope -> dataScopeMethods.put( + mapperInterface.getName() + "." + method.getName(), + ReflectUtil.newInstance(dataScope.permissionHandler() + ))); + } + } + return bean; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java new file mode 100644 index 0000000..cf908b8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java @@ -0,0 +1,13 @@ +package com.changhu.support.mybatisplus.handler.global.geo; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.locationtech.jts.geom.Geometry; + +/** + * author: luozhun + * desc: GeometryTypeHandler + * createTime: 2023/8/25 17:59 + */ +public abstract class AbstractGeometryTypeHandler extends BaseTypeHandler { +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java new file mode 100644 index 0000000..3c0208d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java @@ -0,0 +1,55 @@ +package com.changhu.support.mybatisplus.handler.global.geo; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.changhu.common.utils.GeometryUtil; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.locationtech.jts.geom.Point; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * author: luozhun + * desc: PointTypeHandler + * createTime: 2023/8/26 13:17 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(Point.class) +public class PointTypeHandler extends AbstractGeometryTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement preparedStatement, int i, Point point, JdbcType jdbcType) throws SQLException { + preparedStatement.setString(i, point.toText()); + } + + @Override + public Point getNullableResult(ResultSet resultSet, String s) throws SQLException { + return createPoint(resultSet.getString(s), resultSet.getBytes(s)); + } + + @Override + public Point getNullableResult(ResultSet resultSet, int i) throws SQLException { + return createPoint(resultSet.getString(i), resultSet.getBytes(i)); + } + + @Override + public Point getNullableResult(CallableStatement callableStatement, int i) throws SQLException { + return createPoint(callableStatement.getString(i), callableStatement.getBytes(i)); + } + + public Point createPoint(String pointStr, byte[] pointBytes) { + if (JSONUtil.isTypeJSON(pointStr)) { + return GeometryUtil.createGeometryFromGeoJson(pointStr, Point.class); + } + if (StrUtil.startWithIgnoreCase(pointStr, ClassUtil.getClassName(Point.class, true))) { + return GeometryUtil.createGeometryFromWkt(pointStr, Point.class); + } + return GeometryUtil.createPoint(pointBytes); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/DictTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/DictTypeHandler.java new file mode 100644 index 0000000..c843a59 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/DictTypeHandler.java @@ -0,0 +1,31 @@ +package com.changhu.support.mybatisplus.handler.global.json; + +import cn.hutool.core.lang.Dict; +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + + +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes({Dict.class}) +public class DictTypeHandler extends AbstractJsonTypeHandler { + + public DictTypeHandler(Class type) { + super(type); + } + + @Override + public Dict parse(String json) { + if (!JSON.isValid(json)) { + return null; + } + return JSON.parseObject(json, Dict.class); + } + + @Override + public String toJson(Dict obj) { + return JSON.toJSONString(obj); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/ListTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/ListTypeHandler.java new file mode 100644 index 0000000..b03e6e6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/ListTypeHandler.java @@ -0,0 +1,37 @@ +package com.changhu.support.mybatisplus.handler.global.json; + +import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.util.List; + +/** + * author: luozhun + * desc: 将 mysql json 映射成 list + * createTime: 2023/10/30 15:50 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes({List.class}) +public class ListTypeHandler extends AbstractJsonTypeHandler> { + + public ListTypeHandler(Class type) { + super(type); + } + + @Override + public List parse(String json) { + if (!JSON.isValid(json)) { + return null; + } + return JSON.parseArray(json); + } + + @Override + public String toJson(List obj) { + return JSON.toJSONString(obj); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/SetTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/SetTypeHandler.java new file mode 100644 index 0000000..2d20859 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/json/SetTypeHandler.java @@ -0,0 +1,39 @@ +package com.changhu.support.mybatisplus.handler.global.json; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.util.Set; + +/** + * author: luozhun + * desc: 将 mysql json 映射成 list + * createTime: 2023/10/30 15:50 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes({Set.class}) +public class SetTypeHandler extends AbstractJsonTypeHandler> { + + public SetTypeHandler(Class type) { + super(type); + } + + @Override + public Set parse(String json) { + if (!JSON.isValid(json)) { + return null; + } + return new TypeReference>() { + }.parseObject(json); + } + + @Override + public String toJson(Set obj) { + return JSON.toJSONString(obj); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/permission/AbstractDataPermissionHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/permission/AbstractDataPermissionHandler.java new file mode 100644 index 0000000..1aeacda --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/permission/AbstractDataPermissionHandler.java @@ -0,0 +1,36 @@ +package com.changhu.support.mybatisplus.handler.permission; + +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; + + +/** + * @author 20252 + * @createTime 2024/7/31 下午4:02 + * @desc 所有具体负责权限处理的类都需要继承此接口 + */ +public interface AbstractDataPermissionHandler { + + /** + * 永远不成立的条件 + */ + EqualsTo neverEq = new EqualsTo(new Column("1"), new LongValue(2)); + + /** + * 获取数据权限 SQL 片段表达式 + * + * @param table 所执行的数据库表信息,可以通过此参数获取表名和表别名 + * @param where 待执行 SQL Where 条件表达式 + * @param mappedStatementId Mybatis MappedStatement Id 根据该参数可以判断具体执行方法 + * @return 数据权限 SQL 片段表达式 + */ + Expression apply(Table table, Expression where, String mappedStatementId); + + default Expression sqlFragment() { + return null; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/permission/psProjectMapper/GetMyProjectListPermissionHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/permission/psProjectMapper/GetMyProjectListPermissionHandler.java new file mode 100644 index 0000000..aab2eec --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/permission/psProjectMapper/GetMyProjectListPermissionHandler.java @@ -0,0 +1,30 @@ +package com.changhu.support.mybatisplus.handler.permission.psProjectMapper; + +import com.changhu.common.utils.UserUtil; +import com.changhu.support.mybatisplus.handler.permission.AbstractDataPermissionHandler; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; +import net.sf.jsqlparser.expression.operators.relational.EqualsTo; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; + +/** + * @author 20252 + * @createTime 2024/8/13 下午3:01 + * @desc GetMyProjectListPermissionHandler... + */ +public class GetMyProjectListPermissionHandler implements AbstractDataPermissionHandler { + @Override + public Expression apply(Table table, Expression where, String mappedStatementId) { + var b = false; + if (b) { + return null; + } + return sqlFragment(); + } + + @Override + public Expression sqlFragment() { + return new EqualsTo(new Column("responsible_user_id"), new LongValue(UserUtil.getUserId())); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/CustomDataPermissionHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/CustomDataPermissionHandler.java new file mode 100644 index 0000000..5c592b3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/CustomDataPermissionHandler.java @@ -0,0 +1,35 @@ +package com.changhu.support.mybatisplus.interceptor; + +import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler; +import com.changhu.support.mybatisplus.config.DataScopeManage; +import com.changhu.support.mybatisplus.handler.permission.AbstractDataPermissionHandler; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.schema.Table; + + +/** + * @author 20252 + * @createTime 2024/7/31 下午3:34 + * @desc 自定义的数据权限处理器 + */ +@Slf4j +public class CustomDataPermissionHandler implements MultiDataPermissionHandler { + + /** + * 获取数据权限 SQL 片段表达式 + * + * @param table 所执行的数据库表信息,可以通过此参数获取表名和表别名 + * @param where 待执行 SQL Where 条件表达式 + * @param mappedStatementId Mybatis MappedStatementId 根据该参数可以判断具体执行方法 + * @return 数据权限 SQL 片段表达式 + */ + @Override + public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) { + AbstractDataPermissionHandler abstractDataPermissionHandler = DataScopeManage.getDataScopeHandler(mappedStatementId); + if (abstractDataPermissionHandler == null) { + return null; + } + return abstractDataPermissionHandler.apply(table, where, mappedStatementId); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java new file mode 100644 index 0000000..7d6dccc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java @@ -0,0 +1,133 @@ +package com.changhu.support.mybatisplus.interceptor; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.locationtech.jts.geom.*; + +import java.lang.reflect.Field; +import java.sql.Connection; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static com.changhu.common.utils.GeometryUtil.ST_GeomFromText; + + +/** + * @author 20252 + * @createTime 2024/6/6 下午4:32 + * @desc 注意!!!此拦截器只针对mp提供的基本构造方法管用 可以进行参数对象拦截 如果是xml,请自行添加ST_GeomFromText函数 + */ +@Slf4j +public class GeometryInnerInterceptor extends JsqlParserSupport implements InnerInterceptor { + + + public static final List> GEOMETRY_CLASS_LIST = CollUtil.newArrayList( + Point.class, + MultiPoint.class, + Polygon.class, + MultiPolygon.class, + LineString.class, + MultiLineString.class + ); + + public GeometryInnerInterceptor() { + } + + @Override + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + //sql类型:INSERT UPDATE DELETE + SqlCommandType sct = ms.getSqlCommandType(); + //mp参数 + Object parameter = mpSh.parameterHandler().getParameterObject(); + //参数对象 + Object object = null; + //获取参数的属性 + switch (sct) { + case UPDATE: + try { + object = BeanUtil.beanToMap(parameter).get(Constants.ENTITY); + } catch (Exception ignored) { + } + break; + case INSERT: + object = parameter; + break; + } + //如果没有参数 就不进行sql修改 + if (object == null) { + return; + } + //获取 parameter 对象 中有关 geometry 的属性名对应 + List geoFields = this.getGeoFields(object); + //如果没有geometry字段 就不进行sql修改 + if (geoFields.isEmpty()) { + return; + } + //获取原始sql + BoundSql boundSql = ms.getBoundSql(parameter); + //UPDATE geo_test SET update_by=?,update_time=?,delete_flag=1 WHERE id=? AND delete_flag=0 + String originalSql = StrUtil.removeAllLineBreaks(boundSql.getSql()); + switch (sct) { + case UPDATE: + for (String geometryField : geoFields) { + String regex = geometryField + "\\s*=\\s*\\?"; + originalSql = ReUtil.replaceAll(originalSql, regex, StrUtil.format("{}={}", geometryField, ST_GeomFromText)); + } + break; + case INSERT: + for (String geometryField : geoFields) { + originalSql = this.replaceFindGeo(originalSql, geometryField); + } + break; + } + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + //修改sql + mpBs.sql(originalSql); + } + + private String replaceFindGeo(String originalSql, String geometryField) { + List split = StrUtil.split(originalSql, geometryField); + //找出geo字段在sql中的位置 + int geometryFieldIndex = StrUtil.count(split.get(0), ","); + StringBuilder stringBuffer = new StringBuilder(); + Matcher matcher = Pattern.compile("\\?").matcher(originalSql); + int count = 0; + while (matcher.find()) { + if (count == geometryFieldIndex) { + matcher.appendReplacement(stringBuffer, ST_GeomFromText); + break; + } + count++; + } + matcher.appendTail(stringBuffer); + return stringBuffer.toString(); + } + + /** + * 获取对象中的geo字段 + */ + private List getGeoFields(Object object) { + return Arrays.stream(ReflectUtil.getFields(object.getClass())) + .filter(field -> GEOMETRY_CLASS_LIST.contains(field.getType())) + .map(Field::getName) + .collect(Collectors.toList()); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/pojo/entity/BaseEntity.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/pojo/entity/BaseEntity.java new file mode 100644 index 0000000..a5705a5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/pojo/entity/BaseEntity.java @@ -0,0 +1,60 @@ +package com.changhu.support.mybatisplus.pojo.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +/** + * author: luozhun + * desc: 所有数据库表共有的属性 + * createTime: 2023/8/16 17:03 + */ +@TableName +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class BaseEntity { + + /** + * 业务id(雪花算法id) + */ + @TableId(type = IdType.ASSIGN_ID) + private Long snowFlakeId; + + /** + * 创建人 自动填充 + */ + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + /** + * 创建时间 自动填充 + */ + @TableField(fill = FieldFill.INSERT) + @OrderBy(sort = 1) + private LocalDateTime createTime; + + /** + * 更新人 自动填充 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; + + /** + * 更新时间 自动填充 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 逻辑删除(1是 0否) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + private Integer deleteFlag; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/pojo/params/PageParams.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/pojo/params/PageParams.java new file mode 100644 index 0000000..23a3e5b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/pojo/params/PageParams.java @@ -0,0 +1,37 @@ +package com.changhu.support.mybatisplus.pojo.params; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * author: luozhun + * desc: 分页参数 + * createTime: 2023/8/16 18:58 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@Schema(description = "分页参数") +public class PageParams { + + /** + * 参数对象 + */ + @Valid + @Schema(description = "查询参数") + private P params; + + /** + * 分页对象 + */ + @Schema(description = "分页参数") + private Page page; + +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/redis/config/CustomRedisConfig.java b/policeSecurityServer/src/main/java/com/changhu/support/redis/config/CustomRedisConfig.java new file mode 100644 index 0000000..597193d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/redis/config/CustomRedisConfig.java @@ -0,0 +1,52 @@ +package com.changhu.support.redis.config; + +import com.alibaba.fastjson2.support.spring6.data.redis.GenericFastJsonRedisSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * author: luozhun + * desc: redis自定义配置 + * createTime: 2023/10/24 16:18md + */ +@Configuration +public class CustomRedisConfig { + + /** + * fastjson2 redis序列化器 + */ + private final GenericFastJsonRedisSerializer fastJsonRedisSerializer = new GenericFastJsonRedisSerializer(); + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key的序列化采用StringRedisSerializer + redisTemplate.setKeySerializer(stringRedisSerializer); + redisTemplate.setHashKeySerializer(stringRedisSerializer); + + // value值的序列化采用GenericFastJsonRedisSerializer + redisTemplate.setValueSerializer(fastJsonRedisSerializer); + redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); + + redisTemplate.afterPropertiesSet(); + + // 事务支持 + redisTemplate.setEnableTransactionSupport(true); + return redisTemplate; + } + + @Bean + public RedisCacheConfiguration redisCacheConfiguration() { + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); + config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)); + return config; + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/redis/utils/RedisTemplateUtil.java b/policeSecurityServer/src/main/java/com/changhu/support/redis/utils/RedisTemplateUtil.java new file mode 100644 index 0000000..73d743d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/redis/utils/RedisTemplateUtil.java @@ -0,0 +1,270 @@ +package com.changhu.support.redis.utils; + +import cn.hutool.extra.spring.SpringUtil; +import com.changhu.common.exception.MessageException; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * @author 20252 + * @createTime 2024/7/23 下午5:15 + * @desc RedisTemplateUtil... + */ +@Slf4j +public class RedisTemplateUtil { + + public static final RedisTemplate redisTemplate = SpringUtil.getBean("redisTemplate"); + + // ============================= 通用 ============================ + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(默认秒) + */ + public static boolean expire(@NotNull String key, @NotNull Long time) { + return expire(key, time, TimeUnit.SECONDS); + } + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间 + * @param timeUnit 时间单位 + */ + public static boolean expire(@NotNull String key, @NotNull Long time, TimeUnit timeUnit) { + try { + if (time < 0) { + return false; + } + return Boolean.TRUE.equals(redisTemplate.expire(key, time, timeUnit)); + } catch (Exception e) { + log.error("指定缓存key:【{}】 失效时间失败:{}", key, e); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(默认为秒) 返回0代表为永久有效 + */ + public static Long getExpire(@NotNull String key) { + return getExpire(key, TimeUnit.SECONDS); + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @param timeUnit 时间单位 + * @return 过期时间 + */ + public static Long getExpire(@NotNull String key, TimeUnit timeUnit) { + try { + return redisTemplate.getExpire(key, timeUnit); + } catch (Exception e) { + log.error("获取key:【{}】 过期时间失败:{}", key, e); + return null; + } + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public static boolean hasKey(@NotNull String key) { + try { + return Boolean.TRUE.equals(redisTemplate.hasKey(key)); + } catch (Exception e) { + log.error("判断key:【{}】是否存在失败:{}", key, e); + return false; + } + } + + /** + * 删除缓存 + * + * @param keys 可以传一个值 或多个 + */ + public static Long del(@NotNull String... keys) { + return del(Arrays.asList(keys)); + } + + /** + * 删除缓存(List格式) + * + * @param keys list集合 + * @return 被删数量 + */ + public static Long del(@NotNull List keys) { + try { + return redisTemplate.delete(keys); + } catch (Exception e) { + log.error("删除缓存:【{}】 失败:{}", keys, e); + return null; + } + } + + /** + * 删除以 prefix 为前缀的所有缓存 + * 如:prefix = abc,则可以删除 abc abc123 abc_ed abc_234_ecd + * + * @param prefix 前缀 + * @return 被删数量 + */ + public static Long delByPrefix(String... prefix) { + return del(Arrays.stream(prefix) + .map(s -> s + "*") + .toList()); + } + + /** + * string 操作相关 + */ + public static class STRING { + @SuppressWarnings("unchecked") + public static V get(@NotNull String key) { + try { + return (V) redisTemplate.opsForValue().get(key); + } catch (Exception e) { + // redis不可用时 + log.error("STRING获取key:【{}】 失败:{}", key, e); + return null; + } + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public static boolean set(@NotNull String key, Object value) { + return set(key, value, -1); + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(time要大于0 如果time小于等于0 将设置无限期) 默认为秒 + * @return true成功 false 失败 + */ + public static boolean set(@NotNull String key, Object value, long time) { + return set(key, value, time, TimeUnit.SECONDS); + } + + /** + * 普通缓存放入并设置时间 + * + * @param key 键 + * @param value 值 + * @param time 时间(time要大于0 如果time小于等于0 将设置无限期) + * @param timeUnit 时间单位 + * @return true成功 false 失败 + */ + public static boolean set(@NotNull String key, Object value, long time, TimeUnit timeUnit) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, timeUnit); + } else { + redisTemplate.opsForValue().set(key, value); + } + return true; + } catch (Exception e) { + log.error("STRING设置key:【{}】 失败:{}", key, e); + return false; + } + } + + /** + * 递增 + * + * @param key 键 + * @param delta 要增加几(大于0) + */ + public static Long incr(@NotNull String key, long delta) { + try { + if (delta < 0) { + throw new MessageException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } catch (Exception e) { + log.error("STRING递增key:【{}】 失败:{}", key, e); + return null; + } + } + + /** + * 递减 + * + * @param key 键 + * @param delta 要减少几(小于0) + */ + public static Long decr(@NotNull String key, long delta) { + try { + if (delta < 0) { + throw new MessageException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } catch (Exception e) { + log.error("STRING递减key:【{}】 失败:{}", key, e); + return null; + } + } + + } + + /** + * hash 操作相关 + */ + public static class HASH { + /** + * 从hash表中取出指定项 + * + * @param key 键 + * @param item 项 + */ + @SuppressWarnings("unchecked") + public static V hGet(@NotNull String key, @NotNull String item) { + try { + return (V) redisTemplate.opsForHash().get(key, item); + } catch (Exception e) { + log.error("HASH hget key:【{}】 失败:{}", key, e); + return null; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public static boolean hSet(@NotNull String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + log.error("HASH hset key:【{}】 失败:{}", key, e); + return false; + } + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/satoken/SaTokenConfig.java b/policeSecurityServer/src/main/java/com/changhu/support/satoken/SaTokenConfig.java new file mode 100644 index 0000000..dd2c3ff --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/satoken/SaTokenConfig.java @@ -0,0 +1,43 @@ +package com.changhu.support.satoken; + +import cn.dev33.satoken.dao.SaTokenDaoRedis; +import cn.dev33.satoken.jwt.StpLogicJwtForSimple; +import cn.dev33.satoken.stp.StpLogic; +import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +/** + * @author 20252 + * @createTime 2024/7/23 下午4:21 + * @desc SaTokenConfig... + */ +@Component +public class SaTokenConfig { + + @Autowired + private SaTokenDaoRedis saTokenDaoRedis; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + + @Autowired + private RedisTemplate redisTemplate; + + @PostConstruct + public void setConfig() { + this.saTokenDaoRedis.stringRedisTemplate = this.stringRedisTemplate; + this.saTokenDaoRedis.objectRedisTemplate = this.redisTemplate; + } + + /** + * Sa-Token 整合 jwt (Simple 简单模式) + */ + @Bean + public StpLogic getStpLogicJwt() { + return new StpLogicJwtForSimple(); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/WebSocketConfig.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/WebSocketConfig.java new file mode 100644 index 0000000..99bcfcc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/WebSocketConfig.java @@ -0,0 +1,30 @@ +package com.changhu.support.ws; + +import com.changhu.support.ws.interceptor.WsAuthenticationInterceptor; +import com.changhu.support.ws.server.ManagementWebSocketServer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; + +/** + * author: luozhun + * desc: WebSocketConfig + * createTime: 2023/8/28 9:12 + */ +@Configuration +public class WebSocketConfig implements WebSocketConfigurer { + + @Autowired + private WsAuthenticationInterceptor webSocketInterceptor; + + @Autowired + private ManagementWebSocketServer managementWebSocketServer; + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(managementWebSocketServer, "/ws/connect/management") + .setAllowedOrigins("*") + .addInterceptors(webSocketInterceptor); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/enums/WsMsgType.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/enums/WsMsgType.java new file mode 100644 index 0000000..05cdb11 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/enums/WsMsgType.java @@ -0,0 +1,23 @@ +package com.changhu.support.ws.enums; + +import com.changhu.support.ws.handler.BaseMessageHandler; +import com.changhu.support.ws.handler.HeartbeatMessageHandler; +import com.changhu.support.ws.handler.SimpleMessageHandler; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: WsMsgType + * createTime: 2023/9/5 14:29 + */ +@Getter +@AllArgsConstructor +public enum WsMsgType { + + SIMPLE_MESSAGE("简单消息处理", SimpleMessageHandler.class), + HEARTBEAT("心跳处理", HeartbeatMessageHandler.class); + + private final String remark; + private final Class aClass; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/BaseMessageHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/BaseMessageHandler.java new file mode 100644 index 0000000..51df6b8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/BaseMessageHandler.java @@ -0,0 +1,24 @@ +package com.changhu.support.ws.handler; + +import com.changhu.support.ws.pojo.dto.WsMsgDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.WebSocketSession; + +/** + * author: luozhun + * desc: BaseMessageHandler + * createTime: 2023/9/5 14:32 + */ +@Slf4j +public abstract class BaseMessageHandler { + + public final WebSocketSession session; + public final WsMsgDTO message; + + public BaseMessageHandler(WebSocketSession session, WsMsgDTO msg) { + this.session = session; + this.message = msg; + } + + public abstract void handlerMessage(); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/HeartbeatMessageHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/HeartbeatMessageHandler.java new file mode 100644 index 0000000..39f728c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/HeartbeatMessageHandler.java @@ -0,0 +1,36 @@ +package com.changhu.support.ws.handler; + +import com.alibaba.fastjson2.JSON; +import com.changhu.support.ws.enums.WsMsgType; +import com.changhu.support.ws.pojo.dto.WsMsgDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.time.LocalDateTime; + +/** + * author: luozhun + * desc: HeartbeatMessageHandler + * createTime: 2023/9/5 14:34 + */ +@Slf4j +public class HeartbeatMessageHandler extends BaseMessageHandler { + + public HeartbeatMessageHandler(WebSocketSession session, WsMsgDTO msg) { + super(session, msg); + } + + @Override + public void handlerMessage() { + try { + WsMsgDTO stringWsMsgDTO = new WsMsgDTO<>(); + stringWsMsgDTO.setMsgType(WsMsgType.HEARTBEAT); + stringWsMsgDTO.setData("pong"); + stringWsMsgDTO.setDate(LocalDateTime.now()); + this.session.sendMessage(new TextMessage(JSON.toJSONString(stringWsMsgDTO))); + } catch (Exception e) { + log.info("心跳检测失败:{}", e.getMessage()); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/SimpleMessageHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/SimpleMessageHandler.java new file mode 100644 index 0000000..b681d48 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/handler/SimpleMessageHandler.java @@ -0,0 +1,21 @@ +package com.changhu.support.ws.handler; + +import com.changhu.support.ws.pojo.dto.WsMsgDTO; +import org.springframework.web.socket.WebSocketSession; + +/** + * author: luozhun + * desc: SimpleMessage + * createTime: 2023/9/5 14:33 + */ +public class SimpleMessageHandler extends BaseMessageHandler { + + public SimpleMessageHandler(WebSocketSession session, WsMsgDTO msg) { + super(session, msg); + } + + @Override + public void handlerMessage() { + + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/interceptor/WsAuthenticationInterceptor.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/interceptor/WsAuthenticationInterceptor.java new file mode 100644 index 0000000..a2ed72c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/interceptor/WsAuthenticationInterceptor.java @@ -0,0 +1,77 @@ +package com.changhu.support.ws.interceptor; + +import cn.hutool.core.lang.func.LambdaUtil; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.utils.UserUtil; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.http.server.ServletServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +/** + * author: luozhun + * desc: webSocket握手拦截器 + * createTime: 2023/8/28 11:52 + */ +@Slf4j +@Component +public class WsAuthenticationInterceptor implements HandshakeInterceptor { + + /** + * ws如果在请求后拼接token的话太长了 这里用他提供的子协议进行传输 + */ + public static final String SEC_WEBSOCKET_PROTOCOL = "Sec-WebSocket-Protocol"; + + public static final String attributeName = LambdaUtil.getFieldName(BaseEntity::getSnowFlakeId); + + /** + * 初次握手访问前 看需不需要做权限认证 + * + * @param request request + * @param response response + * @param wsHandler wsHandler + * @param attributes attributes + * @return true or false + */ + @Override + public boolean beforeHandshake(@NotNull ServerHttpRequest request, + @NotNull ServerHttpResponse response, + @NotNull WebSocketHandler wsHandler, + @NotNull Map attributes) { + HttpServletRequest req = ((ServletServerHttpRequest) request).getServletRequest(); + //取出子协议的token + String token = req.getHeader(SEC_WEBSOCKET_PROTOCOL); + attributes.put(attributeName, UserUtil.getUserIdByToken(token)); + return true; + } + + /** + * 初次握手访问后,将前端自定义协议头Sec-WebSocket-Protocol原封不动返回回去,否则会报错 + * + * @param request the current request + * @param response the current response + * @param wsHandler the target WebSocket handler + * @param exception an exception raised during the handshake, or {@code null} if none + */ + @Override + public void afterHandshake(@NotNull ServerHttpRequest request, + @NotNull ServerHttpResponse response, + @NotNull WebSocketHandler wsHandler, + Exception exception) { + HttpServletRequest httpRequest = ((ServletServerHttpRequest) request).getServletRequest(); + HttpServletResponse httpResponse = ((ServletServerHttpResponse) response).getServletResponse(); + if (StrUtil.isNotEmpty(httpRequest.getHeader(SEC_WEBSOCKET_PROTOCOL))) { + httpResponse.addHeader(SEC_WEBSOCKET_PROTOCOL, httpRequest.getHeader(SEC_WEBSOCKET_PROTOCOL)); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/manager/UserConnectWebsocketManager.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/manager/UserConnectWebsocketManager.java new file mode 100644 index 0000000..ae7b47e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/manager/UserConnectWebsocketManager.java @@ -0,0 +1,107 @@ +package com.changhu.support.ws.manager; + +import com.alibaba.fastjson2.JSON; +import com.changhu.support.ws.pojo.dto.WsMsgDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.ConcurrentWebSocketSessionDecorator; + +import java.io.IOException; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +/** + * author: luozhun + * desc: 用户连接websocket管理 + * createTime: 2023/11/27 10:57 + */ +@Slf4j +public class UserConnectWebsocketManager { + + /** + * 保存用户链接的map + * ConcurrentWebSocketSessionDecorator: + * 这是 Spring WebSocket 提供的一个装饰器类,用于增强底层的 WebSocketSession 的线程安全性。 + * 它通过并发安全的方式包装原始的 WebSocketSession 对象,确保在多线程环境下安全地访问和修改会 + * 话属性,以及进行消息发送操作。 + */ + private static final Map SESSION_POLL = new ConcurrentHashMap<>(); + + /** + * 当前在线session数量 + */ + public static Integer getSessionPollSize() { + return SESSION_POLL.size(); + } + + /** + * 添加session + * + * @param key key + * @param webSocketSession webSocketSession + */ + public static void add(Long key, WebSocketSession webSocketSession) { + SESSION_POLL.put(key, new ConcurrentWebSocketSessionDecorator(webSocketSession, 10 * 1000, 1024 * 1024)); + } + + /** + * 删除session + * + * @param key key + * @return 删除的webSocketSession + */ + public static WebSocketSession remove(Long key) { + return SESSION_POLL.remove(key); + } + + /** + * 删除并同步关闭链接 + * + * @param key key + */ + public static void removeAndClose(Long key) { + Optional.ofNullable(remove(key)).ifPresent(session -> { + try { + session.close(); + } catch (IOException e) { + log.error("session关闭异常:{}", e.getMessage()); + } + }); + } + + /** + * 获取webSocketSession + * + * @param key key + * @return webSocketSession + */ + public static WebSocketSession get(Long key) { + return SESSION_POLL.get(key); + } + + /** + * 给指定用户推送消息 + * + * @param userId 用户id + * @param msgDTO 消息内容 + */ + public static void sendToConnectUser(Long userId, WsMsgDTO msgDTO) { + Optional.ofNullable(SESSION_POLL.get(userId)).ifPresent(webSocketSession -> { + try { + webSocketSession.sendMessage(new TextMessage(JSON.toJSONString(msgDTO))); + } catch (Exception e) { + log.error("websocket发送消息给:{} 异常:{}", userId, e.getMessage()); + } + }); + } + + /** + * 给所有用户发送消息 + */ + public static void sendAllConnectUser(WsMsgDTO msgDTO) { + SESSION_POLL.keySet().forEach(userId -> sendToConnectUser(userId, msgDTO)); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/pojo/dto/WsMsgDTO.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/pojo/dto/WsMsgDTO.java new file mode 100644 index 0000000..b5a822f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/pojo/dto/WsMsgDTO.java @@ -0,0 +1,37 @@ +package com.changhu.support.ws.pojo.dto; + +import com.changhu.support.ws.enums.WsMsgType; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.lang.NonNull; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * author: luozhun + * desc: TestSocketDTO + * createTime: 2023/8/30 11:37 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class WsMsgDTO implements Serializable { + + /** + * 该消息类型 + */ + @NonNull + private WsMsgType msgType; + /** + * 消息内容 + */ + private T data; + /** + * 消息时间 + */ + private LocalDateTime date; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/ws/server/ManagementWebSocketServer.java b/policeSecurityServer/src/main/java/com/changhu/support/ws/server/ManagementWebSocketServer.java new file mode 100644 index 0000000..2b38d09 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/ws/server/ManagementWebSocketServer.java @@ -0,0 +1,57 @@ +package com.changhu.support.ws.server; + +import cn.hutool.core.util.ReflectUtil; +import com.alibaba.fastjson2.TypeReference; +import com.changhu.support.ws.enums.WsMsgType; +import com.changhu.support.ws.handler.BaseMessageHandler; +import com.changhu.support.ws.interceptor.WsAuthenticationInterceptor; +import com.changhu.support.ws.manager.UserConnectWebsocketManager; +import com.changhu.support.ws.pojo.dto.WsMsgDTO; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.handler.TextWebSocketHandler; + +/** + * author: luozhun + * desc: 后台管理用户连接websocket + * createTime: 2023/8/28 9:12 + */ +@Slf4j +@Component +public class ManagementWebSocketServer extends TextWebSocketHandler { + + @Override + public void afterConnectionEstablished(@NotNull WebSocketSession session) { + Long userId = (Long) session.getAttributes().get(WsAuthenticationInterceptor.attributeName); + if (userId != null) { + //删除老的连接 建立新的链接 + UserConnectWebsocketManager.removeAndClose(userId); + UserConnectWebsocketManager.add(userId, session); + } + } + + @Override + public void handleTextMessage(@NotNull WebSocketSession session, TextMessage message) { + String payload = message.getPayload(); + WsMsgDTO testSocketDTO = new TypeReference>() { + }.parseObject(payload); + + WsMsgType msgType = testSocketDTO.getMsgType(); + BaseMessageHandler baseMessageHandler = ReflectUtil.newInstance(msgType.getAClass(), session, testSocketDTO); + baseMessageHandler.handlerMessage(); + } + + @Override + public void afterConnectionClosed(@NotNull WebSocketSession session, @NotNull CloseStatus status) { + Long userId = (Long) session.getAttributes().get(WsAuthenticationInterceptor.attributeName); + if (userId != null) { + // 用户退出,移除缓存 + UserConnectWebsocketManager.removeAndClose(userId); + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/wx/WxMaConfiguration.java b/policeSecurityServer/src/main/java/com/changhu/support/wx/WxMaConfiguration.java new file mode 100644 index 0000000..a83a7e5 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/wx/WxMaConfiguration.java @@ -0,0 +1,30 @@ +package com.changhu.support.wx; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * author: luozhun + * desc: some... + * createTime: 2024/4/15 9:41 + */ +@Configuration +@EnableConfigurationProperties(WxMaProperties.class) +public class WxMaConfiguration { + @Bean + public WxMaService wxMaService(WxMaProperties properties) { + WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); + config.setAppid(properties.getAppid()); + config.setSecret(properties.getSecret()); + config.setMsgDataFormat(properties.getMsgDataFormat()); + + WxMaService service = new WxMaServiceImpl(); + service.setWxMaConfig(config); + return service; + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/wx/WxMaProperties.java b/policeSecurityServer/src/main/java/com/changhu/support/wx/WxMaProperties.java new file mode 100644 index 0000000..0e9c7af --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/wx/WxMaProperties.java @@ -0,0 +1,29 @@ +package com.changhu.support.wx; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * author: luozhun + * desc: some... + * createTime: 2024/4/15 9:40 + */ +@Data +@ConfigurationProperties(prefix = "wx.miniapp") +public class WxMaProperties { + + /** + * 设置微信小程序的appid + */ + private String appid; + + /** + * 设置微信小程序的Secret + */ + private String secret; + + /** + * 消息格式,XML或者JSON + */ + private String msgDataFormat; +} diff --git a/policeSecurityServer/src/main/resources/conf/log4j2.xml b/policeSecurityServer/src/main/resources/conf/log4j2.xml new file mode 100644 index 0000000..4b6a1a2 --- /dev/null +++ b/policeSecurityServer/src/main/resources/conf/log4j2.xml @@ -0,0 +1,148 @@ + + + + + + + + + ./logs + + + 20MB + + DEBUG + + + ${basePath}/all.log + + ${basePath}/%d{yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz + + 50 + + + ${basePath}/info.log + + ${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz + + 10 + + + ${basePath}/warn.log + + ${basePath}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz + + 10 + + + ${basePath}/error.log + + ${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz + + 10 + + + INFO + + %d %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} %style{[%t]}{bright,magenta} %style{%c{1.}.%M(%L)}{cyan}: %msg%n + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %C.%M - %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/env/dev/aes.setting b/policeSecurityServer/src/main/resources/env/dev/aes.setting new file mode 100644 index 0000000..5241025 --- /dev/null +++ b/policeSecurityServer/src/main/resources/env/dev/aes.setting @@ -0,0 +1,7 @@ +# 生成规则 +# RandomUtil.randomString(16) + +# 密钥 +secretKey=lBzl4sMiS2bf8mG6 +# 偏移向量,加盐 +secretIv=EdhW2wKXJCYBjNyI \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/env/dev/application.yml b/policeSecurityServer/src/main/resources/env/dev/application.yml new file mode 100644 index 0000000..b638e99 --- /dev/null +++ b/policeSecurityServer/src/main/resources/env/dev/application.yml @@ -0,0 +1,161 @@ +server: + port: 8765 + +springdoc: + swagger-ui: + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha + api-docs: + path: /v3/api-docs + group-configs: + - group: 'default' + paths-to-match: '/**' + packages-to-scan: + - com.changhu.controller + - com.changhu.module +knife4j: + enable: true + setting: + language: zh_cn + swagger-model-name: 实体类列表 + +spring: + application: + # 服务名称 + name: policeSecurityDevServer + servlet: + multipart: + # 设置单个文件最大大小为500MB + max-file-size: 500MB + # 设置多个文件大小为5GB + max-request-size: 5GB + web: + resources: + # 不要为我们工程中的资源文件建立映射 + add-mappings: false + banner: + location: classpath:static/banner.txt + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://118.253.177.137:3306/police_security_dev?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: police_security_dev + password: GejDeCNj3ZBSNxSP + # druid 连接池管理 + druid: + # 初始化时建立物理连接的个数 + initial-size: 5 + # 连接池的最小空闲数量 + min-idle: 5 + # 连接池最大连接数量 + max-active: 20 + # 获取连接时最大等待时间,单位毫秒 + max-wait: 60000 + # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + test-while-idle: true + # 既作为检测的间隔时间又作为testWhileIdel执行的依据 + time-between-eviction-runs-millis: 60000 + # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间) + min-evictable-idle-time-millis: 30000 + # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual) + validation-query: SELECT 1 FROM DUAL + # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-borrow: false + # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-return: false + # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。 + pool-prepared-statements: false + # 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入 + filters: stat,wall,slf4j + # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 + max-pool-prepared-statement-per-connection-size: -1 + # 合并多个DruidDataSource的监控数据 + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: + druid: + stat: + mergeSql: true + slowSqlMillis: 5000 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: true + login-username: admin + login-password: Luozhun121400 + allow: + cache: + type: redis + cache-names: common + data: + redis: + database: 1 + password: redis_csPDNr + port: 6380 + host: 118.253.177.137 + timeout: 10s + lettuce: + pool: + # 连接池最大连接数 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 连接池中的最大空闲连接 + max-idle: 10 + # 连接池中的最小空闲连接 + min-idle: 0 + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl + type-handlers-package: com.changhu.support.mybatisplus.handler.global + mapper-locations: classpath*:/mapper/*.xml + +logging: + config: classpath:conf/log4j2.xml + +minio: + url: http://118.253.177.137:9000 + accessKey: admin + secretKey: lonsung301 + bucketName: police-security-dev + +sa-token: + # token 名称(同时也是 cookie 名称) + token-name: token + # token 有效期(单位:秒) 默认30天,-1 代表永久有效 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + active-timeout: -1 + # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + is-share: true + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: uuid + # 是否输出操作日志 + is-log: true + # 是否尝试从 cookie 里读取 token + is-read-cookie: false + # jwt秘钥 + jwt-secret-key: a29216f8-cd60-4e96-89c5-ab6012159052 + +wx: + miniapp: + #微信小程序的appid + appid: wx0acd1c4fcf94bdd3 + #微信小程序的Secret + secret: 4b700dbacb42ef258537ddc61d964a17 + msgDataFormat: JSON + +project: + env: dev + fastjson2: + date-format: yyyy-MM-dd HH:mm:ss + threadPool: + thread-name-prefix: default-thread- + core-pool-size: 10 + max-pool-size: 20 + queue-capacity: 50 + keep-alive-seconds: 60 \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/env/dev/rsa.setting b/policeSecurityServer/src/main/resources/env/dev/rsa.setting new file mode 100644 index 0000000..4173a02 --- /dev/null +++ b/policeSecurityServer/src/main/resources/env/dev/rsa.setting @@ -0,0 +1,9 @@ +# 公钥私钥生成规则 +# RSA rs = new RSA(); +# rsa.getPublicKeyBase64(); +# rsa.getPrivateKeyBase64(); + +# 公钥 +publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJps/EXxxSpEM1Ix4R0NWIOBciHCr7P7coDT8tNKfelgR7txcJOqHCO/MIWe7T04aHQTcpQxqx9hMca7dbqz8TZpz9jvLzE/6ZonVKxHsoFnNlHMp1/CPAJ9f6D9wYicum2KltJkmQ0g//D9W2zPCYoGOmSRFcZx/KEBa4EM53jQIDAQAB +# 私钥 +privateKey=MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMmmz8RfHFKkQzUjHhHQ1Yg4FyIcKvs/tygNPy00p96WBHu3Fwk6ocI78whZ7tPThodBNylDGrH2Exxrt1urPxNmnP2O8vMT/pmidUrEeygWc2UcynX8I8An1/oP3BiJy6bYqW0mSZDSD/8P1bbM8JigY6ZJEVxnH8oQFrgQzneNAgMBAAECgYAwQ04H5HGtb+YsAh8wyWhKBY632cEJyFqoad88jRU+h25EQ/JuAYv0po+I6KlqJn7UwW2X4RkzDb/ONhO5C3f5WmW9jBWrwHZCBLQgoseoU/LdkhykHsgltt12MriWor3IkzprXs5ADvB5ijSAIQtKxVJlN20mMJ7fPYwUk3BiMQJBAOxxci09g5ofL4hnvrjbIEBApWC/mEcshmUBxm9Entmj+KDE8kxX5vK5Prr6VNSC+CshJJvJMpa2PqedAGusg+UCQQDaVKx9xM/0T61s/BYe9eJrZl8RGEk+9kEtvkhRsTcxFzdBeybmz5zHsIIGG8ExhQrA65sVR77JONIxWMFnkjqJAkAEMTa/Cposv2TOXFiLWodF3F+SSZNfn7B6Vf+4tVTDsx6TayqIo/5aS2KLWijq46+WxC2r/XNCLNULj8MUJajpAkBrthJTCeG+GgDpH4SaSZwmeB62hFC+aybEtndfNhqQcW+lMmiCvjIOohnDgbXSBFzFyHZ+DSMmio3IIo1n11BhAkBG9bxgH3PaAvLPp2FQIu0mv5WDtrF2KB8gouOXHDqOqqprmNP5753TWvuLYEn1TEJJ3qAaX98ekYsM7r5sQdUE \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/env/prod/aes.setting b/policeSecurityServer/src/main/resources/env/prod/aes.setting new file mode 100644 index 0000000..13daf44 --- /dev/null +++ b/policeSecurityServer/src/main/resources/env/prod/aes.setting @@ -0,0 +1,7 @@ +# 生成规则 +# RandomUtil.randomString(16) + +# 密钥 +secretKey=EtJwO7ypOt22z4vB +# 偏移向量,加盐 +secretIv=2DQAi5a2lKSSWvrr \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/env/prod/application.yml b/policeSecurityServer/src/main/resources/env/prod/application.yml new file mode 100644 index 0000000..ea1f45f --- /dev/null +++ b/policeSecurityServer/src/main/resources/env/prod/application.yml @@ -0,0 +1,161 @@ +server: + port: 8765 + +springdoc: + swagger-ui: + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha + api-docs: + path: /v3/api-docs + group-configs: + - group: 'default' + paths-to-match: '/**' + packages-to-scan: + - com.changhu.controller + - com.changhu.module +knife4j: + enable: true + setting: + language: zh_cn + swagger-model-name: 实体类列表 + +spring: + application: + # 服务名称 + name: policeSecurityProdServer + servlet: + multipart: + # 设置单个文件最大大小为500MB + max-file-size: 500MB + # 设置多个文件大小为5GB + max-request-size: 5GB + web: + resources: + # 不要为我们工程中的资源文件建立映射 + add-mappings: false + banner: + location: classpath:static/banner.txt + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://118.253.177.137:3306/police_security?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: police_security + password: xRxNWErNMKa6Th64 + # druid 连接池管理 + druid: + # 初始化时建立物理连接的个数 + initial-size: 5 + # 连接池的最小空闲数量 + min-idle: 5 + # 连接池最大连接数量 + max-active: 20 + # 获取连接时最大等待时间,单位毫秒 + max-wait: 60000 + # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + test-while-idle: true + # 既作为检测的间隔时间又作为testWhileIdel执行的依据 + time-between-eviction-runs-millis: 60000 + # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间) + min-evictable-idle-time-millis: 30000 + # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual) + validation-query: SELECT 1 FROM DUAL + # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-borrow: false + # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-return: false + # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。 + pool-prepared-statements: false + # 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入 + filters: stat,wall,slf4j + # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 + max-pool-prepared-statement-per-connection-size: -1 + # 合并多个DruidDataSource的监控数据 + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: + druid: + stat: + mergeSql: true + slowSqlMillis: 5000 + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: true + login-username: admin + login-password: Luozhun121400 + allow: + cache: + type: redis + cache-names: common + data: + redis: + database: 0 + password: redis_csPDNr + port: 6380 + host: 118.253.177.137 + timeout: 10s + lettuce: + pool: + # 连接池最大连接数 + max-active: 200 + # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + # 连接池中的最大空闲连接 + max-idle: 10 + # 连接池中的最小空闲连接 + min-idle: 0 + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl + type-handlers-package: com.changhu.support.mybatisplus.handler.global + mapper-locations: classpath*:/mapper/*.xml + +logging: + config: classpath:conf/log4j2.xml + +minio: + url: https://www.hnjinglian.cn:9002 + accessKey: admin + secretKey: lonsung301 + bucketName: police-security + +sa-token: + # token 名称(同时也是 cookie 名称) + token-name: token + # token 有效期(单位:秒) 默认30天,-1 代表永久有效 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + active-timeout: -1 + # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + is-share: true + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: uuid + # 是否输出操作日志 + is-log: true + # 是否尝试从 cookie 里读取 token + is-read-cookie: false + # jwt秘钥 + jwt-secret-key: a29216f8-cd60-4e96-89c5-ab6012159052 + +wx: + miniapp: + #微信小程序的appid + appid: wx0acd1c4fcf94bdd3 + #微信小程序的Secret + secret: 4b700dbacb42ef258537ddc61d964a17 + msgDataFormat: JSON + +project: + env: prod + fastjson2: + date-format: yyyy-MM-dd HH:mm:ss + threadPool: + thread-name-prefix: default-thread- + core-pool-size: 10 + max-pool-size: 14 + queue-capacity: 200 + keep-alive-seconds: 60 \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/env/prod/rsa.setting b/policeSecurityServer/src/main/resources/env/prod/rsa.setting new file mode 100644 index 0000000..c0c41b7 --- /dev/null +++ b/policeSecurityServer/src/main/resources/env/prod/rsa.setting @@ -0,0 +1,9 @@ +# 公钥私钥生成规则 +# Rsa ras = new Rsa(); +# rsa.getPublicKeyBase64(); +# rsa.getPrivateKeyBase64(); + +# 公钥 +publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpu1C3JHZ+Ng/eVVCZtwKsOZv9RktpAL13pKy4FoRHyNv2t8TPV2AMzLzfEzlWx001nBxyVxEMR2N9jAcqFLHv7r16ciOzbtzB9dky2G+bc9jIs4/EdVK5bAZcPRh5Jrb78sC9PHyR4AeceDyCIKHLUbWBJB4NTZE0s1Wh5kMynQIDAQAB +# 私钥 +privateKey=MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKm7ULckdn42D95VUJm3Aqw5m/1GS2kAvXekrLgWhEfI2/a3xM9XYAzMvN8TOVbHTTWcHHJXEQxHY32MByoUse/uvXpyI7Nu3MH12TLYb5tz2Mizj8R1UrlsBlw9GHkmtvvywL08fJHgB5x4PIIgoctRtYEkHg1NkTSzVaHmQzKdAgMBAAECgYAJE3+q83O0pw5tLLG9LoihjgkV35rruALpsXAc/fM/5XFBvaz0C2+S76XP5fbEea7axYjN4nMCbZTX41OEwAuNuxjbU/drayrMCceaBdw+7Q0C821wn5WGGfPpumueJjqrD/dqPvNZA8ajNAyzsyCmLwkEA3XJZ3464Env/rblPwJBAOVSidticA6JD+3F9zn2EpAdawR+v6h5FZY/y2U7V+YNJN8HkAeVXka6lwCd/T1TntTzbBsP86s8Uyt/jEtkeZMCQQC9ehpZaYow3at88XZRD0z3wHqwUPgpNbRh4ejOakq4E0PWSnSV1Q0qgtLLTb7KqZJgi/MIaYfhi61fTsbrj4EPAkBAQEHzv77Zs7lMy1ybVsCYtEVZuxGD6HkN4c3hDSFxiVk9S+ck2MrTUlAgkiNz3UvxKkqtwmhpH7vFwjTSotIVAkBckNdokQ/q+ZB61Lf5t+DhNI57rsLd1xfNrgD/PpxMO1UrzmoQfOoWt5zlp5CrD5asRhKwLGYuwP8tDZ5OnGfvAkACuLrF+HnUCzWYNdf2H8Rpof0ICC9Ro/k+Lqth+eqBkWKmZk5e5Fd6kvHtFPUZ2sq5NpjiE33E+OT/M5PtuY30 \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/AdministrativeDivisionMapper.xml b/policeSecurityServer/src/main/resources/mapper/AdministrativeDivisionMapper.xml new file mode 100644 index 0000000..20ca9d1 --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/AdministrativeDivisionMapper.xml @@ -0,0 +1,27 @@ + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/CkAssessmentRecordMapper.xml b/policeSecurityServer/src/main/resources/mapper/CkAssessmentRecordMapper.xml new file mode 100644 index 0000000..b2716f3 --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/CkAssessmentRecordMapper.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml b/policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml new file mode 100644 index 0000000..cce7070 --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml @@ -0,0 +1,38 @@ + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/EnterprisesUnitMapper.xml b/policeSecurityServer/src/main/resources/mapper/EnterprisesUnitMapper.xml new file mode 100644 index 0000000..881217a --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/EnterprisesUnitMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/ManagementPoliceUnitUserMapper.xml b/policeSecurityServer/src/main/resources/mapper/ManagementPoliceUnitUserMapper.xml new file mode 100644 index 0000000..ceddf6b --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/ManagementPoliceUnitUserMapper.xml @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/ManagementSecurityUnitUserMapper.xml b/policeSecurityServer/src/main/resources/mapper/ManagementSecurityUnitUserMapper.xml new file mode 100644 index 0000000..a34f53a --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/ManagementSecurityUnitUserMapper.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/policeSecurityServer/src/main/resources/mapper/MiniProgramUserMapper.xml b/policeSecurityServer/src/main/resources/mapper/MiniProgramUserMapper.xml new file mode 100644 index 0000000..021a877 --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/MiniProgramUserMapper.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/PoliceUnitMapper.xml b/policeSecurityServer/src/main/resources/mapper/PoliceUnitMapper.xml new file mode 100644 index 0000000..c6d5f6a --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/PoliceUnitMapper.xml @@ -0,0 +1,43 @@ + + + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/SecurityUnitMapper.xml b/policeSecurityServer/src/main/resources/mapper/SecurityUnitMapper.xml new file mode 100644 index 0000000..4a936cd --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/SecurityUnitMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/SecurityUserMapper.xml b/policeSecurityServer/src/main/resources/mapper/SecurityUserMapper.xml new file mode 100644 index 0000000..81f0f8e --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/SecurityUserMapper.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml b/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml new file mode 100644 index 0000000..3a5505a --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + diff --git a/policeSecurityServer/src/main/resources/static/banner.txt b/policeSecurityServer/src/main/resources/static/banner.txt new file mode 100644 index 0000000..bbb091e --- /dev/null +++ b/policeSecurityServer/src/main/resources/static/banner.txt @@ -0,0 +1,8 @@ + ________ ___ ___ ________ ________ ________ ___ ___ ___ ___ ___ ___ ___ ________ ___ ___ ___ +|\ ____\|\ \|\ \|\ __ \|\ ___ \|\ ____\ |\ \|\ \|\ \|\ \ |\ \ / /|\ \|\ ___ \ |\ \ / /|\ \ +\ \ \___|\ \ \\\ \ \ \|\ \ \ \\ \ \ \ \___| \ \ \\\ \ \ \\\ \ \ \ \/ / | \ \ \ \\ \ \ \ \ \/ / | \ \ + \ \ \ \ \ __ \ \ __ \ \ \\ \ \ \ \ ___ \ \ __ \ \ \\\ \ \ \ / / \ \ \ \ \\ \ \ \ \ / / \ \ \ + \ \ \____\ \ \ \ \ \ \ \ \ \ \\ \ \ \ \|\ \ \ \ \ \ \ \ \\\ \ / \/ \ \ \ \ \\ \ \ / \/ \ \ \ + \ \_______\ \__\ \__\ \__\ \__\ \__\\ \__\ \_______\ \ \__\ \__\ \_______\ / /\ \ \ \__\ \__\\ \__\ / /\ \ \ \__\ + \|_______|\|__|\|__|\|__|\|__|\|__| \|__|\|_______| \|__|\|__|\|_______| /__/ /\ __\ \|__|\|__| \|__| /__/ /\ __\ \|__| +::Spring Boot Version: ${AnsiColor.GREEN}${spring-boot.formatted-version}${AnsiColor.DEFAULT} diff --git a/policeSecurityServer/src/test/java/com/changhu/SuperUserInitTest.java b/policeSecurityServer/src/test/java/com/changhu/SuperUserInitTest.java new file mode 100644 index 0000000..e0b2a66 --- /dev/null +++ b/policeSecurityServer/src/test/java/com/changhu/SuperUserInitTest.java @@ -0,0 +1,28 @@ +package com.changhu; + +import com.changhu.module.management.pojo.params.ManagementSuperUserSaveOrUpdateParams; +import com.changhu.module.management.service.SuperService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * @author 20252 + * @createTime 2024/10/30 上午11:23 + * @desc SuperUserInitTest... + */ +@SpringBootTest +public class SuperUserInitTest { + + @Autowired + private SuperService superService; + + @Test + public void initAdmin() { + ManagementSuperUserSaveOrUpdateParams params = new ManagementSuperUserSaveOrUpdateParams(); + params.setName("超级管理员"); + params.setTelephone("15576404472"); + superService.saveOrUpdateUser(params); + + } +} diff --git a/policeSecurityServer/数据库生成实体脚本/java-entity.groovy b/policeSecurityServer/数据库生成实体脚本/java-entity.groovy new file mode 100644 index 0000000..d403ab4 --- /dev/null +++ b/policeSecurityServer/数据库生成实体脚本/java-entity.groovy @@ -0,0 +1,126 @@ +import com.intellij.database.model.DasTable +import com.intellij.database.util.Case +import com.intellij.database.util.DasUtil + +/* + * Available context bindings: + * SELECTION Iterable + * PROJECT project + * FILES files helper + */ + +packageName = "com.lz;" + +typeMapping = [ + (~/(?i)multipoint/) : "MultiPoint", + (~/(?i)multilinestring/) : "MultiLineString", + (~/(?i)multipolygon/) : "MultiPolygon", + (~/(?i)point/) : "Point", + (~/(?i)linestring/) : "LineString", + (~/(?i)polygon/) : "Polygon", + (~/(?i)bigint/) : "Long", + (~/(?i)int/) : "Integer", + (~/(?i)float|double|decimal|real/): "java.math.BigDecimal", + (~/(?i)varchar/) : "String", + (~/(?i)CHAR(1)/) : "String", + (~/(?i)datetime/) : "java.time.LocalDateTime", + (~/(?i)time/) : "java.time.LocalTime", + (~/(?i)date/) : "java.time.LocalDate", + (~/(?i)/) : "String", +] + +ignoreFeilds = ["id", "snowFlakeId", "deleteFlag", "createBy", "updateBy", "createTime", "updateTime"] + +FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> + SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } +} + +def generate(table, dir) { + def className = javaName(table.getName(), true) + def fields = calcFields(table) + new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields, table) } +} + +def generate(out, className, fields, table) { + out.println "package $packageName" + out.println "" + out.println "import java.io.Serial;" + out.println "import java.io.Serializable;" + out.println "" + out.println "import lombok.Data;" + out.println "import lombok.AllArgsConstructor;" + out.println "import lombok.NoArgsConstructor;" + out.println "import lombok.experimental.SuperBuilder;" + out.println "import lombok.EqualsAndHashCode;" + out.println "import com.baomidou.mybatisplus.annotation.TableName;" + out.println "" + out.println "" + out.println "/**" + out.println " * ${table.getComment() == null ? table.getName() : table.getComment()} 实体类" + out.println " * author: luozhun" + out.println " * desc 由groovy脚本自动生成" + out.println " */" + out.println "@Data" + out.println "@AllArgsConstructor" + out.println "@NoArgsConstructor" + out.println "@SuperBuilder" + out.println "@EqualsAndHashCode(callSuper = true)" + out.println "@TableName(autoResultMap = true)" + out.println "public class $className extends BaseEntity implements Serializable {" + out.println "" + out.println "\t@Serial" + out.println genSerialID() + out.println "" + fields.each() { + if (ignoreFeilds.contains(it.name)) return true + if (it.comment == null) it.comment = it.name + out.println " /**" + out.println " * ${it.comment}" + out.println " */" + out.println " private ${it.type} ${it.name};" + out.println "" + } + out.println "" + out.println "}" +} + +def calcFields(table) { + DasUtil.getColumns(table).reduce([]) { fields, col -> + def spec = Case.LOWER.apply(col.getDataType().getSpecification()) + def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value + fields += [[ + name : javaName(col.getName(), false), + type : typeStr, + comment: col.getComment() + ]] + } +} + +def javaName(str, capitalize) { + def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) + .collect { Case.LOWER.apply(it).capitalize() } + .join("") + .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") + capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1] +} + +static String genSerialID() { + return "\tprivate static final long serialVersionUID = 1L;" +} + +/** + * 解析common 例如 删除标记(1:已删除,2:未删除) + * 则解析后为 描述:删除标记 规则:1:已删除,2:未删除 + */ +static String analysisComment(comment) { + def regex = ~/(.*)[\(|\[|\{|\(|\<](.*)[\)|\]|\}|\)|\>]/ + def matcher = regex.matcher(comment) + if (matcher) { + def result = matcher[0] + def explain = result[1] + def rule = result[2] + return " @Comment(explain = \"$explain\", rule = \"$rule\")" + } else { + return " @Comment(explain = \"${comment}\")" + } +} \ No newline at end of file diff --git a/policeSecurityServer/数据库生成实体脚本/java-mapper.groovy b/policeSecurityServer/数据库生成实体脚本/java-mapper.groovy new file mode 100644 index 0000000..4c96a8c --- /dev/null +++ b/policeSecurityServer/数据库生成实体脚本/java-mapper.groovy @@ -0,0 +1,45 @@ +import com.intellij.database.model.DasTable +import com.intellij.database.util.Case + +/* + * Available context bindings: + * SELECTION Iterable + * PROJECT project + * FILES files helper + */ + +packageName = "com.lz;" + +FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> + SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } +} + +def generate(table, dir) { + def className = javaName(table.getName(), true) + new File(dir, className + "Mapper.java").withPrintWriter { out -> generate(out, className, table) } +} + +def generate(out, className, table) { + out.println "package $packageName" + out.println "" + out.println "import com.baomidou.mybatisplus.core.mapper.BaseMapper;" + out.println "import org.apache.ibatis.annotations.Mapper;" + out.println "" + out.println "/**" + out.println " * ${table.getComment() == null ? table.getName() : table.getName() + " (" + table.getComment() + ") "} 固化类" + out.println " * author: luozhun" + out.println " * desc 由groovy脚本自动生成" + out.println " */" + out.println "@Mapper" + out.println "public interface ${className}Mapper extends BaseMapper<${className}>{" + out.println "" + out.println "}" +} + +def javaName(str, capitalize) { + def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) + .collect { Case.LOWER.apply(it).capitalize() } + .join("") + .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") + capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1] +} \ No newline at end of file diff --git a/policeSecurityServer/数据库生成实体脚本/java-service.groovy b/policeSecurityServer/数据库生成实体脚本/java-service.groovy new file mode 100644 index 0000000..d05d4be --- /dev/null +++ b/policeSecurityServer/数据库生成实体脚本/java-service.groovy @@ -0,0 +1,43 @@ +import com.intellij.database.model.DasTable +import com.intellij.database.util.Case + +/* + * Available context bindings: + * SELECTION Iterable + * PROJECT project + * FILES files helper + */ + +packageName = "com.lz;" + +FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> + SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } +} + +def generate(table, dir) { + def className = javaName(table.getName(), true) + new File(dir, className + "Service.java").withPrintWriter { out -> generate(out, className, table) } +} + +def generate(out, className, table) { + out.println "package $packageName" + out.println "" + out.println "import com.baomidou.mybatisplus.extension.service.IService;" + out.println "" + out.println "/**" + out.println " * ${table.getComment() == null ? table.getName() : table.getName() + " (" + table.getComment() + ") "} 服务类" + out.println " * author: luozhun" + out.println " * desc 由groovy脚本自动生成" + out.println " */" + out.println "public interface ${className}Service extends IService<${className}>{" + out.println "" + out.println "}" +} + +def javaName(str, capitalize) { + def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) + .collect { Case.LOWER.apply(it).capitalize() } + .join("") + .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") + capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1] +} \ No newline at end of file diff --git a/policeSecurityServer/数据库生成实体脚本/java-serviceimpl.groovy b/policeSecurityServer/数据库生成实体脚本/java-serviceimpl.groovy new file mode 100644 index 0000000..d16b326 --- /dev/null +++ b/policeSecurityServer/数据库生成实体脚本/java-serviceimpl.groovy @@ -0,0 +1,45 @@ +import com.intellij.database.model.DasTable +import com.intellij.database.util.Case + +/* + * Available context bindings: + * SELECTION Iterable + * PROJECT project + * FILES files helper + */ + +packageName = "com.lz;" + +FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir -> + SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) } +} + +def generate(table, dir) { + def className = javaName(table.getName(), true) + new File(dir, className + "ServiceImpl.java").withPrintWriter { out -> generate(out, className, table) } +} + +def generate(out, className, table) { + out.println "package $packageName" + out.println "" + out.println "import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;" + out.println "import org.springframework.stereotype.Service;" + out.println "" + out.println "/**" + out.println " * ${table.getComment() == null ? table.getName() : table.getName() + " (" + table.getComment() + ") "} 服务实现类" + out.println " * author: luozhun" + out.println " * desc 由groovy脚本自动生成" + out.println " */" + out.println "@Service" + out.println "public class ${className}ServiceImpl extends ServiceImpl<${className}Mapper,${className}> implements ${className}Service{" + out.println "" + out.println "}" +} + +def javaName(str, capitalize) { + def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) + .collect { Case.LOWER.apply(it).capitalize() } + .join("") + .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_") + capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1] +} diff --git a/policeSecurityServer/数据库生成实体脚本/必读.txt b/policeSecurityServer/数据库生成实体脚本/必读.txt new file mode 100644 index 0000000..c602a4d --- /dev/null +++ b/policeSecurityServer/数据库生成实体脚本/必读.txt @@ -0,0 +1,7 @@ +使用idea生成可能有乱码的问题,解决方案: +1、打开help -> edit custom vm options +2、添加一行 -Dfile.encoding=UTF-8 +3、再次生成即可 + +步骤: +1. 将java-entity.groovy...拖到 Scratches and Consoles => Extensions => Database Tools and SQL => schema \ No newline at end of file diff --git a/securityManagement/.env.development b/securityManagement/.env.development new file mode 100644 index 0000000..91e16ee --- /dev/null +++ b/securityManagement/.env.development @@ -0,0 +1,14 @@ +VITE_APP_NAME=超级后台 +VITE_APP_ENV=development +VITE_APP_PORT=1000 +VITE_DROP_CONSOLE=false + +# axios +VITE_APP_BASE_API=/api +VITE_APP_PROXY_URL=http://172.10.10.93:8765 + +# rsa 公钥 +VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJps/EXxxSpEM1Ix4R0NWIOBciHCr7P7coDT8tNKfelgR7txcJOqHCO/MIWe7T04aHQTcpQxqx9hMca7dbqz8TZpz9jvLzE/6ZonVKxHsoFnNlHMp1/CPAJ9f6D9wYicum2KltJkmQ0g//D9W2zPCYoGOmSRFcZx/KEBa4EM53jQIDAQAB +# minio +VITE_APP_MINIO_URL=http://118.253.177.137:9000 +VITE_APP_MINIO_BUCKET=police-security-dev diff --git a/securityManagement/.env.production b/securityManagement/.env.production new file mode 100644 index 0000000..47ef829 --- /dev/null +++ b/securityManagement/.env.production @@ -0,0 +1,15 @@ +VITE_APP_NAME=超级后台 +VITE_APP_ENV=production +VITE_APP_PORT=1001 +VITE_DROP_CONSOLE=true + +# axios +VITE_APP_BASE_API=/api +VITE_APP_PROXY_URL=https://172.10.10.238:8765 + + +# rsa 公钥 +VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpu1C3JHZ+Ng/eVVCZtwKsOZv9RktpAL13pKy4FoRHyNv2t8TPV2AMzLzfEzlWx001nBxyVxEMR2N9jAcqFLHv7r16ciOzbtzB9dky2G+bc9jIs4/EdVK5bAZcPRh5Jrb78sC9PHyR4AeceDyCIKHLUbWBJB4NTZE0s1Wh5kMynQIDAQAB +# minio +VITE_APP_MINIO_URL=https://www.hnjinglian.cn:9002 +VITE_APP_MINIO_BUCKET=police-security \ No newline at end of file diff --git a/securityManagement/.gitignore b/securityManagement/.gitignore new file mode 100644 index 0000000..88931a5 --- /dev/null +++ b/securityManagement/.gitignore @@ -0,0 +1,29 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +.vscode +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json +yarn.lock +components.d.ts \ No newline at end of file diff --git a/securityManagement/Jenkinsfile b/securityManagement/Jenkinsfile new file mode 100644 index 0000000..e6640d3 --- /dev/null +++ b/securityManagement/Jenkinsfile @@ -0,0 +1,46 @@ +pipeline { + agent any + tools { + nodejs "node-v20.10.0" + } + stages { + stage('拉取代码') { + steps { + echo '开始拉取代码' + checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: '3', url: 'http://175.6.124.250:3100/luozhun/policeSecurity.git']]) + echo '代码拉取成功' + } + } + stage('构建前端项目') { + steps{ + echo '开始构建前端项目' + sh 'cd /var/jenkins_home/workspace/警保联动-保安后台/securityManagement && npm install --registry=https://registry.npmmirror.com && npm run build' + echo '前端项目构建完成' + } + } + stage('ssh远程推送代码'){ + steps{ + echo '开始推送构建产物' + script{ + def remote = [:] + remote.name = 'server-118.253.177.137' + remote.host = '118.253.177.137' + remote.port = 55555 + remote.allowAnyHosts = true + withCredentials([usernamePassword(credentialsId: '4', passwordVariable: 'password', usernameVariable: 'username')]) { + remote.user = "${username}" + remote.password = "${password}" + } + sshCommand remote: remote, command: 'pwd=$(pwd) echo "ssh连接成功!当前工作目录:$(pwd)"' + sshCommand remote: remote, command: 'echo "删除:securityManagement..."' + sshRemove remote: remote, path: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index/securityManagement' + sshCommand remote: remote, command: 'echo "删除:superManagement成功!"' + + sshCommand remote: remote, command: 'echo "将构建的securityManagement发送到服务器..."' + sshPut remote: remote, from: '/var/jenkins_home/workspace/警保联动-保安后台/securityManagement/securityManagement', into: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index' + sshCommand remote: remote, command: 'echo "securityManagement发送成功!"' + } + } + } + } +} diff --git a/securityManagement/README.md b/securityManagement/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/securityManagement/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + Vite + Vue + TS + + +
+ + + diff --git a/securityManagement/package.json b/securityManagement/package.json new file mode 100644 index 0000000..c9a6753 --- /dev/null +++ b/securityManagement/package.json @@ -0,0 +1,39 @@ +{ + "name": "supermanagement", + "appName": "超级后台", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "ant-design-vue": "^4.2.3", + "axios": "^1.7.5", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "pinia": "^2.2.2", + "pinia-plugin-persistedstate": "^3.2.0", + "sass": "^1.77.8", + "terser": "^5.36.0", + "vue": "^3.4.37", + "vue-component-type-helpers": "^2.1.2", + "vue-router": "4", + "vue-uuid": "^3.0.0" + }, + "devDependencies": { + "@types/lodash-es": "^4.17.8", + "@types/node": "^22.5.1", + "@vitejs/plugin-vue": "^5.1.2", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.44", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.3", + "unplugin-vue-components": "^0.27.4", + "vite": "^5.4.1", + "vue-tsc": "^2.0.29" + } +} diff --git a/securityManagement/postcss.config.js b/securityManagement/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/securityManagement/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/securityManagement/public/vite.svg b/securityManagement/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/securityManagement/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/securityManagement/src/App.vue b/securityManagement/src/App.vue new file mode 100644 index 0000000..e4f5ec4 --- /dev/null +++ b/securityManagement/src/App.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/securityManagement/src/assets/iconfont/demo.css b/securityManagement/src/assets/iconfont/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/securityManagement/src/assets/iconfont/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/securityManagement/src/assets/iconfont/demo_index.html b/securityManagement/src/assets/iconfont/demo_index.html new file mode 100644 index 0000000..c8a01b0 --- /dev/null +++ b/securityManagement/src/assets/iconfont/demo_index.html @@ -0,0 +1,2396 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    大小齿轮
    +
    &#xe6d0;
    +
  • + +
  • + +
    全屏
    +
    &#xe67d;
    +
  • + +
  • + +
    搜索
    +
    &#xe628;
    +
  • + +
  • + +
    消息通知
    +
    &#xeaf8;
    +
  • + +
  • + +
    退出全屏
    +
    &#xe6db;
    +
  • + +
  • + +
    添加
    +
    &#xe695;
    +
  • + +
  • + 𐄗 +
    编辑
    +
    &#x10117;
    +
  • + +
  • + +
    grid
    +
    &#xe8e4;
    +
  • + +
  • + +
    ic_batch
    +
    &#xe739;
    +
  • + +
  • + +
    删除
    +
    &#xfcb6;
    +
  • + +
  • + +
    其他
    +
    &#xe602;
    +
  • + +
  • + +
    全部
    +
    &#xe745;
    +
  • + +
  • + +
    音频
    +
    &#xe603;
    +
  • + +
  • + +
    文档
    +
    &#xe60e;
    +
  • + +
  • + +
    图片
    +
    &#xe606;
    +
  • + +
  • + +
    视频
    +
    &#xfb3c;
    +
  • + +
  • + +
    041_文档
    +
    &#xe6da;
    +
  • + +
  • + +
    关联保安
    +
    &#xe600;
    +
  • + +
  • + +
    保安消防
    +
    &#xe613;
    +
  • + +
  • + +
    右箭头
    +
    &#xe60c;
    +
  • + +
  • + +
    左箭头
    +
    &#xe60d;
    +
  • + +
  • + +
    铃铛
    +
    &#xe649;
    +
  • + +
  • + +
    文件夹
    +
    &#xe662;
    +
  • + +
  • + +
    菜单
    +
    &#xe626;
    +
  • + +
  • + +
    按钮
    +
    &#xe669;
    +
  • + +
  • + +
    资产管理
    +
    &#xe62e;
    +
  • + +
  • + +
    解除固定,图钉
    +
    &#xe9b9;
    +
  • + +
  • + +
    文字大小2
    +
    &#xe854;
    +
  • + +
  • + +
    转移03
    +
    &#xea34;
    +
  • + +
  • + +
    wxb品牌宝
    +
    &#xe620;
    +
  • + +
  • + +
    产品库
    +
    &#xe65f;
    +
  • + +
  • + +
    供应商支付
    +
    &#xe618;
    +
  • + +
  • + +
    KHCFDC_客户
    +
    &#xe6d2;
    +
  • + +
  • + +
    进销存
    +
    &#xe61f;
    +
  • + +
  • + +
    项目管理
    +
    &#xe609;
    +
  • + +
  • + +
    exe
    +
    &#xe63a;
    +
  • + +
  • + +
    mp4
    +
    &#xe639;
    +
  • + +
  • + +
    主图视频
    +
    &#xe612;
    +
  • + +
  • + +
    未知文件
    +
    &#xe61a;
    +
  • + +
  • + +
    Jpg
    +
    &#xe731;
    +
  • + +
  • + +
    Pdf
    +
    &#xe733;
    +
  • + +
  • + +
    svg图标
    +
    &#xe650;
    +
  • + +
  • + +
    doc
    +
    &#xe735;
    +
  • + +
  • + +
    gif
    +
    &#xe6a4;
    +
  • + +
  • + +
    JPEG
    +
    &#xe66d;
    +
  • + +
  • + +
    DOCX
    +
    &#xe672;
    +
  • + +
  • + +
    XLS
    +
    &#xe673;
    +
  • + +
  • + +
    XLSX
    +
    &#xe674;
    +
  • + +
  • + +
    PNG
    +
    &#xe69f;
    +
  • + +
  • + +
    上传文件
    +
    &#xe652;
    +
  • + +
  • + +
    24gl-folderPlus
    +
    &#xeabe;
    +
  • + +
  • + +
    019删除文件
    +
    &#xe7e5;
    +
  • + +
  • + +
    下载文件
    +
    &#xe615;
    +
  • + +
  • + +
    私人文件夹
    +
    &#xe680;
    +
  • + +
  • + +
    事件查询-壹米滴答-01
    +
    &#xe64d;
    +
  • + +
  • + +
    文件
    +
    &#xe62b;
    +
  • + +
  • + +
    系统
    +
    &#xe67c;
    +
  • + +
  • + +
    单位
    +
    &#xe611;
    +
  • + +
  • + +
    警察半身,公安
    +
    &#xe8f1;
    +
  • + +
  • + +
    mysql
    +
    &#xe667;
    +
  • + +
  • + +
    RabbitMQ
    +
    &#xe6a0;
    +
  • + +
  • + +
    断路器
    +
    &#xe60a;
    +
  • + +
  • + +
    白名单
    +
    &#xe643;
    +
  • + +
  • + +
    VPN网关
    +
    &#xe7da;
    +
  • + +
  • + +
    开发者中心
    +
    &#xe70f;
    +
  • + +
  • + +
    控制台
    +
    &#xe651;
    +
  • + +
  • + +
    百度
    +
    &#xe8cb;
    +
  • + +
  • + +
    外部链接
    +
    &#xe858;
    +
  • + +
  • + +
    字典管理
    +
    &#xe625;
    +
  • + +
  • + +
    数据开发—脚本开发
    +
    &#xe65c;
    +
  • + +
  • + +
    产品
    +
    &#xe64f;
    +
  • + +
  • + +
    销售
    +
    &#xe624;
    +
  • + +
  • + +
    测试
    +
    &#xe853;
    +
  • + +
  • + +
    专属经理
    +
    &#xe883;
    +
  • + +
  • + +
    公司
    +
    &#xe679;
    +
  • + +
  • + +
    系统权限
    +
    &#xe61e;
    +
  • + +
  • + +
    日志
    +
    &#xe647;
    +
  • + +
  • + +
    用户管理
    +
    &#xe62d;
    +
  • + +
  • + +
    定时任务
    +
    &#xe6a3;
    +
  • + +
  • + +
    dashboard
    +
    &#xe78b;
    +
  • + +
  • + +
    菜单
    +
    &#xe65d;
    +
  • + +
  • + +
    部门管理
    +
    &#xe61d;
    +
  • + +
  • + +
    角色管理
    +
    &#xe621;
    +
  • + +
  • + +
    系统
    +
    &#xe601;
    +
  • + +
  • + +
    204首页
    +
    &#xe8b9;
    +
  • + +
  • + +
    关于
    +
    &#xe623;
    +
  • + +
  • + +
    DVLINK_大屏
    +
    &#xe627;
    +
  • + +
  • + +
    weixin
    +
    &#xe656;
    +
  • + +
  • + +
    QQ
    +
    &#xe882;
    +
  • + +
  • + +
    content-right
    +
    &#xe67a;
    +
  • + +
  • + +
    主题
    +
    &#xe610;
    +
  • + +
  • + +
    sousuo
    +
    &#xe68a;
    +
  • + +
  • + +
    消息中心
    +
    &#xe8be;
    +
  • + +
  • + +
    中英文
    +
    &#xe605;
    +
  • + +
  • + +
    放大
    +
    &#xe622;
    +
  • + +
  • + +
    全屏缩小
    +
    &#xe62a;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1723194854588') format('woff2'),
+       url('iconfont.woff?t=1723194854588') format('woff'),
+       url('iconfont.ttf?t=1723194854588') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 大小齿轮 +
    +
    .icon-daxiaochilun +
    +
  • + +
  • + +
    + 全屏 +
    +
    .icon-quanping +
    +
  • + +
  • + +
    + 搜索 +
    +
    .icon-sousuo1 +
    +
  • + +
  • + +
    + 消息通知 +
    +
    .icon-xiaoxitongzhi +
    +
  • + +
  • + +
    + 退出全屏 +
    +
    .icon-tuichuquanping +
    +
  • + +
  • + +
    + 添加 +
    +
    .icon-tianjia +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-bianji1 +
    +
  • + +
  • + +
    + grid +
    +
    .icon-grid +
    +
  • + +
  • + +
    + ic_batch +
    +
    .icon-ic_batch +
    +
  • + +
  • + +
    + 删除 +
    +
    .icon-shanchu +
    +
  • + +
  • + +
    + 其他 +
    +
    .icon-qita1 +
    +
  • + +
  • + +
    + 全部 +
    +
    .icon-quanbu +
    +
  • + +
  • + +
    + 音频 +
    +
    .icon-yinpin +
    +
  • + +
  • + +
    + 文档 +
    +
    .icon-wendang +
    +
  • + +
  • + +
    + 图片 +
    +
    .icon-tupian +
    +
  • + +
  • + +
    + 视频 +
    +
    .icon-shipin +
    +
  • + +
  • + +
    + 041_文档 +
    +
    .icon-a-041_wendang +
    +
  • + +
  • + +
    + 关联保安 +
    +
    .icon-guanlianbaoan +
    +
  • + +
  • + +
    + 保安消防 +
    +
    .icon-baoanxiaofang +
    +
  • + +
  • + +
    + 右箭头 +
    +
    .icon-youjiantou +
    +
  • + +
  • + +
    + 左箭头 +
    +
    .icon-zuojiantou +
    +
  • + +
  • + +
    + 铃铛 +
    +
    .icon-lingdang +
    +
  • + +
  • + +
    + 文件夹 +
    +
    .icon-wenjianjia +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-caidan1 +
    +
  • + +
  • + +
    + 按钮 +
    +
    .icon-a-ziyuan4 +
    +
  • + +
  • + +
    + 资产管理 +
    +
    .icon-zichanguanli +
    +
  • + +
  • + +
    + 解除固定,图钉 +
    +
    .icon-fix +
    +
  • + +
  • + +
    + 文字大小2 +
    +
    .icon-wenzidaxiao2 +
    +
  • + +
  • + +
    + 转移03 +
    +
    .icon-zhuanyi03 +
    +
  • + +
  • + +
    + wxb品牌宝 +
    +
    .icon-wxbpinpaibao +
    +
  • + +
  • + +
    + 产品库 +
    +
    .icon-chanpinku +
    +
  • + +
  • + +
    + 供应商支付 +
    +
    .icon-gongyingshangzhifu +
    +
  • + +
  • + +
    + KHCFDC_客户 +
    +
    .icon-kehu +
    +
  • + +
  • + +
    + 进销存 +
    +
    .icon-jinxiaocun +
    +
  • + +
  • + +
    + 项目管理 +
    +
    .icon-xiangmuguanli- +
    +
  • + +
  • + +
    + exe +
    +
    .icon-exe +
    +
  • + +
  • + +
    + mp4 +
    +
    .icon-mp4 +
    +
  • + +
  • + +
    + 主图视频 +
    +
    .icon-zhutushipin +
    +
  • + +
  • + +
    + 未知文件 +
    +
    .icon-weizhiwenjian +
    +
  • + +
  • + +
    + Jpg +
    +
    .icon-Jpg +
    +
  • + +
  • + +
    + Pdf +
    +
    .icon-Pdf +
    +
  • + +
  • + +
    + svg图标 +
    +
    .icon-svgtubiao +
    +
  • + +
  • + +
    + doc +
    +
    .icon-doc +
    +
  • + +
  • + +
    + gif +
    +
    .icon-gif +
    +
  • + +
  • + +
    + JPEG +
    +
    .icon-JPEG +
    +
  • + +
  • + +
    + DOCX +
    +
    .icon-DOCX +
    +
  • + +
  • + +
    + XLS +
    +
    .icon-XLS +
    +
  • + +
  • + +
    + XLSX +
    +
    .icon-XLSX +
    +
  • + +
  • + +
    + PNG +
    +
    .icon-PNG +
    +
  • + +
  • + +
    + 上传文件 +
    +
    .icon-shangchuanwenjian +
    +
  • + +
  • + +
    + 24gl-folderPlus +
    +
    .icon-24gl-folderPlus +
    +
  • + +
  • + +
    + 019删除文件 +
    +
    .icon-019shanchuwenjian +
    +
  • + +
  • + +
    + 下载文件 +
    +
    .icon-xiazaiwenjian +
    +
  • + +
  • + +
    + 私人文件夹 +
    +
    .icon-3333 +
    +
  • + +
  • + +
    + 事件查询-壹米滴答-01 +
    +
    .icon-shijianchaxun-yimidida- +
    +
  • + +
  • + +
    + 文件 +
    +
    .icon-wenjian +
    +
  • + +
  • + +
    + 系统 +
    +
    .icon-xitong1 +
    +
  • + +
  • + +
    + 单位 +
    +
    .icon-danwei +
    +
  • + +
  • + +
    + 警察半身,公安 +
    +
    .icon-policeman-full +
    +
  • + +
  • + +
    + mysql +
    +
    .icon-mysql +
    +
  • + +
  • + +
    + RabbitMQ +
    +
    .icon-RabbitMQ +
    +
  • + +
  • + +
    + 断路器 +
    +
    .icon-duanluqi +
    +
  • + +
  • + +
    + 白名单 +
    +
    .icon-baimingdan +
    +
  • + +
  • + +
    + VPN网关 +
    +
    .icon-VPNwangguan +
    +
  • + +
  • + +
    + 开发者中心 +
    +
    .icon-kaifazhezhongxin +
    +
  • + +
  • + +
    + 控制台 +
    +
    .icon-kongzhitai +
    +
  • + +
  • + +
    + 百度 +
    +
    .icon-baidu +
    +
  • + +
  • + +
    + 外部链接 +
    +
    .icon-waibulianjie +
    +
  • + +
  • + +
    + 字典管理 +
    +
    .icon-zidianguanli +
    +
  • + +
  • + +
    + 数据开发—脚本开发 +
    +
    .icon-shujukaifajiaobenkaifa +
    +
  • + +
  • + +
    + 产品 +
    +
    .icon-chanpin +
    +
  • + +
  • + +
    + 销售 +
    +
    .icon-xiaoshou +
    +
  • + +
  • + +
    + 测试 +
    +
    .icon-ceshi +
    +
  • + +
  • + +
    + 专属经理 +
    +
    .icon-zhuanshujingli +
    +
  • + +
  • + +
    + 公司 +
    +
    .icon-gongsi +
    +
  • + +
  • + +
    + 系统权限 +
    +
    .icon-xitongquanxian +
    +
  • + +
  • + +
    + 日志 +
    +
    .icon-rizhi +
    +
  • + +
  • + +
    + 用户管理 +
    +
    .icon-yonghuguanli_huaban +
    +
  • + +
  • + +
    + 定时任务 +
    +
    .icon-dingshirenwu +
    +
  • + +
  • + +
    + dashboard +
    +
    .icon-dashboard +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-caidan +
    +
  • + +
  • + +
    + 部门管理 +
    +
    .icon-bumenguanli +
    +
  • + +
  • + +
    + 角色管理 +
    +
    .icon-jiaoseguanli +
    +
  • + +
  • + +
    + 系统 +
    +
    .icon-xitong +
    +
  • + +
  • + +
    + 204首页 +
    +
    .icon-shouye +
    +
  • + +
  • + +
    + 关于 +
    +
    .icon-guanyu +
    +
  • + +
  • + +
    + DVLINK_大屏 +
    +
    .icon-DVLINK_daping +
    +
  • + +
  • + +
    + weixin +
    +
    .icon-weixin +
    +
  • + +
  • + +
    + QQ +
    +
    .icon-QQ +
    +
  • + +
  • + +
    + content-right +
    +
    .icon-contentright +
    +
  • + +
  • + +
    + 主题 +
    +
    .icon-zhuti +
    +
  • + +
  • + +
    + sousuo +
    +
    .icon-sousuo +
    +
  • + +
  • + +
    + 消息中心 +
    +
    .icon-xiaoxi +
    +
  • + +
  • + +
    + 中英文 +
    +
    .icon-zhongyingwen +
    +
  • + +
  • + +
    + 放大 +
    +
    .icon-fangda +
    +
  • + +
  • + +
    + 全屏缩小 +
    +
    .icon-suoxiao +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    大小齿轮
    +
    #icon-daxiaochilun
    +
  • + +
  • + +
    全屏
    +
    #icon-quanping
    +
  • + +
  • + +
    搜索
    +
    #icon-sousuo1
    +
  • + +
  • + +
    消息通知
    +
    #icon-xiaoxitongzhi
    +
  • + +
  • + +
    退出全屏
    +
    #icon-tuichuquanping
    +
  • + +
  • + +
    添加
    +
    #icon-tianjia
    +
  • + +
  • + +
    编辑
    +
    #icon-bianji1
    +
  • + +
  • + +
    grid
    +
    #icon-grid
    +
  • + +
  • + +
    ic_batch
    +
    #icon-ic_batch
    +
  • + +
  • + +
    删除
    +
    #icon-shanchu
    +
  • + +
  • + +
    其他
    +
    #icon-qita1
    +
  • + +
  • + +
    全部
    +
    #icon-quanbu
    +
  • + +
  • + +
    音频
    +
    #icon-yinpin
    +
  • + +
  • + +
    文档
    +
    #icon-wendang
    +
  • + +
  • + +
    图片
    +
    #icon-tupian
    +
  • + +
  • + +
    视频
    +
    #icon-shipin
    +
  • + +
  • + +
    041_文档
    +
    #icon-a-041_wendang
    +
  • + +
  • + +
    关联保安
    +
    #icon-guanlianbaoan
    +
  • + +
  • + +
    保安消防
    +
    #icon-baoanxiaofang
    +
  • + +
  • + +
    右箭头
    +
    #icon-youjiantou
    +
  • + +
  • + +
    左箭头
    +
    #icon-zuojiantou
    +
  • + +
  • + +
    铃铛
    +
    #icon-lingdang
    +
  • + +
  • + +
    文件夹
    +
    #icon-wenjianjia
    +
  • + +
  • + +
    菜单
    +
    #icon-caidan1
    +
  • + +
  • + +
    按钮
    +
    #icon-a-ziyuan4
    +
  • + +
  • + +
    资产管理
    +
    #icon-zichanguanli
    +
  • + +
  • + +
    解除固定,图钉
    +
    #icon-fix
    +
  • + +
  • + +
    文字大小2
    +
    #icon-wenzidaxiao2
    +
  • + +
  • + +
    转移03
    +
    #icon-zhuanyi03
    +
  • + +
  • + +
    wxb品牌宝
    +
    #icon-wxbpinpaibao
    +
  • + +
  • + +
    产品库
    +
    #icon-chanpinku
    +
  • + +
  • + +
    供应商支付
    +
    #icon-gongyingshangzhifu
    +
  • + +
  • + +
    KHCFDC_客户
    +
    #icon-kehu
    +
  • + +
  • + +
    进销存
    +
    #icon-jinxiaocun
    +
  • + +
  • + +
    项目管理
    +
    #icon-xiangmuguanli-
    +
  • + +
  • + +
    exe
    +
    #icon-exe
    +
  • + +
  • + +
    mp4
    +
    #icon-mp4
    +
  • + +
  • + +
    主图视频
    +
    #icon-zhutushipin
    +
  • + +
  • + +
    未知文件
    +
    #icon-weizhiwenjian
    +
  • + +
  • + +
    Jpg
    +
    #icon-Jpg
    +
  • + +
  • + +
    Pdf
    +
    #icon-Pdf
    +
  • + +
  • + +
    svg图标
    +
    #icon-svgtubiao
    +
  • + +
  • + +
    doc
    +
    #icon-doc
    +
  • + +
  • + +
    gif
    +
    #icon-gif
    +
  • + +
  • + +
    JPEG
    +
    #icon-JPEG
    +
  • + +
  • + +
    DOCX
    +
    #icon-DOCX
    +
  • + +
  • + +
    XLS
    +
    #icon-XLS
    +
  • + +
  • + +
    XLSX
    +
    #icon-XLSX
    +
  • + +
  • + +
    PNG
    +
    #icon-PNG
    +
  • + +
  • + +
    上传文件
    +
    #icon-shangchuanwenjian
    +
  • + +
  • + +
    24gl-folderPlus
    +
    #icon-24gl-folderPlus
    +
  • + +
  • + +
    019删除文件
    +
    #icon-019shanchuwenjian
    +
  • + +
  • + +
    下载文件
    +
    #icon-xiazaiwenjian
    +
  • + +
  • + +
    私人文件夹
    +
    #icon-3333
    +
  • + +
  • + +
    事件查询-壹米滴答-01
    +
    #icon-shijianchaxun-yimidida-
    +
  • + +
  • + +
    文件
    +
    #icon-wenjian
    +
  • + +
  • + +
    系统
    +
    #icon-xitong1
    +
  • + +
  • + +
    单位
    +
    #icon-danwei
    +
  • + +
  • + +
    警察半身,公安
    +
    #icon-policeman-full
    +
  • + +
  • + +
    mysql
    +
    #icon-mysql
    +
  • + +
  • + +
    RabbitMQ
    +
    #icon-RabbitMQ
    +
  • + +
  • + +
    断路器
    +
    #icon-duanluqi
    +
  • + +
  • + +
    白名单
    +
    #icon-baimingdan
    +
  • + +
  • + +
    VPN网关
    +
    #icon-VPNwangguan
    +
  • + +
  • + +
    开发者中心
    +
    #icon-kaifazhezhongxin
    +
  • + +
  • + +
    控制台
    +
    #icon-kongzhitai
    +
  • + +
  • + +
    百度
    +
    #icon-baidu
    +
  • + +
  • + +
    外部链接
    +
    #icon-waibulianjie
    +
  • + +
  • + +
    字典管理
    +
    #icon-zidianguanli
    +
  • + +
  • + +
    数据开发—脚本开发
    +
    #icon-shujukaifajiaobenkaifa
    +
  • + +
  • + +
    产品
    +
    #icon-chanpin
    +
  • + +
  • + +
    销售
    +
    #icon-xiaoshou
    +
  • + +
  • + +
    测试
    +
    #icon-ceshi
    +
  • + +
  • + +
    专属经理
    +
    #icon-zhuanshujingli
    +
  • + +
  • + +
    公司
    +
    #icon-gongsi
    +
  • + +
  • + +
    系统权限
    +
    #icon-xitongquanxian
    +
  • + +
  • + +
    日志
    +
    #icon-rizhi
    +
  • + +
  • + +
    用户管理
    +
    #icon-yonghuguanli_huaban
    +
  • + +
  • + +
    定时任务
    +
    #icon-dingshirenwu
    +
  • + +
  • + +
    dashboard
    +
    #icon-dashboard
    +
  • + +
  • + +
    菜单
    +
    #icon-caidan
    +
  • + +
  • + +
    部门管理
    +
    #icon-bumenguanli
    +
  • + +
  • + +
    角色管理
    +
    #icon-jiaoseguanli
    +
  • + +
  • + +
    系统
    +
    #icon-xitong
    +
  • + +
  • + +
    204首页
    +
    #icon-shouye
    +
  • + +
  • + +
    关于
    +
    #icon-guanyu
    +
  • + +
  • + +
    DVLINK_大屏
    +
    #icon-DVLINK_daping
    +
  • + +
  • + +
    weixin
    +
    #icon-weixin
    +
  • + +
  • + +
    QQ
    +
    #icon-QQ
    +
  • + +
  • + +
    content-right
    +
    #icon-contentright
    +
  • + +
  • + +
    主题
    +
    #icon-zhuti
    +
  • + +
  • + +
    sousuo
    +
    #icon-sousuo
    +
  • + +
  • + +
    消息中心
    +
    #icon-xiaoxi
    +
  • + +
  • + +
    中英文
    +
    #icon-zhongyingwen
    +
  • + +
  • + +
    放大
    +
    #icon-fangda
    +
  • + +
  • + +
    全屏缩小
    +
    #icon-suoxiao
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/securityManagement/src/assets/iconfont/download.zip b/securityManagement/src/assets/iconfont/download.zip new file mode 100644 index 0000000..c6fadbe Binary files /dev/null and b/securityManagement/src/assets/iconfont/download.zip differ diff --git a/securityManagement/src/assets/iconfont/iconfont.css b/securityManagement/src/assets/iconfont/iconfont.css new file mode 100644 index 0000000..81a7063 --- /dev/null +++ b/securityManagement/src/assets/iconfont/iconfont.css @@ -0,0 +1,399 @@ +@font-face { + font-family: "iconfont"; /* Project id 4036849 */ + src: url('iconfont.woff2?t=1723194854588') format('woff2'), + url('iconfont.woff?t=1723194854588') format('woff'), + url('iconfont.ttf?t=1723194854588') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-daxiaochilun:before { + content: "\e6d0"; +} + +.icon-quanping:before { + content: "\e67d"; +} + +.icon-sousuo1:before { + content: "\e628"; +} + +.icon-xiaoxitongzhi:before { + content: "\eaf8"; +} + +.icon-tuichuquanping:before { + content: "\e6db"; +} + +.icon-tianjia:before { + content: "\e695"; +} + +.icon-bianji1:before { + content: "\10117"; +} + +.icon-grid:before { + content: "\e8e4"; +} + +.icon-ic_batch:before { + content: "\e739"; +} + +.icon-shanchu:before { + content: "\fcb6"; +} + +.icon-qita1:before { + content: "\e602"; +} + +.icon-quanbu:before { + content: "\e745"; +} + +.icon-yinpin:before { + content: "\e603"; +} + +.icon-wendang:before { + content: "\e60e"; +} + +.icon-tupian:before { + content: "\e606"; +} + +.icon-shipin:before { + content: "\fb3c"; +} + +.icon-a-041_wendang:before { + content: "\e6da"; +} + +.icon-guanlianbaoan:before { + content: "\e600"; +} + +.icon-baoanxiaofang:before { + content: "\e613"; +} + +.icon-youjiantou:before { + content: "\e60c"; +} + +.icon-zuojiantou:before { + content: "\e60d"; +} + +.icon-lingdang:before { + content: "\e649"; +} + +.icon-wenjianjia:before { + content: "\e662"; +} + +.icon-caidan1:before { + content: "\e626"; +} + +.icon-a-ziyuan4:before { + content: "\e669"; +} + +.icon-zichanguanli:before { + content: "\e62e"; +} + +.icon-fix:before { + content: "\e9b9"; +} + +.icon-wenzidaxiao2:before { + content: "\e854"; +} + +.icon-zhuanyi03:before { + content: "\ea34"; +} + +.icon-wxbpinpaibao:before { + content: "\e620"; +} + +.icon-chanpinku:before { + content: "\e65f"; +} + +.icon-gongyingshangzhifu:before { + content: "\e618"; +} + +.icon-kehu:before { + content: "\e6d2"; +} + +.icon-jinxiaocun:before { + content: "\e61f"; +} + +.icon-xiangmuguanli-:before { + content: "\e609"; +} + +.icon-exe:before { + content: "\e63a"; +} + +.icon-mp4:before { + content: "\e639"; +} + +.icon-zhutushipin:before { + content: "\e612"; +} + +.icon-weizhiwenjian:before { + content: "\e61a"; +} + +.icon-Jpg:before { + content: "\e731"; +} + +.icon-Pdf:before { + content: "\e733"; +} + +.icon-svgtubiao:before { + content: "\e650"; +} + +.icon-doc:before { + content: "\e735"; +} + +.icon-gif:before { + content: "\e6a4"; +} + +.icon-JPEG:before { + content: "\e66d"; +} + +.icon-DOCX:before { + content: "\e672"; +} + +.icon-XLS:before { + content: "\e673"; +} + +.icon-XLSX:before { + content: "\e674"; +} + +.icon-PNG:before { + content: "\e69f"; +} + +.icon-shangchuanwenjian:before { + content: "\e652"; +} + +.icon-24gl-folderPlus:before { + content: "\eabe"; +} + +.icon-019shanchuwenjian:before { + content: "\e7e5"; +} + +.icon-xiazaiwenjian:before { + content: "\e615"; +} + +.icon-3333:before { + content: "\e680"; +} + +.icon-shijianchaxun-yimidida-:before { + content: "\e64d"; +} + +.icon-wenjian:before { + content: "\e62b"; +} + +.icon-xitong1:before { + content: "\e67c"; +} + +.icon-danwei:before { + content: "\e611"; +} + +.icon-policeman-full:before { + content: "\e8f1"; +} + +.icon-mysql:before { + content: "\e667"; +} + +.icon-RabbitMQ:before { + content: "\e6a0"; +} + +.icon-duanluqi:before { + content: "\e60a"; +} + +.icon-baimingdan:before { + content: "\e643"; +} + +.icon-VPNwangguan:before { + content: "\e7da"; +} + +.icon-kaifazhezhongxin:before { + content: "\e70f"; +} + +.icon-kongzhitai:before { + content: "\e651"; +} + +.icon-baidu:before { + content: "\e8cb"; +} + +.icon-waibulianjie:before { + content: "\e858"; +} + +.icon-zidianguanli:before { + content: "\e625"; +} + +.icon-shujukaifajiaobenkaifa:before { + content: "\e65c"; +} + +.icon-chanpin:before { + content: "\e64f"; +} + +.icon-xiaoshou:before { + content: "\e624"; +} + +.icon-ceshi:before { + content: "\e853"; +} + +.icon-zhuanshujingli:before { + content: "\e883"; +} + +.icon-gongsi:before { + content: "\e679"; +} + +.icon-xitongquanxian:before { + content: "\e61e"; +} + +.icon-rizhi:before { + content: "\e647"; +} + +.icon-yonghuguanli_huaban:before { + content: "\e62d"; +} + +.icon-dingshirenwu:before { + content: "\e6a3"; +} + +.icon-dashboard:before { + content: "\e78b"; +} + +.icon-caidan:before { + content: "\e65d"; +} + +.icon-bumenguanli:before { + content: "\e61d"; +} + +.icon-jiaoseguanli:before { + content: "\e621"; +} + +.icon-xitong:before { + content: "\e601"; +} + +.icon-shouye:before { + content: "\e8b9"; +} + +.icon-guanyu:before { + content: "\e623"; +} + +.icon-DVLINK_daping:before { + content: "\e627"; +} + +.icon-weixin:before { + content: "\e656"; +} + +.icon-QQ:before { + content: "\e882"; +} + +.icon-contentright:before { + content: "\e67a"; +} + +.icon-zhuti:before { + content: "\e610"; +} + +.icon-sousuo:before { + content: "\e68a"; +} + +.icon-xiaoxi:before { + content: "\e8be"; +} + +.icon-zhongyingwen:before { + content: "\e605"; +} + +.icon-fangda:before { + content: "\e622"; +} + +.icon-suoxiao:before { + content: "\e62a"; +} + diff --git a/securityManagement/src/assets/iconfont/iconfont.js b/securityManagement/src/assets/iconfont/iconfont.js new file mode 100644 index 0000000..0e9170f --- /dev/null +++ b/securityManagement/src/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4036849='',function(h){var c=(c=document.getElementsByTagName("script"))[c.length-1],l=c.getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,i,t,v,z,o=function(c,l){l.parentNode.insertBefore(c,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4036849,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?o(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),a()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(t=a,v=h.document,z=!1,s(),v.onreadystatechange=function(){"complete"==v.readyState&&(v.onreadystatechange=null,p())})}function p(){z||(z=!0,t())}function s(){try{v.documentElement.doScroll("left")}catch(c){return void setTimeout(s,50)}p()}}(window); \ No newline at end of file diff --git a/securityManagement/src/assets/iconfont/iconfont.json b/securityManagement/src/assets/iconfont/iconfont.json new file mode 100644 index 0000000..182de05 --- /dev/null +++ b/securityManagement/src/assets/iconfont/iconfont.json @@ -0,0 +1,681 @@ +{ + "id": "4036849", + "name": "luozhun", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "8959587", + "name": "大小齿轮", + "font_class": "daxiaochilun", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "23875177", + "name": "全屏", + "font_class": "quanping", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "25840027", + "name": "搜索", + "font_class": "sousuo1", + "unicode": "e628", + "unicode_decimal": 58920 + }, + { + "icon_id": "29312195", + "name": "消息通知", + "font_class": "xiaoxitongzhi", + "unicode": "eaf8", + "unicode_decimal": 60152 + }, + { + "icon_id": "37425403", + "name": "退出全屏", + "font_class": "tuichuquanping", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "12188081", + "name": "添加", + "font_class": "tianjia", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "34882873", + "name": "编辑", + "font_class": "bianji1", + "unicode": "10117", + "unicode_decimal": 65815 + }, + { + "icon_id": "924384", + "name": "grid", + "font_class": "grid", + "unicode": "e8e4", + "unicode_decimal": 59620 + }, + { + "icon_id": "25944286", + "name": "ic_batch", + "font_class": "ic_batch", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "24473117", + "name": "删除", + "font_class": "shanchu", + "unicode": "fcb6", + "unicode_decimal": 64694 + }, + { + "icon_id": "7632835", + "name": "其他", + "font_class": "qita1", + "unicode": "e602", + "unicode_decimal": 58882 + }, + { + "icon_id": "11412028", + "name": "全部", + "font_class": "quanbu", + "unicode": "e745", + "unicode_decimal": 59205 + }, + { + "icon_id": "12085836", + "name": "音频", + "font_class": "yinpin", + "unicode": "e603", + "unicode_decimal": 58883 + }, + { + "icon_id": "15173237", + "name": "文档", + "font_class": "wendang", + "unicode": "e60e", + "unicode_decimal": 58894 + }, + { + "icon_id": "24110222", + "name": "图片", + "font_class": "tupian", + "unicode": "e606", + "unicode_decimal": 58886 + }, + { + "icon_id": "24111668", + "name": "视频", + "font_class": "shipin", + "unicode": "fb3c", + "unicode_decimal": 64316 + }, + { + "icon_id": "38945085", + "name": "041_文档", + "font_class": "a-041_wendang", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "2667175", + "name": "关联保安", + "font_class": "guanlianbaoan", + "unicode": "e600", + "unicode_decimal": 58880 + }, + { + "icon_id": "12156012", + "name": "保安消防", + "font_class": "baoanxiaofang", + "unicode": "e613", + "unicode_decimal": 58899 + }, + { + "icon_id": "7587762", + "name": "右箭头", + "font_class": "youjiantou", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "7587767", + "name": "左箭头", + "font_class": "zuojiantou", + "unicode": "e60d", + "unicode_decimal": 58893 + }, + { + "icon_id": "2234525", + "name": "铃铛", + "font_class": "lingdang", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "1301378", + "name": "文件夹", + "font_class": "wenjianjia", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "10333707", + "name": "菜单", + "font_class": "caidan1", + "unicode": "e626", + "unicode_decimal": 58918 + }, + { + "icon_id": "27157318", + "name": "按钮", + "font_class": "a-ziyuan4", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "6241686", + "name": "资产管理", + "font_class": "zichanguanli", + "unicode": "e62e", + "unicode_decimal": 58926 + }, + { + "icon_id": "18170419", + "name": "解除固定,图钉", + "font_class": "fix", + "unicode": "e9b9", + "unicode_decimal": 59833 + }, + { + "icon_id": "34198298", + "name": "文字大小2", + "font_class": "wenzidaxiao2", + "unicode": "e854", + "unicode_decimal": 59476 + }, + { + "icon_id": "35102495", + "name": "转移03", + "font_class": "zhuanyi03", + "unicode": "ea34", + "unicode_decimal": 59956 + }, + { + "icon_id": "591724", + "name": "wxb品牌宝", + "font_class": "wxbpinpaibao", + "unicode": "e620", + "unicode_decimal": 58912 + }, + { + "icon_id": "1680680", + "name": "产品库", + "font_class": "chanpinku", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "1964103", + "name": "供应商支付", + "font_class": "gongyingshangzhifu", + "unicode": "e618", + "unicode_decimal": 58904 + }, + { + "icon_id": "9874502", + "name": "KHCFDC_客户", + "font_class": "kehu", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "31313005", + "name": "进销存", + "font_class": "jinxiaocun", + "unicode": "e61f", + "unicode_decimal": 58911 + }, + { + "icon_id": "4657688", + "name": "项目管理", + "font_class": "xiangmuguanli-", + "unicode": "e609", + "unicode_decimal": 58889 + }, + { + "icon_id": "31260962", + "name": "exe", + "font_class": "exe", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "31260975", + "name": "mp4", + "font_class": "mp4", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "22325375", + "name": "主图视频", + "font_class": "zhutushipin", + "unicode": "e612", + "unicode_decimal": 58898 + }, + { + "icon_id": "19145266", + "name": "未知文件", + "font_class": "weizhiwenjian", + "unicode": "e61a", + "unicode_decimal": 58906 + }, + { + "icon_id": "6376407", + "name": "Jpg", + "font_class": "Jpg", + "unicode": "e731", + "unicode_decimal": 59185 + }, + { + "icon_id": "6376410", + "name": "Pdf", + "font_class": "Pdf", + "unicode": "e733", + "unicode_decimal": 59187 + }, + { + "icon_id": "6441713", + "name": "svg图标", + "font_class": "svgtubiao", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "6472244", + "name": "doc", + "font_class": "doc", + "unicode": "e735", + "unicode_decimal": 59189 + }, + { + "icon_id": "17290933", + "name": "gif", + "font_class": "gif", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "22007985", + "name": "JPEG", + "font_class": "JPEG", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "22008512", + "name": "DOCX", + "font_class": "DOCX", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "22008667", + "name": "XLS", + "font_class": "XLS", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "22008680", + "name": "XLSX", + "font_class": "XLSX", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "23182868", + "name": "PNG", + "font_class": "PNG", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "567560", + "name": "上传文件", + "font_class": "shangchuanwenjian", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "7594807", + "name": "24gl-folderPlus", + "font_class": "24gl-folderPlus", + "unicode": "eabe", + "unicode_decimal": 60094 + }, + { + "icon_id": "15816428", + "name": "019删除文件", + "font_class": "019shanchuwenjian", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "27438098", + "name": "下载文件", + "font_class": "xiazaiwenjian", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "406256", + "name": "私人文件夹", + "font_class": "3333", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "11472722", + "name": "事件查询-壹米滴答-01", + "font_class": "shijianchaxun-yimidida-", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "21193294", + "name": "文件", + "font_class": "wenjian", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "1137788", + "name": "系统", + "font_class": "xitong1", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "5650859", + "name": "单位", + "font_class": "danwei", + "unicode": "e611", + "unicode_decimal": 58897 + }, + { + "icon_id": "18167099", + "name": "警察半身,公安", + "font_class": "policeman-full", + "unicode": "e8f1", + "unicode_decimal": 59633 + }, + { + "icon_id": "3876471", + "name": "mysql", + "font_class": "mysql", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "3172487", + "name": "RabbitMQ", + "font_class": "RabbitMQ", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "18337193", + "name": "断路器", + "font_class": "duanluqi", + "unicode": "e60a", + "unicode_decimal": 58890 + }, + { + "icon_id": "29328030", + "name": "白名单", + "font_class": "baimingdan", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "10055646", + "name": "VPN网关", + "font_class": "VPNwangguan", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "1259944", + "name": "开发者中心", + "font_class": "kaifazhezhongxin", + "unicode": "e70f", + "unicode_decimal": 59151 + }, + { + "icon_id": "12975229", + "name": "控制台", + "font_class": "kongzhitai", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "18166606", + "name": "百度", + "font_class": "baidu", + "unicode": "e8cb", + "unicode_decimal": 59595 + }, + { + "icon_id": "34201231", + "name": "外部链接 ", + "font_class": "waibulianjie", + "unicode": "e858", + "unicode_decimal": 59480 + }, + { + "icon_id": "5434087", + "name": "字典管理", + "font_class": "zidianguanli", + "unicode": "e625", + "unicode_decimal": 58917 + }, + { + "icon_id": "4773266", + "name": "数据开发—脚本开发", + "font_class": "shujukaifajiaobenkaifa", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "5121534", + "name": "产品", + "font_class": "chanpin", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "11641886", + "name": "销售", + "font_class": "xiaoshou", + "unicode": "e624", + "unicode_decimal": 58916 + }, + { + "icon_id": "16398952", + "name": "测试", + "font_class": "ceshi", + "unicode": "e853", + "unicode_decimal": 59475 + }, + { + "icon_id": "34453374", + "name": "专属经理", + "font_class": "zhuanshujingli", + "unicode": "e883", + "unicode_decimal": 59523 + }, + { + "icon_id": "9592764", + "name": "公司", + "font_class": "gongsi", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "8225386", + "name": "系统权限", + "font_class": "xitongquanxian", + "unicode": "e61e", + "unicode_decimal": 58910 + }, + { + "icon_id": "6527123", + "name": "日志", + "font_class": "rizhi", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "12753449", + "name": "用户管理", + "font_class": "yonghuguanli_huaban", + "unicode": "e62d", + "unicode_decimal": 58925 + }, + { + "icon_id": "20853327", + "name": "定时任务", + "font_class": "dingshirenwu", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "4765881", + "name": "dashboard", + "font_class": "dashboard", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "5283349", + "name": "菜单", + "font_class": "caidan", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "6627737", + "name": "部门管理", + "font_class": "bumenguanli", + "unicode": "e61d", + "unicode_decimal": 58909 + }, + { + "icon_id": "7274106", + "name": "角色管理", + "font_class": "jiaoseguanli", + "unicode": "e621", + "unicode_decimal": 58913 + }, + { + "icon_id": "1119109", + "name": "系统", + "font_class": "xitong", + "unicode": "e601", + "unicode_decimal": 58881 + }, + { + "icon_id": "1727423", + "name": "204首页", + "font_class": "shouye", + "unicode": "e8b9", + "unicode_decimal": 59577 + }, + { + "icon_id": "11641882", + "name": "关于", + "font_class": "guanyu", + "unicode": "e623", + "unicode_decimal": 58915 + }, + { + "icon_id": "12769434", + "name": "DVLINK_大屏", + "font_class": "DVLINK_daping", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "318438", + "name": "weixin", + "font_class": "weixin", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "4936984", + "name": "QQ", + "font_class": "QQ", + "unicode": "e882", + "unicode_decimal": 59522 + }, + { + "icon_id": "128654", + "name": "content-right", + "font_class": "contentright", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "4608986", + "name": "主题", + "font_class": "zhuti", + "unicode": "e610", + "unicode_decimal": 58896 + }, + { + "icon_id": "10452247", + "name": "sousuo", + "font_class": "sousuo", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "11372726", + "name": "消息中心", + "font_class": "xiaoxi", + "unicode": "e8be", + "unicode_decimal": 59582 + }, + { + "icon_id": "7533292", + "name": "中英文", + "font_class": "zhongyingwen", + "unicode": "e605", + "unicode_decimal": 58885 + }, + { + "icon_id": "3278362", + "name": "放大", + "font_class": "fangda", + "unicode": "e622", + "unicode_decimal": 58914 + }, + { + "icon_id": "5698509", + "name": "全屏缩小", + "font_class": "suoxiao", + "unicode": "e62a", + "unicode_decimal": 58922 + } + ] +} diff --git a/securityManagement/src/assets/iconfont/iconfont.ttf b/securityManagement/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000..cc62999 Binary files /dev/null and b/securityManagement/src/assets/iconfont/iconfont.ttf differ diff --git a/securityManagement/src/assets/iconfont/iconfont.woff b/securityManagement/src/assets/iconfont/iconfont.woff new file mode 100644 index 0000000..5ed6e4a Binary files /dev/null and b/securityManagement/src/assets/iconfont/iconfont.woff differ diff --git a/securityManagement/src/assets/iconfont/iconfont.woff2 b/securityManagement/src/assets/iconfont/iconfont.woff2 new file mode 100644 index 0000000..6c40153 Binary files /dev/null and b/securityManagement/src/assets/iconfont/iconfont.woff2 differ diff --git a/securityManagement/src/assets/images/login/bg.jpg b/securityManagement/src/assets/images/login/bg.jpg new file mode 100644 index 0000000..6bbd1c7 Binary files /dev/null and b/securityManagement/src/assets/images/login/bg.jpg differ diff --git a/securityManagement/src/assets/scss/common.scss b/securityManagement/src/assets/scss/common.scss new file mode 100644 index 0000000..fc7d6cd --- /dev/null +++ b/securityManagement/src/assets/scss/common.scss @@ -0,0 +1,493 @@ +/* flex */ +.flex-center { + display: flex; + align-items: center; + justify-content: center; +} + +.flex-end { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.flex-justify-between { + display: flex; + align-items: center; + justify-content: space-between; +} + +.flex-align-center { + display: flex; + align-items: center; +} + +.flex-column-center { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.w-f { + width: 100%; +} + +.h-f { + height: 100%; +} + +.f-r { + float: right; +} + +.f-l { + float: left; +} + +/* clearfix */ +.clearfix::after { + display: block; + height: 0; + overflow: hidden; + clear: both; + content: ""; +} + +/* 文字单行省略号 */ +.sle { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 文字多行省略号 */ +.mle { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +/* 文字多了自动換行 */ +.break-word { + word-break: break-all; + word-wrap: break-word; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all 0.2s; +} + +.fade-transform-enter-from { + opacity: 0; + transition: all 0.2s; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transition: all 0.2s; + transform: translateX(30px); +} + +/* breadcrumb-transform */ +.breadcrumb-enter-active { + transition: all 0.2s; +} + +.breadcrumb-enter-from, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(10px); +} + +/* 外边距、内边距全局样式 */ +@for $i from 0 through 40 { + .mt#{$i} { + margin-top: #{$i}px !important; + } + .mr#{$i} { + margin-right: #{$i}px !important; + } + .mb#{$i} { + margin-bottom: #{$i}px !important; + } + .ml#{$i} { + margin-left: #{$i}px !important; + } + .pt#{$i} { + padding-top: #{$i}px !important; + } + .pr#{$i} { + padding-right: #{$i}px !important; + } + .pb#{$i} { + padding-bottom: #{$i}px !important; + } + .pl#{$i} { + padding-left: #{$i}px !important; + } +} + +/* -- 内外边距 -- */ + +.margin-0 { + margin: 0; +} + +.margin-xs { + margin: 5px; +} + +.margin-sm { + margin: 10px; +} + +.margin { + margin: 15px; +} + +.margin-lg { + margin: 20px; +} + +.margin-xl { + margin: 25px; +} + +.margin-top-xs { + margin-top: 5px; +} + +.margin-top-sm { + margin-top: 10px; +} + +.margin-top { + margin-top: 15px; +} + +.margin-top-lg { + margin-top: 20px; +} + +.margin-top-xl { + margin-top: 25px; +} + +.margin-right-xs { + margin-right: 5px; +} + +.margin-right-sm { + margin-right: 10px; +} + +.margin-right { + margin-right: 15px; +} + +.margin-right-lg { + margin-right: 20px; +} + +.margin-right-xl { + margin-right: 25px; +} + +.margin-bottom-xs { + margin-bottom: 5px; +} + +.margin-bottom-sm { + margin-bottom: 10px; +} + +.margin-bottom { + margin-bottom: 15px; +} + +.margin-bottom-lg { + margin-bottom: 20px; +} + +.margin-bottom-xl { + margin-bottom: 25px; +} + +.margin-left-xs { + margin-left: 5px; +} + +.margin-left-sm { + margin-left: 10px; +} + +.margin-left { + margin-left: 15px; +} + +.margin-left-lg { + margin-left: 20px; +} + +.margin-left-xl { + margin-left: 25px; +} + +.margin-lr-xs { + margin-left: 5px; + margin-right: 5px; +} + +.margin-lr-sm { + margin-left: 10px; + margin-right: 10px; +} + +.margin-lr { + margin-left: 15px; + margin-right: 15px; +} + +.margin-lr-lg { + margin-left: 20px; + margin-right: 20px; +} + +.margin-lr-xl { + margin-left: 25px; + margin-right: 25px; +} + +.margin-tb-xs { + margin-top: 5px; + margin-bottom: 5px; +} + +.margin-tb-sm { + margin-top: 10px; + margin-bottom: 10px; +} + +.margin-tb { + margin-top: 15px; + margin-bottom: 15px; +} + +.margin-tb-lg { + margin-top: 20px; + margin-bottom: 20px; +} + +.margin-tb-xl { + margin-top: 25px; + margin-bottom: 25px; +} + +.padding-0 { + padding: 0; +} + +.padding-xs { + padding: 5px; +} + +.padding-sm { + padding: 10px; +} + +.padding { + padding: 15px; +} + +.padding-lg { + padding: 20px; +} + +.padding-xl { + padding: 25px; +} + +.padding-top-xs { + padding-top: 5px; +} + +.padding-top-sm { + padding-top: 10px; +} + +.padding-top { + padding-top: 15px; +} + +.padding-top-lg { + padding-top: 20px; +} + +.padding-top-xl { + padding-top: 25px; +} + +.padding-right-xs { + padding-right: 5px; +} + +.padding-right-sm { + padding-right: 10px; +} + +.padding-right { + padding-right: 15px; +} + +.padding-right-lg { + padding-right: 20px; +} + +.padding-right-xl { + padding-right: 25px; +} + +.padding-bottom-xs { + padding-bottom: 5px; +} + +.padding-bottom-sm { + padding-bottom: 10px; +} + +.padding-bottom { + padding-bottom: 15px; +} + +.padding-bottom-lg { + padding-bottom: 20px; +} + +.padding-bottom-xl { + padding-bottom: 25px; +} + +.padding-left-xs { + padding-left: 5px; +} + +.padding-left-sm { + padding-left: 10px; +} + +.padding-left { + padding-left: 15px; +} + +.padding-left-lg { + padding-left: 20px; +} + +.padding-left-xl { + padding-left: 25px; +} + +.padding-lr-xs { + padding-left: 5px; + padding-right: 5px; +} + +.padding-lr-sm { + padding-left: 10px; + padding-right: 10px; +} + +.padding-lr { + padding-left: 15px; + padding-right: 15px; +} + +.padding-lr-lg { + padding-left: 20px; + padding-right: 20px; +} + +.padding-lr-xl { + padding-left: 25px; + padding-right: 25px; +} + +.padding-tb-xs { + padding-top: 5px; + padding-bottom: 5px; +} + +.padding-tb-sm { + padding-top: 10px; + padding-bottom: 10px; +} + +.padding-tb { + padding-top: 15px; + padding-bottom: 15px; +} + +.padding-tb-lg { + padding-top: 20px; + padding-bottom: 20px; +} + +.padding-tb-xl { + padding-top: 25px; + padding-bottom: 25px; +} + +/*高德地图去水印*/ +.amap-logo { + display: none !important; + visibility: hidden !important; +} + +.amap-copyright { + display: none !important; + visibility: hidden !important; +} + +/*高德地图去水印 结束*/ + +::-webkit-scrollbar { + width: 8px; + height: 12px; + background-color: #fff; +} + +/*浏览器滚动条样式*/ +::-webkit-scrollbar-thumb { + display: block; + min-height: 12px; + min-width: 8px; + border-radius: 6px; + background-color: rgb(217, 217, 217); +} + +::-webkit-scrollbar-thumb:hover { + display: block; + min-height: 12px; + min-width: 8px; + border-radius: 6px; + background-color: rgb(159, 159, 159); +} + +/*浏览器滚动条样式 结束*/ + +/* 鼠标悬浮手指 */ +.pointer { + cursor: pointer +} + +.border-table { + thead, th, td { + border: 1px solid black; + padding: 5px; + } +} \ No newline at end of file diff --git a/securityManagement/src/assets/scss/myAntD.scss b/securityManagement/src/assets/scss/myAntD.scss new file mode 100644 index 0000000..6062db6 --- /dev/null +++ b/securityManagement/src/assets/scss/myAntD.scss @@ -0,0 +1,163 @@ +/* 扩展ant design pro按钮组件颜色 */ +$--my-antd-important: !important; + +.btn-danger { + color: #ffffff; + background-color: #F5222D; + border-color: #F5222D; + + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #ff4d4f $--my-antd-important; + border-color: #ff4d4f $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #cf1322 $--my-antd-important; + border-color: #cf1322 $--my-antd-important; + } +} + +.btn-volcano { + color: #ffffff; + background-color: #FA541C; + border-color: #FA541C; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #ff7a45 $--my-antd-important; + border-color: #ff7a45 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #d4380d $--my-antd-important; + border-color: #d4380d $--my-antd-important; + } +} + +.btn-warn { + color: #ffffff; + background-color: #FAAD14; + border-color: #FAAD14; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #ffc53d $--my-antd-important; + border-color: #ffc53d $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #d48806 $--my-antd-important; + border-color: #d48806 $--my-antd-important; + } +} + +.btn-success { + color: #ffffff; + background-color: #52C41A; + border-color: #52C41A; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #73d13d $--my-antd-important; + border-color: #73d13d $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #389e0d $--my-antd-important; + border-color: #389e0d $--my-antd-important; + } +} + +.button-color-cyan { + color: #ffffff; + background-color: #13C2C2; + border-color: #13C2C2; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #36cfc9 $--my-antd-important; + border-color: #36cfc9 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #08979c $--my-antd-important; + border-color: #08979c $--my-antd-important; + } +} + +.btn-daybreak { + color: #ffffff; + background-color: #1890FF; + border-color: #1890FF; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #096dd9 $--my-antd-important; + border-color: #096dd9 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #40a9ff $--my-antd-important; + border-color: #40a9ff $--my-antd-important; + } +} + +.button-color-geekblue { + color: #ffffff; + background-color: #2F54EB; + border-color: #2F54EB; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #1d39c4 $--my-antd-important; + border-color: #1d39c4 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #597ef7 $--my-antd-important; + border-color: #597ef7 $--my-antd-important; + } +} + +.btn-purple { + color: #ffffff; + background-color: #722ED1; + border-color: #722ED1; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #9254de $--my-antd-important; + border-color: #9254de $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #531dab $--my-antd-important; + border-color: #531dab $--my-antd-important; + } +} + +.table-row-warn td { + background-color: #fefca6; +} + +.table-row-danger td { + background-color: #f79988; +} + +.table-row-success td { + background-color: #b6fcbe; +} + +.ant-table-summary td { + background: #edeff6; +} \ No newline at end of file diff --git a/securityManagement/src/assets/vue.svg b/securityManagement/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/securityManagement/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/securityManagement/src/axios/index.ts b/securityManagement/src/axios/index.ts new file mode 100644 index 0000000..e880ff3 --- /dev/null +++ b/securityManagement/src/axios/index.ts @@ -0,0 +1,85 @@ +import axios, {AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig} from "axios"; +import {message} from "ant-design-vue"; +import {useUserStore} from "@/stores/modules/userStore.ts"; +import router from "@/router"; + +export interface CustomAxiosRequestConfig extends AxiosRequestConfig { + //是否需要全屏禁用 + loading?: boolean, + loadingMessage?: string +} + +export interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig { + //是否需要全屏禁用 + loading?: boolean, + loadingMessage?: string +} + +const axiosConfig: AxiosRequestConfig = { + baseURL: __APP_ENV.VITE_APP_BASE_API, + timeout: __APP_ENV.VITE_APP_ENV === 'production' ? 10 * 1000 : 60 * 1000, + timeoutErrorMessage: "请求超时......" +}; + +class RequestHttp { + + service: AxiosInstance; + + constructor(config: AxiosRequestConfig) { + this.service = axios.create(config); + + this.service.interceptors.request.use((cfg: CustomInternalAxiosRequestConfig) => { + const userStore = useUserStore() + cfg.headers.set(userStore.getTokenInfo?.name as string, userStore.getTokenInfo?.value as string) + return cfg; + }, async (error) => { + message.error(error.message) + return Promise.reject(error); + }) + + this.service.interceptors.response.use(async (resp): Promise => { + const jsonResult: JsonResult = resp.data; + if (jsonResult && jsonResult.code != 200) { + //一些特定的错误需要重新登录 + if ([-1].includes(jsonResult.code)) { + //清除登录信息 + await useUserStore().resetUserInfo(); + //跳转登录页 + await router.push({ + path: '/login' + }) + } + message.error(jsonResult.message) + return Promise.reject(jsonResult); + } + return Promise.resolve(jsonResult); + }, (error) => { + message.error(error.message) + return Promise.reject(error); + }) + } + + /** + * 常用请求方法封装 + */ + get(url: string, params?: object, _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.get(url, {params, ..._object}); + } + + post(url: string, params?: object | object[], _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.post(url, params, _object); + } + + put(url: string, params?: object | object[], _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.put(url, params, _object); + } + + delete(url: string, params?: object, _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.delete(url, {params, ..._object}); + } + +} + +const api = new RequestHttp(axiosConfig); + +export default api diff --git a/securityManagement/src/components/HelloWorld.vue b/securityManagement/src/components/HelloWorld.vue new file mode 100644 index 0000000..b58e52b --- /dev/null +++ b/securityManagement/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/securityManagement/src/components/form/FormProMax.vue b/securityManagement/src/components/form/FormProMax.vue new file mode 100644 index 0000000..c4fb2c3 --- /dev/null +++ b/securityManagement/src/components/form/FormProMax.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/securityManagement/src/components/iconfont/IconFont.vue b/securityManagement/src/components/iconfont/IconFont.vue new file mode 100644 index 0000000..12dbb31 --- /dev/null +++ b/securityManagement/src/components/iconfont/IconFont.vue @@ -0,0 +1,20 @@ + + + + + diff --git a/securityManagement/src/components/layout/MenuItem.vue b/securityManagement/src/components/layout/MenuItem.vue new file mode 100644 index 0000000..0d928f6 --- /dev/null +++ b/securityManagement/src/components/layout/MenuItem.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/securityManagement/src/components/layout/SystemMenus.vue b/securityManagement/src/components/layout/SystemMenus.vue new file mode 100644 index 0000000..4e34340 --- /dev/null +++ b/securityManagement/src/components/layout/SystemMenus.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/securityManagement/src/components/layout/header/LayoutHeader.vue b/securityManagement/src/components/layout/header/LayoutHeader.vue new file mode 100644 index 0000000..0713b0c --- /dev/null +++ b/securityManagement/src/components/layout/header/LayoutHeader.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/securityManagement/src/components/layout/layout.vue b/securityManagement/src/components/layout/layout.vue new file mode 100644 index 0000000..682ed00 --- /dev/null +++ b/securityManagement/src/components/layout/layout.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/securityManagement/src/components/login/TelephoneLogin.vue b/securityManagement/src/components/login/TelephoneLogin.vue new file mode 100644 index 0000000..99a5d89 --- /dev/null +++ b/securityManagement/src/components/login/TelephoneLogin.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/securityManagement/src/components/table/TableProMax.vue b/securityManagement/src/components/table/TableProMax.vue new file mode 100644 index 0000000..75e0e94 --- /dev/null +++ b/securityManagement/src/components/table/TableProMax.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/securityManagement/src/components/tree/AdministrativeDivisionsTree.vue b/securityManagement/src/components/tree/AdministrativeDivisionsTree.vue new file mode 100644 index 0000000..73d42b3 --- /dev/null +++ b/securityManagement/src/components/tree/AdministrativeDivisionsTree.vue @@ -0,0 +1,63 @@ + + + diff --git a/securityManagement/src/components/upload/SingleImageFileUpload.vue b/securityManagement/src/components/upload/SingleImageFileUpload.vue new file mode 100644 index 0000000..c624052 --- /dev/null +++ b/securityManagement/src/components/upload/SingleImageFileUpload.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/securityManagement/src/config/dict.ts b/securityManagement/src/config/dict.ts new file mode 100644 index 0000000..01bd579 --- /dev/null +++ b/securityManagement/src/config/dict.ts @@ -0,0 +1,19 @@ +import api from "@/axios"; + +type DictType = + 'CheckStatus' + | 'DeleteFlag' + | 'IsEnable' + | 'IsOrNot' + | 'Sex' + | 'ServiceProjectType' + | 'MiniProgramUserIdentity' + +export const initEnums = () => { + api.get[]>>('/common/enums').then(resp => { + sessionStorage.setItem('dictMap', JSON.stringify(resp.data)) + }) +} + +export const dictSelectNodes = (enumType: DictType): SelectNodeVo[] => JSON.parse(sessionStorage.getItem('dictMap') as string)?.[enumType] || [] + diff --git a/securityManagement/src/config/index.ts b/securityManagement/src/config/index.ts new file mode 100644 index 0000000..2ab04cc --- /dev/null +++ b/securityManagement/src/config/index.ts @@ -0,0 +1,50 @@ +import {SystemMenu} from "@/types/config"; + +export const ROUTER_WHITE_LIST: string[] = ['/login', '/test', '/enterprise']; +export const CLIENT_TYPE: string = "MANAGEMENT_SECURITY"; + +export const UNIT_TYPE = { + security: 'SECURITY_UNIT', + police: 'POLICE_UNIT' +} +export const SYSTEM_MENUS: SystemMenu[] = [ + { + title: '首页', + name: 'index', + path: '/index', + icon: 'icon-shouye', + type: "menu", + component: () => import('@/views/index.vue') + }, { + title: '用户管理', + name: 'userManagement', + path: '/userManagement', + icon: 'icon-yonghuguanli_huaban', + type: 'dir', + children: [ + { + title: '后台管理', + name: 'bgManagement', + path: '/bgManagement', + icon:'icon-guanlianbaoan', + type: 'menu', + component: () => import('@/views/userManagement/bgManagement/index.vue') + }, { + title: '小程序管理', + name: 'uniManagement', + path: '/uniManagement', + icon:'icon-guanlianbaoan', + type: 'menu', + component: () => import('@/views/userManagement/uniManagement/index.vue') + } + ] + }, + { + title: '服务项目管理', + name: 'serviceManagement', + path: '/serviceManagement', + icon:'icon-xiangmuguanli-', + type: 'menu', + component: () => import('@/views/serviceManagement/index.vue') + } +] diff --git a/securityManagement/src/global.d.ts b/securityManagement/src/global.d.ts new file mode 100644 index 0000000..49d4b5b --- /dev/null +++ b/securityManagement/src/global.d.ts @@ -0,0 +1,82 @@ +declare const __APP_ENV: ImportMetaEnv; + +/** + * 全局返回 + */ +interface JsonResult { + code: number; + message: string; + data?: T; +} + +/** + * 选择 + */ +class SelectNodeVo> { + value: T; + label: string; + options?: SelectNodeVo[] + orderIndex?: number; + disabled?: boolean; + extData?: E +} + +/** + * 树 + */ +class TreeNodeVo> { + value: T; + parentValue: T; + label: string; + orderIndex?: number; + children?: TreeNodeVo[] + extData?: E; +} + +/** + * 栅格布局 + */ +declare interface Grid { + //栅格占据的列数 + span?: number; + //栅格左侧的间隔格数 + offset?: number; + //栅格向右移动格数 + push?: number; + //栅格向左移动格数 + pull?: number; + //<768px 响应式栅格数或者栅格属性对象 + xs?: number; + //≥768px 响应式栅格数或者栅格属性对象 + sm?: number; + //≥992px 响应式栅格数或者栅格属性对象 + md?: number; + //≥1200px 响应式栅格数或者栅格属性对象 + lg?: number; + //≥1920px 响应式栅格数或者栅格属性对象 + xl?: number; +} + +interface BaseEnum { + value: T; + label: string +} + +interface TypeEnum { + value: string; + label: string +} +interface dataStatus { + account: string; + password: string; + remark: string; + checkStatus: { + extData: { + color: string; + }; + label: string; + value: number; + }; +} + + diff --git a/securityManagement/src/hooks/useTableProMax.ts b/securityManagement/src/hooks/useTableProMax.ts new file mode 100644 index 0000000..360f18e --- /dev/null +++ b/securityManagement/src/hooks/useTableProMax.ts @@ -0,0 +1,134 @@ +import {ref, Ref} from "vue"; +import {Page, PageParams, PageResult} from "@/types/hooks/useTableProMax.ts"; +import {FormInstance} from "ant-design-vue"; +import {BaseTableRowRecord, RequestApiType} from "@/types/components/table"; + +/** + * + * @param api 查询方法 + * @param searchFormRef 表单校验 + * @param searchParams 查询的参数 + * @param isPageTable 是否分页 + * @param dataCallBack 查询到数据后的回调 + * @param requestError 查询出错回调 + */ +export default | PageParams

>(api: RequestApiType, + searchFormRef: Ref, + searchParams: Ref

, + isPageTable: boolean = true, + dataCallBack?: (data: T[]) => T[], + requestError?: (errorMsg: any) => void) => { + + const dataSource = ref([]) as Ref; + const loading = ref(false); + const pageParams = ref({ + current: 1, + size: 10, + total: 0 + }) + + /** + * 获取表格数据 + */ + const requestGetTableData = async (isInit: boolean = false) => { + try { + //校验表单 + !isInit && await searchFormRef.value?.validate(); + //组装参数 + let totalSearchParams; + if (isPageTable) { + totalSearchParams = { + params: searchParams.value, + page: { + current: pageParams.value.current, + size: pageParams.value.size + } + } as PageParams

; + } else { + totalSearchParams = searchParams.value + } + + loading.value = true; + + const resp = await api(totalSearchParams as P); + let tableData: T[]; + + if (isPageTable) { + const {current, records, size, total} = resp.data as PageResult; + isPageTable && updatePageParams({ + current: parseInt(current), + size: parseInt(size), + total: parseInt(total) + }); + tableData = records; + } else { + tableData = resp.data as T[] + } + dataCallBack && (tableData = dataCallBack(tableData)); + dataSource.value = tableData; + } catch (error) { + requestError && requestError(error); + } finally { + loading.value = false; + } + } + + /** + * 更新分页信息 + */ + const updatePageParams = (ps: Page) => Object.assign(pageParams.value, ps) + + /** + * 重置表格状态 包括 dataSource loading pageParams + */ + const resetState = () => { + dataSource.value = []; + loading.value = false; + pageParams.value = { + current: 1, + size: 10, + total: 0 + } + } + + /** + * 表格数据查询 与 requestGetTableData 区别是会将页面重置为1 + * 如果只做刷新数据请用 requestGetTableData + */ + const search = async () => { + pageParams.value.current = 1; + await requestGetTableData(); + }; + + /** + * @description 每页条数改变 + * @param _ + * @param {Number} size 页显示数量 + */ + const handleSizeChange = async (_: number, size: number) => { + pageParams.value.current = 1; + pageParams.value.size = size; + await requestGetTableData(); + }; + + /** + * @description 当前页改变 + * @param current 当前页 + */ + const handleCurrentChange = async (current: number) => { + pageParams.value.current = current; + await requestGetTableData(); + }; + + return { + dataSource, + loading, + pageParams, + requestGetTableData, + search, + handleSizeChange, + handleCurrentChange, + resetState + }; + +} diff --git a/securityManagement/src/index.css b/securityManagement/src/index.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/securityManagement/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/securityManagement/src/main.ts b/securityManagement/src/main.ts new file mode 100644 index 0000000..a2ab554 --- /dev/null +++ b/securityManagement/src/main.ts @@ -0,0 +1,24 @@ +import {createApp} from 'vue' +import App from '@/App.vue' +import '@/reset.css' +import './index.css' + +// iconfont css +import "@/assets/iconfont/iconfont.css"; +// 公共样式 +import '@/assets/scss/common.scss' +import '@/assets/scss/myAntD.scss' +// vue Router +import router from "@/router"; +// pinia stores +import pinia from "@/stores"; +import {initEnums} from "@/config/dict.ts"; + +initEnums() +const vueApp = createApp(App); + + +vueApp + .use(router) + .use(pinia) + .mount('#app') diff --git a/securityManagement/src/reset.css b/securityManagement/src/reset.css new file mode 100644 index 0000000..76d99ae --- /dev/null +++ b/securityManagement/src/reset.css @@ -0,0 +1,57 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/securityManagement/src/router/index.ts b/securityManagement/src/router/index.ts new file mode 100644 index 0000000..85aacfc --- /dev/null +++ b/securityManagement/src/router/index.ts @@ -0,0 +1,45 @@ +import {createRouter, createWebHistory} from "vue-router"; +import {staticRouter} from "@/router/staticRouters.ts"; +import {message, Modal} from "ant-design-vue"; +import {useUserStore} from "@/stores/modules/userStore.ts"; +import {ROUTER_WHITE_LIST} from "@/config"; + +/** + * createWebHistory & createWebHashHistory + * createWebHistory: 路径不带#号,但需要后端进行配置(如nginx配置:try_files $uri $uri/ /index.html last;) + * createWebHashHistory: 路径带#号 这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理,影响SEO + */ +const router = createRouter({ + history: createWebHistory('/securityManagement/'), + routes: [...staticRouter], + strict: false, + scrollBehavior: () => ({left: 0, top: 0}) +}); + +router.beforeEach(async (to, from, next) => { + Modal.destroyAll(); + //判断访问的是不是登录页 + const userStore = useUserStore(); + if (to.path.toLocaleLowerCase() === '/login' && userStore.getTokenInfo?.value) { + //如果已登录 且访问login页面 直接返回当前页面 + await message.warn('当前已登录,请先退出账号'); + return next(from.fullPath) + } + //判断访问路径是不是白名单d + if (ROUTER_WHITE_LIST.includes(to.path)) { + return next(); + } + // 不在白名单内需要查看是否携带token 没有token需要返回登录页进行登录 + if (!userStore.getTokenInfo?.value) { + await message.warn('未找到token,请重新登陆!') + return next('/enterprise'); + } + //放行 + return next(); +}) + +router.onError(error => { + console.error("路由错误", error.message); +}) + +export default router diff --git a/securityManagement/src/router/staticRouters.ts b/securityManagement/src/router/staticRouters.ts new file mode 100644 index 0000000..8b53ef5 --- /dev/null +++ b/securityManagement/src/router/staticRouters.ts @@ -0,0 +1,59 @@ +import {RouteRecordRaw} from "vue-router"; +import {SYSTEM_MENUS} from "@/config"; +import {SystemMenu} from "@/types/config"; + +/** + * 提取菜单路由 + */ +const extractMenuToRouter = (): RouteRecordRaw[] => { + const result: RouteRecordRaw[] = [] + const traverse = (data: SystemMenu[]) => { + data.forEach(item => { + if (item.type === 'dir' && item.children && item.children.length > 0) { + traverse(item.children) + } else { + result.push({ + path: item.path, + name: item.name, + meta: { + title: item.title + }, + component: item.component + } as RouteRecordRaw) + } + }) + } + + traverse(SYSTEM_MENUS) + + return result; +} + +export const staticRouter: RouteRecordRaw[] = [ + { + path: '/login', + name: 'login', + meta: { + title: '登录', + }, + component: () => import("@/views/login.vue"), + }, { + path: "/", + redirect: '/index', + }, { + path: '/layout', + name: 'layout', + redirect: '/index', + component: () => import("@/components/layout/layout.vue"), + children: extractMenuToRouter() + }, { + path: '/test', + name: 'test', + component: () => import("@/views/test.vue"), + }, + { + path: '/enterprise', + name: 'enterprise', + component: () => import("@/views/enterprise.vue"), + }, +] diff --git a/securityManagement/src/stores/index.ts b/securityManagement/src/stores/index.ts new file mode 100644 index 0000000..87b1acc --- /dev/null +++ b/securityManagement/src/stores/index.ts @@ -0,0 +1,8 @@ +import {createPinia} from "pinia"; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' + +//创建store实例 持久化插件 +const pinia = createPinia(); +pinia.use(piniaPluginPersistedstate); + +export default pinia; diff --git a/securityManagement/src/stores/modules/userStore.ts b/securityManagement/src/stores/modules/userStore.ts new file mode 100644 index 0000000..bdd8060 --- /dev/null +++ b/securityManagement/src/stores/modules/userStore.ts @@ -0,0 +1,27 @@ +import {defineStore} from "pinia"; +import {TokenInfo, UserStore} from "@/types/stores/userStore.ts"; + +export const useUserStore = defineStore({ + id: 'useUserStore', + state: (): UserStore => { + return { + tokenInfo: undefined, + } + }, + actions: { + saveTokenInfo(tokenInfo: TokenInfo) { + this.tokenInfo = tokenInfo + }, + async resetUserInfo() { + this.tokenInfo = undefined; + }, + }, + getters: { + getTokenInfo: (state): TokenInfo => state.tokenInfo as TokenInfo, + }, + persist: { + key: "useUserStore", + storage: window.localStorage, + paths: ["tokenInfo"], + } +}) diff --git a/securityManagement/src/types/components/form/index.ts b/securityManagement/src/types/components/form/index.ts new file mode 100644 index 0000000..f2ad150 --- /dev/null +++ b/securityManagement/src/types/components/form/index.ts @@ -0,0 +1,75 @@ +import { + FormProps, + RangePicker, + Input, + InputNumber, + Textarea, + InputPassword, + RadioGroup, + Select, + TreeSelect, + Cascader, + CheckboxGroup, + DatePicker, + FormItem, TimeRangePicker, TimePicker, +} from "ant-design-vue"; +import {Ref, UnwrapRef, VNode} from "vue"; +import {ComponentProps} from "vue-component-type-helpers"; + +type FormProMaxItemType = + | 'custom' + | 'input' + | 'inputPassword' + | 'inputNumber' + | 'inputTextArea' + | 'radioGroup' + | 'select' + | 'selectIcon' + | 'selectUser' + | 'treeSelect' + | 'cascader' + | 'checkboxGroup' + | 'datePicker' + | 'rangePicker' + | 'timeRangePicker' + | 'timePicker' + | 'administrativeDivisionsTree'; + +interface FormProMaxItemCommonProps extends ComponentProps { + label?: string, + grid?: Grid, + placeholder?: string, + remarkRender?: () => VNode | string, + customRender?: () => VNode; + options?: (SelectNodeVo | TreeNodeVo) [] | Ref<(SelectNodeVo | TreeNodeVo)[]> +} + +export interface FormProMaxItemProps extends FormProMaxItemCommonProps { + type: T + componentsProps?: C +} + +export type FormProMaxItemOptions = { + [key in keyof T | string]: + FormProMaxItemProps<'custom', ComponentProps>> + | FormProMaxItemProps<'input', ComponentProps> + | FormProMaxItemProps<'inputPassword', ComponentProps> + | FormProMaxItemProps<'inputNumber', ComponentProps> + | FormProMaxItemProps<'inputTextArea', ComponentProps> + | FormProMaxItemProps<'radioGroup', ComponentProps> + | FormProMaxItemProps<'select', ComponentProps> + | FormProMaxItemProps<'treeSelect', ComponentProps> + | FormProMaxItemProps<'cascader', ComponentProps> + | FormProMaxItemProps<'checkboxGroup', ComponentProps> + | FormProMaxItemProps<'datePicker', ComponentProps> + | FormProMaxItemProps<'rangePicker', ComponentProps> + | FormProMaxItemProps<'timeRangePicker', ComponentProps> + | FormProMaxItemProps<'timePicker', ComponentProps> + | FormProMaxItemProps<'administrativeDivisionsTree', ComponentProps>> +} + +export interface FormProMaxProps extends FormProps { + grid?: Grid + gutter?: number; + formItemOptions?: FormProMaxItemOptions | Ref> | UnwrapRef> +} diff --git a/securityManagement/src/types/components/iconfont/IconFont.ts b/securityManagement/src/types/components/iconfont/IconFont.ts new file mode 100644 index 0000000..9b3dd6e --- /dev/null +++ b/securityManagement/src/types/components/iconfont/IconFont.ts @@ -0,0 +1,5 @@ +export interface IconFontProps { + fontClass?: string, + size?: number, + type?: 'class' | 'svg' +} \ No newline at end of file diff --git a/securityManagement/src/types/components/table/index.ts b/securityManagement/src/types/components/table/index.ts new file mode 100644 index 0000000..20c3793 --- /dev/null +++ b/securityManagement/src/types/components/table/index.ts @@ -0,0 +1,55 @@ +import {PaginationProps, Table, TableProps} from "ant-design-vue"; +import {TableRowSelection} from "ant-design-vue/lib/table/interface"; +import {Ref, UnwrapRef} from "vue"; +import {ColumnType} from "ant-design-vue/es/table/interface"; +import {ComponentSlots} from "vue-component-type-helpers"; +import {FormProMaxItemOptions, FormProMaxProps} from "@/types/components/form"; +import {PageParams, PageResult} from "@/types/hooks/useTableProMax.ts"; + + +export type TableProMaxColumnType = Omit, 'dataIndex'> & { + dataIndex: keyof T | string | string[] | number | number[]; +} + + +export type TableProMaxProps< + T extends BaseTableRowRecord = {}, + P extends { [key: string]: any } = {} +> = Partial, "dataSource" | 'pagination' | 'loading' | 'rowKey' | 'columns'>> & { + rowKey?: keyof T, + columns?: TableProMaxColumnType[], + searchFormProps?: Omit, 'formItems'> + searchFormOptions?: FormProMaxItemOptions

| Ref> | UnwrapRef>, + defaultSearchParams?: { [key in keyof P | string]: any }; + requestAuto?: boolean, + requestApi: RequestApiType, + requestError?: (errorMsg: any) => void, + dataCallback?: (data: T[]) => T[], + isPagination?: boolean, + paginationProps?: TableProMaxPaginationProps, + isSelection?: boolean, + selectionProps?: TableProMaxRowSelect, + isPrinter?: boolean, + needIndex?: boolean +} + +export type TableProMaxSlots = ComponentSlots & { + tableHeader: (scope: { selectKeys: string[], selectRows: T[] }) => any, + tableHeaderRight: (scope: { selectKeys: string[], selectRows: T[] }) => any, +} + +export type RequestApiType = (params: P | PageParams

) => Promise>>; + +export type TableProMaxPaginationProps = Partial>; + +export type TableProMaxRowSelect = TableRowSelection; + +export interface BaseTableRowRecord { + snowFlakeId?: string; + createUserName?: string; + createTime?: Date | string; + updateUserName?: string; + updateTime?: Date | string +} diff --git a/securityManagement/src/types/config/index.ts b/securityManagement/src/types/config/index.ts new file mode 100644 index 0000000..05d2b12 --- /dev/null +++ b/securityManagement/src/types/config/index.ts @@ -0,0 +1,13 @@ +import {RouteComponent} from "vue-router"; + +export interface SystemMenu { + type: 'dir' | 'menu'; + title: string; + path: string; + name: string; + icon?: string; + + component?: RouteComponent; + children?: SystemMenu[]; +} + diff --git a/securityManagement/src/types/hooks/useTableProMax.ts b/securityManagement/src/types/hooks/useTableProMax.ts new file mode 100644 index 0000000..3989828 --- /dev/null +++ b/securityManagement/src/types/hooks/useTableProMax.ts @@ -0,0 +1,26 @@ +/** + * 分页对象 + */ +export interface Page { + current: number, + size: number, + total: number +} + +/** + * 分页参数 + */ +export interface PageParams = {}> { + params: T & { [key: string]: any }, + page: Omit +} + +/** + * 分页结果 + */ +export interface PageResult { + current: string, + records: T[], + size: string, + total: string +} \ No newline at end of file diff --git a/securityManagement/src/types/stores/userStore.ts b/securityManagement/src/types/stores/userStore.ts new file mode 100644 index 0000000..c99c873 --- /dev/null +++ b/securityManagement/src/types/stores/userStore.ts @@ -0,0 +1,10 @@ + +export interface TokenInfo { + name: string; + value: string; +} +export interface UserStore { + tokenInfo?: TokenInfo; +} + + diff --git a/securityManagement/src/types/views/bgManagement.ts b/securityManagement/src/types/views/bgManagement.ts new file mode 100644 index 0000000..8c0b28d --- /dev/null +++ b/securityManagement/src/types/views/bgManagement.ts @@ -0,0 +1,32 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface BgManagementPagerQueryParams extends BaseTableRowRecord{ + /** 名称 **/ + name?: string; + /** 社会编码 **/ + socialCode?: string; + /** 行政区划编码 **/ + administrativeDivisionCodes?: string[]; + /** 是否启用 **/ + isEnable?: BaseEnum; + /** 审核状态 **/ + checkStatus?: BaseEnum; + /** 账号 **/ + account?:string, + sex?:BaseEnum, + telephone?:string, + createTime?:string, + snowFlakeId?:string, + remark?:string, + isAdmin?:BaseEnum +} + +export interface FromItem { + snowFlakeId?: string, + name: string, + sex: number, + telephone: string, + isEnable: BaseEnum, + remark?: string, +} + diff --git a/securityManagement/src/types/views/enterprise.ts b/securityManagement/src/types/views/enterprise.ts new file mode 100644 index 0000000..8268b20 --- /dev/null +++ b/securityManagement/src/types/views/enterprise.ts @@ -0,0 +1,15 @@ +export interface formDatePort { + name:string, + socialCode:string, + businessLicense:string, + legalPersonInfo:string, + telephone:string, + administrativeDivisionCodes:string, + address:string, + nature:string +} + +export interface statusPort { + onlyCode:string, + unitOptType:string +} \ No newline at end of file diff --git a/securityManagement/src/types/views/login.ts b/securityManagement/src/types/views/login.ts new file mode 100644 index 0000000..b2e1d24 --- /dev/null +++ b/securityManagement/src/types/views/login.ts @@ -0,0 +1,4 @@ +export interface LoginParams { + telephone: string; + password: string; +} diff --git a/securityManagement/src/types/views/serviceManagement.ts b/securityManagement/src/types/views/serviceManagement.ts new file mode 100644 index 0000000..285a344 --- /dev/null +++ b/securityManagement/src/types/views/serviceManagement.ts @@ -0,0 +1,25 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface serviceProjectSaveOrUpdateParams extends BaseTableRowRecord { + snowFlakeId: string + enterprisesUnitId: string, + enterprisesUnitName: string, + projectManagerMiniProgramUserId: string, + projectManagerMiniProgramUserName: string, + name: string, + type: TypeEnum, + isRecruitSecurity: BaseEnum, + idNumber: string, + serviceArea: number, + buildingTotal: number, + houseTotal: number, + staffTotal: number, + securityUserTotal: number, + remark: string, + createUserName: string, + createTime: string, + enterprisesUnitAdministrativeDivisionCodes:Record +} + + + diff --git a/securityManagement/src/utils/index.ts b/securityManagement/src/utils/index.ts new file mode 100644 index 0000000..257081a --- /dev/null +++ b/securityManagement/src/utils/index.ts @@ -0,0 +1,17 @@ +import {ceil, divide} from "lodash-es"; + +/** + * 将文件大小转为字符串格式 + * @param fileSizeInBytes + */ +export const convertFileSizeToStr = (fileSizeInBytes: number): string => { + if (fileSizeInBytes < 1024) { + return fileSizeInBytes + "B"; + } else if (fileSizeInBytes < 1024 * 1024) { + return (ceil(divide(fileSizeInBytes, 1024), 2)) + "KB"; + } else if (fileSizeInBytes < 1024 * 1024 * 1024) { + return (ceil(divide(fileSizeInBytes, (1024 * 1024)), 2)) + "MB"; + } else { + return (ceil(divide(fileSizeInBytes, (1024 * 1024 * 1024)), 2)) + "GB"; + } +} diff --git a/securityManagement/src/utils/minioUtil.ts b/securityManagement/src/utils/minioUtil.ts new file mode 100644 index 0000000..6b4e91f --- /dev/null +++ b/securityManagement/src/utils/minioUtil.ts @@ -0,0 +1,26 @@ +import api from "@/axios"; +import dayjs from "dayjs"; +import {uuid} from "vue-uuid"; + +/** + * 生成一个简单的对象文件地址 + * @param fileName 原始文件名 + * @param parentDir 上级目录 + */ +export const generateSimpleObjectName = (fileName: string, parentDir?: String): string => { + let objectName = parentDir + dayjs().format('/YYYY/MM/DD/') + uuid.v4().replace(/-/g, ''); + if (fileName && fileName.length > 0) { + objectName += fileName.substring(fileName.lastIndexOf('.')) + } + return objectName; +} + +/** + * 获取生成预签名的 URL + */ +export const getResignedObjectUrl = async (bucketName: string, objectName: string): Promise => { + return (await api.get('/common/getResignedObjectUrl', { + bucketName, + objectName + })).data as string; +} diff --git a/securityManagement/src/utils/rsaUtil.ts b/securityManagement/src/utils/rsaUtil.ts new file mode 100644 index 0000000..935502b --- /dev/null +++ b/securityManagement/src/utils/rsaUtil.ts @@ -0,0 +1,16 @@ +import {JSEncrypt} from "jsencrypt"; + +const rsa = new JSEncrypt() +rsa.setPublicKey(__APP_ENV.VITE_APP_RSA_PUBLIC_KEY) + +const encryptStr = (text: string): string => { + const r = rsa.encrypt(text); + if (!r) { + throw "加密失败"; + } + return r; +} + +export default { + encryptStr +} diff --git a/securityManagement/src/views/enterprise.vue b/securityManagement/src/views/enterprise.vue new file mode 100644 index 0000000..cdd702a --- /dev/null +++ b/securityManagement/src/views/enterprise.vue @@ -0,0 +1,260 @@ + + + + diff --git a/securityManagement/src/views/index.vue b/securityManagement/src/views/index.vue new file mode 100644 index 0000000..0948109 --- /dev/null +++ b/securityManagement/src/views/index.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/securityManagement/src/views/login.vue b/securityManagement/src/views/login.vue new file mode 100644 index 0000000..b2cabb2 --- /dev/null +++ b/securityManagement/src/views/login.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/securityManagement/src/views/serviceManagement/index.vue b/securityManagement/src/views/serviceManagement/index.vue new file mode 100644 index 0000000..1d7523e --- /dev/null +++ b/securityManagement/src/views/serviceManagement/index.vue @@ -0,0 +1,442 @@ + + + + + + diff --git a/securityManagement/src/views/test.vue b/securityManagement/src/views/test.vue new file mode 100644 index 0000000..7898fe3 --- /dev/null +++ b/securityManagement/src/views/test.vue @@ -0,0 +1,114 @@ + + + + + + diff --git a/securityManagement/src/views/userManagement/bgManagement/index.vue b/securityManagement/src/views/userManagement/bgManagement/index.vue new file mode 100644 index 0000000..b7feee4 --- /dev/null +++ b/securityManagement/src/views/userManagement/bgManagement/index.vue @@ -0,0 +1,244 @@ + + + + + + diff --git a/securityManagement/src/views/userManagement/uniManagement/index.vue b/securityManagement/src/views/userManagement/uniManagement/index.vue new file mode 100644 index 0000000..5551883 --- /dev/null +++ b/securityManagement/src/views/userManagement/uniManagement/index.vue @@ -0,0 +1,246 @@ + + + + + + diff --git a/securityManagement/src/vite-env.d.ts b/securityManagement/src/vite-env.d.ts new file mode 100644 index 0000000..eb53e48 --- /dev/null +++ b/securityManagement/src/vite-env.d.ts @@ -0,0 +1,20 @@ +/// +interface ImportMetaEnv { + // 项目名称 + readonly VITE_APP_NAME: string; + // 当前环境 + readonly VITE_APP_ENV: 'development' | 'production'; + // 启动端口 + readonly VITE_APP_PORT: number; + + // axios + readonly VITE_APP_BASE_API: string; + readonly VITE_APP_PROXY_URL: string; + + // minio + readonly VITE_APP_MINIO_URL: string + readonly VITE_APP_MINIO_BUCKET: string + + // RSA公钥 + readonly VITE_APP_RSA_PUBLIC_KEY: string; +} diff --git a/securityManagement/tailwind.config.js b/securityManagement/tailwind.config.js new file mode 100644 index 0000000..5eef83c --- /dev/null +++ b/securityManagement/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} + diff --git a/securityManagement/tsconfig.app.json b/securityManagement/tsconfig.app.json new file mode 100644 index 0000000..3dc5512 --- /dev/null +++ b/securityManagement/tsconfig.app.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "vue", + /* Linting */ + "strict": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": "./", + /* 配置别名 */ + "paths": { + "@/*": [ + "src/*" + ] + }, + "allowSyntheticDefaultImports": true + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue" + ] +} \ No newline at end of file diff --git a/securityManagement/tsconfig.json b/securityManagement/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/securityManagement/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/securityManagement/tsconfig.node.json b/securityManagement/tsconfig.node.json new file mode 100644 index 0000000..8aeefc6 --- /dev/null +++ b/securityManagement/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2023" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + /* Linting */ + "strict": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/securityManagement/vite.config.ts b/securityManagement/vite.config.ts new file mode 100644 index 0000000..c23ff1e --- /dev/null +++ b/securityManagement/vite.config.ts @@ -0,0 +1,83 @@ +import {defineConfig, loadEnv} from 'vite' +import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite'; +import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers'; +import * as path from "node:path"; +import vueJsx from '@vitejs/plugin-vue-jsx' + +const pathSrc = path.resolve(__dirname, 'src'); + +// https://vitejs.dev/config/ +export default defineConfig(({mode}) => { + const env: Record = loadEnv(mode, process.cwd(), '') + return { + define: { + __APP_ENV: JSON.stringify(env) + }, + base: '/securityManagement/', + plugins: [ + vue(), + vueJsx(), + Components({ + resolvers: [ + AntDesignVueResolver({importStyle: false}) + ] + }) + ], + resolve: { + alias: { + '@': pathSrc, + } + }, + server: { + host: '0.0.0.0', + port: parseInt(env['VITE_APP_PORT']), + open: false, + proxy: { + [env["VITE_APP_BASE_API"]]: { + target: env["VITE_APP_PROXY_URL"], + changeOrigin: true, + secure: false, + rewrite: path => path.replace(RegExp(`^${env['VITE_APP_BASE_API']}`), '') + } + } + }, + build: { + outDir: 'securityManagement', + target: 'modules', + chunkSizeWarningLimit: 1500, + minify: 'terser', + terserOptions: { + compress: { + //生产环境时移除console + drop_console: env['VITE_DROP_CONSOLE'] as unknown as boolean, + drop_debugger: env['VITE_DROP_CONSOLE'] as unknown as boolean, + }, + format: { + //删除注释 + comments: false + } + }, + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + return id + .toString() + .split('node_modules/')[1] + .split('/')[0] + .toString(); + } + }, + chunkFileNames(chunkInfo) { + const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : []; + const fileName = + facadeModuleId[facadeModuleId.length - 2] || '[name]'; + return `js/${fileName}/[name].[hash].js`; + } + } + } + }, + } + +}) diff --git a/superManagement/.env.development b/superManagement/.env.development new file mode 100644 index 0000000..024b5f7 --- /dev/null +++ b/superManagement/.env.development @@ -0,0 +1,21 @@ +VITE_APP_NAME=超级后台 +VITE_APP_ENV=development +VITE_APP_PORT=1000 +VITE_DROP_CONSOLE=false +VITE_APP_MODULE_NAME=superManagement + +# axios +VITE_APP_BASE_API=/api +VITE_APP_PROXY_URL=http://172.10.10.93:8765 + +# rsa 公钥 +VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJps/EXxxSpEM1Ix4R0NWIOBciHCr7P7coDT8tNKfelgR7txcJOqHCO/MIWe7T04aHQTcpQxqx9hMca7dbqz8TZpz9jvLzE/6ZonVKxHsoFnNlHMp1/CPAJ9f6D9wYicum2KltJkmQ0g//D9W2zPCYoGOmSRFcZx/KEBa4EM53jQIDAQAB + +# minio +VITE_APP_MINIO_URL=http://118.253.177.137:9000 +VITE_APP_MINIO_BUCKET=police-security-dev + +# 高德 +VITE_APP_GAODE_KEY=f379a3f860a68d7438526275d6a94b05 +VITE_APP_GAODE_VERSION=2.0 +VITE_APP_SECURITY_JS_CODE=432125a0f8d8cad2dac38b77d6f6728f diff --git a/superManagement/.env.production b/superManagement/.env.production new file mode 100644 index 0000000..3104a00 --- /dev/null +++ b/superManagement/.env.production @@ -0,0 +1,21 @@ +VITE_APP_NAME=超级后台 +VITE_APP_ENV=production +VITE_APP_PORT=1001 +VITE_DROP_CONSOLE=true +VITE_APP_MODULE_NAME=superManagement + +# axios +VITE_APP_BASE_API=/api +VITE_APP_PROXY_URL=http://118.253.177.137:8765 + +# rsa 公钥 +VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpu1C3JHZ+Ng/eVVCZtwKsOZv9RktpAL13pKy4FoRHyNv2t8TPV2AMzLzfEzlWx001nBxyVxEMR2N9jAcqFLHv7r16ciOzbtzB9dky2G+bc9jIs4/EdVK5bAZcPRh5Jrb78sC9PHyR4AeceDyCIKHLUbWBJB4NTZE0s1Wh5kMynQIDAQAB + +# minio +VITE_APP_MINIO_URL=https://www.hnjinglian.cn:9002 +VITE_APP_MINIO_BUCKET=police-security + +# 高德 +VITE_APP_GAODE_KEY=f379a3f860a68d7438526275d6a94b05 +VITE_APP_GAODE_VERSION=2.0 +VITE_APP_SECURITY_JS_CODE=432125a0f8d8cad2dac38b77d6f6728f diff --git a/superManagement/.gitignore b/superManagement/.gitignore new file mode 100644 index 0000000..10079ed --- /dev/null +++ b/superManagement/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +superManagement +dist-ssr +*.local + +# Editor directories and files +.vscode/* +.vscode +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +components.d.ts +package-lock.json +yarn.lock diff --git a/superManagement/Jenkinsfile b/superManagement/Jenkinsfile new file mode 100644 index 0000000..701910b --- /dev/null +++ b/superManagement/Jenkinsfile @@ -0,0 +1,46 @@ +pipeline { + agent any + tools { + nodejs "node-v20.10.0" + } + stages { + stage('拉取代码') { + steps { + echo '开始拉取代码' + checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: '3', url: 'http://175.6.124.250:3100/luozhun/policeSecurity.git']]) + echo '代码拉取成功' + } + } + stage('构建前端项目') { + steps{ + echo '开始构建前端项目' + sh 'cd /var/jenkins_home/workspace/警保联动-超级后台/superManagement && npm install --registry=https://registry.npmmirror.com && npm run build' + echo '前端项目构建完成' + } + } + stage('ssh远程推送代码'){ + steps{ + echo '开始推送构建产物' + script{ + def remote = [:] + remote.name = 'server-118.253.177.137' + remote.host = '118.253.177.137' + remote.port = 55555 + remote.allowAnyHosts = true + withCredentials([usernamePassword(credentialsId: '4', passwordVariable: 'password', usernameVariable: 'username')]) { + remote.user = "${username}" + remote.password = "${password}" + } + sshCommand remote: remote, command: 'pwd=$(pwd) echo "ssh连接成功!当前工作目录:$(pwd)"' + sshCommand remote: remote, command: 'echo "删除:superManagement..."' + sshRemove remote: remote, path: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index/superManagement' + sshCommand remote: remote, command: 'echo "删除:superManagement成功!"' + + sshCommand remote: remote, command: 'echo "将构建的superManagement发送到服务器..."' + sshPut remote: remote, from: '/var/jenkins_home/workspace/警保联动-超级后台/superManagement/superManagement', into: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index' + sshCommand remote: remote, command: 'echo "superManagement发送成功!"' + } + } + } + } +} diff --git a/superManagement/README.md b/superManagement/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/superManagement/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + 超级后台 + + +

+ + + diff --git a/superManagement/package.json b/superManagement/package.json new file mode 100644 index 0000000..882b02e --- /dev/null +++ b/superManagement/package.json @@ -0,0 +1,39 @@ +{ + "name": "supermanagement", + "appName": "超级后台", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build --mode production", + "preview": "vite preview" + }, + "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", + "@vueuse/core": "^11.0.3", + "ant-design-vue": "^4.2.3", + "axios": "^1.7.5", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "pinia": "^2.2.2", + "pinia-plugin-persistedstate": "^3.2.0", + "sass": "^1.77.8", + "vue": "^3.4.37", + "vue-component-type-helpers": "^2.1.2", + "vue-router": "4", + "vue-uuid": "^3.0.0" + }, + "devDependencies": { + "@amap/amap-jsapi-types": "^0.0.15", + "@types/lodash-es": "^4.17.8", + "@types/node": "^22.5.1", + "@vitejs/plugin-vue": "^5.1.2", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "terser": "^5.36.0", + "typescript": "^5.5.3", + "unplugin-vue-components": "^0.27.4", + "vite": "^5.4.1", + "vue-tsc": "^2.0.29" + } +} diff --git a/superManagement/public/vite.svg b/superManagement/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/superManagement/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/superManagement/src/App.vue b/superManagement/src/App.vue new file mode 100644 index 0000000..e4f5ec4 --- /dev/null +++ b/superManagement/src/App.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/superManagement/src/assets/iconfont/demo.css b/superManagement/src/assets/iconfont/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/superManagement/src/assets/iconfont/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/superManagement/src/assets/iconfont/demo_index.html b/superManagement/src/assets/iconfont/demo_index.html new file mode 100644 index 0000000..c8a01b0 --- /dev/null +++ b/superManagement/src/assets/iconfont/demo_index.html @@ -0,0 +1,2396 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    大小齿轮
    +
    &#xe6d0;
    +
  • + +
  • + +
    全屏
    +
    &#xe67d;
    +
  • + +
  • + +
    搜索
    +
    &#xe628;
    +
  • + +
  • + +
    消息通知
    +
    &#xeaf8;
    +
  • + +
  • + +
    退出全屏
    +
    &#xe6db;
    +
  • + +
  • + +
    添加
    +
    &#xe695;
    +
  • + +
  • + 𐄗 +
    编辑
    +
    &#x10117;
    +
  • + +
  • + +
    grid
    +
    &#xe8e4;
    +
  • + +
  • + +
    ic_batch
    +
    &#xe739;
    +
  • + +
  • + +
    删除
    +
    &#xfcb6;
    +
  • + +
  • + +
    其他
    +
    &#xe602;
    +
  • + +
  • + +
    全部
    +
    &#xe745;
    +
  • + +
  • + +
    音频
    +
    &#xe603;
    +
  • + +
  • + +
    文档
    +
    &#xe60e;
    +
  • + +
  • + +
    图片
    +
    &#xe606;
    +
  • + +
  • + +
    视频
    +
    &#xfb3c;
    +
  • + +
  • + +
    041_文档
    +
    &#xe6da;
    +
  • + +
  • + +
    关联保安
    +
    &#xe600;
    +
  • + +
  • + +
    保安消防
    +
    &#xe613;
    +
  • + +
  • + +
    右箭头
    +
    &#xe60c;
    +
  • + +
  • + +
    左箭头
    +
    &#xe60d;
    +
  • + +
  • + +
    铃铛
    +
    &#xe649;
    +
  • + +
  • + +
    文件夹
    +
    &#xe662;
    +
  • + +
  • + +
    菜单
    +
    &#xe626;
    +
  • + +
  • + +
    按钮
    +
    &#xe669;
    +
  • + +
  • + +
    资产管理
    +
    &#xe62e;
    +
  • + +
  • + +
    解除固定,图钉
    +
    &#xe9b9;
    +
  • + +
  • + +
    文字大小2
    +
    &#xe854;
    +
  • + +
  • + +
    转移03
    +
    &#xea34;
    +
  • + +
  • + +
    wxb品牌宝
    +
    &#xe620;
    +
  • + +
  • + +
    产品库
    +
    &#xe65f;
    +
  • + +
  • + +
    供应商支付
    +
    &#xe618;
    +
  • + +
  • + +
    KHCFDC_客户
    +
    &#xe6d2;
    +
  • + +
  • + +
    进销存
    +
    &#xe61f;
    +
  • + +
  • + +
    项目管理
    +
    &#xe609;
    +
  • + +
  • + +
    exe
    +
    &#xe63a;
    +
  • + +
  • + +
    mp4
    +
    &#xe639;
    +
  • + +
  • + +
    主图视频
    +
    &#xe612;
    +
  • + +
  • + +
    未知文件
    +
    &#xe61a;
    +
  • + +
  • + +
    Jpg
    +
    &#xe731;
    +
  • + +
  • + +
    Pdf
    +
    &#xe733;
    +
  • + +
  • + +
    svg图标
    +
    &#xe650;
    +
  • + +
  • + +
    doc
    +
    &#xe735;
    +
  • + +
  • + +
    gif
    +
    &#xe6a4;
    +
  • + +
  • + +
    JPEG
    +
    &#xe66d;
    +
  • + +
  • + +
    DOCX
    +
    &#xe672;
    +
  • + +
  • + +
    XLS
    +
    &#xe673;
    +
  • + +
  • + +
    XLSX
    +
    &#xe674;
    +
  • + +
  • + +
    PNG
    +
    &#xe69f;
    +
  • + +
  • + +
    上传文件
    +
    &#xe652;
    +
  • + +
  • + +
    24gl-folderPlus
    +
    &#xeabe;
    +
  • + +
  • + +
    019删除文件
    +
    &#xe7e5;
    +
  • + +
  • + +
    下载文件
    +
    &#xe615;
    +
  • + +
  • + +
    私人文件夹
    +
    &#xe680;
    +
  • + +
  • + +
    事件查询-壹米滴答-01
    +
    &#xe64d;
    +
  • + +
  • + +
    文件
    +
    &#xe62b;
    +
  • + +
  • + +
    系统
    +
    &#xe67c;
    +
  • + +
  • + +
    单位
    +
    &#xe611;
    +
  • + +
  • + +
    警察半身,公安
    +
    &#xe8f1;
    +
  • + +
  • + +
    mysql
    +
    &#xe667;
    +
  • + +
  • + +
    RabbitMQ
    +
    &#xe6a0;
    +
  • + +
  • + +
    断路器
    +
    &#xe60a;
    +
  • + +
  • + +
    白名单
    +
    &#xe643;
    +
  • + +
  • + +
    VPN网关
    +
    &#xe7da;
    +
  • + +
  • + +
    开发者中心
    +
    &#xe70f;
    +
  • + +
  • + +
    控制台
    +
    &#xe651;
    +
  • + +
  • + +
    百度
    +
    &#xe8cb;
    +
  • + +
  • + +
    外部链接
    +
    &#xe858;
    +
  • + +
  • + +
    字典管理
    +
    &#xe625;
    +
  • + +
  • + +
    数据开发—脚本开发
    +
    &#xe65c;
    +
  • + +
  • + +
    产品
    +
    &#xe64f;
    +
  • + +
  • + +
    销售
    +
    &#xe624;
    +
  • + +
  • + +
    测试
    +
    &#xe853;
    +
  • + +
  • + +
    专属经理
    +
    &#xe883;
    +
  • + +
  • + +
    公司
    +
    &#xe679;
    +
  • + +
  • + +
    系统权限
    +
    &#xe61e;
    +
  • + +
  • + +
    日志
    +
    &#xe647;
    +
  • + +
  • + +
    用户管理
    +
    &#xe62d;
    +
  • + +
  • + +
    定时任务
    +
    &#xe6a3;
    +
  • + +
  • + +
    dashboard
    +
    &#xe78b;
    +
  • + +
  • + +
    菜单
    +
    &#xe65d;
    +
  • + +
  • + +
    部门管理
    +
    &#xe61d;
    +
  • + +
  • + +
    角色管理
    +
    &#xe621;
    +
  • + +
  • + +
    系统
    +
    &#xe601;
    +
  • + +
  • + +
    204首页
    +
    &#xe8b9;
    +
  • + +
  • + +
    关于
    +
    &#xe623;
    +
  • + +
  • + +
    DVLINK_大屏
    +
    &#xe627;
    +
  • + +
  • + +
    weixin
    +
    &#xe656;
    +
  • + +
  • + +
    QQ
    +
    &#xe882;
    +
  • + +
  • + +
    content-right
    +
    &#xe67a;
    +
  • + +
  • + +
    主题
    +
    &#xe610;
    +
  • + +
  • + +
    sousuo
    +
    &#xe68a;
    +
  • + +
  • + +
    消息中心
    +
    &#xe8be;
    +
  • + +
  • + +
    中英文
    +
    &#xe605;
    +
  • + +
  • + +
    放大
    +
    &#xe622;
    +
  • + +
  • + +
    全屏缩小
    +
    &#xe62a;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1723194854588') format('woff2'),
+       url('iconfont.woff?t=1723194854588') format('woff'),
+       url('iconfont.ttf?t=1723194854588') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 大小齿轮 +
    +
    .icon-daxiaochilun +
    +
  • + +
  • + +
    + 全屏 +
    +
    .icon-quanping +
    +
  • + +
  • + +
    + 搜索 +
    +
    .icon-sousuo1 +
    +
  • + +
  • + +
    + 消息通知 +
    +
    .icon-xiaoxitongzhi +
    +
  • + +
  • + +
    + 退出全屏 +
    +
    .icon-tuichuquanping +
    +
  • + +
  • + +
    + 添加 +
    +
    .icon-tianjia +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-bianji1 +
    +
  • + +
  • + +
    + grid +
    +
    .icon-grid +
    +
  • + +
  • + +
    + ic_batch +
    +
    .icon-ic_batch +
    +
  • + +
  • + +
    + 删除 +
    +
    .icon-shanchu +
    +
  • + +
  • + +
    + 其他 +
    +
    .icon-qita1 +
    +
  • + +
  • + +
    + 全部 +
    +
    .icon-quanbu +
    +
  • + +
  • + +
    + 音频 +
    +
    .icon-yinpin +
    +
  • + +
  • + +
    + 文档 +
    +
    .icon-wendang +
    +
  • + +
  • + +
    + 图片 +
    +
    .icon-tupian +
    +
  • + +
  • + +
    + 视频 +
    +
    .icon-shipin +
    +
  • + +
  • + +
    + 041_文档 +
    +
    .icon-a-041_wendang +
    +
  • + +
  • + +
    + 关联保安 +
    +
    .icon-guanlianbaoan +
    +
  • + +
  • + +
    + 保安消防 +
    +
    .icon-baoanxiaofang +
    +
  • + +
  • + +
    + 右箭头 +
    +
    .icon-youjiantou +
    +
  • + +
  • + +
    + 左箭头 +
    +
    .icon-zuojiantou +
    +
  • + +
  • + +
    + 铃铛 +
    +
    .icon-lingdang +
    +
  • + +
  • + +
    + 文件夹 +
    +
    .icon-wenjianjia +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-caidan1 +
    +
  • + +
  • + +
    + 按钮 +
    +
    .icon-a-ziyuan4 +
    +
  • + +
  • + +
    + 资产管理 +
    +
    .icon-zichanguanli +
    +
  • + +
  • + +
    + 解除固定,图钉 +
    +
    .icon-fix +
    +
  • + +
  • + +
    + 文字大小2 +
    +
    .icon-wenzidaxiao2 +
    +
  • + +
  • + +
    + 转移03 +
    +
    .icon-zhuanyi03 +
    +
  • + +
  • + +
    + wxb品牌宝 +
    +
    .icon-wxbpinpaibao +
    +
  • + +
  • + +
    + 产品库 +
    +
    .icon-chanpinku +
    +
  • + +
  • + +
    + 供应商支付 +
    +
    .icon-gongyingshangzhifu +
    +
  • + +
  • + +
    + KHCFDC_客户 +
    +
    .icon-kehu +
    +
  • + +
  • + +
    + 进销存 +
    +
    .icon-jinxiaocun +
    +
  • + +
  • + +
    + 项目管理 +
    +
    .icon-xiangmuguanli- +
    +
  • + +
  • + +
    + exe +
    +
    .icon-exe +
    +
  • + +
  • + +
    + mp4 +
    +
    .icon-mp4 +
    +
  • + +
  • + +
    + 主图视频 +
    +
    .icon-zhutushipin +
    +
  • + +
  • + +
    + 未知文件 +
    +
    .icon-weizhiwenjian +
    +
  • + +
  • + +
    + Jpg +
    +
    .icon-Jpg +
    +
  • + +
  • + +
    + Pdf +
    +
    .icon-Pdf +
    +
  • + +
  • + +
    + svg图标 +
    +
    .icon-svgtubiao +
    +
  • + +
  • + +
    + doc +
    +
    .icon-doc +
    +
  • + +
  • + +
    + gif +
    +
    .icon-gif +
    +
  • + +
  • + +
    + JPEG +
    +
    .icon-JPEG +
    +
  • + +
  • + +
    + DOCX +
    +
    .icon-DOCX +
    +
  • + +
  • + +
    + XLS +
    +
    .icon-XLS +
    +
  • + +
  • + +
    + XLSX +
    +
    .icon-XLSX +
    +
  • + +
  • + +
    + PNG +
    +
    .icon-PNG +
    +
  • + +
  • + +
    + 上传文件 +
    +
    .icon-shangchuanwenjian +
    +
  • + +
  • + +
    + 24gl-folderPlus +
    +
    .icon-24gl-folderPlus +
    +
  • + +
  • + +
    + 019删除文件 +
    +
    .icon-019shanchuwenjian +
    +
  • + +
  • + +
    + 下载文件 +
    +
    .icon-xiazaiwenjian +
    +
  • + +
  • + +
    + 私人文件夹 +
    +
    .icon-3333 +
    +
  • + +
  • + +
    + 事件查询-壹米滴答-01 +
    +
    .icon-shijianchaxun-yimidida- +
    +
  • + +
  • + +
    + 文件 +
    +
    .icon-wenjian +
    +
  • + +
  • + +
    + 系统 +
    +
    .icon-xitong1 +
    +
  • + +
  • + +
    + 单位 +
    +
    .icon-danwei +
    +
  • + +
  • + +
    + 警察半身,公安 +
    +
    .icon-policeman-full +
    +
  • + +
  • + +
    + mysql +
    +
    .icon-mysql +
    +
  • + +
  • + +
    + RabbitMQ +
    +
    .icon-RabbitMQ +
    +
  • + +
  • + +
    + 断路器 +
    +
    .icon-duanluqi +
    +
  • + +
  • + +
    + 白名单 +
    +
    .icon-baimingdan +
    +
  • + +
  • + +
    + VPN网关 +
    +
    .icon-VPNwangguan +
    +
  • + +
  • + +
    + 开发者中心 +
    +
    .icon-kaifazhezhongxin +
    +
  • + +
  • + +
    + 控制台 +
    +
    .icon-kongzhitai +
    +
  • + +
  • + +
    + 百度 +
    +
    .icon-baidu +
    +
  • + +
  • + +
    + 外部链接 +
    +
    .icon-waibulianjie +
    +
  • + +
  • + +
    + 字典管理 +
    +
    .icon-zidianguanli +
    +
  • + +
  • + +
    + 数据开发—脚本开发 +
    +
    .icon-shujukaifajiaobenkaifa +
    +
  • + +
  • + +
    + 产品 +
    +
    .icon-chanpin +
    +
  • + +
  • + +
    + 销售 +
    +
    .icon-xiaoshou +
    +
  • + +
  • + +
    + 测试 +
    +
    .icon-ceshi +
    +
  • + +
  • + +
    + 专属经理 +
    +
    .icon-zhuanshujingli +
    +
  • + +
  • + +
    + 公司 +
    +
    .icon-gongsi +
    +
  • + +
  • + +
    + 系统权限 +
    +
    .icon-xitongquanxian +
    +
  • + +
  • + +
    + 日志 +
    +
    .icon-rizhi +
    +
  • + +
  • + +
    + 用户管理 +
    +
    .icon-yonghuguanli_huaban +
    +
  • + +
  • + +
    + 定时任务 +
    +
    .icon-dingshirenwu +
    +
  • + +
  • + +
    + dashboard +
    +
    .icon-dashboard +
    +
  • + +
  • + +
    + 菜单 +
    +
    .icon-caidan +
    +
  • + +
  • + +
    + 部门管理 +
    +
    .icon-bumenguanli +
    +
  • + +
  • + +
    + 角色管理 +
    +
    .icon-jiaoseguanli +
    +
  • + +
  • + +
    + 系统 +
    +
    .icon-xitong +
    +
  • + +
  • + +
    + 204首页 +
    +
    .icon-shouye +
    +
  • + +
  • + +
    + 关于 +
    +
    .icon-guanyu +
    +
  • + +
  • + +
    + DVLINK_大屏 +
    +
    .icon-DVLINK_daping +
    +
  • + +
  • + +
    + weixin +
    +
    .icon-weixin +
    +
  • + +
  • + +
    + QQ +
    +
    .icon-QQ +
    +
  • + +
  • + +
    + content-right +
    +
    .icon-contentright +
    +
  • + +
  • + +
    + 主题 +
    +
    .icon-zhuti +
    +
  • + +
  • + +
    + sousuo +
    +
    .icon-sousuo +
    +
  • + +
  • + +
    + 消息中心 +
    +
    .icon-xiaoxi +
    +
  • + +
  • + +
    + 中英文 +
    +
    .icon-zhongyingwen +
    +
  • + +
  • + +
    + 放大 +
    +
    .icon-fangda +
    +
  • + +
  • + +
    + 全屏缩小 +
    +
    .icon-suoxiao +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    大小齿轮
    +
    #icon-daxiaochilun
    +
  • + +
  • + +
    全屏
    +
    #icon-quanping
    +
  • + +
  • + +
    搜索
    +
    #icon-sousuo1
    +
  • + +
  • + +
    消息通知
    +
    #icon-xiaoxitongzhi
    +
  • + +
  • + +
    退出全屏
    +
    #icon-tuichuquanping
    +
  • + +
  • + +
    添加
    +
    #icon-tianjia
    +
  • + +
  • + +
    编辑
    +
    #icon-bianji1
    +
  • + +
  • + +
    grid
    +
    #icon-grid
    +
  • + +
  • + +
    ic_batch
    +
    #icon-ic_batch
    +
  • + +
  • + +
    删除
    +
    #icon-shanchu
    +
  • + +
  • + +
    其他
    +
    #icon-qita1
    +
  • + +
  • + +
    全部
    +
    #icon-quanbu
    +
  • + +
  • + +
    音频
    +
    #icon-yinpin
    +
  • + +
  • + +
    文档
    +
    #icon-wendang
    +
  • + +
  • + +
    图片
    +
    #icon-tupian
    +
  • + +
  • + +
    视频
    +
    #icon-shipin
    +
  • + +
  • + +
    041_文档
    +
    #icon-a-041_wendang
    +
  • + +
  • + +
    关联保安
    +
    #icon-guanlianbaoan
    +
  • + +
  • + +
    保安消防
    +
    #icon-baoanxiaofang
    +
  • + +
  • + +
    右箭头
    +
    #icon-youjiantou
    +
  • + +
  • + +
    左箭头
    +
    #icon-zuojiantou
    +
  • + +
  • + +
    铃铛
    +
    #icon-lingdang
    +
  • + +
  • + +
    文件夹
    +
    #icon-wenjianjia
    +
  • + +
  • + +
    菜单
    +
    #icon-caidan1
    +
  • + +
  • + +
    按钮
    +
    #icon-a-ziyuan4
    +
  • + +
  • + +
    资产管理
    +
    #icon-zichanguanli
    +
  • + +
  • + +
    解除固定,图钉
    +
    #icon-fix
    +
  • + +
  • + +
    文字大小2
    +
    #icon-wenzidaxiao2
    +
  • + +
  • + +
    转移03
    +
    #icon-zhuanyi03
    +
  • + +
  • + +
    wxb品牌宝
    +
    #icon-wxbpinpaibao
    +
  • + +
  • + +
    产品库
    +
    #icon-chanpinku
    +
  • + +
  • + +
    供应商支付
    +
    #icon-gongyingshangzhifu
    +
  • + +
  • + +
    KHCFDC_客户
    +
    #icon-kehu
    +
  • + +
  • + +
    进销存
    +
    #icon-jinxiaocun
    +
  • + +
  • + +
    项目管理
    +
    #icon-xiangmuguanli-
    +
  • + +
  • + +
    exe
    +
    #icon-exe
    +
  • + +
  • + +
    mp4
    +
    #icon-mp4
    +
  • + +
  • + +
    主图视频
    +
    #icon-zhutushipin
    +
  • + +
  • + +
    未知文件
    +
    #icon-weizhiwenjian
    +
  • + +
  • + +
    Jpg
    +
    #icon-Jpg
    +
  • + +
  • + +
    Pdf
    +
    #icon-Pdf
    +
  • + +
  • + +
    svg图标
    +
    #icon-svgtubiao
    +
  • + +
  • + +
    doc
    +
    #icon-doc
    +
  • + +
  • + +
    gif
    +
    #icon-gif
    +
  • + +
  • + +
    JPEG
    +
    #icon-JPEG
    +
  • + +
  • + +
    DOCX
    +
    #icon-DOCX
    +
  • + +
  • + +
    XLS
    +
    #icon-XLS
    +
  • + +
  • + +
    XLSX
    +
    #icon-XLSX
    +
  • + +
  • + +
    PNG
    +
    #icon-PNG
    +
  • + +
  • + +
    上传文件
    +
    #icon-shangchuanwenjian
    +
  • + +
  • + +
    24gl-folderPlus
    +
    #icon-24gl-folderPlus
    +
  • + +
  • + +
    019删除文件
    +
    #icon-019shanchuwenjian
    +
  • + +
  • + +
    下载文件
    +
    #icon-xiazaiwenjian
    +
  • + +
  • + +
    私人文件夹
    +
    #icon-3333
    +
  • + +
  • + +
    事件查询-壹米滴答-01
    +
    #icon-shijianchaxun-yimidida-
    +
  • + +
  • + +
    文件
    +
    #icon-wenjian
    +
  • + +
  • + +
    系统
    +
    #icon-xitong1
    +
  • + +
  • + +
    单位
    +
    #icon-danwei
    +
  • + +
  • + +
    警察半身,公安
    +
    #icon-policeman-full
    +
  • + +
  • + +
    mysql
    +
    #icon-mysql
    +
  • + +
  • + +
    RabbitMQ
    +
    #icon-RabbitMQ
    +
  • + +
  • + +
    断路器
    +
    #icon-duanluqi
    +
  • + +
  • + +
    白名单
    +
    #icon-baimingdan
    +
  • + +
  • + +
    VPN网关
    +
    #icon-VPNwangguan
    +
  • + +
  • + +
    开发者中心
    +
    #icon-kaifazhezhongxin
    +
  • + +
  • + +
    控制台
    +
    #icon-kongzhitai
    +
  • + +
  • + +
    百度
    +
    #icon-baidu
    +
  • + +
  • + +
    外部链接
    +
    #icon-waibulianjie
    +
  • + +
  • + +
    字典管理
    +
    #icon-zidianguanli
    +
  • + +
  • + +
    数据开发—脚本开发
    +
    #icon-shujukaifajiaobenkaifa
    +
  • + +
  • + +
    产品
    +
    #icon-chanpin
    +
  • + +
  • + +
    销售
    +
    #icon-xiaoshou
    +
  • + +
  • + +
    测试
    +
    #icon-ceshi
    +
  • + +
  • + +
    专属经理
    +
    #icon-zhuanshujingli
    +
  • + +
  • + +
    公司
    +
    #icon-gongsi
    +
  • + +
  • + +
    系统权限
    +
    #icon-xitongquanxian
    +
  • + +
  • + +
    日志
    +
    #icon-rizhi
    +
  • + +
  • + +
    用户管理
    +
    #icon-yonghuguanli_huaban
    +
  • + +
  • + +
    定时任务
    +
    #icon-dingshirenwu
    +
  • + +
  • + +
    dashboard
    +
    #icon-dashboard
    +
  • + +
  • + +
    菜单
    +
    #icon-caidan
    +
  • + +
  • + +
    部门管理
    +
    #icon-bumenguanli
    +
  • + +
  • + +
    角色管理
    +
    #icon-jiaoseguanli
    +
  • + +
  • + +
    系统
    +
    #icon-xitong
    +
  • + +
  • + +
    204首页
    +
    #icon-shouye
    +
  • + +
  • + +
    关于
    +
    #icon-guanyu
    +
  • + +
  • + +
    DVLINK_大屏
    +
    #icon-DVLINK_daping
    +
  • + +
  • + +
    weixin
    +
    #icon-weixin
    +
  • + +
  • + +
    QQ
    +
    #icon-QQ
    +
  • + +
  • + +
    content-right
    +
    #icon-contentright
    +
  • + +
  • + +
    主题
    +
    #icon-zhuti
    +
  • + +
  • + +
    sousuo
    +
    #icon-sousuo
    +
  • + +
  • + +
    消息中心
    +
    #icon-xiaoxi
    +
  • + +
  • + +
    中英文
    +
    #icon-zhongyingwen
    +
  • + +
  • + +
    放大
    +
    #icon-fangda
    +
  • + +
  • + +
    全屏缩小
    +
    #icon-suoxiao
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/superManagement/src/assets/iconfont/download.zip b/superManagement/src/assets/iconfont/download.zip new file mode 100644 index 0000000..c6fadbe Binary files /dev/null and b/superManagement/src/assets/iconfont/download.zip differ diff --git a/superManagement/src/assets/iconfont/iconfont.css b/superManagement/src/assets/iconfont/iconfont.css new file mode 100644 index 0000000..81a7063 --- /dev/null +++ b/superManagement/src/assets/iconfont/iconfont.css @@ -0,0 +1,399 @@ +@font-face { + font-family: "iconfont"; /* Project id 4036849 */ + src: url('iconfont.woff2?t=1723194854588') format('woff2'), + url('iconfont.woff?t=1723194854588') format('woff'), + url('iconfont.ttf?t=1723194854588') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-daxiaochilun:before { + content: "\e6d0"; +} + +.icon-quanping:before { + content: "\e67d"; +} + +.icon-sousuo1:before { + content: "\e628"; +} + +.icon-xiaoxitongzhi:before { + content: "\eaf8"; +} + +.icon-tuichuquanping:before { + content: "\e6db"; +} + +.icon-tianjia:before { + content: "\e695"; +} + +.icon-bianji1:before { + content: "\10117"; +} + +.icon-grid:before { + content: "\e8e4"; +} + +.icon-ic_batch:before { + content: "\e739"; +} + +.icon-shanchu:before { + content: "\fcb6"; +} + +.icon-qita1:before { + content: "\e602"; +} + +.icon-quanbu:before { + content: "\e745"; +} + +.icon-yinpin:before { + content: "\e603"; +} + +.icon-wendang:before { + content: "\e60e"; +} + +.icon-tupian:before { + content: "\e606"; +} + +.icon-shipin:before { + content: "\fb3c"; +} + +.icon-a-041_wendang:before { + content: "\e6da"; +} + +.icon-guanlianbaoan:before { + content: "\e600"; +} + +.icon-baoanxiaofang:before { + content: "\e613"; +} + +.icon-youjiantou:before { + content: "\e60c"; +} + +.icon-zuojiantou:before { + content: "\e60d"; +} + +.icon-lingdang:before { + content: "\e649"; +} + +.icon-wenjianjia:before { + content: "\e662"; +} + +.icon-caidan1:before { + content: "\e626"; +} + +.icon-a-ziyuan4:before { + content: "\e669"; +} + +.icon-zichanguanli:before { + content: "\e62e"; +} + +.icon-fix:before { + content: "\e9b9"; +} + +.icon-wenzidaxiao2:before { + content: "\e854"; +} + +.icon-zhuanyi03:before { + content: "\ea34"; +} + +.icon-wxbpinpaibao:before { + content: "\e620"; +} + +.icon-chanpinku:before { + content: "\e65f"; +} + +.icon-gongyingshangzhifu:before { + content: "\e618"; +} + +.icon-kehu:before { + content: "\e6d2"; +} + +.icon-jinxiaocun:before { + content: "\e61f"; +} + +.icon-xiangmuguanli-:before { + content: "\e609"; +} + +.icon-exe:before { + content: "\e63a"; +} + +.icon-mp4:before { + content: "\e639"; +} + +.icon-zhutushipin:before { + content: "\e612"; +} + +.icon-weizhiwenjian:before { + content: "\e61a"; +} + +.icon-Jpg:before { + content: "\e731"; +} + +.icon-Pdf:before { + content: "\e733"; +} + +.icon-svgtubiao:before { + content: "\e650"; +} + +.icon-doc:before { + content: "\e735"; +} + +.icon-gif:before { + content: "\e6a4"; +} + +.icon-JPEG:before { + content: "\e66d"; +} + +.icon-DOCX:before { + content: "\e672"; +} + +.icon-XLS:before { + content: "\e673"; +} + +.icon-XLSX:before { + content: "\e674"; +} + +.icon-PNG:before { + content: "\e69f"; +} + +.icon-shangchuanwenjian:before { + content: "\e652"; +} + +.icon-24gl-folderPlus:before { + content: "\eabe"; +} + +.icon-019shanchuwenjian:before { + content: "\e7e5"; +} + +.icon-xiazaiwenjian:before { + content: "\e615"; +} + +.icon-3333:before { + content: "\e680"; +} + +.icon-shijianchaxun-yimidida-:before { + content: "\e64d"; +} + +.icon-wenjian:before { + content: "\e62b"; +} + +.icon-xitong1:before { + content: "\e67c"; +} + +.icon-danwei:before { + content: "\e611"; +} + +.icon-policeman-full:before { + content: "\e8f1"; +} + +.icon-mysql:before { + content: "\e667"; +} + +.icon-RabbitMQ:before { + content: "\e6a0"; +} + +.icon-duanluqi:before { + content: "\e60a"; +} + +.icon-baimingdan:before { + content: "\e643"; +} + +.icon-VPNwangguan:before { + content: "\e7da"; +} + +.icon-kaifazhezhongxin:before { + content: "\e70f"; +} + +.icon-kongzhitai:before { + content: "\e651"; +} + +.icon-baidu:before { + content: "\e8cb"; +} + +.icon-waibulianjie:before { + content: "\e858"; +} + +.icon-zidianguanli:before { + content: "\e625"; +} + +.icon-shujukaifajiaobenkaifa:before { + content: "\e65c"; +} + +.icon-chanpin:before { + content: "\e64f"; +} + +.icon-xiaoshou:before { + content: "\e624"; +} + +.icon-ceshi:before { + content: "\e853"; +} + +.icon-zhuanshujingli:before { + content: "\e883"; +} + +.icon-gongsi:before { + content: "\e679"; +} + +.icon-xitongquanxian:before { + content: "\e61e"; +} + +.icon-rizhi:before { + content: "\e647"; +} + +.icon-yonghuguanli_huaban:before { + content: "\e62d"; +} + +.icon-dingshirenwu:before { + content: "\e6a3"; +} + +.icon-dashboard:before { + content: "\e78b"; +} + +.icon-caidan:before { + content: "\e65d"; +} + +.icon-bumenguanli:before { + content: "\e61d"; +} + +.icon-jiaoseguanli:before { + content: "\e621"; +} + +.icon-xitong:before { + content: "\e601"; +} + +.icon-shouye:before { + content: "\e8b9"; +} + +.icon-guanyu:before { + content: "\e623"; +} + +.icon-DVLINK_daping:before { + content: "\e627"; +} + +.icon-weixin:before { + content: "\e656"; +} + +.icon-QQ:before { + content: "\e882"; +} + +.icon-contentright:before { + content: "\e67a"; +} + +.icon-zhuti:before { + content: "\e610"; +} + +.icon-sousuo:before { + content: "\e68a"; +} + +.icon-xiaoxi:before { + content: "\e8be"; +} + +.icon-zhongyingwen:before { + content: "\e605"; +} + +.icon-fangda:before { + content: "\e622"; +} + +.icon-suoxiao:before { + content: "\e62a"; +} + diff --git a/superManagement/src/assets/iconfont/iconfont.js b/superManagement/src/assets/iconfont/iconfont.js new file mode 100644 index 0000000..0e9170f --- /dev/null +++ b/superManagement/src/assets/iconfont/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_4036849='',function(h){var c=(c=document.getElementsByTagName("script"))[c.length-1],l=c.getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,i,t,v,z,o=function(c,l){l.parentNode.insertBefore(c,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}a=function(){var c,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4036849,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(c=document.body).firstChild?o(l,c.firstChild):c.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),a()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(t=a,v=h.document,z=!1,s(),v.onreadystatechange=function(){"complete"==v.readyState&&(v.onreadystatechange=null,p())})}function p(){z||(z=!0,t())}function s(){try{v.documentElement.doScroll("left")}catch(c){return void setTimeout(s,50)}p()}}(window); \ No newline at end of file diff --git a/superManagement/src/assets/iconfont/iconfont.json b/superManagement/src/assets/iconfont/iconfont.json new file mode 100644 index 0000000..182de05 --- /dev/null +++ b/superManagement/src/assets/iconfont/iconfont.json @@ -0,0 +1,681 @@ +{ + "id": "4036849", + "name": "luozhun", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "8959587", + "name": "大小齿轮", + "font_class": "daxiaochilun", + "unicode": "e6d0", + "unicode_decimal": 59088 + }, + { + "icon_id": "23875177", + "name": "全屏", + "font_class": "quanping", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "25840027", + "name": "搜索", + "font_class": "sousuo1", + "unicode": "e628", + "unicode_decimal": 58920 + }, + { + "icon_id": "29312195", + "name": "消息通知", + "font_class": "xiaoxitongzhi", + "unicode": "eaf8", + "unicode_decimal": 60152 + }, + { + "icon_id": "37425403", + "name": "退出全屏", + "font_class": "tuichuquanping", + "unicode": "e6db", + "unicode_decimal": 59099 + }, + { + "icon_id": "12188081", + "name": "添加", + "font_class": "tianjia", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "34882873", + "name": "编辑", + "font_class": "bianji1", + "unicode": "10117", + "unicode_decimal": 65815 + }, + { + "icon_id": "924384", + "name": "grid", + "font_class": "grid", + "unicode": "e8e4", + "unicode_decimal": 59620 + }, + { + "icon_id": "25944286", + "name": "ic_batch", + "font_class": "ic_batch", + "unicode": "e739", + "unicode_decimal": 59193 + }, + { + "icon_id": "24473117", + "name": "删除", + "font_class": "shanchu", + "unicode": "fcb6", + "unicode_decimal": 64694 + }, + { + "icon_id": "7632835", + "name": "其他", + "font_class": "qita1", + "unicode": "e602", + "unicode_decimal": 58882 + }, + { + "icon_id": "11412028", + "name": "全部", + "font_class": "quanbu", + "unicode": "e745", + "unicode_decimal": 59205 + }, + { + "icon_id": "12085836", + "name": "音频", + "font_class": "yinpin", + "unicode": "e603", + "unicode_decimal": 58883 + }, + { + "icon_id": "15173237", + "name": "文档", + "font_class": "wendang", + "unicode": "e60e", + "unicode_decimal": 58894 + }, + { + "icon_id": "24110222", + "name": "图片", + "font_class": "tupian", + "unicode": "e606", + "unicode_decimal": 58886 + }, + { + "icon_id": "24111668", + "name": "视频", + "font_class": "shipin", + "unicode": "fb3c", + "unicode_decimal": 64316 + }, + { + "icon_id": "38945085", + "name": "041_文档", + "font_class": "a-041_wendang", + "unicode": "e6da", + "unicode_decimal": 59098 + }, + { + "icon_id": "2667175", + "name": "关联保安", + "font_class": "guanlianbaoan", + "unicode": "e600", + "unicode_decimal": 58880 + }, + { + "icon_id": "12156012", + "name": "保安消防", + "font_class": "baoanxiaofang", + "unicode": "e613", + "unicode_decimal": 58899 + }, + { + "icon_id": "7587762", + "name": "右箭头", + "font_class": "youjiantou", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "7587767", + "name": "左箭头", + "font_class": "zuojiantou", + "unicode": "e60d", + "unicode_decimal": 58893 + }, + { + "icon_id": "2234525", + "name": "铃铛", + "font_class": "lingdang", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "1301378", + "name": "文件夹", + "font_class": "wenjianjia", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "10333707", + "name": "菜单", + "font_class": "caidan1", + "unicode": "e626", + "unicode_decimal": 58918 + }, + { + "icon_id": "27157318", + "name": "按钮", + "font_class": "a-ziyuan4", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "6241686", + "name": "资产管理", + "font_class": "zichanguanli", + "unicode": "e62e", + "unicode_decimal": 58926 + }, + { + "icon_id": "18170419", + "name": "解除固定,图钉", + "font_class": "fix", + "unicode": "e9b9", + "unicode_decimal": 59833 + }, + { + "icon_id": "34198298", + "name": "文字大小2", + "font_class": "wenzidaxiao2", + "unicode": "e854", + "unicode_decimal": 59476 + }, + { + "icon_id": "35102495", + "name": "转移03", + "font_class": "zhuanyi03", + "unicode": "ea34", + "unicode_decimal": 59956 + }, + { + "icon_id": "591724", + "name": "wxb品牌宝", + "font_class": "wxbpinpaibao", + "unicode": "e620", + "unicode_decimal": 58912 + }, + { + "icon_id": "1680680", + "name": "产品库", + "font_class": "chanpinku", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "1964103", + "name": "供应商支付", + "font_class": "gongyingshangzhifu", + "unicode": "e618", + "unicode_decimal": 58904 + }, + { + "icon_id": "9874502", + "name": "KHCFDC_客户", + "font_class": "kehu", + "unicode": "e6d2", + "unicode_decimal": 59090 + }, + { + "icon_id": "31313005", + "name": "进销存", + "font_class": "jinxiaocun", + "unicode": "e61f", + "unicode_decimal": 58911 + }, + { + "icon_id": "4657688", + "name": "项目管理", + "font_class": "xiangmuguanli-", + "unicode": "e609", + "unicode_decimal": 58889 + }, + { + "icon_id": "31260962", + "name": "exe", + "font_class": "exe", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "31260975", + "name": "mp4", + "font_class": "mp4", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "22325375", + "name": "主图视频", + "font_class": "zhutushipin", + "unicode": "e612", + "unicode_decimal": 58898 + }, + { + "icon_id": "19145266", + "name": "未知文件", + "font_class": "weizhiwenjian", + "unicode": "e61a", + "unicode_decimal": 58906 + }, + { + "icon_id": "6376407", + "name": "Jpg", + "font_class": "Jpg", + "unicode": "e731", + "unicode_decimal": 59185 + }, + { + "icon_id": "6376410", + "name": "Pdf", + "font_class": "Pdf", + "unicode": "e733", + "unicode_decimal": 59187 + }, + { + "icon_id": "6441713", + "name": "svg图标", + "font_class": "svgtubiao", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "6472244", + "name": "doc", + "font_class": "doc", + "unicode": "e735", + "unicode_decimal": 59189 + }, + { + "icon_id": "17290933", + "name": "gif", + "font_class": "gif", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "22007985", + "name": "JPEG", + "font_class": "JPEG", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "22008512", + "name": "DOCX", + "font_class": "DOCX", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "22008667", + "name": "XLS", + "font_class": "XLS", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "22008680", + "name": "XLSX", + "font_class": "XLSX", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "23182868", + "name": "PNG", + "font_class": "PNG", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "567560", + "name": "上传文件", + "font_class": "shangchuanwenjian", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "7594807", + "name": "24gl-folderPlus", + "font_class": "24gl-folderPlus", + "unicode": "eabe", + "unicode_decimal": 60094 + }, + { + "icon_id": "15816428", + "name": "019删除文件", + "font_class": "019shanchuwenjian", + "unicode": "e7e5", + "unicode_decimal": 59365 + }, + { + "icon_id": "27438098", + "name": "下载文件", + "font_class": "xiazaiwenjian", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "406256", + "name": "私人文件夹", + "font_class": "3333", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "11472722", + "name": "事件查询-壹米滴答-01", + "font_class": "shijianchaxun-yimidida-", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "21193294", + "name": "文件", + "font_class": "wenjian", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "1137788", + "name": "系统", + "font_class": "xitong1", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "5650859", + "name": "单位", + "font_class": "danwei", + "unicode": "e611", + "unicode_decimal": 58897 + }, + { + "icon_id": "18167099", + "name": "警察半身,公安", + "font_class": "policeman-full", + "unicode": "e8f1", + "unicode_decimal": 59633 + }, + { + "icon_id": "3876471", + "name": "mysql", + "font_class": "mysql", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "3172487", + "name": "RabbitMQ", + "font_class": "RabbitMQ", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "18337193", + "name": "断路器", + "font_class": "duanluqi", + "unicode": "e60a", + "unicode_decimal": 58890 + }, + { + "icon_id": "29328030", + "name": "白名单", + "font_class": "baimingdan", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "10055646", + "name": "VPN网关", + "font_class": "VPNwangguan", + "unicode": "e7da", + "unicode_decimal": 59354 + }, + { + "icon_id": "1259944", + "name": "开发者中心", + "font_class": "kaifazhezhongxin", + "unicode": "e70f", + "unicode_decimal": 59151 + }, + { + "icon_id": "12975229", + "name": "控制台", + "font_class": "kongzhitai", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "18166606", + "name": "百度", + "font_class": "baidu", + "unicode": "e8cb", + "unicode_decimal": 59595 + }, + { + "icon_id": "34201231", + "name": "外部链接 ", + "font_class": "waibulianjie", + "unicode": "e858", + "unicode_decimal": 59480 + }, + { + "icon_id": "5434087", + "name": "字典管理", + "font_class": "zidianguanli", + "unicode": "e625", + "unicode_decimal": 58917 + }, + { + "icon_id": "4773266", + "name": "数据开发—脚本开发", + "font_class": "shujukaifajiaobenkaifa", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "5121534", + "name": "产品", + "font_class": "chanpin", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "11641886", + "name": "销售", + "font_class": "xiaoshou", + "unicode": "e624", + "unicode_decimal": 58916 + }, + { + "icon_id": "16398952", + "name": "测试", + "font_class": "ceshi", + "unicode": "e853", + "unicode_decimal": 59475 + }, + { + "icon_id": "34453374", + "name": "专属经理", + "font_class": "zhuanshujingli", + "unicode": "e883", + "unicode_decimal": 59523 + }, + { + "icon_id": "9592764", + "name": "公司", + "font_class": "gongsi", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "8225386", + "name": "系统权限", + "font_class": "xitongquanxian", + "unicode": "e61e", + "unicode_decimal": 58910 + }, + { + "icon_id": "6527123", + "name": "日志", + "font_class": "rizhi", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "12753449", + "name": "用户管理", + "font_class": "yonghuguanli_huaban", + "unicode": "e62d", + "unicode_decimal": 58925 + }, + { + "icon_id": "20853327", + "name": "定时任务", + "font_class": "dingshirenwu", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "4765881", + "name": "dashboard", + "font_class": "dashboard", + "unicode": "e78b", + "unicode_decimal": 59275 + }, + { + "icon_id": "5283349", + "name": "菜单", + "font_class": "caidan", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "6627737", + "name": "部门管理", + "font_class": "bumenguanli", + "unicode": "e61d", + "unicode_decimal": 58909 + }, + { + "icon_id": "7274106", + "name": "角色管理", + "font_class": "jiaoseguanli", + "unicode": "e621", + "unicode_decimal": 58913 + }, + { + "icon_id": "1119109", + "name": "系统", + "font_class": "xitong", + "unicode": "e601", + "unicode_decimal": 58881 + }, + { + "icon_id": "1727423", + "name": "204首页", + "font_class": "shouye", + "unicode": "e8b9", + "unicode_decimal": 59577 + }, + { + "icon_id": "11641882", + "name": "关于", + "font_class": "guanyu", + "unicode": "e623", + "unicode_decimal": 58915 + }, + { + "icon_id": "12769434", + "name": "DVLINK_大屏", + "font_class": "DVLINK_daping", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "318438", + "name": "weixin", + "font_class": "weixin", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "4936984", + "name": "QQ", + "font_class": "QQ", + "unicode": "e882", + "unicode_decimal": 59522 + }, + { + "icon_id": "128654", + "name": "content-right", + "font_class": "contentright", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "4608986", + "name": "主题", + "font_class": "zhuti", + "unicode": "e610", + "unicode_decimal": 58896 + }, + { + "icon_id": "10452247", + "name": "sousuo", + "font_class": "sousuo", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "11372726", + "name": "消息中心", + "font_class": "xiaoxi", + "unicode": "e8be", + "unicode_decimal": 59582 + }, + { + "icon_id": "7533292", + "name": "中英文", + "font_class": "zhongyingwen", + "unicode": "e605", + "unicode_decimal": 58885 + }, + { + "icon_id": "3278362", + "name": "放大", + "font_class": "fangda", + "unicode": "e622", + "unicode_decimal": 58914 + }, + { + "icon_id": "5698509", + "name": "全屏缩小", + "font_class": "suoxiao", + "unicode": "e62a", + "unicode_decimal": 58922 + } + ] +} diff --git a/superManagement/src/assets/iconfont/iconfont.ttf b/superManagement/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000..cc62999 Binary files /dev/null and b/superManagement/src/assets/iconfont/iconfont.ttf differ diff --git a/superManagement/src/assets/iconfont/iconfont.woff b/superManagement/src/assets/iconfont/iconfont.woff new file mode 100644 index 0000000..5ed6e4a Binary files /dev/null and b/superManagement/src/assets/iconfont/iconfont.woff differ diff --git a/superManagement/src/assets/iconfont/iconfont.woff2 b/superManagement/src/assets/iconfont/iconfont.woff2 new file mode 100644 index 0000000..6c40153 Binary files /dev/null and b/superManagement/src/assets/iconfont/iconfont.woff2 differ diff --git a/superManagement/src/assets/images/login/bg.jpg b/superManagement/src/assets/images/login/bg.jpg new file mode 100644 index 0000000..6bbd1c7 Binary files /dev/null and b/superManagement/src/assets/images/login/bg.jpg differ diff --git a/superManagement/src/assets/scss/common.scss b/superManagement/src/assets/scss/common.scss new file mode 100644 index 0000000..fc7d6cd --- /dev/null +++ b/superManagement/src/assets/scss/common.scss @@ -0,0 +1,493 @@ +/* flex */ +.flex-center { + display: flex; + align-items: center; + justify-content: center; +} + +.flex-end { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.flex-justify-between { + display: flex; + align-items: center; + justify-content: space-between; +} + +.flex-align-center { + display: flex; + align-items: center; +} + +.flex-column-center { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.w-f { + width: 100%; +} + +.h-f { + height: 100%; +} + +.f-r { + float: right; +} + +.f-l { + float: left; +} + +/* clearfix */ +.clearfix::after { + display: block; + height: 0; + overflow: hidden; + clear: both; + content: ""; +} + +/* 文字单行省略号 */ +.sle { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 文字多行省略号 */ +.mle { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +/* 文字多了自动換行 */ +.break-word { + word-break: break-all; + word-wrap: break-word; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all 0.2s; +} + +.fade-transform-enter-from { + opacity: 0; + transition: all 0.2s; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transition: all 0.2s; + transform: translateX(30px); +} + +/* breadcrumb-transform */ +.breadcrumb-enter-active { + transition: all 0.2s; +} + +.breadcrumb-enter-from, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(10px); +} + +/* 外边距、内边距全局样式 */ +@for $i from 0 through 40 { + .mt#{$i} { + margin-top: #{$i}px !important; + } + .mr#{$i} { + margin-right: #{$i}px !important; + } + .mb#{$i} { + margin-bottom: #{$i}px !important; + } + .ml#{$i} { + margin-left: #{$i}px !important; + } + .pt#{$i} { + padding-top: #{$i}px !important; + } + .pr#{$i} { + padding-right: #{$i}px !important; + } + .pb#{$i} { + padding-bottom: #{$i}px !important; + } + .pl#{$i} { + padding-left: #{$i}px !important; + } +} + +/* -- 内外边距 -- */ + +.margin-0 { + margin: 0; +} + +.margin-xs { + margin: 5px; +} + +.margin-sm { + margin: 10px; +} + +.margin { + margin: 15px; +} + +.margin-lg { + margin: 20px; +} + +.margin-xl { + margin: 25px; +} + +.margin-top-xs { + margin-top: 5px; +} + +.margin-top-sm { + margin-top: 10px; +} + +.margin-top { + margin-top: 15px; +} + +.margin-top-lg { + margin-top: 20px; +} + +.margin-top-xl { + margin-top: 25px; +} + +.margin-right-xs { + margin-right: 5px; +} + +.margin-right-sm { + margin-right: 10px; +} + +.margin-right { + margin-right: 15px; +} + +.margin-right-lg { + margin-right: 20px; +} + +.margin-right-xl { + margin-right: 25px; +} + +.margin-bottom-xs { + margin-bottom: 5px; +} + +.margin-bottom-sm { + margin-bottom: 10px; +} + +.margin-bottom { + margin-bottom: 15px; +} + +.margin-bottom-lg { + margin-bottom: 20px; +} + +.margin-bottom-xl { + margin-bottom: 25px; +} + +.margin-left-xs { + margin-left: 5px; +} + +.margin-left-sm { + margin-left: 10px; +} + +.margin-left { + margin-left: 15px; +} + +.margin-left-lg { + margin-left: 20px; +} + +.margin-left-xl { + margin-left: 25px; +} + +.margin-lr-xs { + margin-left: 5px; + margin-right: 5px; +} + +.margin-lr-sm { + margin-left: 10px; + margin-right: 10px; +} + +.margin-lr { + margin-left: 15px; + margin-right: 15px; +} + +.margin-lr-lg { + margin-left: 20px; + margin-right: 20px; +} + +.margin-lr-xl { + margin-left: 25px; + margin-right: 25px; +} + +.margin-tb-xs { + margin-top: 5px; + margin-bottom: 5px; +} + +.margin-tb-sm { + margin-top: 10px; + margin-bottom: 10px; +} + +.margin-tb { + margin-top: 15px; + margin-bottom: 15px; +} + +.margin-tb-lg { + margin-top: 20px; + margin-bottom: 20px; +} + +.margin-tb-xl { + margin-top: 25px; + margin-bottom: 25px; +} + +.padding-0 { + padding: 0; +} + +.padding-xs { + padding: 5px; +} + +.padding-sm { + padding: 10px; +} + +.padding { + padding: 15px; +} + +.padding-lg { + padding: 20px; +} + +.padding-xl { + padding: 25px; +} + +.padding-top-xs { + padding-top: 5px; +} + +.padding-top-sm { + padding-top: 10px; +} + +.padding-top { + padding-top: 15px; +} + +.padding-top-lg { + padding-top: 20px; +} + +.padding-top-xl { + padding-top: 25px; +} + +.padding-right-xs { + padding-right: 5px; +} + +.padding-right-sm { + padding-right: 10px; +} + +.padding-right { + padding-right: 15px; +} + +.padding-right-lg { + padding-right: 20px; +} + +.padding-right-xl { + padding-right: 25px; +} + +.padding-bottom-xs { + padding-bottom: 5px; +} + +.padding-bottom-sm { + padding-bottom: 10px; +} + +.padding-bottom { + padding-bottom: 15px; +} + +.padding-bottom-lg { + padding-bottom: 20px; +} + +.padding-bottom-xl { + padding-bottom: 25px; +} + +.padding-left-xs { + padding-left: 5px; +} + +.padding-left-sm { + padding-left: 10px; +} + +.padding-left { + padding-left: 15px; +} + +.padding-left-lg { + padding-left: 20px; +} + +.padding-left-xl { + padding-left: 25px; +} + +.padding-lr-xs { + padding-left: 5px; + padding-right: 5px; +} + +.padding-lr-sm { + padding-left: 10px; + padding-right: 10px; +} + +.padding-lr { + padding-left: 15px; + padding-right: 15px; +} + +.padding-lr-lg { + padding-left: 20px; + padding-right: 20px; +} + +.padding-lr-xl { + padding-left: 25px; + padding-right: 25px; +} + +.padding-tb-xs { + padding-top: 5px; + padding-bottom: 5px; +} + +.padding-tb-sm { + padding-top: 10px; + padding-bottom: 10px; +} + +.padding-tb { + padding-top: 15px; + padding-bottom: 15px; +} + +.padding-tb-lg { + padding-top: 20px; + padding-bottom: 20px; +} + +.padding-tb-xl { + padding-top: 25px; + padding-bottom: 25px; +} + +/*高德地图去水印*/ +.amap-logo { + display: none !important; + visibility: hidden !important; +} + +.amap-copyright { + display: none !important; + visibility: hidden !important; +} + +/*高德地图去水印 结束*/ + +::-webkit-scrollbar { + width: 8px; + height: 12px; + background-color: #fff; +} + +/*浏览器滚动条样式*/ +::-webkit-scrollbar-thumb { + display: block; + min-height: 12px; + min-width: 8px; + border-radius: 6px; + background-color: rgb(217, 217, 217); +} + +::-webkit-scrollbar-thumb:hover { + display: block; + min-height: 12px; + min-width: 8px; + border-radius: 6px; + background-color: rgb(159, 159, 159); +} + +/*浏览器滚动条样式 结束*/ + +/* 鼠标悬浮手指 */ +.pointer { + cursor: pointer +} + +.border-table { + thead, th, td { + border: 1px solid black; + padding: 5px; + } +} \ No newline at end of file diff --git a/superManagement/src/assets/scss/myAntD.scss b/superManagement/src/assets/scss/myAntD.scss new file mode 100644 index 0000000..1b055a3 --- /dev/null +++ b/superManagement/src/assets/scss/myAntD.scss @@ -0,0 +1,162 @@ +/* 扩展ant design pro按钮组件颜色 */ +$--my-antd-important: !important; + +.btn-danger { + color: #ffffff; + background-color: #F5222D; + border-color: #F5222D; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #ff4d4f $--my-antd-important; + border-color: #ff4d4f $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #cf1322 $--my-antd-important; + border-color: #cf1322 $--my-antd-important; + } +} + +.btn-volcano { + color: #ffffff; + background-color: #FA541C; + border-color: #FA541C; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #ff7a45 $--my-antd-important; + border-color: #ff7a45 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #d4380d $--my-antd-important; + border-color: #d4380d $--my-antd-important; + } +} + +.btn-warn { + color: #ffffff; + background-color: #FAAD14; + border-color: #FAAD14; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #ffc53d $--my-antd-important; + border-color: #ffc53d $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #d48806 $--my-antd-important; + border-color: #d48806 $--my-antd-important; + } +} + +.btn-success { + color: #ffffff; + background-color: #52C41A; + border-color: #52C41A; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #73d13d $--my-antd-important; + border-color: #73d13d $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #389e0d $--my-antd-important; + border-color: #389e0d $--my-antd-important; + } +} + +.button-color-cyan { + color: #ffffff; + background-color: #13C2C2; + border-color: #13C2C2; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #36cfc9 $--my-antd-important; + border-color: #36cfc9 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #08979c $--my-antd-important; + border-color: #08979c $--my-antd-important; + } +} + +.btn-daybreak { + color: #ffffff; + background-color: #1890FF; + border-color: #1890FF; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #096dd9 $--my-antd-important; + border-color: #096dd9 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #40a9ff $--my-antd-important; + border-color: #40a9ff $--my-antd-important; + } +} + +.button-color-geekblue { + color: #ffffff; + background-color: #2F54EB; + border-color: #2F54EB; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #1d39c4 $--my-antd-important; + border-color: #1d39c4 $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #597ef7 $--my-antd-important; + border-color: #597ef7 $--my-antd-important; + } +} + +.btn-purple { + color: #ffffff; + background-color: #722ED1; + border-color: #722ED1; + + &:hover, &:focus { + color: #ffffff $--my-antd-important; + background-color: #9254de $--my-antd-important; + border-color: #9254de $--my-antd-important; + } + + &:active, &.active { + color: #ffffff $--my-antd-important; + background-color: #531dab $--my-antd-important; + border-color: #531dab $--my-antd-important; + } +} + +.table-row-warn td { + background-color: #fefca6; +} + +.table-row-danger td { + background-color: #f79988; +} + +.table-row-success td { + background-color: #b6fcbe; +} + +.ant-table-summary td { + background: #edeff6; +} \ No newline at end of file diff --git a/superManagement/src/assets/vue.svg b/superManagement/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/superManagement/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/superManagement/src/axios/index.ts b/superManagement/src/axios/index.ts new file mode 100644 index 0000000..e880ff3 --- /dev/null +++ b/superManagement/src/axios/index.ts @@ -0,0 +1,85 @@ +import axios, {AxiosInstance, AxiosRequestConfig, InternalAxiosRequestConfig} from "axios"; +import {message} from "ant-design-vue"; +import {useUserStore} from "@/stores/modules/userStore.ts"; +import router from "@/router"; + +export interface CustomAxiosRequestConfig extends AxiosRequestConfig { + //是否需要全屏禁用 + loading?: boolean, + loadingMessage?: string +} + +export interface CustomInternalAxiosRequestConfig extends InternalAxiosRequestConfig { + //是否需要全屏禁用 + loading?: boolean, + loadingMessage?: string +} + +const axiosConfig: AxiosRequestConfig = { + baseURL: __APP_ENV.VITE_APP_BASE_API, + timeout: __APP_ENV.VITE_APP_ENV === 'production' ? 10 * 1000 : 60 * 1000, + timeoutErrorMessage: "请求超时......" +}; + +class RequestHttp { + + service: AxiosInstance; + + constructor(config: AxiosRequestConfig) { + this.service = axios.create(config); + + this.service.interceptors.request.use((cfg: CustomInternalAxiosRequestConfig) => { + const userStore = useUserStore() + cfg.headers.set(userStore.getTokenInfo?.name as string, userStore.getTokenInfo?.value as string) + return cfg; + }, async (error) => { + message.error(error.message) + return Promise.reject(error); + }) + + this.service.interceptors.response.use(async (resp): Promise => { + const jsonResult: JsonResult = resp.data; + if (jsonResult && jsonResult.code != 200) { + //一些特定的错误需要重新登录 + if ([-1].includes(jsonResult.code)) { + //清除登录信息 + await useUserStore().resetUserInfo(); + //跳转登录页 + await router.push({ + path: '/login' + }) + } + message.error(jsonResult.message) + return Promise.reject(jsonResult); + } + return Promise.resolve(jsonResult); + }, (error) => { + message.error(error.message) + return Promise.reject(error); + }) + } + + /** + * 常用请求方法封装 + */ + get(url: string, params?: object, _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.get(url, {params, ..._object}); + } + + post(url: string, params?: object | object[], _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.post(url, params, _object); + } + + put(url: string, params?: object | object[], _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.put(url, params, _object); + } + + delete(url: string, params?: object, _object: CustomAxiosRequestConfig = {}): Promise> { + return this.service.delete(url, {params, ..._object}); + } + +} + +const api = new RequestHttp(axiosConfig); + +export default api diff --git a/superManagement/src/components/HelloWorld.vue b/superManagement/src/components/HelloWorld.vue new file mode 100644 index 0000000..b58e52b --- /dev/null +++ b/superManagement/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/superManagement/src/components/aMap/MapContainer.vue b/superManagement/src/components/aMap/MapContainer.vue new file mode 100644 index 0000000..a945b0b --- /dev/null +++ b/superManagement/src/components/aMap/MapContainer.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/superManagement/src/components/form/FormProMax.vue b/superManagement/src/components/form/FormProMax.vue new file mode 100644 index 0000000..1c36de7 --- /dev/null +++ b/superManagement/src/components/form/FormProMax.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/superManagement/src/components/iconfont/IconFont.vue b/superManagement/src/components/iconfont/IconFont.vue new file mode 100644 index 0000000..4a1fb6c --- /dev/null +++ b/superManagement/src/components/iconfont/IconFont.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/superManagement/src/components/layout/Layout.vue b/superManagement/src/components/layout/Layout.vue new file mode 100644 index 0000000..09ce243 --- /dev/null +++ b/superManagement/src/components/layout/Layout.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/superManagement/src/components/layout/MenuItem.vue b/superManagement/src/components/layout/MenuItem.vue new file mode 100644 index 0000000..6323222 --- /dev/null +++ b/superManagement/src/components/layout/MenuItem.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/superManagement/src/components/layout/SystemMenus.vue b/superManagement/src/components/layout/SystemMenus.vue new file mode 100644 index 0000000..8429600 --- /dev/null +++ b/superManagement/src/components/layout/SystemMenus.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/superManagement/src/components/layout/header/LayoutHeader.vue b/superManagement/src/components/layout/header/LayoutHeader.vue new file mode 100644 index 0000000..0713b0c --- /dev/null +++ b/superManagement/src/components/layout/header/LayoutHeader.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/superManagement/src/components/login/TelephoneLogin.vue b/superManagement/src/components/login/TelephoneLogin.vue new file mode 100644 index 0000000..3e2b9a2 --- /dev/null +++ b/superManagement/src/components/login/TelephoneLogin.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/superManagement/src/components/table/TableProMax.vue b/superManagement/src/components/table/TableProMax.vue new file mode 100644 index 0000000..b68b652 --- /dev/null +++ b/superManagement/src/components/table/TableProMax.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/superManagement/src/components/tree/AdministrativeDivisionTree.vue b/superManagement/src/components/tree/AdministrativeDivisionTree.vue new file mode 100644 index 0000000..3822dfd --- /dev/null +++ b/superManagement/src/components/tree/AdministrativeDivisionTree.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/superManagement/src/components/tsx/ModalPro.tsx b/superManagement/src/components/tsx/ModalPro.tsx new file mode 100644 index 0000000..64466b0 --- /dev/null +++ b/superManagement/src/components/tsx/ModalPro.tsx @@ -0,0 +1,54 @@ +import {h, Ref, ref, VNode} from "vue"; +import {Modal} from "ant-design-vue"; +import {FormExpose} from "ant-design-vue/es/form/Form"; +import {ExclamationCircleOutlined} from "@ant-design/icons-vue"; +import FormProMax from "@/components/form/FormProMax.vue"; +import {FormProMaxItemOptions, FormProMaxProps} from "@/types/components/form"; + +export function submitSimpleFormModal(props: { + title: string, + formParams?: T & Record, + formProps?: Omit, 'formItemOptions'>, + formOptions: FormProMaxItemOptions + submit: (params: T) => Promise, + cancel?: (params: T) => Promise, + icon?: () => VNode, + maskClosable?: boolean, + width?: string | number +}) { + if (!props.formParams) props.formParams = {} as T + if (!props.width) props.width = 520 + + const formRef = ref(null) + const _formParams = ref({ + ...props.formParams + }) as Ref + + Modal.confirm({ + icon: props.icon ? props.icon() : ' ', + width: props.width, + maskClosable: props.maskClosable ?? true, + title: props.title, + content: () => , + onOk: async () => { + await formRef.value?.validate() + await props.submit(_formParams.value); + }, + onCancel: async () => props.cancel && await props.cancel(_formParams.value) + }) +} + +export const deleteDataModal = (name: string, submit: () => Promise, cancel?: () => Promise) => { + Modal.confirm({ + title: `确认删除【${name}】吗?`, + icon: h(ExclamationCircleOutlined), + content: h('div', {style: 'color:red;'}, '此操作将删除数据,且无法找回!'), + onOk: async () => await submit(), + onCancel: async () => cancel && await cancel() + }); +} diff --git a/superManagement/src/components/upload/SingleImageFileUpload.vue b/superManagement/src/components/upload/SingleImageFileUpload.vue new file mode 100644 index 0000000..10c0261 --- /dev/null +++ b/superManagement/src/components/upload/SingleImageFileUpload.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/superManagement/src/config/dict.ts b/superManagement/src/config/dict.ts new file mode 100644 index 0000000..ed69da7 --- /dev/null +++ b/superManagement/src/config/dict.ts @@ -0,0 +1,21 @@ +import api from "@/axios"; + +type DictType = + 'CheckStatus' + | 'DeleteFlag' + | 'IsEnable' + | 'IsOrNot' + | 'Sex' + | 'ServiceProjectType' + | 'MiniProgramUserIdentity' + | 'EnterprisesUnitType' + | 'SelectType' + +export const initDict = () => { + api.get[]>>('/common/enums').then(resp => { + sessionStorage.setItem('dictMap', JSON.stringify(resp.data)) + }) +} + +export const dictSelectNodes = (dictType: DictType): SelectNodeVo[] => JSON.parse(sessionStorage.getItem('dictMap') as string)?.[dictType] || [] + diff --git a/superManagement/src/config/index.ts b/superManagement/src/config/index.ts new file mode 100644 index 0000000..4743ad7 --- /dev/null +++ b/superManagement/src/config/index.ts @@ -0,0 +1,63 @@ +import {SystemMenu} from "@/types/config"; + +export const CLIENT_TYPE = "MANAGEMENT_SUPER"; +export const ROUTER_WHITE_LIST: string[] = ['/login', '/test']; +export const UNIT_TYPE = { + security: 'SECURITY_UNIT', //安全 + police: 'POLICE_UNIT' //警察 +} + +export const SYSTEM_MENUS: SystemMenu[] = [ + { + title: '首页', + name: 'index', + path: '/index', + type: "menu", + component: () => import('@/views/index.vue') + }, { + title: '单位管理', + name: 'unitManage', + path: '/unitManage', + type: 'dir', + children: [ + { + title: '公安', + name: 'police', + path: '/police', + type: 'dir', + children: [{ + title: '单位管理', + name: 'policeUnitManage', + path: '/police/unitManage', + type: 'menu', + component: () => import('@/views/unitManage/police/unitManage/index.vue') + }, { + title: '考核标准', + name: 'policeAssessmentCriteria', + path: '/police/assessmentCriteria', + type: 'menu', + component: () => import('@/views/unitManage/police/assessmentCriteria/index.vue') + }, { + title: '考核记录', + name: 'policeAssessmentRecord', + path: '/police/assessmentRecord', + type: 'menu', + component: () => import('@/views/unitManage/police/assessmentRecord/index.vue') + }] + }, { + title: '保安单位', + name: 'securityUnit', + path: '/securityUnit', + type: 'menu', + component: () => import('@/views/unitManage/securityUnit/index.vue') + } + ] + }, { + title: '数据总览', + name: 'dataOverview', + path: '/dataOverview', + type: 'menu', + isFull: true, + component: () => import('@/views/data/dataOverview.vue') + } +] diff --git a/superManagement/src/global.d.ts b/superManagement/src/global.d.ts new file mode 100644 index 0000000..2d29174 --- /dev/null +++ b/superManagement/src/global.d.ts @@ -0,0 +1,64 @@ +declare const __APP_ENV: ImportMetaEnv; + +/** + * 全局返回 + */ +interface JsonResult { + code: number; + message: string; + data?: T; +} + +/** + * 选择 + */ +class SelectNodeVo> { + value: T; + label: string; + options?: SelectNodeVo[] + orderIndex?: number; + disabled?: boolean; + extData?: E +} + +/** + * 树 + */ +class TreeNodeVo> { + value: T; + parentValue: T; + label: string; + orderIndex?: number; + children?: TreeNodeVo[] + extData?: E; +} + +/** + * 栅格布局 + */ +declare interface Grid { + //栅格占据的列数 + span?: number; + //栅格左侧的间隔格数 + offset?: number; + //栅格向右移动格数 + push?: number; + //栅格向左移动格数 + pull?: number; + //<768px 响应式栅格数或者栅格属性对象 + xs?: number; + //≥768px 响应式栅格数或者栅格属性对象 + sm?: number; + //≥992px 响应式栅格数或者栅格属性对象 + md?: number; + //≥1200px 响应式栅格数或者栅格属性对象 + lg?: number; + //≥1920px 响应式栅格数或者栅格属性对象 + xl?: number; +} + +interface BaseEnum { + value: T; + label: string, + extData?: Record +} diff --git a/superManagement/src/hooks/useSelectAndTreeNodeVos.ts b/superManagement/src/hooks/useSelectAndTreeNodeVos.ts new file mode 100644 index 0000000..aab41a1 --- /dev/null +++ b/superManagement/src/hooks/useSelectAndTreeNodeVos.ts @@ -0,0 +1,36 @@ +import {onMounted, reactive, toRefs} from "vue"; +import api from "@/axios"; + + +interface SelectAndTreeNodeType { + administrativeDivisionTree: TreeNodeVo[]; +} + +export const callbackResult: { [key in keyof SelectAndTreeNodeType]: (params?: Record) => Promise } = { + administrativeDivisionTree: async (params = {level: 4}) => (await api.get[]>('/common/administrativeDivisionTree', params)).data, +} + +export default (type?: keyof SelectAndTreeNodeType | (keyof SelectAndTreeNodeType)[], params?: { [key in keyof SelectAndTreeNodeType]?: Record }) => { + const allData = reactive({ + administrativeDivisionTree: [], + }) + + const refreshData = (type: keyof SelectAndTreeNodeType | (keyof SelectAndTreeNodeType)[]) => { + if (typeof type === "string") { + //@ts-ignore + callbackResult[type](params?.[type]).then(data => allData[type] = data) + } else { + //@ts-ignore + type.forEach(t => callbackResult[t](params?.[t]).then(data => allData[t] = data)) + } + } + + onMounted(() => type && refreshData(type)) + + return { + refreshData, + ...toRefs(allData), + callbackResult + } + +} diff --git a/superManagement/src/hooks/useTableProMax.ts b/superManagement/src/hooks/useTableProMax.ts new file mode 100644 index 0000000..360f18e --- /dev/null +++ b/superManagement/src/hooks/useTableProMax.ts @@ -0,0 +1,134 @@ +import {ref, Ref} from "vue"; +import {Page, PageParams, PageResult} from "@/types/hooks/useTableProMax.ts"; +import {FormInstance} from "ant-design-vue"; +import {BaseTableRowRecord, RequestApiType} from "@/types/components/table"; + +/** + * + * @param api 查询方法 + * @param searchFormRef 表单校验 + * @param searchParams 查询的参数 + * @param isPageTable 是否分页 + * @param dataCallBack 查询到数据后的回调 + * @param requestError 查询出错回调 + */ +export default | PageParams

>(api: RequestApiType, + searchFormRef: Ref, + searchParams: Ref

, + isPageTable: boolean = true, + dataCallBack?: (data: T[]) => T[], + requestError?: (errorMsg: any) => void) => { + + const dataSource = ref([]) as Ref; + const loading = ref(false); + const pageParams = ref({ + current: 1, + size: 10, + total: 0 + }) + + /** + * 获取表格数据 + */ + const requestGetTableData = async (isInit: boolean = false) => { + try { + //校验表单 + !isInit && await searchFormRef.value?.validate(); + //组装参数 + let totalSearchParams; + if (isPageTable) { + totalSearchParams = { + params: searchParams.value, + page: { + current: pageParams.value.current, + size: pageParams.value.size + } + } as PageParams

; + } else { + totalSearchParams = searchParams.value + } + + loading.value = true; + + const resp = await api(totalSearchParams as P); + let tableData: T[]; + + if (isPageTable) { + const {current, records, size, total} = resp.data as PageResult; + isPageTable && updatePageParams({ + current: parseInt(current), + size: parseInt(size), + total: parseInt(total) + }); + tableData = records; + } else { + tableData = resp.data as T[] + } + dataCallBack && (tableData = dataCallBack(tableData)); + dataSource.value = tableData; + } catch (error) { + requestError && requestError(error); + } finally { + loading.value = false; + } + } + + /** + * 更新分页信息 + */ + const updatePageParams = (ps: Page) => Object.assign(pageParams.value, ps) + + /** + * 重置表格状态 包括 dataSource loading pageParams + */ + const resetState = () => { + dataSource.value = []; + loading.value = false; + pageParams.value = { + current: 1, + size: 10, + total: 0 + } + } + + /** + * 表格数据查询 与 requestGetTableData 区别是会将页面重置为1 + * 如果只做刷新数据请用 requestGetTableData + */ + const search = async () => { + pageParams.value.current = 1; + await requestGetTableData(); + }; + + /** + * @description 每页条数改变 + * @param _ + * @param {Number} size 页显示数量 + */ + const handleSizeChange = async (_: number, size: number) => { + pageParams.value.current = 1; + pageParams.value.size = size; + await requestGetTableData(); + }; + + /** + * @description 当前页改变 + * @param current 当前页 + */ + const handleCurrentChange = async (current: number) => { + pageParams.value.current = current; + await requestGetTableData(); + }; + + return { + dataSource, + loading, + pageParams, + requestGetTableData, + search, + handleSizeChange, + handleCurrentChange, + resetState + }; + +} diff --git a/superManagement/src/main.ts b/superManagement/src/main.ts new file mode 100644 index 0000000..27927ba --- /dev/null +++ b/superManagement/src/main.ts @@ -0,0 +1,26 @@ +import {createApp} from 'vue' +import App from '@/App.vue' +import '@/reset.css' + +// 公共样式 +import '@/assets/scss/common.scss' +//ant design 扩展样式 +import '@/assets/scss/myAntD.scss' +// iconfont css +import "@/assets/iconfont/iconfont.css"; +// vue Router +import router from "@/router"; +// pinia stores +import pinia from "@/stores"; +import {initDict} from "@/config/dict.ts"; +//高德类型声明文件 +import "@amap/amap-jsapi-types"; + +initDict(); + +const vueApp = createApp(App); + +vueApp + .use(router) + .use(pinia) + .mount('#app') diff --git a/superManagement/src/reset.css b/superManagement/src/reset.css new file mode 100644 index 0000000..76d99ae --- /dev/null +++ b/superManagement/src/reset.css @@ -0,0 +1,57 @@ +/* http://meyerweb.com/eric/tools/css/reset/ */ +/* v1.0 | 20080212 */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: none; +} + +/* remember to define focus styles! */ +:focus { + outline: 0; +} + +/* remember to highlight inserts somehow! */ +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +/* tables still need 'cellspacing="0"' in the markup */ +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/superManagement/src/router/index.ts b/superManagement/src/router/index.ts new file mode 100644 index 0000000..fb606fd --- /dev/null +++ b/superManagement/src/router/index.ts @@ -0,0 +1,45 @@ +import {createRouter, createWebHistory} from "vue-router"; +import {staticRouter} from "@/router/staticRouters.ts"; +import {message, Modal} from "ant-design-vue"; +import {useUserStore} from "@/stores/modules/userStore.ts"; +import {ROUTER_WHITE_LIST} from "@/config"; + +/** + * createWebHistory & createWebHashHistory + * createWebHistory: 路径不带#号,但需要后端进行配置(如nginx配置:try_files $uri $uri/ /index.html last;) + * createWebHashHistory: 路径带#号 这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理,影响SEO + */ +const router = createRouter({ + history: createWebHistory(__APP_ENV.VITE_APP_MODULE_NAME), + routes: [...staticRouter], + strict: false, + scrollBehavior: () => ({left: 0, top: 0}), +}); + +router.beforeEach(async (to, from, next) => { + Modal.destroyAll(); + //判断访问的是不是登录页 + const userStore = useUserStore(); + if (to.path.toLocaleLowerCase() === '/login' && userStore.getTokenInfo?.value) { + //如果已登录 且访问login页面 直接返回当前页面 + await message.warn('当前已登录,请先退出账号'); + return next(from.fullPath) + } + //判断访问路径是不是白名单d + if (ROUTER_WHITE_LIST.includes(to.path)) { + return next(); + } + //不在白名单内需要查看是否携带token 没有token需要返回登录页进行登录 + if (!userStore.getTokenInfo?.value) { + await message.warn('未找到token,请重新登陆!') + return next('/login'); + } + //放行 + return next(); +}) + +router.onError(error => { + console.error("路由错误", error.message); +}) + +export default router diff --git a/superManagement/src/router/staticRouters.ts b/superManagement/src/router/staticRouters.ts new file mode 100644 index 0000000..a4e2afe --- /dev/null +++ b/superManagement/src/router/staticRouters.ts @@ -0,0 +1,70 @@ +import {RouteRecordRaw} from "vue-router"; +import {SYSTEM_MENUS} from "@/config"; +import {SystemMenu} from "@/types/config"; + +const routerClassify: Record<'layout' | 'full', RouteRecordRaw[]> = { + layout: [], + full: [] +} + +/** + * 提取菜单路由 + */ +const extractMenuToRouter = () => { + const traverse = (data: SystemMenu[]) => { + data.forEach(item => { + if (item.type === 'dir' && item.children && item.children.length > 0) { + traverse(item.children) + } else { + if (!item.isFull) { + routerClassify.layout.push({ + path: item.path, + name: item.name, + meta: { + title: item.title + }, + component: item.component + } as RouteRecordRaw) + } else { + routerClassify.full.push({ + path: item.path, + name: item.name, + meta: { + title: item.title + }, + component: item.component + } as RouteRecordRaw) + } + } + }) + } + traverse(SYSTEM_MENUS) +} + +extractMenuToRouter() + +export const staticRouter: RouteRecordRaw[] = [ + { + path: '/login', + name: 'login', + meta: { + title: '登录', + }, + component: () => import("@/views/login.vue"), + }, { + path: "/", + redirect: '/index', + }, { + path: '/layout', + name: 'layout', + redirect: '/index', + component: () => import("@/components/layout/Layout.vue"), + children: routerClassify.layout + }, + ...routerClassify.full, + { + path: '/test', + name: 'test', + component: () => import("@/views/test.vue"), + }, +] diff --git a/superManagement/src/stores/index.ts b/superManagement/src/stores/index.ts new file mode 100644 index 0000000..87b1acc --- /dev/null +++ b/superManagement/src/stores/index.ts @@ -0,0 +1,8 @@ +import {createPinia} from "pinia"; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' + +//创建store实例 持久化插件 +const pinia = createPinia(); +pinia.use(piniaPluginPersistedstate); + +export default pinia; diff --git a/superManagement/src/stores/modules/userStore.ts b/superManagement/src/stores/modules/userStore.ts new file mode 100644 index 0000000..f52f0f5 --- /dev/null +++ b/superManagement/src/stores/modules/userStore.ts @@ -0,0 +1,27 @@ +import {defineStore} from "pinia"; +import {TokenInfo, UserStore} from "@/types/stores/userStore.ts"; + +export const useUserStore = defineStore({ + id: 'useUserStore', + state: (): UserStore => { + return { + tokenInfo: undefined + } + }, + actions: { + saveTokenInfo(tokenInfo: TokenInfo) { + this.tokenInfo = tokenInfo + }, + async resetUserInfo() { + this.tokenInfo = undefined; + } + }, + getters: { + getTokenInfo: (state): TokenInfo => state.tokenInfo as TokenInfo, + }, + persist: { + key: "useUserStore", + storage: window.localStorage, + paths: ["tokenInfo"], + } +}) diff --git a/superManagement/src/types/components/form/index.ts b/superManagement/src/types/components/form/index.ts new file mode 100644 index 0000000..fae4ba2 --- /dev/null +++ b/superManagement/src/types/components/form/index.ts @@ -0,0 +1,76 @@ +import { + FormProps, + RangePicker, + Input, + InputNumber, + Textarea, + InputPassword, + RadioGroup, + Select, + TreeSelect, + Cascader, + CheckboxGroup, + DatePicker, + FormItem, TimeRangePicker, TimePicker, +} from "ant-design-vue"; +import {Ref, UnwrapRef, VNode} from "vue"; +import {ComponentProps} from "vue-component-type-helpers"; +import AdministrativeDivisionTree from "@/components/tree/AdministrativeDivisionTree.vue"; + +type FormProMaxItemType = + | 'custom' + | 'input' + | 'inputPassword' + | 'inputNumber' + | 'inputTextArea' + | 'radioGroup' + | 'select' + | 'selectIcon' + | 'selectUser' + | 'treeSelect' + | 'cascader' + | 'checkboxGroup' + | 'datePicker' + | 'rangePicker' + | 'timeRangePicker' + | 'timePicker' + | 'administrativeDivisionTree' + +interface FormProMaxItemCommonProps extends ComponentProps { + label?: string, + grid?: Grid, + placeholder?: string, + remarkRender?: () => VNode | string, + customRender?: () => VNode; + options?: (SelectNodeVo | TreeNodeVo) [] | Ref<(SelectNodeVo | TreeNodeVo)[]> +} + +export interface FormProMaxItemProps extends FormProMaxItemCommonProps { + type: T + componentsProps?: C +} + +export type FormProMaxItemOptions = { + [key in keyof T | string]: + FormProMaxItemProps<'custom', ComponentProps>> + | FormProMaxItemProps<'input', ComponentProps> + | FormProMaxItemProps<'inputPassword', ComponentProps> + | FormProMaxItemProps<'inputNumber', ComponentProps> + | FormProMaxItemProps<'inputTextArea', ComponentProps> + | FormProMaxItemProps<'radioGroup', ComponentProps> + | FormProMaxItemProps<'select', ComponentProps> + | FormProMaxItemProps<'treeSelect', ComponentProps> + | FormProMaxItemProps<'cascader', ComponentProps> + | FormProMaxItemProps<'checkboxGroup', ComponentProps> + | FormProMaxItemProps<'datePicker', ComponentProps> + | FormProMaxItemProps<'rangePicker', ComponentProps> + | FormProMaxItemProps<'timeRangePicker', ComponentProps> + | FormProMaxItemProps<'timePicker', ComponentProps> + | FormProMaxItemProps<'administrativeDivisionTree', ComponentProps> +} + +export interface FormProMaxProps extends FormProps { + grid?: Grid + gutter?: number; + formItemOptions?: FormProMaxItemOptions | Ref> | UnwrapRef> +} diff --git a/superManagement/src/types/components/iconfont/IconFont.ts b/superManagement/src/types/components/iconfont/IconFont.ts new file mode 100644 index 0000000..501afa8 --- /dev/null +++ b/superManagement/src/types/components/iconfont/IconFont.ts @@ -0,0 +1,5 @@ +export interface IconFontProps { + fontClass?: string, + size?: number | string, + type?: 'class' | 'svg' +} \ No newline at end of file diff --git a/superManagement/src/types/components/map/index.ts b/superManagement/src/types/components/map/index.ts new file mode 100644 index 0000000..a8ca2fa --- /dev/null +++ b/superManagement/src/types/components/map/index.ts @@ -0,0 +1,44 @@ +/** + * 高德支持的插件列表 + * @link https://lbs.amap.com/api/javascript-api-v2/guide/abc/plugins-list + */ +export type MapPlugins = + 'AMap.ElasticMarker' + | 'AMap.ToolBar' + | 'AMap.Scale' + | 'AMap.HawkEye' + | 'AMap.ControlBar' + | 'AMap.MapType' + | 'AMap.Geolocation' + | 'AMap.AutoComplete' + | 'AMap.PlaceSearch' + | 'AMap.DistrictSearch' + | 'AMap.LineSearch' + | 'AMap.StationSearch' + | 'AMap.Driving' + | 'AMap.TruckDriving' + | 'AMap.Transfer' + | 'AMap.Walking' + | 'AMap.Riding' + | 'AMap.DragRoute' + | 'AMap.Geocoder' + | 'AMap.CitySearch' + | 'AMap.IndoorMap' + | 'AMap.MouseTool' + | 'AMap.CircleEditor' + | 'AMap.PolygonEditor' + | 'AMap.PolylineEditor' + | 'AMap.RectangleEditor' + | 'AMap.EllipseEditor' + | 'AMap.BezierCurveEditor' + | 'AMap.MarkerCluster' + | 'AMap.RangingTool' + | 'AMap.CloudDataSearch' + | 'AMap.Weather' + | 'AMap.HeatMap' + +export interface MapContainerProps { + plugins?: MapPlugins[], + initCallback?: (map: AMap.Map) => void, + mapOptions?: AMap.MapOptions +} diff --git a/superManagement/src/types/components/table/index.ts b/superManagement/src/types/components/table/index.ts new file mode 100644 index 0000000..20c3793 --- /dev/null +++ b/superManagement/src/types/components/table/index.ts @@ -0,0 +1,55 @@ +import {PaginationProps, Table, TableProps} from "ant-design-vue"; +import {TableRowSelection} from "ant-design-vue/lib/table/interface"; +import {Ref, UnwrapRef} from "vue"; +import {ColumnType} from "ant-design-vue/es/table/interface"; +import {ComponentSlots} from "vue-component-type-helpers"; +import {FormProMaxItemOptions, FormProMaxProps} from "@/types/components/form"; +import {PageParams, PageResult} from "@/types/hooks/useTableProMax.ts"; + + +export type TableProMaxColumnType = Omit, 'dataIndex'> & { + dataIndex: keyof T | string | string[] | number | number[]; +} + + +export type TableProMaxProps< + T extends BaseTableRowRecord = {}, + P extends { [key: string]: any } = {} +> = Partial, "dataSource" | 'pagination' | 'loading' | 'rowKey' | 'columns'>> & { + rowKey?: keyof T, + columns?: TableProMaxColumnType[], + searchFormProps?: Omit, 'formItems'> + searchFormOptions?: FormProMaxItemOptions

| Ref> | UnwrapRef>, + defaultSearchParams?: { [key in keyof P | string]: any }; + requestAuto?: boolean, + requestApi: RequestApiType, + requestError?: (errorMsg: any) => void, + dataCallback?: (data: T[]) => T[], + isPagination?: boolean, + paginationProps?: TableProMaxPaginationProps, + isSelection?: boolean, + selectionProps?: TableProMaxRowSelect, + isPrinter?: boolean, + needIndex?: boolean +} + +export type TableProMaxSlots = ComponentSlots & { + tableHeader: (scope: { selectKeys: string[], selectRows: T[] }) => any, + tableHeaderRight: (scope: { selectKeys: string[], selectRows: T[] }) => any, +} + +export type RequestApiType = (params: P | PageParams

) => Promise>>; + +export type TableProMaxPaginationProps = Partial>; + +export type TableProMaxRowSelect = TableRowSelection; + +export interface BaseTableRowRecord { + snowFlakeId?: string; + createUserName?: string; + createTime?: Date | string; + updateUserName?: string; + updateTime?: Date | string +} diff --git a/superManagement/src/types/components/tree/index.ts b/superManagement/src/types/components/tree/index.ts new file mode 100644 index 0000000..8b14928 --- /dev/null +++ b/superManagement/src/types/components/tree/index.ts @@ -0,0 +1,7 @@ +export interface AdministrativeDivisionTreeProps { + placeholder?: string, + changeOnSelect?: boolean + allowClear?: boolean + onChange?: (value: (string | number[]), selectedOptions: TreeNodeVo[]) => void + displayRender?: (opt: { labels: string[], selectedOptions: TreeNodeVo[] }) => string +} diff --git a/superManagement/src/types/config/index.ts b/superManagement/src/types/config/index.ts new file mode 100644 index 0000000..f9c23a8 --- /dev/null +++ b/superManagement/src/types/config/index.ts @@ -0,0 +1,13 @@ +import {RouteComponent} from "vue-router"; + +export interface SystemMenu { + type: 'dir' | 'menu'; + title: string; + path: string; + isFull?: boolean; + name: string; + icon?: string; + + component?: RouteComponent; + children?: SystemMenu[]; +} diff --git a/superManagement/src/types/hooks/useTableProMax.ts b/superManagement/src/types/hooks/useTableProMax.ts new file mode 100644 index 0000000..3989828 --- /dev/null +++ b/superManagement/src/types/hooks/useTableProMax.ts @@ -0,0 +1,26 @@ +/** + * 分页对象 + */ +export interface Page { + current: number, + size: number, + total: number +} + +/** + * 分页参数 + */ +export interface PageParams = {}> { + params: T & { [key: string]: any }, + page: Omit +} + +/** + * 分页结果 + */ +export interface PageResult { + current: string, + records: T[], + size: string, + total: string +} \ No newline at end of file diff --git a/superManagement/src/types/stores/userStore.ts b/superManagement/src/types/stores/userStore.ts new file mode 100644 index 0000000..92073b0 --- /dev/null +++ b/superManagement/src/types/stores/userStore.ts @@ -0,0 +1,8 @@ +export interface TokenInfo { + name: string; + value: string; +} + +export interface UserStore { + tokenInfo?: TokenInfo; +} diff --git a/superManagement/src/types/views/data/dataOverview.ts b/superManagement/src/types/views/data/dataOverview.ts new file mode 100644 index 0000000..0c26468 --- /dev/null +++ b/superManagement/src/types/views/data/dataOverview.ts @@ -0,0 +1,28 @@ +export interface EnterprisesUnit { + snowFlakeId?: string; + /** policeUnitId **/ + policeUnitId?: string; + /** name **/ + name?: string; + /** type **/ + type?: BaseEnum; + /** province **/ + province?: string; + /** city **/ + city?: string; + /** districts **/ + districts?: string; + /** street **/ + street?: string; + /** address **/ + address?: string; + /** point **/ + point?: [number, number]; + /** contactPersonInfo **/ + contactPersonInfo?: { + name: string; + telephone: string; + }; + /** remark **/ + remark?: string; +} diff --git a/superManagement/src/types/views/login.ts b/superManagement/src/types/views/login.ts new file mode 100644 index 0000000..b2e1d24 --- /dev/null +++ b/superManagement/src/types/views/login.ts @@ -0,0 +1,4 @@ +export interface LoginParams { + telephone: string; + password: string; +} diff --git a/superManagement/src/types/views/unitManage/police/assessmentCriteria.ts b/superManagement/src/types/views/unitManage/police/assessmentCriteria.ts new file mode 100644 index 0000000..05a4611 --- /dev/null +++ b/superManagement/src/types/views/unitManage/police/assessmentCriteria.ts @@ -0,0 +1,90 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface CkProjectPagerVo extends BaseTableRowRecord { + name: string; + type: BaseEnum + totalScore: number + remark: string; +} + +export interface CkProjectPagerQueryParams { + name: string; + type: string +} + +export interface SaveOrUpdateCkProjectParams { + /*考核项目id */ + snowFlakeId?: string; + /*考核项目名称 */ + name: string; + /*对应企事业单位类型,可用值:school,hospital,community,bank */ + type: string; + /*考核总分 */ + totalScore: number; + /*备注 */ + remark?: string; +} + +export interface SaveOrUpdateCkGroupParams { + /*考核分组id */ + snowFlakeId?: string; + /*考核项目id */ + ckProjectId?: string; + /*考核组名称 */ + name: string; + /*考核组总分 */ + totalScore: number; + /*备注 */ + remark?: string; +} + +export interface SaveOrUpdateCkItemParams { + /*id */ + snowFlakeId?: string; + /*考核组id */ + ckGroupId: string; + /*考核项名称 */ + name: string; + /*组件类型,可用值:RADIO,MULTIPLE */ + type: string; + /*备注 */ + remark?: string; +} + +export interface SaveOrUpdateCkStandardParams { + /*考核标准id */ + snowFlakeId?: string; + /*考核项id */ + ckItemId: string; + /*标准名 */ + name: string; + /*扣分值 */ + deductionPoints: number; +} + +export interface CkProjectDetailRes { + /*考核分组id */ + ckGroupId: string; + groupRowSpan: number; + /*考核分组名字 */ + groupName: string; + /*考核分组总分 */ + groupTotalScore: number; + /*考核分组备注 */ + groupRemark: string; + /*考核项id */ + ckItemId: string; + itemRowSpan: number; + /*考核项名字 */ + itemName: string; + /*考核项备注 */ + itemRemark: string; + /*考核标准id */ + ckStandardId: string; + /*考核标准条件 */ + standardName: string; + /*扣分数 */ + deductionPoints: number; + /*选择类型,可用值:RADIO,MULTIPLE */ + itemType: BaseEnum; +} diff --git a/superManagement/src/types/views/unitManage/police/assessmentRecord.ts b/superManagement/src/types/views/unitManage/police/assessmentRecord.ts new file mode 100644 index 0000000..9a9a891 --- /dev/null +++ b/superManagement/src/types/views/unitManage/police/assessmentRecord.ts @@ -0,0 +1,58 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface AssessmentRecordPagerVo extends BaseTableRowRecord { + /** 企事业单位名称 **/ + enterprisesUnitName: string; + /** 考核项目名称 **/ + ckProjectName: string; + /** 考核项目总分 **/ + totalScore: number; + /** 考核项目类型 **/ + type: BaseEnum; + /** 考核项目备注 **/ + ckProjectRemark: string; + /** 公安单位名称 **/ + policeUnitName: string; + /** 考核人员签字 **/ + assessmentUserSignature: string; + /** 被考核单位人员签字 **/ + byAssessmentEnterprisesUnitUserSignature: string; + /** 考核备注 **/ + remark: string; + /** 总扣分 **/ + deductionPointsTotal: number; +} + + +export interface AssessmentRecordPagerQueryParams { + type: string +} + +export interface DeductedDetailRes { + /*考核分组id */ + ckGroupId: number; + groupRowSpan: number; + /*考核分组名字 */ + groupName: string; + /*考核分组总分 */ + groupTotalScore: number; + /*考核分组备注 */ + groupRemark: string; + /*考核项id */ + ckItemId: number; + itemRowSpan: number; + /*考核项名字 */ + itemName: string; + /*组件类型,可用值:RADIO,MULTIPLE */ + itemType: BaseEnum; + /*考核项备注 */ + itemRemark: string; + /*考核标准id */ + ckStandardId: number; + /*考核标准 */ + standardName: string; + /*扣分数 */ + deductionPoints: Record; + /*是否选中 */ + isSelected: boolean; +} diff --git a/superManagement/src/types/views/unitManage/police/policeUnit.ts b/superManagement/src/types/views/unitManage/police/policeUnit.ts new file mode 100644 index 0000000..7c38d1b --- /dev/null +++ b/superManagement/src/types/views/unitManage/police/policeUnit.ts @@ -0,0 +1,110 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface PoliceUnitPagerQueryParams { + /** 名称 **/ + name?: string; + /** 代码 **/ + code?: string; + /** 行政区划 **/ + administrativeDivisionCodes?: string[]; + /** 是否启用 **/ + isEnable?: BaseEnum; + /** 审核状态 **/ + checkStatus?: BaseEnum; +} + +export interface PoliceUnitPagerVo extends BaseTableRowRecord { + /** 名称 **/ + name?: string; + /** 代码 **/ + code?: string; + /** 省编码 **/ + province?: string; + /** 省名字 **/ + provinceName?: string; + /** 市编码 **/ + city?: string; + /** 市名字 **/ + cityName?: string; + /** 区/县编码 **/ + districts?: string; + /** 区/县名字 **/ + districtsName?: string; + /** 街道编码 **/ + street?: string; + /** 街道编码 **/ + streetName?: string; + /** 详细地址 **/ + address?: string; + /** 联系人 **/ + contactPersonInfo?: { + name: string; + telephone: string; + }; + /** 是否启用 **/ + isEnable?: BaseEnum; + /** 审核状态 **/ + checkStatus?: BaseEnum; +} + +export interface EnterprisesUnitPagerQueryParams { + /** 公安单位id **/ + policeUnitId: string; +} + +export interface EnterprisesUnitPagerVo extends BaseTableRowRecord { + /** 名字 **/ + name?: string; + type: BaseEnum + /** 公安单位id **/ + policeUnitId: string; + /** 省编码 **/ + province?: string; + /** 省名称 **/ + provinceName?: string; + /** 市编码 **/ + city?: string; + /** 市名称 **/ + cityName?: string; + /** 区编码 **/ + districts?: string; + /** 区名称 **/ + districtsName?: string; + /** 街编码 **/ + street?: string; + /** 街名称 **/ + streetName?: string; + /** 地址 **/ + address?: string; + point: [number, number] + /** 联系方式 **/ + contactPersonInfo?: { + name: string; + telephone: string; + }; + /** 备注 **/ + remark?: string; +} + +export interface EnterprisesUnitSaveOrUpdateParams { + /** id **/ + snowFlakeId?: string; + /** 公安单位id **/ + policeUnitId: string; + /** 名称 **/ + name: string; + /** 类型 **/ + type: string; + /** 行政区划编码 **/ + administrativeDivisionCodes: string[]; + /** 详细地址 **/ + address?: string; + point?: [number, number] + /** 联系人 **/ + contactPersonInfo?: { + name: string; + telephone: string; + }; + /** 备注 **/ + remark?: string; +} diff --git a/superManagement/src/types/views/unitManage/securityUnit.ts b/superManagement/src/types/views/unitManage/securityUnit.ts new file mode 100644 index 0000000..b6a0a26 --- /dev/null +++ b/superManagement/src/types/views/unitManage/securityUnit.ts @@ -0,0 +1,52 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface SecurityUnitPagerQueryParams { + /** 名称 **/ + name?: string; + /** 社会编码 **/ + socialCode?: string; + /** 行政区划编码 **/ + administrativeDivisionCodes?: string[]; + /** 是否启用 **/ + isEnable?: number; + /** 审核状态 **/ + checkStatus?: number; +} + +export interface SecurityUnitPagerVo extends BaseTableRowRecord { + /** 名称 **/ + name?: string; + /** 社会编码 **/ + socialCode?: string; + /** 营业执照 **/ + businessLicense?: string; + /** 法人信息 **/ + legalPersonInfo?: { + name: string; + telephone: string; + }; + /** 省编码 **/ + province?: string; + /** 省名字 **/ + provinceName?: string; + /** 市编码 **/ + city?: string; + /** 市名字 **/ + cityName?: string; + /** 区/县编码 **/ + districts?: string; + /** 区/县名字 **/ + districtsName?: string; + /** 街道编码 **/ + street?: string; + /** 街道编码 **/ + streetName?: string; + /** 详细地址 **/ + address?: string; + /** 公司性质 **/ + nature?: string; + /** 是否启用 **/ + isEnable?: BaseEnum; + /** 审核状态 **/ + checkStatus?: BaseEnum; +} diff --git a/superManagement/src/utils/aMapUtil.ts b/superManagement/src/utils/aMapUtil.ts new file mode 100644 index 0000000..0d25246 --- /dev/null +++ b/superManagement/src/utils/aMapUtil.ts @@ -0,0 +1,18 @@ +import AMapLoader from "@amap/amap-jsapi-loader"; +import {MapPlugins} from "@/types/components/map"; + +export const initMap = (plugins?: MapPlugins[]): Promise => new Promise((resolve, reject) => { + //@ts-ignore + window._AMapSecurityConfig = { + securityJsCode: __APP_ENV.VITE_APP_SECURITY_JS_CODE + } + AMapLoader.load({ + key: __APP_ENV.VITE_APP_GAODE_KEY, + version: __APP_ENV.VITE_APP_GAODE_VERSION, + plugins + }).then((aMap: typeof AMap) => { + resolve(aMap) + }).catch(err => { + reject(err) + }) +}) diff --git a/superManagement/src/utils/index.ts b/superManagement/src/utils/index.ts new file mode 100644 index 0000000..257081a --- /dev/null +++ b/superManagement/src/utils/index.ts @@ -0,0 +1,17 @@ +import {ceil, divide} from "lodash-es"; + +/** + * 将文件大小转为字符串格式 + * @param fileSizeInBytes + */ +export const convertFileSizeToStr = (fileSizeInBytes: number): string => { + if (fileSizeInBytes < 1024) { + return fileSizeInBytes + "B"; + } else if (fileSizeInBytes < 1024 * 1024) { + return (ceil(divide(fileSizeInBytes, 1024), 2)) + "KB"; + } else if (fileSizeInBytes < 1024 * 1024 * 1024) { + return (ceil(divide(fileSizeInBytes, (1024 * 1024)), 2)) + "MB"; + } else { + return (ceil(divide(fileSizeInBytes, (1024 * 1024 * 1024)), 2)) + "GB"; + } +} diff --git a/superManagement/src/utils/minioUtil.ts b/superManagement/src/utils/minioUtil.ts new file mode 100644 index 0000000..6b4e91f --- /dev/null +++ b/superManagement/src/utils/minioUtil.ts @@ -0,0 +1,26 @@ +import api from "@/axios"; +import dayjs from "dayjs"; +import {uuid} from "vue-uuid"; + +/** + * 生成一个简单的对象文件地址 + * @param fileName 原始文件名 + * @param parentDir 上级目录 + */ +export const generateSimpleObjectName = (fileName: string, parentDir?: String): string => { + let objectName = parentDir + dayjs().format('/YYYY/MM/DD/') + uuid.v4().replace(/-/g, ''); + if (fileName && fileName.length > 0) { + objectName += fileName.substring(fileName.lastIndexOf('.')) + } + return objectName; +} + +/** + * 获取生成预签名的 URL + */ +export const getResignedObjectUrl = async (bucketName: string, objectName: string): Promise => { + return (await api.get('/common/getResignedObjectUrl', { + bucketName, + objectName + })).data as string; +} diff --git a/superManagement/src/utils/rsaUtil.ts b/superManagement/src/utils/rsaUtil.ts new file mode 100644 index 0000000..935502b --- /dev/null +++ b/superManagement/src/utils/rsaUtil.ts @@ -0,0 +1,16 @@ +import {JSEncrypt} from "jsencrypt"; + +const rsa = new JSEncrypt() +rsa.setPublicKey(__APP_ENV.VITE_APP_RSA_PUBLIC_KEY) + +const encryptStr = (text: string): string => { + const r = rsa.encrypt(text); + if (!r) { + throw "加密失败"; + } + return r; +} + +export default { + encryptStr +} diff --git a/superManagement/src/views/data/components/EnterprisesUnitInfoWindowContent.vue b/superManagement/src/views/data/components/EnterprisesUnitInfoWindowContent.vue new file mode 100644 index 0000000..f43361a --- /dev/null +++ b/superManagement/src/views/data/components/EnterprisesUnitInfoWindowContent.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/superManagement/src/views/data/dataOverview.vue b/superManagement/src/views/data/dataOverview.vue new file mode 100644 index 0000000..a10b43f --- /dev/null +++ b/superManagement/src/views/data/dataOverview.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/superManagement/src/views/index.vue b/superManagement/src/views/index.vue new file mode 100644 index 0000000..9c1e237 --- /dev/null +++ b/superManagement/src/views/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/superManagement/src/views/login.vue b/superManagement/src/views/login.vue new file mode 100644 index 0000000..b2cabb2 --- /dev/null +++ b/superManagement/src/views/login.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/superManagement/src/views/test.vue b/superManagement/src/views/test.vue new file mode 100644 index 0000000..63c312f --- /dev/null +++ b/superManagement/src/views/test.vue @@ -0,0 +1,4 @@ + + diff --git a/superManagement/src/views/unitManage/police/assessmentCriteria/index.ts b/superManagement/src/views/unitManage/police/assessmentCriteria/index.ts new file mode 100644 index 0000000..b3137ff --- /dev/null +++ b/superManagement/src/views/unitManage/police/assessmentCriteria/index.ts @@ -0,0 +1,188 @@ +import { + CkProjectDetailRes, + SaveOrUpdateCkGroupParams, + SaveOrUpdateCkItemParams, SaveOrUpdateCkProjectParams, SaveOrUpdateCkStandardParams +} from "@/types/views/unitManage/police/assessmentCriteria.ts"; +import {deleteDataModal, submitSimpleFormModal} from "@/components/tsx/ModalPro.tsx"; +import api from "@/axios"; +import {message} from "ant-design-vue"; +import {dictSelectNodes} from "@/config/dict.ts"; + +export const saveOrUpdateCkProject = (params: SaveOrUpdateCkProjectParams = { + name: '', + totalScore: 100, + remark: '', + type: 'party_government' +}, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核项目', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '考核项目名称', + required: true + }, + type: { + type: 'select', + label: '考核类型', + required: true, + options: dictSelectNodes('EnterprisesUnitType') + }, + totalScore: { + type: 'inputNumber', + label: '总分', + required: true, + componentsProps: { + precision: 0 + } + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkProject', params) + message.success(resp.message) + callback && callback() + } + }) +} + +export const deleteCkProjectById = (name: string, ckProjectId: string, callback: Function) => { + deleteDataModal(name, async () => { + const resp = await api.delete('/assessmentCriteria/deleteCkProjectById', { + ckProjectId + }) + message.success(resp.message) + callback && callback(); + }) +} + +export const ckProjectDetail = async (ckProjectId: string): Promise => { + const {data} = await api.get('/assessmentCriteria/ckProjectDetail', {ckProjectId}) + + const groupRowSpan: Record = {} + const itemRowSpan: Record = {} + + data.forEach((item, index) => { + //如果第一次没有值 + if (item.ckGroupId) { + if (!groupRowSpan[item.ckGroupId]) { + groupRowSpan[item.ckGroupId] = {count: 1, firstIndex: index} + } else { + groupRowSpan[item.ckGroupId].count++; + data[index].groupRowSpan = 0 + } + } + + if (item.ckItemId) { + if (!itemRowSpan[item.ckItemId]) { + itemRowSpan[item.ckItemId] = {count: 1, firstIndex: index} + } else { + itemRowSpan[item.ckItemId].count++; + data[index].itemRowSpan = 0 + } + } + }) + + Object.values(groupRowSpan).forEach(({count, firstIndex}) => { + data[firstIndex].groupRowSpan = count; + }) + + Object.values(itemRowSpan).forEach(({count, firstIndex}) => { + data[firstIndex].itemRowSpan = count; + }) + + return data +} + +export const saveOrUpdateCkGroup = (params: SaveOrUpdateCkGroupParams, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核分组', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '分组名字', + required: true + }, + totalScore: { + type: 'inputNumber', + label: '分组总分', + required: true, + componentsProps: { + precision: 0 + } + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkGroup', params) + message.success(resp.message) + callback && callback() + } + }) +} + +export const saveOrUpdateCkItem = (params: SaveOrUpdateCkItemParams, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核项', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '考核项', + required: true + }, + type: { + type: 'radioGroup', + label: '控件类型', + required: true, + options: dictSelectNodes('SelectType') + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkItem', params) + message.success(resp.message) + callback && callback() + } + }) +} + +export const saveOrUpdateCkStandard = (params: SaveOrUpdateCkStandardParams, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核标准', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '标准', + required: true + }, + deductionPoints: { + type: 'inputNumber', + label: '扣分值', + required: true, + componentsProps: { + precision: 1 + } + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkStandard', params) + message.success(resp.message) + callback && callback() + } + }) +} + + diff --git a/superManagement/src/views/unitManage/police/assessmentCriteria/index.vue b/superManagement/src/views/unitManage/police/assessmentCriteria/index.vue new file mode 100644 index 0000000..fe62cb5 --- /dev/null +++ b/superManagement/src/views/unitManage/police/assessmentCriteria/index.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/superManagement/src/views/unitManage/police/assessmentRecord/index.tsx b/superManagement/src/views/unitManage/police/assessmentRecord/index.tsx new file mode 100644 index 0000000..0a62bbe --- /dev/null +++ b/superManagement/src/views/unitManage/police/assessmentRecord/index.tsx @@ -0,0 +1,103 @@ +import api from "@/axios"; +import {AssessmentRecordPagerVo, DeductedDetailRes} from "@/types/views/unitManage/police/assessmentRecord.ts"; +import {ColumnsType} from "ant-design-vue/es/table"; +import {Modal, Table} from "ant-design-vue"; + +export const deductedDetail = async (assessmentRecord: AssessmentRecordPagerVo) => { + const {data} = await api.get('/assessmentRecord/deductedDetail', {assessmentRecordId: assessmentRecord.snowFlakeId}) + const groupRowSpan: Record = {} + const itemRowSpan: Record = {} + + data.forEach((item, index) => { + //如果第一次没有值 + if (item.ckGroupId) { + if (!groupRowSpan[item.ckGroupId]) { + groupRowSpan[item.ckGroupId] = {count: 1, firstIndex: index} + } else { + groupRowSpan[item.ckGroupId].count++; + data[index].groupRowSpan = 0 + } + } + + if (item.ckItemId) { + if (!itemRowSpan[item.ckItemId]) { + itemRowSpan[item.ckItemId] = {count: 1, firstIndex: index} + } else { + itemRowSpan[item.ckItemId].count++; + data[index].itemRowSpan = 0 + } + } + }) + + Object.values(groupRowSpan).forEach(({count, firstIndex}) => { + data[firstIndex].groupRowSpan = count; + }) + + Object.values(itemRowSpan).forEach(({count, firstIndex}) => { + data[firstIndex].itemRowSpan = count; + }) + + const ckProjectDetailTableColumns: ColumnsType = [ + { + dataIndex: 'groupName', + title: '考核分组', + customCell: (_record) => { + return { + rowspan: _record.groupRowSpan + } + }, + customRender: ({record: _record}) => { + return

+

{_record.groupName}({_record.groupTotalScore})

+

{_record.groupRemark}

+
+ } + }, { + dataIndex: 'itemName', + title: '考核项', + customCell: (_record) => { + return { + rowspan: _record.itemRowSpan + } + }, + customRender: ({record: _record}) => { + if (!_record.ckItemId) { + return '/' + } + return
+

{_record.itemName}({_record.itemType?.label}) +

+
+ } + }, { + dataIndex: 'standardName', + title: '标准', + customRender: ({record: _record}) => { + if (!_record.ckStandardId) { + return '/' + } + return
+

{_record.standardName}扣{_record.deductionPoints}分

+
+ } + } + ] + + Modal.info({ + title: `【${assessmentRecord.enterprisesUnitName}/${assessmentRecord.ckProjectName}】扣分详情`, + icon: ' ', + width: '80%', + centered: true, + content: () =>
+
+
+ }) + +} diff --git a/superManagement/src/views/unitManage/police/assessmentRecord/index.vue b/superManagement/src/views/unitManage/police/assessmentRecord/index.vue new file mode 100644 index 0000000..2800200 --- /dev/null +++ b/superManagement/src/views/unitManage/police/assessmentRecord/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/superManagement/src/views/unitManage/police/unitManage/index.tsx b/superManagement/src/views/unitManage/police/unitManage/index.tsx new file mode 100644 index 0000000..42d396a --- /dev/null +++ b/superManagement/src/views/unitManage/police/unitManage/index.tsx @@ -0,0 +1,289 @@ +import {TableProMaxProps, TableProMaxSlots} from "@/types/components/table"; +import { + EnterprisesUnitPagerQueryParams, + EnterprisesUnitPagerVo, EnterprisesUnitSaveOrUpdateParams, + PoliceUnitPagerVo +} from "@/types/views/unitManage/police/policeUnit.ts"; +import {ref} from "vue"; +import {FormExpose} from "ant-design-vue/es/form/Form"; +import {ComponentExposed} from "vue-component-type-helpers"; +import MapContainer from "@/components/aMap/MapContainer.vue"; +import {FormProMaxItemOptions} from "@/types/components/form"; +import {dictSelectNodes} from "@/config/dict.ts"; +import {AutoComplete, Button, Input, message, Modal, Space} from "ant-design-vue"; +import api from "@/axios"; +import TableProMax from "@/components/table/TableProMax.vue"; +import {deleteDataModal} from "@/components/tsx/ModalPro.tsx"; +import {PageParams} from "@/types/hooks/useTableProMax.ts"; +import FormProMax from "@/components/form/FormProMax.vue"; +import {debounce} from "lodash-es"; + +type _TableProps = TableProMaxProps; +type _FormType = EnterprisesUnitSaveOrUpdateParams & { + contactPersonInfoName?: string; + contactPersonInfoTelephone?: string +} +const saveOrUpdateEnterprisesUnit = (params: _FormType, callback: Function) => { + const _formRef = ref(null) + const _mapRef = ref>(null) + const _formParams = ref<_FormType>({...params}) + + let city = ''; + const initMarker = (map: AMap.Map) => { + //添加maker点 设置point + const maker = new AMap.Marker({ + position: _formParams.value.point, + draggable: true + }) + maker.on("dragend", ({lnglat}) => { + _formParams.value.point = lnglat + }) + map.clearMap() + map.add(maker) + map.setFitView() + } + const autoAddress = ref[]>([]) + + const _formOptions = ref>({ + name: { + type: 'custom', + label: '单位名称', + required: true, + customRender: () => { + return ) => { + _formParams.value.point = options.extData?.location; + _formParams.value.address = options.extData?.address; + initMarker(_mapRef.value?.mapInstance) + }} + onSearch={debounce((val: string) => { + //@ts-ignore + const auto = new AMap.AutoComplete({ + city: city, + input: "tipinput", + citylimit: true + }); + auto.search(val, (status, result) => { + if (status === 'complete') { + autoAddress.value = result.tips?.map(e => { + return { + value: e.name, + label: e.name, + extData: { + district: e.district, + address: e.address, + location: e.location + } + } as SelectNodeVo + }) + } else { + autoAddress.value = []; + } + }) + }, 300)} + v-slots={{ + option: (item: SelectNodeVo) => { + return
+

{item.label}

+

{item.extData?.district} {item.extData?.address}

+
+ } + }} + > + +
+ } + }, + type: { + type: 'select', + label: '单位类型', + required: true, + options: dictSelectNodes('EnterprisesUnitType') + }, + administrativeDivisionCodes: { + type: 'administrativeDivisionTree', + label: '行政区划', + required: true, + componentsProps: { + displayRender: ({labels}): string => { + city = labels[1] + return labels.join(' / '); + } + } + }, + address: { + type: 'inputTextArea', + label: '详细地址', + }, + map: { + type: 'custom', + label: '经纬度', + customRender: () => { + const contextMenu = new AMap.ContextMenu(); + contextMenu.addItem('标记', () => { + const {lng, lat} = contextMenu.getPosition() + _formParams.value.point = [lng, lat] + initMarker(map) + }, 0) + map.on('rightclick', ({lnglat}) => { + contextMenu.open(map, lnglat) + }) + if (_formParams.value.point) { + initMarker(map) + } + }} + > + + }, + contactPersonInfoName: { + type: 'input', + label: '联系人名称' + }, + contactPersonInfoTelephone: { + type: 'input', + label: '联系人电话' + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }) + Modal.confirm({ + title: params.snowFlakeId ? `【${params.name}】 信息编辑` : '新增企事业单位', + width: 600, + icon: ' ', + centered: true, + content: () => , + onOk: async () => { + await _formRef.value?.validate() + const resp = await api.post('/enterprisesUnit/saveOrUpdate', { + ..._formParams.value, + contactPersonInfo: { + name: _formParams.value.contactPersonInfoName, + telephone: _formParams.value.contactPersonInfoTelephone + } + }) + message.success(resp.message) + callback && callback() + } + }) +} + +export const showEnterprisesUnit = (policeUnitPagerVo: PoliceUnitPagerVo) => { + const _tableRef = ref>(null) + const _columns: _TableProps['columns'] = [ + { + dataIndex: 'name', + title: '名称' + }, { + dataIndex: 'type', + title: '类型', + customRender: ({text}) => text?.label + }, { + dataIndex: 'contactPersonInfo', + title: '联系人', + ellipsis: true, + customRender: ({text}) => text?.name + "/" + text.telephone + }, { + dataIndex: 'province', + title: '行政区划', + ellipsis: true, + customRender: ({record}) => [record.provinceName, record.cityName, record.districtsName, record.streetName].filter(Boolean).join("/") + }, { + dataIndex: 'address', + title: '详细地址', + ellipsis: true + }, { + dataIndex: 'remark', + title: '备注' + }, { + dataIndex: 'createTime', + title: '创建时间' + }, { + dataIndex: 'opt', + title: '操作', + customRender: ({record}) => + + + + } + ] + const _reqApi: _TableProps["requestApi"] = (params) => { + (params as PageParams).params.policeUnitId = policeUnitPagerVo.snowFlakeId + return api.post('/enterprisesUnit/pager', params) + } + Modal.info({ + title: `【${policeUnitPagerVo.name}】 管辖企事业单位`, + width: '80%', + centered: true, + maskClosable: true, + content: () => { + return + + + + } + } as TableProMaxSlots} + /> + }) +} diff --git a/superManagement/src/views/unitManage/police/unitManage/index.vue b/superManagement/src/views/unitManage/police/unitManage/index.vue new file mode 100644 index 0000000..e8f9ba6 --- /dev/null +++ b/superManagement/src/views/unitManage/police/unitManage/index.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/superManagement/src/views/unitManage/police/unitManage/index.vue.bak b/superManagement/src/views/unitManage/police/unitManage/index.vue.bak new file mode 100644 index 0000000..aa32290 --- /dev/null +++ b/superManagement/src/views/unitManage/police/unitManage/index.vue.bak @@ -0,0 +1,269 @@ + + + + + diff --git a/superManagement/src/views/unitManage/securityUnit/index.vue b/superManagement/src/views/unitManage/securityUnit/index.vue new file mode 100644 index 0000000..9af6903 --- /dev/null +++ b/superManagement/src/views/unitManage/securityUnit/index.vue @@ -0,0 +1,152 @@ + + + + + + diff --git a/superManagement/src/vite-env.d.ts b/superManagement/src/vite-env.d.ts new file mode 100644 index 0000000..c061ab6 --- /dev/null +++ b/superManagement/src/vite-env.d.ts @@ -0,0 +1,33 @@ +/// +interface ImportMetaEnv { + // 项目名称 + readonly VITE_APP_NAME: string; + // 当前环境 + readonly VITE_APP_ENV: 'development' | 'production'; + // 启动端口 + readonly VITE_APP_PORT: number; + // 模块名称 + readonly VITE_APP_MODULE_NAME: string; + + // axios + readonly VITE_APP_BASE_API: string; + readonly VITE_APP_PROXY_URL: string; + + // minio + readonly VITE_APP_MINIO_URL: string + readonly VITE_APP_MINIO_BUCKET: string + + // RSA公钥 + readonly VITE_APP_RSA_PUBLIC_KEY: string; + + // 高德 + VITE_APP_GAODE_KEY: string + VITE_APP_GAODE_VERSION: string + VITE_APP_SECURITY_JS_CODE: string +} + +declare module '*.vue' { + import {DefineComponent} from "vue" + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/superManagement/tsconfig.app.json b/superManagement/tsconfig.app.json new file mode 100644 index 0000000..239e8eb --- /dev/null +++ b/superManagement/tsconfig.app.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": [ + "ES2020", + "DOM", + "DOM.Iterable" + ], + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "jsxImportSource": "vue", + /* Linting */ + "strict": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": "./", + /* 配置别名 */ + "paths": { + "@/*": [ + "src/*" + ] + }, + "allowSyntheticDefaultImports": true + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue" + ] +} diff --git a/superManagement/tsconfig.json b/superManagement/tsconfig.json new file mode 100644 index 0000000..ea9d0cd --- /dev/null +++ b/superManagement/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.node.json" + } + ] +} diff --git a/superManagement/tsconfig.node.json b/superManagement/tsconfig.node.json new file mode 100644 index 0000000..8aeefc6 --- /dev/null +++ b/superManagement/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2023" + ], + "module": "ESNext", + "skipLibCheck": true, + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + /* Linting */ + "strict": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "vite.config.ts" + ] +} diff --git a/superManagement/vite.config.ts b/superManagement/vite.config.ts new file mode 100644 index 0000000..6151972 --- /dev/null +++ b/superManagement/vite.config.ts @@ -0,0 +1,88 @@ +import {defineConfig, loadEnv} from 'vite' +import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite'; +import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers'; +import * as path from "node:path"; +import vueJsx from '@vitejs/plugin-vue-jsx' + +const pathSrc = path.resolve(__dirname, 'src'); + +// https://vitejs.dev/config/ +export default defineConfig(({mode}) => { + const env: Record = loadEnv(mode, process.cwd(), '') + return { + define: { + __APP_ENV: JSON.stringify(env) + }, + base: `/${env['VITE_APP_MODULE_NAME']}/`, + plugins: [ + vue(), + vueJsx(), + Components({ + resolvers: [ + AntDesignVueResolver({importStyle: false}) + ] + }) + ], + resolve: { + alias: { + '@': pathSrc, + } + }, + server: { + host: '0.0.0.0', + port: parseInt(env['VITE_APP_PORT']), + open: false, + proxy: { + [env["VITE_APP_BASE_API"]]: { + target: env["VITE_APP_PROXY_URL"], + changeOrigin: true, + secure: false, + rewrite: path => path.replace(RegExp(`^${env['VITE_APP_BASE_API']}`), '') + } + } + }, + build: { + outDir: env['VITE_APP_MODULE_NAME'], + target: 'modules', + chunkSizeWarningLimit: 1500, + minify: 'terser', + terserOptions: { + compress: { + //生产环境时移除console + drop_console: env['VITE_DROP_CONSOLE'] as unknown as boolean, + drop_debugger: env['VITE_DROP_CONSOLE'] as unknown as boolean, + }, + format: { + //删除注释 + comments: false + } + }, + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + return id + .toString() + .split('node_modules/')[1] + .split('/')[0] + .toString(); + } + }, + chunkFileNames(chunkInfo) { + const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/') : []; + const fileName = + facadeModuleId[facadeModuleId.length - 2] || '[name]'; + return `js/${fileName}/[name].[hash].js`; + } + } + } + }, + css: { + preprocessorOptions: { + api: 'modern-compiler' + } + } + } + +})