diff --git a/src/api/admin/advertManageApi.js b/src/api/admin/advertManageApi.js new file mode 100644 index 0000000..67dfe7f --- /dev/null +++ b/src/api/admin/advertManageApi.js @@ -0,0 +1,158 @@ +import request from '@/utils/request' + +// 获取广告列表 +export function listAdverts(params) { + return new Promise((resolve, reject) => { + request({ + url: '/advert.listAdverts', + method: 'get', + params + }).then(response => { + const res = response.data + resolve({ + data: res.adverts, + total: res.total + }) + }).catch(error => { + reject(error) + }) + }) +} + +// 添加广告 +export function saveAdvert(data) { + return new Promise((resolve, reject) => { + request({ + url: '/advert.saveAdvert', + method: 'post', + data + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || 'Failed to save advertisement')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 更新广告 +export function updateAdvert(data) { + return new Promise((resolve, reject) => { + request({ + url: '/advert.updateAdvert', + method: 'post', + data + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || 'Failed to update advertisement')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 删除广告 +export function deleteAdvert(advertId) { + return new Promise((resolve, reject) => { + request({ + url: '/advert.deleteAdvert', + method: 'post', + data: { advertId } + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res) + } else { + reject(new Error(res.msg || 'Failed to delete advertisement')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 上传文件 +export function uploadFile(data) { + return new Promise((resolve, reject) => { + request({ + url: '/uploadFile', + method: 'post', + data, + headers: { + 'Content-Type': 'multipart/form-data' + } + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res.data) + } else { + reject(new Error(res.msg || 'Failed to upload file')) + } + }).catch(error => { + reject(error) + }) + }) +} +// 获取广告详情 +export function getAdvertDetail(advertId) { + return new Promise((resolve, reject) => { + request({ + url: '/advert.getAdvertDetail', + method: 'get', + params: { advertId } + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res.data) + } else { + reject(new Error(res.msg || 'Failed to get advertisement detail')) + } + }).catch(error => { + reject(error) + }) + }) +} + +// 获取广告项列表 +export function getAdvertItems(params) { + return new Promise((resolve, reject) => { + request({ + url: '/advert.listAdvertItems', + method: 'get', + params + }).then(response => { + const res = response.data + resolve(res) + }).catch(error => { + reject(error) + }) + }) +} + +// 获取位置类型 +export function getLocationTypes() { + return new Promise((resolve, reject) => { + request({ + url: '/dict.listDict', + method: 'get', + params: { type: 'location_type_cd' } + }).then(response => { + const res = response.data + if (res.code === 0) { + resolve(res.data) + } else { + reject(new Error(res.msg || 'Failed to get location types')) + } + }).catch(error => { + reject(error) + }) + }) +} \ No newline at end of file diff --git a/src/components/admin/AddAdvert.vue b/src/components/admin/AddAdvert.vue new file mode 100644 index 0000000..5bbe15d --- /dev/null +++ b/src/components/admin/AddAdvert.vue @@ -0,0 +1,180 @@ + + + \ No newline at end of file diff --git a/src/components/admin/DeleteAdvert.vue b/src/components/admin/DeleteAdvert.vue new file mode 100644 index 0000000..ba82c6f --- /dev/null +++ b/src/components/admin/DeleteAdvert.vue @@ -0,0 +1,46 @@ + + + \ No newline at end of file diff --git a/src/components/admin/EditAdvert.vue b/src/components/admin/EditAdvert.vue new file mode 100644 index 0000000..ffd4ec0 --- /dev/null +++ b/src/components/admin/EditAdvert.vue @@ -0,0 +1,194 @@ + + + \ No newline at end of file diff --git a/src/components/admin/WriteAdvertMachine.vue b/src/components/admin/WriteAdvertMachine.vue new file mode 100644 index 0000000..40f4e70 --- /dev/null +++ b/src/components/admin/WriteAdvertMachine.vue @@ -0,0 +1,54 @@ + + + \ No newline at end of file diff --git a/src/i18n/index.js b/src/i18n/index.js index 8299fc1..f455bfd 100644 --- a/src/i18n/index.js +++ b/src/i18n/index.js @@ -102,6 +102,7 @@ import { messages as marketGoodsItemManageMessages } from '../views/market/marke import { messages as marketRuleMessages } from '../views/market/marketRuleLang' import { messages as marketBlacklistManageMessages } from '../views/market/marketBlacklistManageLang' import { messages as marketLogMessages } from '../views/market/marketLogLang' +import { messages as advertManageMessages } from '../views/admin/advertManageLang' Vue.use(VueI18n) @@ -208,6 +209,7 @@ const messages = { ...marketRuleMessages.en, ...marketBlacklistManageMessages.en, ...marketLogMessages.en, + ...advertManageMessages.en, }, zh: { ...loginMessages.zh, @@ -310,6 +312,7 @@ const messages = { ...marketRuleMessages.zh, ...marketBlacklistManageMessages.zh, ...marketLogMessages.zh, + ...advertManageMessages.zh, } } diff --git a/src/router/index.js b/src/router/index.js index 2270298..15aaa70 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -487,15 +487,20 @@ const routes = [ component: () => import('@/views/market/marketRuleList.vue') }, { - path:'/pages/admin/marketBlacklistManage', - name:'/pages/admin/marketBlacklistManage', + path: '/pages/admin/marketBlacklistManage', + name: '/pages/admin/marketBlacklistManage', component: () => import('@/views/market/marketBlacklistManageList.vue') - }, - { - path:'/pages/admin/marketLog', - name:'/pages/admin/marketLog', - component: () => import('@/views/market/marketLogList.vue') - }, + }, + { + path: '/pages/admin/marketLog', + name: '/pages/admin/marketLog', + component: () => import('@/views/market/marketLogList.vue') + }, + { + path: '/pages/property/advertManage', + name: '/pages/property/advertManage', + component: () => import('@/views/admin/advertManageList.vue') + }, // 其他子路由可以在这里添加 ] }, diff --git a/src/views/admin/advertManageLang.js b/src/views/admin/advertManageLang.js new file mode 100644 index 0000000..0adbccb --- /dev/null +++ b/src/views/admin/advertManageLang.js @@ -0,0 +1,226 @@ +export const messages = { + en: { + advertManage: { + search: { + title: 'Search Conditions', + hide: 'Hide', + more: 'More', + adNamePlaceholder: 'Please enter the advertisement name', + classifyPlaceholder: 'Please select the advertisement category', + locationPlaceholder: 'Please select the placement location' + }, + list: { + title: 'Advertisement Information', + publish: 'Publish', + viewAdvert: 'View Advertisement' + }, + table: { + advertId: 'Advertisement ID', + adName: 'Advertisement Name', + classify: 'Advertisement Category', + location: 'Placement Location', + advertType: 'Publish Type', + startTime: 'Start Time', + endTime: 'End Time', + createTime: 'Creation Time' + }, + advertType: { + site: 'Site', + outside: 'Outside', + noJump: 'No Jump' + }, + classify: { + logistics: 'Logistics', + catering: 'Catering', + travel: 'Travel', + hotel: 'Hotel', + education: 'Education', + internet: 'Internet' + }, + add: { + title: 'Publish Advertisement', + adName: 'Advertisement Name', + adNamePlaceholder: 'Required, please enter the advertisement name', + classify: 'Advertisement Category', + classifyPlaceholder: 'Required, please select the advertisement category', + locationTypeCd: 'Placement Location', + locationPlaceholder: 'Required, please select the placement location', + advertType: 'Publish Type', + advertTypePlaceholder: 'Required, please select the publish type', + pageUrl: 'Jump Path', + pageUrlPlaceholder: 'Please enter the jump path', + seq: 'Play Order', + seqPlaceholder: 'Required, please enter the play order', + startTime: 'Start Time', + startTimePlaceholder: 'Required, please select the start time', + endTime: 'End Time', + endTimePlaceholder: 'Required, please select the end time', + viewType: 'Play Method', + viewTypePlaceholder: 'Required, please select the play method', + image: 'Image (800 * 373)', + success: 'Advertisement published successfully' + }, + edit: { + title: 'Edit Advertisement', + adName: 'Advertisement Name', + adNamePlaceholder: 'Required, please enter the advertisement name', + classify: 'Advertisement Category', + classifyPlaceholder: 'Required, please select the advertisement category', + locationTypeCd: 'Placement Location', + locationPlaceholder: 'Required, please select the placement location', + advertType: 'Publish Type', + advertTypePlaceholder: 'Required, please select the publish type', + pageUrl: 'Jump Path', + pageUrlPlaceholder: 'Please enter the jump path', + seq: 'Play Order', + seqPlaceholder: 'Required, please enter the play order', + startTime: 'Start Time', + startTimePlaceholder: 'Required, please select the start time', + endTime: 'End Time', + endTimePlaceholder: 'Required, please select the end time', + viewType: 'Play Method', + viewTypePlaceholder: 'Required, please select the play method', + image: 'Image (800 * 373)', + success: 'Advertisement updated successfully' + }, + delete: { + title: 'Confirm Operation', + confirm: 'Are you sure to delete this advertisement?', + success: 'Advertisement deleted successfully' + }, + machine: { + title: 'Advertisement Device Code', + machineCode: 'Device Code', + machineCodePlaceholder: 'Required, please enter the device code', + view: 'View Advertisement' + }, + validate: { + adNameRequired: 'Advertisement name is required', + classifyRequired: 'Advertisement category is required', + locationRequired: 'Placement location is required', + advertTypeRequired: 'Publish type is required', + seqRequired: 'Play order is required', + seqNumber: 'Play order must be a number', + startTimeRequired: 'Start time is required', + endTimeRequired: 'End time is required', + viewTypeRequired: 'Play method is required', + imageRequired: 'Please upload image', + machineCodeRequired: 'Device code is required' + }, + fetchError: 'Failed to get advertisement list', + fetchLocationError: 'Failed to get location types' + } + }, + zh: { + advertManage: { + search: { + title: '查询条件', + hide: '隐藏', + more: '更多', + adNamePlaceholder: '请输入广告名称', + classifyPlaceholder: '请选择广告分类', + locationPlaceholder: '请选择投放位置' + }, + list: { + title: '广告信息', + publish: '发布', + viewAdvert: '查看广告' + }, + table: { + advertId: '广告ID', + adName: '广告名称', + classify: '广告分类', + location: '投放位置', + advertType: '发布类型', + startTime: '投放时间', + endTime: '结束时间', + createTime: '创建时间' + }, + advertType: { + site: '站内', + outside: '站外', + noJump: '不跳转' + }, + classify: { + logistics: '物流', + catering: '餐饮', + travel: '旅游', + hotel: '酒店', + education: '教育', + internet: '互联网' + }, + add: { + title: '发布广告', + adName: '广告名称', + adNamePlaceholder: '必填,请填写广告名称', + classify: '广告分类', + classifyPlaceholder: '必填,请选择广告分类', + locationTypeCd: '投放位置', + locationPlaceholder: '必填,请选择投放位置', + advertType: '发布类型', + advertTypePlaceholder: '必填,请选择发布类型', + pageUrl: '跳转路径', + pageUrlPlaceholder: '请填写跳转路径', + seq: '播放顺序', + seqPlaceholder: '必填,请填写播放顺序', + startTime: '投放时间', + startTimePlaceholder: '必填,请填写投放时间', + endTime: '结束时间', + endTimePlaceholder: '必填,请填写结束时间', + viewType: '播放方式', + viewTypePlaceholder: '必填,请选择播放方式', + image: '图片(800 * 373)', + success: '广告发布成功' + }, + edit: { + title: '修改广告', + adName: '广告名称', + adNamePlaceholder: '必填,请填写广告名称', + classify: '广告分类', + classifyPlaceholder: '必填,请选择广告分类', + locationTypeCd: '投放位置', + locationPlaceholder: '必填,请选择投放位置', + advertType: '发布类型', + advertTypePlaceholder: '必填,请选择发布类型', + pageUrl: '跳转路径', + pageUrlPlaceholder: '请填写跳转路径', + seq: '播放顺序', + seqPlaceholder: '必填,请填写播放顺序', + startTime: '投放时间', + startTimePlaceholder: '必填,请填写投放时间', + endTime: '结束时间', + endTimePlaceholder: '必填,请填写结束时间', + viewType: '播放方式', + viewTypePlaceholder: '必填,请选择播放方式', + image: '图片(800 * 373)', + success: '广告修改成功' + }, + delete: { + title: '请确认您的操作', + confirm: '确定删除发布广告?', + success: '广告删除成功' + }, + machine: { + title: '广告设备码', + machineCode: '设备编码', + machineCodePlaceholder: '必填,请填写设备编码', + view: '查看广告' + }, + validate: { + adNameRequired: 'Advertisement name is required', + classifyRequired: 'Advertisement category is required', + locationRequired: 'Placement location is required', + advertTypeRequired: 'Publish type is required', + seqRequired: 'Play order is required', + seqNumber: 'Play order must be a number', + startTimeRequired: 'Start time is required', + endTimeRequired: 'End time is required', + viewTypeRequired: 'Play method is required', + imageRequired: 'Please upload image', + machineCodeRequired: 'Device code is required' + }, + fetchError: '获取广告列表失败', + fetchLocationError: '获取位置类型失败' + } + } +} \ No newline at end of file diff --git a/src/views/admin/advertManageList.vue b/src/views/admin/advertManageList.vue new file mode 100644 index 0000000..2afbf60 --- /dev/null +++ b/src/views/admin/advertManageList.vue @@ -0,0 +1,213 @@ + + + + + \ No newline at end of file