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) {
export
function
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
)
{
return
Request
(
...
...
components/bossCard/bossCard.vue
View file @
e13da015
<
template
>
<view
class=
"report-container"
>
<!-- 顶部统计卡片 -->
<view
class=
"top-stats-wrapper"
>
<!-- 异常统计环状进度 -->
<view
class=
"stats-card"
@
click=
"navigateToAbnormalReport"
>
<view
class=
"circle-wrapper"
>
<view
class=
"progress-ring"
:style=
"
{
<scroll-view
class=
"scroll-list"
scroll-y
>
<!-- 顶部统计卡片 -->
<view
class=
"top-stats-wrapper"
>
<!-- 异常统计环状进度 -->
<view
class=
"stats-card"
@
click=
"navigateToAbnormalReport"
>
<view
class=
"circle-wrapper"
>
<view
class=
"progress-ring"
:style=
"
{
background: `conic-gradient(#FF4D4F 0% ${currentSearchData.overview.eventRate}%, #f5f5f5 ${currentSearchData.overview.eventRate}% 100%)`
}">
<view
class=
"inner-circle"
>
<view
class=
"submit-info"
>
<view
class=
"count-row"
>
<text
class=
"submitted error"
>
{{
currentSearchData
.
overview
.
unHandled
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalEvent
}}
</text>
<view
class=
"inner-circle"
>
<view
class=
"submit-info"
>
<view
class=
"count-row"
>
<text
class=
"submitted error"
>
{{
currentSearchData
.
overview
.
unHandled
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalEvent
}}
</text>
</view>
<text
class=
"label"
>
异常统计
</text>
</view>
<text
class=
"label"
>
异常统计
</text>
</view>
</view>
</view>
</view>
</view>
<!-- 日报提交环状进度 -->
<view
class=
"stats-card"
@
click=
"navigateToDailyReport"
>
<view
class=
"circle-wrapper"
>
<view
class=
"progress-ring"
:style=
"
{
<!-- 日报提交环状进度 -->
<view
class=
"stats-card"
@
click=
"navigateToDailyReport"
>
<view
class=
"circle-wrapper"
>
<view
class=
"progress-ring"
:style=
"
{
background: `conic-gradient(#52C41A 0% ${currentSearchData.overview.submitRate}%, #f5f5f5 ${currentSearchData.overview.submitRate}% 100%)`
}">
<view
class=
"inner-circle"
>
<view
class=
"submit-info"
>
<view
class=
"count-row"
>
<text
class=
"submitted"
>
{{
currentSearchData
.
overview
.
submitCount
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalCount
}}
</text>
<view
class=
"inner-circle"
>
<view
class=
"submit-info"
>
<view
class=
"count-row"
>
<text
class=
"submitted"
>
{{
currentSearchData
.
overview
.
submitCount
}}
</text>
<text
class=
"should-submitted"
>
/
{{
currentSearchData
.
overview
.
totalCount
}}
</text>
</view>
<text
class=
"label"
>
日报提交
</text>
</view>
<text
class=
"label"
>
日报提交
</text>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 顶部时间导航 -->
<view
class=
"time-nav"
>
<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 === 'yesterday'}" @click="switchTime('yesterday')">昨日
<!-- 顶部时间导航 -->
<view
class=
"time-nav"
>
<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 === 'yesterday'}" @click="switchTime('yesterday')">昨日
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'today'}" @click="switchTime('today')">今日
</view>
</view>
<view
class=
"nav-item"
:class=
"
{active: activeTime === 'today'}" @click="switchTime('today')">今日
</view>
</view>
<!-- 项目概览卡片 -->
<view
class=
"project-card"
>
<view
class=
"overview-content"
>
<!-- 项目概览卡片 -->
<view
class=
"project-card"
>
<view
class=
"overview-content"
>
<!-- 右侧数据统计 -->
<view
class=
"statistics"
v-if=
"staffKind==='simulatedBoss'"
>
<view
class=
"stat-row"
>
<view
class=
"stat-item"
>
<view
class=
"stat-block green "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
shippingCount
}}
</text>
<text
class=
"rate"
>
运输中
</text>
<!-- 右侧数据统计 -->
<view
class=
"statistics"
>
<view
class=
"stat-row"
v-if=
"staffKind==='simulatedBoss'"
>
<view
class=
"stat-item"
>
<view
class=
"stat-block green "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
shippingCount
}}
</text>
<text
class=
"rate"
>
运输中
</text>
</view>
</view>
</view
>
<view
class=
"stat-item
"
>
<view
class=
"stat-block light-orange "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
positionCount
}}
</text>
<
text
class=
"rate"
>
开启定位
</text
>
<view
class=
"stat-item"
>
<view
class=
"stat-block light-orange
"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
positionCount
}}
</text
>
<text
class=
"rate"
>
开启定位
</text>
<
/view
>
</view>
</view
>
<view
class=
"stat-item
"
>
<view
class=
"stat-block green "
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
podCount
}}
</text>
<
text
class=
"rate"
>
回单
</text
>
<view
class=
"stat-item"
>
<view
class=
"stat-block green
"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
podCount
}}
</text
>
<text
class=
"rate"
>
回单
</text>
<
/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
class=
"stat-item"
>
<view
class=
"stat-block green"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
volumeCount
}}
</text>
<text
class=
"rate"
>
方量m³
</text>
<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-block orange"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
weightCount
}}
</text>
<text
class=
"rate"
>
重量T
</text>
<view
class=
"stat-item"
>
<view
class=
"stat-block green"
>
<text
class=
"number"
>
{{
currentSearchData
.
overview
.
stats
.
volumeCount
}}
</text>
<text
class=
"rate"
>
方量m³
</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
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=
"main-info"
>
<view
class=
"amount-section"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
receivable
.
total
}}
</text>
<text
class=
"label"
>
应收
</text>
</view>
<view
class=
"extra-info"
>
<view
class=
"info-row"
>
<text
class=
"label"
>
预计毛利
</text>
<text
class=
"value"
>
{{
currentSearchData
.
finance
.
receivable
.
profit
}}
</text>
<!-- 应收应付信息 -->
<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=
"main-info"
>
<view
class=
"amount-section"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
receivable
.
total
}}
</text>
<text
class=
"label"
>
应收
</text>
</view>
<view
class=
"info-row"
>
<text
class=
"label"
>
毛利率
</text>
<text
class=
"value"
>
{{
currentSearchData
.
finance
.
receivable
.
profitRate
}}
%
</text>
<view
class=
"extra-info"
>
<view
class=
"info-row"
>
<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
class=
"progress-bar"
>
<view
class=
"progress-bar"
style=
"position: relative; height: 4px;width: 100%; background: #52C41A; border-radius: 2px; overflow: hidden;"
>
<view
class=
"progress"
:style=
"
{
<view
class=
"progress-bar"
>
<view
class=
"progress-bar"
style=
"position: relative; height: 4px;width: 100%; background: #52C41A; border-radius: 2px; overflow: hidden;"
>
<view
class=
"progress"
:style=
"
{
backgroundColor: '#FF4D4F',
opacity:0.9,
width: 100-currentSearchData.finance.receivable.profitRate + '%',
...
...
@@ -143,41 +144,41 @@
left: 0,
top: '1px'
}">
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 应付模块 -->
<view
class=
"finance-block"
>
<view
class=
"finance-item payable"
>
<!-- 左侧图标 -->
<view
class=
"left-section"
>
<view
class=
"icon"
>
¥
</view>
</view>
<!-- 应付模块 -->
<view
class=
"finance-block"
>
<view
class=
"finance-item payable"
>
<!-- 左侧图标 -->
<view
class=
"left-section"
>
<view
class=
"icon"
>
¥
</view>
</view>
<!-- 右侧内容 -->
<view
class=
"right-section"
>
<view
class=
"main-info"
>
<view
class=
"amount-section"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
payable
.
total
}}
</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
class=
"right-section"
>
<view
class=
"main-info"
>
<view
class=
"amount-section"
>
<text
class=
"amount"
>
{{
currentSearchData
.
finance
.
payable
.
total
}}
</text>
<text
class=
"label"
>
应付
</text>
</view>
<view
class=
"info-row"
>
<text
class=
"label"
>
月结
</text>
<text
class=
"value monthly"
>
{{
currentSearchData
.
finance
.
payable
.
monthly
}}
</text>
<view
class=
"extra-info"
>
<view
class=
"info-row"
>
<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
class=
"progress-bar"
style=
"position: relative; height: 4px; background: #f0f0f0; border-radius: 2px; overflow: hidden;"
>
<view
class=
"progress cash"
:style=
"
{
<view
class=
"progress-bar"
style=
"position: relative; height: 4px; background: #f0f0f0; border-radius: 2px; overflow: hidden;"
>
<view
class=
"progress cash"
:style=
"
{
backgroundColor: '#FFA940',
width: cashRatio,
position: 'absolute',
...
...
@@ -185,7 +186,7 @@
left: 0,
top: 0
}">
</view>
<view
class=
"progress monthly"
:style=
"
{
<view
class=
"progress monthly"
:style=
"
{
backgroundColor: '#13C2C2',
position: 'absolute',
height: '100%',
...
...
@@ -193,97 +194,100 @@
width: monthlyRatio,
top: 0
}">
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 模拟老板对比图表区域 --
>
<view
class=
"chart-container"
v-if=
"staffKind==='boss'
"
>
<view
class=
"chart-header"
>
<text
class=
"chart-title"
>
模拟老板对比
</text
>
<view
class=
"sort-buttons"
>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'receivable'}"
@click="sortChart('receivable','myLeaderChart')"
>
<text
class=
"sort-icon"
></text>
应收
</text>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'payable'}"
@click="sortChart('payable','myLeaderChart')"
>
<text
class=
"sort-icon"
></text>
应付
</text>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'profitRate'}"
@click="sortChart('profitRate','myLeaderChart')"
>
<text
class=
"sort-icon"
></text>
利润
</
text
>
<!-- 模拟老板对比图表区域 -->
<view
class=
"chart-container"
v-if=
"staffKind==='boss'"
>
<view
class=
"chart-header
"
>
<text
class=
"chart-title"
>
模拟老板对比
</text
>
<view
class=
"sort-buttons"
>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'receivable'}"
@click="sortChart('receivable','myLeaderChart')">
<text
class=
"sort-icon"
></text
>
应收
</text>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'payable'}"
@click="sortChart('payable','myLeaderChart')">
<text
class=
"sort-icon"
></text
>
应付
</text>
<text
class=
"sort-btn"
:class=
"
{active: sortType === 'profitRate'}"
@click="sortChart('profitRate','myLeaderChart')">
<text
class=
"sort-icon"
></text
>
利润
</text>
</
view
>
</view>
<scroll-view
class=
"chart-scroll"
scroll-x
@
touchmove
.
prevent
>
<canvas
class=
"chart-wrapper"
id=
"myLeaderChart"
></canvas>
</scroll-view>
</view>
<scroll-view
class=
"chart-scroll"
scroll-x
>
<view
class=
"chart-wrapper"
id=
"myLeaderChart"
></view>
</scroll-view>
</view>
<!-- 项目对比图表区域 -->
<!-- todo: 当前排序和模拟老板干涉 -->
<view
class=
"chart-container"
>
<view
class=
"chart-header"
>
<text
class=
"chart-title"
>
项目对比(前10)
</text>
<view
class=
"sort-buttons"
>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'receivable'}"
@click="sortProjectChart('receivable','myProjectChart')">
<text
class=
"sort-icon"
></text>
应收
</text>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'payable'}"
@click="sortProjectChart('payable','myProjectChart')">
<text
class=
"sort-icon"
></text>
应付
</text>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'profitRate'}"
@click="sortProjectChart('profitRate','myProjectChart')">
<text
class=
"sort-icon"
></text>
利润
</text>
<!-- 项目对比图表区域 -->
<!-- todo: 当前排序和模拟老板干涉 -->
<view
class=
"chart-container"
>
<view
class=
"chart-header"
>
<text
class=
"chart-title"
>
项目对比(前10)
</text>
<view
class=
"sort-buttons"
>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'receivable'}"
@click="sortProjectChart('receivable','myProjectChart')">
<text
class=
"sort-icon"
></text>
应收
</text>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'payable'}"
@click="sortProjectChart('payable','myProjectChart')">
<text
class=
"sort-icon"
></text>
应付
</text>
<text
class=
"sort-btn"
:class=
"
{active: projectSortType === 'profitRate'}"
@click="sortProjectChart('profitRate','myProjectChart')">
<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>
<scroll-view
class=
"chart-scroll"
scroll-x
>
<view
class=
"chart-wrapper"
id=
"myProjectChart"
></view>
</scroll-view>
</view>
<!-- 项目运营表格 -->
<view
class=
"table-container"
>
<text
class=
"table-title"
>
模拟老板运营情况
</text>
<view
class=
"table-scroll"
>
<uni-table
:data=
"currentData.tableData"
border
:loading=
"loading"
emptyText=
"暂无数据"
>
<uni-tr>
<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"
>
方(m³)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
吨(T)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
人力
</uni-th>
</uni-tr>
<uni-tr
v-for=
"(item, index) in currentData.tableData"
:key=
"index"
>
<uni-td>
{{
item
.
boss
}}
</uni-td>
<uni-td>
{{
item
.
receivable
}}
</uni-td>
<uni-td>
{{
item
.
payable
}}
</uni-td>
<uni-td>
{{
item
.
cashPayable
}}
</uni-td>
<uni-td>
{{
item
.
profitRate
}}
%
</uni-td>
<uni-td>
{{
item
.
orderCount
}}
</uni-td>
<uni-td>
{{
item
.
volume
}}
</uni-td>
<uni-td>
{{
item
.
weight
}}
</uni-td>
<uni-td>
{{
item
.
manpower
}}
</uni-td>
</uni-tr>
</uni-table>
<!-- 项目运营表格 -->
<view
class=
"table-container"
>
<text
class=
"table-title"
>
模拟老板运营情况
</text>
<scroll-view
scroll-x
class=
"table-scroll"
>
<view
class=
"table-scroll"
>
<uni-table
:data=
"currentData.tableData"
border
:loading=
"loading"
emptyText=
"暂无数据"
>
<uni-tr>
<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"
>
方(m³)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
吨(T)
</uni-th>
<uni-th
align=
"center"
width=
"60"
>
人力
</uni-th>
</uni-tr>
<uni-tr
v-for=
"(item, index) in currentData.tableData"
:key=
"index"
>
<uni-td>
{{
item
.
boss
}}
</uni-td>
<uni-td>
{{
item
.
receivable
}}
</uni-td>
<uni-td>
{{
item
.
payable
}}
</uni-td>
<uni-td>
{{
item
.
cashPayable
}}
</uni-td>
<uni-td>
{{
item
.
profitRate
}}
%
</uni-td>
<uni-td>
{{
item
.
orderCount
}}
</uni-td>
<uni-td>
{{
item
.
volume
}}
</uni-td>
<uni-td>
{{
item
.
weight
}}
</uni-td>
<uni-td>
{{
item
.
manpower
}}
</uni-td>
</uni-tr>
</uni-table>
</view>
</scroll-view>
</view>
</view>
</
scroll-
view>
</view>
</
template
>
...
...
@@ -496,6 +500,9 @@
itemStyle
:
{
color
:
'#52C41A'
,
borderRadius
:
[
4
,
4
,
0
,
0
]
},
emphasis
:
{
focus
:
'series'
}
},
{
...
...
@@ -505,6 +512,9 @@
itemStyle
:
{
color
:
'#FF4D4F'
,
borderRadius
:
[
4
,
4
,
0
,
0
]
},
emphasis
:
{
focus
:
'series'
}
},
{
...
...
@@ -518,12 +528,20 @@
},
lineStyle
:
{
width
:
2
},
emphasis
:
{
focus
:
'series'
}
}
]
}
this
.
myLeaderChart
.
setOption
(
option
)
this
.
myLeaderChart
.
on
(
'click'
,
function
(
params
)
{
if
(
params
.
componentType
===
'series'
)
{
console
.
log
(
'触碰到柱状图:'
,
params
);
}
});
},
initProjectChart
()
{
// 获取数据点数量
...
...
@@ -650,11 +668,11 @@
lineStyle
:
{
width
:
2
}
}
]
}
this
.
myProjectChart
.
setOption
(
option
)
this
.
myProjectChart
.
setOption
(
option
)
},
async
switchTime
(
time
)
{
this
.
activeTime
=
time
...
...
@@ -883,11 +901,17 @@
height
:
100%
;
}
.scroll-list
{
height
:
calc
(
100vh
-
60px
);
}
.report-container
{
width
:
100%
;
box-sizing
:
border-box
;
background-color
:
#F5F7FA
;
min-height
:
100vh
;
min-height
:
calc
(
100vh
-
60px
);
// max-height: 100vh;
>
view
{
width
:
100%
;
...
...
components/dailyReport/dailyReport.vue
View file @
e13da015
...
...
@@ -3,15 +3,23 @@
<!-- 顶部统计 -->
<view
class=
"report-stats"
>
<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>
</view>
<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>
</view>
<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>
</view>
...
...
@@ -85,6 +93,9 @@
this
.
staffCode
=
uni
.
getStorageSync
(
'staffCode'
);
this
.
staffKind
=
uni
.
getStorageSync
(
'uc_staff_kind'
);
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
);
...
...
@@ -167,6 +178,12 @@
font-weight
:
bold
;
color
:
#333
;
margin-bottom
:
8px
;
.unit
{
font-size
:
12px
;
color
:
#999
;
margin-left
:
5px
;
}
}
.label
{
...
...
@@ -178,7 +195,7 @@
.report-list
{
// 调整高度,移除分页器的空间
height
:
calc
(
100vh
-
12
0px
);
height
:
calc
(
100vh
-
20
0px
);
.report-card
{
display
:
block
;
...
...
components/dailyReportCreate/dailyReportCreate.vue
View file @
e13da015
...
...
@@ -52,7 +52,7 @@
<!-- 按钮组 -->
<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>
</view>
</view>
...
...
manifest.json
View file @
e13da015
...
...
@@ -79,7 +79,7 @@
"devServer"
:
{
"https"
:
false
,
"disableHostCheck"
:
true
,
"port"
:
808
2
,
"port"
:
808
3
,
"proxy"
:
{
"/api"
:
{
//
"target"
:
"http://122.112.220.204:8089"
,
...
...
mixins/loginBehavior.js
View file @
e13da015
...
...
@@ -16,75 +16,75 @@ import * as ww from "@wecom/jssdk";
module
.
exports
=
{
methods
:
{
initWeCom
(
callback
=
()
=>
{})
{
getTicketByType
({
aux
:
{
entryName
:
MINI
.
h5Uat
,
//
initWeCom(callback = () => {}) {
//
getTicketByType({
//
aux: {
//
entryName: MINI.h5Uat,
type
:
"app"
,
},
}).
then
((
res
)
=>
{
const
appTicket
=
res
.
data
.
data
.
ticket
;
getTicketByType
({
aux
:
{
entryName
:
MINI
.
h5Uat
,
//
type: "app",
//
},
//
}).then((res) => {
//
const appTicket = res.data.data.ticket;
//
getTicketByType({
//
aux: {
//
entryName: MINI.h5Uat,
type
:
"company"
,
},
}).
then
((
res
)
=>
{
const
comTicket
=
res
.
data
.
data
.
ticket
;
const
timestamp
=
new
Date
().
getTime
();
ww
.
register
({
corpId
:
CORP_ID
,
agentId
:
AGENT_ID
,
jsApiList
:
JS_API_LIST
,
async
getConfigSignature
(
url
)
{
const
{
signature
}
=
ww
.
getSignature
({
ticket
:
comTicket
,
nonceStr
:
MINI
.
h5Uat
,
timestamp
,
url
,
});
return
{
timestamp
,
nonceStr
:
MINI
.
h5Uat
,
signature
,
};
},
async
getAgentConfigSignature
(
url
)
{
const
{
signature
}
=
ww
.
getSignature
({
ticket
:
appTicket
,
nonceStr
:
MINI
.
h5Uat
,
timestamp
,
url
,
});
return
{
timestamp
,
nonceStr
:
MINI
.
h5Uat
,
signature
,
};
},
onConfigSuccess
(
res
)
{
console
.
log
(
"onConfigSuccess"
,
res
);
},
onConfigFail
(
res
)
{
console
.
log
(
"onConfigFail"
+
res
);
},
onAgentConfigSuccess
(
res
)
{
console
.
log
(
"onAgentConfigSuccess"
+
JSON
.
stringify
(
res
));
callback
()
},
onAgentConfigFail
(
res
)
{
console
.
log
(
"onAgentConfigFail"
+
res
);
},
});
});
});
},
//
type: "company",
//
},
//
}).then((res) => {
//
const comTicket = res.data.data.ticket;
//
const timestamp = new Date().getTime();
//
ww.register({
//
corpId: CORP_ID,
//
agentId: AGENT_ID,
//
jsApiList: JS_API_LIST,
//
async getConfigSignature(url) {
//
const {
//
signature
//
} = ww.getSignature({
//
ticket: comTicket,
//
nonceStr: MINI.h5Uat,
//
timestamp,
//
url,
//
});
//
return {
//
timestamp,
//
nonceStr: MINI.h5Uat,
//
signature,
//
};
//
},
//
async getAgentConfigSignature(url) {
//
const {
//
signature
//
} = ww.getSignature({
//
ticket: appTicket,
//
nonceStr: MINI.h5Uat,
//
timestamp,
//
url,
//
});
//
return {
//
timestamp,
//
nonceStr: MINI.h5Uat,
//
signature,
//
};
//
},
//
onConfigSuccess(res) {
//
console.log("onConfigSuccess", res);
//
},
//
onConfigFail(res) {
//
console.log("onConfigFail" + res);
//
},
//
onAgentConfigSuccess(res) {
//
console.log("onAgentConfigSuccess" + JSON.stringify(res));
//
callback()
//
},
//
onAgentConfigFail(res) {
//
console.log("onAgentConfigFail" + res);
//
},
//
});
//
});
//
});
//
},
//获取微信token
getWxToken
()
{
uni
.
login
({
...
...
pages/abnormal/detail/index.vue
View file @
e13da015
<
template
>
<view
class=
"abnormal-detail"
>
<!-- 基本信息卡片 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
基本信息
</view>
<view
class=
"info-grid"
>
<view
class=
"header-row"
>
<text
class=
"abnormal-id"
@
click=
"copyText(detail.abnormalId)"
>
{{
detail
.
abnormalId
}}
</text>
<text
class=
"time"
>
{{
detail
.
occurTime
}}
</text>
</view>
<view
class=
"full-width-item"
>
<text
class=
"label"
>
客户
</text>
<text
class=
"value"
>
{{
detail
.
customer
}}
</text>
</view>
<view
class=
"full-width-item"
>
<text
class=
"label"
>
订单始发地
</text>
<text
class=
"value"
>
{{
detail
.
startLocation
}}
</text>
</view>
<view
class=
"full-width-item"
>
<text
class=
"label"
>
目的地名称
</text>
<text
class=
"value"
>
{{
detail
.
endLocation
}}
</text>
</view>
</view>
</view>
<!-- 异常信息卡片 -->
<view
class=
"detail-card"
>
<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>
<text
class=
"value"
:class=
"getProcessClass(detail.processStatus)"
>
{{
detail
.
processStatus
}}
</text>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
涉及金额
</text>
<text
class=
"value amount"
>
¥
{{
detail
.
amount
}}
</text>
</view>
</view>
<view
class=
"info-row"
>
<view
class=
"info-col"
>
<text
class=
"label"
>
异常类型
</text>
<text
class=
"value"
>
{{
detail
.
abnormalType
}}
</text>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
二级异常
</text>
<text
class=
"value"
>
{{
detail
.
secondaryAbnormal
}}
</text>
</view>
</view>
<view
class=
"info-row"
>
<view
class=
"info-col"
>
<text
class=
"label"
>
责任方
</text>
<text
class=
"value"
>
{{
detail
.
responsible
}}
</text>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
是否记录KPI
</text>
<text
class=
"value"
>
{{
detail
.
isKPI
?
'是'
:
'否'
}}
</text>
</view>
</view>
</view>
</view>
</view>
<!-- 处理信息卡片 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
处理信息
</view>
<view
class=
"text-area"
>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
事件描述
</view>
<view
class=
"text-content"
>
{{
detail
.
description
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
围堵措施
</view>
<view
class=
"text-content"
>
{{
detail
.
measures
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
原因分析
</view>
<view
class=
"text-content"
>
{{
detail
.
analysis
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
改善措施
</view>
<view
class=
"text-content"
>
{{
detail
.
improvement
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
备注
</view>
<view
class=
"text-content"
>
{{
detail
.
remarks
}}
</view>
</view>
</view>
</view>
<!-- 附件信息卡片 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
附件信息
</view>
<view
class=
"attachment-area"
>
<!-- 图片展示 -->
<view
class=
"images-list"
v-if=
"detail.images && detail.images.length"
>
<view
class=
"image-item"
v-for=
"(img, index) in detail.images"
:key=
"index"
>
<image
:src=
"img"
mode=
"aspectFill"
@
click=
"previewImage(img)"
></image>
</view>
</view>
<!-- 附件列表 -->
<view
class=
"files-list"
v-if=
"detail.files && detail.files.length"
>
<view
class=
"file-item"
v-for=
"(file, index) in detail.files"
:key=
"index"
>
<text
class=
"iconfont icon-file"
></text>
<text
class=
"file-name"
>
{{
file
.
name
}}
</text>
</view>
</view>
</view>
</view>
<!-- 审批状态 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
审批状态
</view>
<view
class=
"approval-status"
>
<text
class=
"status-tag"
:class=
"getStatusClass(detail.approvalStatus)"
>
{{
detail
.
approvalStatus
}}
</text>
</view>
</view>
</view>
<view
class=
"abnormal-detail"
>
<!-- 基本信息卡片 -->
<scroll-view
scroll-y
:style=
"
{ height: '100vh' }">
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
基本信息
</view>
<view
class=
"info-grid"
>
<view
class=
"header-row"
>
<text
class=
"abnormal-id"
@
click=
"copyText(detail.orderEventNo)"
>
{{
detail
.
orderEventNo
}}
</text>
<text
class=
"time"
>
{{
detail
.
eventTime
}}
</text>
</view>
<view
class=
"full-width-item"
>
<text
class=
"label"
>
客户
</text>
<text
class=
"value"
>
{{
detail
.
customerName
}}
</text>
</view>
<view
class=
"full-width-item"
>
<text
class=
"label"
>
订单始发地
</text>
<text
class=
"value"
>
{{
detail
.
startLocation
}}
</text>
</view>
<view
class=
"full-width-item"
>
<text
class=
"label"
>
目的地名称
</text>
<text
class=
"value"
>
{{
detail
.
endLocation
}}
</text>
</view>
</view>
</view>
<!-- 异常信息卡片 -->
<view
class=
"detail-card"
>
<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>
<text
class=
"value"
:class=
"getProcessClass(detail.orderEventStatus)"
>
{{
detail
.
orderEventStatus
}}
</text>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
涉及金额
</text>
<text
class=
"value amount"
>
¥
{{
detail
.
involvingAmount
}}
</text>
</view>
</view>
<view
class=
"info-row"
>
<view
class=
"info-col"
>
<text
class=
"label"
>
异常类型
</text>
<text
class=
"value"
>
{{
detail
.
abnormalType
}}
</text>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
二级异常
</text>
<text
class=
"value"
>
{{
detail
.
childrenException
}}
</text>
</view>
</view>
<view
class=
"info-row"
>
<view
class=
"info-col"
>
<text
class=
"label"
>
责任方
</text>
<text
class=
"value"
>
{{
detail
.
responsible
}}
</text>
</view>
<view
class=
"info-col"
>
<text
class=
"label"
>
是否记录KPI
</text>
<text
class=
"value"
>
{{
detail
.
isKPI
?
'是'
:
'否'
}}
</text>
</view>
</view>
</view>
</view>
</view>
<!-- 处理信息卡片 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
处理信息
</view>
<view
class=
"text-area"
>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
事件描述
</view>
<view
class=
"text-content"
>
{{
detail
.
content
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
围堵措施
</view>
<view
class=
"text-content"
>
{{
detail
.
containmentMeasure
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
原因分析
</view>
<view
class=
"text-content"
>
{{
detail
.
reason
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
改善措施
</view>
<view
class=
"text-content"
>
{{
detail
.
advice
}}
</view>
</view>
<view
class=
"text-item"
>
<view
class=
"text-label"
>
备注
</view>
<view
class=
"text-content"
>
{{
detail
.
remarks
}}
</view>
</view>
</view>
</view>
<!-- 附件信息卡片 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
附件信息
</view>
<view
class=
"attachment-area"
>
<!-- 图片展示 -->
<view
class=
"images-list"
v-if=
"images && images.length"
>
<view
class=
"image-item"
v-for=
"(img, index) in images"
:key=
"index"
>
<image
:src=
"img"
@
click=
"onPreviewImage(index, img)"
></image>
</view>
</view>
<!-- 附件列表 -->
<view
class=
"files-list"
v-if=
"detail.files && detail.files.length"
>
<view
class=
"file-item"
v-for=
"(file, index) in detail.files"
:key=
"index"
>
<text
class=
"iconfont icon-file"
></text>
<text
class=
"file-name"
>
{{
file
}}
</text>
</view>
</view>
</view>
</view>
<!-- 审批状态 -->
<view
class=
"detail-card"
>
<view
class=
"card-title"
>
审批状态
</view>
<view
class=
"approval-status"
>
<text
class=
"status-tag"
:class=
"getStatusClass(detail.approvalStatus)"
>
{{
detail
.
approvalStatus
}}
</text>
</view>
</view>
</scroll-view>
</view>
</
template
>
<
script
>
export
default
{
data
()
{
return
{
detail
:
{
abnormalId
:
'AB202403200001'
,
orderId
:
'TR202403200001'
,
customer
:
'某某物流有限公司'
,
startLocation
:
'上海市浦东新区'
,
endLocation
:
'北京市朝阳区'
,
occurTime
:
'2024-03-20 09:30'
,
abnormalType
:
'运输异常'
,
secondaryAbnormal
:
'货物损坏'
,
amount
:
'5000.00'
,
responsible
:
'承运方'
,
isKPI
:
true
,
processStatus
:
'处理中'
,
description
:
'货物在运输过程中发生损坏,预计损失金额5000元。'
,
measures
:
'已第一时间联系客户,并安排人员前往现场处理。'
,
analysis
:
'装卸过程操作不当,导致货物受损。'
,
improvement
:
'加强装卸人员培训,完善操作规程。'
,
remarks
:
'已与客户达成初步赔偿方案。'
,
images
:
[
'https://example.com/image1.jpg'
,
'https://example.com/image2.jpg'
],
files
:
[
{
name
:
'现场照片.zip'
,
url
:
'https://example.com/file1.zip'
},
{
name
:
'处理报告.pdf'
,
url
:
'https://example.com/file2.pdf'
}
],
approvalStatus
:
'审批中'
}
}
},
onLoad
(
options
)
{
// 获取列表页传递的id
const
id
=
options
.
id
// 根据id获取详情数据
this
.
getDetail
(
id
)
},
methods
:
{
getDetail
(
id
)
{
// TODO: 调用接口获取详情数据
console
.
log
(
'获取详情数据'
,
id
)
},
getStatusClass
(
status
)
{
const
classMap
=
{
'未审批'
:
'status-pending'
,
'审批中'
:
'status-processing'
,
'审批完成'
:
'status-completed'
}
return
classMap
[
status
]
||
''
},
getProcessClass
(
status
)
{
const
classMap
=
{
'待处理'
:
'process-pending'
,
'处理中'
:
'process-ongoing'
,
'已处理'
:
'process-completed'
}
return
classMap
[
status
]
||
''
},
previewImage
(
url
)
{
uni
.
previewImage
({
urls
:
this
.
detail
.
images
,
current
:
url
})
},
copyText
(
text
)
{
uni
.
setClipboardData
({
data
:
text
,
success
:
()
=>
{
uni
.
showToast
({
title
:
'已复制'
,
icon
:
'none'
})
}
})
}
}
}
import
{
searchOrderEventDetail
,
downloadImg
}
from
'../../../api/apiList'
export
default
{
data
()
{
return
{
detail
:
{},
images
:
[],
files
:
[]
}
},
onLoad
(
options
)
{
// 获取列表页传递的id
const
id
=
options
.
id
// 根据id获取详情数据
this
.
getDetail
(
id
)
},
methods
:
{
getDetail
(
id
)
{
const
data
=
{
aux
:
{
orderEventId
:
id
}
}
searchOrderEventDetail
(
data
).
then
(
res
=>
{
const
data
=
res
.
data
.
data
;
this
.
detail
=
data
;
this
.
files
=
data
.
files
;
this
.
downloadImgs
(
data
.
images
);
})
},
getStatusClass
(
status
)
{
const
classMap
=
{
'未审批'
:
'status-pending'
,
'待审批'
:
'status-processing'
,
'审批完成'
:
'status-completed'
}
return
classMap
[
status
]
||
''
},
getProcessClass
(
status
)
{
const
classMap
=
{
'待处理'
:
'process-pending'
,
'处理中'
:
'process-ongoing'
,
'已处理'
:
'process-completed'
}
return
classMap
[
status
]
||
''
},
onPreviewImage
(
index
,
images
)
{
console
.
log
(
"预览图片"
+
images
)
uni
.
previewImage
({
current
:
index
,
urls
:
images
})
},
copyText
(
text
)
{
uni
.
setClipboardData
({
data
:
text
,
success
:
()
=>
{
uni
.
showToast
({
title
:
'已复制'
,
icon
:
'none'
})
}
})
},
downloadImgs
(
paths
)
{
console
.
log
(
"图片下载"
+
paths
)
return
new
Promise
((
reslove
,
reject
)
=>
{
if
(
paths
)
{
const
imgPaths
=
paths
.
split
(
'|'
)
imgPaths
.
map
((
path
,
index
)
=>
{
downloadImg
(
path
).
then
(
res
=>
{
this
.
images
=
this
.
images
.
concat
(
res
)
})
})
}
else
{
reject
()
}
})
},
}
}
</
script
>
<
style
lang=
"scss"
>
.abnormal-detail
{
padding
:
15px
;
background
:
#f5f7fa
;
min-height
:
100vh
;
.detail-card
{
background
:
#fff
;
border-radius
:
8px
;
padding
:
0
;
margin-bottom
:
15px
;
box-shadow
:
0
2px
12px
rgba
(
0
,
0
,
0
,
0
.05
);
.card-title
{
font-size
:
16px
;
font-weight
:
bold
;
color
:
#333
;
margin
:
0
;
position
:
relative
;
padding
:
15px
20px
;
border-bottom
:
1px
solid
#f0f0f0
;
background
:
#f0f7ff
;
border-radius
:
8px
8px
0
0
;
display
:
flex
;
align-items
:
center
;
&
:before
{
content
:
''
;
display
:
inline-block
;
left
:
0
;
width
:
4px
;
height
:
16px
;
background
:
#2E75E6
;
border-radius
:
2px
;
margin-right
:
8px
;
}
}
.info-grid
{
padding
:
20px
;
.header-row
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
20px
;
padding-bottom
:
15px
;
border-bottom
:
1px
solid
#f0f0f0
;
.abnormal-id
{
font-size
:
18px
;
font-weight
:
bold
;
color
:
#2E75E6
;
}
.time
{
font-size
:
14px
;
color
:
#666
;
}
}
.full-width-item
{
display
:
flex
;
margin-bottom
:
15px
;
&
:last-child
{
margin-bottom
:
0
;
}
.label
{
width
:
100px
;
font-size
:
14px
;
color
:
#666
;
flex-shrink
:
0
;
}
.value
{
flex
:
1
;
font-size
:
14px
;
color
:
#333
;
word-break
:
break-all
;
}
}
.abnormal-info
{
.info-row
{
display
:
flex
;
margin-bottom
:
20px
;
&
:last-child
{
margin-bottom
:
0
;
}
.info-col
{
flex
:
1
;
display
:
flex
;
flex-direction
:
column
;
&
:first-child
{
margin-right
:
20px
;
}
.label
{
font-size
:
14px
;
color
:
#666
;
margin-bottom
:
8px
;
cursor
:
pointer
;
&
:hover
{
color
:
#2E75E6
;
}
}
.value
{
font-size
:
14px
;
color
:
#333
;
cursor
:
pointer
;
padding
:
8px
12px
;
background
:
#f9f9f9
;
border-radius
:
4px
;
transition
:
all
0
.3s
;
&
:hover
{
background
:
#f0f7ff
;
}
&
.amount
{
color
:
#ff4d4f
;
font-weight
:
500
;
font-size
:
16px
;
}
&
.process-pending
{
color
:
#faad14
;
}
&
.process-ongoing
{
color
:
#2E75E6
;
}
&
.process-completed
{
color
:
#52c41a
;
}
}
}
}
}
}
.text-area
{
padding
:
20px
;
.text-item
{
margin-bottom
:
20px
;
.text-label
{
font-size
:
14px
;
color
:
#333
;
font-weight
:
500
;
margin-bottom
:
8px
;
display
:
flex
;
align-items
:
center
;
&
:before
{
content
:
''
;
width
:
6px
;
height
:
6px
;
background
:
#2E75E6
;
border-radius
:
50%
;
margin-right
:
8px
;
opacity
:
0
.7
;
}
}
.text-content
{
font-size
:
14px
;
color
:
#333
;
line-height
:
1
.6
;
padding
:
15px
;
background
:
#f9f9f9
;
border-radius
:
4px
;
border
:
1px
solid
#f0f0f0
;
min-height
:
80px
;
}
}
}
.attachment-area
{
padding
:
20px
;
.section-title
{
font-size
:
14px
;
color
:
#333
;
font-weight
:
500
;
margin-bottom
:
12px
;
}
.images-list
{
display
:
grid
;
grid-template-columns
:
repeat
(
3
,
1fr
);
gap
:
10px
;
margin-bottom
:
15px
;
.image-item
{
aspect-ratio
:
1
;
border-radius
:
4px
;
overflow
:
hidden
;
border
:
1px
solid
#f0f0f0
;
image
{
width
:
100%
;
height
:
100%
;
}
}
}
.files-list
{
.file-item
{
display
:
flex
;
align-items
:
center
;
padding
:
10px
;
background
:
#fafafa
;
border-radius
:
4px
;
margin-bottom
:
10px
;
transition
:
all
0
.3s
;
&
:hover
{
background
:
#f0f7ff
;
}
.icon-file
{
font-size
:
20px
;
color
:
#2E75E6
;
margin-right
:
8px
;
}
}
}
}
.approval-status
{
padding
:
20px
;
.status-tag
{
display
:
inline-block
;
padding
:
6px
16px
;
border-radius
:
4px
;
font-size
:
14px
;
font-weight
:
500
;
}
}
}
}
</
style
>
.abnormal-detail
{
padding
:
15px
;
background
:
#f5f7fa
;
min-height
:
100vh
;
.detail-card
{
background
:
#fff
;
border-radius
:
8px
;
padding
:
0
;
margin-bottom
:
15px
;
box-shadow
:
0
2px
12px
rgba
(
0
,
0
,
0
,
0
.05
);
.card-title
{
font-size
:
16px
;
font-weight
:
bold
;
color
:
#333
;
margin
:
0
;
position
:
relative
;
padding
:
15px
20px
;
border-bottom
:
1px
solid
#f0f0f0
;
background
:
#f0f7ff
;
border-radius
:
8px
8px
0
0
;
display
:
flex
;
align-items
:
center
;
&
:before
{
content
:
''
;
display
:
inline-block
;
left
:
0
;
width
:
4px
;
height
:
16px
;
background
:
#2E75E6
;
border-radius
:
2px
;
margin-right
:
8px
;
}
}
.info-grid
{
padding
:
20px
;
.header-row
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
margin-bottom
:
20px
;
padding-bottom
:
15px
;
border-bottom
:
1px
solid
#f0f0f0
;
.abnormal-id
{
font-size
:
18px
;
font-weight
:
bold
;
color
:
#2E75E6
;
}
.time
{
font-size
:
14px
;
color
:
#666
;
}
}
.full-width-item
{
display
:
flex
;
margin-bottom
:
15px
;
&
:last-child
{
margin-bottom
:
0
;
}
.label
{
width
:
100px
;
font-size
:
14px
;
color
:
#666
;
flex-shrink
:
0
;
}
.value
{
flex
:
1
;
font-size
:
14px
;
color
:
#333
;
word-break
:
break-all
;
}
}
.abnormal-info
{
.info-row
{
display
:
flex
;
margin-bottom
:
20px
;
&
:last-child
{
margin-bottom
:
0
;
}
.info-col
{
flex
:
1
;
display
:
flex
;
flex-direction
:
column
;
&
:first-child
{
margin-right
:
20px
;
}
.label
{
font-size
:
14px
;
color
:
#666
;
margin-bottom
:
8px
;
cursor
:
pointer
;
&
:hover
{
color
:
#2E75E6
;
}
}
.value
{
font-size
:
14px
;
color
:
#333
;
cursor
:
pointer
;
padding
:
8px
12px
;
background
:
#f9f9f9
;
border-radius
:
4px
;
transition
:
all
0
.3s
;
&
:hover
{
background
:
#f0f7ff
;
}
&
.amount
{
color
:
#ff4d4f
;
font-weight
:
500
;
font-size
:
16px
;
}
&
.process-pending
{
color
:
#faad14
;
}
&
.process-ongoing
{
color
:
#2E75E6
;
}
&
.process-completed
{
color
:
#52c41a
;
}
}
}
}
}
}
.text-area
{
padding
:
20px
;
.text-item
{
margin-bottom
:
20px
;
.text-label
{
font-size
:
14px
;
color
:
#333
;
font-weight
:
500
;
margin-bottom
:
8px
;
display
:
flex
;
align-items
:
center
;
&
:before
{
content
:
''
;
width
:
6px
;
height
:
6px
;
background
:
#2E75E6
;
border-radius
:
50%
;
margin-right
:
8px
;
opacity
:
0
.7
;
}
}
.text-content
{
font-size
:
14px
;
color
:
#333
;
line-height
:
1
.6
;
padding
:
15px
;
background
:
#f9f9f9
;
border-radius
:
4px
;
border
:
1px
solid
#f0f0f0
;
min-height
:
80px
;
}
}
}
.attachment-area
{
padding
:
20px
;
.section-title
{
font-size
:
14px
;
color
:
#333
;
font-weight
:
500
;
margin-bottom
:
12px
;
}
.images-list
{
display
:
grid
;
grid-template-columns
:
repeat
(
3
,
1fr
);
gap
:
10px
;
margin-bottom
:
15px
;
.image-item
{
aspect-ratio
:
1
;
border-radius
:
4px
;
overflow
:
hidden
;
border
:
1px
solid
#f0f0f0
;
image
{
width
:
100%
;
height
:
100%
;
}
}
}
.files-list
{
.file-item
{
display
:
flex
;
align-items
:
center
;
padding
:
10px
;
background
:
#fafafa
;
border-radius
:
4px
;
margin-bottom
:
10px
;
transition
:
all
0
.3s
;
&
:hover
{
background
:
#f0f7ff
;
}
.icon-file
{
font-size
:
20px
;
color
:
#2E75E6
;
margin-right
:
8px
;
}
}
}
}
.approval-status
{
padding
:
20px
;
.status-tag
{
display
:
inline-block
;
padding
:
6px
16px
;
border-radius
:
4px
;
font-size
:
14px
;
font-weight
:
500
;
}
}
}
}
</
style
>
\ No newline at end of file
pages/abnormal/list/index.vue
View file @
e13da015
...
...
@@ -5,18 +5,22 @@
<view
class=
"stat-item"
@
click=
"selectReport('new')"
>
<text
class=
"number"
style=
"color: #faad14;"
>
{{
searchDatas
.
new
}}
</text>
<text
class=
"label"
>
未审批
</text>
<text
class=
"number2"
style=
"color: #faad14;"
>
¥
{{
searchDatas
.
newAmount
}}
</text>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('approving')"
>
<text
class=
"number"
style=
"color: #1890ff;"
>
{{
searchDatas
.
approving
}}
</text>
<text
class=
"label"
>
审批中
</text>
<text
class=
"number2"
style=
"color: #1890ff;"
>
¥
{{
searchDatas
.
approvingAmount
}}
</text>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('approved')"
>
<text
class=
"number"
style=
"color:#52c41a;"
>
{{
searchDatas
.
approved
}}
</text>
<text
class=
"label"
>
审批完成
</text>
<text
class=
"number2"
style=
"color:#52c41a;"
>
¥
{{
searchDatas
.
approvedAmount
}}
</text>
</view>
<view
class=
"stat-item"
@
click=
"selectReport('total')"
>
<text
class=
"number"
style=
"color:#ff4d4f;"
>
{{
searchDatas
.
total
}}
</text>
<text
class=
"label"
>
总计
</text>
<text
class=
"number2"
style=
"color:#ff4d4f;"
>
¥
{{
searchDatas
.
totalAmount
}}
</text>
</view>
</view>
...
...
@@ -32,7 +36,7 @@
{{
order
.
approvalStatus
}}
</text>
</view>
<text
class=
"time"
>
{{
order
.
occur
Time
}}
</text>
<text
class=
"time"
>
{{
order
.
event
Time
}}
</text>
</view>
<view
class=
"card-content"
>
...
...
@@ -70,7 +74,7 @@
return
{
staffCode
:
""
,
staffKind
:
""
,
activeStatus
:
"total"
,
activeStatus
:
"total"
,
searchDatas
:
{},
orderList
:
[]
}
...
...
@@ -79,9 +83,9 @@
this
.
initData
()
},
methods
:
{
selectReport
(
active
){
this
.
activeStatus
=
active
this
.
orderList
=
[]
selectReport
(
active
)
{
this
.
activeStatus
=
active
this
.
orderList
=
[]
this
.
initData
()
},
initData
()
{
...
...
@@ -152,9 +156,10 @@
.stat-item
{
text-align
:
center
;
padding
:
15px
24px
;
//
padding: 15px 24px;
background
:
#f9f9f9
;
border-radius
:
6px
;
width
:
25%
;
transition
:
background
0
.3s
,
transform
0
.3s
;
/* 添加过渡效果 */
...
...
@@ -173,6 +178,14 @@
margin-bottom
:
8px
;
}
.number2
{
display
:
block
;
font-size
:
28px
;
// font-weight: bold;
color
:
#333
;
margin-bottom
:
8px
;
}
.label
{
font-size
:
14px
;
color
:
#999
;
...
...
@@ -241,6 +254,7 @@
.time
{
font-size
:
14px
;
color
:
#999
;
float
:
right
;
}
}
...
...
pages/index/index.vue
View file @
e13da015
...
...
@@ -53,12 +53,10 @@
},
onLoad
()
{
console
.
log
(
'index页面加载'
);
// 调试日志
this
.
getUserInfo
()
this
.
getBindCompanyResult
()
this
.
bindGroupChatCompany
()
this
.
uc_staff_kind
=
uni
.
getStorageSync
(
`uc_staff_kind`
);
this
.
updateTopUserList
()
// this.getBindCompanyResult()
// this.bindGroupChatCompany()
},
onShow
()
{
...
...
@@ -72,26 +70,23 @@
},
methods
:
{
updateTopUserList
()
{
if
(
this
.
uc_staff_kind
===
'boss'
)
{
this
.
topUserList
=
[{
name
:
'
订单查询
'
,
key
:
'
orderQuery
'
,
name
:
'
老板看板
'
,
key
:
'
bossCard
'
,
url
:
'/pages/index/index'
},
{
name
:
'查看日报'
,
key
:
'dailyReport'
,
url
:
'/pages/index/index'
},
{
name
:
'老板看板'
,
key
:
'bossCard'
,
url
:
'/pages/index/index'
},
];
}
else
{
}
else
if
(
this
.
uc_staff_kind
===
'simulatedBoss'
)
{
this
.
topUserList
=
[{
name
:
'
订单查询
'
,
key
:
'
orderQuery
'
,
name
:
'
老板看板
'
,
key
:
'
bossCard
'
,
url
:
'/pages/index/index'
},
{
...
...
@@ -102,12 +97,14 @@
name
:
'填写日报'
,
key
:
'dailyReportCreate'
,
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 @@
padding
:
0px
12px
12px
12px
;
}
}
</
style
>
\ No newline at end of file
</
style
>
s
\ No newline at end of file
pages/login/login.vue
View file @
e13da015
...
...
@@ -17,6 +17,18 @@
</u-form-item>
</
template
>
</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>
</view>
...
...
@@ -24,287 +36,392 @@
</template>
<
script
>
import
{
TokenPrefix
,
MINI
}
from
'../../publicConfig/config.js'
import
{
userLogin
,
SendMessage
}
from
'../../api/apiList.js'
const
loginBehavior
=
require
(
'../../mixins/loginBehavior.js'
)
export
default
{
mixins
:
[
loginBehavior
],
data
()
{
return
{
loginBg
:
''
,
//登录页面背景图
formData
:
{
userName
:
''
,
//用户名
password
:
''
,
//密码
phone
:
''
,
//电话号码
authCode
:
''
//验证码
},
isVerifLogin
:
false
,
//是否为验证码登录
tips
:
'获取验证码'
,
disabled
:
false
,
//是否禁用获取验证码
}
},
onLoad
()
{
this
.
loginBg
=
'static/img/bg/loginBg.png'
this
.
projectMini
=
getApp
().
globalData
.
projectMini
},
methods
:
{
//手机验证码登录
chooseVerifLogin
()
{
this
.
isVerifLogin
=
!
this
.
isVerifLogin
import
{
TokenPrefix
,
MINI
}
from
'../../publicConfig/config.js'
import
{
userMobileOperation
,
selectStaffByUsername
,
userLogin
,
SendMessage
}
from
'../../api/apiList.js'
const
loginBehavior
=
require
(
'../../mixins/loginBehavior.js'
)
export
default
{
mixins
:
[
loginBehavior
],
data
()
{
return
{
loginBg
:
''
,
//登录页面背景图
formData
:
{
userName
:
''
,
//用户名
password
:
''
,
//密码
phone
:
''
,
//电话号码
authCode
:
''
//验证码
},
isVerifLogin
:
false
,
//是否为验证码登录
tips
:
'获取验证码'
,
disabled
:
false
,
//是否禁用获取验证码
rememberMe
:
false
,
// 复选框的状态
isChecked
:
false
,
username
:
""
}
},
onLoad
()
{
this
.
loginBg
=
'static/img/bg/loginBg.png'
onShowTost
(
tostText
,
time
=
1000
)
{
uni
.
showToast
({
title
:
tostText
,
icon
:
'none'
,
duration
:
time
})
this
.
projectMini
=
getApp
().
globalData
.
projectMini
this
.
rememberPd
()
},
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
)
{
let
ruleFlag
=
true
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位有效验证码'
//手机验证码登录
chooseVerifLogin
()
{
this
.
isVerifLogin
=
!
this
.
isVerifLogin
},
onShowTost
(
tostText
,
time
=
1000
)
{
uni
.
showToast
({
title
:
tostText
,
icon
:
'none'
,
duration
:
time
})
},
//表单提交前规则校验
onSubmitBeforeRule
(
userName
,
password
,
phone
,
authCode
)
{
let
ruleFlag
=
true
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
(
!
userName
&&
!
password
)
{
tostText
=
'请输入用户名及密码'
}
else
if
(
!
userName
)
{
tostText
=
'请输入用户名'
}
else
if
(
!
password
)
{
tostText
=
'请输入密码'
if
(
tostText
)
{
ruleFlag
=
false
this
.
onShowTost
(
tostText
)
}
}
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
)
},
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
}
}
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
=
''
const
{
code
}
=
_this
.
getH5Code
()
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
//H5提交
h5Login
(
reqData
,
loginAction
)
{
// uni.setStorageSync(`staffCode`,"");
uni
.
setStorageSync
(
`uc_staff_kind`
,
""
);
const
_this
=
this
let
newCode
=
''
const
{
code
}
=
_this
.
getH5Code
()
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"
,
})
_this
.
initWeCom
()
},
getUserInfo
()
{
}).
catch
(
err
=>
{
uni
.
showToast
({
title
:
err
.
message
||
err
,
icon
:
'none'
,
duration
:
3000
})
})
},
},
//提示文本
onTipsChange
(
text
)
{
this
.
tips
=
text
;
},
//提示文本
onTipsChange
(
text
)
{
this
.
tips
=
text
;
},
}
}
}
</
script
>
<
style
lang=
"scss"
>
.content_box
{
color
:
#FFFFFF
;
letter-spacing
:
6rpx
;
background-size
:
100%
;
background-repeat
:
no-repeat
;
padding
:
0
32rpx
;
justify-content
:
space-between
;
.primary-description
{
font-size
:
28rpx
;
font-weight
:
400
;
line-height
:
40rpx
;
.container-title
{
font-size
:
60rpx
;
font-weight
:
500
;
line-height
:
84rpx
;
margin
:
158rpx
0
85rpx
;
.content_box
{
color
:
#FFFFFF
;
letter-spacing
:
6rpx
;
background-size
:
100%
;
background-repeat
:
no-repeat
;
padding
:
0
32rpx
;
justify-content
:
space-between
;
.primary-description
{
font-size
:
28rpx
;
font-weight
:
400
;
line-height
:
40rpx
;
.container-title
{
font-size
:
60rpx
;
font-weight
:
500
;
line-height
:
84rpx
;
margin
:
158rpx
0
85rpx
;
}
}
}
.user-info
{
width
:
100%
;
/* #ifdef MP */
margin-top
:
400rpx
;
/* #endif */
/* #ifdef H5 || APP-PLUS*/
margin-top
:
320rpx
;
/* #endif */
flex-wrap
:
wrap
;
.loginBtn
{
.user-info
{
width
:
100%
;
height
:
96rpx
;
line-height
:
96rpx
;
/* #ifdef MP */
margin-top
:
212
rpx
;
margin-top
:
400
rpx
;
/* #endif */
/* #ifdef H5 || APP-PLUS*/
margin-top
:
16
0rpx
;
margin-top
:
32
0rpx
;
/* #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
;
flex-wrap
:
wrap
;
.loginBtn
{
width
:
100%
;
height
:
96rpx
;
line-height
:
96rpx
;
/* #ifdef MP */
margin-top
:
212rpx
;
/* #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
{
width
:
100%
;
text-align
:
center
;
text-decoration
:
underline
;
color
:
#2e75e6
;
margin-top
:
40rpx
;
.remember-me
{
margin-bottom
:
20px
;
// 添加底部间距
display
:
flex
;
// 使用 flex 布局
align-items
:
center
;
// 垂直居中
}
/
deep
/
.u-form
{
width
:
100%
;
.remember-checkbox
{
color
:
black
;
// 设置复选框字体颜色为黑色
font-size
:
14px
;
// 设置字体大小
z-index
:
999
;
}
.u-form-item__body
{
width
:
100%
;
padding
:
6rpx
40rpx
!
important
;
// .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
:
64
rpx
;
margin-bottom
:
40
rpx
;
background
:
rgba
(
225
,
225
,
225
,
.2
);
.u-input
{
padding
:
16rpx
24rpx
!
important
;
padding
:
16rpx
!
important
;
border
:
none
;
.u-input__content__field-wrapper__field
{
letter-spacing
:
2rpx
!
important
;
}
}
.input-placeholder
{
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-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
>
\ No newline at end of file
publicConfig/config.js
View file @
e13da015
...
...
@@ -10,7 +10,7 @@ let BASEURL = {
// url: 'http://192.168.0.230:8080' // xiaohan
// url: "https://botms-demo.logwirecloud.com",
url
:
"http://localhost:8083"
,
//开发
// url: "http://122.112.220.204:8089", //开发
/
// url: "http://122.112.220.204:8089", //开发
// url: "https://stms.bjzc-scs.com", //生产
};
...
...
yarn.lock
View file @
e13da015
...
...
@@ -3,83 +3,83 @@
"@amap/amap-jsapi-loader@^1.0.1":
version "1.0.1
"
resolved
"https://mirrors.cloud.tencent.com/npm/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz"
integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
"integrity" "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz"
"version" "1.0.1"
"@babel/runtime@^7.17.2":
version "7.26.7
"
resolved
"https://mirrors.cloud.tencent.com/npm/@babel/runtime/-/runtime-7.26.7.tgz"
integrity sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==
"integrity" "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@babel/runtime/-/runtime-7.26.7.tgz"
"version" "7.26.7"
dependencies:
regenerator-runtime
"^0.14.0"
"regenerator-runtime"
"^0.14.0"
"@dcloudio/uni-ui@^1.5.7":
version "1.5.7
"
resolved
"https://mirrors.cloud.tencent.com/npm/@dcloudio/uni-ui/-/uni-ui-1.5.7.tgz"
integrity sha512-DugxSIrQrze1FLdUOj9a+JEQ0bHGjnJTcGUK1mN/MivKg7nuKJBRWk5Ipa9sUdoBznX6ndz5h2e7Uao6x1CdCw==
"integrity" "sha512-DugxSIrQrze1FLdUOj9a+JEQ0bHGjnJTcGUK1mN/MivKg7nuKJBRWk5Ipa9sUdoBznX6ndz5h2e7Uao6x1CdCw==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@dcloudio/uni-ui/-/uni-ui-1.5.7.tgz"
"version" "1.5.7"
"@wecom/jssdk@^2.1.0":
version "2.2.5
"
resolved
"https://mirrors.cloud.tencent.com/npm/@wecom/jssdk/-/jssdk-2.2.5.tgz"
integrity sha512-qOBAsfqaiYM8jZHWYs/atHSpJhsLdZVNaxHQdmEQ7ZWul/GZMt4P5VY8Nf7GII7GhG8z/k+r37Dto6qtAaRqow==
"integrity" "sha512-qOBAsfqaiYM8jZHWYs/atHSpJhsLdZVNaxHQdmEQ7ZWul/GZMt4P5VY8Nf7GII7GhG8z/k+r37Dto6qtAaRqow==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/@wecom/jssdk/-/jssdk-2.2.5.tgz"
"version" "2.2.5"
copy-text-to-clipboard@^3.0.1
:
version "3.2.0
"
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==
"copy-text-to-clipboard@^3.0.1"
:
"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"
"version" "3.2.0"
core-js@^3.11.0
:
version "3.40.0
"
resolved
"https://mirrors.cloud.tencent.com/npm/core-js/-/core-js-3.40.0.tgz"
integrity sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==
"core-js@^3.11.0"
:
"integrity" "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/core-js/-/core-js-3.40.0.tgz"
"version" "3.40.0"
echarts@^5.6.0
:
version "5.6.0
"
resolved
"https://mirrors.cloud.tencent.com/npm/echarts/-/echarts-5.6.0.tgz"
integrity sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
"echarts@^5.6.0"
:
"integrity" "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/echarts/-/echarts-5.6.0.tgz"
"version" "5.6.0"
dependencies:
tslib
"2.3.0"
zrender
"5.6.1"
"tslib"
"2.3.0"
"zrender"
"5.6.1"
jweixin-module@^1.6.0
:
version "1.6.0
"
resolved
"https://mirrors.cloud.tencent.com/npm/jweixin-module/-/jweixin-module-1.6.0.tgz"
integrity sha512-dGk9cf+ipipHmtzYmKZs5B2toX+p4hLyllGLF6xuC8t+B05oYxd8fYoaRz0T30U2n3RUv8a4iwvjhA+OcYz52w==
"jweixin-module@^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"
"version" "1.6.0"
mutation-observer@^1.0.3
:
version "1.0.3
"
resolved
"https://mirrors.cloud.tencent.com/npm/mutation-observer/-/mutation-observer-1.0.3.tgz"
integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==
"mutation-observer@^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"
"version" "1.0.3"
regenerator-runtime@^0.14.0
:
version "0.14.1
"
resolved
"https://mirrors.cloud.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
"regenerator-runtime@^0.14.0"
:
"integrity" "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
"version" "0.14.1"
tslib@2.3.0
:
version "2.3.0
"
resolved
"https://mirrors.cloud.tencent.com/npm/tslib/-/tslib-2.3.0.tgz"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
"tslib@2.3.0"
:
"integrity" "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/tslib/-/tslib-2.3.0.tgz"
"version" "2.3.0"
uview-ui@^2.0.31
:
version "2.0.31
"
resolved
"https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.31.tgz"
integrity sha512-I/0fGuvtiKHH/mBb864SGYk+SJ7WaF32tsBgYgeBOsxlUp+Th+Ac2tgz2cTvsQJl6eZYWsKZ3ixiSXCAcxZ8Sw==
"uview-ui@^2.0.31"
:
"integrity" "sha512-I/0fGuvtiKHH/mBb864SGYk+SJ7WaF32tsBgYgeBOsxlUp+Th+Ac2tgz2cTvsQJl6eZYWsKZ3ixiSXCAcxZ8Sw==
"
"resolved"
"https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.31.tgz"
"version" "2.0.31"
vconsole@^3.15.0
:
version "3.15.1
"
resolved
"https://mirrors.cloud.tencent.com/npm/vconsole/-/vconsole-3.15.1.tgz"
integrity sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==
"vconsole@^3.15.0"
:
"integrity" "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/vconsole/-/vconsole-3.15.1.tgz"
"version" "3.15.1"
dependencies:
"@babel/runtime" "^7.17.2"
copy-text-to-clipboard
"^3.0.1"
core-js
"^3.11.0"
mutation-observer
"^1.0.3"
"copy-text-to-clipboard"
"^3.0.1"
"core-js"
"^3.11.0"
"mutation-observer"
"^1.0.3"
zrender@5.6.1
:
version "5.6.1
"
resolved
"https://mirrors.cloud.tencent.com/npm/zrender/-/zrender-5.6.1.tgz"
integrity sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==
"zrender@5.6.1"
:
"integrity" "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==
"
"resolved"
"https://mirrors.cloud.tencent.com/npm/zrender/-/zrender-5.6.1.tgz"
"version" "5.6.1"
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