Commit e13da015 authored by 刘杰's avatar 刘杰

企业微信前端

parent 3612bc13
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/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"
}
]
}
...@@ -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(
......
<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%;
......
...@@ -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 - 120px); height: calc(100vh - 200px);
.report-card { .report-card {
display: block; display: block;
......
...@@ -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>
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
"devServer" : { "devServer" : {
"https" : false, "https" : false,
"disableHostCheck" : true, "disableHostCheck" : true,
"port" : 8082, "port" : 8083,
"proxy" : { "proxy" : {
"/api" : { "/api" : {
// "target" : "http://122.112.220.204:8089", // "target" : "http://122.112.220.204:8089",
......
...@@ -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({
......
<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
...@@ -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.occurTime }}</text> <text class="time">{{ order.eventTime }}</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;
} }
} }
......
...@@ -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
...@@ -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: 212rpx; margin-top: 400rpx;
/* #endif */ /* #endif */
/* #ifdef H5 || APP-PLUS*/ /* #ifdef H5 || APP-PLUS*/
margin-top: 160rpx; margin-top: 320rpx;
/* #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: 64rpx; margin-bottom: 40rpx;
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
...@@ -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", //生产
}; };
......
...@@ -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"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment