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) {
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(
......
<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%;
......
......@@ -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 - 120px);
height: calc(100vh - 200px);
.report-card {
display: block;
......
......@@ -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>
......
......@@ -79,7 +79,7 @@
"devServer" : {
"https" : false,
"disableHostCheck" : true,
"port" : 8082,
"port" : 8083,
"proxy" : {
"/api" : {
// "target" : "http://122.112.220.204:8089",
......
......@@ -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({
......
<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
......@@ -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.occurTime }}</text>
<text class="time">{{ order.eventTime }}</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;
}
}
......
......@@ -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
......@@ -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: 212rpx;
margin-top: 400rpx;
/* #endif */
/* #ifdef H5 || APP-PLUS*/
margin-top: 160rpx;
margin-top: 320rpx;
/* #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: 64rpx;
margin-bottom: 40rpx;
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
......@@ -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", //生产
};
......
......@@ -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"
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