This commit is contained in:
24kycj
2024-11-05 09:23:42 +08:00
parent e109b28eec
commit d375616372
23 changed files with 316 additions and 703 deletions
+2
View File
@@ -53,6 +53,7 @@
}
},
"dependencies": {
"autoprefixer": "^10.4.20",
"axios": "^0.18.0",
"element-ui": "^2.15.14",
"js-cookie": "^3.0.5",
@@ -96,6 +97,7 @@
"mini-css-extract-plugin": "0.4.0",
"node-loader": "^0.6.0",
"node-sass": "^4.9.2",
"postcss-px-to-viewport": "^1.1.1",
"sass-loader": "^7.0.3",
"style-loader": "^0.21.0",
"url-loader": "^1.0.1",
+17
View File
@@ -0,0 +1,17 @@
module.exports = {
plugins: [
require('postcss-px-to-viewport')({
viewportWidth: 1920, // 设计稿的视口宽度
unitPrecision: 5, // 单位转换后保留的精度
propList: ['*'], // 能转化为vw的属性列表
viewportUnit: 'vw', // 希望使用的视口单位
fontViewportUnit: 'vw', // 字体使用的视口单位
selectorBlackList: [], // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
mediaQuery: false, // 媒体查询里的单位是否需要转换单位
replace: true, // 是否直接更换属性值,而不添加备用属性
exclude: /node_modules/, // 忽略node_modules目录下的文件
include: undefined, // 如果设置了include,那将只有匹配到的文件才会被转换
})
]
};
+11 -4
View File
@@ -1,4 +1,4 @@
import { app, BrowserWindow } from 'electron'
import { app, BrowserWindow, Menu } from 'electron'
import '../renderer/store'
/**
@@ -19,13 +19,20 @@ function createWindow () {
* Initial window options
*/
mainWindow = new BrowserWindow({
width: 1920,
height: 1080,
useContentSize: true,
width: 1920
show: false,
fullscreen: true,
webPreferences: {
nodeIntegration: true
}
})
mainWindow.loadURL(winURL)
// 禁用默认菜单
Menu.setApplicationMenu(null);
mainWindow.maximize()
mainWindow.show()
mainWindow.on('closed', () => {
mainWindow = null
})
Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

+14 -13
View File
@@ -7,23 +7,24 @@ import { Message } from 'element-ui'
const whiteList = ['/login'] // 不重定向白名单
router.beforeEach((to, from, next) => {
NProgress.start()
if (!store.getters.token) {
if (store.getters.token) {
if (to.path === '/login') {
next({ path: '/' })
NProgress.done() // if current page is dashboard will not trigger afterEach hook, so manually handle it
} else {
if (store.getters.roles.length === 0) {
store.dispatch('GetInfo').then(res => { // 拉取用户信息
next()
}).catch((err) => {
store.dispatch('FedLogOut').then(() => {
Message.error(err || 'Verification failed, please login again')
next({ path: '/' })
})
})
} else {
next()
}
next()
// if (store.getters.roles.length === 0) {
// store.dispatch('GetInfo').then(res => { // 拉取用户信息
// next()
// }).catch((err) => {
// store.dispatch('FedLogOut').then(() => {
// Message.error(err || 'Verification failed, please login again')
// next({ path: '/' })
// })
// })
// } else {
// next()
// }
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
+1 -1
View File
@@ -13,7 +13,7 @@ export default new Vuex.Store({
getters,
plugins: [
createPersistedState(),
createSharedMutations()
// createSharedMutations()
],
strict: process.env.NODE_ENV !== 'production'
})
+41 -34
View File
@@ -1,12 +1,13 @@
import { login, logout, getInfo } from '@/api/login'
// import { login, logout, getInfo } from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'
const user = {
state: {
token: getToken(),
name: '',
avatar: '',
roles: []
name: 'admin',
avatar:
'https://image.baidu.com/search/detail?ct=503316480&z=&tn=baiduimagedetail&ipn=d&word=admin&step_word=&lid=8980923753406439282&ie=utf-8&in=&cl=2&lm=-1&st=-1&hd=&latest=&copyright=&cs=1902119677,258344230&os=3526618670,2431782315&simid=3426573763,123057590&pn=11&rn=1&di=7410818322373017601&ln=1928&fr=&fmq=1730735680169_R&ic=&s=undefined&se=&sme=&tab=0&width=&height=&face=undefined&is=0,0&istype=2&ist=&jit=&bdtype=0&spn=0&pi=0&gsm=1e&objurl=https%3A%2F%2Fclearhub.tech%2Fwp-content%2Fuploads%2F2018%2F11%2F12.png&rpstart=0&rpnum=0&adpicid=0&nojc=undefined&dyTabStr=MCwzLDEsMiwxMyw3LDYsNSwxMiw5',
roles: ['admin']
},
mutations: {
@@ -29,53 +30,59 @@ const user = {
Login({ commit }, userInfo) {
const username = userInfo.username.trim()
return new Promise((resolve, reject) => {
login(username, userInfo.password).then(response => {
const data = response.data
setToken(data.token)
commit('SET_TOKEN', data.token)
resolve()
}).catch(error => {
reject(error)
})
login(username, userInfo.password)
.then((response) => {
const data = response.data
setToken(data.token)
commit('SET_TOKEN', data.token)
})
.catch((error) => {
reject(error)
})
})
},
// 获取用户信息
GetInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token).then(response => {
const data = response.data
if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
commit('SET_ROLES', data.roles)
} else {
reject('getInfo: roles must be a non-null array !')
}
commit('SET_NAME', data.name)
commit('SET_AVATAR', data.avatar)
resolve(response)
}).catch(error => {
reject(error)
})
getInfo(state.token)
.then((response) => {
const data = response.data
if (data.roles && data.roles.length > 0) {
// 验证返回的roles是否是一个非空数组
commit('SET_ROLES', data.roles)
} else {
reject('getInfo: roles must be a non-null array !')
}
commit('SET_NAME', data.name)
commit('SET_AVATAR', data.avatar)
resolve(response)
})
.catch((error) => {
reject(error)
})
})
},
// 登出
LogOut({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resolve()
}).catch(error => {
reject(error)
})
logout(state.token)
.then(() => {
commit('SET_TOKEN', '')
commit('SET_ROLES', [])
removeToken()
resolve()
})
.catch((error) => {
reject(error)
})
})
},
// 前端 登出
FedLogOut({ commit }) {
return new Promise(resolve => {
return new Promise((resolve) => {
removeToken()
commit('SET_TOKEN', '')
resolve()
+1
View File
@@ -9,6 +9,7 @@ body {
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
margin: 0;
}
html {
+139 -636
View File
@@ -1,637 +1,48 @@
<template>
<div class="dashboard-container">
<img class="login_bg" src="@/assets/images/index.png" />
<div style="height: 100%; position: relative; display: none;">
<div
v-if="beginStep && parseInt(currentStep) >= 0 && parseInt(currentStep) < 8"
class="bg_box"
style="position: absolute; top: 0; left: 0; z-index: 10; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5)"
></div>
<div style="height: 100%; width: 100%; display: flex">
<div :span="3" style="height: 100%; width: 164px">
<div class="grid-content bg-purple left">
<div class="title">
{{ $t('index.wordSpace') }}
</div>
<!-- @click="() => (printData = index)" -->
<div class="card" v-for="item of infoData" :key="item.PrinterID" style="background-color: #f5f5f5; text-align: left">
<span style="font-size: 18px; margin-left: 40px">{{ getPrintName(item.PrinterID, true) }}</span>
<span style="font-size: 9px">{{ item.PrinterType == '-1' ? $t('index.workspacenodata') : item.PrinterType }}</span>
</div>
</div>
<div class="container_box">
<div class="flex_box flex_row_between top_box">
<div class="flex_box top_left">
<div class="flex_box flex_row_center top_btn1">
<img src="@/assets/images/Plus1_icon.png" />
<div>新建作业</div>
</div>
<div :span="18" style="height: 100%; width: calc(100% - 328px)">
<div class="grid-content bg-purple-light mid" id="rte" style="position: relative">
<div class="title" style="position: relative; height: 45px; display: flex; justify-content: space-between">
<el-popover v-if="guideStep" :placement="guideStep[0].placement" width="250" trigger="manual" v-model="guideStep[0].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step1`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ parseInt(currentStep) == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div slot="reference" :class="{ guide_body: beginStep && currentStep == 0 }" class="switch" style="position: relative; left: 0; top: 3px">
<el-switch active-color="#13ce66" inactive-color="#ff4949" @change="handleOpenSwitch" :value="state"> </el-switch>
</div>
</el-popover>
<el-popover v-if="guideStep" :placement="guideStep[1].placement" width="250" trigger="manual" v-model="guideStep[1].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step2`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div slot="reference" :class="{ guide_body: beginStep && currentStep == 1 }" class="information" style="font-size: 15px; display: flex; gap: 25px; position: relative; top: 5px">
<div style="display: inline-block">
<div style="text-decoration: underline">
{{ $t('main.doneCopyNum') }}
</div>
<div>{{ doneCopyNum }}</div>
</div>
<div style="display: inline-block">
<div style="text-decoration: underline">
{{ $t('main.cancelCopyNum') }}
</div>
<div>{{ cancelCopyNum }}</div>
</div>
<div style="display: inline-block">
<div style="text-decoration: underline">
{{ $t('main.failNum') }}
</div>
<div>{{ failNum }}</div>
</div>
</div>
</el-popover>
<el-popover v-if="guideStep" :placement="guideStep[2].placement" width="250" trigger="manual" v-model="guideStep[2].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step3`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div style="display: flex; align-items: center" class="add" slot="reference" :class="{ guide_body: beginStep && currentStep == 2 }">
<span style="font-size: 18px; line-height: 45px">{{ $t('main.submitTask') }}</span>
<el-popover v-if="guideStep" :placement="guideStep[7].placement" width="250" trigger="manual" v-model="guideStep[7].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step8`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div style="margin-right: 10px" slot="reference" :class="{ guide_body: beginStep && currentStep == 7 }">
<el-button type="primary" @click="newWork" :disabled="infoData.length == 0 && state == false">
{{ $t('index.newWork') }}
</el-button>
</div>
</el-popover>
<el-button type="primary" @click="newNetWork" v-if="false">
{{ $t('index.newWork') }}
</el-button>
<el-button type="primary" @click="openWork()" v-if="true" :disabled="infoData.length == 0 && state == false">
{{ $t('admin.openWork') }}
</el-button>
<!--
<el-select v-model="selectLan">
<el-option
v-for="item in languages"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-select
>
<el-button icon="el-icon-video-play" @click="start_job">启动任务</el-button>
<el-button icon="el-icon-video-pause" @click="suspend_job">暂停任务</el-button>
<el-button icon="el-icon-circle-close">停止任务</el-button>-->
</div>
</el-popover>
<div class="user">
<span style="margin-right: 20px">{{ $t('admin.hello') }} {{ user }}</span>
<router-link to="/admin" v-if="isAdmin">{{ $t('main.adminMange') }}</router-link>
<router-link to="/">{{ $t('main.out') }}</router-link>
</div>
</div>
<el-popover v-if="guideStep" :placement="guideStep[4].placement" width="250" trigger="manual" v-model="guideStep[4].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step5`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div class="brief" slot="reference" :class="{ guide_body: beginStep && currentStep == 4 }">
<el-row :gutter="20" style="height: 100%">
<el-col :span="12" style="height: 100%">
<div class="grid-content bg-purple b_left" style="padding-top: 1px !important; display: flex; align-items: center">
<!-- <div class="b_title">{{ $t("main.systemInformation") }}</div> -->
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center">
<img v-if="os.CardsoonModel" :src="os.CardsoonModel.indexOf(`TH80N`) != -1 ? N80N : N800N" width="150" height="95" />
<span style="font-weight: bold; font-size: 18px">{{ $t('main.systemInformation') }}</span>
</div>
<div style="margin-left: 20px">
<div class="item">{{ $t('main.deviceType') }}{{ os.CardsoonModel }}</div>
<div class="item">{{ $t('main.serialNumber') }}{{ os.SystemSn }}</div>
<div class="item">{{ $t('main.hostName') }}{{ os.hostname }}</div>
<div class="item">{{ $t('main.hostIp') }}{{ os.ip }}</div>
</div>
</div>
</el-col>
<el-col :span="12" style="height: 100%">
<div class="grid-content bg-purple b_mid" style="padding-top: 1px !important; display: flex; align-items: center">
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center">
<span style="font-weight: bold; font-size: 18px">{{ $t('main.hardwareConfiguration') }}</span>
</div>
<div style="margin-left: 20px">
<!-- <div class="item">
{{ $t("main.hardwareConfiguration") }}
</div> -->
<div class="item">{{ $t('main.Cpu') }}{{ os.cpu }}</div>
<div class="item">{{ $t('main.Memory') }}{{ os.ram }}</div>
<div class="item">{{ $t('main.hardDrive') }}{{ os.HD }}</div>
<div class="item">
{{ $t('main.cacheSpace') }}{{ os.remainCacheSpace }} /
{{ os.totalCacheSpace }}
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</el-popover>
<!-- <div
class="brief"
v-if="infoData.length != 0 && false"
style="margin-top: 20px; height: 200px"
>
<el-row :gutter="10" style="height: 100%">
<el-col :span="6" style="height: 100%">
<div
class="grid-content bg-purple b_left"
style="padding-top: 1px !important"
>
<div class="b_title">
{{ $t("index.systemState") }}
</div>
<div style="margin-top: 30px">
<div class="item">
{{ $t("index.wordSpaceOnline")
}}{{
printerStatus[infoData[printData].PrinterID]
? $t(
`index.${
printerStatus[infoData[printData].PrinterID]
}`
)
: ""
}}
</div>
<div class="item">
{{ $t("index.equipModel")
}}{{ infoData[printData].ModeName.replace("Fagoo", "") }}
</div>
<div class="item">
{{ $t("index.series") }}{{ infoData[printData].SerialNo }}
</div>
<div class="item">
{{ $t("index.machineVers")
}}{{ infoData[printData].FirewareVersion }}
</div>
</div>
</div>
</el-col>
<el-col :span="5" style="height: 100%">
<div
class="grid-content bg-purple b_left"
style="padding-top: 1px !important; border-right: 0"
>
<div class="b_title"></div>
<div style="margin-top: 30px">
<div class="item">
{{ $t("index.numbers") }}{{ infoData[printData].CardNum }}
</div>
<div class="item">
{{ $t("index.dice")
}}{{
infoData[printData].DualSide == 1
? this.$t("index.twoDice")
: this.infoData[printData] != null
? this.$t("index.sigleDice")
: ""
}}
</div>
<div class="item">
{{ $t("index.ribbonType")
}}{{ infoData[printData].RibbonType }}
</div>
</div>
</div>
</el-col>
<el-col :span="5" style="height: 100%">
<div
class="grid-content bg-purple b_mid"
style="
padding-top: 1px !important;
height: 100%;
display: flex;
align-items: center;
"
>
<el-progress
type="circle"
:format="ribbonFormat"
:key="printData"
width="75"
:percentage="
infoData[printData].RibbonAmount == undefined ||
infoData[printData].RibbonAmount == '0'
? 0
: (
(infoData[printData].RibbonAmount /
getRibbonAmount) *
100
).toFixed(0)
"
:color="'#67C23A'"
></el-progress>
<div style="margin-left: 20px">
<div>{{ $t("index.ribbonNumber") }}</div>
<div>
{{ infoData[printData].RibbonAmount }}/{{
getRibbonAmount
}}
</div>
</div>
</div>
</el-col>
<el-col :span="8" style="height: 100%">
<div
class="grid-content bg-purple b_mid"
style="
padding-top: 1px !important;
height: 100%;
display: flex;
align-items: center;
"
>
<el-progress
type="circle"
:key="printData"
:format="remaCapaFormat"
width="75"
:percentage="
infoData[printData].PrinterRemaCapa == undefined ||
infoData[printData].PrinterRemaCapa == '0'
? 0
: (
(infoData[printData].PrinterRemaCapa /
getPrinterRemaCapaAmount) *
100
).toFixed(0)
"
:color="'#67C23A'"
></el-progress>
<div style="margin-left: 20px">
<div>
{{ $t("index.inCardState") }}
</div>
<div>
<el-button-group>
<el-button
type="primary"
size="mini"
@click="() => printerTypeChange('auto')"
>{{ $t("index.autoRefresh") }}</el-button
>
<el-dropdown @command="handleTypeCommand">
<el-button type="primary" size="mini"
>{{ $t("index.refreshMore")
}}<i class="el-icon-arrow-down el-icon--right"></i
></el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="item in _PrinterTypeList"
:command="item.value"
>{{ item.label }}</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</el-button-group>
</div>
</div>
</div>
</el-col>
</el-row>
</div> -->
<el-popover v-if="guideStep" :placement="guideStep[5].placement" width="250" trigger="manual" v-model="guideStep[5].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step6`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div slot="reference" :class="{ guide_body: beginStep && currentStep == 5 }" class="machines work" style="height: 130px; margin-top: 10px">
<el-table :data="infoData" max-height="180" size="mini" style="width: 100%" :empty-text="$t('index.nodata')" row-class-name="rowclass">
<el-table-column prop="gzz" :label="$t('main.tableMachine')" min-width="100">
<template slot-scope="scope">
{{ getPrintName(scope.row.PrinterID, true) }}
</template>
</el-table-column>
<el-table-column prop="status" :label="$t('main.tableState')" min-width="80">
<template slot-scope="scope">{{ $t('main.tableOnline') }}</template>
</el-table-column>
<el-table-column prop="SerialNo" :label="$t('main.tableSerialNo')" min-width="80"> </el-table-column>
<el-table-column prop="RibbonType" :label="$t('main.tableRibbonType')" min-width="80"> </el-table-column>
<el-table-column prop="RibbonAmount" :label="$t('main.tableRibbonAmount')" min-width="100">
<template slot-scope="scope">
<el-progress
:color="customColors"
:width="45"
define-back-color="#ebeef5"
:format="() => scope.row.RibbonAmount"
:stroke-width="3"
:percentage="
scope.row.RibbonAmount == undefined || scope.row.RibbonAmount == '0'
? 0
: parseFloat(((scope.row.RibbonAmount / getRibbonAmount(scope.row.ModeName, scope.row.RibbonType)) * 100).toFixed(0))
"
></el-progress>
</template>
</el-table-column>
<el-table-column prop="PrinterType" :label="$t('main.tablePrinterType')" min-width="100">
<template slot-scope="scope">
<el-dropdown trigger="click" @command="(e) => handleMachineCommand(e, scope.row.PrinterID)">
<span class="el-dropdown-link" style="color: #000; font-size: 12px"> {{ scope.row.PrinterType }}<i class="el-icon-arrow-down el-icon--right"></i> </span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="auto">
<span style="color: #000; font-size: 12px">{{ $t('main.autoSetting') }}</span>
</el-dropdown-item>
<el-dropdown-item command="null">
<span style="color: #000; font-size: 12px">{{ $t('main.cancelSetting') }}</span>
</el-dropdown-item>
<el-dropdown-item v-for="item in _PrinterTypeList" :key="item.value" :command="item.value">
<span style="color: #000; font-size: 12px">{{ item.label }}</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
<el-table-column prop="PrinterRemaCapa" :label="$t('main.tablePrinterRemaCapa')" min-width="100">
<template slot-scope="scope">
<el-progress
:color="customColors"
:width="45"
define-back-color="#ebeef5"
:format="() => (scope.row.PrinterRemaCapa > 0 ? scope.row.PrinterRemaCapa : 0)"
:stroke-width="3"
:percentage="
scope.row.PrinterRemaCapa == undefined || scope.row.PrinterRemaCapa == '0'
? 0
: parseFloat((((scope.row.PrinterRemaCapa > 0 ? scope.row.PrinterRemaCapa : 0) / getPrinterRemaCapaAmount(scope.row.ModeName)) * 100).toFixed(0))
"
></el-progress>
</template>
</el-table-column>
</el-table>
</div>
</el-popover>
<el-popover v-if="guideStep" :placement="guideStep[6].placement" width="250" trigger="manual" v-model="guideStep[6].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step7`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div slot="reference" :class="{ guide_body: beginStep && currentStep == 6 }">
<el-tabs v-model="activeName" style="background-color: #fff; padding-bottom: 20px; max-height: 240px; margin-top: 10px 20px">
<el-tab-pane :label="$t(`index.workList`)" name="first">
<div class="work">
<el-table :data="tasks" max-height="180" style="width: 100%" size="mini" :empty-text="$t('index.nodata')" row-class-name="rowclass">
<el-table-column label="#" min-width="38">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="jId" :label="$t('index.wordID')" min-width="130"> </el-table-column>
<el-table-column prop="DataSource" :label="$t('index.wordOrigin')" min-width="85"> </el-table-column>
<el-table-column :label="$t('index.wordSpace')" min-width="60">
<template slot-scope="scope">
{{ getPrintName(scope.row.PrinterID, true) }}
</template>
</el-table-column>
<el-table-column :label="$t('main.USBType')" min-width="90">
<template slot-scope="scope">
{{ scope.row.PrinterType }}
</template>
</el-table-column>
<el-table-column min-width="80" prop="TaskCapacity" :label="$t('main.TaskCapacity')"> </el-table-column>
<el-table-column v-if="false" prop="DataDir" :label="$t('main.taskFile')"> </el-table-column>
<el-table-column prop="CreateTime" :label="$t('index.createTime')" min-width="120"> </el-table-column>
<el-table-column
v-if="false"
prop="usb_version"
:label="$t('main.USBVersion')"
:filters="[
{ text: '2.0', value: 2 },
{ text: '3.0', value: 3 }
]"
:filter-method="filterHandler"
>
</el-table-column>
<el-table-column prop="FinishTime" :label="$t('index.finishedTime')" min-width="120"> </el-table-column>
<el-table-column prop="JobCompletion" min-width="60" :label="$t('index.finishedNumber')"> </el-table-column>
<el-table-column :label="$t('index.state')" prop="JobStatus" width="110">
<template slot-scope="scope">
<el-dropdown trigger="click" @command="(e) => handleTaskCommand(e, scope.row.JobID)" :disabled="scope.row.JobStatus != 'Fail'">
<span class="el-dropdown-link" style="color: #000; font-size: 12px">
{{ jobState(scope.row.JobStatus) }}
<i class="el-icon-arrow-down el-icon--right" v-if="scope.row.JobStatus == 'Fail'"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="refresh">
<span style="color: #000; font-size: 12px">{{ $t('main.commandRefresh') }}</span>
</el-dropdown-item>
<el-dropdown-item command="delete">
<span style="color: #000; font-size: 12px">{{ $t('main.commandDelete') }}</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-progress
:color="customColors"
:width="45"
define-back-color="#ebeef5"
:stroke-width="3"
:percentage="parseFloat(scope.row.TaskPercentage.replace(`%`, ``))"
v-if="scope.row.JobStatus == `Copying`"
></el-progress>
<!-- <el-button
style="margin-left: 5px; height: 30px; width: 30px"
icon="el-icon-refresh"
circle
v-if="scope.row.JobStatus == 'Fail'"
@click="restart_job(scope.$index)"
type="primary"
size="mini"
>
</el-button>
<el-button
style="margin-left: 5px; height: 30px; width: 30px"
icon="el-icon-delete"
circle
v-if="scope.row.JobStatus == 'Fail'"
@click="remove_job(scope.$index)"
type="danger"
size="mini"
>
</el-button>
<el-button
style="margin-left: 5px; height: 30px; width: 30px"
icon="el-icon-video-pause"
circle
v-else-if="scope.row.JobStatus == 'Printing'"
@click="suspend_job(scope.$index)"
type="primary"
size="mini"
>
</el-button>
<el-button
style="margin-left: 5px; height: 30px; width: 30px"
icon="el-icon-video-play"
circle
v-else-if="scope.row.JobStatus == '暂停'"
@click="start_job(scope.$index)"
type="primary"
>
</el-button> -->
</template>
</el-table-column>
<!--<el-table-column prop="process" label="进度">
</el-table-column>
<el-table-column
prop="info"
label="信息">
</el-table-column>-->
</el-table>
</div>
</el-tab-pane>
<el-tab-pane :label="$t(`index.curLog`)" name="second">
<div class="work">
<div class="w_title">
<div class="w_right">
<el-button type="text" icon="el-icon-document-copy" v-if="isAdmin" @click="getWLogData()">
{{ $t('index.openHistoryLog') }}
</el-button>
</div>
</div>
<div class="c_log" v-html="log"></div></div
></el-tab-pane>
</el-tabs>
</div>
</el-popover>
<s-footer></s-footer>
</div>
<div class="flex_box flex_row_center top_btn2">
<img src="@/assets/images/Search_icon.png" />
<div>打开作业文件</div>
</div>
<div :span="3" style="height: 100%; width: 164px">
<div class="grid-content bg-purple right" style="overflow: hidden">
<el-popover v-if="guideStep" :placement="guideStep[3].placement" width="250" trigger="manual" v-model="guideStep[3].show">
<div class="guide_box">
<div class="guide_title">
{{ $t('guide.title') }}<span>{{ parseInt(currentStep) + 1 }}/{{ guideStep.length }}</span>
</div>
<div class="guide_desc">{{ $t(`guide.step4`) }}</div>
<div class="guide_btns">
<el-button @click="exitGuide" class="guide_btn1" size="mini" type="text">{{ $t('guide.skip') }}</el-button>
<el-button v-if="parseInt(currentStep) > 0" @click="prevStep" class="guide_btn1" size="mini">{{ $t('guide.prev') }}</el-button>
<el-button @click="nextStep" class="guide_btn2" size="mini" type="primary">{{ currentStep == guideStep.length - 1 ? $t('guide.complete') : $t('guide.next') }}</el-button>
</div>
</div>
<div class="title" slot="reference" :class="{ guide_body: beginStep && currentStep == 3 }">
{{ $t('index.notice') }}
<!--<div class="log" v-for="(item, index) of infoData.sysLogs">
{{ item }}
</div>-->
</div>
</el-popover>
<warnCard v-for="item of errList" :data="item" @ok="okWarning" v-if="item.show" />
</div>
<div class="flex_box flex_row_center top_btn2">
<img src="@/assets/images/Setting_icon.png" />
<div>系统设置</div>
</div>
<div class="top_left_line"></div>
<el-switch
class="top_left_status"
v-model="workStatus"
active-color="#07C160"
inactive-color="#aaa">
</el-switch>
<div class="flex_box top_left_option">
<div class="top_left_text">完成拷贝数:</div>
<div class="top_left_num">9</div>
</div>
<div class="flex_box top_left_option">
<div class="top_left_text">废弃拷贝数:</div>
<div class="top_left_num top_left_num1">2</div>
</div>
<div class="flex_box top_left_option">
<div class="top_left_text">错误:</div>
<div class="top_left_num">0</div>
</div>
<div class="top_left_line"></div>
</div>
<div v-if="dialogVisible">
<el-dialog :visible.sync="dialogVisible" width="1200px" :destroy-on-close="true" :close-on-click-modal="false" :title="$t('index.newWork')">
<work
:dice="DualSide == 1 ? 2 : 1"
@jobPost="closeWork"
@addError="addError"
:isNew="isNew"
:saveWorkList="saveWorkList"
:printerList="infoData"
:shareDisk="shareDisk"
:isCopy="isLocal"
:filterPassedType="filterPassedType"
:sizeType="_PrinterTypeList"
>
</work>
</el-dialog>
<div @click="goOut" class="flex_box top_right">
<div class="top_right_name">你好admin</div>
<div class="top_right_btn">登出</div>
</div>
<div v-if="dialogNetVisible">
<el-dialog :visible.sync="dialogNetVisible" width="1200px" :destroy-on-close="true" :close-on-click-modal="false" :title="$t('index.newWork')">
<worknet :dice="DualSide == 1 ? 2 : 1" @jobPost="closeNetWork" :printerList="infoData"> </worknet>
</el-dialog>
</div>
<el-dialog :title="$t('index.entireLog')" :visible.sync="dialogWholeLog">
<div class="wLog" v-html="wlog" style="text-align: left"></div>
</el-dialog>
</div>
<!-- 开始用户引导 -->
<el-dialog class="guide_dialog" top="30vh" :show-close="false" title="温馨提示" :visible.sync="showStep" width="350px" :close-on-click-modal="false">
<div class="start_box">
<div class="start_content">欢迎使用卡树自动拷贝打印系统我们将引导您使用本系统请您耐心接受引导</div>
<div class="start_hide">
<el-checkbox v-model="hideStep">我已熟悉系统不再显示引导</el-checkbox>
</div>
<div class="start_btn">
<el-button @click="startStep" type="primary">开始引导</el-button>
</div>
</div>
</el-dialog>
<div class="device_box">
</div>
</div>
</template>
@@ -641,22 +52,114 @@ import { mapGetters } from 'vuex'
export default {
name: 'dashboard',
data() {
return {
workStatus: true
}
},
computed: {
...mapGetters(['name', 'roles'])
},
methods: {
goOut() {
this.$store.dispatch('FedLogOut').then(() => {
location.reload()// In order to re-instantiate the vue-router object to avoid bugs
})
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.dashboard-container {
position: fixed;
height: 100%;
width: 100%;
.login_bg {
position: absolute;
width: 100%;
height: 100%;
z-index: 1;
.container_box {
min-height: 100vh;
background-color: #F8F8F8;
.top_box {
height: 90px;
padding: 0 48px;
background-color: #ffffff;
.top_left {
.top_btn1 {
padding: 0 24px;
height: 45px;
background: #00C325;
border-radius: 6px;
margin-right: 24px;
font-weight: 500;
font-size: 21px;
color: #FFFFFF;
img {
width: 27px;
height: 27px;
margin-right: 12px;
}
}
.top_btn2 {
padding: 0 24px;
height: 45px;
background: rgba(0,195,37,0.12);
border: 2px solid rgba(0,195,37,0.32);
border-radius: 6px;
margin-right: 24px;
font-weight: 500;
font-size: 21px;
color: #00C325;
img {
width: 27px;
height: 27px;
margin-right: 12px;
}
}
.top_left_line {
width: 2px;
height: 45px;
background: #E0E0E0;
margin: 0 24px;
}
.top_left_status {
padding: 0 24px;
transform: scale(1.6);
}
.top_left_option {
margin-left: 24px;
.top_left_text {
font-weight: 500;
font-size: 21px;
color: #000000;
text-decoration: underline;
}
.top_left_num {
padding: 0 14px;
height: 36px;
background: #00C325;
border-radius: 6px;
font-weight: 500;
font-size: 21px;
color: #FFFFFF;
line-height: 36px;
margin-left: 12px;
}
.top_left_num1 {
background: #B8B8B8;
}
}
}
.top_right {
.top_right_name {
font-weight: 500;
font-size: 21px;
color: #000000;
padding: 0 24px;
}
.top_right_btn {
font-weight: 500;
font-size: 21px;
color: #00C325;
line-height: 50px;
padding-left: 24px;
cursor: pointer;
}
}
}
}
</style>
+11 -4
View File
@@ -34,6 +34,7 @@
<script>
import { validUsername } from '@/utils/validate'
import { getToken, setToken, removeToken } from '@/utils/auth'
export default {
name: 'login',
@@ -78,12 +79,18 @@ export default {
this.$refs.loginForm.validate(valid => {
if (valid) {
this.loading = true
this.$store.dispatch('Login', this.loginForm).then(() => {
setToken('data.token')
this.$store.commit('SET_TOKEN', 'data.token')
setTimeout(() => {
this.loading = false
this.$router.push({ path: '/' })
}).catch(() => {
this.loading = false
})
}, 2000);
// this.$store.dispatch('Login', this.loginForm).then(() => {
// this.loading = false
// this.$router.push({ path: '/' })
// }).catch(() => {
// this.loading = false
// })
} else {
console.log('error submit!!')
return false
+79 -11
View File
@@ -766,6 +766,18 @@ atob@^2.1.2:
resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^10.4.20:
version "10.4.20"
resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b"
integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==
dependencies:
browserslist "^4.23.3"
caniuse-lite "^1.0.30001646"
fraction.js "^4.3.7"
normalize-range "^0.1.2"
picocolors "^1.0.1"
postcss-value-parser "^4.2.0"
autoprefixer@^6.3.1:
version "6.7.7"
resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
@@ -1994,6 +2006,16 @@ browserslist@^3.2.6:
caniuse-lite "^1.0.30000844"
electron-to-chromium "^1.3.47"
browserslist@^4.23.3:
version "4.24.2"
resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580"
integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==
dependencies:
caniuse-lite "^1.0.30001669"
electron-to-chromium "^1.5.41"
node-releases "^2.0.18"
update-browserslist-db "^1.1.1"
buffer-alloc-unsafe@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
@@ -2235,6 +2257,11 @@ caniuse-lite@^1.0.30000844:
resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001675.tgz#0c1f01fc9cc543b61839753a4c234f995588d1b9"
integrity sha512-/wV1bQwPrkLiQMjaJF5yUMVM/VdRPOCU8QZ+PmG6uW6DvYSrNY1bpwHI/3mOcUosLaJCzYDi5o91IQB51ft6cg==
caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001669:
version "1.0.30001677"
resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz#27c2e2c637e007cfa864a16f7dfe7cde66b38b5f"
integrity sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -3549,6 +3576,11 @@ electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47:
resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz#9358f514ab6eeed809a8689f4b39ea5114ae729c"
integrity sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==
electron-to-chromium@^1.5.41:
version "1.5.51"
resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.51.tgz#bb99216fed4892d131a8585a8593b00739310163"
integrity sha512-kKeWV57KSS8jH4alKt/jKnvHPmJgBxXzGUSbMd4eQF+iOsVPl7bz2KUmu6eo80eMP8wVioTfTyTzdMgM15WXNg==
electron@^2.0.4:
version "2.0.18"
resolved "https://registry.npmmirror.com/electron/-/electron-2.0.18.tgz#52f1b248c3cc013b5a870094de3b6ba5de313a0f"
@@ -3770,6 +3802,11 @@ es6-templates@^0.2.2:
recast "~0.11.12"
through "~2.3.6"
escalade@^3.2.0:
version "3.2.0"
resolved "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -4344,6 +4381,11 @@ forwarded@0.2.0:
resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
fraction.js@^4.3.7:
version "4.3.7"
resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -6533,6 +6575,11 @@ node-loader@^0.6.0:
resolved "https://registry.npmmirror.com/node-loader/-/node-loader-0.6.0.tgz#c797ef51095ed5859902b157f6384f6361e05ae8"
integrity sha512-WlUacqHqHWb383Mec656pJmAtg7EXBcijg1sovgy0tI4xevAzv8RqcRARTMlzm0HLXzy1Pdo/DMU19/fxoMnmA==
node-releases@^2.0.18:
version "2.0.18"
resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
node-sass@^4.9.2:
version "4.14.1"
resolved "https://registry.npmmirror.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
@@ -6667,7 +6714,7 @@ oauth-sign@~0.9.0:
resolved "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
object-assign@>=4.0.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
@@ -7060,7 +7107,7 @@ picocolors@^0.2.1:
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
picocolors@^1.1.0:
picocolors@^1.0.1, picocolors@^1.1.0:
version "1.1.1"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
@@ -7352,6 +7399,14 @@ postcss-ordered-values@^2.1.0:
postcss "^5.0.4"
postcss-value-parser "^3.0.1"
postcss-px-to-viewport@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/postcss-px-to-viewport/-/postcss-px-to-viewport-1.1.1.tgz#a25ca410b553c9892cc8b525cc710da47bf1aa55"
integrity sha512-2x9oGnBms+e0cYtBJOZdlwrFg/mLR4P1g2IFu7jYKvnqnH/HLhoKyareW2Q/x4sg0BgklHlP1qeWo2oCyPm8FQ==
dependencies:
object-assign ">=4.0.1"
postcss ">=5.0.2"
postcss-reduce-idents@^2.2.2:
version "2.4.0"
resolved "https://registry.npmmirror.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
@@ -7417,6 +7472,11 @@ postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^
resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss-zindex@^2.0.1:
version "2.2.0"
resolved "https://registry.npmmirror.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
@@ -7426,6 +7486,15 @@ postcss-zindex@^2.0.1:
postcss "^5.0.4"
uniqs "^2.0.0"
postcss@>=5.0.2, postcss@^8.4.14:
version "8.4.47"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
dependencies:
nanoid "^3.3.7"
picocolors "^1.1.0"
source-map-js "^1.2.1"
postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
version "5.2.18"
resolved "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
@@ -7453,15 +7522,6 @@ postcss@^7.0.36:
picocolors "^0.2.1"
source-map "^0.6.1"
postcss@^8.4.14:
version "8.4.47"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
dependencies:
nanoid "^3.3.7"
picocolors "^1.1.0"
source-map-js "^1.2.1"
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -9316,6 +9376,14 @@ upath@^1.1.1:
resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
update-browserslist-db@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
dependencies:
escalade "^3.2.0"
picocolors "^1.1.0"
update-notifier@^3.0.0:
version "3.0.1"
resolved "https://registry.npmmirror.com/update-notifier/-/update-notifier-3.0.1.tgz#78ecb68b915e2fd1be9f767f6e298ce87b736250"