初始提交
commit
6ffe7055bf
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
# 微应用模板说明文档
|
||||
|
||||
## 在线文档
|
||||
|
||||
https://www.yuque.com/buhangjiecheshen-ymbtb/qc0093/gxdun1dphetcurko
|
||||
|
||||
|
||||
## 安装依赖
|
||||
项目依赖可通过 **yarn** 或 **npm** 进行安装:
|
||||
|
||||
```bash
|
||||
# 使用 yarn
|
||||
yarn
|
||||
|
||||
# 或使用 npm
|
||||
npm i
|
||||
```
|
||||
|
||||
## 开发服务&打包应用
|
||||
|
||||
```bash
|
||||
# 启动开发服务
|
||||
yarn serve:<env>
|
||||
# 或
|
||||
npm run serve:<env>
|
||||
|
||||
# 开发环境打包
|
||||
yarn build:<env>
|
||||
# 或
|
||||
npm run build:<env>
|
||||
```
|
||||
|
||||
## 路由配置&路由访问&自动化路由
|
||||
所有页面必须放在`src/pages/container`目录下,启动访问页面请在浏览器地址栏输入`/<appIdentifier>/container/<你的路由页面文件名称>`
|
||||
解释:
|
||||
1. 所有页面组件命名为`index.js`或`index.jsx`,必须放在一个首字母大写的文件中。
|
||||
2. `container`为固定路径访问格式
|
||||
3. `<appIdentifier>`为应用的唯一标识符,也是应用路由的`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`。
|
||||
|
|
@ -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");
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
import antfu from "@antfu/eslint-config";
|
||||
|
||||
export default antfu({
|
||||
// Remove formatter configuration that might be causing issues
|
||||
formatters: false,
|
||||
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"],
|
||||
},
|
||||
});
|
||||
|
|
@ -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",
|
||||
}],
|
||||
],
|
||||
};
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
module.exports = {
|
||||
// 应用后端git地址,部署上线需要
|
||||
javaGit: "<git-url>",
|
||||
// 应用后端仓库名称,部署上线需要
|
||||
javaGitName: "<git-name>",
|
||||
// 环境配置
|
||||
environment: {
|
||||
development: {
|
||||
// 应用后端分支名称,部署上线需要
|
||||
javaGitBranch: "<branch-name>",
|
||||
// 接口服务地址
|
||||
API_HOST: "http://192.168.20.100:30140",
|
||||
},
|
||||
production: {
|
||||
// 应用后端分支名称,部署上线需要
|
||||
javaGitBranch: "<branch-name>",
|
||||
// 接口服务地址
|
||||
API_HOST: "",
|
||||
},
|
||||
},
|
||||
// 应用唯一标识符
|
||||
appIdentifier: "firefighting",
|
||||
// 应用上下文注入全局变量
|
||||
contextInject: {
|
||||
// 应用Key
|
||||
appKey: "",
|
||||
fileUrl: "http://192.168.20.240:9787/mnt",
|
||||
},
|
||||
// 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,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": "src",
|
||||
"paths": {
|
||||
"~/*": ["*"]
|
||||
}
|
||||
},
|
||||
"include": ["src"]
|
||||
}
|
||||
|
|
@ -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.105"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
<!--BEGIN-->
|
||||
<!--<% var { env: $env, process: $process, mode: $mode, builtInfo: $builtInfo, links: $links, redirectLogin: $redirectLogin, framework: $framework, scripts: $scripts, element: $element } = htmlWebpackPlugin.options %>-->
|
||||
<!--<% var { appKey: $appKey, antd: $antd, basename: $basename, API_HOST: $API_HOST } = $process %>-->
|
||||
<!--<% var { ['ant-prefix']: $antPrefix, fontFamily: $fontFamily, colorPrimary: $colorPrimary, borderRadius: $borderRadius } = $antd %>-->
|
||||
<!--NED-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh">
|
||||
<head data-built-info="<%= $builtInfo %>">
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="renderer" content="webkit"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1"/>
|
||||
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover">
|
||||
<% for (const item of $links) { %>
|
||||
<link type="text/css" rel="stylesheet" href="<%= item %>"></link>
|
||||
<% } %>
|
||||
<title>--</title>
|
||||
<script>
|
||||
(function () {
|
||||
const APP_ENV = {
|
||||
antd: {
|
||||
'ant-prefix': '<%= $antPrefix %>',
|
||||
fontFamily: '<%= $fontFamily %>',
|
||||
colorPrimary: '<%= $colorPrimary %>',
|
||||
borderRadius: parseInt('<%= $borderRadius %>')
|
||||
},
|
||||
appKey: '<%= $appKey %>',
|
||||
basename: '<%= $basename %>',
|
||||
API_HOST: '<%= $API_HOST %>'
|
||||
};
|
||||
APP_ENV.API_HOST = sessionStorage.API_HOST || APP_ENV.API_HOST || window.location.origin;
|
||||
window.process = {
|
||||
env: { app: APP_ENV },
|
||||
NODE_ENV: '<%= $mode %>'
|
||||
};
|
||||
window.__JJB_ENVIRONMENT__ = {
|
||||
API_HOST: APP_ENV.API_HOST,
|
||||
redirect: '<%= $redirectLogin %>',
|
||||
FRAMEWORK: APP_ENV.antd
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
<!-- SCRIPTS -->
|
||||
<% for (const item of $scripts) { %>
|
||||
<script src="<%= item %>" type="text/javascript"></script>
|
||||
<% } %>
|
||||
</head>
|
||||
<body>
|
||||
<!-- NOSCRIPT -->
|
||||
<noscript>此网页需要开启JavaScript功能。</noscript>
|
||||
<!-- MAIN -->
|
||||
<% const { root } = $element; %>
|
||||
<div id="<%= root.id %>" style="width: 100%; height: 100%; position: relative;overflow-y: auto;"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
import {declareRequest} from '@cqsjjb/jjb-dva-runtime';
|
||||
|
||||
export const fireresourcesList = declareRequest(
|
||||
'fireresourcesLoading',
|
||||
'Post > @/firefighting/fireresources/list',
|
||||
);
|
||||
export const fireresourcesAdd = declareRequest(
|
||||
'fireresourcesLoading',
|
||||
'Post > @/firefighting/fireresources/save'
|
||||
);
|
||||
export const fireresourcesEdit = declareRequest(
|
||||
'fireresourcesLoading',
|
||||
'Put > @/firefighting/fireresources/edit'
|
||||
);
|
||||
export const fireresourcesDelete = declareRequest(
|
||||
'fireresourcesLoading',
|
||||
'Delete > @/firefighting/fireresources/{id}'
|
||||
);
|
||||
export const fireresourcesBatchDelete = declareRequest(
|
||||
'fireresourcesLoading',
|
||||
'Delete > @/firefighting/fireresources/ids/{ids}'
|
||||
);
|
||||
export const fireresourcesInfo = declareRequest('fireresourcesLoading', 'Get > /firefighting/fireresources/{id}');
|
||||
|
||||
export const getCountByCorpinfoAndType = declareRequest('fireresourcesLoading', 'Post > @/firefighting/fireresources/countByCorpinfoAndType');
|
||||
|
||||
export const getCorpInfoList = declareRequest(
|
||||
'fireresourcesLoading',
|
||||
'Post > @/basic-info/corpInfo/list'
|
||||
);
|
||||
|
|
@ -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}",
|
||||
// );
|
||||
|
|
@ -0,0 +1 @@
|
|||
export {};
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
/**
|
||||
* 全局常量定义
|
||||
*/
|
||||
|
||||
export {};
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
/**
|
||||
* 全局上下文定义
|
||||
*/
|
||||
|
||||
import React from "react";
|
||||
|
||||
// 获取antd全局静态方法
|
||||
export const InjectContext = React.createContext({});
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
/**
|
||||
* 全局数据状态管理模块定义
|
||||
*/
|
||||
|
||||
import { defineNamespace } from "@cqsjjb/jjb-dva-runtime";
|
||||
|
||||
export const NS_GLOBAL = defineNamespace("global");
|
||||
export const NS_FIRERESOURCES = defineNamespace("fireresources");
|
||||
|
|
@ -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);
|
||||
|
|
@ -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) && (
|
||||
<Component
|
||||
detail={{ componentKey: process.env.app.appKey }}
|
||||
appKey={process.env.app.appKey}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,346 @@
|
|||
import {Connect} from "@cqsjjb/jjb-dva-runtime";
|
||||
import {Button, Descriptions, Form, message, Modal, Space} 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_FIRERESOURCES} from "~/enumerate/namespace";
|
||||
import AddIcon from "zy-react-library/components/Icon/AddIcon";
|
||||
import DeleteIcon from "zy-react-library/components/Icon/DeleteIcon";
|
||||
import Map from "zy-react-library/components/Map";
|
||||
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 FIRERESOURCES_TYPE = {
|
||||
"xfjyd01": "消防救援队",
|
||||
"xfkzs01": "消防控制室",
|
||||
"xfbf01": "消防泵房",
|
||||
"xfsy01": "消防水源",
|
||||
}
|
||||
|
||||
const FIRERESOURCES_STATE = [
|
||||
{name: "正常", bianma: "0"},
|
||||
{name: "异常", bianma: "1"},
|
||||
]
|
||||
|
||||
function Fireresources(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["fireresourcesList"], {
|
||||
form,
|
||||
params: {
|
||||
eqFireresourcesType: props["fireresourcesType"],
|
||||
eqCorpinfoId: props["corpinfoId"],
|
||||
},
|
||||
});
|
||||
return (
|
||||
<div style={{padding: 10}}>
|
||||
{props.isSupervise && <HeaderBack title="统计列表"/>}
|
||||
<Search
|
||||
form={form}
|
||||
onFinish={getData}
|
||||
options={[
|
||||
{name: "likeFireresourcesName", label: "名称"},
|
||||
]}
|
||||
/>
|
||||
<Table
|
||||
rowSelection={{
|
||||
selectedRowKeys,
|
||||
onChange: selectedRowKeys => setSelectedRowKeys(selectedRowKeys),
|
||||
}}
|
||||
toolBarRender={() => (!props.isSupervise ? (
|
||||
<Space>
|
||||
<Button type="primary" icon={<AddIcon/>} onClick={() => setAddModalVisible(true)}>新增</Button>
|
||||
<Button
|
||||
icon={<DeleteIcon/>}
|
||||
type="primary"
|
||||
danger
|
||||
onClick={() => {
|
||||
if (!selectedRowKeys.length)
|
||||
return message.warning("请选择要删除的行");
|
||||
Modal.confirm({
|
||||
title: "确定删除吗?",
|
||||
onOk: async () => {
|
||||
await props["fireresourcesBatchDelete"]({ids: selectedRowKeys});
|
||||
message.success("删除成功");
|
||||
getData();
|
||||
},
|
||||
});
|
||||
}}
|
||||
>
|
||||
批量删除
|
||||
</Button>
|
||||
</Space>
|
||||
) : null)}
|
||||
columns={[
|
||||
{dataIndex: "fireresourcesName", title: "名称"},
|
||||
{
|
||||
dataIndex: "fireresourcesType",
|
||||
title: "消防资源类型",
|
||||
render: (_, record) => FIRERESOURCES_TYPE[record.fireresourcesType]
|
||||
},
|
||||
{
|
||||
dataIndex: "location",
|
||||
title: "消防资源经纬度",
|
||||
render: (_, record) => record.longitude + "--" + record.latitude
|
||||
},
|
||||
{
|
||||
dataIndex: "createTime", title: "创建时间", render: (_, record) => {
|
||||
if (!record.createTime) return "";
|
||||
const [date, time] = record.createTime.split("T");
|
||||
return `${date} ${time.split(".")[0]}`;
|
||||
}
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
align: "center",
|
||||
width: 200,
|
||||
render: (_, record) => (
|
||||
<Space>
|
||||
<Button
|
||||
type="link"
|
||||
onClick={() => {
|
||||
setCurrentId(record.id);
|
||||
setInfoModalVisible(true);
|
||||
}}
|
||||
>
|
||||
查看
|
||||
</Button>
|
||||
{!props.isSupervise && (
|
||||
<>
|
||||
<Button
|
||||
type="link"
|
||||
onClick={() => {
|
||||
setCurrentId(record.id);
|
||||
setAddModalVisible(true);
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
type="link"
|
||||
danger
|
||||
onClick={() => {
|
||||
Modal.confirm({
|
||||
title: "确定删除吗?",
|
||||
onOk: async () => {
|
||||
await props["fireresourcesDelete"]({id: record.id});
|
||||
message.success("删除成功");
|
||||
getData();
|
||||
},
|
||||
});
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
]}
|
||||
{...tableProps}
|
||||
/>
|
||||
{addModalVisible && <AddModal
|
||||
currentId={currentId}
|
||||
fireresourcesType={props["fireresourcesType"]}
|
||||
onCancel={() => {
|
||||
setAddModalVisible(false);
|
||||
setCurrentId("");
|
||||
}}
|
||||
getData={getData}
|
||||
/>}
|
||||
|
||||
|
||||
{infoModalVisible && <InfoModal
|
||||
currentId={currentId}
|
||||
onCancel={() => {
|
||||
setInfoModalVisible(false);
|
||||
setCurrentId("");
|
||||
}}
|
||||
getData={getData}
|
||||
/>}
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function AddModalComponent(props) {
|
||||
const [form] = Form.useForm();
|
||||
useEffect(() => {
|
||||
if (props.currentId) {
|
||||
props["fireresourcesInfo"]({id: props.currentId}).then((res) => {
|
||||
form.setFieldsValue({
|
||||
...res.data,
|
||||
state: res.data.state + "",
|
||||
});
|
||||
});
|
||||
}
|
||||
}, [props.currentId]);
|
||||
const onCancel = () => {
|
||||
form.resetFields();
|
||||
props.onCancel();
|
||||
};
|
||||
const submit = async (values) => {
|
||||
// 将点号分隔的details字段转换为嵌套JSON对象
|
||||
const transformedValues = {...values};
|
||||
const details = {};
|
||||
|
||||
// 提取所有details开头的字段并构建嵌套对象
|
||||
Object.keys(values).forEach(key => {
|
||||
if (key.startsWith('details.')) {
|
||||
const fieldName = key.substring('details.'.length);
|
||||
details[fieldName] = values[key];
|
||||
delete transformedValues[key]; // 删除原始的点号分隔字段
|
||||
}
|
||||
});
|
||||
|
||||
// 添加details对象
|
||||
transformedValues.details = details;
|
||||
|
||||
await props[!props.currentId ? "fireresourcesAdd" : "fireresourcesEdit"]({
|
||||
...transformedValues,
|
||||
fireresourcesType: props["fireresourcesType"],
|
||||
id: props.currentId
|
||||
});
|
||||
onCancel();
|
||||
props.getData();
|
||||
};
|
||||
|
||||
let detailsFields = [];
|
||||
if (props["fireresourcesType"] === "xfsy01") {
|
||||
detailsFields = [
|
||||
{name: "details.水源位置", label: "水源位置"},
|
||||
{name: "details.吸水口规格", label: "吸水口规格"},
|
||||
{name: "details.接口形式", label: "接口形式"},
|
||||
{name: "details.水源类型", label: "水源类型"},
|
||||
{name: "details.水源编号", label: "水源编号"},
|
||||
{name: "details.所属单位或部门", label: "所属单位或部门"},
|
||||
{name: "details.水源容量", label: "水源容量"},
|
||||
{name: "details.供水能力", label: "供水能力"},
|
||||
{name: "details.设备清单", label: "设备清单"},
|
||||
]
|
||||
} else if (props["fireresourcesType"] === "xfbf01") {
|
||||
detailsFields = [
|
||||
{
|
||||
name: "details.imageFiles",
|
||||
label: "消防泵房图片",
|
||||
render: (
|
||||
<Upload
|
||||
onGetRemoveFile={(file) => {
|
||||
setDeleteImageFiles([...deleteImageFiles, file]);
|
||||
}}
|
||||
/>
|
||||
),
|
||||
span: 24
|
||||
},
|
||||
]
|
||||
|
||||
}else if (props["fireresourcesType"] === "xfjyd01") {
|
||||
detailsFields = [
|
||||
{name: "details.编制", label: "编制"},
|
||||
{name: "details.负责单位或部门", label: "负责单位或部门"},
|
||||
{name: "details.队长", label: "队长"},
|
||||
{name: "details.指挥人员", label: "指挥人员"},
|
||||
{name: "details.队员名单", label: "队员名单"},
|
||||
{name: "details.建立日期", label: "建立日期"},
|
||||
{name: "details.组建背景", label: "组建背景"},
|
||||
{name: "details.所属区域范围", label: "所属区域范围"},
|
||||
{name: "details.救援装备清单", label: "救援装备清单"},
|
||||
{name: "details.职责和任务范围", label: "职责和任务范围"},
|
||||
]
|
||||
}
|
||||
return (
|
||||
<Modal
|
||||
open
|
||||
onCancel={onCancel}
|
||||
onOk={form.submit}
|
||||
title={props.currentId ? "编辑" : "新增"}
|
||||
loading={props.fireresources.loading}
|
||||
width={800}
|
||||
>
|
||||
<FormBuilder
|
||||
labelCol={{span: 8}}
|
||||
form={form}
|
||||
span={24}
|
||||
onFinish={submit}
|
||||
showActionButtons={false}
|
||||
options={[
|
||||
{name: "fireresourcesName", label: "名称"},
|
||||
{name: "state", label: "状态", render: FORM_ITEM_RENDER_ENUM.SELECT, items: FIRERESOURCES_STATE},
|
||||
{key: "map", customizeRender: true, render: <Map/>},
|
||||
...detailsFields,
|
||||
]}
|
||||
/>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
function InfoModalComponent(props) {
|
||||
const [info, setInfo] = useState({});
|
||||
const [mapVisible, setMapVisible] = useState(false);
|
||||
useEffect(() => {
|
||||
if (props.currentId) {
|
||||
props["fireresourcesInfo"]({id: props.currentId}).then((res) => {
|
||||
setInfo(res.data);
|
||||
});
|
||||
}
|
||||
}, [props.currentId]);
|
||||
|
||||
return (
|
||||
<Modal
|
||||
onCancel={props.onCancel}
|
||||
open
|
||||
footer={<Button onClick={props.onCancel}>关闭</Button>}
|
||||
title="查看"
|
||||
loading={props.fireresources.loading}
|
||||
>
|
||||
<Descriptions
|
||||
labelStyle={{width: 200}}
|
||||
column={1}
|
||||
bordered
|
||||
items={[
|
||||
{children: info.fireresourcesName, label: "名称"},
|
||||
{
|
||||
children: info.state === 0 ? "正常" : "异常",
|
||||
label: "状态"
|
||||
},
|
||||
{
|
||||
children: <LocationIcon onClick={() => {
|
||||
setMapVisible(true);
|
||||
}}/>, label: "位置"
|
||||
},
|
||||
...(info.details ? (() => {
|
||||
try {
|
||||
const detailsObj = typeof info.details === 'string' ? JSON.parse(info.details) : info.details;
|
||||
return typeof detailsObj === 'object' && detailsObj !== null ?
|
||||
Object.entries(detailsObj).map(([key, value]) => ({children: value, label: key})) : [];
|
||||
} catch (error) {
|
||||
console.error('解析details JSON失败:', error);
|
||||
return [];
|
||||
}
|
||||
})() : [])
|
||||
]}
|
||||
/>
|
||||
|
||||
<MapSelector
|
||||
visible={mapVisible}
|
||||
onClose={() => setMapVisible(false)}
|
||||
longitude={info.longitude}
|
||||
latitude={info.latitude}
|
||||
disable={true}
|
||||
/>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
const AddModal = Connect([NS_FIRERESOURCES], true)(AddModalComponent);
|
||||
const InfoModal = Connect([NS_FIRERESOURCES], true)(InfoModalComponent);
|
||||
export default Connect([NS_FIRERESOURCES], true)(Fireresources);
|
||||
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import Fireresources from "../Fireresources/components/Fireresources";
|
||||
|
||||
|
||||
function FireresourcesContainer(props) {
|
||||
return (
|
||||
<Fireresources fireresourcesType="xfbf01"
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export default FireresourcesContainer;
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import Fireresources from "../Fireresources/components/Fireresources";
|
||||
|
||||
|
||||
function FireresourcesContainer(props) {
|
||||
return (
|
||||
<Fireresources fireresourcesType="xfjyd01"
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export default FireresourcesContainer;
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
import Fireresources from "../../Fireresources/components/Fireresources";
|
||||
import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery";
|
||||
|
||||
function FireresourcesContainer(props) {
|
||||
const {corpinfoId,fireresourcesType} = useGetUrlQuery();
|
||||
return (
|
||||
<Fireresources fireresourcesType={fireresourcesType}
|
||||
corpinfoId={corpinfoId}
|
||||
isSupervise={true}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export default FireresourcesContainer;
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
import {Connect} from "@cqsjjb/jjb-dva-runtime";
|
||||
import {Button, Form, Space} from "antd";
|
||||
import {useState} from "react";
|
||||
import Search from "zy-react-library/components/Search";
|
||||
import Table from "zy-react-library/components/Table";
|
||||
import useTable from "zy-react-library/hooks/useTable";
|
||||
import {NS_FIRERESOURCES} from "~/enumerate/namespace";
|
||||
|
||||
function Supervise(props) {
|
||||
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
|
||||
const [form] = Form.useForm();
|
||||
const [countByCorpinfoAndType, setCountByCorpinfoAndType] = useState([]);
|
||||
|
||||
const getCountByCorpinfoAndType=async (corpinfoIds)=>{
|
||||
const {data} = await props["getCountByCorpinfoAndType"]({corpinfoIds})
|
||||
setCountByCorpinfoAndType(data)
|
||||
}
|
||||
|
||||
const {tableProps, getData} = useTable(props["getCorpInfoList"], {
|
||||
form,
|
||||
onSuccess: ({data}) => {
|
||||
console.log(data)
|
||||
getCountByCorpinfoAndType(data.map(item => item.id))
|
||||
},
|
||||
});
|
||||
const getCount=(id,type)=>{
|
||||
return countByCorpinfoAndType.find(item => item.corpinfoId === id && item.fireresourcesType === type)?.[`count`] || 0;
|
||||
}
|
||||
const getArea=(record)=>{
|
||||
const areaArr = [record.provinceName,record.cityName,record.countyName].filter(item => item);
|
||||
return areaArr.join("-") || "-";
|
||||
}
|
||||
return (
|
||||
<div style={{padding: 10}}>
|
||||
<Search
|
||||
form={form}
|
||||
values={{
|
||||
eqAccidentType: "1",
|
||||
}}
|
||||
onFinish={getData}
|
||||
options={[
|
||||
{name: "likecorpName", label: `公司名称`},
|
||||
]}
|
||||
/>
|
||||
<Table
|
||||
rowSelection={{
|
||||
selectedRowKeys,
|
||||
onChange: selectedRowKeys => setSelectedRowKeys(selectedRowKeys),
|
||||
}}
|
||||
columns={[
|
||||
{dataIndex: "corpName", title: `所属公司`},
|
||||
{dataIndex: "area", title: `属地`,render: (_, record) => getArea(record)},
|
||||
{dataIndex: "xfjyd01", title: `消防救援队`,render: (_, record) => (
|
||||
<Space>
|
||||
<Button
|
||||
type="link"
|
||||
onClick={() => {
|
||||
props.history.push(`./Info?corpinfoId=${record.id}&fireresourcesType=xfjyd01`)
|
||||
}}
|
||||
>
|
||||
{getCount(record.id,"xfjyd01")}
|
||||
</Button>
|
||||
</Space>
|
||||
)},
|
||||
{dataIndex: "xfkzs01", title: `消防控制室`,render: (_, record) => (
|
||||
<Space>
|
||||
<Button
|
||||
type="link"
|
||||
onClick={() => {
|
||||
props.history.push(`./Info?corpinfoId=${record.id}&fireresourcesType=xfkzs01`)
|
||||
}}
|
||||
>
|
||||
{getCount(record.id,"xfkzs01")}
|
||||
</Button>
|
||||
</Space>
|
||||
)},
|
||||
{dataIndex: "xfbf01", title: `消防泵房`,render: (_, record) => (
|
||||
<Space>
|
||||
<Button
|
||||
type="link"
|
||||
onClick={() => {
|
||||
props.history.push(`./Info?corpinfoId=${record.id}&fireresourcesType=xfbf01`)
|
||||
}}
|
||||
>
|
||||
{getCount(record.id,"xfbf01")}
|
||||
</Button>
|
||||
</Space>
|
||||
)},
|
||||
{dataIndex: "xfsy01", title: `消防水源`,render: (_, record) => (
|
||||
<Space>
|
||||
<Button
|
||||
type="link"
|
||||
onClick={() => {
|
||||
props.history.push(`./Info?corpinfoId=${record.id}&fireresourcesType=xfsy01`)
|
||||
}}
|
||||
>
|
||||
{getCount(record.id,"xfsy01")}
|
||||
</Button>
|
||||
</Space>
|
||||
)},
|
||||
]}
|
||||
{...tableProps}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default Connect([NS_FIRERESOURCES], true)(Supervise);
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
function SuperviseContainer(props) {
|
||||
return props.children;
|
||||
}
|
||||
export default SuperviseContainer;
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import Fireresources from "../Fireresources/components/Fireresources";
|
||||
|
||||
|
||||
function FireresourcesContainer(props) {
|
||||
return (
|
||||
<Fireresources fireresourcesType="xfsy01"
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
export default FireresourcesContainer;
|
||||
|
|
@ -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 (
|
||||
<ConfigProvider
|
||||
theme={{
|
||||
token: this.token,
|
||||
algorithm: this.algorithm,
|
||||
}}
|
||||
locale={language}
|
||||
prefixCls={window.process.env.app.antd["ant-prefix"]}
|
||||
>
|
||||
<App style={{ height: "100%" }}>
|
||||
<AppMiddle {...this.props} />
|
||||
</App>
|
||||
</ConfigProvider>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function AppMiddle(props) {
|
||||
return (
|
||||
<InjectContext.Provider value={App.useApp()}>
|
||||
{process.env.NODE_ENV === "development"
|
||||
? props.children
|
||||
: (
|
||||
<Interceptor>
|
||||
{props.children}
|
||||
</Interceptor>
|
||||
)}
|
||||
</InjectContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
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")
|
||||
? (
|
||||
<Component appKey={process.env.app.appKey}>
|
||||
{this.props.children}
|
||||
</Component>
|
||||
)
|
||||
: this.props.children;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
export default function () {
|
||||
return (
|
||||
<h1>
|
||||
底座微应用模板,技术文档:
|
||||
<a rel="noreferrer noopener" target="_blank" href="https://www.yuque.com/buhangjiecheshen-ymbtb/qc0093/gxdun1dphetcurko">https://www.yuque.com/buhangjiecheshen-ymbtb/qc0093/gxdun1dphetcurko</a>
|
||||
</h1>
|
||||
);
|
||||
}
|
||||
|
|
@ -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/"),
|
||||
},
|
||||
},
|
||||
};
|
||||
Loading…
Reference in New Issue