Compare commits

...

4 Commits

Author SHA1 Message Date
wangchengming
9f2acfee68 添加时间显示 2025-11-02 20:46:30 +08:00
wangchengming
063ab62109 去除日志输出 2025-11-01 23:10:48 +08:00
wangchengming
cc4bbc4dbe 对接媒体导出接口 2025-11-01 23:09:47 +08:00
wangchengming
687b196fbe 添加个人重置密码 2025-10-30 20:10:40 +08:00
19 changed files with 499 additions and 103 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -97,6 +97,7 @@ export function updateUserPwd(oldPassword, newPassword) {
return request({
url: '/system/user/profile/updatePwd',
method: 'put',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: data
})
}

View File

@ -1175,7 +1175,9 @@ h6 {
.myInsertForm .el-tabs__item.is-active,
.myDetailForm .el-tabs__item.is-active,
.my_dialog .el-tabs__item.is-active,
.el-tabs__item:hover {
.myInsertForm .el-tabs__item:hover,
.myDetailForm .el-tabs__item:hover,
.my_dialog .el-tabs__item:hover {
font-family: Microsoft YaHei;
font-weight: 600;
font-size: 22px;

View File

@ -18,8 +18,24 @@
<img :src="icon_feedback" class="custom-icon" @click="handleFeedBack" />
</el-tooltip>
</div>
<img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" />
<span class="user-nickname"> {{ userStore.name }} </span>
<!-- <img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" /> -->
<el-dropdown @command="handleCommand" class="avatar-container right-menu-item hover-effect" trigger="hover">
<div class="avatar-wrapper">
<img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" />
<span class="user-nickname"> {{ userStore.name }} </span>
</div>
<template #dropdown>
<el-dropdown-menu>
<router-link to="/user/profile">
<el-dropdown-item>个人中心</el-dropdown-item>
</router-link>
<!-- <el-dropdown-item divided command="logout">
<span>退出登录</span>
</el-dropdown-item> -->
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="logout_icon">
<el-tooltip class="box-item" effect="dark" content="退出" placement="bottom-start">
<img :src="logout_icon" class="custom-icon" @click="logout" />
@ -70,10 +86,10 @@ import useSettingsStore from '@/store/modules/settings'
import { addSysReaddBusProblemFeedbackgion } from "@/api/problemFeedback"
const appStore = useAppStore()
const userStore = useUserStore()
const userStore = useUserStore()
const settingsStore = useSettingsStore()
const { proxy } = getCurrentInstance()
function toggleSideBar() {
appStore.toggleSideBar()
}

View File

@ -15,8 +15,8 @@ const useSettingsStore = defineStore(
state: () => ({
title: '',
theme: storageSetting.theme || '#409EFF',
sideTheme: storageSetting.sideTheme || sideTheme,
showSettings: showSettings,
sideTheme: 'theme-light', //storageSetting.sideTheme || sideTheme,
showSettings: false, //showSettings,
topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView,
tagsIcon: storageSetting.tagsIcon === undefined ? tagsIcon : storageSetting.tagsIcon,
@ -25,7 +25,7 @@ const useSettingsStore = defineStore(
dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle,
footerVisible: storageSetting.footerVisible === undefined ? footerVisible : storageSetting.footerVisible,
footerContent: footerContent,
isDark: isDark.value
isDark: false, // isDark.value
}),
actions: {
// 修改布局设置
@ -42,8 +42,8 @@ const useSettingsStore = defineStore(
},
// 切换暗黑模式
toggleTheme() {
this.isDark = !this.isDark
toggleDark()
// this.isDark = !this.isDark
// toggleDark()
}
}
})

View File

@ -34,7 +34,7 @@
</el-checkbox-group>
</el-tab-pane>
<el-tab-pane label="媒体报价信息" name="second">
<el-button-group class="mb10">
<el-button-group class="exportGroup mb10">
<el-button v-for="(item, index) in ToolOptions" :key="index"
:type="activeIndex === index ? 'primary' : 'default'" @click="handleChangeType(index)">
{{ item }}
@ -81,6 +81,170 @@ const exportOpen = ref(false)
const activeName = ref('first')
const curDeptIds = ref(null)
//
const ysBaseFild = ref([
{
displayName: "媒体名称",
propertyPath: "mediaName"
},
{
displayName: "媒体类型",
propertyPath: "mediaTypeStr"
},
{
displayName: "媒体大类",
propertyPath: "mediaCategoryStr"
},
{
displayName: "展示形式",
propertyPath: "displayFormStr"
},
{
displayName: "是否照明",
propertyPath: "hasLighting"
},
{
displayName: "播放时间",
propertyPath: "playbackTime"
},
{
displayName: "媒体尺寸",
propertyPath: "mediaSize"
},
{
displayName: "MR",
propertyPath: "mr"
},
{
displayName: "日均车流量",
propertyPath: "dailyAvgVehicleFlow"
},
{
displayName: "媒体朝向",
propertyPath: "mediaOrientation"
},
{
displayName: "省",
propertyPath: "provinceName"
},
{
displayName: "市",
propertyPath: "cityName"
},
{
displayName: "区",
propertyPath: "areaName"
},
{
displayName: "镇",
propertyPath: "townName"
},
{
displayName: "商圈",
propertyPath: "businessDistrictName"
},
{
displayName: "地址",
propertyPath: "address"
},
{
displayName: "纬度",
propertyPath: "mapY"
},
{
displayName: "经度",
propertyPath: "mapX"
},
{
displayName: "最小购买周期",
propertyPath: "minPurchaseCycle"
},
{
displayName: "首次制作安装费",
propertyPath: "firstInstallFee"
},
{
displayName: "换刊制作安装费",
propertyPath: "changeInstallFee"
},
{
displayName: "状态",
propertyPath: "state"
},
{
displayName: "作废原因",
propertyPath: "invalidReason"
},
{
displayName: "业务部门",
propertyPath: "dataScopeDeptName"
}
])
//
const wlBaseFild = ref([
{
displayName: "媒体名称",
propertyPath: "mediaName"
},
{
displayName: "媒体类型",
propertyPath: "mediaTypeStr"
},
{
displayName: "媒体大类",
propertyPath: "mediaCategoryStr"
},
{
displayName: "展示形式",
propertyPath: "displayFormStr"
},
{
displayName: "省",
propertyPath: "provinceName"
},
{
displayName: "市",
propertyPath: "cityName"
},
{
displayName: "区",
propertyPath: "areaName"
},
{
displayName: "镇",
propertyPath: "townName"
},
{
displayName: "商圈",
propertyPath: "businessDistrictName"
},
{
displayName: "地址",
propertyPath: "address"
},
{
displayName: "纬度",
propertyPath: "mapY"
},
{
displayName: "经度",
propertyPath: "mapX"
},
{
displayName: "状态",
propertyPath: "state"
},
{
displayName: "作废原因",
propertyPath: "invalidReason"
},
{
displayName: "业务部门",
propertyPath: "dataScopeDeptName"
}
])
//
const ysPriceFild = ref([
{
@ -1150,7 +1314,7 @@ const ckdxPriceFild = ref([
const exportForm = ref({
ids: undefined,
exportBaseFields: undefined,
exportPriceFields: false,
mediaTypeExport: [],
hasFiles: false
})
@ -1159,7 +1323,7 @@ const baseFieldCheckAll = ref(false)
const baseFieldIsIndeterminate = ref(false)
//
const baseFields = ref([])
const _baseFields = ref(null)
// const _baseFields = ref(null)
//
const checkedBaseFields = ref([])
@ -1195,20 +1359,88 @@ const handleCheckedBaseFieldChange = (value) => {
baseFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < baseFields.value.length
}
//
const handleCheckAllPriceFieldChange = (val) => {
const handleCheckAllPriceFieldChange = (val) => {
checkedPriceFields.value = []
if (val) {
priceFields.value.forEach(element => {
checkedPriceFields.value.push(element.propertyPath)
});
if (ToolOptions.value.length == 8) {
//
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == activeIndex.value);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = [...checkedPriceFields.value] // 使
}
}
if (ToolOptions.value.length == 7) {
let jsType = activeIndex.value + 1
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == jsType);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = [...checkedPriceFields.value] // 使
}
}
if (ToolOptions.value.length == 0) {
//
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == 0);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = [...checkedPriceFields.value] // 使
}
}
} else {
if (ToolOptions.value.length == 8) {
//
const curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == activeIndex.value);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = []
}
}
if (ToolOptions.value.length == 7) {
let jsType = activeIndex.value + 1
const curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == jsType);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = []
}
}
if (ToolOptions.value.length == 0) {
const curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == 0);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = []
}
}
}
priceFieldIsIndeterminate.value = false
//
checkPriceFieldSelectStatus()
}
//
const handleCheckedPriceFieldChange = (value) => {
const handleCheckedPriceFieldChange = (value) => {
const checkedCount = value.length
priceFieldCheckAll.value = checkedCount === priceFields.value.length
priceFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < priceFields.value.length
// exportForm
if (ToolOptions.value.length == 8) {
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == activeIndex.value);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = [...value]
}
}
if (ToolOptions.value.length == 7) {
let jsType = activeIndex.value + 1
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == jsType);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = [...value]
}
}
if (ToolOptions.value.length == 0) {
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == 0);
if (curPriceFields.length > 0) {
curPriceFields[0].exportPriceFields = [...value]
}
}
//
checkPriceFieldSelectStatus()
}
//
@ -1224,7 +1456,7 @@ const handleClick = (tab, event) => {
//
const handleSubmitExport = () => {
exportForm.value.exportBaseFields = checkedBaseFields
exportForm.value.exportPriceFields = checkedPriceFields
exportForm.value.mediaTypeExport = exportForm.value.mediaTypeExport.filter(item => item.exportPriceFields.length > 0)
exportMediaExcel(exportForm.value).then(res => {
const downLoadName = '媒体信息_' + getCurrentTime() + '.xlsx'
// a
@ -1255,20 +1487,15 @@ const getCurrentTime = () => {
//
const getMediaExcelBaseField = () => {
mediaExcelBaseField().then(res => {
if (curDeptIds.value && curDeptIds.value.length == 2) baseFields.value = res.data
else if (curDeptIds.value && curDeptIds.value.length == 1) {
if (curDeptIds.value[0] == '219') {
//
_baseFields.value = "媒体名称,媒体类型,媒体大类,展示形式,省,市,区,镇,商圈,地址,经度,纬度,状态,废除原因, 部门"
} else {
_baseFields.value = "媒体名称,媒体类型,媒体大类,展示形式,是否照明,播放时间,媒体尺寸,mr,日均车流量,媒体朝向,省,市,区,镇,商圈,地址,经度,纬度,最小购买周期,首次制作安装费,换刊制作安装费,状态,废除原因, 部门"
}
baseFields.value = [...new Set( //
res.data.filter(item => _baseFields.value.includes(item.displayName))
)];
if (curDeptIds.value && curDeptIds.value.length == 2) baseFields.value = ysBaseFild.value
else if (curDeptIds.value && curDeptIds.value.length == 1) {
if (curDeptIds.value[0] == '219') {
//
baseFields.value = wlBaseFild.value
} else {
baseFields.value = ysBaseFild.value
}
})
}
}
//
const getMediaExcelPriceField = () => {
@ -1276,93 +1503,148 @@ const getMediaExcelPriceField = () => {
ToolOptions.value = ['优势报价', '门禁', '候车厅', '道闸', '地铁', '高铁', '写字楼', '车库灯箱']
activeIndex.value = 0
priceFields.value = ysPriceFild.value
handleCheckPriceField(0)
}
else if (curDeptIds.value && curDeptIds.value.length == 1) {
if (curDeptIds.value[0] == '219') {
ToolOptions.value = ['门禁', '候车厅', '道闸', '地铁', '高铁', '写字楼', '车库灯箱']
activeIndex.value = 0
priceFields.value = mjPriceFild.value
handleCheckPriceField(1)
} else {
ToolOptions.value = []
activeIndex.value = 0
priceFields.value = ysPriceFild.value
handleCheckPriceField(0)
}
}
}
}
//
const handleCheckPriceField = (_mediaType) => {
//
const currentMediaTypeExport = [...exportForm.value.mediaTypeExport]; //
//
const filteredFields = currentMediaTypeExport.filter(item => item.type !== _mediaType);
//
const _mediaTypeArr = currentMediaTypeExport.filter(item => item.type == _mediaType);
//
if (_mediaTypeArr.length == 0) {
filteredFields.push({ type: _mediaType, exportPriceFields: [] }); // 使 push
exportForm.value.mediaTypeExport = [...filteredFields]; // ref
}
}
//
const handleChangeType = (_type) => {
activeIndex.value = _type
priceFieldCheckAll.value = false
priceFieldIsIndeterminate.value = false
//
let currentCheckedFields = []
if (ToolOptions.value.length == 8) {
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == _type);
if (curPriceFields.length > 0) {
currentCheckedFields = [...curPriceFields[0].exportPriceFields]
}
}
if (ToolOptions.value.length == 7) {
let wlType = _type + 1
let curPriceFields = exportForm.value.mediaTypeExport.filter(item => item.type == wlType);
if (curPriceFields.length > 0) {
currentCheckedFields = [...curPriceFields[0].exportPriceFields]
}
}
if (ToolOptions.value.length == 8) {
switch (_type) {
case 0:
priceFields.value = ysPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 1:
priceFields.value = mjPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 2:
priceFields.value = hctPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 3:
priceFields.value = dzPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 4:
priceFields.value = dtPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 5:
priceFields.value = gtPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 6:
priceFields.value = xzlPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 7:
priceFields.value = ckdxPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
}
handleCheckPriceField(_type)
}
if (ToolOptions.value.length == 7) {
switch (_type) {
case 0:
priceFields.value = mjPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 1:
priceFields.value = hctPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 2:
priceFields.value = dzPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 3:
priceFields.value = dtPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 4:
priceFields.value = gtPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 5:
priceFields.value = xzlPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
case 6:
priceFields.value = ckdxPriceFild.value
checkedPriceFields.value = []
checkedPriceFields.value = currentCheckedFields
break;
}
let wlType = _type + 1
handleCheckPriceField(wlType)
}
//
checkPriceFieldSelectStatus()
}
//
const checkPriceFieldSelectStatus = () => {
const checkedCount = checkedPriceFields.value.length
const totalCount = priceFields.value.length
priceFieldCheckAll.value = checkedCount === totalCount
priceFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < totalCount
}
//
const checkBaseFieldSelectStatus = () => {
const checkedCount = checkedBaseFields.value.length
const totalCount = baseFields.value.length
baseFieldCheckAll.value = checkedCount === totalCount
baseFieldIsIndeterminate.value = checkedCount > 0 && checkedCount < totalCount
}
//
const initExportExcel = (_mediaIds, _curDeptIds) => {
@ -1372,6 +1654,10 @@ const initExportExcel = (_mediaIds, _curDeptIds) => {
exportOpen.value = true
getMediaExcelBaseField()
getMediaExcelPriceField()
//
checkBaseFieldSelectStatus()
checkPriceFieldSelectStatus()
}
// \
@ -1381,24 +1667,24 @@ defineExpose({
</script>
<style lang='scss'>
.el-button-group>.el-button {
.exportGroup>.el-button {
float: left;
position: relative;
height: 38px;
border: 1px solid #DFDFDF;
background: #ffffff;
font-family: Microsoft YaHei;
font-weight: 400;
font-size: 18px;
text-align: center;
color: #000000;
height: 30px;
border: 1px solid #9C9C9C;
background: #9c9c9c1a;
}
.el-button-group>.el-button--primary {
background: #1f1f1f;
font-family: Microsoft YaHei;
font-weight: 600;
color: #FFFFFF;
border: 1px solid #1f1f1f;
.exportGroup>.el-button--primary {
background: #1a75e6;
border: 1px solid #1A75E6;
}
.exportGroup .el-button--primary:last-child {
border-left-color: #1A75E6;
}
.exportGroup .el-button--primary:first-child {
border-right-color: #1A75E6;
}
</style>

View File

@ -13,7 +13,8 @@
value-format="YYYY-MM-DD HH:mm:ss" type="date" placeholder="结束时间" @change="validateEndTime" />
</el-form-item>
<el-form-item label="类型:" v-if="!readonly">
<el-select v-model="mediaType" placeholder="请选择" style="min-width: 120px;" clearable @change="handleChangeMediaType" >
<el-select v-model="mediaType" placeholder="请选择" style="min-width: 120px;" clearable
@change="handleChangeMediaType">
<el-option v-for="item in mediaTypes" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
@ -216,7 +217,14 @@ const initHistoryCharLine = () => {
_historyChar.value.setOption({
tooltip: {
trigger: 'item',
formatter: "{b} : {c} 元/天" //
// formatter: "{b} : {c} /" //
formatter: function (params) {
//
const originalData = historyList.value; //
const time = originalData[params.dataIndex].createTime;
return `${params.name}: ${params.value} 元/天<br/>时间: ${time}`;
}
},
grid: {
left: '3%',
@ -304,7 +312,14 @@ const initHistoryCharBar = () => {
_historyChar.value.setOption({
tooltip: {
trigger: 'item',
formatter: "{b} : {c} 元/天" //
// formatter: "{b} : {c} /" //
formatter: function (params) {
//
const originalData = historyList.value; //
const time = originalData[params.dataIndex].createTime;
return `${params.name}: ${params.value} 元/天<br/>时间: ${time}`;
}
},
grid: {
left: '3%',
@ -388,7 +403,7 @@ const initHistoryCharBar = () => {
// _historyChar.value.resize()
// })
}
const handleChangeMediaType = (val) => {
const handleChangeMediaType = (val) => {
getMediaPriceList()
}
const handleChangeType = (val) => {
@ -424,8 +439,6 @@ const getMediaPriceList = () => {
itemYDate = (convertIntTotalRegularPrice / (item.buyCycle * 7)).toFixed(2)
} else {
const repliceValue = parseInt(item.buyCycle.replace('个月', '').replace('月', ''))
console.log('会输入月份的原始值', item.buyCycle)
console.log('替换会输入月份的结果', repliceValue)
itemYDate = (convertIntTotalRegularPrice / (repliceValue * 31)).toFixed(2)
}
}
@ -463,7 +476,7 @@ const validateEndTime = (val) => {
}
};
//
const initHistoryData = (_mediaId, _readonly) => {
const initHistoryData = (_mediaId, _readonly) => {
historyDataOpen.value = true
readonly.value = _readonly
nextTick(() => {

View File

@ -38,7 +38,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="媒体形式/名称" prop="business_department">
<el-form-item label="供应商/媒体形式/名称" prop="business_department">
{{ detailForm.mediaName }}
</el-form-item>
</el-col>
@ -113,7 +113,7 @@
</el-row>
<div class="splineBar" />
<el-row :gutter="30" class="my_form_row">
<el-col :span="18">
<el-col :span="12">
<el-form-item label="城市" prop="business_department">
<span v-if="detailForm.provinceName">{{ detailForm.provinceName }}</span>
<span v-if="detailForm.cityName">-{{ detailForm.cityName }}</span>
@ -121,7 +121,7 @@
<span v-if="detailForm.townName">-{{ detailForm.townName }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="12">
<el-form-item label="商圈" prop="business_department">
{{ detailForm.businessDistrictName }}
</el-form-item>

View File

@ -8,7 +8,7 @@
</el-icon>
</div>
</template>
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="160px" class="myInsertForm">
<el-form ref="ruleFormRef" :model="ruleForm" :rules="rules" label-width="180px" class="myInsertForm">
<el-collapse class="my-collapse" v-model="activeNames" @change="handleChange">
<el-collapse-item title="业务部门" name="1">
<el-row :gutter="30" class="my_form_row">
@ -31,7 +31,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="媒体形式/名称" prop="mediaName">
<el-form-item label="供应商/媒体形式/名称" prop="mediaName" >
<el-input v-model="ruleForm.mediaName" placeholder="请输入" />
</el-form-item>
</el-col>

View File

@ -13,7 +13,26 @@
<div class="tool-content">
<el-row :gutter="20" style="margin: 0 -10px 30px -10px;">
<el-col :span="24">
<div class="toolItemTitle mb20">上传文件</div>
<div class="toolItemTitle mb20">
上传文件
<el-dropdown placement="bottom">
<el-button class="downloadTemplateBtnDrow" text>下载模板</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="downloadExcelTemplate('mj')">门禁校准模板</el-dropdown-item>
<el-dropdown-item
@click="downloadExcelTemplate('hct')">候车厅校准模板</el-dropdown-item>
<el-dropdown-item @click="downloadExcelTemplate('dz')">道闸校准模板</el-dropdown-item>
<el-dropdown-item @click="downloadExcelTemplate('dt')">地铁校准模板</el-dropdown-item>
<el-dropdown-item @click="downloadExcelTemplate('gt')">高铁校准模板</el-dropdown-item>
<el-dropdown-item
@click="downloadExcelTemplate('xzl')">写字楼校准模板</el-dropdown-item>
<el-dropdown-item
@click="downloadExcelTemplate('ckdx')">车库灯箱校准模板</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
<el-upload class="my-upload-demo" drag action="#" :http-request="requestDocUpload"
:file-list="docUploadList" :before-upload="beforeDocUpload" :on-remove="removeDocUpload">
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
@ -47,6 +66,7 @@
</template>
</el-table-column>
<el-table-column label="操作时间" align="center" prop="createTime" width="210" />
<el-table-column label="异常信息" align="center" prop="errorMessage" width="210" />
<el-table-column label="操作" :width="160" align="center">
<template #default="scope">
<el-button v-if="scope.row.progress == 100" link type="primary"
@ -177,7 +197,7 @@
<el-table-column label="总净价" align="right" prop="totalRegularPrice" width="120" />
<el-table-column label="总净价单位" align="center" prop="totalRegularPriceUnit" width="130" />
<el-table-column label="底价" align="right" prop="floorPrice" width="120" />
<el-table-column label="价总" align="right" prop="minPrice" width="120" />
<el-table-column label="价总" align="right" prop="minPrice" width="120" />
<el-table-column label="制作费" align="right" prop="makeFee" width="130" />
<el-table-column label="媒体费总价" align="right" prop="mediaFeeTotalPrice" width="130" />
<el-table-column label="单日覆盖人流量" align="center" prop="dailyAvgPeopleFlow" width="150" />
@ -347,6 +367,41 @@ const getTaskRecordPageList = () => {
loading.value = false
})
}
//
const downloadExcelTemplate = (tempLateType) => {
const link = document.createElement('a')
if (tempLateType == 'mj') {
link.href = '/jzTemplate/门禁校准平台模板.xlsx'
link.download = '门禁校准平台模板.xlsx' //
}
if (tempLateType == 'hct') {
link.href = '/jzTemplate/候车厅校准平台模板.xlsx'
link.download = '候车厅校准平台模板.xlsx' //
}
if (tempLateType == 'dz') {
link.href = '/jzTemplate/道闸校准平台模板.xlsx'
link.download = '道闸校准平台模板.xlsx' //
}
if (tempLateType == 'dt') {
link.href = '/jzTemplate/地铁校准平台模板.xlsx'
link.download = '地铁校准平台模板.xlsx' //
}
if (tempLateType == 'gt') {
link.href = '/jzTemplate/高铁校准平台模板.xlsx'
link.download = '高铁校准平台模板.xlsx' //
}
if (tempLateType == 'xzl') {
link.href = '/jzTemplate/写字楼校准平台模板.xlsx'
link.download = '写字楼校准平台模板.xlsx' //
}
if (tempLateType == 'ckdx') {
link.href = '/jzTemplate/车库灯箱校准平台模板.xlsx'
link.download = '车库灯箱校准平台模板.xlsx' //
}
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}
//
const requestDocUpload = (options) => {
@ -427,7 +482,7 @@ const handleExportCalibraTionResult = () => {
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
proxy.$modal.msgSuccess("导出成功")
handleCloseModal()
})
@ -581,4 +636,21 @@ defineExpose({
font-size: 16px;
color: #67C23A;
}
.downloadTemplateBtnDrow {
width: 100px;
height: 36px;
font-family: Microsoft YaHei;
font-weight: 700;
font-size: 16px;
text-align: center;
color: #409eff !important;
background: transparent !important;
margin-top: 4px;
}
.downloadTemplateBtnDrow:hover {
background: transparent !important;
color: #409eff !important;
}
</style>

View File

@ -77,6 +77,7 @@
<span>{{ moment(scope.row.created_at, "ddd, DD MMM YYYY HH:mm:ss [GMT]").format('YYYY-MM-DD HH:mm:ss') }}</span>
</template>
</el-table-column>
<el-table-column label="异常信息" align="center" prop="errorMessage" width="210" />
<el-table-column label="操作" :width="160" align="center">
<template #default="scope">
<el-button v-if="scope.row.progress == 100" link type="primary"

View File

@ -2,11 +2,11 @@
<div class="app-container">
<el-row :gutter="20">
<el-col :span="6" :xs="24">
<el-card class="box-card">
<el-card class="box-card" style="min-height: calc(100vh - 100px);">
<template v-slot:header>
<div class="clearfix">
<span>个人信息</span>
</div>
<div class="clearfix">
<span>个人信息</span>
</div>
</template>
<div>
<div class="text-center">
@ -14,7 +14,7 @@
</div>
<ul class="list-group list-group-striped">
<li class="list-group-item">
<svg-icon icon-class="user" />用户名称
<svg-icon icon-class="user" />用户账号
<div class="pull-right">{{ state.user.userName }}</div>
</li>
<li class="list-group-item">
@ -27,7 +27,8 @@
</li>
<li class="list-group-item">
<svg-icon icon-class="tree" />所属部门
<div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>
<div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{
state.postGroup }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="peoples" />所属角色
@ -42,13 +43,13 @@
</el-card>
</el-col>
<el-col :span="18" :xs="24">
<el-card>
<el-card style="min-height: calc(100vh - 100px);">
<template v-slot:header>
<div class="clearfix">
<span>基本资料</span>
</div>
<div class="clearfix">
<span>基本资料</span>
</div>
</template>
<el-tabs v-model="selectedTab">
<el-tabs class="demo-tabs" v-model="selectedTab">
<el-tab-pane label="基本资料" name="userinfo">
<userInfo :user="state.user" />
</el-tab-pane>
@ -66,29 +67,33 @@
import userAvatar from "./userAvatar"
import userInfo from "./userInfo"
import resetPwd from "./resetPwd"
import otherbg from '@/assets/images/otherbg.png'
import { getUserProfile } from "@/api/system/user"
import { useBackgroundStore } from '@/store/modules/background'
const bgStore = useBackgroundStore()
const route = useRoute()
const selectedTab = ref("userinfo")
const state = reactive({
user: {},
roleGroup: {},
postGroup: {}
user: {},
roleGroup: {},
postGroup: {}
})
function getUser() {
getUserProfile().then(response => {
state.user = response.data
state.roleGroup = response.roleGroup
state.postGroup = response.postGroup
})
getUserProfile().then(response => {
state.user = response.data
state.roleGroup = response.roleGroup
state.postGroup = response.postGroup
})
}
onMounted(() => {
const activeTab = route.params && route.params.activeTab
if (activeTab) {
selectedTab.value = activeTab
}
getUser()
bgStore.setBgImage(otherbg)
const activeTab = route.params && route.params.activeTab
if (activeTab) {
selectedTab.value = activeTab
}
getUser()
})
</script>

View File

@ -1,7 +1,7 @@
<template>
<el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" maxlength="30" />
<el-form-item label="用户姓名" prop="realName">
<el-input v-model="form.realName" maxlength="30" />
</el-form-item>
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" maxlength="11" />
@ -35,7 +35,7 @@ const { proxy } = getCurrentInstance()
const form = ref({})
const rules = ref({
nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
realName: [{ required: true, message: "用户姓名不能为空", trigger: "blur" }],
email: [{ required: true, message: "邮箱地址不能为空", trigger: "blur" }, { type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
phonenumber: [{ required: true, message: "手机号码不能为空", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }],
})
@ -61,7 +61,7 @@ function close() {
//
watch(() => props.user, user => {
if (user) {
form.value = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
form.value = { realName: user.realName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
}
},{ immediate: true })
</script>