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({ return request({
url: '/system/user/profile/updatePwd', url: '/system/user/profile/updatePwd',
method: 'put', method: 'put',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: data data: data
}) })
} }

View File

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

View File

@ -18,8 +18,24 @@
<img :src="icon_feedback" class="custom-icon" @click="handleFeedBack" /> <img :src="icon_feedback" class="custom-icon" @click="handleFeedBack" />
</el-tooltip> </el-tooltip>
</div> </div>
<!-- <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" /> <img :src="userStore.avatar ? userStore.avatar : avatar_icon" class="user-avatar" />
<span class="user-nickname"> {{ userStore.name }} </span> <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"> <div class="logout_icon">
<el-tooltip class="box-item" effect="dark" content="退出" placement="bottom-start"> <el-tooltip class="box-item" effect="dark" content="退出" placement="bottom-start">
<img :src="logout_icon" class="custom-icon" @click="logout" /> <img :src="logout_icon" class="custom-icon" @click="logout" />

View File

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

View File

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

View File

@ -13,7 +13,8 @@
value-format="YYYY-MM-DD HH:mm:ss" type="date" placeholder="结束时间" @change="validateEndTime" /> value-format="YYYY-MM-DD HH:mm:ss" type="date" placeholder="结束时间" @change="validateEndTime" />
</el-form-item> </el-form-item>
<el-form-item label="类型:" v-if="!readonly"> <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" <el-option v-for="item in mediaTypes" :key="item.value" :label="item.label"
:value="item.value" /> :value="item.value" />
</el-select> </el-select>
@ -216,7 +217,14 @@ const initHistoryCharLine = () => {
_historyChar.value.setOption({ _historyChar.value.setOption({
tooltip: { tooltip: {
trigger: 'item', 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: { grid: {
left: '3%', left: '3%',
@ -304,7 +312,14 @@ const initHistoryCharBar = () => {
_historyChar.value.setOption({ _historyChar.value.setOption({
tooltip: { tooltip: {
trigger: 'item', 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: { grid: {
left: '3%', left: '3%',
@ -424,8 +439,6 @@ const getMediaPriceList = () => {
itemYDate = (convertIntTotalRegularPrice / (item.buyCycle * 7)).toFixed(2) itemYDate = (convertIntTotalRegularPrice / (item.buyCycle * 7)).toFixed(2)
} else { } else {
const repliceValue = parseInt(item.buyCycle.replace('个月', '').replace('月', '')) const repliceValue = parseInt(item.buyCycle.replace('个月', '').replace('月', ''))
console.log('会输入月份的原始值', item.buyCycle)
console.log('替换会输入月份的结果', repliceValue)
itemYDate = (convertIntTotalRegularPrice / (repliceValue * 31)).toFixed(2) itemYDate = (convertIntTotalRegularPrice / (repliceValue * 31)).toFixed(2)
} }
} }

View File

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

View File

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

View File

@ -13,7 +13,26 @@
<div class="tool-content"> <div class="tool-content">
<el-row :gutter="20" style="margin: 0 -10px 30px -10px;"> <el-row :gutter="20" style="margin: 0 -10px 30px -10px;">
<el-col :span="24"> <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" <el-upload class="my-upload-demo" drag action="#" :http-request="requestDocUpload"
:file-list="docUploadList" :before-upload="beforeDocUpload" :on-remove="removeDocUpload"> :file-list="docUploadList" :before-upload="beforeDocUpload" :on-remove="removeDocUpload">
<el-icon class="el-icon--upload"><upload-filled /></el-icon> <el-icon class="el-icon--upload"><upload-filled /></el-icon>
@ -47,6 +66,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作时间" align="center" prop="createTime" width="210" /> <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"> <el-table-column label="操作" :width="160" align="center">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.progress == 100" link type="primary" <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="right" prop="totalRegularPrice" width="120" />
<el-table-column label="总净价单位" align="center" prop="totalRegularPriceUnit" width="130" /> <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="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="makeFee" width="130" />
<el-table-column label="媒体费总价" align="right" prop="mediaFeeTotalPrice" width="130" /> <el-table-column label="媒体费总价" align="right" prop="mediaFeeTotalPrice" width="130" />
<el-table-column label="单日覆盖人流量" align="center" prop="dailyAvgPeopleFlow" width="150" /> <el-table-column label="单日覆盖人流量" align="center" prop="dailyAvgPeopleFlow" width="150" />
@ -347,6 +367,41 @@ const getTaskRecordPageList = () => {
loading.value = false 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) => { const requestDocUpload = (options) => {
@ -581,4 +636,21 @@ defineExpose({
font-size: 16px; font-size: 16px;
color: #67C23A; 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> </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> <span>{{ moment(scope.row.created_at, "ddd, DD MMM YYYY HH:mm:ss [GMT]").format('YYYY-MM-DD HH:mm:ss') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="异常信息" align="center" prop="errorMessage" width="210" />
<el-table-column label="操作" :width="160" align="center"> <el-table-column label="操作" :width="160" align="center">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.progress == 100" link type="primary" <el-button v-if="scope.row.progress == 100" link type="primary"

View File

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

View File

@ -1,7 +1,7 @@
<template> <template>
<el-form ref="userRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户昵称" prop="nickName"> <el-form-item label="用户姓名" prop="realName">
<el-input v-model="form.nickName" maxlength="30" /> <el-input v-model="form.realName" maxlength="30" />
</el-form-item> </el-form-item>
<el-form-item label="手机号码" prop="phonenumber"> <el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" maxlength="11" /> <el-input v-model="form.phonenumber" maxlength="11" />
@ -35,7 +35,7 @@ const { proxy } = getCurrentInstance()
const form = ref({}) const form = ref({})
const rules = 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"] }], 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" }], 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 => { watch(() => props.user, user => {
if (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 }) },{ immediate: true })
</script> </script>