From 82b8d215065646cb89f8c99f025577ec3a42724d Mon Sep 17 00:00:00 2001 From: lnljyang <506960565@qq.com> Date: Tue, 30 Dec 2025 09:44:46 +0800 Subject: [PATCH] Initial commit --- .gitignore | 5 + App.vue | 65 + README.en.md | 36 + README.md | 39 + api/annualReview.js | 31 + api/audit.js | 47 + api/dic.js | 0 api/examination.js | 23 + api/failure.js | 25 + api/fault.js | 10 + api/index.js | 16 + api/login.js | 22 + api/maintainTodo.js | 32 + api/map.js | 48 + api/returnCar.js | 93 + api/returnCost.js | 63 + api/standbyVehicle.js | 67 + api/truck.js | 33 + api/truckPreparation.js | 20 + api/truckRent.js | 44 + api/unusualActionApply.js | 54 + components/ba-tree-picker/README.md | 124 + components/ba-tree-picker/ba-tree-picker.vue | 775 ++++ components/dic-select/dic-select.vue | 88 + components/dic-select/select-show.vue | 70 + .../multiple-picker/multiple-picker.vue | 262 ++ components/no-bad-table/loading.vue | 73 + components/no-bad-table/table.scss | 293 ++ components/no-bad-table/table.vue | 841 ++++ components/tabBar/tabBar.vue | 163 + components/upload_img_video.vue | 153 + index.html | 20 + main.js | 90 + manifest.json | 98 + package-lock.json | 954 ++++ package.json | 19 + pageSub/annualReview/detail.vue | 1831 ++++++++ pageSub/annualReview/index.vue | 294 ++ pageSub/failure/detail.vue | 1832 ++++++++ pageSub/failure/index.vue | 272 ++ pageSub/returnCarCost/detail.vue | 1669 +++++++ pageSub/returnCarCost/index.vue | 348 ++ pageSub/truckPreparation/detail.vue | 1600 +++++++ pageSub/truckPreparation/index.vue | 287 ++ pages.json | 277 ++ pages/audit/detail.vue | 1052 +++++ pages/audit/index.vue | 290 ++ pages/face/index.vue | 87 + pages/index/index.vue | 673 +++ pages/login/login.vue | 187 + pages/login/user-login/index.vue | 372 ++ pages/maintain/detail.vue | 2060 +++++++++ pages/maintain/index.vue | 309 ++ pages/map/index.vue | 1639 +++++++ pages/my/my.vue | 84 + pages/returnCar/cost.vue | 1917 ++++++++ pages/returnCar/detail.vue | 3869 +++++++++++++++++ pages/returnCar/index.vue | 582 +++ pages/standbyVehicle/detail.vue | 591 +++ pages/standbyVehicle/detailInfo.vue | 1031 +++++ pages/standbyVehicle/index.vue | 288 ++ pages/truckRent/detail.vue | 3331 ++++++++++++++ pages/truckRent/detailInfo.vue | 625 +++ pages/truckRent/index.vue | 478 ++ pages/truckRent/modal.vue | 112 + pages/unusualActionApply/detail.vue | 1896 ++++++++ pages/unusualActionApply/index.vue | 416 ++ pages/webview/index.vue | 39 + patches/uview-ui+2.0.38.patch | 32 + project.config.json | 35 + project.private.config.json | 22 + static/audit.png | Bin 0 -> 854 bytes static/baoyang.png | Bin 0 -> 1834 bytes static/beiche.png | Bin 0 -> 2963 bytes static/bi.png | Bin 0 -> 558 bytes static/chongdianzhan.png | Bin 0 -> 1384 bytes static/chongdianzhan_white.png | Bin 0 -> 710 bytes static/cost.png | Bin 0 -> 4371 bytes static/detail.png | Bin 0 -> 938 bytes static/electricity.png | Bin 0 -> 721 bytes static/expand-left-line.png | Bin 0 -> 1238 bytes static/fault.png | Bin 0 -> 1212 bytes static/g_bg.png | Bin 0 -> 4543 bytes static/huanche.png | Bin 0 -> 2427 bytes static/hydrogen.png | Bin 0 -> 881 bytes static/hydrogenStation.png | Bin 0 -> 1129 bytes static/jiaoche.png | Bin 0 -> 4038 bytes static/jiaqingzhan.png | Bin 0 -> 839 bytes static/kachetou.png | Bin 0 -> 842 bytes static/login_bg.png | Bin 0 -> 5607 bytes static/logo.jpg | Bin 0 -> 2678 bytes static/logo.png | Bin 0 -> 42159 bytes static/logo3.png | Bin 0 -> 4933 bytes static/mapcar.png | Bin 0 -> 1386 bytes static/mapcar2.png | Bin 0 -> 1406 bytes static/maph.png | Bin 0 -> 484 bytes static/maph2.png | Bin 0 -> 454 bytes static/nianshen.png | Bin 0 -> 1462 bytes static/offline.png | Bin 0 -> 1319 bytes static/online-exam.svg | 1 + static/online.png | Bin 0 -> 1046 bytes static/pdf.png | Bin 0 -> 2285 bytes static/reset.png | Bin 0 -> 1282 bytes static/yidong.png | Bin 0 -> 1409 bytes static/zhengbei.png | Bin 0 -> 5730 bytes static/附件上传.png | Bin 0 -> 1422 bytes store/index.js | 24 + template.html | 28 + uni.promisify.adaptor.js | 11 + uni.scss | 82 + .../curry-multi-select/curry-multi-select.vue | 293 ++ uni_modules/curry-multi-select/package.json | 29 + uni_modules/uni-data-select/changelog.md | 39 + .../uni-data-select/uni-data-select.vue | 562 +++ uni_modules/uni-data-select/package.json | 86 + uni_modules/uni-data-select/readme.md | 8 + uni_modules/uni-load-more/changelog.md | 25 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 404 ++ uni_modules/uni-load-more/package.json | 84 + uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + utils/auth.js | 26 + utils/fileManager.js | 623 +++ utils/init.js | 50 + utils/key.js | 26 + utils/permission.js | 74 + utils/request.js | 580 +++ utils/storage.js | 32 + utils/time.js | 35 + 147 files changed, 39113 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 README.en.md create mode 100644 README.md create mode 100644 api/annualReview.js create mode 100644 api/audit.js create mode 100644 api/dic.js create mode 100644 api/examination.js create mode 100644 api/failure.js create mode 100644 api/fault.js create mode 100644 api/index.js create mode 100644 api/login.js create mode 100644 api/maintainTodo.js create mode 100644 api/map.js create mode 100644 api/returnCar.js create mode 100644 api/returnCost.js create mode 100644 api/standbyVehicle.js create mode 100644 api/truck.js create mode 100644 api/truckPreparation.js create mode 100644 api/truckRent.js create mode 100644 api/unusualActionApply.js create mode 100644 components/ba-tree-picker/README.md create mode 100644 components/ba-tree-picker/ba-tree-picker.vue create mode 100644 components/dic-select/dic-select.vue create mode 100644 components/dic-select/select-show.vue create mode 100644 components/multiple-picker/multiple-picker.vue create mode 100644 components/no-bad-table/loading.vue create mode 100644 components/no-bad-table/table.scss create mode 100644 components/no-bad-table/table.vue create mode 100644 components/tabBar/tabBar.vue create mode 100644 components/upload_img_video.vue create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pageSub/annualReview/detail.vue create mode 100644 pageSub/annualReview/index.vue create mode 100644 pageSub/failure/detail.vue create mode 100644 pageSub/failure/index.vue create mode 100644 pageSub/returnCarCost/detail.vue create mode 100644 pageSub/returnCarCost/index.vue create mode 100644 pageSub/truckPreparation/detail.vue create mode 100644 pageSub/truckPreparation/index.vue create mode 100644 pages.json create mode 100644 pages/audit/detail.vue create mode 100644 pages/audit/index.vue create mode 100644 pages/face/index.vue create mode 100644 pages/index/index.vue create mode 100644 pages/login/login.vue create mode 100644 pages/login/user-login/index.vue create mode 100644 pages/maintain/detail.vue create mode 100644 pages/maintain/index.vue create mode 100644 pages/map/index.vue create mode 100644 pages/my/my.vue create mode 100644 pages/returnCar/cost.vue create mode 100644 pages/returnCar/detail.vue create mode 100644 pages/returnCar/index.vue create mode 100644 pages/standbyVehicle/detail.vue create mode 100644 pages/standbyVehicle/detailInfo.vue create mode 100644 pages/standbyVehicle/index.vue create mode 100644 pages/truckRent/detail.vue create mode 100644 pages/truckRent/detailInfo.vue create mode 100644 pages/truckRent/index.vue create mode 100644 pages/truckRent/modal.vue create mode 100644 pages/unusualActionApply/detail.vue create mode 100644 pages/unusualActionApply/index.vue create mode 100644 pages/webview/index.vue create mode 100644 patches/uview-ui+2.0.38.patch create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 static/audit.png create mode 100644 static/baoyang.png create mode 100644 static/beiche.png create mode 100644 static/bi.png create mode 100644 static/chongdianzhan.png create mode 100644 static/chongdianzhan_white.png create mode 100644 static/cost.png create mode 100644 static/detail.png create mode 100644 static/electricity.png create mode 100644 static/expand-left-line.png create mode 100644 static/fault.png create mode 100644 static/g_bg.png create mode 100644 static/huanche.png create mode 100644 static/hydrogen.png create mode 100644 static/hydrogenStation.png create mode 100644 static/jiaoche.png create mode 100644 static/jiaqingzhan.png create mode 100644 static/kachetou.png create mode 100644 static/login_bg.png create mode 100644 static/logo.jpg create mode 100644 static/logo.png create mode 100644 static/logo3.png create mode 100644 static/mapcar.png create mode 100644 static/mapcar2.png create mode 100644 static/maph.png create mode 100644 static/maph2.png create mode 100644 static/nianshen.png create mode 100644 static/offline.png create mode 100644 static/online-exam.svg create mode 100644 static/online.png create mode 100644 static/pdf.png create mode 100644 static/reset.png create mode 100644 static/yidong.png create mode 100644 static/zhengbei.png create mode 100644 static/附件上传.png create mode 100644 store/index.js create mode 100644 template.html create mode 100644 uni.promisify.adaptor.js create mode 100644 uni.scss create mode 100644 uni_modules/curry-multi-select/components/curry-multi-select/curry-multi-select.vue create mode 100644 uni_modules/curry-multi-select/package.json create mode 100644 uni_modules/uni-data-select/changelog.md create mode 100644 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue create mode 100644 uni_modules/uni-data-select/package.json create mode 100644 uni_modules/uni-data-select/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 utils/auth.js create mode 100644 utils/fileManager.js create mode 100644 utils/init.js create mode 100644 utils/key.js create mode 100644 utils/permission.js create mode 100644 utils/request.js create mode 100644 utils/storage.js create mode 100644 utils/time.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a42e93e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.idea/ +/.hbuilderx/ +/unpackage/dist/dev/ +/unpackage/dist/build/ +/node_modules/ \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..9b68f21 --- /dev/null +++ b/App.vue @@ -0,0 +1,65 @@ + + + + \ No newline at end of file diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..420805b --- /dev/null +++ b/README.en.md @@ -0,0 +1,36 @@ +# 资产管理平台小程序 + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md new file mode 100644 index 0000000..f2fb07f --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# 资产管理平台小程序 + +#### 介绍 +{**以下是 Gitee 平台说明,您可以替换此简介** +Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 +无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/api/annualReview.js b/api/annualReview.js new file mode 100644 index 0000000..2a72a76 --- /dev/null +++ b/api/annualReview.js @@ -0,0 +1,31 @@ +import axios from "@/utils/request"; + +export default { + queryTakePageList(params) { + return axios.post(`/vehicle/vehicleAnnualInspection/queryPageList`, params); // 年审列表 + }, + getTakeId(params) { + return axios.get(`/vehicle/vehicleAnnualInspection/getVoById`, params); // 年审详情 + }, + getAnnualInspectionStatusName(params) { + return axios.get(`/dic/queryByDicType`, { + dicType: "dic_annual_inspection_status", + }); // 字典数据 + }, + save(params) { + return axios.post(`/vehicle/vehicleAnnualInspection/save`, params); // add edit + }, + queryIdNames(params) { + return axios.get(`/annualReviewServiceStation/queryIdNames`, params); // 年检服务站名称 + }, + getToDo(params) { + return axios.get(`/vehicle/vehicleAnnualInspection/getToDo`, params); // 年检服务站名称 + }, + //获取年审服务站列表 + // queryStationPageList(params) { + // return axios.post( + // `/vehicle/annualInspectionServiceStation/queryPageList`, + // params + // ); // 年审列表 + // }, +}; diff --git a/api/audit.js b/api/audit.js new file mode 100644 index 0000000..6e30066 --- /dev/null +++ b/api/audit.js @@ -0,0 +1,47 @@ +import axios from "@/utils/request"; + +export default { + // queryAuditList(params) { + // return axios.post(`/truckRentTask/queryTakePageList`, params); + // }, + //获取待我审批/getWaitApprovePageList + queryAuditList(params) { + return axios.get(`/contract/getWaitApprovePageList`, params); + }, + //获取已审批 + queryAuditedList(params) { + return axios.get(`/contract/getApprovedPageList`, params); + }, + //审批历史记录 + getFlowTaskHistoryList(params) { + return axios.get(`/flow/getFlowTaskHistoryList`, params); + }, + getAuditId(params) { + return axios.get(`/contract/getById`, params); + }, + + //审批通过 + approve(params) { + return axios.post(`/flow/approve`, params); + }, + //审批驳回 + reject(params) { + return axios.post(`/flow/reject`, params); + }, + //审批流程回调业务 + changeStatusByFlowTask(params) { + return axios.post(`/contract/changeStatusByFlowTask`, params); + }, + + //生成提车前应收款 ==yongyin + makeContractBill(params) { + return axios.post(`/contract/makeContractBill`, params); + }, + + getSalesManagerDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "sales_manager" }); + }, + getAddress(params) { + return axios.post(`/baidumap/getAddress`, params); + }, +}; diff --git a/api/dic.js b/api/dic.js new file mode 100644 index 0000000..e69de29 diff --git a/api/examination.js b/api/examination.js new file mode 100644 index 0000000..80afbf3 --- /dev/null +++ b/api/examination.js @@ -0,0 +1,23 @@ +import axios from "@/utils/request"; + +export default { + //考场 + queryPage(params) { + return axios.get("/trainExam/queryPageListForCurrentUser",params); + }, + //考试记录 + examRecords(params) { + return axios.get("/trainExamRecord/queryPageListForDriver",params); + }, + getExamPaper(params){ + return axios.get("/trainExam/getVoById",params); + }, + //获取考试后的试卷 + getDoneExamPaper(params){ + return axios.get("/trainExamRecord/queryVoById",params); + }, + //提交交卷 + rollIn(params){ + return axios.post("/trainExamRecord/submitExam",params); + } +} \ No newline at end of file diff --git a/api/failure.js b/api/failure.js new file mode 100644 index 0000000..1b6cc5a --- /dev/null +++ b/api/failure.js @@ -0,0 +1,25 @@ +import axios from "@/utils/request"; + +export default { + queryPageList(params) { + return axios.get(`/run/failure/queryPageForWeixin`, params); + }, + getTakeId(params) { + return axios.get(`/run/failure/getById`, params); + }, + getMaintain(params) { + return axios.get(`/maintain/queryPage`, params); // 维修站信息 + }, + add(params){ + return axios.post(`/run/failure/add`, params); // 添加 + }, + edit(params){ + return axios.put(`/run/failure/edit`, params); // 修改 + }, + queryTruckRentInfo(params) { + return axios.get(`/contractRentTruck/queryTruckRentInfo`, params); // 查询单个车辆租赁信息 + }, + getMaintainanceList(params) { + return axios.get(`/maintain/queryPage`, params) // 查询维修站点分页 + } +} \ No newline at end of file diff --git a/api/fault.js b/api/fault.js new file mode 100644 index 0000000..92f780d --- /dev/null +++ b/api/fault.js @@ -0,0 +1,10 @@ +import axios from "@/utils/request"; + +export default { + addById(params) { + return axios.put(`/run/failure/mobileReport`, params); + }, + queryPageList(params){ + return axios.get("/run/failure/queryPage",params); + } +} \ No newline at end of file diff --git a/api/index.js b/api/index.js new file mode 100644 index 0000000..d36e65e --- /dev/null +++ b/api/index.js @@ -0,0 +1,16 @@ +/** + * url 映射 + * @author WangLongFei/Alisdon <920124512@qq.com> + */ +const files = require.context('../api', false, /\.js$/); +const modules = {}; + +files.keys().forEach(key => { + if (key !== './index.js') { + modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default; + } +}); + +export default { + ...modules +}; diff --git a/api/login.js b/api/login.js new file mode 100644 index 0000000..915abd4 --- /dev/null +++ b/api/login.js @@ -0,0 +1,22 @@ +import axios from "@/utils/request"; + +export default { + loginByPhoneForDriver(params) { + return axios.post(`/auth/loginByPhoneForDriver`, params); + }, + loginDriver(params) { + return axios.post(`/auth/loginForDriver`, params); + }, + loginUser(params) { + return axios.post(`/auth/login`, params); + }, + logout() { + return axios.get(`/auth/logout`); + }, + getUserInfo() { + return axios.get(`/auth/getLoginUserInfo`); + }, + getUserMenu() { + return axios.get(`/menu/userMenu`); + }, +}; \ No newline at end of file diff --git a/api/maintainTodo.js b/api/maintainTodo.js new file mode 100644 index 0000000..7bd95ec --- /dev/null +++ b/api/maintainTodo.js @@ -0,0 +1,32 @@ +import axios from "@/utils/request"; +//保养待办接口 +export default { + queryPageList(params) { + return axios.get(`/maintenanceAgent/queryPageList`, params); + }, + add(params) { + return axios.put(`/maintenanceAgent/add`, params); //接口在车辆整备那边调用 + }, + edit(params) { + return axios.put(`/maintenanceAgent/edit`, params); + }, + getById(params) { + return axios.get(`/maintenanceAgent/getAgentInfoById`, params); + }, + //获取保养记录列表 + getMaintainInfoByCarId(params) { + return axios.get(`/maintenanceAgent/getNewAgentItemInfoById`, params); + }, + //查看保养记录 + getRecords(params) { + return axios.get(`/maintenanceAgent/getAgentItemListByIds`, params); + }, + getCostInfoByIds(params) { + return axios.post(`/maintenanceAgent/getAgentItemListByIdss`, params); + }, + getPayeeType() { + return axios.get(`/dic/queryByDicType`, { + dicType: "dic_maintenance_payee_type", + }); // 字典数据 收款方类型 + }, +}; diff --git a/api/map.js b/api/map.js new file mode 100644 index 0000000..82b03bd --- /dev/null +++ b/api/map.js @@ -0,0 +1,48 @@ +import axios from "@/utils/request"; + +export default { + getHydrogenList(params) { + return axios.get(`/WechatLiteApp/Station/search`, params); + }, + getVehicleMarkers(params) { + return axios.post(`/WechatLiteApp/Truck/list`, params); + }, + getHydrogenStationMarkers(params) { + return axios.post(`/WechatLiteApp/Station/list`, params); + }, + //车辆详情 + getVehicleDetail(params) { + return axios.get(`/WechatLiteApp/Truck/info`, params); + }, + //氢站详情 + getHydrogenDetail(params) { + return axios.get(`/WechatLiteApp/Station/info`, params); + }, + //获取下拉查询车牌号列表 + getAllplateNumbere(params) { + return axios.get(`/WechatLiteApp/Truck/search`, params); + }, + getAddress(params) { + return axios.post(`/baidumap/getAddress`, params); + }, + getTruckInfoTree(params) { + return axios.get(`/WechatLiteApp/Truck/infoTree`, params); + }, + getStationInfoTree() { + return axios.get(`/WechatLiteApp/Station/infoTree`); + }, + getOrgsList() { + return axios.get(`/org/queryListByPid`); + }, + getPlateAreaDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_plateArea" }); // 付款状态 + }, + getOwnDepartDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "businessDepartment" }); // 业务部门 + }, + getHydrogenCoopDic() { + return axios.get(`/dic/queryByDicType`, { + dicType: "weappMap_cooperation", + }); // 合作状态 + }, +}; diff --git a/api/returnCar.js b/api/returnCar.js new file mode 100644 index 0000000..0b67e85 --- /dev/null +++ b/api/returnCar.js @@ -0,0 +1,93 @@ +import axios from "@/utils/request"; + +export default { + queryTakePageList(params) { + return axios.post(`/truckRentTask/queryReturnPageList`, params); // 还车单列表 + }, + getTakeId(params) { + return axios.get(`/truckRentTask/getReturn`, params); // 还车单详情 + }, + getSalesManagerDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "sales_manager" }); // 字典数据 + }, + getAddress(params) { + return axios.post(`/baidumap/getAddress`, params); // 百度地图 获取当前位置 + }, + addTake(params) { + return axios.post(`/truckRentTask/addReturn`, params); // 添加还车单 + }, + generateWordforReturn(params) { + return axios.post(`/truckRentTask/generateWordforReturn`, params); // 生成交车单确认文档 + }, + validateTruckByIds(params) { + return axios.get(`/contractRentTruck/validateTruckByIds`, params); // 验证车辆是否可用 + }, + getFormDataTemplate(params) { + return axios.get(`/truckRentTask/getFormDataTemplate`, params); // 获取表单数据模版 + }, + initiateSignature(params) { + return axios.post(`/truckRentTask/initiateSignature`, params); // 发起电子签章 + }, + getSignatureUrl(params) { + return axios.post(`/truckRentTask/getSignatureUrl`, params); // 获取电子签章签署链接 + }, + fileDownloadUrl(params) { + return axios.post(`/truckRentTask/fileDownloadUrl`, params); // 下载已签署文件 + }, + //查询二级科目id和名称列表 + getQuerySubjectTowNames(params) { + return axios.get(`/finance/financeCostType/querySubjectTowNames`, params); + // return axios.get(`/dic/queryByDicType`, { + // dicType: "dic_returncar_money_item", + // }); // 字典数据 + }, + // 还车 + startReturn(params) { + return axios.post(`/truckRentTask/startReturn`, params); + }, + // 撤销还车 + cancelReturn(params) { + return axios.post(`/truckRentTask/repealReturn`, params); + }, + // 还车到达 + sureReturn(params) { + return axios.post(`/truckRentTask/vehicleArrival`, params); + }, + // 财务费用结算 + financeCost(params) { + return axios.post(`/truckRentReturnCost/checkCostInfo`, params); + }, + // 编辑费用核算信息 + editCostInfo(params) { + return axios.post(`/truckRentReturnCost/editCostInfo`, params); + }, + // 获取费用核算信息 + getCostInfo(params) { + return axios.get(`/truckRentReturnCost/getCostInfoById`, params); + }, + getCostDeps() { + return axios.get(`/dic/queryByDicType`, { + dicType: "settlement_department", + }); // 字典数据 + }, + // 停车场列表 + getParkingPageList(params) { + return axios.get(`/parking/queryPageList`, params); + }, + // 维修站列表 + getFixPageList(params) { + return axios.get(`/maintain/getNames`, { params }); + }, + updateParking(params) { + return axios.post(`/truckRentTask/updateParkingInfo`, params); // 更新停车场信息 + }, + + getLocationTypeList() { + return axios.get(`/dic/queryByDicType`, { + dicType: "return_location_type", + }); + }, // 获取还车地点类型 + clearSignInfo(params) { + return axios.post(`/truckRentTask/clearSignInfo`, params); // 清除签名信息 + }, +}; diff --git a/api/returnCost.js b/api/returnCost.js new file mode 100644 index 0000000..a29a848 --- /dev/null +++ b/api/returnCost.js @@ -0,0 +1,63 @@ +import axios from "@/utils/request"; + +export default { + queryPageList(params) { + return axios.post(`/truckRentReturnCost/getCostPageList`, params); // 还车单列表 + }, + getTakeId(params) { + return axios.get(`/truckRentTask/getReturn`, params); // 还车单详情 + }, + //查询二级科目id和名称列表 + getQuerySubjectTowNames(params) { + return axios.get(`/finance/financeCostType/querySubjectTowNames`, params); + // return axios.get(`/dic/queryByDicType`, { + // dicType: "dic_returncar_money_item", + // }); // 字典数据 + }, + // 财务费用结算 + financeCost(params) { + return axios.post(`/truckRentReturnCost/checkCostInfo`, params); + }, + // 编辑费用核算信息 + editCostInfo(params) { + return axios.post(`/truckRentReturnCost/editCostInfo`, params); + }, + // 获取费用核算信息 + getCostInfo(params) { + return axios.get(`/truckRentReturnCost/getCheckingCostInfoById`, params); + }, + getCostDeps() { + return axios.get(`/dic/queryByDicType`, { + dicType: "settlement_department", + }); // 字典数据 + }, + //审批流程回调业务 + changeStatusByFlowTask(params) { + return axios.post(`/truckRentReturnCost/changeStatusByFlowTask`, params); + }, + //还车费用核算 财务费用结算(新) + financeSettleAccounts(params) { + return axios.post(`/truckRentReturnCost/financeSettleAccounts`, params); + }, + // 获取待办数量 + getCostToDo() { + return axios.get(`/truckRentReturnCost/getTodoCount`); + }, + + // 还车费用核算 车辆是否含有无忧包服务 + getIsHasOKPack(params) { + return axios.get(`/truckRentReturnCost/hasOKPack`, params); + }, + //审批通过后付款确认:记录当前人、状态和时间 + paymentConfirm(params) { + // { + // "id": 0, + // "status": 0 + // } + return axios.post(`/truckRentReturnCost/paymentConfirm`, params); + }, + // 还车费用核算 能源部门获取客户能源余额 + // getEnergyBalance(params) { + // return axios.get(`/truckRentReturnCost/getEnergyBalance`, params); + // }, +}; diff --git a/api/standbyVehicle.js b/api/standbyVehicle.js new file mode 100644 index 0000000..45be20e --- /dev/null +++ b/api/standbyVehicle.js @@ -0,0 +1,67 @@ +import axios from "@/utils/request"; + +export default { + queryPageList(params) { + return axios.post(`/standbyVehicleMain/queryPageList`, params); + }, + getTodo(params) { + return axios.get(`/standbyVehicleMain/getTodo`, params) + }, + getById(params) { + return axios.get(`/standbyVehicleMain/getById`, params) + }, + saveStandbyVehicleDetail(params) { + return axios.post(`/standbyVehicleMain/saveStandbyVehicleDetail`, params) + }, + getVehicleBrand() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_vehicle_brand" }) + }, + getBrandListByMode(params) { + return axios.get(`/truck/getBrandListByMode`, params) + }, + getTruckType() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_truck_type" }) + }, + getYesNoDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_yes_no" }) + }, + getTypeName() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_failure_type" })// 故障类型 + }, + getFailureStatusName() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_is_settle_status" })// 故障状态 + }, + getFaultSourceName() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_fault_source" })// 故障来源 + }, + getCityName() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_unusual_action_apply_city_code" })// 城市 + }, + getCostTypeName() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_fault_cost_type" })// 费用类型 + }, + getPayerName() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_fault_payer" })// 付款方 + }, + getPaymentStatusDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "dic_pub_payment_status" })// 付款状态 + }, + saveCache(params) { + return axios.post(`/standbyVehicleMain/saveCache`, params); + }, + getCache(params) { + return axios.get(`/standbyVehicleMain/getCache`, params) + }, + delCache(params) { + return axios.get(`/standbyVehicleMain/delCache`, params); + }, + getOpManagerPhone(params) { + return axios.get(`/standbyVehicleMain/getOperationsManagerByRegion`, params) + }, + edit(params) { + return axios.put(`/standbyVehicleMain/edit`, params) + }, + getFormDataListByTruckId(params) { + return axios.get(`/standbyVehicleMain/getFormDataListByTruckId`, params) + } +} \ No newline at end of file diff --git a/api/truck.js b/api/truck.js new file mode 100644 index 0000000..8375b19 --- /dev/null +++ b/api/truck.js @@ -0,0 +1,33 @@ +import axios from "@/utils/request"; + +export default { + queryInStoreList(params) { + return axios.get(`/truck/queryInStoreList`, params); + }, + queryAuthListByPlateNumber(params) { + return axios.get(`/truck/queryAuthListByPlateNumber`, params); + }, + getTruckPageList(params) { + return axios.get(`/truck/queryList`, params); + }, + // 用户权限范围的车辆 + queryAuthList(params) { + return axios.get(`/truck/queryAuthList`, params); + }, + //2025.4 hefei新增列表查询所有车辆接口 只返回ID NUMBER 后增加品牌,车型 + getAllTruckList(params) { + return axios.get(`/truck/getAllTruckList`, params); + }, + //2025.4 hefei新增列表查询实时数据接口 + getActualDataByVin(params) { + return axios.get(`/truck/getActualDataByVin`, params); + }, + //用来查询车辆状态的接口,judgementTruckRentStatus,Swagger为“根据车牌号判断该车状态”,返回出具体车辆的状态,例如在库,自营或者租赁状态。 + getTruckRentStatus(params) { + return axios.get(`/truck/judgementTruckRentStatus`, params); + }, + queryInStoreListWithStatus(params) { + //queryInStoreList的全车辆版本,备车那边有需求25.9.26 任政 + return axios.get(`/truck/queryInStoreListWithStatus`, params); + }, +}; diff --git a/api/truckPreparation.js b/api/truckPreparation.js new file mode 100644 index 0000000..79ca732 --- /dev/null +++ b/api/truckPreparation.js @@ -0,0 +1,20 @@ +import axios from "@/utils/request"; + +export default { + queryPageList(params) { + return axios.post(`/vehiclePreparation/queryPageList`, params); // 车辆整备列表 + }, + getById(params) { + return axios.get(`/vehiclePreparation/getInfoById`, params); // 车辆整备详情 + }, + editTruckPreparation(params) { + return axios.put(`/vehiclePreparation/edit`, params); // 添加车辆整备 + }, + getPreTypeList() { + return axios.get(`/dic/queryByDicType`, { dicType: "preparation_type" }); + }, // 获取整备类型 + getPreFormDataListByTruckId(params) { + //车辆整备新检查单 + return axios.get(`/vehiclePreparation/getFormDataListByTruckId`, params); + }, +}; diff --git a/api/truckRent.js b/api/truckRent.js new file mode 100644 index 0000000..2b497b5 --- /dev/null +++ b/api/truckRent.js @@ -0,0 +1,44 @@ +import axios from "@/utils/request"; + +export default { + queryTakePageList(params) { + return axios.post(`/truckRentTask/queryTakePageList`, params); + }, + getTakeId(params) { + return axios.get(`/truckRentTask/getTakeId`, params); + }, + getSalesManagerDic() { + return axios.get(`/dic/queryByDicType`, { dicType: "sales_manager" }); + }, + getAddress(params) { + return axios.post(`/baidumap/getAddress`, params); + }, + addTake(params) { + return axios.post(`/truckRentTask/addTake`, params); + }, + generateWord(params) { + return axios.post(`/truckRentTask/generateWord`, params); + }, + validateTruckByIds(params) { + return axios.get(`/contractRentTruck/validateTruckByIds`, params); + }, + getFormDataTemplate(params) { + return axios.get(`/truckRentTask/getFormDataTemplate`, params); + }, + initiateSignature(params) { + return axios.post(`/truckRentTask/initiateSignature`, params); + }, + getSignatureUrl(params) { + return axios.post(`/truckRentTask/getSignatureUrl`, params); + }, + generateWord(params) { + return axios.post(`/truckRentTask/generateWord`, params); + }, + fileDownloadUrl(params) { + return axios.post(`/truckRentTask/fileDownloadUrl`, params); + }, + // 交车单-安全审批 + safeAudit(params) { + return axios.post(`/truckRentTask/safetyAuditing`, params); + }, +}; diff --git a/api/unusualActionApply.js b/api/unusualActionApply.js new file mode 100644 index 0000000..f1f90c6 --- /dev/null +++ b/api/unusualActionApply.js @@ -0,0 +1,54 @@ +import axios from "@/utils/request"; + +export default { + queryPageList(params) { + return axios.post(`/unusualAction/queryPageList`, params); // 分页 + }, + getTakeId(params) { + return axios.get(`/unusualAction/getInfoById`, params); // 根据id查找详情 + }, + //审批 + auditTransaction(params) { + return axios.post(`/unusualAction/approve`, params); + }, + //撤销 + revokeTransaction(params) { + return axios.post(`/unusualAction/revoke`, params); + }, + getRoleList(params) { + return axios.get(`/unusualActionApply/queryApproveUserList`, params); // 查询可审批的用户列表 + }, + edit(params) { + return axios.post(`/unusualAction/edit`, params); // 修改 + }, + add(params) { + return axios.post(`/unusualAction/add`, params); // 添加 + }, + approveAfterEdit(params) { + return axios.put(`/unusualActionApply/approveAfterEdit`, params); // 审批后修改 + }, + //根据id查询车辆异动信息 + getUnusualInfoById(params) { + return axios.get(`/truck/getUnusualInfoById`, params); + }, + //根据车牌查询是否已经存在异动 + getExistResult(params) { + return axios.get(`/unusualAction/checkTruckInUnusual`, params); + }, + // 获取异动目的地类型 + getTransactionAddressType() { + return axios.get(`/dic/queryByDicType`, { + dicType: "transaction_address_type", + }); + }, + // 获取异动类型 + getTransactionType() { + return axios.get(`/dic/queryByDicType`, { + dicType: "transaction_type", + }); + }, + //在保养待办那边有一个按钮,根据车牌新增异动 + addByTruckId(params) { + return axios.post(`/unusualAction/addByTruckId`, params); + }, +}; diff --git a/components/ba-tree-picker/README.md b/components/ba-tree-picker/README.md new file mode 100644 index 0000000..59d99f9 --- /dev/null +++ b/components/ba-tree-picker/README.md @@ -0,0 +1,124 @@ +## 树形层级选择器 +### 简介 +为统一样式而生,树形层级选择器,picker弹窗形式的,样式和比例参照uniapp的picker和uni-data-picker组件 +* 支持单选、多选、父级选择,当然也支持单层选择 +* 支持Object对象属性自定义映射 +* 支持显示全部选中、部分选中、未选中三种状态 +* 支持快速自定义简单样式(分割线、按钮、标题、对齐等),深入样式可复写css + +### 使用方法 +在 `script` 中引入组件 +``` javascript + import baTreePicker from "@/components/ba-tree-picker/ba-tree-picker.vue" + export default { + components: { + baTreePicker + } +``` +在 `template` 中使用组件 +``` javascript + +``` +在 `script` 中定义打开方法,和选择监听 +``` javascript + methods: { + // 显示选择器 + showPicker() { + this.$refs.treePicker._show(); + }, + //监听选择(ids为数组) + selectChange(ids, names) { + console.log(ids, names) + } + } +``` +在 `template` 中调用打开 +``` javascript + 调用选择器 +``` + +### 属性 +|属性名|类型|默认值|说明| +|:-|:-:|:--:|-:| +|localdata|Array|[]|源数据,目前支持tree结构,后续会考虑支持扁平化结构| +|valueKey|String|id|指定 Object 中 key 的值作为节点数据id| +|textKey|String|name|指定 Object 中 key 的值作为节点显示内容| +|childrenKey|String|children|指定 Object 中 key 的值作为节点子集| +|multiple|Boolean|false|是否多选,默认单选| +|selectParent|Boolean|true|是否可以选父级,默认可以| +|title|String| |标题| +|titleColor|String||标题颜色| +|confirmColor|String|#0055ff|确定按钮颜色| +|cancelColor|String|#757575|取消按钮颜色| +|switchColor|String|#666|节点切换图标颜色| +|border|Boolean|false|是否有分割线,默认无| + + + +### 数据格式 + +注意:必须有id、name(id可通过valueKey来配置为其它键值,如value)字段,且唯一 + +``` json +[ + { + id: 1, + name: '公司1', + children: [{ + id: 11, + name: '研发部', + children: [{ + id: 111, + name: '张三', + + },{ + id: 112, + name: '李四', + + }] + },{ + id: 12, + name: '综合部', + + } ] + }, + { + id: 2, + name: '公司2', + children: [{ + id: 21, + name: '研发部', + + },{ + id: 22, + name: '综合部', + + },{ + id: 23, + name: '财务部', + + }, ] + }, + { + id: 3, + name: '公司3' + }, + { + id: 4, + name: '公司4', + children: [{ + id: 41, + name: '研发部', + + }] + } +] +``` + + +### 方法 +|方法名|参数|默认值|说明| +|:-|:-:|:--:|-:| +|_show()| | |显示选择器| +|_hide()| | |隐藏选择器| diff --git a/components/ba-tree-picker/ba-tree-picker.vue b/components/ba-tree-picker/ba-tree-picker.vue new file mode 100644 index 0000000..bd82515 --- /dev/null +++ b/components/ba-tree-picker/ba-tree-picker.vue @@ -0,0 +1,775 @@ + + + + + + + diff --git a/components/dic-select/dic-select.vue b/components/dic-select/dic-select.vue new file mode 100644 index 0000000..11ecaab --- /dev/null +++ b/components/dic-select/dic-select.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/components/dic-select/select-show.vue b/components/dic-select/select-show.vue new file mode 100644 index 0000000..6c79d50 --- /dev/null +++ b/components/dic-select/select-show.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/components/multiple-picker/multiple-picker.vue b/components/multiple-picker/multiple-picker.vue new file mode 100644 index 0000000..4c2d2a6 --- /dev/null +++ b/components/multiple-picker/multiple-picker.vue @@ -0,0 +1,262 @@ + + + + + diff --git a/components/no-bad-table/loading.vue b/components/no-bad-table/loading.vue new file mode 100644 index 0000000..c9d1842 --- /dev/null +++ b/components/no-bad-table/loading.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/components/no-bad-table/table.scss b/components/no-bad-table/table.scss new file mode 100644 index 0000000..5cba4bb --- /dev/null +++ b/components/no-bad-table/table.scss @@ -0,0 +1,293 @@ +$div-table-border-color: #666; +$div-table-border-width: 1upx; +@mixin fixBorderWidth($dir:none) { + @if $dir==none{ + + @media screen and (-webkit-device-pixel-ratio: 1) { + border-width: 1px; + } + @media screen and (-webkit-device-pixel-ratio: 2) { + border-width: .5px; + } + @media screen and (-webkit-device-pixel-ratio: 3) { + border-width: .5px; + } + } + @else{ + @media screen and (-webkit-device-pixel-ratio: 1) { + border-#{$dir}-width: 1px; + } + @media screen and (-webkit-device-pixel-ratio: 2) { + border-#{$dir}-width: .5px; + } + @media screen and (-webkit-device-pixel-ratio: 3) { + border-#{$dir}-width: .5px; + } + } + +} +.no-bad-table-wrap { + position: relative; + overflow: hidden; +//外层容器 + .table_box_big { + overflow: auto; + width: 100%; + position: relative; + // height: 350px; + } + //工具类 + .verticalV{ + position: absolute; + width: 100%; + text-align: center; + left:50%; + top:50%; + transform: translateY(-50%); + } + + .table_box { + overflow: auto; + // position: absolute; + } + + .table_tbody_box { + // height: 300px; + // overflow: scroll; + } + + //没有任何数据 + .empty-data-body-box { + min-height: 100px; + line-height: 100px; + text-align: center; + color: #666; + border: 1px solid $div-table-border-color; + @include fixBorderWidth; + border-top: 0; + + } + + &.fix-height { + + .table_box_big { + overflow-x: scroll; + overflow-y: hidden; + position: relative; + + // height: 350px; + } + + .table_box { + overflow: hidden; + position: absolute; + } + + .table_tbody_box { + // height: 300px; + overflow: scroll; + border-bottom: 1px solid $div-table-border-color; + @include fixBorderWidth(bottom); + } + + //固定高低里面的内容表格底部不要边框 + .div-table-body { + border-top: 0; + border-bottom:0; + //固定高度,数据为空 + &.empty-data-body-box{ + border-bottom: $div-table-border-width solid $div-table-border-color; + @include fixBorderWidth(bottom); + } + } + } + + //头部表格 + .th, + .thead .tr, + .fixed-thead-tr { + .td { + background-color: #e0e0ea; + + .td_wrap { + background-color: #e0e0ea; + } + + } + } + + //固定右边一列 + .fixed-right { + position: absolute; + top: 0upx; + right: 0px; + z-index: 100; + // border-right: $div-table-border-width solid $div-table-border-color; + // border-left: $div-table-border-width solid $div-table-border-color; + box-shadow: -2px 0 5px rgba(0, 0, 0, .5); + } + + //固定左边一列 + .fixed-left { + position: absolute; + top: 0upx; + left: -1px; + z-index: 100; + border-right: $div-table-border-width solid $div-table-border-color; + border-left: $div-table-border-width solid $div-table-border-color; + @include fixBorderWidth(right); + @include fixBorderWidth(left); + box-shadow: 2px 0 5px rgba(0, 0, 0, .5); + } + + .tr, + .th { + display: table-row; + + &+.tr, + &+.th { + + .td, + .th { + border-top: $div-table-border-width solid $div-table-border-color; + @include fixBorderWidth(top); + word-break: break-word; + } + } + } + //外层容器控制td左右居中 + &.td-center{ + .td { + .td_wrap{ + text-align: center; + } + } + } + .td { + display: table-cell; + vertical-align: middle; + text-align: center; + box-sizing: border-box; + z-index: 1; + position: relative; + overflow: hidden; + + .td_wrap { + position: relative; + padding: 10upx; + box-sizing: border-box; + overflow: hidden; + line-height: 20px; + font-size: 12px; + background: #fff; + text-align: left; + } + + &.colspan { + z-index: 10; + position: absolute; + .td_wrap { + width: 100%; + height: 100%; + left: 0; + top: 0; + position: absolute; + } + } + + &.rowspan { + position: absolute; + z-index: 10; + } + + &.empty-cells-for-celspan { + border-left: none !important; + + .td_wrap { + opacity: 0; + } + } + + &.empty-cells-for-rowspan { + border-top: none !important; + + .td_wrap { + opacity: 0; + } + } + + &.noPadding { + padding: 0; + } + + &+.td { + border-left: $div-table-border-width solid $div-table-border-color; + @include fixBorderWidth(left); + } + } + + .th .td { + font-weight: bold; + } + //单选样式========》选中 + .selected { + .td { + background-color: #d3e3ef; + + .td_wrap { + background-color: #d3e3ef; + } + } + } + + //单选样式===》禁用 + .disabled { + .td { + background-color: #f8f8f9; + opacity: .6; + } + } + + .div-table { + display: table; + border: $div-table-border-width solid $div-table-border-color; + @include fixBorderWidth; + box-sizing: border-box; + table-layout: fixed; + position: relative; + + &.div-table-body { + border-top: 0; + } + .tbody { + display: table-row-group; + } + + .thead { + display: table-header-group; + +// .tr, +// .th { +// +// .td, +// .th { +// width: 120upx; +// height: 75px; +// } +// } + } + + .colgroup { + display: table-column-group; + } + + .col { + display: table-column; + } + + .caption { + display: table-caption; + } + + } +} \ No newline at end of file diff --git a/components/no-bad-table/table.vue b/components/no-bad-table/table.vue new file mode 100644 index 0000000..c21ce56 --- /dev/null +++ b/components/no-bad-table/table.vue @@ -0,0 +1,841 @@ + + + + + diff --git a/components/tabBar/tabBar.vue b/components/tabBar/tabBar.vue new file mode 100644 index 0000000..00c3b17 --- /dev/null +++ b/components/tabBar/tabBar.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/components/upload_img_video.vue b/components/upload_img_video.vue new file mode 100644 index 0000000..99d80d8 --- /dev/null +++ b/components/upload_img_video.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..8f461a0 --- /dev/null +++ b/main.js @@ -0,0 +1,90 @@ +import App from "./App"; + +// #ifndef VUE3 +import Vue from "vue"; +import "./uni.promisify.adaptor"; + +import store from "./store"; +import { v1 as uuidv1 } from "uuid"; + +// main.js,注意要在use方法之后执行 +import uView from "uview-ui"; +import tabBar from "components/tabBar/tabBar.vue"; //引入我们自己定义的tabBar组件 +import noBadTable from "components/no-bad-table/table.vue"; + +Vue.use(uView); + +// 调用setConfig方法,方法内部会进行对象属性深度合并,可以放心嵌套配置 +// 需要在Vue.use(uView)之后执行 +uni.$u.setConfig({ + // 修改$u.config对象的属性 + config: { + // 修改默认单位为rpx,相当于执行 uni.$u.config.unit = 'rpx' + unit: "rpx", + }, + // 修改$u.props对象的属性 + props: { + // 修改radio组件的size参数的默认值,相当于执行 uni.$u.props.radio.size = 30 + radio: { + size: 30, + }, + text: { + size: 30, + }, + search: { + height: 60, + }, + form: { + labelWidth: 160, + }, + actionSheet: { + round: 40, + }, + datetimePicker: { + value: Number(new Date()), + }, + checkbox: { + labelSize: 24, + }, + // badge: { + // bgColor: "#c2d10a", + // }, + subsection: { + activeColor: "#687379", + }, + loadingPage: { + loadingColor: "#c2d10a", + color: "#c2d10a", + iconSize: 112, + fontSize: 38, + }, + // 其他组件属性配置 + // ...... + }, +}); + +// 全局方法挂载 +Vue.prototype.uuidv1 = uuidv1; +Vue.prototype.$store = store; +Vue.component("tab-bar", tabBar); //使用tabBar组件 +Vue.component("no-bad-table", noBadTable); //使用tabBar组件 +import Api from "./api"; +Vue.prototype.$api = Api; +Vue.config.productionTip = false; +App.mpType = "app"; +const app = new Vue({ + store, + ...App, +}); +app.$mount(); +// #endif + +// #ifdef VUE3 +import { createSSRApp } from "vue"; +export function createApp() { + const app = createSSRApp(App); + return { + app, + }; +} +// #endif diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..bfbcd78 --- /dev/null +++ b/manifest.json @@ -0,0 +1,98 @@ +{ + "name" : "gjt_mini", + "appid" : "__UNI__CAF3DD8", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /*设置ios底部导航栏安全区域*/ + "safearea" : { + "background" : "#FFFFFF", + "bottom" : { + "offset" : "auto" + } + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : { + "oauth" : {} + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wx4438f1a71e030de0", + "setting" : { + "urlCheck" : false, + "postcss" : true, + "minified" : true + }, + "usingComponents" : true, + "lazyCodeLoading" : "requiredComponents", + "permission" : { + "scope.userLocation" : { + "desc" : "初始化时获取用户的位置信息用于交车定位确认" + }, + "scope.camera" : { + "desc" : "获取用户的拍照和相册权限用于拍摄交车、还车照片" + } + }, + "requiredPrivateInfos" : [ "getLocation", "chooseLocation" ] + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2", + "fallbackLocale" : "zh-Hans", + "locale" : "zh-Hans", + "h5" : { + "template" : "template.html" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4ed0154 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,954 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "optional": true, + "requires": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "dev": true, + "optional": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "axios": { + "version": "1.7.7", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.5.tgz", + "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "requires": { + "micromatch": "^4.0.2" + } + }, + "follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" + }, + "form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-base64": { + "version": "3.7.7", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + } + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmmirror.com/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "sass": { + "version": "1.80.6", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.80.6.tgz", + "integrity": "sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==", + "dev": true, + "requires": { + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "10.5.2", + "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.5.2.tgz", + "integrity": "sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "semver": "^7.3.2" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "uni-uploadfile": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/uni-uploadfile/-/uni-uploadfile-1.1.4.tgz", + "integrity": "sha512-2WO01OVT8hqXoBO8M6cyE2bOFC6cW+RXrbRvDR+tUXqUR/aDbYeJ31lE1/5xeMlm3TNJpfTZWvTUyiIzhGmd7g==" + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" + }, + "uview-ui": { + "version": "2.0.38", + "resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-2.0.38.tgz", + "integrity": "sha512-6egHDf9lXHKpG3hEjRE0vMx4+VWwKk/ReTf5x18KrIKqdvdPRqO3+B8Unh7vYYwrIxzAWIlmhZ9RJpKI/4UqPQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..31e2372 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "dependencies": { + "axios": "^1.5.0", + "crypto-js": "^4.1.1", + "js-base64": "^3.7.5", + "json-bigint": "^1.0.0", + "uni-uploadfile": "^1.1.4", + "uuid": "^9.0.1", + "uview-ui": "^2.0.38" + }, + "devDependencies": { + "patch-package": "^8.0.0", + "sass": "^1.66.1", + "sass-loader": "^10.4.1" + }, + "scripts": { + "postinstall": "patch-package" + } +} diff --git a/pageSub/annualReview/detail.vue b/pageSub/annualReview/detail.vue new file mode 100644 index 0000000..2b5fb72 --- /dev/null +++ b/pageSub/annualReview/detail.vue @@ -0,0 +1,1831 @@ + + + + + diff --git a/pageSub/annualReview/index.vue b/pageSub/annualReview/index.vue new file mode 100644 index 0000000..ebfb72e --- /dev/null +++ b/pageSub/annualReview/index.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/pageSub/failure/detail.vue b/pageSub/failure/detail.vue new file mode 100644 index 0000000..757841a --- /dev/null +++ b/pageSub/failure/detail.vue @@ -0,0 +1,1832 @@ + + + + + diff --git a/pageSub/failure/index.vue b/pageSub/failure/index.vue new file mode 100644 index 0000000..d78161c --- /dev/null +++ b/pageSub/failure/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/pageSub/returnCarCost/detail.vue b/pageSub/returnCarCost/detail.vue new file mode 100644 index 0000000..0deb742 --- /dev/null +++ b/pageSub/returnCarCost/detail.vue @@ -0,0 +1,1669 @@ + + + + + + diff --git a/pageSub/returnCarCost/index.vue b/pageSub/returnCarCost/index.vue new file mode 100644 index 0000000..a5a7ba1 --- /dev/null +++ b/pageSub/returnCarCost/index.vue @@ -0,0 +1,348 @@ + + + + + + \ No newline at end of file diff --git a/pageSub/truckPreparation/detail.vue b/pageSub/truckPreparation/detail.vue new file mode 100644 index 0000000..338b341 --- /dev/null +++ b/pageSub/truckPreparation/detail.vue @@ -0,0 +1,1600 @@ + + + + + diff --git a/pageSub/truckPreparation/index.vue b/pageSub/truckPreparation/index.vue new file mode 100644 index 0000000..d6a387b --- /dev/null +++ b/pageSub/truckPreparation/index.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..3aaf5c5 --- /dev/null +++ b/pages.json @@ -0,0 +1,277 @@ +{ + "easycom": { + "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" + }, + "pages": [ + //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "首页", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/login/login", + "style": { + "navigationBarTitleText": "广交投氢能", + "enablePullDownRefresh": false + } + }, + { + "path": "pages/map/index", + "style": { + "navigationBarTitleText": "地图", + "enablePullDownRefresh": false + } + }, + + { + "path": "pages/my/my", + "style": { + "navigationBarTitleText": "我的", + "enablePullDownRefresh": false + } + }, + { + "path": "components/tabBar/tabBar", + "style": { + "navigationBarTitleText": "", + "enablePullDownRefresh": false + } + }, + + { + "path": "pages/standbyVehicle/index", + "style": { + "navigationBarTitleText": "备车管理", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/standbyVehicle/detail", + "style": { + "navigationBarTitleText": "备车单", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/standbyVehicle/detailInfo", + "style": { + "navigationBarTitleText": "备车信息", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/truckRent/index", + "style": { + "navigationBarTitleText": "交车管理", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/truckRent/detail", + "style": { + "navigationBarTitleText": "交车单", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/webview/index", + "style": { + "navigationBarTitleText": "webview", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/face/index", + "style": { + "navigationBarTitleText": "e签宝人脸验证", + "enablePullDownRefresh": true + } + }, + { + "path": "pages/returnCar/index", + "style": { + "navigationBarTitleText": "还车管理", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/returnCar/detail", + "style": { + "navigationBarTitleText": "还车单", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/returnCar/cost", + "style": { + "navigationBarTitleText": "费用核算", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/audit/index", + "style": { + "navigationBarTitleText": "在线审批", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/audit/detail", + "style": { + "navigationBarTitleText": "合同审批详情", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/unusualActionApply/index", + "style": { + "navigationBarTitleText": "异动管理", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/unusualActionApply/detail", + "style": { + "navigationBarTitleText": "异动申请", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/maintain/index", + "style": { + "navigationBarTitleText": "保养待办", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "pages/maintain/detail", + "style": { + "navigationBarTitleText": "保养信息", + "enablePullDownRefresh": true + } + } + ], + "subPackages": [ + { + "root": "pageSub", + "pages": [ + { + "path": "failure/index", + "style": { + "navigationBarTitleText": "故障台账", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "failure/detail", + "style": { + "navigationBarTitleText": "故障上报", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "returnCarCost/index", + "style": { + "navigationBarTitleText": "还车费用核算", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "returnCarCost/detail", + "style": { + "navigationBarTitleText": "还车费用核算", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "truckPreparation/index", + "style": { + "navigationBarTitleText": "车辆整备", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "truckPreparation/detail", + "style": { + "navigationBarTitleText": "备车信息", + "enablePullDownRefresh": true + } + }, + { + "path": "annualReview/index", + "style": { + "navigationBarTitleText": "年审待办", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + }, + { + "path": "annualReview/detail", + "style": { + "navigationBarTitleText": "年审", + "enablePullDownRefresh": true, + "onReachBottomDistance": 50 + } + } + ] + } + ], + "tabBar": { + "color": "#7A7E83", + "selectedColor": "#3cc51f", + "borderStyle": "white", + "backgroundColor": "#f4f5f7", + "custom": true, + "list": [ + { + "pagePath": "pages/index/index", + // "iconPath": "home", + // "selectedIconPath": "home-fill", + "text": "首页" + // "customIcon": false + }, + { + "pagePath": "pages/map/index", + // "iconPath": "home", + // "selectedIconPath": "home-fill", + "text": "地图" + // "customIcon": false + }, + { + "pagePath": "pages/my/my", + // "iconPath": "account", + // "selectedIconPath": "account-fill", + "text": "我的" + // "customIcon": false + } + ], + "current": 0 + }, + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "广交投", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "uniIdRouter": {} +} diff --git a/pages/audit/detail.vue b/pages/audit/detail.vue new file mode 100644 index 0000000..d1ab081 --- /dev/null +++ b/pages/audit/detail.vue @@ -0,0 +1,1052 @@ + + + + + diff --git a/pages/audit/index.vue b/pages/audit/index.vue new file mode 100644 index 0000000..da66e06 --- /dev/null +++ b/pages/audit/index.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/pages/face/index.vue b/pages/face/index.vue new file mode 100644 index 0000000..ac96dea --- /dev/null +++ b/pages/face/index.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..e729822 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,673 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..8839a2b --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/pages/login/user-login/index.vue b/pages/login/user-login/index.vue new file mode 100644 index 0000000..226f7b5 --- /dev/null +++ b/pages/login/user-login/index.vue @@ -0,0 +1,372 @@ + + + + + diff --git a/pages/maintain/detail.vue b/pages/maintain/detail.vue new file mode 100644 index 0000000..44d07c9 --- /dev/null +++ b/pages/maintain/detail.vue @@ -0,0 +1,2060 @@ + + + + + diff --git a/pages/maintain/index.vue b/pages/maintain/index.vue new file mode 100644 index 0000000..33378ba --- /dev/null +++ b/pages/maintain/index.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/pages/map/index.vue b/pages/map/index.vue new file mode 100644 index 0000000..e942e49 --- /dev/null +++ b/pages/map/index.vue @@ -0,0 +1,1639 @@ + + + + + + + diff --git a/pages/my/my.vue b/pages/my/my.vue new file mode 100644 index 0000000..c40fb22 --- /dev/null +++ b/pages/my/my.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/pages/returnCar/cost.vue b/pages/returnCar/cost.vue new file mode 100644 index 0000000..cacf59b --- /dev/null +++ b/pages/returnCar/cost.vue @@ -0,0 +1,1917 @@ + + + + + + diff --git a/pages/returnCar/detail.vue b/pages/returnCar/detail.vue new file mode 100644 index 0000000..7e1c4cd --- /dev/null +++ b/pages/returnCar/detail.vue @@ -0,0 +1,3869 @@ + + + + + + diff --git a/pages/returnCar/index.vue b/pages/returnCar/index.vue new file mode 100644 index 0000000..6517068 --- /dev/null +++ b/pages/returnCar/index.vue @@ -0,0 +1,582 @@ + + + + + diff --git a/pages/standbyVehicle/detail.vue b/pages/standbyVehicle/detail.vue new file mode 100644 index 0000000..79a26f9 --- /dev/null +++ b/pages/standbyVehicle/detail.vue @@ -0,0 +1,591 @@ + + + + + diff --git a/pages/standbyVehicle/detailInfo.vue b/pages/standbyVehicle/detailInfo.vue new file mode 100644 index 0000000..d4765a9 --- /dev/null +++ b/pages/standbyVehicle/detailInfo.vue @@ -0,0 +1,1031 @@ + + + + + diff --git a/pages/standbyVehicle/index.vue b/pages/standbyVehicle/index.vue new file mode 100644 index 0000000..174a2e9 --- /dev/null +++ b/pages/standbyVehicle/index.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/pages/truckRent/detail.vue b/pages/truckRent/detail.vue new file mode 100644 index 0000000..030c92c --- /dev/null +++ b/pages/truckRent/detail.vue @@ -0,0 +1,3331 @@ + + + + + diff --git a/pages/truckRent/detailInfo.vue b/pages/truckRent/detailInfo.vue new file mode 100644 index 0000000..2f03b65 --- /dev/null +++ b/pages/truckRent/detailInfo.vue @@ -0,0 +1,625 @@ + + + + + \ No newline at end of file diff --git a/pages/truckRent/index.vue b/pages/truckRent/index.vue new file mode 100644 index 0000000..f0b0ba8 --- /dev/null +++ b/pages/truckRent/index.vue @@ -0,0 +1,478 @@ + + + + + diff --git a/pages/truckRent/modal.vue b/pages/truckRent/modal.vue new file mode 100644 index 0000000..709c77f --- /dev/null +++ b/pages/truckRent/modal.vue @@ -0,0 +1,112 @@ + + + + + \ No newline at end of file diff --git a/pages/unusualActionApply/detail.vue b/pages/unusualActionApply/detail.vue new file mode 100644 index 0000000..e8c6597 --- /dev/null +++ b/pages/unusualActionApply/detail.vue @@ -0,0 +1,1896 @@ + + + + + diff --git a/pages/unusualActionApply/index.vue b/pages/unusualActionApply/index.vue new file mode 100644 index 0000000..2575d67 --- /dev/null +++ b/pages/unusualActionApply/index.vue @@ -0,0 +1,416 @@ + + + + + diff --git a/pages/webview/index.vue b/pages/webview/index.vue new file mode 100644 index 0000000..1e79b71 --- /dev/null +++ b/pages/webview/index.vue @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/patches/uview-ui+2.0.38.patch b/patches/uview-ui+2.0.38.patch new file mode 100644 index 0000000..b9446b5 --- /dev/null +++ b/patches/uview-ui+2.0.38.patch @@ -0,0 +1,32 @@ +diff --git a/node_modules/uview-ui/components/u-upload/u-upload.vue b/node_modules/uview-ui/components/u-upload/u-upload.vue +index eb55854..ad84c0e 100644 +--- a/node_modules/uview-ui/components/u-upload/u-upload.vue ++++ b/node_modules/uview-ui/components/u-upload/u-upload.vue +@@ -20,14 +20,15 @@ + /> + + +- {{item.isVideo || (item.type && item.type === 'video') ? '视频' : '文件'}} ++ {{ item.name || '文件' }} + + ?00001b5ch_0Itp) z=>Px&5J^NqR9Hvtm`#XHVHn4Me`9>6!7!19vQXq>VP(OTtPm-(u#rNO)KHRA%0gHW zO;TvGW5d)~*vQ9f5(`r!8%-8I(#*)WWaiOxoulJA_n!COJLhI`-`&0M|9PMPdA{FQ z0A|(=Yy+nF?>en-zztxpB+Jq%GrJ1x&I0DRe_m2&*7;6!1elct%yVCovd(v+Uw~;@ zz?}CdWVydVv_cOwELx$#GT}8@bSKc4p~92!0Wdq0N_jxlM4wAq5~AG9b^zByuw^h+ z6ZJE_TRj5G)j02DXKN(s;x!Q+2mQfEG>8V9DiGMPXrQ5jVKrIQXT;H9RsRCLS~La9 zS5Gu#^vWV(W?zA+S-4ut)1ah90Sd}O%>A+{;Hqa@_ z?{R;vdJ*lCbRa?UH88)7N#6mBC4Go7^&mPVX|5|YGcQ#>I)+w~b&~G6Y$>8{`WB$M zqCol$c9#w(ou+t{K40NNA3vVKZw7?x!5oF6m(+c0JkrW>LJh=N+TX zl75=m3m~l}Z8KO+H>PLRvIvmtkaQ`ssz0c$ z4UmZ;cO|Vacp*B#OUH(sp2$7hyWOght}bAI0NE>&_WX(K0D*CbnAu9;SY(_@2?alZ gJAjw1r%A=X0KWQeYA&g8DF6Tf07*qoM6N<$g5g1fDF6Tf literal 0 HcmV?d00001 diff --git a/static/baoyang.png b/static/baoyang.png new file mode 100644 index 0000000000000000000000000000000000000000..32b8dad9c33736a82327e6de1dea7cf4acc3332d GIT binary patch literal 1834 zcmV+_2i5qAP)iWq$=f@svJiHTwq6@mtrs4)>-5E7$_5;Q8|lkp3vk+^>l z#b^X^0dZk5ilT^Yih`gK7Z7C=g!g!F%#c%3N~bgJZEt(;d;et8d)w*s^xrdc&YU?d z?Py1?C@H1#mZ1;u0&t4_j}oX1Gy^k$yMh0zB;!6Pl}fvJ6@kFTz!?e7dmMNm19_a_ z5m?Sk03VJ_c;0E5ND~u9AaHBK^Zrd)jzlN|fk~13*h4`GJSpLM$EPeuBJ5WH86E@< zkEv1m!GDvXOwK5R6|PAX$qLsr+6k->d5(d@ft!GXQ)p{5umG3<{GLL4&d6&FyaSk& zLA%?4+kq(=w7nPdp31Ek%bOLR0!C$d19=;ftgm|y@HKF9#@ES>z#Ub%Mt@)#Ff_}H z)Vme#0K5r2lhp;rqt#-gX|rZQm;FlzfCDM)PaM2iU(U4zPKo%a|7Np>~8{w0k>Js?<`h& zLQ(;21P)5taFx)-a+#NbvwTB`38SS;pAc7U8-W9IBE}Vi9LBnDr5C+osduhe>8s)h zU?cGKIF03iPQXIoYRjdY#Lx`4)H@KEE=JP{Q3UFz*1gE=3G_|B4Ls&h_j#Zn@S~;P zNZ?E0C|iSmH%5;q$I0M(iDU}=CJWys$D4_QUiGk`bqQbR`@xZ$dsUv!b zY6M=j)Vl~+E_L@JFbI!c?PPAKVFER-l$*ZPQg55A&)BSVH{c`xjxYjSW!t3=2t?-c zvw(*k>S`-}zGZ%_HF|{iCyc;m*&YD=9bewUVjS=maF|8F`M{~b=Mi=8^?qmq4+$Jx zDcg>9qJe%40lo(YTIy{FZj6XJ_4a<0eS~>A=sxX*H5x*P8_9NV*| zQ?tAdN}bneE5 zGgVZgfjZ#&b3~nz)bliOmt)&5uW-$l%&OdBBG9%D+$xdlo|bz4c3d9TF2}KQg+raH zpb`z#k?ajV4f7*72IAHp*l^43mU_xJ#mQe45u)T$)<#$|sgerPV}O;ogS*$oE)gR4Bk^iLSga!Pi=W zR)8CT)t_)_UXlO@Q~j#L2r Y4?wZCG6lxpS^xk507*qoM6N<$f&%Vo)&Kwi literal 0 HcmV?d00001 diff --git a/static/beiche.png b/static/beiche.png new file mode 100644 index 0000000000000000000000000000000000000000..ba79c4868e145fa3a9fd8f70b0832764f325b987 GIT binary patch literal 2963 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 literal 0 HcmV?d00001 diff --git a/static/bi.png b/static/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..15777591ebf96ae7d5ea3a2350ab6bb0806deda6 GIT binary patch literal 558 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 literal 0 HcmV?d00001 diff --git a/static/cost.png b/static/cost.png new file mode 100644 index 0000000000000000000000000000000000000000..78c168281eb8b098ea71e0db1b827e2ce05335e4 GIT binary patch literal 4371 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 N002ovPDHLkV1m`KEztk~ literal 0 HcmV?d00001 diff --git a/static/detail.png b/static/detail.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4192dca1818e70ac756b6c7b4e98af1c43b446 GIT binary patch literal 938 zcmV;b16BNqP)Px&WJyFpR9HvFSHV)+P!v7)MUzToUr<+EByj- zQCU`ZPFxhfK=^{0DFa>Lt@Fw@%bI&>Vh49J`y>fjl9l+=2+q95w z>g>a9d!FW&2B3PmR|fGX0O>(tf&-?jMDKT{R%$tMV3q=)+RQfqeAE^pv=dMLTpWmn z0US1Wiv&8KLHC7a+C|-&g#lEXc{S_p;mZlQW1t&lB+=_{=vY_=03LP550-g5(7@s4 zUY$Hm_>vI0Q}d=3Wnswx(6vl^OBIRgg79(xt^m9XIwQ2f>;RMvcWarpw%LUlm{Ww; zmT4DWM1-~TZ0b*PRf%pr*6WP@)AzPwYT{X#0o}aEtBi#CVgOY98j!zq1sGg9GjCN; z#pKjHfj!5Wm^6G$^!n+4j^go`a*HJ@YROcad6n&ppD}=0A7a#hrl(k(P6j^ zfHwVDYqQHGA*i6b^ClFqprUzQbu2*X;D3T+9oQQ)lko8SZiWQiN0dCEe-;~|q6HVC z5b9pNu49>YW+niCuYc7Tb}Ac0B1^=DQ`64+uBe9+@{uKHr7)Z?=8ejXP;hD#e$>p@ zM$|?Rcw*GCac0^lN0<2m3mk(HbW4nVCKN!}whru_sQ}b^C5W<=t`ikn2)4s6=Y%j) zQEd>5iexSfg{zz(!QJ7V!G+igvoI#Y0eZp@Uubog#W%rR4!ghy(P7C&7<3GmPjqYu zh&u%YEE{CdPu~fM+Hnj(bcX}z5=6=Ka^QkT7b0Uos%+n$=@g=L(3FRMY%z@is5W=I zfz`$b6|e!4ZLr9AtndRs%H!+Gh7;N#ILusuL^~K~#Et=gX?gBr>ADcP6_%M{N9vl@ zOD0n*kPQaj_^DS@^oO;6T2|r?Urqu5vGyA=(b0H&Fd~L5M=vE&F%Cv0 zQF5O*D+O?q%+6$ zTZjE3(d(D{YiqTTn}WOJQZ6LAs=D7)%&Y8B88iHJ`>z0Wpk5uoUsw*@F!o7yPXGV_ M07*qoM6N<$g7#&vfB*mh literal 0 HcmV?d00001 diff --git a/static/electricity.png b/static/electricity.png new file mode 100644 index 0000000000000000000000000000000000000000..d2565a902c2e7a137d8baa1585dca659fb4e491f GIT binary patch literal 721 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 literal 0 HcmV?d00001 diff --git a/static/huanche.png b/static/huanche.png new file mode 100644 index 0000000000000000000000000000000000000000..3300d4e1b8d75d3a747344816c42b437bb121642 GIT binary patch literal 2427 zcmV->3552EP)Px;HAzH4RA@uZnhVfvs##wH&ogdS-5hvwFaG|(_`LoHe4_z5G0A1~j6dtz zYYc>{x<2s8*7)Oq>&%*LpT7$DBJfd8@;OI7XqIHj!g3N#mu+?70ky12GL3K zXW)Inr-2_OF{W%7cc`ix0uKeA-vDef;mLmkP6po7CR~eI{G@BDN^k}F;lNf40R3*@ zB;f2M>pXASmQYpK2JQ4eGr2RIG*P^Y^qm%8vNU>GkR4D8iPxW$z5&jsGq z0rmXhnk9o!Ro=TVus3k42@ll-&jL;Wj!5#Cg%;l9WtQpA0v}qCxnI%b8-LL)i27s<4$bK#Wo(Ejg0}J>N+`Mkh_r+RHRT(ob?(vrm!ruWW z{a;}7BeI(}OCo3sO2>^Wdfa7$V1skh6#_xO zeebLV%s4Lqcba99RVAqZTpu88v7E-Hs$K!Sy%(v5e+`VMQr%;k3u`f6|I8%Dlc}I*fV|`7Nv^1>8(WcT70pvTqO+3!OR?FZ8ZbZDt@Nvbqml^N`U9bT@XQWUTEdP= z{5_Y9fM6r`kdd3!z68u)yKvIqPi-bj*RfBr2hj9wodwPBmfenJ^=O=0r?yxzcW4ky zV-M>*y;YJw&V|70m>|_|jbN&kP@N?MI6g~W(!%O{9S|jNtXpK6q~8vo)X%Im2x{Wx zz?YI}j&n&^ zw1!C({BW}dH7(uXNbkkL{J+c>R+S8ZK0Dk;!9q~KBs?_fu%^Y$AW`xav8#TY- z&Xs!-Cnq^#rX^IBHOQ4zNSL zOYc4ECTjd?T?3q!Y+VJz?Xm-= z45Ilyx_!_IyTNj_PpT>xrfE*%`NuVMU>}<(K}@n1O*hFBcI|>kdh5$Q@qyWOF$SZZhK{V?E3me=RkdxkKp8ZCSdx9K zO4F8Vnvwz z_XoOxukV;eWRuUSDxZVNLAgtih zCb1Awt7>0&I4H@%RkfMts!B_ce~^$-Q5H(ZG6UqQEH-UhZd!KGv}KCbyo}5$7PqQ= zfD1e;iLc4{pD{yXRKimxNbOto4HH?54qJ*DjHNRJu+I{l&o}odsbcKW9ekcvvuJ4$ zyvMkA^_tzBsxt6s(uyfhQ#Qqzo_0=RR2BqtvgW6CD4rj(fa!Fg%@;kXSr_(>wN^U% zuE8(m43@}ix^B5h1NsGPZE01N2piaBXpHQZpL-=)tGnwBO*4lZK3(8B-#002ovPDHLkV1kSPx&D@jB_RA@u(noFonVHC%IYb37$0~7-#6H0U=jNGD3D5Mkv-IRfpSIP)8c@{Dt zkrWvy45XB6KzZj5$i>8KA|@U&`fKgJecETAbI*I9v#<77=hW$ZdwuKwt+m%$-+z5Z zYDgLYmH=~rdBBA9oF4oh2A%_N%r_ZkGMw&waoNGs}bGW&0s%C$K93Iq2?Wk~RXDW97~4 zP)57h5wVi`fTuy&CI@f<*bICzv*{gKC1W9ycDR=S7ahQ3U?FhJ%<}#MM_VJwqvK29 zi39ivj0Ym0%6RiSB3{y1;5YEg0mRW~)Bp%pi1aQ1bi^lG5E6UNh!#jDHVa9kg>~YW zE}10z&1|q$S@ClPfM#|uRi+dcXebI5??A%G3Ky#K!WB`dh(gWmK;c58y_9Iv+Udu; zpNYE#K++^&8ZZ_30DK;aTxcqc`f06A5HaK7Vyap|(h*=!YMqbHmYA8J+sj5%0J1Kp zC0zkF0Jr^Y4!i~y0LO#Y6`=D5zzMX8K%betOVs@9fos4SGuxIlL2dv@a_;p9aL3G6 zj^HX^&1_0u0XRjnHaeiESP@Cvfs?=^Gh3WX0JVaHB>rgN0D6rd0j9Ln($*??G-~}+hj?1(ZMoUzCyR>^~ zVZ}OnldeQ9O1f9i-+}v8lHC8pPJ12V^~f9}2ypbVB?|FQ~7;00000NkvXX Hu0mjfe?pQ4 literal 0 HcmV?d00001 diff --git a/static/hydrogenStation.png b/static/hydrogenStation.png new file mode 100644 index 0000000000000000000000000000000000000000..d9adaccb2f3dd2e0c2859f3ef2ff540aa9224a44 GIT binary patch literal 1129 zcmV-v1eW`WP)Px(BS}O-RA@u(noWotMHI*XuU0cX>s2v`f)_8&%&ufZf+shKvI&S@+)FMIM8$(4 z;>SUlt{LzHJVXFN&}cc6uk^!GjJQT`9a}-zNf~)@c0=qI)FQ&8-FM zLHIob^Aii8gVwwP`4U8KEimXTw(9@@Y4-M<)DO|WlDoL3;T!<8XY@4y4F)&J@TdN4 z@w;ua00^)8W$&akI+DEJxcMlP`cW#kxj-GSR=iWaX?Ab2DO#Z22-BiJQ@Aon=dLn+ z6SI^?S>doQc~|4&pmJ8@M~rWr5+%{L1$_#G{#2F>DfKMM8!q|$gKD_RA9n6 zUG`qgHGoad^lVY5v}zvAuBH9$NYm9o`by3mdT*ql4=&dH@+l1rg5767|- zvx>Ov&7+8gW@&QiGk&+b}arKO$O=4`S3Jr#hkpcr==;HzB+NaicjEJTD4s%7s)ZFT)i zFh4a}0Gr2>wZ_diLF&CpnT6WNe&{IQItrpoY4J1OS;&#{I$dZ}d42uXKH4zX`UQXP z0Fs~wqu&oe zuZCxd@q#p6M{>Jk69EQoY}j&f3+R7>QRS?tz{auLTmJ{q=z9B4EB9<|>QotLq;#^D(KPot6{P#cH|mT-JVQoc~5h%1IY~ vuKJU2fp!cyR!C{Iwo`6bTPQ3I69fMNCQDo3)N-d+00000NkvXXu0mjfnU5Mf literal 0 HcmV?d00001 diff --git a/static/jiaoche.png b/static/jiaoche.png new file mode 100644 index 0000000000000000000000000000000000000000..79794336e0fc061b576d01422692a05c0502579e GIT binary patch literal 4038 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 literal 0 HcmV?d00001 diff --git a/static/jiaqingzhan.png b/static/jiaqingzhan.png new file mode 100644 index 0000000000000000000000000000000000000000..761f4c452b22bf7fc1b29a75195ccc00f8331305 GIT binary patch literal 839 zcmV-N1GxN&P)Px&0ZBwbRCr$PnlX#iKorM+e+w=JX?&192olFdxBu$g4${pSDP%)A*f@S=g+ zPXrJZFmM9V1qLpF7zAf>0W&+-q;e!}HTnJYw@U#?48IGUZn%SAfi+2Q8*ZnZ3z*qU zpwZD!8N4m&OxFNd(;fOxo>D1=&eFG14VYO3kVE-C@O>8gnRjkxzo8x|U`x_k4aSof zUm}1B3NW)nzyV3Ws=}`t1Lm#(GkXGD0)7H_B;Be4p;rLR>=^JlWAH{52z>*v4D9BN z_{$E(Dj>SR zd}6=`FbX!FGu)Tl$OOD}4#Df@<{3kSU>9P*cr#*VdBG?f@W;VvTB0=qD3KDI0Df+> zKvcjeDN&~jq~c22g*JgrNng@`E~EmctQ6NJc{X}nh6dohq!V2RaJFEb?=j=wv^nc> zTXu%%i~@=_IN9eBz?1{m(I|%;nk=LOdI_M;X)ppvR)W29fvA86HbZ9i0Jxf&K`uyo zG5T-9Y_crr(>!v5jqU}^>@x5;$B=8lbKp9#o_YR3(($5cxvrdG(*RBZuYrR_2Bn@q zl$2G?zSnyJAXzcq25tlb_$KLSNZr~1WEv~V2zdr+RD9VSlo2wsXTZe(!&W7|38+{4 znq2Fbq|EF*a1Y4yZx5EfQ~VQRyw@pIfSDZzt^h{@a($ughSqbX_zBM=Nk38%-}~ez zLViNL1iS-wB$Ym)3IX8q^b3-0mcrE5teuMhipVARg9ohu_ciyiHp_~nohCX^=mNr=)x$p*@wX^;4cjTd|zV3 R!QlV^002ovPDHLkV1igNZ>|6U literal 0 HcmV?d00001 diff --git a/static/kachetou.png b/static/kachetou.png new file mode 100644 index 0000000000000000000000000000000000000000..917ddc5c51cba974f2bb625e553d6fe8ad49cb95 GIT binary patch literal 842 zcmV-Q1GW5#P)Px&1W80eRA@u(nLB6{Q51&1U#zsV5qyA!+6X>CE!4vF3L+?2sbH`XK`bmaorNz1 zEus)B3+=20(<=y~ouXh=&`uD+!XqcltS7TGlRMeXWR~Q>!m@Mkod2Km_|KgcBW@aT z{HzdI>Il|Gz|1xRcY%Yz`j)}|1fByIC4H&#T}i;qHUXbo23_TDv!t1_i**F916Mji z;EtqAO$j^$j&_8=S4p1EeO4EN7r^0;5I|BX))fM6MJOo(W)@TCHn6)bfC+xa@->pC zd*95jj*@1ff-0|!)58o^8xiPDh>5@(9hO=l zkXq;^%0DmXK?zhn-7SEB+6hE23LLcU0@7pHneO(RQ0!sf(SZrho_kSemY;70vi)OYHI6j0qCjnFPlG1Ue zPRObTwWf1_GQwW6^*fcLv*PGeL&@$t;U6S4u z?^9O;o{Rf{wPDjQ;APq2CKcd(>&)y(_Vzh0{SHh?`khQ*K1W@--c&8Sg1d*~A3?^5 UK;gUaQ2+n{07*qoM6N<$f*5vt+yDRo literal 0 HcmV?d00001 diff --git a/static/login_bg.png b/static/login_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..dd021db7adb367cd5486e8cd58f67c7e02288b79 GIT binary patch literal 5607 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 literal 0 HcmV?d00001 diff --git a/static/logo.jpg b/static/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9add9dc692761b2ba1dfc74005f5587aadffbc95 GIT binary patch literal 2678 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 literal 0 HcmV?d00001 diff --git a/static/logo3.png b/static/logo3.png new file mode 100644 index 0000000000000000000000000000000000000000..afc335745596644f93dca85eff53fa218ac86649 GIT binary patch literal 4933 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 literal 0 HcmV?d00001 diff --git a/static/mapcar2.png b/static/mapcar2.png new file mode 100644 index 0000000000000000000000000000000000000000..32459156ce575ff02d306e96eab8880a9762b553 GIT binary patch literal 1406 zcmbVMdrTX39KXRvc&tctx&dZ6ZehCU^hxL$vyx6)p@9<)?v zfa%5~&4x0~&=Ga>4^3g>NQjwr;Fe8^qQ7_ey{K6 z^ZEY1kL#|omMhY8(jf>^n0GKXdE69#Q&Z&c_d)$1@{lbV>!cdNB?Va#K&4K>0bsM2 zZ3H&JI@_8*0)-Hi+|1kSq&iEbjuX5}Hg2N~dHpgPf(na6ewOn933h-+-ls=yoIZoV zyiC)L4)3TPl(j#t3^6M}x7z`?dlu{5IF@mOP3@0&?L}d#!(B_la5b6tTNiZ-Vz=^zH z;sqZZXJj2hi=;&~o%YC3YiFc7x}h?EqJ3oK{)!B5Q`9z}u{QEK;^;C(dWgZTb0gP= zLjD2f*~e4MHa|F~`8YNvv>q__+uRS~quEb%Ol91hMUGY$SSEiM+rK&M{GFY9lZNs) zzO-;A?RJW3I4ke7=aX|c)?KbDd8IkVtbfcJIcT9>-6z(!7xpS@_}GE2>37D{PFhWh zwj+H9yWVTKP=C13|3>fAYcaj!uW!s#C6|uATa7%|!$mh_N2j*m*J+o^$1CWGa8i2e zw#KBut>TpHSB8)6tB1osXL@STjQ+RxOm;jlvu;$p_GVPU|DDu(k0bAkt5?XY<-3{L zH68Ux=!3!8^i3DO@|=1S;(tr+>nWP-JvpEX?tkmsJ++?{AlQ%7N4nibj&ShOT>dk~ z(ayHwk`qlo#!aWbv*aW82?DWZ)=01@%=*srwiekwBON}&!%0By|7(*GjAMnJ@xuoy=y)- O{zo($t;}#)L+3yC!SbpA literal 0 HcmV?d00001 diff --git a/static/maph.png b/static/maph.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5a4eb334d45fe78993f56058d1632e6edf71f6 GIT binary patch literal 484 zcmVPx$o=HSOR7gv`m9I|2P!z_$bI0C+1SnG&-e47M3W3KU2oFGlgRnN+LJ=qu9BK$0 zXar^@tW6+6f}uJkdlI^ zUZAh(=i1GC67p{V8JL-uyQX^?hl~u6!L<36L6R8ckGBnmljm zYYdz+V0R6tnh(fpqm(X^=Bopkn?8gsh}$8{XR1c)aR6jz{j_M{=+HeFxq<;eTtXoh zz1{1FKLO%#dS=ItR}eG})unXdx8HjJzXAb<50azd{{b3>{7ZY2_R88X7*hGB?cY|SRlsAtLa?i0;HDx45G;@-$j$Q-$k0GZvj{b zPz3Y&RPpohY3J@E6`(w-!_x{Qdq5)1(pwCa@-A_d9kK1z-0YE(=7DN()qRuyC#zPx$fJsC_R7gwJl%Z0?KoExiy-xZJ2t*ZzhoDsmJO;t^0hozsH?3-scZL}p3Iq-` z0z)teJO~s5gT%MD%yp8^5t6w~(=x-k%iZm_yZ@ghYv5IPL^LUithGKOqH6#tGxvgkRb1r6uMKb+ zT5Ho*tL1FFSo8V3m+#AL+8E%Rl?B1Z0e%aWQoDn};B}=6{6ORJIQ1)VXHIa}I`6EW z$hihesjgB=thMAu!`cD9$VCl^=pDc%fWA`d#ajCe;EI|1L7SGjs0f(NW*1QuJpt&5 z$Qu#u061XgyCA^%IlJUfR`+eO&t0Uoj)~|PKqMl!B62nwjlN0&bw_pnxX#G_F)EBP wuAiOIU%bqYC>;)ml_O>0vbw=mz4!kC-xv&1D0MQ2H2?qr07*qoM6N<$g46uUr~m)} literal 0 HcmV?d00001 diff --git a/static/nianshen.png b/static/nianshen.png new file mode 100644 index 0000000000000000000000000000000000000000..d0aa173c69b8481a29579ffe018b501187164fad GIT binary patch literal 1462 zcmV;n1xfmeP)Px)a7jc#R9Hvtm}iKcRS<@svG=051U> z3^sT!em5#dM8w|%&CvJfzNK`#r&Z4=f722RLYN z;MR!vYJ`ByF->Nk348#!#=XFNz&R0dehuz7U?Jc+U}xY$;Eae6^r%>7P5>4J?gL%{ z7AtF>*A1L5-VL|{I4UB392I1eX66Ba>11vT&dBMIuHc?8A-xJ1H`qy<8{nC_6|fI* zy}33JI9Xd4zXzP5~}%dG4%;m{^B(JRrBNR?5`R!1##xYgCZ^ z8`k9k8R2u_6X0v$o`^8Sebz@6nK>`89dJ;|xsj-+9ru@+O9M}p&`yttj%)SfvCLct zI0-ni+klbqW@gH9k1H%9!bo+r8r(+3-G>2FMmp~@a~@y?;8b8&VAFvPUJY(j;OSBs zUM@A(`Zr*KZf)DeowJ$Oa5c|-ZIzNbD*+!XE{5W{O@LM&K+LeC9Lf^YA-GW++_V!@fPw` z(8{O&W=PeMQxvzgDz3q8TwGsMi6N2y)PA+eW9{_^_!mCJtE#}tCA%E zTQ*C}+?W)xCGc&L{5I$94G8LJ;Nj96UsD{?Uh@fHj~d+6!aurqxzba3%KWbB6?4S@ z?azAE@6IPUo0c_;kX)+T=_L`-cbkxzV~Zm8R5zw)53a$z4IEo0chWbdkchas7grWd zxO_x>mYD+ZTB8p8`4Mq?Ghb#Z*YE7mC*NIzdj~i!A|_|%0>A^Mzf=rZ9hCIVe=lMh zFS?duRhwK$_D1D?hfSGNhZKRa7T|l*OKmf{f}4H(GS&2wuRW%qn((#5+B_4im1G=X z=jKJtjvW^DeR~Hr-GL>f_As^0>;!H?MBG)tH64;P@O~NHKDEu~_A{?E+=xBGPSuLO zC+GtenI#R*EzM5j`DVy3ZEzlY55x(j+4VOG(;KIIO4Dse=E5edo@zYkguZW5o40y; zcK_SjkSFj-Yji|dqi0)Y+Rz_fPPm>lowTWKaI*LtfV?9OXujyFYpQ@?YH!v2r{^b? zQz-fB5i5YI_lpkUYlGCQM#(uR)fK`WxMM@pm|pTA^lFbv1BGBEb(y^W2xQ#1poj5 literal 0 HcmV?d00001 diff --git a/static/offline.png b/static/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..abe44eca53fc67a2ab7c3ba65c5765dafdcf4f5b GIT binary patch literal 1319 zcmV+?1=#wDP)Px(;Ymb6RA@u(m|JKZRT#(r-(-`AQbA3!x3gkVU%b^zkdkILE(n74f<7b^T3`B5 zZ&>REDqgVCfI+QRi_r>RsGyMeAP5zGY3OdUl`6%E6$Il-GTEJ7OA6{svU@(6Z8n*m zo!OajcPf<(I_@0?k}MgGu5UO(0W{%Zx-6S*fo^9;3c$@?60X`XvIKl7f#cCB?W8YXld&T}UXAZpKrfkW>mZ7%7-C@j z-zKi}W8|1{Tw(e=JT-sJPt2wY_<~^MNWr&Y{K()%1z2P#iv$i;fH;9;0L2N2F|Y+I z+smfd2?-jDW#%WnfVeiX8-%`9^oP5&Q#6UPmxMK&yqZXLfbW;U9R%E9^(Dr~3M*qh z({rbq#cc|ptBD5yHnvH~5~QIg{1k7s{XYCxUH6p8OQKvc{naSXs^N@?*JHD^W&dFB!|1xg)^r5>cg7H zBN3hpr?pqCiFH*x4d8Vr2%E+?Obvh>Gk>QLebW&_wtG^WcZ1T^_$Wa804ze{?#Q&3 zZK^<3LRAa_yfK_v_{b?iQ5DZKFya%UJ{%!S5{JT5TGR8Spo-l@^7lwO|8+x?yRCrT z`%?1Cn8fmHVA^4MZ+F-|13;|&Ii)+=p~%sm6ZxP0*5i5(G;W{xqYOGgz~v6fY)5Qq zpyv{jU4lb&b%n8$fbDhugtH8OIhtN@9GRY`kkblq3ZYUtal|sK&k<-8;91MH!u6ae z4#sb(NZP3YhKdnWqkbC6ELfFw6vndxx++fBU)bmi1(lKBO#b^?-}r^7`lS-raGBo* za96Ww<3!*Yz;byz7|CeH-mZIWE_kj=)B+S#afpB?oTg370IRFa=#ETj?=_iD)?2D) zi0T;wIcqm<+5+G^v)RK>-Q_ zVlNTiv`K1wGX4hO#vqkwNrAJ;=yhdQ#sRv1rO00ZdRCUpr(-7zIpco?RlGpJfuJB- z0x*iIK`@jVlJsI^dhS=N8hJIbPXUhx0nsu*4Z?gwwA;hFDxLyxu-y=C0r1*%g=GA3 zVlob`+S77lUr+#}YJEUF48ptZf(Q(tq{jLfbdymifq$r7InE!5@m&o1pdAo_0NDLz zWPIm_GulM0Xk8T#0yugeu>PIbExF?B$K0E(t_tJFDbwYw>i1P7qir)sC?w`wvT(@jwDXI4uAG002ovPDHLkV1hGgWY7Qr literal 0 HcmV?d00001 diff --git a/static/online-exam.svg b/static/online-exam.svg new file mode 100644 index 0000000..9b5037e --- /dev/null +++ b/static/online-exam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/online.png b/static/online.png new file mode 100644 index 0000000000000000000000000000000000000000..468c33a6e9a3bc0954d9e2619b4e50e4d0c87b7b GIT binary patch literal 1046 zcmV+x1nK*UP)Px&&`Cr=RA@u(m|N&(V-&`JPf^NT$T5c`L=HI=;YOqsL!nGUl%kA`!38ODxG>xp zCd7qPP9e%^;)c6XltwuuG{iXNaKVk6N6)|a`?uS(_xJ7n-}|GfZ`IpZ-@8uFyVkqb zdbilgNjtg!ECBr95nM!I5rKgxut=fF0oq;#99Pz%z&^mfW&ao8SKu4qlPpPp4LtlM z@j(%=eJXG!a6WKaPlvVuZvgK}`k<%mGJ9_Tw$BDGDUKhqQo}X5Z2pXcLQ!J&hJ@Mn$XA4 z>ynZZoyqnYzy-irz_AU2PZc0JlvbJwz;+DW0i0OT@H_A@@VuliI(s~Y(RLzo4RBQh z+d4^`+Qb_H*xnVmA6Q=z{HHjc@P0Lh<8>XjPY138*3|YkNm|!ra|Zyn4+Ne7a#<(z z0&t(Ct@Cia0m!+)oxsVJyp$; z0Neun0j#bUi?%xu5UV6TIn99Wt-NLW>8PCeK_zCa85<{4%Ma&O&a?QLI-?+L1a4@nHiH2~f$f0UThgPm z;%j>{yoGhUqzrje$@aCmLrv9Y6aXC@NE&2a-@==jX0xQE-zd~Mg=U2RyfTdCVbg{3 zka=9vn_ZZv@eBrFJB{pt1|xYgrt^j}Qsl{5ryC_D_g74V0N6gdj2*`m556o7ZmXoc zf0xO2>i_X+SiliwqjR-sLpTUPlvY6Gv3|RxuVQH>G^h8=d9`V02Gg6fOY#S0~+OXAyx#1O}eKB83JX;9&880aHFBK$mWD Q%K!iX07*qoM6N<$f_I+g^#A|> literal 0 HcmV?d00001 diff --git a/static/pdf.png b/static/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0bdcb4e39648d7ac6b31acf1a3eb5bfa24f0ef GIT binary patch literal 2285 zcma)8dr(tX9u5kG3#frA3a)w+0)j+dtNwJu~+_e)E0b?>p!G z&de=ONlKXI?&prf;bsZ=kO&*Cj?Zl-*4LOeG-87<5+_DhYqF67i4Mkb(AkQJE@6#KJ_DOrxSm92km0rN!7dTvV(8zcyt*hURaTTMi;$CIW56f_3lmVmhy*mKHmmh4Lp14?E(@DG z!c-FY3WDTDlU|z=3sXRzMhAmol&}yPjm`v@MNsHrbmnsUQjkHThf-;wRC;I#ox!3- zu;^jnn?}O2>Ezig5fuL>7q*HfDG)@Q)&^VMh!X?B~nd35>3LKzTSdL`&L%1e{)ROfl&<-EtO88Ikq$n z6bk=0RHb^0)*~YLPrv_FSf5&`g{dM~ugTZRu#3y~ccjv?csf{uXmqI>&F1M-Oi^eM zjb5SAf;=7=l%`b6H3jGZhx z<-B-C93z~|42NipI4EwK3u$EeDp-w7bLD?>p?7i}m7vmMnITxG+ycwvbs81;YR4?) zyS;GUsrQB}f43LzJGoTM4ApV3f4S%B5LP^n>D#Ks7H{hwR%6Ak!>anqmqI-DB0fq< zOpWW(7C$+Ed3bnuWMt&QgZ|8{+=mB`JiFB~I5@a_PgT{vy3Wqd@j-isID2Yp>b`mJ z*x1-?y|{e(kzfv%lVMw^!F3 zOh^=?d#l^q+j;!dmoH!5WT!lS{1}_`_pA!VYy=~sq}AB+|7tkV7`Ow6bN)&IaZ(Lk zPkQXSTH0KfET^N7+WJC-waoP@%Vex%_^!qEtjCpR&%qpM!Pc4Fv?hUAwc^YQ%YyMg zQg)R2cBM%hi~s#p8_VBg9t9`Ca-SwIX(Atm@WB=b;og1(55UWu&UKMipvG!4 z0=fc3^9C+ZUx}7JBA*5Q0J=GYJFC6|{reH}80Zdg%$Zy-QYBhuB{PZMz$*Sm?!5NT z(T|Y;gt!QpZ5xc?m(DEg#tXFItw|6I+&Pc+P}DGw%tn_?5&!~JJZBHc+0f$3N5Q^< z-7U`UqzzN203Ya5(eC$X*3n=8XO zyDIJ`&%lpX-seOGlo0HZZSepJns9Fr%m9L;4z!_Ymn`PHvc{f4L!$NS<&5vj=Khv{ zXCZmzmx9kT(i%5i^V)l6(_`DZd+qCjCHWaddG1A1ia`7YkA2L#h2DUk_P(-epz}DZ z+1XWexbw%=N6QArKoP*pJBu%$WE}{ENJMx0$|Kw&?t|)lZ66$(U09_6Ba(aH8*S<>UVm&wO|s-Dc~wkM!=59=C%2P2e={CR-@@0E7tYmT zk@OaP_qXZWtOKnQVotdqX^7jPNxGSH0dEubxi;I6#m!%XDil^hpId}>t6uKpTeS0% zU?*y>^FDlegSB=}VxFnibMl3X9BBP0a-=)+lZT00O_MkLg^k2D2hMGiDqKy>jv41S z#hX&?!y~xm9NWh_11PP~8=p3_NsN1(wUY&2g;qEq(|d=_ekc;+bFS;> zecv0K7F5nXyCi*;>GVFf*u^bk=*>)UsF}S*Z#3^?uMIWMl?I~n zKmrxNxZ$b3m9v(611D;f(xb?}k))s(+kZq}r+Na?gA;DJQVPFX(PpCh1YX-UtJ#Sr z3E%vbfz%M|$CpIMtn=+yPgqoTTbsNoq``cxTU_KePjHFOc`Qxn|CYhs<-d6ALCa8= nyDnpUpun?6zJ}Q|MQz2YeeSF7d|FfP_yG~bB|#^-S*8C0m}jSX literal 0 HcmV?d00001 diff --git a/static/reset.png b/static/reset.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ff9bea080140c586949207133e9836b59bc84e GIT binary patch literal 1282 zcmV+d1^xPoP)Px(yh%hsR9Hv7S6yfvRTTct9XEwQL;CY#X=YauYC$peLF?|Orh*lGkOb7eh_*s4 zQHzVUXGjqIb)6qqk?fdpE5sR%4SIb9eT8nNbCc6b3={;mG~3` zhYMQvVvx8dfUpsNhruuUjLtFfM`Vj15W*~gS*t%Y8y@JonQh)c#GOod5Wo%qYkaoH zEX~~G2N4KBHR4wRzSC1Cq7$&4ck{1hzicEEE+EI=3qgCp*idD&0EDVX(~AJ8dhBNq zB*DDrh^3i*jX3t}RDck@?#UQ9=m`2yark`z4=ezn>amL;bX682ddf;>K3IpcG`@v)Ke5^GS`1O7i6Qp5q$!JKB=`H ztsji7Zk|pQ?Fj`49VkZFXbhA$wE+oz8gN$Y5M9v{gGjEad$Xi<@j;#y{rXfc- zJpvf9nGO-qEtt0ZGf}eysuBAZz!s_CFm3|eYL~{dI z^5=~Z+J1S({LK%boc=Ra|AzpVxCxmRzdkWvAc%A$Wsn(I4gl$M0>Gq9I|Gr*$;N!a z5g37^%oS3X##W{TCBj_`T1*r}YjWxFIn{{CYs>N%J4hPPovk9Rx7Uj)@VpUQTZi7Mso%%ZoE^t%9-aS&BnYZ=UOK|JIz zxz53KV5x)1ZPDx;1M^tXZaK5)CBOd#Sc#N640sP7=67?dl?urbI zyY1N5jILOAD2nuWaj6>01IR9hI%O|VfQd#3=SC0bYi~+Y7`K-I_}VduUbT{$!A3~b zjE-tVKLF?%*M>N4C9?-=4kQ3Q-pqVo4~TCd$w8sJ4d=4ibLgXEhAW2<1^VIJvk9x&L_>cE8jte{;?c{ZvZ;l z43LgDyL!lR#{l$FYyZ-lsi1CjJD0-Ogg*8l(j07*qoM6N<$f(=PbWdHyG literal 0 HcmV?d00001 diff --git a/static/yidong.png b/static/yidong.png new file mode 100644 index 0000000000000000000000000000000000000000..91ae059a5377f6ced7bf8ae5455a58dc5807c63d GIT binary patch literal 1409 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 literal 0 HcmV?d00001 diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..c4a7feb --- /dev/null +++ b/store/index.js @@ -0,0 +1,24 @@ +import Vue from "vue"; +import Vuex from "vuex"; + +Vue.use(Vuex); //vue的插件机制 + +//Vuex.Store 构造器选项 +const store = new Vuex.Store({ + state: { + current: 0, + resources: [], + }, + mutations: { + SET_RESOURCES(state, data) { + state.resources = data; + }, + }, + actions: { + setResources({ commit }, data) { + commit("SET_RESOURCES", data); + }, + }, +}); + +export default store; \ No newline at end of file diff --git a/template.html b/template.html new file mode 100644 index 0000000..96c1660 --- /dev/null +++ b/template.html @@ -0,0 +1,28 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + + + + + + + + + +
+ + + diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js new file mode 100644 index 0000000..ad24a33 --- /dev/null +++ b/uni.promisify.adaptor.js @@ -0,0 +1,11 @@ +uni.addInterceptor({ + returnValue(res) { + if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === + "function")) { + return res; + } + return new Promise((resolve, reject) => { + res.then((res) => res[0] ? reject(res[0]) : resolve(res[1])); + }); + }, +}); diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..4bb9cc9 --- /dev/null +++ b/uni.scss @@ -0,0 +1,82 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +// $uni-color-primary: #007aff; +$uni-color-primary: #4cd964; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:16px; +$uni-font-size-base:16px; +$uni-font-size-lg:18; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; + +@import 'uview-ui/theme.scss'; + +$u-primary: #687379; +$u-success: #687379; diff --git a/uni_modules/curry-multi-select/components/curry-multi-select/curry-multi-select.vue b/uni_modules/curry-multi-select/components/curry-multi-select/curry-multi-select.vue new file mode 100644 index 0000000..2971047 --- /dev/null +++ b/uni_modules/curry-multi-select/components/curry-multi-select/curry-multi-select.vue @@ -0,0 +1,293 @@ + + + + + diff --git a/uni_modules/curry-multi-select/package.json b/uni_modules/curry-multi-select/package.json new file mode 100644 index 0000000..7154e89 --- /dev/null +++ b/uni_modules/curry-multi-select/package.json @@ -0,0 +1,29 @@ +{ + "id": "curry-multi-select", + "name": "下拉多选组件(支持可搜索并兼容单选)", + "displayName": "下拉多选组件(支持可搜索、一键清除并兼容单选)", + "version": "V1.0.0", + "description": "uni-app下拉框: 支持可搜索、多选、单选、一键清除、异步数据响应式更新. 简单好用无bug(有问题评论)(借鉴的: multiple-picker 在其基础上优化了一下)", + "keywords": [ + "uni-app下拉多选", + "可搜索", + "一键清除", + "多选组件" + ], + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无 ", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "repository": "https://gitee.com/huhuyy/plugins-demo.git" +} \ No newline at end of file diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md new file mode 100644 index 0000000..016e3d2 --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,39 @@ +## 1.0.8(2024-03-28) +- 修复 在vue2下:style动态绑定导致编译失败的bug +## 1.0.7(2024-01-20) +- 修复 长文本回显超过容器的bug,超过容器部分显示省略号 +## 1.0.6(2023-04-12) +- 修复 微信小程序点击时会改变背景颜色的 bug +## 1.0.5(2023-02-03) +- 修复 禁用时会显示清空按钮 +## 1.0.4(2023-02-02) +- 优化 查询条件短期内多次变更只查询最后一次变更后的结果 +- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue +## 1.0.3(2023-01-16) +- 修复 不关联服务空间报错的问题 +## 1.0.2(2023-01-14) +- 新增 属性 `format` 可用于格式化显示选项内容 +## 1.0.1(2022-12-06) +- 修复 当where变化时,数据不会自动更新的问题 +## 0.1.9(2022-09-05) +- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框 +## 0.1.8(2022-08-29) +- 修复 点击的位置不准确 +## 0.1.7(2022-08-12) +- 新增 支持 disabled 属性 +## 0.1.6(2022-07-06) +- 修复 pc端宽度异常的bug +## 0.1.5 +- 修复 pc端宽度异常的bug +## 0.1.4(2022-07-05) +- 优化 显示样式 +## 0.1.3(2022-06-02) +- 修复 localdata 赋值不生效的 bug +- 新增 支持 uni.scss 修改颜色 +- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用) +## 0.1.2(2022-05-08) +- 修复 当 value 为 0 时选择不生效的 bug +## 0.1.1(2022-05-07) +- 新增 记住上次的选项(仅 collection 存在时有效) +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue new file mode 100644 index 0000000..edab65a --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,562 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 0000000..5864594 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "1.0.8", + "description": "通过数据驱动的下拉框选择器", + "keywords": [ + "uni-ui", + "select", + "uni-data-select", + "下拉框", + "下拉选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md new file mode 100644 index 0000000..eb58de3 --- /dev/null +++ b/uni_modules/uni-data-select/readme.md @@ -0,0 +1,8 @@ +## DataSelect 下拉框选择器 +> **组件名:uni-data-select** +> 代码块: `uDataSelect` + +当选项过多时,使用下拉菜单展示并选择内容 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md new file mode 100644 index 0000000..667abdb --- /dev/null +++ b/uni_modules/uni-load-more/changelog.md @@ -0,0 +1,25 @@ +## 1.3.6(2024-10-15) +- 修复 微信小程序中的getSystemInfo警告 +## 1.3.5(2024-10-12) +- 修复 微信小程序中的getSystemInfo警告 +## 1.3.4(2024-10-12) +- 修复 微信小程序中的getSystemInfo警告 +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 0000000..a4f14a5 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..a203417 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,404 @@ + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json new file mode 100644 index 0000000..cf44bff --- /dev/null +++ b/uni_modules/uni-load-more/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.6", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md new file mode 100644 index 0000000..54dc1fa --- /dev/null +++ b/uni_modules/uni-load-more/readme.md @@ -0,0 +1,14 @@ + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/utils/auth.js b/utils/auth.js new file mode 100644 index 0000000..b7c8a50 --- /dev/null +++ b/utils/auth.js @@ -0,0 +1,26 @@ +import store from './storage'; + +export const getToken = () => store.get('token'); +export const setToken = (token) => { + try { + store.set('token', token); + return true; + } catch (e) { + return false; + } +} +export const removeToken = () => { + store.remove("token") +} +export const setUser = (userInof) => { + try { + store.set("userInfo", userInof); + return true; + } catch (e) { + return false; + } +} + +export const getUser = () => store.get('userInfo'); +export const removeUser = () => + store.remove("userInfo"); \ No newline at end of file diff --git a/utils/fileManager.js b/utils/fileManager.js new file mode 100644 index 0000000..26e11cb --- /dev/null +++ b/utils/fileManager.js @@ -0,0 +1,623 @@ +/** + * 文件管理工具类 + * 用于统一处理文件列表操作,包括添加、删除、解析等 + */ +class FileManager { + constructor() { + // 文件类型配置映射 + this.fileTypeConfig = { + // 仪表盘照片 + 1: { + dataKey: "dashboardPic", + dataKey2: "dashboard2Pic", + isArray: false, + hasMultiple: true, + isPathOnly: true, + }, + // 正面照片 + 2: { + dataKey: "frontPic", + isArray: false, + isPathOnly: true, + }, + // 左前方照片 + 3: { + dataKey: "leftFrontPic", + isArray: false, + isPathOnly: true, + }, + // 右前方照片 + 4: { + dataKey: "rightFrontPic", + isArray: false, + isPathOnly: true, + }, + // 左后方照片 + 5: { + dataKey: "leftRearPic", + isArray: false, + isPathOnly: true, + }, + // 右后方照片 + 6: { + dataKey: "rightRearPic", + isArray: false, + isPathOnly: true, + }, + // 瑕疵照片 + 7: { + dataKey: "blemish", + isArray: true, + isPathOnly: true, + }, + // 轮胎照片 + 8: { + dataKey: "tirePic", + isArray: true, + isPathOnly: true, + }, + // 其它 + 9: { + dataKey: "otherPic", + isArray: true, + isPathOnly: true, + }, + // 司机证件 + 10: { + dataKey: "documents", + isArray: true, + isPathOnly: true, + }, + // 电子文档 + 11: { + dataKey: "esignatureAttachment", + isArray: true, + isPathOnly: false, + }, + // 培训文件签字照片 + 12: { + dataKey: "signAttachment", + isArray: true, + isPathOnly: false, + }, + // 安全培训照片 + 13: { + dataKey: "safetyTrainingPicture", + isArray: true, + isPathOnly: false, + }, + // 安全培训附件 + 14: { + dataKey: "safetyTrainingAttachment", + isArray: true, + isPathOnly: false, + }, + // 轮胎照片 - 左前轮 + 15: { + dataKey: "leftFrontTirePic", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 左后轮(内) + 16: { + dataKey: "leftRearTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 左后轮(外) + 17: { + dataKey: "leftRearTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右前轮 + 18: { + dataKey: "rightFrontTirePic", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右后轮(内) + 19: { + dataKey: "rightRearTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右后轮(外) + 20: { + dataKey: "rightRearTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 备胎 + 21: { + dataKey: "spareTirePic", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 左中内 + 22: { + dataKey: "leftMiddleTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 左中外 + 23: { + dataKey: "leftMiddleTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 左后内 + 24: { + dataKey: "leftRearMiddleTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 左后外 + 25: { + dataKey: "leftRearMiddleTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右中内 + 26: { + dataKey: "rightMiddleTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右中外 + 27: { + dataKey: "rightMiddleTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右后内 + 28: { + dataKey: "rightRearMiddleTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 轮胎照片 - 右后外 + 29: { + dataKey: "rightRearMiddleTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 底盘照片 - 正前方底部照片 + 30: { + dataKey: "frontBottomPic", + isArray: false, + isPathOnly: true, + }, + // 底盘照片 - 左侧前部底部照片 + 31: { + dataKey: "leftFrontBottomPic", + isArray: false, + isPathOnly: true, + }, + // 底盘照片 - 左侧后方底部照片 + 32: { + dataKey: "leftRearBottomPic", + isArray: false, + isPathOnly: true, + }, + // 底盘照片 - 右侧前方底部照片 + 33: { + dataKey: "rightFrontBottomPic", + isArray: false, + isPathOnly: true, + }, + // 底盘照片 - 右侧后方底部照片 + 34: { + dataKey: "rightRearBottomPic", + isArray: false, + isPathOnly: true, + }, + // 底盘照片 - 正后方底部照片 + 35: { + dataKey: "rearBottomPic", + isArray: false, + isPathOnly: true, + }, + // 12轮胎车辆 - 左前外 + 36: { + dataKey: "leftFrontTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 12轮胎车辆 - 左前内 + 37: { + dataKey: "leftFrontTirePicIn", + isArray: false, + isPathOnly: true, + }, + // 12轮胎车辆 - 右前外 + 38: { + dataKey: "rightFrontTirePicOut", + isArray: false, + isPathOnly: true, + }, + // 12轮胎车辆 - 右前内 + 39: { + dataKey: "rightFrontTirePicIn", + isArray: false, + isPathOnly: true, + }, + }; + } + + /** + * 添加文件到数据对象 + * @param {Object} data - 数据对象 + * @param {string} fileTypeId - 文件类型ID + * @param {string} imgUrl - 图片URL + * @param {Object} extraData - 额外数据(如文件名等) + */ + addFileToData(data, fileTypeId, imgUrl, extraData = {}) { + const config = this.fileTypeConfig[fileTypeId]; + if (!config) return; + + // 仪表盘照片特殊处理,有两个字段 + if (fileTypeId === "1") { + if (!data.dashboardPic || data.dashboardPic === "") { + data.dashboardPic = imgUrl; + } else { + data.dashboard2Pic = imgUrl; + } + return; + } + + // 数组类型处理 + if (config.isArray) { + if (!data[config.dataKey]) { + data[config.dataKey] = []; + } + + if (config.isPathOnly) { + // 只保存路径 + data[config.dataKey].push(imgUrl); + } else { + // 保存对象 + data[config.dataKey].push({ + path: imgUrl, + fileName: extraData.fileName || "", + thumb: extraData.thumb || "", + }); + } + } else { + // 单个字段处理 + if (config.isPathOnly) { + data[config.dataKey] = imgUrl; + } else { + data[config.dataKey] = { + path: imgUrl, + fileName: extraData.fileName || "", + thumb: extraData.thumb || "", + }; + } + } + } + + /** + * 从数据对象中删除文件 + * @param {Object} data - 数据对象 + * @param {string} fileTypeId - 文件类型ID + * @param {number} index - 要删除的索引 + * @param {Array} fileList - 当前的文件列表(用于仪表盘照片特殊处理) + */ + removeFileFromData(data, fileTypeId, index, fileList) { + const config = this.fileTypeConfig[fileTypeId]; + if (!config) return; + + // 仪表盘照片特殊处理 + if (fileTypeId === "1") { + if (fileList && fileList.length === 0) { + data.dashboardPic = ""; + data.dashboard2Pic = ""; + } else { + if (index === 0) { + data.dashboardPic = data.dashboard2Pic || ""; + data.dashboard2Pic = ""; + } else { + data.dashboard2Pic = ""; + } + } + return; + } + + // 数组类型处理 + if (config.isArray) { + if (data[config.dataKey] && data[config.dataKey].length > index) { + data[config.dataKey].splice(index, 1); + } + } else { + // 单个字段处理 + data[config.dataKey] = ""; + } + } + + /** + * 从后端数据解析文件列表 + * @param {Object} data - 数据对象 + * @param {Object} compressPicMap - 压缩图片映射 + */ + parseFileListFromData(data, compressPicMap) { + const result = {}; + + // 处理仪表盘照片 + result.fileList1 = []; + if (data.dashboardPicData?.path) { + result.fileList1.push({ + url: data.dashboardPicData.path, + thumb: + data.dashboardPicData.compressedImagePath || + data.dashboardPicData.path, + }); + compressPicMap.set( + data.dashboardPicData.path, + data.dashboardPicData.compressedImagePath || data.dashboardPicData.path + ); + } + data.dashboardPic = data.dashboardPicData?.path ?? ""; + + // 仪表盘第二张照片 + if (data.dashboard2PicData?.path) { + result.fileList1.push({ + url: data.dashboard2PicData.path, + thumb: + data.dashboard2PicData.compressedImagePath || + data.dashboard2PicData.path, + }); + compressPicMap.set( + data.dashboard2PicData.path, + data.dashboard2PicData.compressedImagePath || + data.dashboard2PicData.path + ); + } + data.dashboard2Pic = data.dashboard2PicData?.path ?? ""; + + // 处理其他类型的文件 + const singlePicTypes = [ + { id: "2", dataKey: "frontPic", dataKeyData: "frontPicData" }, + { id: "3", dataKey: "leftFrontPic", dataKeyData: "leftFrontPicData" }, + { id: "4", dataKey: "rightFrontPic", dataKeyData: "rightFrontPicData" }, + { id: "5", dataKey: "leftRearPic", dataKeyData: "leftRearPicData" }, + { id: "6", dataKey: "rightRearPic", dataKeyData: "rightRearPicData" }, + ]; + + singlePicTypes.forEach((type) => { + result[`fileList${type.id}`] = []; + if (data[`${type.dataKeyData}`]?.path) { + result[`fileList${type.id}`] = [ + { + url: data[`${type.dataKeyData}`].path, + thumb: + data[`${type.dataKeyData}`].compressedImagePath || + data[`${type.dataKeyData}`].path, + }, + ]; + compressPicMap.set( + data[`${type.dataKeyData}`].path, + data[`${type.dataKeyData}`].compressedImagePath || + data[`${type.dataKeyData}`].path + ); + } + data[type.dataKey] = data[`${type.dataKeyData}`]?.path ?? ""; + }); + + // 处理数组类型的文件 + const arrayPicTypes = [ + { id: "7", dataKey: "blemish" }, + { id: "8", dataKey: "tirePic" }, + { id: "9", dataKey: "otherPic" }, + { id: "10", dataKey: "documents" }, + ]; + + arrayPicTypes.forEach((type) => { + result[`fileList${type.id}`] = data[type.dataKey].map((x) => ({ + url: x.path, + thumb: x.compressedImagePath || x.path, + })); + + data[type.dataKey].forEach((x) => { + compressPicMap.set(x.path, x.compressedImagePath || x.path); + }); + data[type.dataKey] = data[type.dataKey].map((x) => x.path); + // 交车页面的"其它"文件是对象数组,需要保持原结构 + // if (type.id === "9") { + // // 交车页面的otherPic是对象数组,不需要转换 将错就错了 在交车save/submit的时候会处理 正常这里改了 那边就可以不处理了 + // } else { + // data[type.dataKey] = data[type.dataKey].map((x) => x.path); + // } + }); + + // 处理电子文档 + if (data.esignatureAttachment && data.esignatureAttachment.length >= 1) { + result.fileList11 = [ + { + url: data.esignatureAttachment[0].path, + thumb: "/static/pdf.png", + }, + ]; + } + + // 处理培训文件签字照片 + result.fileList12 = data.signAttachment.map((x) => ({ + url: x.path, + thumb: x.compressedImagePath || x.path, + })); + + data.signAttachment.forEach((x) => { + compressPicMap.set(x.path, x.compressedImagePath || x.path); + }); + + // 处理安全培训照片 + result.fileList13 = + data?.safetyTrainingPicture?.map((x) => ({ + url: x.path, + thumb: x.compressedImagePath || x.path, + })) || []; + + data?.safetyTrainingPicture?.forEach((x) => { + compressPicMap.set(x.path, x.compressedImagePath || x.path); + }); + + data.safetyTrainingPicture = + data?.safetyTrainingPicture?.map((x) => ({ + path: x.path, + })) || []; + + // 处理安全培训附件 + result.fileList14 = + data?.safetyTrainingAttachment?.map((x) => ({ + url: x.path, + name: x.fileName, + type: x.fileName.substring(x.fileName.lastIndexOf(".") + 1) || "", + thumb: x.compressedImagePath || x.path, + })) || []; + + data.safetyTrainingAttachment = + data?.safetyTrainingAttachment?.map((x) => ({ + path: x.path, + fileName: x.fileName, + })) || []; + + // 处理轮胎照片 + const tireKeys1 = [ + "leftFrontTirePic", + "leftRearTirePicIn", + "leftRearTirePicOut", + "rightFrontTirePic", + "rightRearTirePicIn", + "rightRearTirePicOut", + "spareTirePic", + ]; + + let tireIndex = 15; + tireKeys1.forEach((key) => { + if (data[key]) { + const picData = data[key]; + if (picData?.path) { + result[`fileList${tireIndex}`] = [ + { + url: picData.path, + thumb: picData.compressedImagePath || picData.path, + }, + ]; + compressPicMap.set( + picData.path, + picData.compressedImagePath || picData.path + ); + } + data[key] = picData?.path ?? ""; + } + tireIndex++; + }); + + // 处理49吨轮胎照片 + const tireKeys2 = [ + "leftMiddleTirePicIn", + "leftMiddleTirePicOut", + "leftRearMiddleTirePicIn", + "leftRearMiddleTirePicOut", + "rightMiddleTirePicIn", + "rightMiddleTirePicOut", + "rightRearMiddleTirePicIn", + "rightRearMiddleTirePicOut", + ]; + + tireIndex = 22; + tireKeys2.forEach((key) => { + if (data[key]) { + const picData = data[key]; + if (picData?.path) { + result[`fileList${tireIndex}`] = [ + { + url: picData.path, + thumb: picData.compressedImagePath || picData.path, + }, + ]; + compressPicMap.set( + picData.path, + picData.compressedImagePath || picData.path + ); + } + data[key] = picData?.path ?? ""; + } + tireIndex++; + }); + + // 处理底盘照片 + const bottomKeys = [ + "frontBottomPic", + "leftFrontBottomPic", + "leftRearBottomPic", + "rightFrontBottomPic", + "rightRearBottomPic", + "rearBottomPic", + ]; + + let bottomIndex = 30; + bottomKeys.forEach((key) => { + if (data[key]) { + const picData = data[key]; + if (picData?.path) { + // 对象格式 {path:"",compressedImagePath:""} + result[`fileList${bottomIndex}`] = [ + { + url: picData.path, + thumb: picData.compressedImagePath || picData.path, + }, + ]; + compressPicMap.set( + picData.path, + picData.compressedImagePath || picData.path + ); + data[key] = picData.path; // 转换为字符串格式 + } else if (typeof picData === "string") { + // 字符串格式 + result[`fileList${bottomIndex}`] = [ + { + url: picData, + thumb: picData, + }, + ]; + compressPicMap.set(picData, picData); + } + } + bottomIndex++; + }); + + // 处理12轮胎车辆的新增轮胎字段 + const twelveTireKeys = [ + "leftFrontTirePicOut", + "leftFrontTirePicIn", + "rightFrontTirePicOut", + "rightFrontTirePicIn", + ]; + + let twelveTireIndex = 36; + twelveTireKeys.forEach((key) => { + if (data[key]) { + const picData = data[key]; + if (picData?.path) { + result[`fileList${twelveTireIndex}`] = [ + { + url: picData.path, + thumb: picData.compressedImagePath || picData.path, + }, + ]; + compressPicMap.set( + picData.path, + picData.compressedImagePath || picData.path + ); + } + data[key] = picData?.path ?? ""; + } + twelveTireIndex++; + }); + + return result; + } +} + +export default FileManager; diff --git a/utils/init.js b/utils/init.js new file mode 100644 index 0000000..7fa7a1f --- /dev/null +++ b/utils/init.js @@ -0,0 +1,50 @@ +import { + getToken +} from "./auth" +export default function initApp() { + /** + * 页面跳转拦截器 + */ + let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]; + list.forEach(item => { //用遍历的方式分别为,uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab这4个路由方法添加拦截器 + uni.addInterceptor(item, { + invoke(e) { // 调用前拦截 + //获取用户的token + const token = getToken(); + + const url = e.url.split('?')[0]; + let notNeed = ["/pages/login/login"].includes(url) + // 如果在whiteList里面就不需要登录 + if (notNeed) { + return e + } else { + //需要登录 + if (token == undefined || token == '') { + uni.showToast({ + title: '请先登录', + icon: 'none' + }) + uni.reLaunch({ + url: "/pages/login/login" + }) + return false + } else { + return e + } + } + + + }, + fail(err) { // 失败回调拦截 + console.log(err); + // uni.showModal({ + // content: JSON.stringify(err), + // showCancel: false + // }); + + } + }) + }) + + +} \ No newline at end of file diff --git a/utils/key.js b/utils/key.js new file mode 100644 index 0000000..d0ed97c --- /dev/null +++ b/utils/key.js @@ -0,0 +1,26 @@ +import CryptoJS from "crypto-js"; + +export default { + //加密 + encrypt(data, keyStr) { + keyStr = keyStr ? keyStr : "5a261be5eda9445099bef50a5f8df559"; + var key = CryptoJS.enc.Utf8.parse(keyStr); + var ivs = CryptoJS.enc.Utf8.parse(keyStr); + var encrypted = CryptoJS.AES.encrypt(data, key, { + iv: ivs, + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Hex.stringify(encrypted.ciphertext); + }, + //解密 + decrypt(word, keyStr) { + keyStr = keyStr ? keyStr : "5a261be5eda9445099bef50a5f8df559"; + var key = CryptoJS.enc.Utf8.parse(keyStr); //Latin1 w8m31+Yy/Nw6thPsMpO5fg== + var decrypt = CryptoJS.AES.decrypt(word, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Utf8.stringify(decrypt).toString(); + }, +}; diff --git a/utils/permission.js b/utils/permission.js new file mode 100644 index 0000000..dcdfa86 --- /dev/null +++ b/utils/permission.js @@ -0,0 +1,74 @@ +import store from "@/store"; + +/** + * @param {Array} value + * @returns {Boolean} + * @example see @/views/permission/directive.vue + */ +export const checkButtonPermission = (buttonCode, pageCode) => { + console.log(store); + let resources = store.state.resources; + //console.log(resources); + if (!resources) { + return false; + } + if (!pageCode) { + return false; + } + + if (!buttonCode) { + return false; + } + + let pages = resources.filter( + (item) => item.code == pageCode && item.type == 0 + ); + if (!pages) { + return false; + } + + let buttons = []; + for (let key in pages) { + buttons = resources.filter( + (item) => + item.type == 1 && item.code == buttonCode && item.pid == pages[key].id + ); + if (buttons.length > 0) { + return true; + } + } + + return false; +}; + +export const checkPagePermission = (pageCode) => { + let resources = store.state.resources; + //console.log(resources); + if (!Array.isArray(resources)) { + resources = []; + } + + if (!pageCode) { + return false; + } + let pages = resources.filter( + (item) => item.code == pageCode && item.type == 0 + ); + if (pages.length < 1) { + return false; + } + + if ( + [ + "truckOptBI", + "hydrogenBill", + "dailyHydrogenOrderBI", + "weappMileageBi", + "bi_ele_daily_summary", + ].includes(pages[0].code) + ) { + return pages[0].link; + } + + return true; +}; diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 0000000..e9deac7 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,580 @@ +/** + * @description 请求配置 + */ +import axios from "axios"; +import CryptoJS from "crypto-js"; +import { Base64 } from "js-base64"; +import { getToken, removeToken } from "./auth.js"; +import JSONBig from "json-bigint"; + +import { v1 as uuidv1 } from "uuid"; + +// export const baseUrl = "https://lingniu-gateway.demo.chinawayltd.com/"; +// export const baseUrl = "http://192.168.1.6:6902/"; + +const ENV = { + test: { + URL: "https://lingniu.test.chinawayltd.com/gateway/", + }, + demo: { + URL: "https://lingniu-gateway.demo.chinawayltd.com/", + }, + loce: { + URL: "http://192.168.130.136:6902/", + }, + loce2: { + URL: "http://192.168.110.222:6902/", + }, + loce3: { + URL: "http://192.168.110.23:6902/", + }, + local: { + URL: "http://lingniu.huixintop.com/", + }, + online: { + URL: "https://lnh2e.com/api/", + }, + beta: { + URL: "https://beta.lnh2e.com/api/", + }, + test2: { + URL: "http://115.230.138.233:6902/", + }, + huixin: { + URL: "https://lingniu.huixintop.com/", + }, +}; + +const vega = { + ["lingniu-manager-v1"]: { + key: "lingniu_server", + secret: "TiDjIe7dEaNfzI7n2w9emXkXlCbLmPar", + }, + ["lingniu-export-v1"]: { + key: "lingniu_server", + secret: "TiDjIe7dEaNfzI7n2w9emXkXlCbLmPar", + }, +}; + +const product = "lingniu-manager-v1"; +const uploadProduct = "lingniu-export-v1"; +const version = "v1"; +const sin_key = "lingniu_server"; +const sin_secret = "TiDjIe7dEaNfzI7n2w9emXkXlCbLmPar"; + +export const baseUrl = ENV.beta.URL; +console.log("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" + baseUrl); +class REQUEST { + static request(config) { + return new Promise((resolve, reject) => { + uni.request({ + ...config, + success: (res) => { + resolve(res.data.data); + }, + fail: (e) => { + reject(e); + }, + }); + }); + } + + static get(url, data, config) { + return this.request({ + url: url, //仅为示例,并非真实接口地址。 + method: "get", + data: data, + ...config, + }); + } + + static post(url, data, config = {}) { + return this.request({ + url: url, //仅为示例,并非真实接口地址。 + method: "post", + data: data, + ...config, + }); + } + + static put(url, data, config = {}) { + return this.request({ + url: url, //仅为示例,并非真实接口地址。 + method: "put", + data: data, + ...config, + }); + } + + static delete(url, data, config = {}) { + return this.request({ + url: url, //仅为示例,并非真实接口地址。 + method: "delete", + data: data, + ...config, + }); + } + + static upload(url, config = {}) { + const _this = this; + return new Promise((resolve, reject) => { + uni.uploadFile({ + url, + ...config, + success: (res) => { + resolve(res.data); + }, + fail: (e) => { + reject(e); + }, + }); + }); + } + + static download(url, fileName, cb) { + let config = { + responseType: "blob", + }; + _requestAxios("get", { + url: url, + data: {}, + config: config, + }).then((res) => { + if (cb) { + cb(); + } + const blob = new Blob([res.data]); + const link = document.createElement("a"); + link.href = URL.createObjectURL(blob); + link.download = fileName || _getFileName(res); + link.style.display = "none"; + document.body.appendChild(link); + link.click(); + window.URL.revokeObjectURL(link.href); + document.body.removeChild(link); + + function _getFileName(res) { + let headers = res.headers; + let contentDisposition = headers["content-disposition"]; + let reg = /(filename=)(\S)*(;)?/g; + let fileNameArr = contentDisposition.match(reg); + if (fileNameArr.length < 1) { + return "template.txt"; + } + let fileNameStr = fileNameArr[0].replace(";", ""); + let fileName = fileNameStr.replace("filename=", ""); + return decodeURI(fileName); + } + }); + return false; + } + + static getImageUrlParam(url, data, config = {}) { + config.params = data; + let reg = _regurl(url); + if (Array.isArray(reg) && reg.length >= 4) { + const [, product, version, path] = reg; + + const key = vega[product].key; + const secret = vega[product].secret; + + const timestamp = Date.now(); + const stringToSign = `GET\n${timestamp}\n/${product}/${version}${path}`; + const sign = Base64.btoa( + CryptoJS.HmacSHA1(stringToSign, secret).toString() + ); + + return `g7liteSaasGatewayAppKey=${key}&g7liteSaasGatewayTimestamp=${timestamp}&g7liteSaasGatewaySign=${encodeURIComponent( + sign + )}&g7liteGToken=${encodeURIComponent(getToken())}`; + } else { + console.warn("vega配置存在问题,请检查vega相关配置"); + } + } +} + +//BlobUrl转blob数据 +function funobjectURLToBlob(blodurl, nmae) { + return new Promise((resolve, reject) => { + const fileManager = uni.getFileSystemManager(); + fileManager.readFile({ + filePath: `${blodurl}`, + position: 0, + success(res) { + // let files = new window.File([res.data], name, { + // type: 'image' + // }); + // console.log(res.data) + resolve(res); + }, + fail(res) { + console.error(res); + }, + }); + // var http = new XMLHttpRequest(); + // http.open('GET', blodurl, true); + // http.responseType = 'blob'; + // http.onload = function(e) { + + // }; + // http.send(); + }); +} + +function _regurl(url) { + return url.match(/([^/]+)\/(v\d)(\/\S+)/); +} + +function _requestAxios(type, { url, config = {}, data = {} }) { + console.log(/(http|https):\/\/([\w.]+\/?)\S*/.test(url)); + const reqUrl = /(http|https):\/\/([\w.]+\/?)\S*/.test(url) + ? url + : baseUrl + url; + let sign = {}; + const langMapping = { + zh: "zh_CN", + en: "en_US", + th: "th_TH", + tw: "zh_TW", + }; + if (Array.isArray(reg) && reg.length >= 4) { + const [, product, version, path] = reg; + let pathArr = path.split("?"); + let pathStr = pathArr[0]; + sign = _makeApiSign({ + reqType: type, + path: pathStr, + product, + version, + key: vega[product].key, + secret: vega[product].secret, + }); + } else { + console.warn("vega配置存在问题,请检查vega相关配置"); + } + + config.headers = Object.assign( + { + "Content-Type": "application/json", + from_type: 1, + }, + { + "G7LITE-LANGUAGE": "zh_CN", + g7liteGToken: getToken(), + g7liteSaasGatewayAppKey: sign.key, + g7liteSaasGatewayTimestamp: sign.timestamp, + g7liteSaasGatewaySign: sign.sign, + }, + config.headers + ); + + _formatRequestData(type, config, data); + let requestConfig = Object.assign(config, { + method: type.toLowerCase(), + url: reqUrl, + }); + return axios(requestConfig) + .then((res) => _requestThen(config, res)) + .catch((error) => _requestCatch(config, error)); + + function _requestThen(config, res) { + return new Promise((resolve, reject) => { + if (!config.responseType || config.responseType === "json") { + if (res.data.code === 0 && res.data.subCode === 0) { + resolve(res.data); + } else { + const vegaErrorCode = [ + "330000011", + "330000012", + "330000013", + "330000014", + "330000015", + "330000016", + "330000017", + "330000018", + "330000019", + "331040003", // gtoken not allow empty + "331040007", // gtoken not existed + ]; + if ( + vegaErrorCode.includes("" + res.data.subCode) || + vegaErrorCode.includes("" + res.data.code) + ) { + console.log("token失效"); + removeToken(); + uni.reLaunch({ + url: "pages/index/index", + }); + } + + if (!config.hideErrorMsg) { + if (res.data.subCode === 331090010) { + uni.$u.toast("禁止访问"); + } else { + let messageStr = "系统错误"; + if (res.data.message) { + messageStr = res.data.message; + } + + if (res.data.subMessage) { + messageStr = res.data.subMessage; + } + + uni.$u.toast(messageStr); + } + } + reject(res); + } + } else { + if (res && res.data) { + resolve(res); + } + } + }); + } + + function _formatRequestData(type, config, data) { + const isBody = ["PUT", "put", "POST", "post", "PATCH", "patch"]; + let resultData = {}; + + data.hash = Math.random() * 100000000000000; + + if (isBody.includes(type)) { + resultData = _trimParams(data) || {}; + + if ( + config.headers && + config.headers["Content-Type"] && + config.headers["Content-Type"].indexOf( + "application/x-www-form-urlencoded" + ) > -1 + ) { + resultData = _formatParams(data); + } + config.data = resultData; + } else { + data = config.params || data; + config.params = _trimParams(data) || {}; + resultData = config; + } + return resultData; + } + + function _trimParams(data) { + if (data.constructor === Object) { + for (let i in data) { + if (typeof data[i] === "string") { + data[i] = data[i].trim(); + } + } + } + + return data; + } + + function _formatParams(data) { + if (data.constructor === Object) { + const arr = []; + + for (const i in data) { + arr.push(encodeURIComponent(i) + "=" + encodeURIComponent(data[i])); + } + + data = arr.join("&"); + } + + return data; + } + + function _requestCatch(config, error = {}) { + return new Promise((resolve, reject) => { + if (!error.isCancel) { + if (config.needReject) { + reject(error); + } else { + const res = (error || {}).data || {}; + const messageText = res.code !== 0 ? res.message : res.subMessage; + this.$refs.uToast.show({ + type: "error", + message: messageText || "请求失败", + complete() { + params.url && + uni.navigateTo({ + url: params.url, + }); + }, + }); + reject(error); + } + } + }); + } + + function _makeApiSign(config) { + const { reqType, path, product = "", version, key, secret } = config; + const timestamp = Date.now(); + const stringToSign = `${reqType.toUpperCase()}\n${timestamp}\n/${product}/${version}${path}`; + const sign = Base64.btoa( + CryptoJS.HmacSHA1(stringToSign, secret).toString() + ); + + return { + key, + sign, + timestamp, + }; + } +} + +function _makeApiSign(config) { + const { reqType, path, product = "", version, key, secret } = config; + const timestamp = Date.now(); + const stringToSign = `${reqType.toUpperCase()}\n${timestamp}\n/${product}/${version}${path}`; + const sign = Base64.btoa(CryptoJS.HmacSHA1(stringToSign, secret).toString()); + + return { + key, + sign, + timestamp, + }; +} + +async function getFormDataParams() { + const date = new Date(); + date.setHours(date.getHours() + 1); + const policyText = { + expiration: date.toISOString(), // 设置policy过期时间。 + conditions: [ + // 限制上传大小。 + ["content-length-range", 0, 1024 * 1024 * 1024], + ], + }; + const credentials = await axios.get("/getToken"); + const policy = Base64.encode(JSON.stringify(policyText)); // policy必须为base64的string。 + const signature = computeSignature(credentials.AccessKeySecret, policy); + const formData = { + OSSAccessKeyId: credentials.AccessKeyId, + signature, + policy, + "x-oss-security-token": credentials.SecurityToken, + }; + return formData; +} + +uni.addInterceptor("uploadFile", { + invoke(args) { + // request 触发前拼接 url + let pathArr = args.url.split("?"); + const pathStr = pathArr[0]; + args.url = baseUrl + uploadProduct + "/" + version + args.url; + // args.url = "http://127.0.0.1:6902/"+uploadProduct+"/"+version+ args.url + const sign = _makeApiSign({ + reqType: "post", + path: pathStr, + uploadProduct, + version, + key: sin_key, + secret: sin_secret, + }); + args.header = { + ...args.header, + "G7lite-Language": "zh_CN", + g7liteSaasGatewayAppKey: sign.key, + g7liteSaasGatewayTimestamp: sign.timestamp, + g7liteSaasGatewaySign: sign.sign, + G7litegtoken: getToken(), + }; + }, + success(res) {}, +}); +uni.addInterceptor("request", { + invoke(args) { + // request 触发前拼接 url + let pathArr = args.url.split("?"); + const pathStr = pathArr[0]; + // 如果是附件上传接口,则使用 uploadProduct + if (pathStr == "/attachment/upload") { + args.url = baseUrl + uploadProduct + "/" + version + args.url; + } else if (pathStr.indexOf("/apis.map.qq.co") > -1) { + args.url = args.url; + } else { + args.url = baseUrl + product + "/" + version + args.url; + } + //地图API单独处理 + + const sign = _makeApiSign({ + reqType: args.method, + path: pathStr, + product, + version, + key: sin_key, + secret: sin_secret, + }); + args.header = { + ...args.header, + "G7lite-Language": "zh_CN", + g7liteSaasGatewayAppKey: sign.key, + g7liteSaasGatewayTimestamp: sign.timestamp, + g7liteSaasGatewaySign: sign.sign, + G7litegtoken: getToken(), + }; + }, + success(res) { + res.data = res.data; + if ( + (res.data.code === 0 && res.data.subCode === 0) || + (res.statusCode === 200 && res.data.code === 200) || //获取地图markers接口 + (res.statusCode === 200 && res.data.status === 0) //微信泛解析地址接口 + ) { + return res.data; + } + const vegaErrorCode = [ + "330000011", + "330000012", + "330000013", + "330000014", + "330000015", + "330000016", + "330000017", + "330000018", + "330000019", + "331040003", // gtoken not allow empty + "331040007", // gtoken not existed + ]; + console.log("请求失败", res); + if ( + vegaErrorCode.includes("" + res.data.subCode) || + vegaErrorCode.includes("" + res.data.code) + ) { + removeToken(); + uni.reLaunch({ + url: "pages/index/index", + }); + } + if (res.data.subCode === 331090010) { + uni.$u.toast("禁止访问"); + } else { + let messageStr = "系统错误"; + if (res.data.message) { + messageStr = res.data.message; + } + if (res.data.subMessage) { + messageStr = res.data.subMessage; + } + if (res.data.code == 330000013) { + messageStr = "请登录"; + } + uni.$u.toast(messageStr); + } + }, + fail(err) { + console.log("interceptor-fail", err); + if (err.errno == "600001") { + uni.$u.toast("请求超时"); + } else { + uni.$u.toast(err.errMsg); + } + }, +}); + +export default REQUEST; diff --git a/utils/storage.js b/utils/storage.js new file mode 100644 index 0000000..a00481c --- /dev/null +++ b/utils/storage.js @@ -0,0 +1,32 @@ +import JSONBigint from 'json-bigint'; +export default { + get(key) { + if (!key) console.error('key不能为空'); + + let result = uni.getStorageSync(key); + try { + result = JSONBigint.parse(result); + + } catch (e) {} + + return result; + }, + + set(key, value) { + if (!key) console.error('key不能为空'); + typeof value === 'object' && (value = JSONBigint.stringify(value)); + try { + uni.setStorageSync(key, value) + } catch (e) { + console.log("数据存储错误", e) + } + }, + + remove(key) { + uni.removeStorageSync(key); + }, + + clean() { + uni.clearStorage(); + } +}; \ No newline at end of file diff --git a/utils/time.js b/utils/time.js new file mode 100644 index 0000000..8fd5fb1 --- /dev/null +++ b/utils/time.js @@ -0,0 +1,35 @@ +/* ,y 会被替换为年份,M、d、h、H、m、s、q、S、a、A 分别表示月份、日期、小时(12 小时制)、小时(24 小时制)、分钟、秒、季度、毫秒、上午/下午、AM/PM。 + 例如:yyyy-MM-dd HH:mm:ss +*/ +export function formatDateTime(date, format) { + if(date==undefined||date==''){ + return "" + } + date=new Date(date); + const o = { + 'M+': date.getMonth() + 1, // 月份 + 'd+': date.getDate(), // 日 + 'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时 + 'H+': date.getHours(), // 小时 + 'm+': date.getMinutes(), // 分 + 's+': date.getSeconds(), // 秒 + 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 + S: date.getMilliseconds(), // 毫秒 + a: date.getHours() < 12 ? '上午' : '下午', // 上午/下午 + A: date.getHours() < 12 ? 'AM' : 'PM', // AM/PM + }; + if (/(y+)/.test(format)) { + format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); + } + for (let k in o) { + if (new RegExp('(' + k + ')').test(format)) { + format = format.replace( + RegExp.$1, + RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length) + ); + } + } + return format; +} + +