From aa6a44789d8c53775aaef52d1beab8dfc2ce781b Mon Sep 17 00:00:00 2001 From: fangjiakai <450850793@qq.com> Date: Mon, 17 Nov 2025 17:14:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 13 + .gitignore | 14 + README.md | 75 +++++ blessed_by_buddha.js | 66 ++++ eslint.config.js | 48 +++ jjb.babel.js | 23 ++ jjb.config.js | 77 +++++ jsconfig.json | 9 + package.json | 47 +++ public/index.html | 54 ++++ src/api/global/index.js | 11 + src/api/mkmjArea/index.js | 25 ++ src/api/mkmjAreaGate/index.js | 24 ++ src/api/mkmjGateLog/index.js | 24 ++ src/api/mkmjGateVideo/index.js | 24 ++ src/api/mkmjPassage/index.js | 25 ++ src/components/index.js | 1 + src/enumerate/constant/index.js | 5 + src/enumerate/context/index.js | 8 + src/enumerate/namespace/index.js | 12 + src/main.js | 47 +++ src/pages/Container/Entry/index.js | 31 ++ src/pages/Container/MkmjArea/index.js | 281 ++++++++++++++++++ src/pages/Container/MkmjAreaGate/index.js | 273 +++++++++++++++++ src/pages/Container/MkmjGateLog/index.js | 242 +++++++++++++++ src/pages/Container/MkmjGateVideo/index.js | 234 +++++++++++++++ src/pages/Container/MkmjPassage/index.js | 265 +++++++++++++++++ .../Container/Statistics/AreaList/index.js | 124 ++++++++ .../Container/Statistics/PassageList/index.js | 118 ++++++++ src/pages/Container/Statistics/index.js | 4 + src/pages/Container/index.js | 101 +++++++ src/pages/index.js | 8 + webstorm.config.js | 16 + 33 files changed, 2329 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 README.md create mode 100644 blessed_by_buddha.js create mode 100644 eslint.config.js create mode 100644 jjb.babel.js create mode 100644 jjb.config.js create mode 100644 jsconfig.json create mode 100644 package.json create mode 100644 public/index.html create mode 100644 src/api/global/index.js create mode 100644 src/api/mkmjArea/index.js create mode 100644 src/api/mkmjAreaGate/index.js create mode 100644 src/api/mkmjGateLog/index.js create mode 100644 src/api/mkmjGateVideo/index.js create mode 100644 src/api/mkmjPassage/index.js create mode 100644 src/components/index.js create mode 100644 src/enumerate/constant/index.js create mode 100644 src/enumerate/context/index.js create mode 100644 src/enumerate/namespace/index.js create mode 100644 src/main.js create mode 100644 src/pages/Container/Entry/index.js create mode 100644 src/pages/Container/MkmjArea/index.js create mode 100644 src/pages/Container/MkmjAreaGate/index.js create mode 100644 src/pages/Container/MkmjGateLog/index.js create mode 100644 src/pages/Container/MkmjGateVideo/index.js create mode 100644 src/pages/Container/MkmjPassage/index.js create mode 100644 src/pages/Container/Statistics/AreaList/index.js create mode 100644 src/pages/Container/Statistics/PassageList/index.js create mode 100644 src/pages/Container/Statistics/index.js create mode 100644 src/pages/Container/index.js create mode 100644 src/pages/index.js create mode 100644 webstorm.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..271822f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b840685 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# production +/dist +/demo + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.idea +yarn.lock \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a3da031 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# 微应用模板说明文档 + +## 在线文档 + +https://www.yuque.com/buhangjiecheshen-ymbtb/qc0093/gxdun1dphetcurko + + +## 安装依赖 +项目依赖可通过 **yarn** 或 **npm** 进行安装: + +```bash +# 使用 yarn +yarn + +# 或使用 npm +npm i +``` + +## 开发服务&打包应用 + +```bash +# 启动开发服务 +yarn serve: +# 或 +npm run serve: + +# 开发环境打包 +yarn build: +# 或 +npm run build: +``` + +## 路由配置&路由访问&自动化路由 +所有页面必须放在`src/pages/container`目录下,启动访问页面请在浏览器地址栏输入`//container/<你的路由页面文件名称>` +解释: +1. 所有页面组件命名为`index.js`或`index.jsx`,必须放在一个首字母大写的文件中。 +2. `container`为固定路径访问格式 +3. ``为应用的唯一标识符,也是应用路由的`basename`,在底座中用于区分其他应用。可在根目录 `jjb.config.js` 文件的 `appIdentifier` 节点中进行修改。 +4. 自动化路由将根据`pages/container`中的路由页面文件自动生成路由树。 +5. `id`匹配路由,文件夹命名`_id` + +## 应用接口环境配置 +应用接口环境相关配置在根目录 `jjb.config.js` 文件的 `environment` 节点中进行定义。 + +## 应用开发服务配置 +应用开发服务相关配置在根目录 `jjb.config.js` 文件的 `server` 节点中进行定义。 + +## Babel 配置 +应用的 `Babel` 配置在根目录 `jjb.babel.js` 文件中进行管理。 + +## 目录说明 + +1. `src/api/` 配置各个 store 模块的接口数据。 +2. `src/components/` 全局公共组件。 +3. `src/enumerate/` 全局各种枚举配置。 +4. `src/pages/` 页面文件目录。 +5. `src/main.js` 应用的入口文件。 + +## 核心依赖 +1. `@cqsjjb/jjb-common-decorator` + 1. 公共装饰器库,内部包含: + 1. 按钮权限处理 + 2. antd/Table 控制 + 3. 文本重命名处理 + 4. 具体使用方式可参考各个模块的 `d.ts`。 +2. `@cqsjjb/jjb-common-lib` + 1. 公共工具库,具体 API 使用请查看 `d.ts` +3. `@cqsjjb/jjb-dva-runtime` + 1. 核心运行时,基于 `dvajs` 实现。 + 1. 应用核心依赖模块 + 2. 应用的自动化路由 + 3. `store` 模块接口数据处理 + 4. 均基于此依赖实现,具体使用方式请查看 `d.ts`。 +4. `@cqsjjb/jjb-react-admin-component` + 1. 公共组件库,具体组件使用方式请查看 `d.ts`。 diff --git a/blessed_by_buddha.js b/blessed_by_buddha.js new file mode 100644 index 0000000..340fa53 --- /dev/null +++ b/blessed_by_buddha.js @@ -0,0 +1,66 @@ +/* + _ooOoo_ + o8888888o + 88" . "88 + (| -_- |) + O\ = /O + ____/`---'\____ + . ' \\| |// `. + / \\||| : |||// \ + / _||||| -:- |||||- \ + | | \\\ - /// | | + | \_| ''\---/'' | | + \ .-\__ `-` ___/-. / + ___`. .' /--.--\ `. . __ + ."" '< `.___\_<|>_/___.' >'"". + | | : `- \`.;`\ _ /`;.`/ - ` : | | + \ \ `-. \_ __\ /__ _/ .-` / / + ======`-.____`-.___\_____/___.-`____.-'====== + `=---=' + + ............................................. + 佛祖保佑 永无BUG + 佛曰: + 写字楼里写字间,写字间里程序员; + 程序人员写程序,又拿程序换酒钱。 + 酒醒只在网上坐,酒醉还来网下眠; + 酒醉酒醒日复日,网上网下年复年。 + 但愿老死电脑间,不愿鞠躬老板前; + 奔驰宝马贵者趣,公交自行程序员。 + 别人笑我忒疯癫,我笑自己命太贱; + 不见满街漂亮妹,哪个归得程序员? + */ + +const blessedByBuddha + = "%c _ooOoo_\n" + + " o8888888o\n" + + " 88\" . \"88\n" + + " (| -_- |)\n" + + " O\\ = /O\n" + + " ____/`---'\\____\n" + + " . ' \\\\| |// `.\n" + + " / \\\\||| : |||// \\\n" + + " / _||||| -:- |||||- \\\n" + + " | | \\\\\\ - /// | |\n" + + " | \\_| ''\\---/'' | |\n" + + " \\ .-\\__ `-` ___/-. /\n" + + " ___`. .' /--.--\\ `. . __\n" + + " .\"\" '< `.___\\_<|>_/___.' >'\"\".\n" + + " | | : `- \\`.;`\\ _ /`;.`/ - ` : | |\n" + + " \\ \\ `-. \\_ __\\ /__ _/ .-` / /\n" + + " ======`-.____`-.___\\_____/___.-`____.-'======\n" + + " `=---='\n" + + "\n" + + "%c .............................................\n" + + " 佛祖保佑 永无BUG\n" + + "\n" + + "%c 佛曰:\n" + + " 写字楼里写字间,写字间里程序员;\n" + + " 程序人员写程序,又拿程序换酒钱。\n" + + " 酒醒只在网上坐,酒醉还来网下眠;\n" + + " 酒醉酒醒日复日,网上网下年复年。\n" + + " 但愿老死电脑间,不愿鞠躬老板前;\n" + + " 奔驰宝马贵者趣,公交自行程序员。\n" + + " 别人笑我忒疯癫,我笑自己命太贱;\n" + + " 不见满街漂亮妹,哪个归得程序员?"; +console.log(blessedByBuddha, "color:#ffd700", "color:red", "color:#1e80ff"); diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..06fcf00 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,48 @@ +import antfu from "@antfu/eslint-config"; + +export default antfu({ + formatters: { + html: false, + css: true, + }, + test: false, + typescript: true, + react: true, + vue: false, + markdown: false, + stylistic: { + semi: true, + quotes: "double", + }, + overrides: { + react: { + "react/no-comment-textnodes": "off", + "react-hooks-extra/no-unnecessary-use-prefix": "off", + "react-hooks-extra/prefer-use-state-lazy-initialization": "off", + "react-hooks/exhaustive-deps": "off", + }, + javascript: { + "no-console": process.env.NODE_ENV === "production" ? "error" : "warn", + "no-debugger": process.env.NODE_ENV === "production" ? "error" : "warn", + "no-alert": process.env.NODE_ENV === "production" ? "error" : "warn", + "no-restricted-syntax": [ + "error", + { + selector: "VariableDeclarator[id.name='pd']", + message: "不允许使用 pd,请改用有语义化的变量名", + }, + { + selector: "ObjectExpression > Property[key.name='pd']", + message: "不允许使用 pd,请改用有语义化的变量名", + }, + ], + "no-unused-vars": ["error", { varsIgnorePattern: "^React$" }], + }, + }, + rules: { + "antfu/top-level-function": "off", + "node/prefer-global/process": "off", + "dot-notation": "off", + "linebreak-style": ["off", "windows"], + }, +}); diff --git a/jjb.babel.js b/jjb.babel.js new file mode 100644 index 0000000..e58cbef --- /dev/null +++ b/jjb.babel.js @@ -0,0 +1,23 @@ +module.exports = { + compact: false, + // 插件 + plugins: [ + [ + "@babel/plugin-proposal-decorators", + { + legacy: true, + }, + ], + ], + // 预设 + presets: [ + ["@babel/preset-env", { + targets: { + browsers: ["ie >= 10"], + }, + }], + ["@babel/preset-react", { + runtime: "automatic", + }], + ], +}; diff --git a/jjb.config.js b/jjb.config.js new file mode 100644 index 0000000..22107a9 --- /dev/null +++ b/jjb.config.js @@ -0,0 +1,77 @@ +module.exports = { + // 应用后端git地址,部署上线需要 + javaGit: "", + // 应用后端仓库名称,部署上线需要 + javaGitName: "", + // 环境配置 + environment: { + development: { + // 应用后端分支名称,部署上线需要 + javaGitBranch: "", + // 接口服务地址 + API_HOST: "http://192.168.10.37:80", + }, + production: { + // 应用后端分支名称,部署上线需要 + javaGitBranch: "", + // 接口服务地址 + API_HOST: "", + }, + }, + // 应用唯一标识符 + appIdentifier: "primeport", + // 应用上下文注入全局变量 + contextInject: { + // 应用Key + appKey: "", + fileUrl: "附件地址", + }, + // public/index.html注入全局变量 + windowInject: { + // 应用标题 + title: "微应用模板", + // 注入css链接集合 + links: [], + element: { + root: { + // 挂载DOM元素ID + id: "root", + }, + }, + // 注入js链接集合 + scripts: [ + "https://api.map.baidu.com/api?v=1.0&type=webgl&ak=OElqFYoKiAH8KFtph8ftLKF5NlNrbCUr" + ], + }, + // 开发服务 + server: { + // 监听端口号 + port: "8080", + // 服务地址 + host: "127.0.0.1", + // 是否自动打开浏览器 + open: true, + }, + // 框架 + framework: { + // ant-design + antd: { + // 全局antd-class-name前缀 + "ant-prefix": "micro-temp", + // 全局字体 + "fontFamily": "PingFangSC-Regular", + // 全局主题色 + "colorPrimary": "#1677ff", + // 全局圆角 + "borderRadius": 2, + }, + }, + // webpack + webpackConfig: { + // 单页面插件 + htmlWebpackPluginOption: { + // 自动注入编译后的文件到public/index.html中 + inject: true, + }, + }, +}; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..4cf89dc --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "src", + "paths": { + "~/*": ["*"] + } + }, + "include": ["src"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c3b2736 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "micro-app", + "version": "2.0.0", + "description": "建教帮微应用模板", + "author": "JJB", + "license": "MIT", + "main": "index.js", + "scripts": { + "serve": "node node_modules/@cqsjjb/scripts/webpack.dev.server.js", + "build": "node node_modules/@cqsjjb/scripts/webpack.build.js", + "push": "jjb-cmd push java production", + "clean-cache": "rimraf node_modules/.cache/webpack", + "serve:development": "cross-env NODE_ENV=development npm run serve", + "serve:production": "cross-env NODE_ENV=production npm run serve", + "build:development": "cross-env NODE_ENV=development npm run build", + "build:production": "cross-env NODE_ENV=production npm run build", + "code-optimization": "node node_modules/@cqsjjb/scripts/code-optimization.js", + "lint": "eslint --ext .js,.jsx,.tsx --fix src" + }, + "dependencies": { + "@ant-design/icons": "latest", + "@ant-design/pro-components": "^2.8.10", + "@cqsjjb/jjb-common-decorator": "latest", + "@cqsjjb/jjb-common-lib": "latest", + "@cqsjjb/jjb-dva-runtime": "latest", + "@cqsjjb/jjb-react-admin-component": "latest", + "ahooks": "^3.9.5", + "antd": "latest", + "dayjs": "^1.11.7", + "lodash-es": "^4.17.21", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zy-react-library": "^1.0.96" + }, + "devDependencies": { + "@antfu/eslint-config": "^5.4.1", + "@babel/plugin-proposal-decorators": "^7.19.3", + "@cqsjjb/scripts": "latest", + "@eslint-react/eslint-plugin": "^2.2.2", + "cross-env": "^7.0.3", + "eslint": "^9.37.0", + "eslint-plugin-format": "^1.0.2", + "eslint-plugin-react-hooks": "^7.0.0", + "eslint-plugin-react-refresh": "^0.4.23", + "typescript": "^5.9.3" + } +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..caf0d15 --- /dev/null +++ b/public/index.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + <% for (const item of $links) { %> + + <% } %> + -- + + + <% for (const item of $scripts) { %> + + <% } %> + + + + + + <% const { root } = $element; %> +
+ + diff --git a/src/api/global/index.js b/src/api/global/index.js new file mode 100644 index 0000000..ba35796 --- /dev/null +++ b/src/api/global/index.js @@ -0,0 +1,11 @@ +export {}; + +// export const riskList = declareRequest( +// "loading", +// "Post > @/xxx", +// "dataSource: [] | res.data || [] & total: 0 | res.totalCount || 0 & pageIndex: 1 | res.pageIndex || 1 & pageSize: 10 | res.pageSize || 10", +// ); +// export const riskDelete = declareRequest( +// "loading", +// "Delete > @/xxx/{id}", +// ); diff --git a/src/api/mkmjArea/index.js b/src/api/mkmjArea/index.js new file mode 100644 index 0000000..a04ff55 --- /dev/null +++ b/src/api/mkmjArea/index.js @@ -0,0 +1,25 @@ +import {declareRequest} from '@cqsjjb/jjb-dva-runtime'; + +export const mkmjAreaList = declareRequest( + 'mkmjAreaLoading', + 'Post > @/primeport/mkmjArea/list', +); +export const mkmjAreaAdd = declareRequest( + 'mkmjAreaLoading', + 'Post > @/primeport/mkmjArea/save' +); +export const mkmjAreaEdit = declareRequest( + 'mkmjAreaLoading', + 'Put > @/primeport/mkmjArea/edit' +); +export const mkmjAreaDelete = declareRequest( + 'mkmjAreaLoading', + 'Delete > @/primeport/mkmjArea/{id}' +); +export const mkmjAreaBatchDelete = declareRequest( + 'mkmjAreaLoading', + 'Delete > @/primeport/mkmjArea/ids/{ids}' +); +export const mkmjAreaInfo = declareRequest('mkmjAreaLoading', 'Get > /primeport/mkmjArea/{id}'); + +export const getStatistics = declareRequest('mkmjAreaLoading', 'Post > @/primeport/mkmjArea/statistics'); diff --git a/src/api/mkmjAreaGate/index.js b/src/api/mkmjAreaGate/index.js new file mode 100644 index 0000000..f24a3d5 --- /dev/null +++ b/src/api/mkmjAreaGate/index.js @@ -0,0 +1,24 @@ +import {declareRequest} from '@cqsjjb/jjb-dva-runtime'; + +export const mkmjAreaGateList = declareRequest( + 'mkmjAreaGateLoading', + 'Post > @/primeport/mkmjAreaGate/list', +); +export const mkmjAreaGateAdd = declareRequest( + 'mkmjAreaGateLoading', + 'Post > @/primeport/mkmjAreaGate/save' +); +export const mkmjAreaGateEdit = declareRequest( + 'mkmjAreaGateLoading', + 'Put > @/primeport/mkmjAreaGate/edit' +); +export const mkmjAreaGateDelete = declareRequest( + 'mkmjAreaGateLoading', + 'Delete > @/primeport/mkmjAreaGate/{id}' +); +export const mkmjAreaGateBatchDelete = declareRequest( + 'mkmjAreaGateLoading', + 'Delete > @/primeport/mkmjAreaGate/ids/{ids}' +); +export const mkmjAreaGateInfo = declareRequest('mkmjAreaGateLoading', 'Get > /primeport/mkmjAreaGate/{id}'); + diff --git a/src/api/mkmjGateLog/index.js b/src/api/mkmjGateLog/index.js new file mode 100644 index 0000000..f8ba189 --- /dev/null +++ b/src/api/mkmjGateLog/index.js @@ -0,0 +1,24 @@ +import {declareRequest} from '@cqsjjb/jjb-dva-runtime'; + +export const mkmjGateLogList = declareRequest( + 'mkmjGateLogLoading', + 'Post > @/primeport/mkmjGateLog/list', +); +export const mkmjGateLogAdd = declareRequest( + 'mkmjGateLogLoading', + 'Post > @/primeport/mkmjGateLog/save' +); +export const mkmjGateLogEdit = declareRequest( + 'mkmjGateLogLoading', + 'Put > @/primeport/mkmjGateLog/edit' +); +export const mkmjGateLogDelete = declareRequest( + 'mkmjGateLogLoading', + 'Delete > @/primeport/mkmjGateLog/{id}' +); +export const mkmjGateLogBatchDelete = declareRequest( + 'mkmjGateLogLoading', + 'Delete > @/primeport/mkmjGateLog/ids/{ids}' +); +export const mkmjGateLogInfo = declareRequest('mkmjGateLogLoading', 'Get > /primeport/mkmjGateLog/{id}'); + diff --git a/src/api/mkmjGateVideo/index.js b/src/api/mkmjGateVideo/index.js new file mode 100644 index 0000000..b45f80c --- /dev/null +++ b/src/api/mkmjGateVideo/index.js @@ -0,0 +1,24 @@ +import {declareRequest} from '@cqsjjb/jjb-dva-runtime'; + +export const mkmjGateVideoList = declareRequest( + 'mkmjGateVideoLoading', + 'Post > @/primeport/mkmjGateVideo/list', +); +export const mkmjGateVideoAdd = declareRequest( + 'mkmjGateVideoLoading', + 'Post > @/primeport/mkmjGateVideo/save' +); +export const mkmjGateVideoEdit = declareRequest( + 'mkmjGateVideoLoading', + 'Put > @/primeport/mkmjGateVideo/edit' +); +export const mkmjGateVideoDelete = declareRequest( + 'mkmjGateVideoLoading', + 'Delete > @/primeport/mkmjGateVideo/{id}' +); +export const mkmjGateVideoBatchDelete = declareRequest( + 'mkmjGateVideoLoading', + 'Delete > @/primeport/mkmjGateVideo/ids/{ids}' +); +export const mkmjGateVideoInfo = declareRequest('mkmjGateVideoLoading', 'Get > /primeport/mkmjGateVideo/{id}'); + diff --git a/src/api/mkmjPassage/index.js b/src/api/mkmjPassage/index.js new file mode 100644 index 0000000..597e5d7 --- /dev/null +++ b/src/api/mkmjPassage/index.js @@ -0,0 +1,25 @@ +import {declareRequest} from '@cqsjjb/jjb-dva-runtime'; + +export const mkmjPassageList = declareRequest( + 'mkmjPassageLoading', + 'Post > @/primeport/mkmjPassage/list', +); +export const mkmjPassageAdd = declareRequest( + 'mkmjPassageLoading', + 'Post > @/primeport/mkmjPassage/save' +); +export const mkmjPassageEdit = declareRequest( + 'mkmjPassageLoading', + 'Put > @/primeport/mkmjPassage/edit' +); +export const mkmjPassageDelete = declareRequest( + 'mkmjPassageLoading', + 'Delete > @/primeport/mkmjPassage/{id}' +); +export const mkmjPassageBatchDelete = declareRequest( + 'mkmjPassageLoading', + 'Delete > @/primeport/mkmjPassage/ids/{ids}' +); +export const mkmjPassageInfo = declareRequest('mkmjPassageLoading', 'Get > /primeport/mkmjPassage/{id}'); + +export const getStatistics = declareRequest('mkmjPassageLoading', 'Post > @/primeport/mkmjPassage/statistics'); diff --git a/src/components/index.js b/src/components/index.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/src/components/index.js @@ -0,0 +1 @@ +export {}; diff --git a/src/enumerate/constant/index.js b/src/enumerate/constant/index.js new file mode 100644 index 0000000..f077757 --- /dev/null +++ b/src/enumerate/constant/index.js @@ -0,0 +1,5 @@ +/** + * 全局常量定义 + */ + +export {}; diff --git a/src/enumerate/context/index.js b/src/enumerate/context/index.js new file mode 100644 index 0000000..2b11e05 --- /dev/null +++ b/src/enumerate/context/index.js @@ -0,0 +1,8 @@ +/** + * 全局上下文定义 + */ + +import React from "react"; + +// 获取antd全局静态方法 +export const InjectContext = React.createContext({}); diff --git a/src/enumerate/namespace/index.js b/src/enumerate/namespace/index.js new file mode 100644 index 0000000..432cb2a --- /dev/null +++ b/src/enumerate/namespace/index.js @@ -0,0 +1,12 @@ +/** + * 全局数据状态管理模块定义 + */ + +import { defineNamespace } from "@cqsjjb/jjb-dva-runtime"; + +export const NS_GLOBAL = defineNamespace("global"); +export const NS_MKMJAREA = defineNamespace("mkmjArea"); +export const NS_MKMJAREAGATE = defineNamespace("mkmjAreaGate"); +export const NS_MKMJGATELOG = defineNamespace("mkmjGateLog"); +export const NS_MKMJGATEVIDEO = defineNamespace("mkmjGateVideo"); +export const NS_MKMJPASSAGE = defineNamespace("mkmjPassage"); diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..c1cdccb --- /dev/null +++ b/src/main.js @@ -0,0 +1,47 @@ +import { setJJBCommonAntdMessage } from "@cqsjjb/jjb-common-lib"; +import { setup } from "@cqsjjb/jjb-dva-runtime"; +import { message } from "antd"; +import dayjs from "dayjs"; +import "dayjs/locale/zh-cn"; +import "../blessed_by_buddha"; + +require("antd/dist/reset.css"); + +dayjs.locale("zh-cn"); +setJJBCommonAntdMessage(message); + +const app = setup(); + +// 非底座环境运行 +if (!window.__POWERED_BY_QIANKUN__) { + // 云组件默认依赖 + window.__coreLib = {}; + window.__coreLib.React = require("react"); + window.__coreLib.ReactDOM = require("react-dom"); + window.__coreLib.jjbCommonLib = require("@cqsjjb/jjb-common-lib"); +} + +/** + * @description 挂载 + * @param props {{ setGlobalState: ({ rendered: boolean }) => void }} + * @returns {Promise<*>} '' + */ +export const mount = async (props) => { + // 云组件默认依赖 + window.__coreLib.React = require("react"); + window.__coreLib.ReactDOM = require("react-dom"); + window.__coreLib.jjbCommonLib = require("@cqsjjb/jjb-common-lib"); + app.mount(props); +}; + +/** + * @description 卸载 + * @param props {object} + * @returns {Promise<*>} '' + */ +export const unmount = async props => app.unmount(props); +/** + * @description 启动 + * @param props + */ +export const bootstrap = async props => app.bootstrap(props); diff --git a/src/pages/Container/Entry/index.js b/src/pages/Container/Entry/index.js new file mode 100644 index 0000000..c51ecfd --- /dev/null +++ b/src/pages/Container/Entry/index.js @@ -0,0 +1,31 @@ +import { ImportCore } from "@cqsjjb/jjb-common-decorator/module"; +import React from "react"; + +export default class Entry extends React.Component { + state = { + Component: undefined, + }; + + componentDidMount() { + if (process.env.app.appKey) { + ImportCore({ + name: "$", + from: "https://cdn.cqjjb.cn/jcloud/use/plugin/b31c9840a57f11ef91cf7f3cabbb7484/latest", + }).then((res) => { + if (res.status) { + this.setState({ Component: res.module?.default }); + } + }); + } + } + + render() { + const { Component } = this.state; + return (Component && process.env.app.appKey) && ( + + ); + } +} diff --git a/src/pages/Container/MkmjArea/index.js b/src/pages/Container/MkmjArea/index.js new file mode 100644 index 0000000..cc2d9b9 --- /dev/null +++ b/src/pages/Container/MkmjArea/index.js @@ -0,0 +1,281 @@ +import {Connect} from "@cqsjjb/jjb-dva-runtime"; +import {Button, Form, message, Modal, Space, Descriptions} from "antd"; +import {useEffect, useState} from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import {NS_MKMJAREA} from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; +import LocationIcon from "zy-react-library/components/Icon/LocationIcon"; +import DictionarySelect from "zy-react-library/components/Select/Dictionary"; +import Map from "zy-react-library/components/Map"; +import MapSelector from "zy-react-library/components/Map/MapSelector"; + +const AREA_TYPE = [ + {name: "人行口门", bianma: "1"}, + {name: "车行口门", bianma: "2"}, + {name: "综合口门", bianma: "3"}, +] + +const AREA_STATUS = [ + {name: "停用", bianma: "0"}, + {name: "正常", bianma: "1"}, + {name: "暂时关闭", bianma: "2"}, +] + +function MkmjArea(props) { + const [addModalVisible, setAddModalVisible] = useState(false); + const [infoModalVisible, setInfoModalVisible] = useState(false); + const [currentId, setCurrentId] = useState(""); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [form] = Form.useForm(); + const {tableProps, getData} = useTable(props["mkmjAreaList"], { + form, + params: { + eqAreaLevel: 1, + } + }); + return ( +
+ }, + ]} + /> + setSelectedRowKeys(selectedRowKeys), + }} + toolBarRender={() => ( + + + + + )} + columns={[ + {dataIndex: "areaParentName", title: "所属区域"}, + {dataIndex: "areaName", title: "口门名称"}, + {dataIndex: "areaType", title: "口门类型",render:(_,record)=>{ + return record.areaType === 1 ? "人行口门" : record.areaType === 2 ? "车行口门" : "综合口门"; + }}, + {dataIndex: "location", title: "地理位置",render:(_,record)=>{ + return `${record.latitude || ""}--${record.longitude || ""}`; + }}, + {dataIndex: "videoNum", title: "视频个数",render:(_,record)=>{ + return record.videoNum || 0; + }}, + { + title: "操作", + align: "center", + width: 200, + render: (_, record) => ( + + + + + + + + ), + }, + ]} + {...tableProps} + /> + { + setAddModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + { + setInfoModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + ); +} + +function AddModalComponent(props) { + const [form] = Form.useForm(); + useEffect(() => { + if (props.currentId) { + props["mkmjAreaInfo"]({id: props.currentId}).then((res) => { + form.setFieldsValue({...res.data, + areaType: Number(res.data.areaType), + areaStatus: Number(res.data.areaStatus), + }); + }); + } + }, [props.currentId]); + const onCancel = () => { + form.resetFields(); + props.onCancel(); + }; + const submit = async (values) => { + await props[!props.currentId ? "mkmjAreaAdd" : "mkmjAreaEdit"]({...values, areaLevel:1, id: props.currentId}); + onCancel(); + props.getData(); + }; + return ( + + form.setFieldValue("areaParentName",label)}/>}, + {name: "areaParentName", label: "所属区域",onlyForLabel:true}, + {name: "areaRange", label: "口门位置"}, + {name: "areaStatus", label: "口门状态",render: FORM_ITEM_RENDER_ENUM.SELECT, items: AREA_STATUS}, + {key:"map",customizeRender:true,render:} + + ]} + /> + + ); +} + +function InfoModalComponent(props) { + const [info, setInfo] = useState({}); + const [mapVisible, setMapVisible] = useState(false); + + useEffect(() => { + if (props.currentId) { + props["mkmjAreaInfo"]({id: props.currentId}).then((res) => { + setInfo(res.data); + }); + } + }, [props.currentId]); + + return ( + 关闭} + title="查看" + loading={props.mkmjArea.loading} + > + { + setMapVisible(true); + }}/>, label: "位置"}, + ]} + /> + + setMapVisible(false)} + longitude={info.longitude} + latitude={info.latitude} + disable={true} + /> + + ); +} + +const AddModal = Connect([NS_MKMJAREA], true)(AddModalComponent); +const InfoModal = Connect([NS_MKMJAREA], true)(InfoModalComponent); +export default Connect([NS_MKMJAREA], true)(MkmjArea); + diff --git a/src/pages/Container/MkmjAreaGate/index.js b/src/pages/Container/MkmjAreaGate/index.js new file mode 100644 index 0000000..7dc8d18 --- /dev/null +++ b/src/pages/Container/MkmjAreaGate/index.js @@ -0,0 +1,273 @@ +import {Connect} from "@cqsjjb/jjb-dva-runtime"; +import {Button, Form, message, Modal, Space, Descriptions} from "antd"; +import {useEffect, useState} from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import {NS_MKMJAREAGATE} from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; +import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; +import LocationIcon from "zy-react-library/components/Icon/LocationIcon"; +import MapSelector from "zy-react-library/components/Map/MapSelector"; +import Map from "zy-react-library/components/Map"; +import HeaderBack from "zy-react-library/components/HeaderBack"; + + + +const GATE_STATUS = [ + {name: "停用", bianma: "0"}, + {name: "正常", bianma: "1"}, + {name: "暂时关闭", bianma: "2"}, +] +const GATE_TYPE = [ + {name: "入", bianma: "1"}, + {name: "出", bianma: "2"}, +] +const GATE_CATEGORY = [ + {name: "人行口门", bianma: "0"}, + {name: "车行口门", bianma: "1"}, + {name: "综合口门", bianma: "2"}, +] + +function MkmjAreaGate(props) { + const {areaId, passageId} = useGetUrlQuery(); + const [addModalVisible, setAddModalVisible] = useState(false); + const [infoModalVisible, setInfoModalVisible] = useState(false); + const [currentId, setCurrentId] = useState(""); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [form] = Form.useForm(); + const {tableProps, getData} = useTable(props["mkmjAreaGateList"], { + form, + params: { + eqAreaId: areaId, + eqPassageId: passageId, + }, + }); + return ( +
+ + +
setSelectedRowKeys(selectedRowKeys), + }} + toolBarRender={() => ( + + + + + )} + columns={[ + {dataIndex: "gateName", title: "闸机名称"}, + {dataIndex: "gateType", title: "闸机类型", render: (_, record) => {return record.gateType === 1 ? "入" : "出"}}, + {dataIndex: "gateCategory", title: "闸机类别", render: (_, record) => {return record.gateCategory === 0 ? "人行口门" : record.gateCategory === 1 ? "车行口门" : "综合口门"}}, + { + title: "操作", + align: "center", + width: 200, + render: (_, record) => ( + + + + + + + ), + }, + ]} + {...tableProps} + /> + { + setAddModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + { + setInfoModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + ); +} + +function AddModalComponent(props) { + const [form] = Form.useForm(); + useEffect(() => { + if (props.currentId) { + props["mkmjAreaGateInfo"]({id: props.currentId}).then((res) => { + form.setFieldsValue({...res.data, + gateType: Number(res.data.gateType), + gateStatus: Number(res.data.gateStatus), + gateCategory: Number(res.data.gateCategory), + }); + }); + } + }, [props.currentId]); + const onCancel = () => { + form.resetFields(); + props.onCancel(); + }; + const submit = async (values) => { + await props[!props.currentId ? "mkmjAreaGateAdd" : "mkmjAreaGateEdit"]({...values, areaId: props.areaId, passageId: props.passageId, id: props.currentId}); + onCancel(); + props.getData(); + }; + return ( + + } + ]} + /> + + ); +} + +function InfoModalComponent(props) { + const [info, setInfo] = useState({}); + const [mapVisible, setMapVisible] = useState(false); + useEffect(() => { + if (props.currentId) { + props["mkmjAreaGateInfo"]({id: props.currentId}).then((res) => { + setInfo(res.data); + }); + } + }, [props.currentId]); + + return ( + 关闭} + title="查看" + loading={props.mkmjAreaGate.loading} + > + { + setMapVisible(true); + }}/>, label: "位置"}, + ]} + /> + + setMapVisible(false)} + longitude={info.longitude} + latitude={info.latitude} + disable={true} + /> + + ); +} + +const AddModal = Connect([NS_MKMJAREAGATE], true)(AddModalComponent); +const InfoModal = Connect([NS_MKMJAREAGATE], true)(InfoModalComponent); +export default Connect([NS_MKMJAREAGATE], true)(MkmjAreaGate); + diff --git a/src/pages/Container/MkmjGateLog/index.js b/src/pages/Container/MkmjGateLog/index.js new file mode 100644 index 0000000..c8484c6 --- /dev/null +++ b/src/pages/Container/MkmjGateLog/index.js @@ -0,0 +1,242 @@ +import {Connect} from "@cqsjjb/jjb-dva-runtime"; +import {Button, Form, message, Modal, Space, Descriptions} from "antd"; +import {useEffect, useState} from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import {NS_MKMJGATELOG} from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; + +function MkmjGateLog(props) { + const [addModalVisible, setAddModalVisible] = useState(false); + const [infoModalVisible, setInfoModalVisible] = useState(false); + const [currentId, setCurrentId] = useState(""); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [form] = Form.useForm(); + const {tableProps, getData} = useTable(props["mkmjGateLogList"], { + form, + }); + return ( +
+ +
setSelectedRowKeys(selectedRowKeys), + }} + toolBarRender={() => ( + + + + + )} + columns={[ + {dataIndex: "areaGateId", title: "闸机id"}, + {dataIndex: "state", title: "状态 0进 1出 2车辆进 3车辆出"}, + {dataIndex: "logTime", title: "时间"}, + {dataIndex: "userId", title: "人员id"}, + {dataIndex: "userName", title: "人员姓名"}, + {dataIndex: "gateType", title: "闸机类型 1-入 2出"}, + {dataIndex: "ex1", title: "车牌号(车辆进出时使用)"}, + {dataIndex: "ex2", title: "备用字段2"}, + {dataIndex: "ex3", title: "备用字段3"}, + {dataIndex: "ex4", title: "备用字段4"}, + {dataIndex: "ex5", title: "备用字段5"}, + { + title: "操作", + align: "center", + width: 200, + render: (_, record) => ( + + + + + + ), + }, + ]} + {...tableProps} + /> + { + setAddModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + { + setInfoModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + ); +} + +function AddModalComponent(props) { + const [form] = Form.useForm(); + useEffect(() => { + if (props.currentId) { + props["mkmjGateLogInfo"]({id: props.currentId}).then((res) => { + form.setFieldsValue(res.data); + }); + } + }, [props.currentId]); + const onCancel = () => { + form.resetFields(); + props.onCancel(); + }; + const submit = async (values) => { + await props[!props.currentId ? "mkmjGateLogAdd" : "mkmjGateLogEdit"]({...values, id: props.currentId}); + onCancel(); + props.getData(); + }; + return ( + + + + ); +} + +function InfoModalComponent(props) { + const [info, setInfo] = useState({}); + useEffect(() => { + if (props.currentId) { + props["mkmjGateLogInfo"]({id: props.currentId}).then((res) => { + setInfo(res.data); + }); + } + }, [props.currentId]); + + return ( + 关闭} + title="查看" + loading={props.mkmjGateLog.loading} + > + + + ); +} + +const AddModal = Connect([NS_MKMJGATELOG], true)(AddModalComponent); +const InfoModal = Connect([NS_MKMJGATELOG], true)(InfoModalComponent); +export default Connect([NS_MKMJGATELOG], true)(MkmjGateLog); + diff --git a/src/pages/Container/MkmjGateVideo/index.js b/src/pages/Container/MkmjGateVideo/index.js new file mode 100644 index 0000000..e432d61 --- /dev/null +++ b/src/pages/Container/MkmjGateVideo/index.js @@ -0,0 +1,234 @@ +import { Connect } from "@cqsjjb/jjb-dva-runtime"; +import { Button, Form, message, Modal, Space, Descriptions } from "antd"; +import { useEffect, useState } from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import { NS_MKMJGATEVIDEO } from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; +import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; +import Map from "zy-react-library/components/Map"; +import HeaderBack from "zy-react-library/components/HeaderBack"; + + +const VIDEO_TYPE = [ + { name: "移动摄像头", bianma: "1" }, + { name: "固定摄像头", bianma: "2" }, +] + +function MkmjGateVideo(props) { + const { areaGateId, deviceType } = useGetUrlQuery(); + const [addModalVisible, setAddModalVisible] = useState(false); + const [infoModalVisible, setInfoModalVisible] = useState(false); + const [currentId, setCurrentId] = useState(""); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [form] = Form.useForm(); + const { tableProps, getData } = useTable(props["mkmjGateVideoList"], { + form, + params: { + eqAreaGateId: areaGateId, + }, + }); + return ( +
+ + +
setSelectedRowKeys(selectedRowKeys), + }} + toolBarRender={() => ( + + + + + )} + columns={[ + { dataIndex: "videoResourceName", title: "摄像头名称" }, + { dataIndex: "videoType", title: "摄像头类型", render: (_, record) => record.videoType === 1 ? "移动摄像头" : "固定摄像头" }, + { dataIndex: "gateStatus", title: "状态", render: (_, record) => record.longitude ? "已定位" : "未定位" }, + { dataIndex: "isOnline", title: "是否在线", render: () => "是" }, + { + title: "操作", + align: "center", + width: 200, + render: (_, record) => ( + + + + + + ), + }, + ]} + {...tableProps} + /> + { + setAddModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + { + setInfoModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + ); +} + +function AddModalComponent(props) { + const [form] = Form.useForm(); + useEffect(() => { + if (props.currentId) { + props["mkmjGateVideoInfo"]({ id: props.currentId }).then((res) => { + form.setFieldsValue(res.data); + }); + } + }, [props.currentId]); + const onCancel = () => { + form.resetFields(); + props.onCancel(); + }; + const submit = async (values) => { + await props[!props.currentId ? "mkmjGateVideoAdd" : "mkmjGateVideoEdit"]({ ...values, id: props.currentId }); + onCancel(); + props.getData(); + }; + return ( + + + + ); +} + +function InfoModalComponent(props) { + const [info, setInfo] = useState({}); + useEffect(() => { + if (props.currentId) { + props["mkmjGateVideoInfo"]({ id: props.currentId }).then((res) => { + setInfo(res.data); + }); + } + }, [props.currentId]); + + return ( + 关闭} + title="查看" + loading={props.mkmjGateVideo.loading} + > + + + ); +} + +const AddModal = Connect([NS_MKMJGATEVIDEO], true)(AddModalComponent); +const InfoModal = Connect([NS_MKMJGATEVIDEO], true)(InfoModalComponent); +export default Connect([NS_MKMJGATEVIDEO], true)(MkmjGateVideo); + diff --git a/src/pages/Container/MkmjPassage/index.js b/src/pages/Container/MkmjPassage/index.js new file mode 100644 index 0000000..d24217b --- /dev/null +++ b/src/pages/Container/MkmjPassage/index.js @@ -0,0 +1,265 @@ +import {Connect} from "@cqsjjb/jjb-dva-runtime"; +import {Button, Form, message, Modal, Space, Descriptions} from "antd"; +import {useEffect, useState} from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import {NS_MKMJPASSAGE} from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; +import DictionarySelect from "zy-react-library/components/Select/Dictionary"; +import Map from "zy-react-library/components/Map"; +import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; +import LocationIcon from "zy-react-library/components/Icon/LocationIcon"; +import MapSelector from "zy-react-library/components/Map/MapSelector"; +import HeaderBack from "zy-react-library/components/HeaderBack"; + + +const PASSAGE_TYPE = [ + {name: "人行通道", bianma: "1"}, + {name: "车行通道", bianma: "2"}, + {name: "综合通道", bianma: "3"}, +] + +const PASSAGE_STATUS = [ + {name: "停用", bianma: "0"}, + {name: "正常", bianma: "1"}, + {name: "暂时关闭", bianma: "2"}, +] + +function MkmjPassage(props) { + const {areaId} = useGetUrlQuery(); + const [addModalVisible, setAddModalVisible] = useState(false); + const [infoModalVisible, setInfoModalVisible] = useState(false); + const [currentId, setCurrentId] = useState(""); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [form] = Form.useForm(); + const {tableProps, getData} = useTable(props["mkmjPassageList"], { + form, + params: { + eqAreaId: areaId, + }, + }); + return ( +
+ + +
setSelectedRowKeys(selectedRowKeys), + }} + toolBarRender={() => ( + + + + + )} + columns={[ + {dataIndex: "passageName", title: "通道名称"}, + {dataIndex: "passageType", title: "通道类型",render: (_, record) => record.passageType === 1 ? "人行通道" : record.passageType === 2 ? "车行通道" : "综合通道"}, + {dataIndex: "passageStatus", title: "通道状态",render: (_, record) => record.passageStatus === 0 ? "停用" : record.passageStatus === 1 ? "正常" : "暂时关闭"}, + {dataIndex: "gateNum", title: "视频个数",render:(_,record)=>{ + return record.gateNum || 0; + }}, + { + title: "操作", + align: "center", + width: 200, + render: (_, record) => ( + + + + + + + ), + }, + ]} + {...tableProps} + /> + { + setAddModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + { + setInfoModalVisible(false); + setCurrentId(""); + }} + getData={getData} + /> + + ); +} + +function AddModalComponent(props) { + const [form] = Form.useForm(); + useEffect(() => { + if (props.currentId) { + props["mkmjPassageInfo"]({id: props.currentId}).then((res) => { + form.setFieldsValue({...res.data, + passageType: Number(res.data.passageType), + passageStatus: Number(res.data.passageStatus), + }); + }); + } + }, [props.currentId]); + const onCancel = () => { + form.resetFields(); + props.onCancel(); + }; + const submit = async (values) => { + await props[!props.currentId ? "mkmjPassageAdd" : "mkmjPassageEdit"]({...values, areaId: props.areaId, id: props.currentId}); + onCancel(); + props.getData(); + }; + return ( + + } + ]} + /> + + ); +} + +function InfoModalComponent(props) { + const [info, setInfo] = useState({}); + const [mapVisible, setMapVisible] = useState(false); + useEffect(() => { + if (props.currentId) { + props["mkmjPassageInfo"]({id: props.currentId}).then((res) => { + setInfo(res.data); + }); + } + }, [props.currentId]); + + return ( + 关闭} + title="查看" + loading={props.mkmjPassage.loading} + > + { + setMapVisible(true); + }}/>, label: "位置"}, + ]} + /> + + setMapVisible(false)} + longitude={info.longitude} + latitude={info.latitude} + disable={true} + /> + + ); +} + +const AddModal = Connect([NS_MKMJPASSAGE], true)(AddModalComponent); +const InfoModal = Connect([NS_MKMJPASSAGE], true)(InfoModalComponent); +export default Connect([NS_MKMJPASSAGE], true)(MkmjPassage); + diff --git a/src/pages/Container/Statistics/AreaList/index.js b/src/pages/Container/Statistics/AreaList/index.js new file mode 100644 index 0000000..d1673bf --- /dev/null +++ b/src/pages/Container/Statistics/AreaList/index.js @@ -0,0 +1,124 @@ +import { Connect } from "@cqsjjb/jjb-dva-runtime"; +import { Button, Form, message, Modal, Space, Descriptions } from "antd"; +import { useEffect, useState } from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import { NS_MKMJAREA } from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; +import LocationIcon from "zy-react-library/components/Icon/LocationIcon"; +import DictionarySelect from "zy-react-library/components/Select/Dictionary"; +import Map from "zy-react-library/components/Map"; +import MapSelector from "zy-react-library/components/Map/MapSelector"; + +const AREA_TYPE = [ + { name: "人行口门", bianma: "1" }, + { name: "车行口门", bianma: "2" }, + { name: "综合口门", bianma: "3" }, +] + +const AREA_STATUS = [ + { name: "停用", bianma: "0" }, + { name: "正常", bianma: "1" }, + { name: "暂时关闭", bianma: "2" }, +] + +function MkmjArea(props) { + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [listData, setListData] = useState([]); + const [form] = Form.useForm(); + + const { tableProps, getData } = useTable(props["mkmjAreaList"], { + form, + params: { + eqAreaLevel: 1, + }, + onSuccess: async(res) => { + const { data } = await props["getStatistics"]({ ids: res.data.map(item => item.areaId) }) + setListData(res.data.map(item => { + const temp = data.find(stat => stat.id === item.areaId) || {} + item = { + ...item, + ...temp + } + return item; + })) + } + }); + return ( +
+ }, + ]} + /> +
setSelectedRowKeys(selectedRowKeys), + }} + columns={[ + { dataIndex: "areaName", title: "口门名称",render: (_, record) => ( + + + + ), + }, + { dataIndex: "areaParentName", title: "所属区域" }, + { + dataIndex: "areaType", title: "口门类型", render: (_, record) => { + return record.areaType === 1 ? "人行口门" : record.areaType === 2 ? "车行口门" : "综合口门"; + } + }, + { + dataIndex: "carInCount", title: "进入车辆", render: (_, record) => { + return record.carInCount || 0; + } + }, + { + dataIndex: "carOutCount", title: "外出车辆", render: (_, record) => { + return record.carOutCount || 0; + } + }, + { + dataIndex: "personInCount", title: "进入人员", render: (_, record) => { + return record.personInCount || 0; + } + }, + { + dataIndex: "personOutCount", title: "外出人员", render: (_, record) => { + return record.personOutCount || 0; + } + }, + { + dataIndex: "total", title: "总计", render: (_, record) => { + return (record.carInCount || 0) + (record.carOutCount || 0) + (record.personInCount || 0) + (record.personOutCount || 0); + } + }, + ]} + {...tableProps} + dataSource={listData} + /> + + ); +} + + + +export default Connect([NS_MKMJAREA], true)(MkmjArea); + diff --git a/src/pages/Container/Statistics/PassageList/index.js b/src/pages/Container/Statistics/PassageList/index.js new file mode 100644 index 0000000..70a6b69 --- /dev/null +++ b/src/pages/Container/Statistics/PassageList/index.js @@ -0,0 +1,118 @@ +import {Connect} from "@cqsjjb/jjb-dva-runtime"; +import {Button, Form, message, Modal, Space, Descriptions} from "antd"; +import {useEffect, useState} from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Search from "zy-react-library/components/Search"; +import Table from "zy-react-library/components/Table"; +import {FORM_ITEM_RENDER_ENUM} from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import {NS_MKMJPASSAGE} from "~/enumerate/namespace"; +import AddIcon from "zy-react-library/components/Icon/AddIcon"; +import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon"; +import DictionarySelect from "zy-react-library/components/Select/Dictionary"; +import Map from "zy-react-library/components/Map"; +import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; +import LocationIcon from "zy-react-library/components/Icon/LocationIcon"; +import MapSelector from "zy-react-library/components/Map/MapSelector"; +import HeaderBack from "zy-react-library/components/HeaderBack"; + + +const PASSAGE_TYPE = [ + {name: "人行通道", bianma: "1"}, + {name: "车行通道", bianma: "2"}, + {name: "综合通道", bianma: "3"}, +] + +const PASSAGE_STATUS = [ + {name: "停用", bianma: "0"}, + {name: "正常", bianma: "1"}, + {name: "暂时关闭", bianma: "2"}, +] + +function MkmjPassage(props) { + const {areaId, areaParentName} = useGetUrlQuery(); + const [selectedRowKeys, setSelectedRowKeys] = useState([]); + const [listData, setListData] = useState([]); + + const getStatistics = async (ids) => { + const { data } = await props["getStatistics"]({ ids }) + setStatistics(data) + } + const [form] = Form.useForm(); + + const {tableProps, getData} = useTable(props["mkmjPassageList"], { + form, + params: { + eqAreaId: areaId, + }, + onSuccess: async(res) => { + const { data } = await props["getStatistics"]({ ids: res.data.map(item => item.passageId) }) + setListData(res.data.map(item => { + const temp = data.find(stat => stat.id === item.passageId) || {} + item = { + ...item, + ...temp + } + return item; + })) + } + }); + return ( +
+ + +
setSelectedRowKeys(selectedRowKeys), + }} + columns={[ + {dataIndex: "passageName", title: "通道名称"}, + {dataIndex: "areaParentName", title: "所属区域",render: (_, record) => areaParentName}, + {dataIndex: "passageType", title: "通道类型",render: (_, record) => record.passageType === 1 ? "人行通道" : record.passageType === 2 ? "车行通道" : "综合通道"}, + {dataIndex: "passageStatus", title: "通道状态",render: (_, record) => record.passageStatus === 0 ? "停用" : record.passageStatus === 1 ? "正常" : "暂时关闭"}, + { + dataIndex: "carInCount", title: "进入车辆", render: (_, record) => { + return record.carInCount || 0; + } + }, + { + dataIndex: "carOutCount", title: "外出车辆", render: (_, record) => { + return record.carOutCount || 0; + } + }, + { + dataIndex: "personInCount", title: "进入人员", render: (_, record) => { + return record.personInCount || 0; + } + }, + { + dataIndex: "personOutCount", title: "外出人员", render: (_, record) => { + return record.personOutCount || 0; + } + }, + { + dataIndex: "total", title: "总计", render: (_, record) => { + return (record.carInCount || 0) + (record.carOutCount || 0) + (record.personInCount || 0) + (record.personOutCount || 0); + } + }, + ]} + {...tableProps} + dataSource={listData} + /> + + ); +} + + + +export default Connect([NS_MKMJPASSAGE], true)(MkmjPassage); + diff --git a/src/pages/Container/Statistics/index.js b/src/pages/Container/Statistics/index.js new file mode 100644 index 0000000..3b45e07 --- /dev/null +++ b/src/pages/Container/Statistics/index.js @@ -0,0 +1,4 @@ +function StatisticsContainer(props) { + return props.children; +} +export default StatisticsContainer; \ No newline at end of file diff --git a/src/pages/Container/index.js b/src/pages/Container/index.js new file mode 100644 index 0000000..c26d322 --- /dev/null +++ b/src/pages/Container/index.js @@ -0,0 +1,101 @@ +import { ImportCore } from "@cqsjjb/jjb-common-decorator/module"; +import { theme as antdTheme, App, ConfigProvider } from "antd"; +import language from "antd/locale/zh_CN"; +import React from "react"; + +import { InjectContext } from "~/enumerate/context"; + +export default class Container extends React.Component { + state = window?.base?.themeConfig || { + algorithm: window.process.env.app.antd.algorithm, + borderRadius: window.process.env.app.antd.borderRadius, + colorPrimary: window.process.env.app.antd.colorPrimary, + }; + + get token() { + const { + colorPrimary, + borderRadius, + } = this.state; + return { + fontFamily: window.process.env.app.antd.fontFamily, + colorPrimary, + borderRadius, + }; + } + + get algorithm() { + return antdTheme[this.state.algorithm]; + } + + componentDidMount() { + if (window.__IN_BASE__) { + // eslint-disable-next-line react-web-api/no-leaked-event-listener + window.base.addEventListener("EVENT_THEME_CONTROL", (e) => { + const config = e.data; + this.setState({ [config.field]: config.value }); + }); + } + } + + render() { + return ( + + + + + + ); + } +} + +function AppMiddle(props) { + return ( + + {process.env.NODE_ENV === "development" + ? props.children + : ( + + {props.children} + + )} + + ); +} + +class Interceptor extends React.Component { + state = { + Component: undefined, + }; + + componentDidMount() { + if (process.env.app.appKey) { + ImportCore({ + name: "$", + from: "https://cdn.cqjjb.cn/jcloud/use/plugin/b31c9840a57f11ef91cf7f3cabbb7484/latest", + }).then(async (res) => { + if (res.status) { + this.setState({ Component: res.module?.PageCover }); + } + }); + } + } + + render() { + const { Component } = this.state; + return (Component && process.env.app.appKey && process.env.NODE_ENV === "development") + ? ( + + {this.props.children} + + ) + : this.props.children; + } +} diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 0000000..64c36bb --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,8 @@ +export default function () { + return ( +

+ 底座微应用模板,技术文档: + https://www.yuque.com/buhangjiecheshen-ymbtb/qc0093/gxdun1dphetcurko +

+ ); +} diff --git a/webstorm.config.js b/webstorm.config.js new file mode 100644 index 0000000..ca262cd --- /dev/null +++ b/webstorm.config.js @@ -0,0 +1,16 @@ +"use strict"; +const path = require("node:path"); + +function resolve(dir) { + return path.join(__dirname, ".", dir); +} + +module.exports = { + context: path.resolve(__dirname, "./"), + resolve: { + extensions: [".js"], + alias: { + "~": resolve("src/"), + }, + }, +};