修改新闻中心设置

main
suixy 1 month ago
parent 4f6423a988
commit 69f735c8d5

@ -0,0 +1,36 @@
import request from '@/utils/request'
// 查询新闻列表
export function listNews(query) {
return request({
url: '/portal/news/list',
method: 'get',
params: query
})
}
// 新增新闻
export function addNews(data) {
return request({
url: '/portal/news/add',
method: 'post',
data: data
})
}
// 修改新闻
export function updateNews(data) {
return request({
url: '/portal/news/update',
method: 'put',
data: data
})
}
// 删除新闻
export function deleteNews(newsId) {
return request({
url: '/portal/news/delete/' + newsId,
method: 'delete'
})
}

@ -28,7 +28,6 @@
title="跳转到"
:visible.sync="linkDialogVisible"
width="50%">
<el-cascader
style="width:40vw"
@change="pageChange"
@ -74,9 +73,7 @@ export default {
this.linkDialogVisible = true
this.linkDialogForm = e || {}
this.index = index
console.log(e)
},
pageChange(e) {
this.linkDialogForm.toLink = e
this.$props.data.list[this.index].toLink = e

@ -6,6 +6,7 @@
<!-- <el-menu-item index="2">关于海威</el-menu-item>-->
<el-menu-item index="3">行业方案</el-menu-item>
<el-menu-item index="4">产品中心</el-menu-item>
<el-menu-item index="6">新闻列表</el-menu-item>
<!-- <el-menu-item index="5">联系我们</el-menu-item>-->
</el-menu>
<router-view></router-view>
@ -22,16 +23,30 @@ export default {
'3': {path: '/industrySolutionsEdit',},
'4': {path: '/productCenterEdit'},
'5': {path: '/serviceSupportEdit'},
'6': {path: '/newsList'},
}
};
},
mounted() {
this.syncActiveIndex();
},
watch: {
$route() {
this.syncActiveIndex();
}
},
methods: {
syncActiveIndex() {
const pathActiveIndexMap = {
'/indexEdit': '1',
'/contactUsEdit': '2',
'/industrySolutionsEdit': '3',
'/productCenterEdit': '4',
'/serviceSupportEdit': '5',
'/newsList': '6',
};
this.activeIndex = pathActiveIndexMap[this.$route.path] || '1';
},
handleSelect(key) {
const target = this.menuRouteMap[key];
if (!target) {

@ -32,6 +32,10 @@ export default new Router({
path: '/serviceSupportEdit',
component: () => import('@/views/productCenter/edit/index.vue'),
},
{
path: '/newsList',
component: () => import('@/views/otherEdit/newsList.vue'),
},
]
},
{

@ -70,7 +70,6 @@
小图轮播图
</div>
</el-card>
<el-card shadow="hover" style="width: 200px;display: inline-block;height:70px">
<div style="width: 100%;height: 100%" @click="addItem(1)">
图标 +文字+内容横铺4个

@ -5,7 +5,7 @@
<IndexSwiper :data="components ||{}"/>
<ClassicCase class="classicCase" :data="components ||{}"/>
<ProductCenter class="productCenter" :data="components ||{}"/>
<NewCenter class="productCenter" :data="components ||{}"/>
<!-- <NewCenter class="productCenter" :data="components ||{}"/>-->
</div>
</template>
<script>

@ -11,8 +11,8 @@
</template>
<script>
import {VueEditor} from "vue2-editor";
import {getHwWeb, updateHwWeb} from "@/api/hwWeb";
import axios from "axios";
import {listNews, updateNews} from "@/api/news";
export default {
name: 'NewsEdit',
@ -20,22 +20,49 @@ export default {
data() {
return {
newsData: "",
indexData: {},
newsIndex: -1
newsJsonObject: {
html: ''
},
newsForm: {
newsId: '',
newsCode: '',
newsJson: ''
}
}
},
mounted() {
console.log(this.$route.query)
this.getData()
},
methods: {
parseNewsJson(newsJson) {
if (!newsJson) {
return {html: ''}
}
if (typeof newsJson === 'object') {
return newsJson
}
try {
return JSON.parse(newsJson)
} catch (e) {
return {html: newsJson}
}
},
getData() {
getHwWeb(-1).then(res => {
this.indexData = JSON.parse(res?.data?.webJsonString || '{}')
let data = this.indexData?.news
this.newsIndex = (data || []).findIndex(e => e.id == this.$route.query.id)
this.newsData = this.newsIndex > -1 ? data[this.newsIndex].detail || '' : ''
console.log(data[this.newsIndex])
const newsId = this.$route.query.newsId
if (!newsId) {
return
}
listNews({newsId}).then(res => {
const list = res.rows || res.data || []
const current = list.find(item => `${item.newsId}` === `${newsId}`) || list[0] || {}
const parsedNewsJson = this.parseNewsJson(current.newsJson)
this.newsJsonObject = parsedNewsJson
this.newsForm = {
newsId: current.newsId || newsId,
newsCode: current.newsCode || this.$route.query.newsCode || '',
newsJson: JSON.stringify(parsedNewsJson)
}
this.newsData = parsedNewsJson.html || ''
})
},
handleImageAdded(file, Editor, cursorLocation, resetUploader) {
@ -59,14 +86,21 @@ export default {
});
},
save() {
if (this.newsIndex === -1) {
if (!this.newsForm.newsId) {
return
}
this.$set(this.indexData.news[this.newsIndex], "detail", this.newsData);
console.log(JSON.stringify(this.indexData));
updateHwWeb({
webCode: '-1',
webJsonString: JSON.stringify(this.indexData),
const backup = JSON.parse(JSON.stringify(this.newsJsonObject || {}))
const nextNewsJson = {
...this.newsJsonObject,
designBackup: backup,
html: this.newsData
}
this.newsJsonObject = nextNewsJson
this.newsForm.newsJson = JSON.stringify(nextNewsJson)
updateNews({
newsId: this.newsForm.newsId,
newsCode: this.newsForm.newsCode,
newsJson: this.newsForm.newsJson,
}).then(res => {
if (res.code == 200) {
this.$message({

@ -0,0 +1,90 @@
<template>
<div>
<el-button type="primary" plain @click="save" style="z-index: 99;;position: fixed;top: 1px;right: 1px">保存
</el-button>
<vue-editor
ref="editor"
v-model="newsData"
:useCustomImageHandler="true"
@image-added="handleImageAdded"/>
</div>
</template>
<script>
import {VueEditor} from "vue2-editor";
import {getHwWeb, updateHwWeb} from "@/api/hwWeb";
import axios from "axios";
export default {
name: 'NewsEdit',
components: {VueEditor},
data() {
return {
newsData: "",
indexData: {},
newsIndex: -1
}
},
mounted() {
console.log(this.$route.query)
this.getData()
},
methods: {
getData() {
getHwWeb(-1).then(res => {
this.indexData = JSON.parse(res?.data?.webJsonString || '{}')
let data = this.indexData?.news
this.newsIndex = (data || []).findIndex(e => e.id == this.$route.query.id)
this.newsData = this.newsIndex > -1 ? data[this.newsIndex].detail || '' : ''
console.log(data[this.newsIndex])
})
},
handleImageAdded(file, Editor, cursorLocation, resetUploader) {
let formData = new FormData();
formData.append("file", file);
axios({
url: process.env.VUE_APP_BASE_API + "/file/upload",
method: "POST",
data: formData,
headers: {
"Content-Type": "multipart/form-data"
}
})
.then(result => {
const url = result.data.data.url;
Editor.insertEmbed(cursorLocation, "image", url);
resetUploader();
})
.catch(err => {
console.log(err);
});
},
save() {
if (this.newsIndex === -1) {
return
}
this.$set(this.indexData.news[this.newsIndex], "detail", this.newsData);
console.log(JSON.stringify(this.indexData));
updateHwWeb({
webCode: '-1',
webJsonString: JSON.stringify(this.indexData),
}).then(res => {
if (res.code == 200) {
this.$message({
message: '保存成功',
type: 'success'
});
} else {
this.$message({
message: '保存失败',
type: 'error'
});
}
})
}
}
}
</script>
<style scoped>
</style>

@ -0,0 +1,423 @@
<template>
<div class="news-list-page">
<div class="toolbar">
<el-input
v-model="queryParams.newsCode"
placeholder="请输入新闻编码"
clearable
size="small"
style="width: 240px"
@keyup.enter.native="getList"/>
<el-button type="primary" size="small" @click="getList"></el-button>
<el-button size="small" @click="resetQuery"></el-button>
<el-button type="success" size="small" @click="openDialog()"></el-button>
</div>
<el-table :data="newsList" border v-loading="loading" :row-class-name="getRowClassName">
<el-table-column prop="newsId" label="ID" width="100"/>
<el-table-column prop="newsCode" label="新闻编码" width="180"/>
<el-table-column prop="year" label="年" width="90"/>
<el-table-column prop="month" label="月" width="90"/>
<el-table-column prop="day" label="日" width="90"/>
<el-table-column prop="title" label="标题" min-width="180" show-overflow-tooltip/>
<el-table-column prop="tag" label="标签" width="120" show-overflow-tooltip/>
<el-table-column prop="type" label="类型" width="120" show-overflow-tooltip/>
<el-table-column label="头图" width="120">
<template slot-scope="scope">
<el-image
v-if="scope.row.cover"
:src="scope.row.cover"
:preview-src-list="[scope.row.cover]"
fit="cover"
class="cover-preview"/>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column prop="summary" label="简介" min-width="220" show-overflow-tooltip/>
<el-table-column label="首页显示" width="120">
<template slot-scope="scope">
{{ scope.row.field1 ? '是' : '否' }}
</template>
</el-table-column>
<el-table-column prop="field2" label="首页顺序" width="120"/>
<el-table-column label="关于海威显示" width="140">
<template slot-scope="scope">
{{ scope.row.field3 ? '是' : '否' }}
</template>
</el-table-column>
<el-table-column prop="field4" label="关于海威顺序" width="140"/>
<el-table-column label="操作" width="320" fixed="right">
<template slot-scope="scope">
<el-button type="text" size="small" @click="openDialog(scope.row)"></el-button>
<el-button type="text" size="small" @click="goDesign(scope.row)"></el-button>
<el-button type="text" size="small" style="color: #f56c6c" @click="handleDelete(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="640px">
<el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-form-item label="新闻编码" prop="newsCode">
<el-input v-model="form.newsCode" maxlength="100" show-word-limit/>
</el-form-item>
<el-form-item label="年" prop="year">
<el-input v-model="form.year"/>
</el-form-item>
<el-form-item label="月" prop="month">
<el-input v-model="form.month"/>
</el-form-item>
<el-form-item label="日" prop="day">
<el-input v-model="form.day"/>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="form.title"/>
</el-form-item>
<el-form-item label="标签" prop="tag">
<el-input v-model="form.tag"/>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="form.type" placeholder="请选择类型" style="width: 100%">
<el-option label="选项1" :value="1"/>
<el-option label="选项2" :value="2"/>
<el-option label="选项3" :value="3"/>
</el-select>
</el-form-item>
<el-form-item label="头图" prop="cover">
<div class="cover-upload">
<UploadEl :data="form" field="cover"/>
</div>
</el-form-item>
<el-form-item label="简介" prop="summary">
<el-input v-model="form.summary" type="textarea" :rows="4" maxlength="2000" show-word-limit/>
</el-form-item>
<el-form-item label="是否首页显示" prop="field1">
<el-switch v-model="form.field1"/>
</el-form-item>
<el-form-item label="首页显示顺序" prop="field2">
<el-input-number v-model="form.field2" :min="0" :step="1" controls-position="right"/>
</el-form-item>
<el-form-item label="是否关于海威显示" prop="field3">
<el-switch v-model="form.field3"/>
</el-form-item>
<el-form-item label="关于海威显示顺序" prop="field4">
<el-input-number v-model="form.field4" :min="0" :step="1" controls-position="right"/>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" :loading="submitLoading" @click="submitForm"></el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {addNews, deleteNews, listNews, updateNews} from "@/api/news";
import UploadEl from "@/components/editEl/uploadEl.vue";
function createDefaultForm() {
return {
newsId: '',
newsCode: '',
year: '',
month: '',
day: '',
title: '',
tag: '',
type: 1,
cover: '',
summary: '',
field1: false,
field2: 0,
field3: false,
field4: 0,
newsJsonObject: {
html: '',
year: '',
month: '',
day: '',
title: '',
tag: '',
type: 1,
cover: '',
summary: '',
field1: false,
field2: 0,
field3: false,
field4: 0
}
}
}
export default {
name: 'NewsList',
components: {UploadEl},
data() {
return {
loading: false,
submitLoading: false,
dialogVisible: false,
isEdit: false,
dialogTitle: '新增新闻',
queryParams: {
newsCode: ''
},
newsList: [],
form: createDefaultForm(),
rules: {
newsCode: [
{
required: true,
message: '请输入新闻编码',
trigger: 'blur'
}
]
}
}
},
mounted() {
this.getList();
},
methods: {
parseNewsJson(newsJson) {
if (!newsJson) {
return {}
}
if (typeof newsJson === 'object') {
return newsJson
}
try {
return JSON.parse(newsJson)
} catch (e) {
return {}
}
},
normalizeBoolean(value) {
return value === true || value === 'true' || value === 1 || value === '1';
},
normalizeNumber(value) {
const num = Number(value);
return Number.isFinite(num) ? num : 0;
},
sortNewsList(list) {
return [...list].sort((a, b) => {
const aBoth = a.field1 && a.field3;
const bBoth = b.field1 && b.field3;
if (aBoth !== bBoth) {
return aBoth ? -1 : 1;
}
if (aBoth && bBoth) {
if (a.field2 !== b.field2) {
return a.field2 - b.field2;
}
if (a.field4 !== b.field4) {
return a.field4 - b.field4;
}
}
if (a.field1 !== b.field1) {
return a.field1 ? -1 : 1;
}
if (a.field1 && b.field1 && a.field2 !== b.field2) {
return a.field2 - b.field2;
}
if (a.field3 !== b.field3) {
return a.field3 ? -1 : 1;
}
if (a.field3 && b.field3 && a.field4 !== b.field4) {
return a.field4 - b.field4;
}
return Number(a.newsId || 0) - Number(b.newsId || 0);
});
},
getList() {
this.loading = true;
listNews(this.queryParams).then(res => {
const list = res.rows || res.data || [];
const mappedList = list.map(item => {
const newsJsonObject = this.parseNewsJson(item.newsJson)
return {
...item,
year: newsJsonObject.year || '',
month: newsJsonObject.month || '',
day: newsJsonObject.day || '',
title: newsJsonObject.title || '',
tag: newsJsonObject.tag || '',
type: newsJsonObject.type || 1,
cover: newsJsonObject.cover || '',
summary: newsJsonObject.summary || '',
field1: this.normalizeBoolean(newsJsonObject.field1),
field2: this.normalizeNumber(newsJsonObject.field2),
field3: this.normalizeBoolean(newsJsonObject.field3),
field4: this.normalizeNumber(newsJsonObject.field4),
}
});
this.newsList = this.sortNewsList(mappedList);
}).finally(() => {
this.loading = false;
})
},
resetQuery() {
this.queryParams = {
newsCode: ''
};
this.getList();
},
resetForm() {
this.form = createDefaultForm();
if (this.$refs.form) {
this.$refs.form.resetFields();
}
},
openDialog(row) {
this.resetForm();
if (row) {
this.isEdit = true;
this.dialogTitle = '编辑新闻';
const newsJsonObject = this.parseNewsJson(row.newsJson)
this.form = {
...createDefaultForm(),
...row,
year: newsJsonObject.year || '',
month: newsJsonObject.month || '',
day: newsJsonObject.day || '',
title: newsJsonObject.title || '',
tag: newsJsonObject.tag || '',
type: newsJsonObject.type || 1,
cover: newsJsonObject.cover || '',
summary: newsJsonObject.summary || '',
field1: this.normalizeBoolean(newsJsonObject.field1),
field2: this.normalizeNumber(newsJsonObject.field2),
field3: this.normalizeBoolean(newsJsonObject.field3),
field4: this.normalizeNumber(newsJsonObject.field4),
newsJsonObject: {
...createDefaultForm().newsJsonObject,
...newsJsonObject
}
};
} else {
this.isEdit = false;
this.dialogTitle = '新增新闻';
}
this.dialogVisible = true;
},
submitForm() {
this.$refs.form.validate(valid => {
if (!valid) {
return;
}
this.submitLoading = true;
const payload = {
newsId: this.form.newsId,
newsCode: this.form.newsCode,
newsJson: JSON.stringify({
...this.form.newsJsonObject,
year: this.form.year,
month: this.form.month,
day: this.form.day,
title: this.form.title,
tag: this.form.tag,
type: this.form.type,
cover: this.form.cover,
summary: this.form.summary,
field1: this.form.field1,
field2: this.form.field2,
field3: this.form.field3,
field4: this.form.field4,
})
}
const request = this.isEdit ? updateNews(payload) : addNews(payload);
request.then(res => {
if (res.code === 200) {
this.$message.success(this.isEdit ? '修改成功' : '新增成功');
this.dialogVisible = false;
this.getList();
} else {
this.$message.error(res.msg || '操作失败');
}
}).finally(() => {
this.submitLoading = false;
})
})
},
handleDelete(row) {
this.$confirm(`确认删除新闻「${row.newsCode}」吗?`, '提示', {
type: 'warning'
}).then(() => {
return deleteNews(row.newsId || row.newsCode);
}).then(res => {
if (res.code === 200) {
this.$message.success('删除成功');
this.getList();
} else {
this.$message.error(res.msg || '删除失败');
}
}).catch(() => {
})
},
goDesign(row) {
this.$router.push({
path: '/newsEdit',
query: {
newsId: row.newsId,
newsCode: row.newsCode
}
})
},
getRowClassName({row}) {
if (row.field1 && row.field3) {
return 'row-both-top';
}
if (row.field1) {
return 'row-home-top';
}
if (row.field3) {
return 'row-about-top';
}
return '';
}
}
}
</script>
<style scoped lang="less">
.news-list-page {
padding: 16px;
text-align: left;
}
.toolbar {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
}
/deep/ .el-table .row-home-top {
background-color: #fff7e6;
}
/deep/ .el-table .row-about-top {
background-color: #f0f9eb;
}
/deep/ .el-table .row-both-top {
background-color: #ecf5ff;
}
.cover-preview {
width: 56px;
height: 56px;
object-fit: cover;
border-radius: 4px;
display: block;
}
.cover-upload {
width: 160px;
height: 120px;
}
</style>

@ -3,10 +3,6 @@
<el-button @click="save" class="save" type="primary"> </el-button>
<div class="banner">
<UploadEl field="banner" :data="pageData.productList.find(e=>e.id===tabsActive)"/>
<!-- <el-image-->
<!-- style="width: 100%; height: 100%;position:absolute;top: 0;left: 0;"-->
<!-- :src="pageData.banner"-->
<!-- fit="contain"></el-image>-->
<div class="bannerInfo">{{ pageData.bannerTitle }}</div>
</div>
@ -62,7 +58,6 @@ export default {
return item
})
this.pageData = pageData
console.log(pageData)
})
selectMenuTree().then(e => {
let tabsData = e.data.find(v => v.webMenuId === 7).children
@ -87,7 +82,12 @@ export default {
this.pageData.productList.forEach(e => {
id = Math.max(id, e.id)
})
this.pageData.productList.push({id: id + 1, banner: '', list: [], name: '新分类'})
this.pageData.productList.push({
id: id + 1,
banner: '',
list: [],
name: '新分类'
})
},
save() {
updateHwWeb({
@ -187,6 +187,7 @@ export default {
}
}
}
.contactUs {
width: 100%;
background-color: #2e445c;

Loading…
Cancel
Save