From 3ba7bcfcae808e301557b657f51f696cbb9c4e1b Mon Sep 17 00:00:00 2001 From: yms Date: Mon, 29 Jul 2024 14:38:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BA=8C=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- .env.production | 2 +- .env.test | 2 +- babel.config.js | 37 ++- config/index.js | 6 +- package.json | 47 ++-- project.config.json | 2 +- project.private.config.json | 30 +- src/app.config.js | 17 +- src/app.css | 42 +++ src/app.js | 14 +- src/assets/file.png | Bin 0 -> 6261 bytes src/assets/image.png | Bin 0 -> 6870 bytes src/assets/pdf.png | Bin 0 -> 6873 bytes src/components/FormCheckbox/index.jsx | 53 ++++ src/components/FormComponentRender/index.css | 0 src/components/FormComponentRender/index.jsx | 44 +++ src/components/FormDatePicker/index.css | 4 + src/components/FormDatePicker/index.jsx | 98 +++++++ src/components/FormFileUpload/index.css | 9 + src/components/FormFileUpload/index.jsx | 47 ++++ src/components/FormImgUpload/index.jsx | 35 +++ src/components/FormInput/index.jsx | 25 ++ src/components/FormRadio/index.jsx | 24 ++ src/components/FormTextarea/index.jsx | 25 ++ src/pages/detail/components/attachment.jsx | 127 +++++++++ .../detail/components/attachment.module.css | 44 +++ src/pages/detail/components/content.jsx | 98 +++++++ src/pages/detail/components/decoratePoint.css | 37 +++ src/pages/detail/components/decoratePoint.jsx | 21 ++ src/pages/detail/components/labelText.jsx | 15 + src/pages/detail/components/timeLine.jsx | 135 +++++++++ .../detail/components/timeLine.module.css | 60 ++++ src/pages/detail/index.config.js | 3 + src/pages/detail/index.css | 59 ++++ src/pages/detail/index.jsx | 111 ++++++++ src/pages/index/index.config.js | 6 +- src/pages/index/index.css | 15 + src/pages/index/index.jsx | 69 ++++- src/pages/list/index.config.js | 3 + src/pages/list/index.css | 88 ++++++ src/pages/list/index.jsx | 180 ++++++++++++ src/pages/manage/index.config.js | 3 + src/pages/manage/index.css | 30 ++ src/pages/manage/index.jsx | 258 ++++++++++++++++++ src/service/index.js | 131 +++++++++ src/store/useUserStore.js | 16 ++ src/utils/index.js | 39 +++ yarn.lock | 99 ++++++- 49 files changed, 2147 insertions(+), 65 deletions(-) create mode 100644 src/assets/file.png create mode 100644 src/assets/image.png create mode 100644 src/assets/pdf.png create mode 100644 src/components/FormCheckbox/index.jsx create mode 100644 src/components/FormComponentRender/index.css create mode 100644 src/components/FormComponentRender/index.jsx create mode 100644 src/components/FormDatePicker/index.css create mode 100644 src/components/FormDatePicker/index.jsx create mode 100644 src/components/FormFileUpload/index.css create mode 100644 src/components/FormFileUpload/index.jsx create mode 100644 src/components/FormImgUpload/index.jsx create mode 100644 src/components/FormInput/index.jsx create mode 100644 src/components/FormRadio/index.jsx create mode 100644 src/components/FormTextarea/index.jsx create mode 100644 src/pages/detail/components/attachment.jsx create mode 100644 src/pages/detail/components/attachment.module.css create mode 100644 src/pages/detail/components/content.jsx create mode 100644 src/pages/detail/components/decoratePoint.css create mode 100644 src/pages/detail/components/decoratePoint.jsx create mode 100644 src/pages/detail/components/labelText.jsx create mode 100644 src/pages/detail/components/timeLine.jsx create mode 100644 src/pages/detail/components/timeLine.module.css create mode 100644 src/pages/detail/index.config.js create mode 100644 src/pages/detail/index.css create mode 100644 src/pages/detail/index.jsx create mode 100644 src/pages/list/index.config.js create mode 100644 src/pages/list/index.css create mode 100644 src/pages/list/index.jsx create mode 100644 src/pages/manage/index.config.js create mode 100644 src/pages/manage/index.css create mode 100644 src/pages/manage/index.jsx create mode 100644 src/service/index.js create mode 100644 src/store/useUserStore.js create mode 100644 src/utils/index.js diff --git a/.env.development b/.env.development index bbcf73c..053a7e3 100644 --- a/.env.development +++ b/.env.development @@ -1,4 +1,4 @@ # 配置文档参考 https://taro-docs.jd.com/docs/next/env-mode-config # TARO_APP_ID="开发环境下的小程序appid" -TARO_APP_ID="wxc0e4cfce130fe788" \ No newline at end of file +TARO_APP_ID="wx43d3e4316396041c" \ No newline at end of file diff --git a/.env.production b/.env.production index 3e24617..5171276 100644 --- a/.env.production +++ b/.env.production @@ -1,3 +1,3 @@ # TARO_APP_ID="生产环境下的小程序appid" -TARO_APP_ID="wxc0e4cfce130fe788" \ No newline at end of file +TARO_APP_ID="wx43d3e4316396041c" \ No newline at end of file diff --git a/.env.test b/.env.test index 0fcf1e5..87ef691 100644 --- a/.env.test +++ b/.env.test @@ -1,3 +1,3 @@ # TARO_APP_ID="测试环境下的小程序appid" -TARO_APP_ID="wxc0e4cfce130fe788" \ No newline at end of file +TARO_APP_ID="wx43d3e4316396041c" \ No newline at end of file diff --git a/babel.config.js b/babel.config.js index d54a01b..1a571ad 100644 --- a/babel.config.js +++ b/babel.config.js @@ -2,9 +2,34 @@ // https://github.com/NervJS/taro/blob/next/packages/babel-preset-taro/README.md module.exports = { presets: [ - ['taro', { - framework: 'react', - ts: false - }] - ] -} + [ + "taro", + { + framework: "react", + ts: false, + }, + ], + ], + + plugins: [ + [ + "import", + { + libraryName: "@taroify/core", + libraryDirectory: "", + style: true, + }, + "@taroify/core", + ], + [ + "import", + { + libraryName: "@taroify/icons", + libraryDirectory: "", + camel2DashComponentName: false, + style: () => "@taroify/icons/style", + }, + "@taroify/icons", + ], + ], +}; diff --git a/config/index.js b/config/index.js index 05280c2..c0eb0f2 100644 --- a/config/index.js +++ b/config/index.js @@ -6,7 +6,7 @@ import prodConfig from "./prod"; // https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数 export default defineConfig(async (merge, { command, mode }) => { const baseConfig = { - projectName: "approve-pass-managemnt-miniApp", + projectName: "approve-pass-management-miniApp", date: "2024-7-12", designWidth: 1125, deviceRatio: { @@ -50,6 +50,9 @@ export default defineConfig(async (merge, { command, mode }) => { }, }, }, + sass: { + data: "$hd: 3;", + }, h5: { publicPath: "/", staticDirectory: "static", @@ -62,6 +65,7 @@ export default defineConfig(async (merge, { command, mode }) => { filename: "css/[name].[hash].css", chunkFilename: "css/[name].[chunkhash].css", }, + esnextModules: ["@taroify"], postcss: { autoprefixer: { enable: true, diff --git a/package.json b/package.json index 07b469c..0ab43b8 100644 --- a/package.json +++ b/package.json @@ -40,47 +40,52 @@ "author": "", "dependencies": { "@babel/runtime": "^7.21.5", + "@taroify/core": "^0.3.1-alpha.0", "@tarojs/components": "3.6.33", "@tarojs/helper": "3.6.33", - "@tarojs/plugin-platform-weapp": "3.6.33", + "@tarojs/plugin-framework-react": "3.6.33", "@tarojs/plugin-platform-alipay": "3.6.33", - "@tarojs/plugin-platform-tt": "3.6.33", - "@tarojs/plugin-platform-swan": "3.6.33", - "@tarojs/plugin-platform-jd": "3.6.33", - "@tarojs/plugin-platform-qq": "3.6.33", "@tarojs/plugin-platform-h5": "3.6.33", "@tarojs/plugin-platform-harmony-hybrid": "3.6.33", + "@tarojs/plugin-platform-jd": "3.6.33", + "@tarojs/plugin-platform-qq": "3.6.33", + "@tarojs/plugin-platform-swan": "3.6.33", + "@tarojs/plugin-platform-tt": "3.6.33", + "@tarojs/plugin-platform-weapp": "3.6.33", + "@tarojs/react": "3.6.33", "@tarojs/runtime": "3.6.33", "@tarojs/shared": "3.6.33", "@tarojs/taro": "3.6.33", - "@tarojs/plugin-framework-react": "3.6.33", - "@tarojs/react": "3.6.33", + "classnames": "^2.5.1", + "lodash": "^4.17.21", + "react": "^18.0.0", "react-dom": "^18.0.0", - "react": "^18.0.0" + "zustand": "^4.5.4" }, "devDependencies": { "@babel/core": "^7.8.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.5", "@tarojs/cli": "3.6.33", - "@types/webpack-env": "^1.13.6", - "@tarojs/test-utils-react": "^0.1.1", - "@types/react": "^18.0.0", - "webpack": "5.78.0", "@tarojs/taro-loader": "3.6.33", + "@tarojs/test-utils-react": "^0.1.1", "@tarojs/webpack5-runner": "3.6.33", + "@types/jest": "^29.3.1", + "@types/node": "^18.15.11", + "@types/react": "^18.0.0", + "@types/webpack-env": "^1.13.6", + "babel-plugin-import": "^1.13.8", "babel-preset-taro": "3.6.33", - "eslint-config-taro": "3.6.33", "eslint": "^8.12.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.5", - "react-refresh": "^0.11.0", - "eslint-plugin-react": "^7.8.2", + "eslint-config-taro": "3.6.33", "eslint-plugin-import": "^2.12.0", + "eslint-plugin-react": "^7.8.2", "eslint-plugin-react-hooks": "^4.2.0", - "stylelint": "^14.4.0", + "jest": "^29.3.1", + "jest-environment-jsdom": "^29.5.0", "postcss": "^8.4.18", + "react-refresh": "^0.11.0", + "stylelint": "^14.4.0", "ts-node": "^10.9.1", - "@types/node": "^18.15.11", - "@types/jest": "^29.3.1", - "jest": "^29.3.1", - "jest-environment-jsdom": "^29.5.0" + "webpack": "5.78.0" } } diff --git a/project.config.json b/project.config.json index 08b3326..bba4057 100644 --- a/project.config.json +++ b/project.config.json @@ -2,7 +2,7 @@ "miniprogramRoot": "dist/", "projectname": "approve-pass-managemnt-miniApp", "description": "", - "appid": "wxc0e4cfce130fe788", + "appid": "wx43d3e4316396041c", "setting": { "urlCheck": true, "es6": false, diff --git a/project.private.config.json b/project.private.config.json index 51e2631..a1a2ceb 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -2,6 +2,34 @@ "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", "projectname": "approve-pass-managemnt-miniApp", "setting": { - "compileHotReLoad": true + "compileHotReLoad": true, + "urlCheck": false + }, + "condition": { + "miniprogram": { + "list": [ + { + "name": "pages/manage/index", + "pathName": "pages/manage/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "pages/detail/index", + "pathName": "pages/detail/index", + "query": "", + "launchMode": "default", + "scene": null + }, + { + "name": "pages/list/index", + "pathName": "pages/list/index", + "query": "", + "launchMode": "default", + "scene": null + } + ] + } } } \ No newline at end of file diff --git a/src/app.config.js b/src/app.config.js index 15c683b..a39ee24 100644 --- a/src/app.config.js +++ b/src/app.config.js @@ -1,11 +1,14 @@ export default defineAppConfig({ pages: [ - 'pages/index/index' + "pages/index/index", + "pages/list/index", + "pages/detail/index", + "pages/manage/index", ], window: { - backgroundTextStyle: 'light', - navigationBarBackgroundColor: '#fff', - navigationBarTitleText: 'WeChat', - navigationBarTextStyle: 'black' - } -}) + backgroundTextStyle: "light", + navigationBarBackgroundColor: "#fff", + navigationBarTitleText: "WeChat", + navigationBarTextStyle: "black", + }, +}); diff --git a/src/app.css b/src/app.css index e69de29..9570bb1 100644 --- a/src/app.css +++ b/src/app.css @@ -0,0 +1,42 @@ +page { + width: 100%; + height: 100%; + background-color: #eff2f6; + position: relative; +} + +.actionWrapper { + position: absolute; + bottom: 0; + /* height: 368px; */ + background-color: #fff; + width: 100%; + display: flex; + justify-content: flex-end; + gap: 24px; + padding: 60px; + padding-bottom: 80px; + box-sizing: border-box; +} + +.okBtn { + width: 357px; + height: 119px; + border-radius: 10px; + background-color: #edf1f7; + display: flex; + align-items: center; + justify-content: center; + color: rgba(46, 108, 255, 1); +} + +.cancelBtn { + width: 357px; + height: 119px; + border-radius: 10px; + background-color: #edf1f7; + display: flex; + align-items: center; + justify-content: center; + color: rgba(252, 74, 99, 1); +} diff --git a/src/app.js b/src/app.js index ae024b6..f14a9e2 100644 --- a/src/app.js +++ b/src/app.js @@ -1,15 +1,13 @@ - -import { useLaunch } from '@tarojs/taro' -import './app.css' +import { useLaunch } from "@tarojs/taro"; +import "./app.css"; function App({ children }) { - useLaunch(() => { - console.log('App launched.') - }) + console.log("App launched."); + }); // children 是将要会渲染的页面 - return children + return children; } -export default App +export default App; diff --git a/src/assets/file.png b/src/assets/file.png new file mode 100644 index 0000000000000000000000000000000000000000..b06aece61ea2de76cc785626d6205be47b939358 GIT binary patch literal 6261 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 literal 0 HcmV?d00001 diff --git a/src/assets/pdf.png b/src/assets/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..8a7ae8c35e47ef75da0dd153029b7dbd05567c08 GIT binary patch literal 6873 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 TIj3+21_lOCS3j3^P6 { + const { value, onChange, options } = props; + + const [selected, setSelected] = useState([]); + + useEffect(() => { + if (typeof value === "object" && !isEqual(value, selected)) { + setSelected(value); + } + }, [value]); + + if (!options || options.length === 0) { + return ( + onChange(e.target.value)} + > + ); + } + + let optionTemp = [...options]; + optionTemp = optionTemp.map((v) => { + if (typeof v === "string") return { label: v, value: v }; + return v; + }); + // console.log(value); + return ( + + { + setSelected(e); + onChange(e.join(",")); + }} + > + {optionTemp.map((item) => { + return ( + + {item.label} + + ); + })} + + + ); +}; + +export default FormCheckbox; diff --git a/src/components/FormComponentRender/index.css b/src/components/FormComponentRender/index.css new file mode 100644 index 0000000..e69de29 diff --git a/src/components/FormComponentRender/index.jsx b/src/components/FormComponentRender/index.jsx new file mode 100644 index 0000000..9550118 --- /dev/null +++ b/src/components/FormComponentRender/index.jsx @@ -0,0 +1,44 @@ +import { useMemo } from "react"; +import FormInput from "../FormInput/index"; +import FormDatePicker from "../FormDatePicker/index"; +import FormTextarea from "../FormTextarea/index"; +import FormRadio from "../FormRadio/index"; +import FormCheckbox from "../FormCheckbox/index"; +import FormImgUpload from "../FormImgUpload/index"; +import FormFileUpload from "../FormFileUpload/index"; +import Radio from "@taroify/core/radio/radio"; + +const RenderComponent = (props) => { + const { config, componentType, ...newProps } = props; + + const componentsRegister = useMemo(() => { + const composeProps = { ...newProps, ...config }; + + switch (componentType) { + case "TextInput": + return ; + case "NumberInput": + return ; + case "DatePicker": + return ; + case "TextAreaInput": + return ; + case "Radio": + return ; + case "Checkbox": + return ; + case "FileUpload": + return ; + case "ImgUpload": + return ; + case "PhoneInput": + return ; + default: + return ""; + } + }, [props]); + + return componentsRegister; +}; + +export default RenderComponent; diff --git a/src/components/FormDatePicker/index.css b/src/components/FormDatePicker/index.css new file mode 100644 index 0000000..99131d6 --- /dev/null +++ b/src/components/FormDatePicker/index.css @@ -0,0 +1,4 @@ +.date_container { + width: 100%; + height: 100%; +} diff --git a/src/components/FormDatePicker/index.jsx b/src/components/FormDatePicker/index.jsx new file mode 100644 index 0000000..2e5edc7 --- /dev/null +++ b/src/components/FormDatePicker/index.jsx @@ -0,0 +1,98 @@ +import { View } from "@tarojs/components"; +import { Popup, DatetimePicker } from "@taroify/core"; +import { useEffect, useMemo, useState } from "react"; +import "./index.css"; +const FormDatePicker = (props) => { + const { isRange, value, onChange, picker = "month" } = props; + const [show, setShow] = useState(false); + const [date, setDate] = useState(new Date()); + + const info = useMemo(() => { + if (picker === "time") { + let dateDesc = undefined; + if (value instanceof Date) { + const hour = value.getHours(); + const min = value.getMinutes(); + const second = value.getSeconds(); + dateDesc = `${hour}:${min}:${second}`; + } + return { + type: "time", + title: "选择时间", + value: dateDesc, + }; + } + if (picker === "date") { + let dateDesc = undefined; + if (value instanceof Date) { + const year = value.getFullYear(); + const month = value.getMonth() + 1; + const day = value.getDate(); + dateDesc = `${year}-${month > 9 ? month : "0" + month}-${day}`; + } + return { + type: "date", + title: "选择日期", + value: dateDesc, + }; + } + if (picker === "month") { + let dateDesc = undefined; + if (value instanceof Date) { + const year = value.getFullYear(); + const month = value.getMonth() + 1; + dateDesc = `${year}-${month > 9 ? month : "0" + month}`; + } + return { + type: "year-month", + title: "选择月份", + value: dateDesc, + }; + } + }, [picker, value]); + + useEffect(() => { + if (value instanceof Date) { + setDate(value); + } + }, [value]); + + const openModal = () => { + setShow(true); + }; + return ( + <> + + {info.value ? ( + info.value + ) : ( + 请选择时间 + )} + + + { + setDate(e); + }} + onCancel={() => { + setShow(false); + }} + onConfirm={() => { + onChange(date); + setShow(false); + }} + > + + 取消 + {info.title} + 确认 + + + + + ); +}; + +export default FormDatePicker; diff --git a/src/components/FormFileUpload/index.css b/src/components/FormFileUpload/index.css new file mode 100644 index 0000000..e3f42f3 --- /dev/null +++ b/src/components/FormFileUpload/index.css @@ -0,0 +1,9 @@ +.fileUpload { + /* width: 90px; */ + height: 90px; + background-color: #f7f8fa; + padding: 0 24px; + display: flex; + align-items: center; + color: #646566; +} diff --git a/src/components/FormFileUpload/index.jsx b/src/components/FormFileUpload/index.jsx new file mode 100644 index 0000000..c2dd572 --- /dev/null +++ b/src/components/FormFileUpload/index.jsx @@ -0,0 +1,47 @@ +import { Uploader } from "@taroify/core"; +import Taro from "@tarojs/taro"; +import { View } from "@tarojs/components"; +import { head } from "lodash"; +import { useState } from "react"; +import "./index.css"; +import { BackTop } from "@taroify/icons"; +const FormFileUpload = (props) => { + const [file, setFile] = useState(); + const { value, onChange } = props; + + function onUpload() { + Taro.chooseMessageFile({ + count: 1, + type: "file", + }).then(({ tempFiles }) => { + setFile({ + url: tempFiles[0].path, + type: tempFiles[0].type, + name: tempFiles[0]?.name, + }); + Taro.uploadFile({ + url: "http://192.168.2.21:21610/oss/upload?bucketName=cgtf", + name: "file", + filePath: tempFiles[0].path, + success: (res) => { + const resData = JSON.parse(res.data); + if (resData.code === 200) { + onChange(resData.data); + } + }, + }); + }); + } + + return ( + + + + 上传文件 + + {file?.name} + + ); +}; + +export default FormFileUpload; diff --git a/src/components/FormImgUpload/index.jsx b/src/components/FormImgUpload/index.jsx new file mode 100644 index 0000000..1816ec1 --- /dev/null +++ b/src/components/FormImgUpload/index.jsx @@ -0,0 +1,35 @@ +import { Uploader } from "@taroify/core"; +import Taro from "@tarojs/taro"; +import { useState } from "react"; +const FormImgUpload = (props) => { + const [file, setFile] = useState(); + const { value, onChange } = props; + function onUpload() { + Taro.chooseImage({ + count: 1, + sizeType: ["original", "compressed"], + sourceType: ["album", "camera"], + }).then(({ tempFiles }) => { + setFile({ + url: tempFiles[0].path, + type: tempFiles[0].type, + name: tempFiles[0].originalFileObj?.name, + }); + Taro.uploadFile({ + url: "http://192.168.2.21:21610/oss/upload?bucketName=cgtf", + name: "file", + filePath: tempFiles[0].path, + success: (res) => { + const resData = JSON.parse(res.data); + if (resData.code === 200) { + onChange(resData.data); + } + }, + }); + }); + } + + return ; +}; + +export default FormImgUpload; diff --git a/src/components/FormInput/index.jsx b/src/components/FormInput/index.jsx new file mode 100644 index 0000000..0d80d83 --- /dev/null +++ b/src/components/FormInput/index.jsx @@ -0,0 +1,25 @@ +import { View } from "@tarojs/components"; +import { Flex, Input } from "@taroify/core"; + +const FormInput = (props) => { + const { placeholder, type, value, onChange, prefix, suffix } = props; + return ( + + {prefix} + { + const value = e.detail.value; + if (onChange) { + onChange(value); + } + }} + /> + {suffix} + + ); +}; + +export default FormInput; diff --git a/src/components/FormRadio/index.jsx b/src/components/FormRadio/index.jsx new file mode 100644 index 0000000..93e1f06 --- /dev/null +++ b/src/components/FormRadio/index.jsx @@ -0,0 +1,24 @@ +import { View, Textarea } from "@tarojs/components"; +import { Radio } from "@taroify/core"; + +const FormRadio = (props) => { + const { value, onChange, option } = props; + + let optionTemp = [...option]; + optionTemp = optionTemp.map((v) => { + if (typeof v === "string") return { label: v, value: v }; + return v; + }); + + return ( + + onChange(e)} value={value}> + {optionTemp.map((item) => { + return {item.label}; + })} + + + ); +}; + +export default FormRadio; diff --git a/src/components/FormTextarea/index.jsx b/src/components/FormTextarea/index.jsx new file mode 100644 index 0000000..61581df --- /dev/null +++ b/src/components/FormTextarea/index.jsx @@ -0,0 +1,25 @@ +import { View, Textarea } from "@tarojs/components"; +// import { Textarea } from "@taroify/core"; + +const FormTextarea = (props) => { + const { placeholder, value, onChange } = props; + return ( + + + + {fileList?.map((item) => { + return ( + + + { + Taro.previewImage({ + current: composeImgUrl(item), + urls: [composeImgUrl(item)], + }); + }} + style={{ width: "100%", height: "100%" }} + > + + ); + })} + + + + + + + {actionObj.nodeName === "审批节点" && ( + + )} + + + + + + ); +}; + +export default Manage; diff --git a/src/service/index.js b/src/service/index.js new file mode 100644 index 0000000..90f0fe7 --- /dev/null +++ b/src/service/index.js @@ -0,0 +1,131 @@ +import Taro from "@tarojs/taro"; + +const dev = "http://192.168.2.21:21610"; +const loginDev = "http://192.168.2.21:21590"; +/** 对象转参数 */ +function objectToQuery(obj) { + return Object.keys(obj) + .map((k) => encodeURIComponent(k) + "=" + encodeURIComponent(obj[k])) + .join("&"); +} + +/** 简单封装 */ +const request = { + post: (url, option = {}) => { + const params = option.params; + let newUrl = dev + url; + if (params) { + newUrl += "?" + objectToQuery(params); + } + return new Promise((resolve, reject) => { + Taro.request({ + url: newUrl, + method: "POST", + ...option, + header: { + Authorization: "Bearer " + Taro.getStorageSync("token"), + ...(option?.header ?? {}), + }, + success: (res) => { + resolve(res.data); + }, + fail: (err) => { + reject(err); + }, + }); + }); + }, + get: (url, option = {}) => { + let newUrl = dev + url; + return new Promise((resolve, reject) => { + Taro.request({ + url: newUrl, + method: "GET", + header: { + Authorization: "Bearer" + Taro.getStorageSync("token"), + }, + ...option, + success: (res) => { + resolve(res.data); + }, + fail: (err) => { + reject(err); + }, + }); + }); + }, +}; + +/** 获取模版配置 */ +async function getTemplateConfig(id) { + return request.post("/hncy/matterInfo/getInfo", { + params: { + id, + }, + }); +} + +/** 获取申请内容 */ +async function getApplicationFormDetail(id) { + return request.post("/hncy/record/getDetails", { + params: { id }, + }); +} +/** 登录 */ +async function login(password, username) { + const params = { + username: username, + password: password, + grant_type: "password", + client_id: "cgtf", + client_secret: "cgtf", + }; + return request.post("", { + url: loginDev + "/auth/oauth/token" + "?" + objectToQuery(params), + header: {}, + }); +} +/** 获取全部待办 */ +async function getBacklog(params) { + return request.post("/hncy/record/list", { + params: params, + }); +} + +async function getBacklogHistory(params) { + return request.post("/hncy/record/list", { + params: { ...params, done: true }, + }); +} + +async function getExamineHistory(id) { + return request.get("/hncy/flow/approve-history-list", { + data: { + businessId: id, + }, + }); +} +export function completeExamine(data) { + return request.post("/hncy/flow/complete", { + header: { + "content-type": "application/x-www-form-urlencoded", + }, + data, + }); +} +export function submitForm(data) { + return request.post("/hncy/record/approveEditReportContent", { + data, + }); +} + +export default { + login, + getBacklog, + getTemplateConfig, + getApplicationFormDetail, + getExamineHistory, + completeExamine, + submitForm, + getBacklogHistory, +}; diff --git a/src/store/useUserStore.js b/src/store/useUserStore.js new file mode 100644 index 0000000..8a6daef --- /dev/null +++ b/src/store/useUserStore.js @@ -0,0 +1,16 @@ +import { create } from "zustand"; + +/** 全局状态管理 */ +const useGlobalStore = create()((set) => ({ + actionObj: undefined, + configSource: undefined, + /** 更新 */ + updateActionObj: (obj) => { + set({ actionObj: obj }); + }, + updateConfigSource: (obj) => { + set({ configSource: obj }); + }, +})); + +export default useGlobalStore; diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 0000000..708cbff --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,39 @@ +export function buildListByGroupId(target) { + const groupList = []; + + const groupMap = {}; + + target.forEach((formConfig) => { + if (!groupMap[formConfig?.groupId]) { + groupMap[formConfig?.groupId] = []; + } + groupMap[formConfig?.groupId].push(formConfig); + }); + + for (const groupTitle in groupMap) { + if (groupMap.hasOwnProperty(groupTitle)) { + groupList.push({ + title: groupTitle, + list: groupMap[groupTitle], + }); + } + } + + return groupList; +} + +export function composeImgUrl(imgStr) { + return `http://192.168.2.24:9000${imgStr}`; +} + +export function inversionSerializationRule(inputStr) { + let value = JSON.parse(inputStr); + + if (Array.isArray(value) && value.length > 0) { + // + const regexString = value[0].pattern.slice(1, -1); + value[0].pattern = new RegExp(regexString); + } + + return value; +} diff --git a/yarn.lock b/yarn.lock index d06fa90..7432a5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -154,7 +154,7 @@ "@babel/traverse" "^7.24.8" "@babel/types" "^7.24.8" -"@babel/helper-module-imports@^7.24.7": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== @@ -1158,7 +1158,7 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.14.5", "@babel/runtime@^7.21.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.14.5", "@babel/runtime@^7.21.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e" integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA== @@ -1901,6 +1901,34 @@ dependencies: defer-to-connect "^1.0.1" +"@taroify/core@^0.3.1-alpha.0": + version "0.3.1-alpha.0" + resolved "https://registry.yarnpkg.com/@taroify/core/-/core-0.3.1-alpha.0.tgz#f1618f1cc4a7e3b9a226059d1494e2d55fd6568d" + integrity sha512-V8tRQ5ZeX1uIrjp84grD2UR1WiDMIr9A5aQIu40r2c8zx/YsSRqx0J/FLkhO0Zvo9sX3A7y+BP+fz06EW0xegw== + dependencies: + "@taroify/hooks" "^0.3.1-alpha.0" + "@taroify/icons" "^0.3.1-alpha.0" + classnames "^2.2.6" + lodash "^4.17.21" + promise "^8.1.0" + raf "^3.4.1" + react-is "^18.2.0" + react-transition-group "^4.4.1" + +"@taroify/hooks@^0.3.1-alpha.0": + version "0.3.1-alpha.0" + resolved "https://registry.yarnpkg.com/@taroify/hooks/-/hooks-0.3.1-alpha.0.tgz#b4d7b9cac278405f7da55a0b169b21d01db2213f" + integrity sha512-Ag8iYIgAeBW3etBDTZl6VxgaqXTYmww7g2IknAGa4U8oxjXaI6U3ukiINGXrY0VMLxoTkoRakDb0YeKj4laS4w== + dependencies: + "@vant/area-data" "^1.2.1" + +"@taroify/icons@^0.3.1-alpha.0": + version "0.3.1-alpha.0" + resolved "https://registry.yarnpkg.com/@taroify/icons/-/icons-0.3.1-alpha.0.tgz#9709fd7eb0c056da8cbb88b30415730d693f5baf" + integrity sha512-NDysyREjLb0UZOTKx4pOSyUcWs+ZJ7IofQgkckX6OF0TbsNA+1YlSiI0HKB0kWUNi4oL/71jvt21U3qdrsbpEg== + dependencies: + classnames "^2.2.6" + "@tarojs/api@3.6.33": version "3.6.33" resolved "https://registry.yarnpkg.com/@tarojs/api/-/api-3.6.33.tgz#e787c7d2c28d89cb99896adca5af781c094e875d" @@ -2874,6 +2902,11 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@vant/area-data@^1.2.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@vant/area-data/-/area-data-1.5.1.tgz#bdd943b9b569476cb04133a8323bd04aa35be2c2" + integrity sha512-gR5TPEzTbxN1cTK1aDhCoyikSCLX7DAacxyXoKyI4SAsYYTZrDl/nLgQFIm9vLsvWzlPIda8xV8/U3x7M9k6ww== + "@vue/compiler-core@3.4.31": version "3.4.31" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.31.tgz#b51a76f1b30e9b5eba0553264dff0f171aedb7c6" @@ -3409,6 +3442,11 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -3521,6 +3559,13 @@ babel-plugin-dynamic-import-node@2.3.3: dependencies: object.assign "^4.1.0" +babel-plugin-import@^1.13.8: + version "1.13.8" + resolved "https://registry.yarnpkg.com/babel-plugin-import/-/babel-plugin-import-1.13.8.tgz#782c517f6bbf2de3b1f75aaafd6d20a491c4878c" + integrity sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -4055,7 +4100,7 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== -classnames@^2.2.5: +classnames@^2.2.5, classnames@^2.2.6, classnames@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== @@ -5002,6 +5047,14 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" @@ -9856,6 +9909,13 @@ promise-polyfill@^7.1.0: resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-7.1.2.tgz#ab05301d8c28536301622d69227632269a70ca3b" integrity sha512-FuEc12/eKqqoRYIGBrUptCBRhobL19PS2U31vMNTfyck1FxPyMfgsXyW4Mav85y/ZN1hop3hOwRlUDok23oYfQ== +promise@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -9864,7 +9924,7 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9982,6 +10042,13 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -10042,7 +10109,7 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-is@^18.0.0: +react-is@^18.0.0, react-is@^18.2.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== @@ -10065,6 +10132,16 @@ react-refresh@^0.4.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== +react-transition-group@^4.4.1: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" @@ -11801,6 +11878,11 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -12390,3 +12472,10 @@ yup@^1.2.0: tiny-case "^1.0.3" toposort "^2.0.2" type-fest "^2.19.0" + +zustand@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.4.tgz#63abdd81edfb190bc61e0bbae045cc4d52158a05" + integrity sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg== + dependencies: + use-sync-external-store "1.2.0" -- GitLab