Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Z
zc-qiyewx-app
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
杨勇飞
zc-qiyewx-app
Commits
e13da015
Commit
e13da015
authored
Feb 25, 2025
by
刘杰
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
企业微信前端
parent
3612bc13
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
1261 additions
and
1063 deletions
+1261
-1063
launch.json
.hbuilderx/launch.json
+16
-0
apiList.js
api/apiList.js
+3
-0
bossCard.vue
components/bossCard/bossCard.vue
+235
-211
dailyReport.vue
components/dailyReport/dailyReport.vue
+21
-4
dailyReportCreate.vue
components/dailyReportCreate/dailyReportCreate.vue
+1
-1
manifest.json
manifest.json
+1
-1
loginBehavior.js
mixins/loginBehavior.js
+67
-67
index.vue
pages/abnormal/detail/index.vue
+469
-459
index.vue
pages/abnormal/list/index.vue
+20
-6
index.vue
pages/index/index.vue
+17
-20
login.vue
pages/login/login.vue
+351
-234
config.js
publicConfig/config.js
+1
-1
yarn.lock
yarn.lock
+59
-59
No files found.
.hbuilderx/launch.json
0 → 100644
View file @
e13da015
{
//
launch.json
配置了启动调试时相关设置,configurations下节点名称可为
app-plus/h
5
/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp
-360
/
//
launchtype项可配置值为local或remote
,
local代表前端连本地云函数,remote代表前端连云端云函数
"version"
:
"0.0"
,
"configurations"
:
[{
"default"
:
{
"launchtype"
:
"local"
},
"mp-weixin"
:
{
"launchtype"
:
"local"
},
"type"
:
"uniCloud"
}
]
}
api/apiList.js
View file @
e13da015
...
@@ -16,6 +16,9 @@ export function searchBossCard(data) {
...
@@ -16,6 +16,9 @@ export function searchBossCard(data) {
export
function
searchOrderEvent
(
data
)
{
export
function
searchOrderEvent
(
data
)
{
return
Request
(
`/api/entry/{mini}/m-action/biz.tm.OrderRelease.service.searchOrderEvent`
,
data
)
return
Request
(
`/api/entry/{mini}/m-action/biz.tm.OrderRelease.service.searchOrderEvent`
,
data
)
}
}
export
function
searchOrderEventDetail
(
data
)
{
return
Request
(
`/api/entry/{mini}/m-action/biz.tm.OrderRelease.service.searchOrderEventDetail`
,
data
)
}
export
function
BindCompany
(
data
)
{
export
function
BindCompany
(
data
)
{
return
Request
(
return
Request
(
...
...
components/bossCard/bossCard.vue
View file @
e13da015
<
template
>
<
template
>
<view
class=
"report-container"
>
<view
class=
"report-container"
>
<!-- 顶部统计卡片 -->
<scroll-view
class=
"scroll-list"
scroll-y
>
<view
class=
"top-stats-wrapper"
>
<!-- 顶部统计卡片 -->
<!-- 异常统计环状进度 -->
<view
class=
"top-stats-wrapper"
>
<view
class=
"stats-card"
@
click=
"navigateToAbnormalReport"
>
<!-- 异常统计环状进度 -->
<view
class=
"circle-wrapper"
>
<view
class=
"stats-card"
@
click=
"navigateToAbnormalReport"
>
<view
class=
"progress-ring"
:style=
"
{
<view
class=
"circle-wrapper"
>
<view
class=
"progress-ring"
:style=
"
{
background: `conic-gradient(#FF4D4F 0% ${currentSearchData.overview.eventRate}%, #f5f5f5 ${currentSearchData.overview.eventRate}% 100%)`
background: `conic-gradient(#FF4D4F 0% ${currentSearchData.overview.eventRate}%, #f5f5f5 ${currentSearchData.overview.eventRate}% 100%)`
}">
}">
<view
class=
"inner-circle"
>
<view
class=
"inner-circle"
>
<view
class=
"submit-info"
>
<view
class=
"submit-info"
>
<view
class=
"count-row"
>
<view
class=
"count-row"
>
<text
class=
"submitted error"
>
{{
currentSearchData
.
overview
.
unHandled
}}
</text>
<text
class=
"submitted error"
>
{{
currentSearchData
.
overview
.
unHandled
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalEvent
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalEvent
}}
</text>
</view>
<text
class=
"label"
>
异常统计
</text>
</view>
</view>
<text
class=
"label"
>
异常统计
</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 日报提交环状进度 -->
<!-- 日报提交环状进度 -->
<view
class=
"stats-card"
@
click=
"navigateToDailyReport"
>
<view
class=
"stats-card"
@
click=
"navigateToDailyReport"
>
<view
class=
"circle-wrapper"
>
<view
class=
"circle-wrapper"
>
<view
class=
"progress-ring"
:style=
"
{
<view
class=
"progress-ring"
:style=
"
{
background: `conic-gradient(#52C41A 0% ${currentSearchData.overview.submitRate}%, #f5f5f5 ${currentSearchData.overview.submitRate}% 100%)`
background: `conic-gradient(#52C41A 0% ${currentSearchData.overview.submitRate}%, #f5f5f5 ${currentSearchData.overview.submitRate}% 100%)`
}">
}">
<view
class=
"inner-circle"
>
<view
class=
"inner-circle"
>
<view
class=
"submit-info"
>
<view
class=
"submit-info"
>
<view
class=
"count-row"
>
<view
class=
"count-row"
>
<text
class=
"submitted"
>
{{
currentSearchData
.
overview
.
submitCount
}}
</text>
<text
class=
"submitted"
>
{{
currentSearchData
.
overview
.
submitCount
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalCount
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalCount
}}
</text>
</view>
<text
class=
"label"
>
日报提交
</text>
</view>
</view>
<text
class=
"label"
>
日报提交
</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 顶部时间导航 -->
<!-- 顶部时间导航 -->
<view
class=
"time-nav"
>
<view
class=
"time-nav"
>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'month'}" @click="switchTime('month')">本月
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'month'}" @click="switchTime('month')">本月
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'week'}" @click="switchTime('week')">本周
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'week'}" @click="switchTime('week')">本周
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'yesterday'}" @click="switchTime('yesterday')">昨日
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'yesterday'}" @click="switchTime('yesterday')">昨日
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'today'}" @click="switchTime('today')">今日
</view>
</view>
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'today'}" @click="switchTime('today')">今日
</view>
</view>
<!-- 项目概览卡片 -->
<!-- 项目概览卡片 -->
<view
class=
"project-card"
>
<view
class=
"project-card"
>
<view
class=
"overview-content"
>
<view
class=
"overview-content"
>
<!-- 右侧数据统计 -->
<!-- 右侧数据统计 -->
<view
class=
"statistics"
v-if=
"staffKind==='simulatedBoss'"
>
<view
class=
"statistics"
>
<view
class=
"stat-row"
>
<view
class=
"stat-row"
v-if=
"staffKind==='simulatedBoss'"
>
<view
class=
"stat-item"
>
<view
class=
"stat-item"
>
<view
class=
"stat-block green "
>
<view
class=
"stat-block green "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
shippingCount
}}
</text>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
shippingCount
}}
</text>
<text
class=
"rate"
>
运输中
</text>
<text
class=
"rate"
>
运输中
</text>
</view>
</view>
</view>
</view
>
<view
class=
"stat-item"
>
<view
class=
"stat-item
"
>
<view
class=
"stat-block light-orange
"
>
<view
class=
"stat-block light-orange "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
positionCount
}}
</text
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
positionCount
}}
</text>
<text
class=
"rate"
>
开启定位
</text>
<
text
class=
"rate"
>
开启定位
</text
>
<
/view
>
</view>
</view>
</view
>
<view
class=
"stat-item"
>
<view
class=
"stat-item
"
>
<view
class=
"stat-block green
"
>
<view
class=
"stat-block green "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
podCount
}}
</text
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
podCount
}}
</text>
<text
class=
"rate"
>
回单
</text>
<
text
class=
"rate"
>
回单
</text
>
<
/view
>
</view>
</view>
</view>
</view>
<view
class=
"stat-row"
>
<view
class=
"stat-item"
>
<view
class=
"stat-block light-orange"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
orderCount
}}
</text>
<text
class=
"rate"
>
单量
</text>
</view>
</view>
</view>
<view
class=
"stat-item"
>
<view
class=
"stat-row"
>
<view
class=
"stat-block green"
>
<view
class=
"stat-item"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
volumeCount
}}
</text>
<view
class=
"stat-block light-orange"
>
<text
class=
"rate"
>
方量m³
</text>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
orderCount
}}
</text>
<text
class=
"rate"
>
单量
</text>
</view>
</view>
</view>
</view>
<view
class=
"stat-item"
>
<view
class=
"stat-item"
>
<view
class=
"stat-block green"
>
<view
class=
"stat-block orange"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
volumeCount
}}
</text>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
weightCount
}}
</text>
<text
class=
"rate"
>
方量m³
</text>
<text
class=
"rate"
>
重量T
</text>
</view>
</view>
<view
class=
"stat-item"
>
<view
class=
"stat-block orange"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
weightCount
}}
</text>
<text
class=
"rate"
>
重量T
</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 应收应付信息 -->
<view
class=
"finance-info"
>
<!-- 应收模块 -->
<view
class=
"finance-block"
>
<view
class=
"finance-item receivable"
>
<!-- 左侧图标 -->
<view
class=
"left-section"
>
<view
class=
"icon"
>
¥
</view>
</view>
<!-- 右侧内容 -->
<!-- 应收应付信息 -->
<view
class=
"right-section"
>
<view
class=
"finance-info"
>
<view
class=
"main-info"
>
<!-- 应收模块 -->
<view
class=
"amount-section"
>
<view
class=
"finance-block"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
receivable
.
total
}}
</text>
<view
class=
"finance-item receivable"
>
<text
class=
"label"
>
应收
</text>
<!-- 左侧图标 -->
</view>
<view
class=
"left-section"
>
<view
class=
"extra-info"
>
<view
class=
"icon"
>
¥
</view>
<view
class=
"info-row"
>
</view>
<text
class=
"label"
>
预计毛利
</text>
<text
class=
"value"
>
{{
currentSearchData
.
finance
.
receivable
.
profit
}}
</text>
<!-- 右侧内容 -->
<view
class=
"right-section"
>
<view
class=
"main-info"
>
<view
class=
"amount-section"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
receivable
.
total
}}
</text>
<text
class=
"label"
>
应收
</text>
</view>
</view>
<view
class=
"info-row"
>
<view
class=
"extra-info"
>
<text
class=
"label"
>
毛利率
</text>
<view
class=
"info-row"
>
<text
class=
"value"
>
{{
currentSearchData
.
finance
.
receivable
.
profitRate
}}
%
</text>
<text
class=
"label"
>
预计毛利
</text>
<text
class=
"value"
>
{{
currentSearchData
.
finance
.
receivable
.
profit
}}
</text>
</view>
<view
class=
"info-row"
>
<text
class=
"label"
>
毛利率
</text>
<text
class=
"value"
>
{{
currentSearchData
.
finance
.
receivable
.
profitRate
}}
%
</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view
class=
"progress-bar"
>
<view
class=
"progress-bar"
>
<view
class=
"progress-bar"
<view
class=
"progress-bar"
style=
"position: relative; height: 4px;width: 100%; background: #52C41A; border-radius: 2px; overflow: hidden;"
>
style=
"position: relative; height: 4px;width: 100%; background: #52C41A; border-radius: 2px; overflow: hidden;"
>
<view
class=
"progress"
:style=
"
{
<view
class=
"progress"
:style=
"
{
backgroundColor: '#FF4D4F',
backgroundColor: '#FF4D4F',
opacity:0.9,
opacity:0.9,
width: 100-currentSearchData.finance.receivable.profitRate + '%',
width: 100-currentSearchData.finance.receivable.profitRate + '%',
...
@@ -143,41 +144,41 @@
...
@@ -143,41 +144,41 @@
left: 0,
left: 0,
top: '1px'
top: '1px'
}">
</view>
}">
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 应付模块 -->
<!-- 应付模块 -->
<view
class=
"finance-block"
>
<view
class=
"finance-block"
>
<view
class=
"finance-item payable"
>
<view
class=
"finance-item payable"
>
<!-- 左侧图标 -->
<!-- 左侧图标 -->
<view
class=
"left-section"
>
<view
class=
"left-section"
>
<view
class=
"icon"
>
¥
</view>
<view
class=
"icon"
>
¥
</view>
</view>
</view>
<!-- 右侧内容 -->
<!-- 右侧内容 -->
<view
class=
"right-section"
>
<view
class=
"right-section"
>
<view
class=
"main-info"
>
<view
class=
"main-info"
>
<view
class=
"amount-section"
>
<view
class=
"amount-section"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
payable
.
total
}}
</text>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
payable
.
total
}}
</text>
<text
class=
"label"
>
应付
</text>
<text
class=
"label"
>
应付
</text>
</view>
<view
class=
"extra-info"
>
<view
class=
"info-row"
>
<text
class=
"label"
>
现结
</text>
<text
class=
"value cash"
>
{{
currentSearchData
.
finance
.
payable
.
cash
}}
</text>
</view>
</view>
<view
class=
"info-row"
>
<view
class=
"extra-info"
>
<text
class=
"label"
>
月结
</text>
<view
class=
"info-row"
>
<text
class=
"value monthly"
>
{{
currentSearchData
.
finance
.
payable
.
monthly
}}
</text>
<text
class=
"label"
>
现结
</text>
<text
class=
"value cash"
>
{{
currentSearchData
.
finance
.
payable
.
cash
}}
</text>
</view>
<view
class=
"info-row"
>
<text
class=
"label"
>
月结
</text>
<text
class=
"value monthly"
>
{{
currentSearchData
.
finance
.
payable
.
monthly
}}
</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view
class=
"progress-bar"
<view
class=
"progress-bar"
style=
"position: relative; height: 4px; background: #f0f0f0; border-radius: 2px; overflow: hidden;"
>
style=
"position: relative; height: 4px; background: #f0f0f0; border-radius: 2px; overflow: hidden;"
>
<view
class=
"progress cash"
:style=
"
{
<view
class=
"progress cash"
:style=
"
{
backgroundColor: '#FFA940',
backgroundColor: '#FFA940',
width: cashRatio,
width: cashRatio,
position: 'absolute',
position: 'absolute',
...
@@ -185,7 +186,7 @@
...
@@ -185,7 +186,7 @@
left: 0,
left: 0,
top: 0
top: 0
}">
</view>
}">
</view>
<view
class=
"progress monthly"
:style=
"
{
<view
class=
"progress monthly"
:style=
"
{
backgroundColor: '#13C2C2',
backgroundColor: '#13C2C2',
position: 'absolute',
position: 'absolute',
height: '100%',
height: '100%',
...
@@ -193,97 +194,100 @@
...
@@ -193,97 +194,100 @@
width: monthlyRatio,
width: monthlyRatio,
top: 0
top: 0
}">
</view>
}">
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 模拟老板对比图表区域 -->
<!-- 模拟老板对比图表区域 --
>
<view
class=
"chart-container"
v-if=
"staffKind==='boss'"
>
<view
class=
"chart-container"
v-if=
"staffKind==='boss'
"
>
<view
class=
"chart-header
"
>
<view
class=
"chart-header"
>
<text
class=
"chart-title"
>
模拟老板对比
</text
>
<text
class=
"chart-title"
>
模拟老板对比
</text
>
<view
class=
"sort-buttons"
>
<view
class=
"sort-buttons"
>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'receivable'}"
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'receivable'}"
@click="sortChart('receivable','myLeaderChart')">
@click="sortChart('receivable','myLeaderChart')"
>
<text
class=
"sort-icon"
></text
>
<text
class=
"sort-icon"
></text>
应收
应收
</text>
</text>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'payable'}"
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'payable'}"
@click="sortChart('payable','myLeaderChart')">
@click="sortChart('payable','myLeaderChart')"
>
<text
class=
"sort-icon"
></text
>
<text
class=
"sort-icon"
></text>
应付
应付
</text>
</text>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'profitRate'}"
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'profitRate'}"
@click="sortChart('profitRate','myLeaderChart')">
@click="sortChart('profitRate','myLeaderChart')"
>
<text
class=
"sort-icon"
></text
>
<text
class=
"sort-icon"
></text>
利润
利润
</text>
</
text
>
</
view
>
</view>
</view>
<scroll-view
class=
"chart-scroll"
scroll-x
@
touchmove
.
prevent
>
<canvas
class=
"chart-wrapper"
id=
"myLeaderChart"
></canvas>
</scroll-view>
</view>
</view>
<scroll-view
class=
"chart-scroll"
scroll-x
>
<view
class=
"chart-wrapper"
id=
"myLeaderChart"
></view>
<!-- 项目对比图表区域 -->
</scroll-view>
<!-- todo: 当前排序和模拟老板干涉 -->
</view>
<view
class=
"chart-container"
>
<view
class=
"chart-header"
>
<!-- 项目对比图表区域 -->
<text
class=
"chart-title"
>
项目对比(前10)
</text>
<!-- todo: 当前排序和模拟老板干涉 -->
<view
class=
"sort-buttons"
>
<view
class=
"chart-container"
>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'receivable'}"
<view
class=
"chart-header"
>
@click="sortProjectChart('receivable','myProjectChart')">
<text
class=
"chart-title"
>
项目对比(前10)
</text>
<text
class=
"sort-icon"
></text>
<view
class=
"sort-buttons"
>
应收
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'receivable'}"
</text>
@click="sortProjectChart('receivable','myProjectChart')">
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'payable'}"
<text
class=
"sort-icon"
></text>
@click="sortProjectChart('payable','myProjectChart')">
应收
<text
class=
"sort-icon"
></text>
</text>
应付
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'payable'}"
</text>
@click="sortProjectChart('payable','myProjectChart')">
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'profitRate'}"
<text
class=
"sort-icon"
></text>
@click="sortProjectChart('profitRate','myProjectChart')">
应付
<text
class=
"sort-icon"
></text>
</text>
利润
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'profitRate'}"
</text>
@click="sortProjectChart('profitRate','myProjectChart')">
</view>
<text
class=
"sort-icon"
></text>
利润
</text>
</view>
</view>
<scroll-view
class=
"chart-scroll"
scroll-x
@
touchmove
.
prevent
>
<canvas
class=
"chart-wrapper"
id=
"myProjectChart"
></canvas>
</scroll-view>
</view>
</view>
<scroll-view
class=
"chart-scroll"
scroll-x
>
<view
class=
"chart-wrapper"
id=
"myProjectChart"
></view>
<!-- 项目运营表格 -->
</scroll-view>
<view
class=
"table-container"
>
</view>
<text
class=
"table-title"
>
模拟老板运营情况
</text>
<scroll-view
scroll-x
class=
"table-scroll"
>
<!-- 项目运营表格 -->
<view
class=
"table-scroll"
>
<view
class=
"table-container"
>
<uni-table
:data=
"currentData.tableData"
border
:loading=
"loading"
emptyText=
"暂无数据"
>
<text
class=
"table-title"
>
模拟老板运营情况
</text>
<uni-tr>
<view
class=
"table-scroll"
>
<uni-th
align=
"center"
width=
"70"
>
模拟老板
</uni-th>
<uni-table
:data=
"currentData.tableData"
border
:loading=
"loading"
emptyText=
"暂无数据"
>
<uni-th
align=
"center"
width=
"60"
>
应收(万)
</uni-th>
<uni-tr>
<uni-th
align=
"center"
width=
"60"
>
应付(万)
</uni-th>
<uni-th
align=
"center"
width=
"70"
>
模拟老板
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
应付现结(万)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
应收(万)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
毛利率(%)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
应付(万)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
单量
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
应付现结(万)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
方(m³)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
毛利率(%)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
吨(T)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
单量
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
人力
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
方(m³)
</uni-th>
</uni-tr>
<uni-th
align=
"center"
width=
"60"
>
吨(T)
</uni-th>
<uni-tr
v-for=
"(item, index) in currentData.tableData"
:key=
"index"
>
<uni-th
align=
"center"
width=
"60"
>
人力
</uni-th>
<uni-td>
{{
item
.
boss
}}
</uni-td>
</uni-tr>
<uni-td>
{{
item
.
receivable
}}
</uni-td>
<uni-tr
v-for=
"(item, index) in currentData.tableData"
:key=
"index"
>
<uni-td>
{{
item
.
payable
}}
</uni-td>
<uni-td>
{{
item
.
boss
}}
</uni-td>
<uni-td>
{{
item
.
cashPayable
}}
</uni-td>
<uni-td>
{{
item
.
receivable
}}
</uni-td>
<uni-td>
{{
item
.
profitRate
}}
%
</uni-td>
<uni-td>
{{
item
.
payable
}}
</uni-td>
<uni-td>
{{
item
.
orderCount
}}
</uni-td>
<uni-td>
{{
item
.
cashPayable
}}
</uni-td>
<uni-td>
{{
item
.
volume
}}
</uni-td>
<uni-td>
{{
item
.
profitRate
}}
%
</uni-td>
<uni-td>
{{
item
.
weight
}}
</uni-td>
<uni-td>
{{
item
.
orderCount
}}
</uni-td>
<uni-td>
{{
item
.
manpower
}}
</uni-td>
<uni-td>
{{
item
.
volume
}}
</uni-td>
</uni-tr>
<uni-td>
{{
item
.
weight
}}
</uni-td>
</uni-table>
<uni-td>
{{
item
.
manpower
}}
</uni-td>
</view>
</uni-tr>
</scroll-view>
</uni-table>
</view>
</view>
</view>
</
scroll-
view>
</view>
</view>
</
template
>
</
template
>
...
@@ -496,6 +500,9 @@
...
@@ -496,6 +500,9 @@
itemStyle
:
{
itemStyle
:
{
color
:
'#52C41A'
,
color
:
'#52C41A'
,
borderRadius
:
[
4
,
4
,
0
,
0
]
borderRadius
:
[
4
,
4
,
0
,
0
]
},
emphasis
:
{
focus
:
'series'
}
}
},
},
{
{
...
@@ -505,6 +512,9 @@
...
@@ -505,6 +512,9 @@
itemStyle
:
{
itemStyle
:
{
color
:
'#FF4D4F'
,
color
:
'#FF4D4F'
,
borderRadius
:
[
4
,
4
,
0
,
0
]
borderRadius
:
[
4
,
4
,
0
,
0
]
},
emphasis
:
{
focus
:
'series'
}
}
},
},
{
{
...
@@ -518,12 +528,20 @@
...
@@ -518,12 +528,20 @@
},
},
lineStyle
:
{
lineStyle
:
{
width
:
2
width
:
2
},
emphasis
:
{
focus
:
'series'
}
}
}
}
]
]
}
}
this
.
myLeaderChart
.
setOption
(
option
)
this
.
myLeaderChart
.
setOption
(
option
)
this
.
myLeaderChart
.
on
(
'click'
,
function
(
params
)
{
if
(
params
.
componentType
===
'series'
)
{
console
.
log
(
'触碰到柱状图:'
,
params
);
}
});
},
},
initProjectChart
()
{
initProjectChart
()
{
// 获取数据点数量
// 获取数据点数量
...
@@ -650,11 +668,11 @@
...
@@ -650,11 +668,11 @@
lineStyle
:
{
lineStyle
:
{
width
:
2
width
:
2
}
}
}
}
]
]
}
}
this
.
myProjectChart
.
setOption
(
option
)
this
.
myProjectChart
.
setOption
(
option
)
},
},
async
switchTime
(
time
)
{
async
switchTime
(
time
)
{
this
.
activeTime
=
time
this
.
activeTime
=
time
...
@@ -883,11 +901,17 @@
...
@@ -883,11 +901,17 @@
height
:
100%
;
height
:
100%
;
}
}
.scroll-list
{
height
:
calc
(
100vh
-
60px
);
}
.report-container
{
.report-container
{
width
:
100%
;
width
:
100%
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
background-color
:
#F5F7FA
;
background-color
:
#F5F7FA
;
min-height
:
100vh
;
min-height
:
calc
(
100vh
-
60px
);
// max-height: 100vh;
>
view
{
>
view
{
width
:
100%
;
width
:
100%
;
...
...
components/dailyReport/dailyReport.vue
View file @
e13da015
...
@@ -3,15 +3,23 @@
...
@@ -3,15 +3,23 @@
<!-- 顶部统计 -->
<!-- 顶部统计 -->
<view
class=
"report-stats"
>
<view
class=
"report-stats"
>
<view
class=
"stat-item"
@
click=
"selectReport('submit')"
>
<view
class=
"stat-item"
@
click=
"selectReport('submit')"
>
<text
class=
"number"
style=
"color: #52c41a;"
>
{{
searchDatas
.
submitted
}}
</text>
<text
class=
"number"
style=
"color: #52c41a;"
>
{{
searchDatas
.
submitted
}}
<text
class=
"unit"
style=
"color: #52c41a;"
>
人
</text>
</text>
<text
class=
"label"
>
已提交
</text>
<text
class=
"label"
>
已提交
</text>
</view>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('unSubmit')"
>
<view
class=
"stat-item"
@
click=
"selectReport('unSubmit')"
>
<text
class=
"number"
style=
"color: #ff4d4f;"
>
{{
searchDatas
.
unSubmitted
}}
</text>
<text
class=
"number"
style=
"color: #ff4d4f;"
>
{{
searchDatas
.
unSubmitted
}}
<text
class=
"unit"
style=
"color: #ff4d4f;"
>
人
</text>
</text>
<text
class=
"label"
>
未提交
</text>
<text
class=
"label"
>
未提交
</text>
</view>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('all')"
>
<view
class=
"stat-item"
@
click=
"selectReport('all')"
>
<text
class=
"number"
style=
"color: #1890ff;"
>
{{
searchDatas
.
total
}}
</text>
<text
class=
"number"
style=
"color: #1890ff;"
>
{{
searchDatas
.
total
}}
<text
class=
"unit"
style=
"color: #1890ff;"
>
人
</text></text>
<text
class=
"label"
>
总人数
</text>
<text
class=
"label"
>
总人数
</text>
</view>
</view>
...
@@ -85,6 +93,9 @@
...
@@ -85,6 +93,9 @@
this
.
staffCode
=
uni
.
getStorageSync
(
'staffCode'
);
this
.
staffCode
=
uni
.
getStorageSync
(
'staffCode'
);
this
.
staffKind
=
uni
.
getStorageSync
(
'uc_staff_kind'
);
this
.
staffKind
=
uni
.
getStorageSync
(
'uc_staff_kind'
);
this
.
commonName
=
uni
.
getStorageSync
(
'commonName'
);
this
.
commonName
=
uni
.
getStorageSync
(
'commonName'
);
console
.
log
(
"this.staffCode"
+
this
.
staffCode
)
console
.
log
(
"this.staffKind"
+
this
.
staffKind
)
console
.
log
(
"this.commonName"
+
this
.
commonName
)
console
.
log
(
'获取到的commonName:'
,
this
.
commonName
);
console
.
log
(
'获取到的commonName:'
,
this
.
commonName
);
...
@@ -167,6 +178,12 @@
...
@@ -167,6 +178,12 @@
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#333
;
color
:
#333
;
margin-bottom
:
8px
;
margin-bottom
:
8px
;
.unit
{
font-size
:
12px
;
color
:
#999
;
margin-left
:
5px
;
}
}
}
.label
{
.label
{
...
@@ -178,7 +195,7 @@
...
@@ -178,7 +195,7 @@
.report-list
{
.report-list
{
// 调整高度,移除分页器的空间
// 调整高度,移除分页器的空间
height
:
calc
(
100vh
-
12
0px
);
height
:
calc
(
100vh
-
20
0px
);
.report-card
{
.report-card
{
display
:
block
;
display
:
block
;
...
...
components/dailyReportCreate/dailyReportCreate.vue
View file @
e13da015
...
@@ -52,7 +52,7 @@
...
@@ -52,7 +52,7 @@
<!-- 按钮组 -->
<!-- 按钮组 -->
<view
class=
"button-group"
>
<view
class=
"button-group"
>
<
button
class=
"back-btn"
@
click=
"goBack"
>
返回
</button
>
<
!--
<button
class=
"back-btn"
@
click=
"goBack"
>
返回
</button>
--
>
<button
class=
"submit-btn"
@
click=
"submitReport"
>
提交日报
</button>
<button
class=
"submit-btn"
@
click=
"submitReport"
>
提交日报
</button>
</view>
</view>
</view>
</view>
...
...
manifest.json
View file @
e13da015
...
@@ -79,7 +79,7 @@
...
@@ -79,7 +79,7 @@
"devServer"
:
{
"devServer"
:
{
"https"
:
false
,
"https"
:
false
,
"disableHostCheck"
:
true
,
"disableHostCheck"
:
true
,
"port"
:
808
2
,
"port"
:
808
3
,
"proxy"
:
{
"proxy"
:
{
"/api"
:
{
"/api"
:
{
//
"target"
:
"http://122.112.220.204:8089"
,
//
"target"
:
"http://122.112.220.204:8089"
,
...
...
mixins/loginBehavior.js
View file @
e13da015
...
@@ -16,75 +16,75 @@ import * as ww from "@wecom/jssdk";
...
@@ -16,75 +16,75 @@ import * as ww from "@wecom/jssdk";
module
.
exports
=
{
module
.
exports
=
{
methods
:
{
methods
:
{
initWeCom
(
callback
=
()
=>
{})
{
//
initWeCom(callback = () => {}) {
getTicketByType
({
//
getTicketByType({
aux
:
{
//
aux: {
entryName
:
MINI
.
h5Uat
,
//
entryName: MINI.h5Uat,
type
:
"app"
,
//
type: "app",
},
//
},
}).
then
((
res
)
=>
{
//
}).then((res) => {
const
appTicket
=
res
.
data
.
data
.
ticket
;
//
const appTicket = res.data.data.ticket;
getTicketByType
({
//
getTicketByType({
aux
:
{
//
aux: {
entryName
:
MINI
.
h5Uat
,
//
entryName: MINI.h5Uat,
type
:
"company"
,
//
type: "company",
},
//
},
}).
then
((
res
)
=>
{
//
}).then((res) => {
const
comTicket
=
res
.
data
.
data
.
ticket
;
//
const comTicket = res.data.data.ticket;
const
timestamp
=
new
Date
().
getTime
();
//
const timestamp = new Date().getTime();
ww
.
register
({
//
ww.register({
corpId
:
CORP_ID
,
//
corpId: CORP_ID,
agentId
:
AGENT_ID
,
//
agentId: AGENT_ID,
jsApiList
:
JS_API_LIST
,
//
jsApiList: JS_API_LIST,
async
getConfigSignature
(
url
)
{
//
async getConfigSignature(url) {
const
{
//
const {
signature
//
signature
}
=
ww
.
getSignature
({
//
} = ww.getSignature({
ticket
:
comTicket
,
//
ticket: comTicket,
nonceStr
:
MINI
.
h5Uat
,
//
nonceStr: MINI.h5Uat,
timestamp
,
//
timestamp,
url
,
//
url,
});
//
});
return
{
//
return {
timestamp
,
//
timestamp,
nonceStr
:
MINI
.
h5Uat
,
//
nonceStr: MINI.h5Uat,
signature
,
//
signature,
};
//
};
},
//
},
async
getAgentConfigSignature
(
url
)
{
//
async getAgentConfigSignature(url) {
const
{
//
const {
signature
//
signature
}
=
ww
.
getSignature
({
//
} = ww.getSignature({
ticket
:
appTicket
,
//
ticket: appTicket,
nonceStr
:
MINI
.
h5Uat
,
//
nonceStr: MINI.h5Uat,
timestamp
,
//
timestamp,
url
,
//
url,
});
//
});
return
{
//
return {
timestamp
,
//
timestamp,
nonceStr
:
MINI
.
h5Uat
,
//
nonceStr: MINI.h5Uat,
signature
,
//
signature,
};
//
};
},
//
},
onConfigSuccess
(
res
)
{
//
onConfigSuccess(res) {
console
.
log
(
"onConfigSuccess"
,
res
);
//
console.log("onConfigSuccess", res);
},
//
},
onConfigFail
(
res
)
{
//
onConfigFail(res) {
console
.
log
(
"onConfigFail"
+
res
);
//
console.log("onConfigFail" + res);
},
//
},
onAgentConfigSuccess
(
res
)
{
//
onAgentConfigSuccess(res) {
console
.
log
(
"onAgentConfigSuccess"
+
JSON
.
stringify
(
res
));
//
console.log("onAgentConfigSuccess" + JSON.stringify(res));
callback
()
//
callback()
},
//
},
onAgentConfigFail
(
res
)
{
//
onAgentConfigFail(res) {
console
.
log
(
"onAgentConfigFail"
+
res
);
//
console.log("onAgentConfigFail" + res);
},
//
},
});
//
});
});
//
});
});
//
});
},
//
},
//获取微信token
//获取微信token
getWxToken
()
{
getWxToken
()
{
uni
.
login
({
uni
.
login
({
...
...
pages/abnormal/detail/index.vue
View file @
e13da015
<
template
>
<
template
>
<view
class=
"abnormal-detail"
>
<view
class=
"abnormal-detail"
>
<!-- 基本信息卡片 -->
<!-- 基本信息卡片 -->
<view
class=
"detail-card"
>
<scroll-view
scroll-y
:style=
"
{ height: '100vh' }">
<view
class=
"card-title"
>
基本信息
</view>
<view
class=
"detail-card"
>
<view
class=
"info-grid"
>
<view
class=
"card-title"
>
基本信息
</view>
<view
class=
"header-row"
>
<view
class=
"info-grid"
>
<text
class=
"abnormal-id"
@
click=
"copyText(detail.abnormalId)"
>
{{
detail
.
abnormalId
}}
</text>
<view
class=
"header-row"
>
<text
class=
"time"
>
{{
detail
.
occurTime
}}
</text>
<text
class=
"abnormal-id"
</view>
@
click=
"copyText(detail.orderEventNo)"
>
{{
detail
.
orderEventNo
}}
</text>
<text
class=
"time"
>
{{
detail
.
eventTime
}}
</text>
<view
class=
"full-width-item"
>
</view>
<text
class=
"label"
>
客户
</text>
<text
class=
"value"
>
{{
detail
.
customer
}}
</text>
<view
class=
"full-width-item"
>
</view>
<text
class=
"label"
>
客户
</text>
<text
class=
"value"
>
{{
detail
.
customerName
}}
</text>
<view
class=
"full-width-item"
>
</view>
<text
class=
"label"
>
订单始发地
</text>
<text
class=
"value"
>
{{
detail
.
startLocation
}}
</text>
<view
class=
"full-width-item"
>
</view>
<text
class=
"label"
>
订单始发地
</text>
<text
class=
"value"
>
{{
detail
.
startLocation
}}
</text>
<view
class=
"full-width-item"
>
</view>
<text
class=
"label"
>
目的地名称
</text>
<text
class=
"value"
>
{{
detail
.
endLocation
}}
</text>
<view
class=
"full-width-item"
>
</view>
<text
class=
"label"
>
目的地名称
</text>
</view>
<text
class=
"value"
>
{{
detail
.
endLocation
}}
</text>
</view>
</view>
</view>
<!-- 异常信息卡片 -->
</view>
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
异常信息
</view>
<!-- 异常信息卡片 -->
<view
class=
"info-grid"
>
<view
class=
"detail-card"
>
<view
class=
"abnormal-info"
>
<view
class=
"card-title"
>
异常信息
</view>
<view
class=
"info-grid"
>
<view
class=
"abnormal-info"
>
<view
class=
"info-row"
>
<view
class=
"info-col"
>
<text
class=
"label"
>
处理状态
</text>
<view
class=
"info-row"
>
<text
class=
"value"
:class=
"getProcessClass(detail.processStatus)"
>
<view
class=
"info-col"
>
{{
detail
.
processStatus
}}
<text
class=
"label"
>
处理状态
</text>
</text>
<text
class=
"value"
:class=
"getProcessClass(detail.orderEventStatus)"
>
</view>
{{
detail
.
orderEventStatus
}}
<view
class=
"info-col"
>
</text>
<text
class=
"label"
>
涉及金额
</text>
</view>
<text
class=
"value amount"
>
¥
{{
detail
.
amount
}}
</text>
<view
class=
"info-col"
>
</view>
<text
class=
"label"
>
涉及金额
</text>
</view>
<text
class=
"value amount"
>
¥
{{
detail
.
involvingAmount
}}
</text>
</view>
<view
class=
"info-row"
>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
异常类型
</text>
<view
class=
"info-row"
>
<text
class=
"value"
>
{{
detail
.
abnormalType
}}
</text>
<view
class=
"info-col"
>
</view>
<text
class=
"label"
>
异常类型
</text>
<view
class=
"info-col"
>
<text
class=
"value"
>
{{
detail
.
abnormalType
}}
</text>
<text
class=
"label"
>
二级异常
</text>
</view>
<text
class=
"value"
>
{{
detail
.
secondaryAbnormal
}}
</text>
<view
class=
"info-col"
>
</view>
<text
class=
"label"
>
二级异常
</text>
</view>
<text
class=
"value"
>
{{
detail
.
childrenException
}}
</text>
</view>
<view
class=
"info-row"
>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
责任方
</text>
<view
class=
"info-row"
>
<text
class=
"value"
>
{{
detail
.
responsible
}}
</text>
<view
class=
"info-col"
>
</view>
<text
class=
"label"
>
责任方
</text>
<view
class=
"info-col"
>
<text
class=
"value"
>
{{
detail
.
responsible
}}
</text>
<text
class=
"label"
>
是否记录KPI
</text>
</view>
<text
class=
"value"
>
{{
detail
.
isKPI
?
'是'
:
'否'
}}
</text>
<view
class=
"info-col"
>
</view>
<text
class=
"label"
>
是否记录KPI
</text>
<text
class=
"value"
>
{{
detail
.
isKPI
?
'是'
:
'否'
}}
</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 处理信息卡片 -->
</view>
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
处理信息
</view>
<!-- 处理信息卡片 -->
<view
class=
"text-area"
>
<view
class=
"detail-card"
>
<view
class=
"text-item"
>
<view
class=
"card-title"
>
处理信息
</view>
<view
class=
"text-label"
>
事件描述
</view>
<view
class=
"text-area"
>
<view
class=
"text-content"
>
{{
detail
.
description
}}
</view>
<view
class=
"text-item"
>
</view>
<view
class=
"text-label"
>
事件描述
</view>
<view
class=
"text-item"
>
<view
class=
"text-content"
>
{{
detail
.
content
}}
</view>
<view
class=
"text-label"
>
围堵措施
</view>
</view>
<view
class=
"text-content"
>
{{
detail
.
measures
}}
</view>
<view
class=
"text-item"
>
</view>
<view
class=
"text-label"
>
围堵措施
</view>
<view
class=
"text-item"
>
<view
class=
"text-content"
>
{{
detail
.
containmentMeasure
}}
</view>
<view
class=
"text-label"
>
原因分析
</view>
</view>
<view
class=
"text-content"
>
{{
detail
.
analysis
}}
</view>
<view
class=
"text-item"
>
</view>
<view
class=
"text-label"
>
原因分析
</view>
<view
class=
"text-item"
>
<view
class=
"text-content"
>
{{
detail
.
reason
}}
</view>
<view
class=
"text-label"
>
改善措施
</view>
</view>
<view
class=
"text-content"
>
{{
detail
.
improvement
}}
</view>
<view
class=
"text-item"
>
</view>
<view
class=
"text-label"
>
改善措施
</view>
<view
class=
"text-item"
>
<view
class=
"text-content"
>
{{
detail
.
advice
}}
</view>
<view
class=
"text-label"
>
备注
</view>
</view>
<view
class=
"text-content"
>
{{
detail
.
remarks
}}
</view>
<view
class=
"text-item"
>
</view>
<view
class=
"text-label"
>
备注
</view>
</view>
<view
class=
"text-content"
>
{{
detail
.
remarks
}}
</view>
</view>
</view>
</view>
<!-- 附件信息卡片 -->
</view>
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
附件信息
</view>
<!-- 附件信息卡片 -->
<view
class=
"attachment-area"
>
<view
class=
"detail-card"
>
<!-- 图片展示 -->
<view
class=
"card-title"
>
附件信息
</view>
<view
class=
"images-list"
v-if=
"detail.images && detail.images.length"
>
<view
class=
"attachment-area"
>
<view
class=
"image-item"
v-for=
"(img, index) in detail.images"
:key=
"index"
>
<!-- 图片展示 -->
<image
:src=
"img"
mode=
"aspectFill"
@
click=
"previewImage(img)"
></image>
<view
class=
"images-list"
v-if=
"images && images.length"
>
</view>
<view
class=
"image-item"
v-for=
"(img, index) in images"
:key=
"index"
>
</view>
<image
:src=
"img"
@
click=
"onPreviewImage(index, img)"
></image>
<!-- 附件列表 -->
</view>
<view
class=
"files-list"
v-if=
"detail.files && detail.files.length"
>
</view>
<view
class=
"file-item"
v-for=
"(file, index) in detail.files"
:key=
"index"
>
<!-- 附件列表 -->
<text
class=
"iconfont icon-file"
></text>
<view
class=
"files-list"
v-if=
"detail.files && detail.files.length"
>
<text
class=
"file-name"
>
{{
file
.
name
}}
</text>
<view
class=
"file-item"
v-for=
"(file, index) in detail.files"
:key=
"index"
>
</view>
<text
class=
"iconfont icon-file"
></text>
</view>
<text
class=
"file-name"
>
{{
file
}}
</text>
</view>
</view>
</view>
</view>
</view>
<!-- 审批状态 -->
</view>
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
审批状态
</view>
<!-- 审批状态 -->
<view
class=
"approval-status"
>
<view
class=
"detail-card"
>
<text
class=
"status-tag"
:class=
"getStatusClass(detail.approvalStatus)"
>
<view
class=
"card-title"
>
审批状态
</view>
{{
detail
.
approvalStatus
}}
<view
class=
"approval-status"
>
</text>
<text
class=
"status-tag"
:class=
"getStatusClass(detail.approvalStatus)"
>
</view>
{{
detail
.
approvalStatus
}}
</view>
</text>
</view>
</view>
</view>
</scroll-view>
</view>
</
template
>
</
template
>
<
script
>
<
script
>
export
default
{
import
{
data
()
{
searchOrderEventDetail
,
return
{
downloadImg
detail
:
{
}
from
'../../../api/apiList'
abnormalId
:
'AB202403200001'
,
export
default
{
orderId
:
'TR202403200001'
,
data
()
{
customer
:
'某某物流有限公司'
,
return
{
startLocation
:
'上海市浦东新区'
,
detail
:
{},
endLocation
:
'北京市朝阳区'
,
images
:
[],
occurTime
:
'2024-03-20 09:30'
,
files
:
[]
abnormalType
:
'运输异常'
,
}
secondaryAbnormal
:
'货物损坏'
,
},
amount
:
'5000.00'
,
onLoad
(
options
)
{
responsible
:
'承运方'
,
// 获取列表页传递的id
isKPI
:
true
,
const
id
=
options
.
id
processStatus
:
'处理中'
,
// 根据id获取详情数据
description
:
'货物在运输过程中发生损坏,预计损失金额5000元。'
,
this
.
getDetail
(
id
)
measures
:
'已第一时间联系客户,并安排人员前往现场处理。'
,
},
analysis
:
'装卸过程操作不当,导致货物受损。'
,
methods
:
{
improvement
:
'加强装卸人员培训,完善操作规程。'
,
getDetail
(
id
)
{
remarks
:
'已与客户达成初步赔偿方案。'
,
const
data
=
{
images
:
[
aux
:
{
'https://example.com/image1.jpg'
,
orderEventId
:
id
'https://example.com/image2.jpg'
}
],
}
files
:
[
searchOrderEventDetail
(
data
).
then
(
res
=>
{
{
name
:
'现场照片.zip'
,
url
:
'https://example.com/file1.zip'
},
const
data
=
res
.
data
.
data
;
{
name
:
'处理报告.pdf'
,
url
:
'https://example.com/file2.pdf'
}
this
.
detail
=
data
;
],
this
.
files
=
data
.
files
;
approvalStatus
:
'审批中'
this
.
downloadImgs
(
data
.
images
);
}
}
})
},
},
onLoad
(
options
)
{
getStatusClass
(
status
)
{
// 获取列表页传递的id
const
classMap
=
{
const
id
=
options
.
id
'未审批'
:
'status-pending'
,
// 根据id获取详情数据
'待审批'
:
'status-processing'
,
this
.
getDetail
(
id
)
'审批完成'
:
'status-completed'
},
}
methods
:
{
return
classMap
[
status
]
||
''
getDetail
(
id
)
{
},
// TODO: 调用接口获取详情数据
getProcessClass
(
status
)
{
console
.
log
(
'获取详情数据'
,
id
)
const
classMap
=
{
},
'待处理'
:
'process-pending'
,
getStatusClass
(
status
)
{
'处理中'
:
'process-ongoing'
,
const
classMap
=
{
'已处理'
:
'process-completed'
'未审批'
:
'status-pending'
,
}
'审批中'
:
'status-processing'
,
return
classMap
[
status
]
||
''
'审批完成'
:
'status-completed'
},
}
onPreviewImage
(
index
,
images
)
{
return
classMap
[
status
]
||
''
console
.
log
(
"预览图片"
+
images
)
},
uni
.
previewImage
({
getProcessClass
(
status
)
{
current
:
index
,
const
classMap
=
{
urls
:
images
'待处理'
:
'process-pending'
,
})
'处理中'
:
'process-ongoing'
,
},
'已处理'
:
'process-completed'
copyText
(
text
)
{
}
uni
.
setClipboardData
({
return
classMap
[
status
]
||
''
data
:
text
,
},
success
:
()
=>
{
previewImage
(
url
)
{
uni
.
showToast
({
uni
.
previewImage
({
title
:
'已复制'
,
urls
:
this
.
detail
.
images
,
icon
:
'none'
current
:
url
})
})
}
},
})
copyText
(
text
)
{
},
uni
.
setClipboardData
({
downloadImgs
(
paths
)
{
data
:
text
,
console
.
log
(
"图片下载"
+
paths
)
success
:
()
=>
{
return
new
Promise
((
reslove
,
reject
)
=>
{
uni
.
showToast
({
if
(
paths
)
{
title
:
'已复制'
,
const
imgPaths
=
paths
.
split
(
'|'
)
icon
:
'none'
imgPaths
.
map
((
path
,
index
)
=>
{
})
downloadImg
(
path
).
then
(
res
=>
{
}
this
.
images
=
this
.
images
.
concat
(
res
)
})
})
}
})
}
}
else
{
}
reject
()
}
})
},
}
}
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
.abnormal-detail
{
.abnormal-detail
{
padding
:
15px
;
padding
:
15px
;
background
:
#f5f7fa
;
background
:
#f5f7fa
;
min-height
:
100vh
;
min-height
:
100vh
;
.detail-card
{
.detail-card
{
background
:
#fff
;
background
:
#fff
;
border-radius
:
8px
;
border-radius
:
8px
;
padding
:
0
;
padding
:
0
;
margin-bottom
:
15px
;
margin-bottom
:
15px
;
box-shadow
:
0
2px
12px
rgba
(
0
,
0
,
0
,
0
.05
);
box-shadow
:
0
2px
12px
rgba
(
0
,
0
,
0
,
0
.05
);
.card-title
{
.card-title
{
font-size
:
16px
;
font-size
:
16px
;
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#333
;
color
:
#333
;
margin
:
0
;
margin
:
0
;
position
:
relative
;
position
:
relative
;
padding
:
15px
20px
;
padding
:
15px
20px
;
border-bottom
:
1px
solid
#f0f0f0
;
border-bottom
:
1px
solid
#f0f0f0
;
background
:
#f0f7ff
;
background
:
#f0f7ff
;
border-radius
:
8px
8px
0
0
;
border-radius
:
8px
8px
0
0
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
&
:before
{
&
:before
{
content
:
''
;
content
:
''
;
display
:
inline-block
;
display
:
inline-block
;
left
:
0
;
left
:
0
;
width
:
4px
;
width
:
4px
;
height
:
16px
;
height
:
16px
;
background
:
#2E75E6
;
background
:
#2E75E6
;
border-radius
:
2px
;
border-radius
:
2px
;
margin-right
:
8px
;
margin-right
:
8px
;
}
}
}
}
.info-grid
{
.info-grid
{
padding
:
20px
;
padding
:
20px
;
.header-row
{
.header-row
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
align-items
:
center
;
align-items
:
center
;
margin-bottom
:
20px
;
margin-bottom
:
20px
;
padding-bottom
:
15px
;
padding-bottom
:
15px
;
border-bottom
:
1px
solid
#f0f0f0
;
border-bottom
:
1px
solid
#f0f0f0
;
.abnormal-id
{
.abnormal-id
{
font-size
:
18px
;
font-size
:
18px
;
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#2E75E6
;
color
:
#2E75E6
;
}
}
.time
{
.time
{
font-size
:
14px
;
font-size
:
14px
;
color
:
#666
;
color
:
#666
;
}
}
}
}
.full-width-item
{
.full-width-item
{
display
:
flex
;
display
:
flex
;
margin-bottom
:
15px
;
margin-bottom
:
15px
;
&
:last-child
{
&
:last-child
{
margin-bottom
:
0
;
margin-bottom
:
0
;
}
}
.label
{
.label
{
width
:
100px
;
width
:
100px
;
font-size
:
14px
;
font-size
:
14px
;
color
:
#666
;
color
:
#666
;
flex-shrink
:
0
;
flex-shrink
:
0
;
}
}
.value
{
.value
{
flex
:
1
;
flex
:
1
;
font-size
:
14px
;
font-size
:
14px
;
color
:
#333
;
color
:
#333
;
word-break
:
break-all
;
word-break
:
break-all
;
}
}
}
}
.abnormal-info
{
.abnormal-info
{
.info-row
{
.info-row
{
display
:
flex
;
display
:
flex
;
margin-bottom
:
20px
;
margin-bottom
:
20px
;
&
:last-child
{
&
:last-child
{
margin-bottom
:
0
;
margin-bottom
:
0
;
}
}
.info-col
{
.info-col
{
flex
:
1
;
flex
:
1
;
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
&
:first-child
{
&
:first-child
{
margin-right
:
20px
;
margin-right
:
20px
;
}
}
.label
{
.label
{
font-size
:
14px
;
font-size
:
14px
;
color
:
#666
;
color
:
#666
;
margin-bottom
:
8px
;
margin-bottom
:
8px
;
cursor
:
pointer
;
cursor
:
pointer
;
&
:hover
{
&
:hover
{
color
:
#2E75E6
;
color
:
#2E75E6
;
}
}
}
}
.value
{
.value
{
font-size
:
14px
;
font-size
:
14px
;
color
:
#333
;
color
:
#333
;
cursor
:
pointer
;
cursor
:
pointer
;
padding
:
8px
12px
;
padding
:
8px
12px
;
background
:
#f9f9f9
;
background
:
#f9f9f9
;
border-radius
:
4px
;
border-radius
:
4px
;
transition
:
all
0
.3s
;
transition
:
all
0
.3s
;
&
:hover
{
&
:hover
{
background
:
#f0f7ff
;
background
:
#f0f7ff
;
}
}
&
.amount
{
&
.amount
{
color
:
#ff4d4f
;
color
:
#ff4d4f
;
font-weight
:
500
;
font-weight
:
500
;
font-size
:
16px
;
font-size
:
16px
;
}
}
&
.process-pending
{
&
.process-pending
{
color
:
#faad14
;
color
:
#faad14
;
}
}
&
.process-ongoing
{
&
.process-ongoing
{
color
:
#2E75E6
;
color
:
#2E75E6
;
}
}
&
.process-completed
{
&
.process-completed
{
color
:
#52c41a
;
color
:
#52c41a
;
}
}
}
}
}
}
}
}
}
}
}
}
.text-area
{
.text-area
{
padding
:
20px
;
padding
:
20px
;
.text-item
{
margin-bottom
:
20px
;
.text-item
{
margin-bottom
:
20px
;
.text-label
{
font-size
:
14px
;
.text-label
{
color
:
#333
;
font-size
:
14px
;
font-weight
:
500
;
color
:
#333
;
margin-bottom
:
8px
;
font-weight
:
500
;
display
:
flex
;
margin-bottom
:
8px
;
align-items
:
center
;
display
:
flex
;
align-items
:
center
;
&
:before
{
content
:
''
;
&
:before
{
width
:
6px
;
content
:
''
;
height
:
6px
;
width
:
6px
;
background
:
#2E75E6
;
height
:
6px
;
border-radius
:
50%
;
background
:
#2E75E6
;
margin-right
:
8px
;
border-radius
:
50%
;
opacity
:
0
.7
;
margin-right
:
8px
;
}
opacity
:
0
.7
;
}
}
}
.text-content
{
font-size
:
14px
;
.text-content
{
color
:
#333
;
font-size
:
14px
;
line-height
:
1
.6
;
color
:
#333
;
padding
:
15px
;
line-height
:
1
.6
;
background
:
#f9f9f9
;
padding
:
15px
;
border-radius
:
4px
;
background
:
#f9f9f9
;
border
:
1px
solid
#f0f0f0
;
border-radius
:
4px
;
min-height
:
80px
;
border
:
1px
solid
#f0f0f0
;
}
min-height
:
80px
;
}
}
}
}
}
.attachment-area
{
padding
:
20px
;
.attachment-area
{
padding
:
20px
;
.section-title
{
font-size
:
14px
;
.section-title
{
color
:
#333
;
font-size
:
14px
;
font-weight
:
500
;
color
:
#333
;
margin-bottom
:
12px
;
font-weight
:
500
;
}
margin-bottom
:
12px
;
}
.images-list
{
display
:
grid
;
.images-list
{
grid-template-columns
:
repeat
(
3
,
1fr
);
display
:
grid
;
gap
:
10px
;
grid-template-columns
:
repeat
(
3
,
1fr
);
margin-bottom
:
15px
;
gap
:
10px
;
margin-bottom
:
15px
;
.image-item
{
aspect-ratio
:
1
;
.image-item
{
border-radius
:
4px
;
aspect-ratio
:
1
;
overflow
:
hidden
;
border-radius
:
4px
;
border
:
1px
solid
#f0f0f0
;
overflow
:
hidden
;
border
:
1px
solid
#f0f0f0
;
image
{
width
:
100%
;
image
{
height
:
100%
;
width
:
100%
;
}
height
:
100%
;
}
}
}
}
}
.files-list
{
.file-item
{
.files-list
{
display
:
flex
;
.file-item
{
align-items
:
center
;
display
:
flex
;
padding
:
10px
;
align-items
:
center
;
background
:
#fafafa
;
padding
:
10px
;
border-radius
:
4px
;
background
:
#fafafa
;
margin-bottom
:
10px
;
border-radius
:
4px
;
transition
:
all
0
.3s
;
margin-bottom
:
10px
;
transition
:
all
0
.3s
;
&
:hover
{
background
:
#f0f7ff
;
&
:hover
{
}
background
:
#f0f7ff
;
}
.icon-file
{
font-size
:
20px
;
.icon-file
{
color
:
#2E75E6
;
font-size
:
20px
;
margin-right
:
8px
;
color
:
#2E75E6
;
}
margin-right
:
8px
;
}
}
}
}
}
}
}
.approval-status
{
padding
:
20px
;
.approval-status
{
.status-tag
{
padding
:
20px
;
display
:
inline-block
;
padding
:
6px
16px
;
.status-tag
{
border-radius
:
4px
;
display
:
inline-block
;
font-size
:
14px
;
padding
:
6px
16px
;
font-weight
:
500
;
border-radius
:
4px
;
}
font-size
:
14px
;
}
font-weight
:
500
;
}
}
}
}
</
style
>
}
}
</
style
>
\ No newline at end of file
pages/abnormal/list/index.vue
View file @
e13da015
...
@@ -5,18 +5,22 @@
...
@@ -5,18 +5,22 @@
<view
class=
"stat-item"
@
click=
"selectReport('new')"
>
<view
class=
"stat-item"
@
click=
"selectReport('new')"
>
<text
class=
"number"
style=
"color: #faad14;"
>
{{
searchDatas
.
new
}}
</text>
<text
class=
"number"
style=
"color: #faad14;"
>
{{
searchDatas
.
new
}}
</text>
<text
class=
"label"
>
未审批
</text>
<text
class=
"label"
>
未审批
</text>
<text
class=
"number2"
style=
"color: #faad14;"
>
¥
{{
searchDatas
.
newAmount
}}
</text>
</view>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('approving')"
>
<view
class=
"stat-item"
@
click=
"selectReport('approving')"
>
<text
class=
"number"
style=
"color: #1890ff;"
>
{{
searchDatas
.
approving
}}
</text>
<text
class=
"number"
style=
"color: #1890ff;"
>
{{
searchDatas
.
approving
}}
</text>
<text
class=
"label"
>
审批中
</text>
<text
class=
"label"
>
审批中
</text>
<text
class=
"number2"
style=
"color: #1890ff;"
>
¥
{{
searchDatas
.
approvingAmount
}}
</text>
</view>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('approved')"
>
<view
class=
"stat-item"
@
click=
"selectReport('approved')"
>
<text
class=
"number"
style=
"color:#52c41a;"
>
{{
searchDatas
.
approved
}}
</text>
<text
class=
"number"
style=
"color:#52c41a;"
>
{{
searchDatas
.
approved
}}
</text>
<text
class=
"label"
>
审批完成
</text>
<text
class=
"label"
>
审批完成
</text>
<text
class=
"number2"
style=
"color:#52c41a;"
>
¥
{{
searchDatas
.
approvedAmount
}}
</text>
</view>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('total')"
>
<view
class=
"stat-item"
@
click=
"selectReport('total')"
>
<text
class=
"number"
style=
"color:#ff4d4f;"
>
{{
searchDatas
.
total
}}
</text>
<text
class=
"number"
style=
"color:#ff4d4f;"
>
{{
searchDatas
.
total
}}
</text>
<text
class=
"label"
>
总计
</text>
<text
class=
"label"
>
总计
</text>
<text
class=
"number2"
style=
"color:#ff4d4f;"
>
¥
{{
searchDatas
.
totalAmount
}}
</text>
</view>
</view>
</view>
</view>
...
@@ -32,7 +36,7 @@
...
@@ -32,7 +36,7 @@
{{
order
.
approvalStatus
}}
{{
order
.
approvalStatus
}}
</text>
</text>
</view>
</view>
<text
class=
"time"
>
{{
order
.
occur
Time
}}
</text>
<text
class=
"time"
>
{{
order
.
event
Time
}}
</text>
</view>
</view>
<view
class=
"card-content"
>
<view
class=
"card-content"
>
...
@@ -70,7 +74,7 @@
...
@@ -70,7 +74,7 @@
return
{
return
{
staffCode
:
""
,
staffCode
:
""
,
staffKind
:
""
,
staffKind
:
""
,
activeStatus
:
"total"
,
activeStatus
:
"total"
,
searchDatas
:
{},
searchDatas
:
{},
orderList
:
[]
orderList
:
[]
}
}
...
@@ -79,9 +83,9 @@
...
@@ -79,9 +83,9 @@
this
.
initData
()
this
.
initData
()
},
},
methods
:
{
methods
:
{
selectReport
(
active
){
selectReport
(
active
)
{
this
.
activeStatus
=
active
this
.
activeStatus
=
active
this
.
orderList
=
[]
this
.
orderList
=
[]
this
.
initData
()
this
.
initData
()
},
},
initData
()
{
initData
()
{
...
@@ -152,9 +156,10 @@
...
@@ -152,9 +156,10 @@
.stat-item
{
.stat-item
{
text-align
:
center
;
text-align
:
center
;
padding
:
15px
24px
;
//
padding: 15px 24px;
background
:
#f9f9f9
;
background
:
#f9f9f9
;
border-radius
:
6px
;
border-radius
:
6px
;
width
:
25%
;
transition
:
background
0
.3s
,
transform
0
.3s
;
transition
:
background
0
.3s
,
transform
0
.3s
;
/* 添加过渡效果 */
/* 添加过渡效果 */
...
@@ -173,6 +178,14 @@
...
@@ -173,6 +178,14 @@
margin-bottom
:
8px
;
margin-bottom
:
8px
;
}
}
.number2
{
display
:
block
;
font-size
:
28px
;
// font-weight: bold;
color
:
#333
;
margin-bottom
:
8px
;
}
.label
{
.label
{
font-size
:
14px
;
font-size
:
14px
;
color
:
#999
;
color
:
#999
;
...
@@ -241,6 +254,7 @@
...
@@ -241,6 +254,7 @@
.time
{
.time
{
font-size
:
14px
;
font-size
:
14px
;
color
:
#999
;
color
:
#999
;
float
:
right
;
}
}
}
}
...
...
pages/index/index.vue
View file @
e13da015
...
@@ -53,12 +53,10 @@
...
@@ -53,12 +53,10 @@
},
},
onLoad
()
{
onLoad
()
{
console
.
log
(
'index页面加载'
);
// 调试日志
console
.
log
(
'index页面加载'
);
// 调试日志
this
.
uc_staff_kind
=
uni
.
getStorageSync
(
`uc_staff_kind`
);
this
.
getUserInfo
()
this
.
updateTopUserList
()
this
.
getBindCompanyResult
()
// this.getBindCompanyResult()
this
.
bindGroupChatCompany
()
// this.bindGroupChatCompany()
},
},
onShow
()
{
onShow
()
{
...
@@ -72,26 +70,23 @@
...
@@ -72,26 +70,23 @@
},
},
methods
:
{
methods
:
{
updateTopUserList
()
{
updateTopUserList
()
{
if
(
this
.
uc_staff_kind
===
'boss'
)
{
if
(
this
.
uc_staff_kind
===
'boss'
)
{
this
.
topUserList
=
[{
this
.
topUserList
=
[{
name
:
'
订单查询
'
,
name
:
'
老板看板
'
,
key
:
'
orderQuery
'
,
key
:
'
bossCard
'
,
url
:
'/pages/index/index'
url
:
'/pages/index/index'
},
},
{
{
name
:
'查看日报'
,
name
:
'查看日报'
,
key
:
'dailyReport'
,
key
:
'dailyReport'
,
url
:
'/pages/index/index'
url
:
'/pages/index/index'
},
{
name
:
'老板看板'
,
key
:
'bossCard'
,
url
:
'/pages/index/index'
},
},
];
];
}
else
{
}
else
if
(
this
.
uc_staff_kind
===
'simulatedBoss'
)
{
this
.
topUserList
=
[{
this
.
topUserList
=
[{
name
:
'
订单查询
'
,
name
:
'
老板看板
'
,
key
:
'
orderQuery
'
,
key
:
'
bossCard
'
,
url
:
'/pages/index/index'
url
:
'/pages/index/index'
},
},
{
{
...
@@ -102,12 +97,14 @@
...
@@ -102,12 +97,14 @@
name
:
'填写日报'
,
name
:
'填写日报'
,
key
:
'dailyReportCreate'
,
key
:
'dailyReportCreate'
,
url
:
'/pages/index/index'
url
:
'/pages/index/index'
},
{
name
:
'老板看板'
,
key
:
'bossCard'
,
url
:
'/pages/index/index'
},
},
];
];
}
else
{
this
.
topUserList
=
[{
name
:
'填写日报'
,
key
:
'dailyReportCreate'
,
url
:
'/pages/index/index'
},
]
}
}
},
},
...
@@ -281,4 +278,4 @@
...
@@ -281,4 +278,4 @@
padding
:
0px
12px
12px
12px
;
padding
:
0px
12px
12px
12px
;
}
}
}
}
</
style
>
</
style
>
s
\ No newline at end of file
\ No newline at end of file
pages/login/login.vue
View file @
e13da015
...
@@ -17,6 +17,18 @@
...
@@ -17,6 +17,18 @@
</u-form-item>
</u-form-item>
</
template
>
</
template
>
</u-form>
</u-form>
<!-- 复选框:是否记住密码 -->
<view
style=
"width: 690rpx; display: flex; justify-content: space-between;"
>
<view
class=
"search-input"
style=
"display: flex; align-items: center;"
>
<u-checkbox-group
placement=
"column"
@
change=
"onChanges"
>
<u-checkbox
:checked=
"isChecked"
iconSize=
"30rpx"
shape=
"square"
size=
"20spx"
/>
</u-checkbox-group>
<text
style=
"color: black;font-size: 18px;"
>
记住密码
</text>
</view>
</view>
<!-- 登录按钮 -->
<!-- 登录按钮 -->
<button
class=
"loginBtn font_bolder"
@
click=
"submitForm"
>
登录
</button>
<button
class=
"loginBtn font_bolder"
@
click=
"submitForm"
>
登录
</button>
</view>
</view>
...
@@ -24,287 +36,392 @@
...
@@ -24,287 +36,392 @@
</template>
</template>
<
script
>
<
script
>
import
{
TokenPrefix
,
MINI
}
from
'../../publicConfig/config.js'
import
{
import
{
userLogin
,
SendMessage
}
from
'../../api/apiList.js'
const
loginBehavior
=
require
(
'../../mixins/loginBehavior.js'
)
TokenPrefix
,
MINI
export
default
{
}
from
'../../publicConfig/config.js'
mixins
:
[
loginBehavior
],
import
{
data
()
{
userMobileOperation
,
return
{
selectStaffByUsername
,
loginBg
:
''
,
//登录页面背景图
userLogin
,
formData
:
{
SendMessage
userName
:
''
,
//用户名
}
from
'../../api/apiList.js'
password
:
''
,
//密码
const
loginBehavior
=
require
(
'../../mixins/loginBehavior.js'
)
phone
:
''
,
//电话号码
authCode
:
''
//验证码
export
default
{
},
mixins
:
[
loginBehavior
],
isVerifLogin
:
false
,
//是否为验证码登录
data
()
{
tips
:
'获取验证码'
,
return
{
disabled
:
false
,
//是否禁用获取验证码
loginBg
:
''
,
//登录页面背景图
}
formData
:
{
},
userName
:
''
,
//用户名
onLoad
()
{
password
:
''
,
//密码
this
.
loginBg
=
'static/img/bg/loginBg.png'
phone
:
''
,
//电话号码
authCode
:
''
//验证码
this
.
projectMini
=
getApp
().
globalData
.
projectMini
},
},
isVerifLogin
:
false
,
//是否为验证码登录
methods
:
{
tips
:
'获取验证码'
,
disabled
:
false
,
//是否禁用获取验证码
//手机验证码登录
rememberMe
:
false
,
// 复选框的状态
chooseVerifLogin
()
{
isChecked
:
false
,
this
.
isVerifLogin
=
!
this
.
isVerifLogin
username
:
""
}
},
},
onLoad
()
{
this
.
loginBg
=
'static/img/bg/loginBg.png'
onShowTost
(
tostText
,
time
=
1000
)
{
this
.
projectMini
=
getApp
().
globalData
.
projectMini
uni
.
showToast
({
this
.
rememberPd
()
title
:
tostText
,
icon
:
'none'
,
duration
:
time
})
},
},
methods
:
{
rememberPd
()
{
let
_this
=
this
// 赋值操作
var
isCheckedS
=
wx
.
getStorageSync
(
'isChecked'
);
//通过缓存获取密码
console
.
log
(
"rememberPd ischeck"
+
isCheckedS
)
if
(
isCheckedS
)
{
//如果记住账号密码为true,则赋值
this
.
formData
.
userName
=
wx
.
getStorageSync
(
'username2'
)
console
.
log
(
"rememberPd username2"
+
wx
.
getStorageSync
(
'username2'
))
this
.
formData
.
password
=
wx
.
getStorageSync
(
'password'
)
_this
.
isChecked
=
isCheckedS
}
else
{
//用户没有勾选“记住密码”
// 清除缓存,并将输入框置为空
wx
.
setStorageSync
(
'username2'
,
''
);
wx
.
setStorageSync
(
'password'
,
''
);
wx
.
setStorageSync
(
'isChecked'
,
false
);
this
.
formData
.
userName
=
""
;
this
.
formData
.
password
=
""
;
this
.
isChecked
=
false
;
}
},
onChanges
()
{
this
.
isChecked
=
!
this
.
isChecked
;
wx
.
setStorageSync
(
'isChecked'
,
this
.
isChecked
)
},
//表单提交前规则校验
//手机验证码登录
onSubmitBeforeRule
(
userName
,
password
,
phone
,
authCode
)
{
chooseVerifLogin
()
{
let
ruleFlag
=
true
this
.
isVerifLogin
=
!
this
.
isVerifLogin
let
tostText
=
''
},
//用户协议授权校验
//表单字段校验
onShowTost
(
tostText
,
time
=
1000
)
{
if
(
this
.
isVerifLogin
)
{
uni
.
showToast
({
if
(
!
phone
&&
!
authCode
)
{
title
:
tostText
,
tostText
=
'请输入手机号及验证码'
icon
:
'none'
,
}
else
if
(
!
phone
)
{
duration
:
time
tostText
=
'请输入手机号'
})
}
else
if
(
!
authCode
)
{
},
tostText
=
'请输入验证码'
}
else
if
(
phone
&&
!
uni
.
$u
.
test
.
mobile
(
phone
))
{
//表单提交前规则校验
tostText
=
'请输入有效手机号码'
onSubmitBeforeRule
(
userName
,
password
,
phone
,
authCode
)
{
}
else
if
(
authCode
&&
!
uni
.
$u
.
test
.
code
(
authCode
,
6
))
{
let
ruleFlag
=
true
tostText
=
'请输入6位有效验证码'
let
tostText
=
''
//用户协议授权校验
//表单字段校验
if
(
this
.
isVerifLogin
)
{
if
(
!
phone
&&
!
authCode
)
{
tostText
=
'请输入手机号及验证码'
}
else
if
(
!
phone
)
{
tostText
=
'请输入手机号'
}
else
if
(
!
authCode
)
{
tostText
=
'请输入验证码'
}
else
if
(
phone
&&
!
uni
.
$u
.
test
.
mobile
(
phone
))
{
tostText
=
'请输入有效手机号码'
}
else
if
(
authCode
&&
!
uni
.
$u
.
test
.
code
(
authCode
,
6
))
{
tostText
=
'请输入6位有效验证码'
}
}
else
{
if
(
!
userName
&&
!
password
)
{
tostText
=
'请输入用户名及密码'
}
else
if
(
!
userName
)
{
tostText
=
'请输入用户名'
}
else
if
(
!
password
)
{
tostText
=
'请输入密码'
}
}
}
}
else
{
if
(
tostText
)
{
if
(
!
userName
&&
!
password
)
{
ruleFlag
=
false
tostText
=
'请输入用户名及密码'
this
.
onShowTost
(
tostText
)
}
else
if
(
!
userName
)
{
tostText
=
'请输入用户名'
}
else
if
(
!
password
)
{
tostText
=
'请输入密码'
}
}
}
return
ruleFlag
if
(
tostText
)
{
},
ruleFlag
=
false
this
.
onShowTost
(
tostText
)
}
return
ruleFlag
},
//确认提交
submitForm
()
{
const
{
userName
,
password
,
phone
,
authCode
}
=
this
.
formData
if
(
!
this
.
onSubmitBeforeRule
(
userName
,
password
,
phone
,
authCode
))
return
//规则校验
let
{
projectMini
}
=
getApp
().
globalData
let
loginAction
=
'loginByUserInfo'
let
reqData
=
{
entryName
:
projectMini
}
if
(
this
.
isVerifLogin
)
{
reqData
=
{
...
reqData
,
params
:
{
phone
,
authCode
}
}
loginAction
=
'loginByCustomAuth'
}
else
{
reqData
=
{
...
reqData
,
userName
,
password
}
}
this
.
h5Login
(
reqData
,
loginAction
)
},
//确认提交
submitForm
()
{
const
{
userName
,
password
,
phone
,
authCode
}
=
this
.
formData
if
(
!
this
.
onSubmitBeforeRule
(
userName
,
password
,
phone
,
authCode
))
return
//规则校验
let
{
projectMini
}
=
getApp
().
globalData
let
loginAction
=
'loginByUserInfo'
let
reqData
=
{
entryName
:
projectMini
}
if
(
this
.
isVerifLogin
)
{
reqData
=
{
...
reqData
,
params
:
{
phone
,
authCode
}
}
loginAction
=
'loginByCustomAuth'
}
else
{
reqData
=
{
...
reqData
,
userName
,
password
}
}
console
.
log
(
"isChecked"
+
this
.
isChecked
)
if
(
this
.
isChecked
)
{
// 记住密码的逻辑
console
.
log
(
"isChecked"
+
this
.
formData
.
userName
)
uni
.
setStorageSync
(
'username2'
,
this
.
formData
.
userName
);
uni
.
setStorageSync
(
'password'
,
this
.
formData
.
password
);
}
else
{
// 清除存储的密码
uni
.
removeStorageSync
(
'password'
);
}
this
.
h5Login
(
reqData
,
loginAction
)
},
//H5提交
h5Login
(
reqData
,
loginAction
)
{
const
_this
=
this
let
newCode
=
''
//H5提交
const
{
code
}
=
_this
.
getH5Code
()
h5Login
(
reqData
,
loginAction
)
{
newCode
=
code
// uni.setStorageSync(`staffCode`,"");
userLogin
(
loginAction
,
newCode
,
reqData
).
then
(
res
=>
{
uni
.
setStorageSync
(
`uc_staff_kind`
,
""
);
let
token
=
res
.
data
.
renewedToken
const
_this
=
this
let
XSRFToken
=
_this
.
getCookies
(
'XSRF-TOKEN'
)
uni
.
setStorageSync
(
`
${
TokenPrefix
}
_token`
,
token
);
let
newCode
=
''
uni
.
setStorageSync
(
`
${
TokenPrefix
}
_XSRFToken`
,
XSRFToken
);
const
{
uni
.
showToast
({
code
title
:
'登录成功!'
,
}
=
_this
.
getH5Code
()
duration
:
1000
newCode
=
code
userLogin
(
loginAction
,
newCode
,
reqData
).
then
(
res
=>
{
let
token
=
res
.
data
.
renewedToken
let
XSRFToken
=
_this
.
getCookies
(
'XSRF-TOKEN'
)
uni
.
setStorageSync
(
`
${
TokenPrefix
}
_token`
,
token
);
uni
.
setStorageSync
(
`
${
TokenPrefix
}
_XSRFToken`
,
XSRFToken
);
uni
.
showToast
({
title
:
'登录成功!'
,
duration
:
1000
})
userMobileOperation
(
'getUserInfo'
).
then
(
res
=>
{
let
data
=
res
.
data
.
data
data
.
mobile
=
data
.
userExt
.
mobile
||
'暂无'
this
.
username
=
data
.
username
uni
.
setStorageSync
(
`username`
,
data
.
username
);
uni
.
setStorageSync
(
`commonName`
,
res
.
data
.
data
.
commonName
);
const
staffData
=
{
"aux"
:
{
"username"
:
this
.
username
}
}
selectStaffByUsername
(
staffData
).
then
(
res
=>
{
let
data2
=
res
.
data
.
data
uni
.
setStorageSync
(
`staffCode`
,
data2
.
staffCode
);
uni
.
setStorageSync
(
`uc_staff_kind`
,
data2
.
uc_staff_kind
);
uni
.
redirectTo
({
url
:
"/pages/index/index"
,
})
_this
.
initWeCom
()
})
})
}).
catch
(
err
=>
{
uni
.
showToast
({
title
:
err
.
message
||
err
,
icon
:
'none'
,
duration
:
3000
})
})
})
uni
.
redirectTo
({
},
url
:
"/pages/index/index"
,
getUserInfo
()
{
})
_this
.
initWeCom
()
}).
catch
(
err
=>
{
},
uni
.
showToast
({
title
:
err
.
message
||
err
,
icon
:
'none'
,
duration
:
3000
})
})
},
//提示文本
//提示文本
onTipsChange
(
text
)
{
onTipsChange
(
text
)
{
this
.
tips
=
text
;
this
.
tips
=
text
;
},
},
}
}
}
}
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
.content_box
{
.content_box
{
color
:
#FFFFFF
;
color
:
#FFFFFF
;
letter-spacing
:
6rpx
;
letter-spacing
:
6rpx
;
background-size
:
100%
;
background-size
:
100%
;
background-repeat
:
no-repeat
;
background-repeat
:
no-repeat
;
padding
:
0
32rpx
;
padding
:
0
32rpx
;
justify-content
:
space-between
;
justify-content
:
space-between
;
.primary-description
{
.primary-description
{
font-size
:
28rpx
;
font-size
:
28rpx
;
font-weight
:
400
;
font-weight
:
400
;
line-height
:
40rpx
;
line-height
:
40rpx
;
.container-title
{
.container-title
{
font-size
:
60rpx
;
font-size
:
60rpx
;
font-weight
:
500
;
font-weight
:
500
;
line-height
:
84rpx
;
line-height
:
84rpx
;
margin
:
158rpx
0
85rpx
;
margin
:
158rpx
0
85rpx
;
}
}
}
}
.user-info
{
.user-info
{
width
:
100%
;
/* #ifdef MP */
margin-top
:
400rpx
;
/* #endif */
/* #ifdef H5 || APP-PLUS*/
margin-top
:
320rpx
;
/* #endif */
flex-wrap
:
wrap
;
.loginBtn
{
width
:
100%
;
width
:
100%
;
height
:
96rpx
;
line-height
:
96rpx
;
/* #ifdef MP */
/* #ifdef MP */
margin-top
:
212
rpx
;
margin-top
:
400
rpx
;
/* #endif */
/* #endif */
/* #ifdef H5 || APP-PLUS*/
/* #ifdef H5 || APP-PLUS*/
margin-top
:
16
0rpx
;
margin-top
:
32
0rpx
;
/* #endif */
/* #endif */
color
:
#FFFFFF
;
flex-wrap
:
wrap
;
font-size
:
32rpx
;
font-weight
:
bolder
;
.loginBtn
{
border-radius
:
48rpx
;
width
:
100%
;
background
:
linear-gradient
(
90deg
,
#2E75E6
0%
,
#5E58EE
100%
);
height
:
96rpx
;
border
:
none
!
important
;
line-height
:
96rpx
;
/* #ifdef MP */
&
:after
{
margin-top
:
212rpx
;
border
:
none
;
/* #endif */
/* #ifdef H5 || APP-PLUS*/
margin-top
:
160rpx
;
/* #endif */
color
:
#FFFFFF
;
font-size
:
32rpx
;
font-weight
:
bolder
;
border-radius
:
48rpx
;
background
:
linear-gradient
(
90deg
,
#2E75E6
0%
,
#5E58EE
100%
);
border
:
none
!
important
;
&
:after
{
border
:
none
;
}
}
.login-actionBtn
{
width
:
100%
;
text-align
:
center
;
text-decoration
:
underline
;
color
:
#2e75e6
;
margin-top
:
40rpx
;
}
/
deep
/
.u-form
{
width
:
100%
;
.u-form-item__body
{
width
:
100%
;
padding
:
6rpx
40rpx
!
important
;
border-radius
:
48rpx
;
margin-bottom
:
64rpx
;
background
:
rgba
(
225
,
225
,
225
,
.2
);
.u-input
{
padding
:
16rpx
24rpx
!
important
;
border
:
none
;
.u-input__content__field-wrapper__field
{
letter-spacing
:
2rpx
!
important
;
}
}
.input-placeholder
{
font-size
:
32rpx
;
}
}
}
}
}
}
.login-actionBtn
{
.remember-me
{
width
:
100%
;
margin-bottom
:
20px
;
// 添加底部间距
text-align
:
center
;
display
:
flex
;
// 使用 flex 布局
text-decoration
:
underline
;
align-items
:
center
;
// 垂直居中
color
:
#2e75e6
;
margin-top
:
40rpx
;
}
}
/
deep
/
.u-form
{
.remember-checkbox
{
width
:
100%
;
color
:
black
;
// 设置复选框字体颜色为黑色
font-size
:
14px
;
// 设置字体大小
z-index
:
999
;
}
.u-form-item__body
{
// .user-agreement {
width
:
100%
;
// margin-bottom: 95rpx;
padding
:
6rpx
40rpx
!
important
;
// color: #9FC6F4;
// line-height: 37rpx;
// font-size: 26rpx;
// letter-spacing: 2rpx;
// .user-agreement-choice {
// height: 37rpx;
// width: 37rpx;
// border: 3rpx solid #8c8c8c;
// border-radius: 50%;
// margin-right: 12rpx;
// .user-agreement-choice-dui {
// width: 15rpx;
// height: 30rpx;
// border-color: #FFFFFF;
// border-style: solid;
// border-width: 0 6rpx 6rpx 0;
// transform: rotate(45deg);
// }
// }
// .special-text {
// color: #FFFFFF;
// }
// }
.loginH5
{
/
deep
/
.u-form-item__body
{
padding
:
6rpx
40rpx
;
border-radius
:
48rpx
;
border-radius
:
48rpx
;
margin-bottom
:
64
rpx
;
margin-bottom
:
40
rpx
;
background
:
rgba
(
225
,
225
,
225
,
.2
);
background
:
rgba
(
225
,
225
,
225
,
.2
);
.u-input
{
.u-input
{
padding
:
16rpx
24rpx
!
important
;
padding
:
16rpx
!
important
;
border
:
none
;
border
:
none
;
.u-input__content__field-wrapper__field
{
letter-spacing
:
2rpx
!
important
;
}
}
}
.input-placeholder
{
.input-placeholder
{
font-size
:
32rpx
;
font-size
:
32rpx
;
}
}
}
}
}
}
// .user-agreement {
// margin-bottom: 95rpx;
// color: #9FC6F4;
// line-height: 37rpx;
// font-size: 26rpx;
// letter-spacing: 2rpx;
// .user-agreement-choice {
// height: 37rpx;
// width: 37rpx;
// border: 3rpx solid #8c8c8c;
// border-radius: 50%;
// margin-right: 12rpx;
// .user-agreement-choice-dui {
// width: 15rpx;
// height: 30rpx;
// border-color: #FFFFFF;
// border-style: solid;
// border-width: 0 6rpx 6rpx 0;
// transform: rotate(45deg);
// }
// }
// .special-text {
// color: #FFFFFF;
// }
// }
.loginH5
{
/
deep
/
.u-form-item__body
{
padding
:
6rpx
40rpx
;
border-radius
:
48rpx
;
margin-bottom
:
40rpx
;
background
:
rgba
(
225
,
225
,
225
,
.2
);
.u-input
{
padding
:
16rpx
!
important
;
border
:
none
;
}
.input-placeholder
{
.h5-loginBtn
{
width
:
100%
;
height
:
96rpx
;
line-height
:
96rpx
;
margin-top
:
112rpx
;
color
:
#FFFFFF
;
font-size
:
32rpx
;
font-size
:
32rpx
;
font-weight
:
bolder
;
border-radius
:
48rpx
;
background
:
linear-gradient
(
90deg
,
#2E75E6
0%
,
#5E58EE
100%
);
}
}
}
}
.h5-loginBtn
{
width
:
100%
;
height
:
96rpx
;
line-height
:
96rpx
;
margin-top
:
112rpx
;
color
:
#FFFFFF
;
font-size
:
32rpx
;
font-weight
:
bolder
;
border-radius
:
48rpx
;
background
:
linear-gradient
(
90deg
,
#2E75E6
0%
,
#5E58EE
100%
);
}
}
}
}
</
style
>
</
style
>
\ No newline at end of file
publicConfig/config.js
View file @
e13da015
...
@@ -10,7 +10,7 @@ let BASEURL = {
...
@@ -10,7 +10,7 @@ let BASEURL = {
// url: 'http://192.168.0.230:8080' // xiaohan
// url: 'http://192.168.0.230:8080' // xiaohan
// url: "https://botms-demo.logwirecloud.com",
// url: "https://botms-demo.logwirecloud.com",
url
:
"http://localhost:8083"
,
//开发
url
:
"http://localhost:8083"
,
//开发
// url: "http://122.112.220.204:8089", //开发
/
// url: "http://122.112.220.204:8089", //开发
// url: "https://stms.bjzc-scs.com", //生产
// url: "https://stms.bjzc-scs.com", //生产
};
};
...
...
yarn.lock
View file @
e13da015
...
@@ -3,83 +3,83 @@
...
@@ -3,83 +3,83 @@
"@amap/amap-jsapi-loader@^1.0.1":
"@amap/amap-jsapi-loader@^1.0.1":
version "1.0.1
"
"integrity" "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
"
resolved
"https://mirrors.cloud.tencent.com/npm/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz"
integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
"version" "1.0.1"
"@babel/runtime@^7.17.2":
"@babel/runtime@^7.17.2":
version "7.26.7
"
"integrity" "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==
"
resolved
"https://mirrors.cloud.tencent.com/npm/@babel/runtime/-/runtime-7.26.7.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@babel/runtime/-/runtime-7.26.7.tgz"
integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==
"version" "7.26.7"
dependencies:
dependencies:
regenerator-runtime
"^0.14.0"
"regenerator-runtime"
"^0.14.0"
"@dcloudio/uni-ui@^1.5.7":
"@dcloudio/uni-ui@^1.5.7":
version "1.5.7
"
"integrity" "sha512-DugxSIrQrze1FLdUOj9a+JEQ0bHGjnJTcGUK1mN/MivKg7nuKJBRWk5Ipa9sUdoBznX6ndz5h2e7Uao6x1CdCw==
"
resolved
"https://mirrors.cloud.tencent.com/npm/@dcloudio/uni-ui/-/uni-ui-1.5.7.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@dcloudio/uni-ui/-/uni-ui-1.5.7.tgz"
integrity sha512-DugxSIrQrze1FLdUOj9a+JEQ0bHGjnJTcGUK1mN/MivKg7nuKJBRWk5Ipa9sUdoBznX6ndz5h2e7Uao6x1CdCw==
"version" "1.5.7"
"@wecom/jssdk@^2.1.0":
"@wecom/jssdk@^2.1.0":
version "2.2.5
"
"integrity" "sha512-qOBAsfqaiYM8jZHWYs/atHSpJhsLdZVNaxHQdmEQ7ZWul/GZMt4P5VY8Nf7GII7GhG8z/k+r37Dto6qtAaRqow==
"
resolved
"https://mirrors.cloud.tencent.com/npm/@wecom/jssdk/-/jssdk-2.2.5.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@wecom/jssdk/-/jssdk-2.2.5.tgz"
integrity sha512-qOBAsfqaiYM8jZHWYs/atHSpJhsLdZVNaxHQdmEQ7ZWul/GZMt4P5VY8Nf7GII7GhG8z/k+r37Dto6qtAaRqow==
"version" "2.2.5"
copy-text-to-clipboard@^3.0.1
:
"copy-text-to-clipboard@^3.0.1"
:
version "3.2.0
"
"integrity" "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==
"
resolved
"https://mirrors.cloud.tencent.com/npm/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz"
integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==
"version" "3.2.0"
core-js@^3.11.0
:
"core-js@^3.11.0"
:
version "3.40.0
"
"integrity" "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==
"
resolved
"https://mirrors.cloud.tencent.com/npm/core-js/-/core-js-3.40.0.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/core-js/-/core-js-3.40.0.tgz"
integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==
"version" "3.40.0"
echarts@^5.6.0
:
"echarts@^5.6.0"
:
version "5.6.0
"
"integrity" "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
"
resolved
"https://mirrors.cloud.tencent.com/npm/echarts/-/echarts-5.6.0.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/echarts/-/echarts-5.6.0.tgz"
integrity sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
"version" "5.6.0"
dependencies:
dependencies:
tslib
"2.3.0"
"tslib"
"2.3.0"
zrender
"5.6.1"
"zrender"
"5.6.1"
jweixin-module@^1.6.0
:
"jweixin-module@^1.6.0"
:
version "1.6.0
"
"integrity" "sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w==
"
resolved
"https://mirrors.cloud.tencent.com/npm/jweixin-module/-/jweixin-module-1.6.0.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/jweixin-module/-/jweixin-module-1.6.0.tgz"
integrity sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w==
"version" "1.6.0"
mutation-observer@^1.0.3
:
"mutation-observer@^1.0.3"
:
version "1.0.3
"
"integrity" "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==
"
resolved
"https://mirrors.cloud.tencent.com/npm/mutation-observer/-/mutation-observer-1.0.3.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/mutation-observer/-/mutation-observer-1.0.3.tgz"
integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==
"version" "1.0.3"
regenerator-runtime@^0.14.0
:
"regenerator-runtime@^0.14.0"
:
version "0.14.1
"
"integrity" "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
"
resolved
"https://mirrors.cloud.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
"version" "0.14.1"
tslib@2.3.0
:
"tslib@2.3.0"
:
version "2.3.0
"
"integrity" "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
"
resolved
"https://mirrors.cloud.tencent.com/npm/tslib/-/tslib-2.3.0.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/tslib/-/tslib-2.3.0.tgz"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
"version" "2.3.0"
uview-ui@^2.0.31
:
"uview-ui@^2.0.31"
:
version "2.0.31
"
"integrity" "sha512-I/0fGuvtiKHH/mBb864SGYk+SJ7WaF32tsBgYgeBOsxlUp+Th+Ac2tgz2cTvsQJl6eZYWsKZ3ixiSXCAcxZ8Sw==
"
resolved
"https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.31.tgz"
"resolved"
"https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.31.tgz"
integrity sha512-I/0fGuvtiKHH/mBb864SGYk+SJ7WaF32tsBgYgeBOsxlUp+Th+Ac2tgz2cTvsQJl6eZYWsKZ3ixiSXCAcxZ8Sw==
"version" "2.0.31"
vconsole@^3.15.0
:
"vconsole@^3.15.0"
:
version "3.15.1
"
"integrity" "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==
"
resolved
"https://mirrors.cloud.tencent.com/npm/vconsole/-/vconsole-3.15.1.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/vconsole/-/vconsole-3.15.1.tgz"
integrity sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==
"version" "3.15.1"
dependencies:
dependencies:
"@babel/runtime" "^7.17.2"
"@babel/runtime" "^7.17.2"
copy-text-to-clipboard
"^3.0.1"
"copy-text-to-clipboard"
"^3.0.1"
core-js
"^3.11.0"
"core-js"
"^3.11.0"
mutation-observer
"^1.0.3"
"mutation-observer"
"^1.0.3"
zrender@5.6.1
:
"zrender@5.6.1"
:
version "5.6.1
"
"integrity" "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==
"
resolved
"https://mirrors.cloud.tencent.com/npm/zrender/-/zrender-5.6.1.tgz"
"resolved"
"https://mirrors.cloud.tencent.com/npm/zrender/-/zrender-5.6.1.tgz"
integrity sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==
"version" "5.6.1"
dependencies:
dependencies:
tslib
"2.3.0"
"tslib"
"2.3.0"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment