15 changed files with 654 additions and 32 deletions
After Width: | Height: | Size: 92 KiB |
@ -0,0 +1,453 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
<base-page ref="basePage" :tableData="tableData" :searchParams="searchParams" :tableParams="tableParams" :tableUrl="tableUrl" |
||||
|
:addUrl="addUrl" :editUrl="editUrl" :delUrl="delUrl" :editAuth="editAuth" :delAuth="delAuth" :infoUrl="infoUrl" |
||||
|
:exportUrl="exportUrl" :importUrl="importUrl" :mubanUrl="mubanUrl" :editParams="editParams" |
||||
|
:editFixedParams="editFixedParams" :editElseRules="editElseRules" :editConfig="editConfig" :editParamsDiv="5" |
||||
|
:editBtnName="(item) => '修改'" :formBtnFixed="true" idName="articleId"> |
||||
|
<template v-slot:editOperateSup="{ id, formType, info }"> |
||||
|
<el-button v-if="formType == 'add'" type="warning" size="small" :disabled="draftBtnDisable" |
||||
|
@click="handleClickDraft(info)">存草稿</el-button> |
||||
|
</template> |
||||
|
|
||||
|
<template v-slot:listBtnSup="{ item }"> |
||||
|
<el-button v-if="item.statusFlag == 'published' && |
||||
|
item.agencyId == $store.state.user.agencyId |
||||
|
" @click="handleOfflineShow(item)" type="text" size="small" style="color: #666">下线</el-button> |
||||
|
</template> |
||||
|
|
||||
|
<template v-slot:listBtnbefore="{ item }"> |
||||
|
<el-button v-if="item.isTop == '1'" v-show="item.statusFlag == 'published'" |
||||
|
@click="handleCancleTopArticle(item, 'cancel_top')" type="text" size="small" |
||||
|
style="color: #fe6252">取消置顶</el-button> |
||||
|
<el-button v-show="item.statusFlag == 'published'" v-else @click="handleTopArticle(item, 'top')" type="text" |
||||
|
size="small" style="color: #22c1c3">置顶</el-button> |
||||
|
</template> |
||||
|
</base-page> |
||||
|
</div> |
||||
|
|
||||
|
</template> |
||||
|
<script> |
||||
|
import basePage from "@/views/modules/cpts/base/index"; |
||||
|
import { getItemByIdInCascader, collapse } from "@/utils/cascader"; |
||||
|
|
||||
|
import dateFormat from "dai-js/tools/dateFormat.js"; |
||||
|
|
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
offlineShowed: false, |
||||
|
|
||||
|
draftBtnDisable: false, |
||||
|
searchParams: [ |
||||
|
{ field: "文章标题", keyName: "title", type: "input" }, |
||||
|
{ |
||||
|
field: "标签", |
||||
|
keyName: "tagIds", |
||||
|
type: "select", |
||||
|
multiple: true, |
||||
|
optionUrl: "/gov/voice/tag/taglist", |
||||
|
optionUrlParams: {}, |
||||
|
optionList: [], |
||||
|
optionCook(list) { |
||||
|
return list.map((item) => ({ |
||||
|
label: item.tagName, |
||||
|
value: item.tagId, |
||||
|
})); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
field: "状态", |
||||
|
keyName: "statusFlag", |
||||
|
value: "", |
||||
|
type: "select", |
||||
|
optionUrl: "", |
||||
|
optionUrlParams: {}, |
||||
|
optionList: [ |
||||
|
{ |
||||
|
label: "已发布", |
||||
|
value: "published", |
||||
|
}, |
||||
|
{ |
||||
|
label: "已下线", |
||||
|
value: "offline", |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
field: "发布范围", |
||||
|
keyName: "publishRangeIds", |
||||
|
type: "cascader", |
||||
|
optionUrl: "/gov/org/customeragency/agencygridtree", |
||||
|
optionUrlParams: { |
||||
|
agencyId: this.$store.state.user.agencyId, |
||||
|
}, |
||||
|
optionList: [], |
||||
|
optionProps: { |
||||
|
multiple: false, |
||||
|
value: "agencyId", |
||||
|
label: "agencyName", |
||||
|
children: "subAgencyList", |
||||
|
checkStrictly: true, |
||||
|
}, |
||||
|
optionCook(obj) { |
||||
|
return [obj]; |
||||
|
}, |
||||
|
supKeys: ["publishRangeId", "publishRangeType"], |
||||
|
supValues: ["", ""], |
||||
|
handleChangeFn(vals, item) { |
||||
|
const { optionList } = item; |
||||
|
if (vals.length > 0) { |
||||
|
item["supValues"][0] = vals[vals.length - 1]; |
||||
|
item["supValues"][1] = getItemByIdInCascader( |
||||
|
optionList, |
||||
|
vals, |
||||
|
"agencyId", |
||||
|
"subAgencyList" |
||||
|
)[vals.length - 1]["level"]; |
||||
|
item["supValues"][1] = |
||||
|
item["supValues"][1] == "grid" ? "grid" : "agency"; |
||||
|
} else { |
||||
|
item["supValues"][0] = ""; |
||||
|
item["supValues"][1] = ""; |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
field: "发布时间", |
||||
|
keyName: "publishTime", |
||||
|
type: "date-range", |
||||
|
supKeys: ["startDate", "endDate"], |
||||
|
supValues: ["", ""], |
||||
|
|
||||
|
}, |
||||
|
], |
||||
|
tableParams: [ |
||||
|
{ field: "序号", keyName: "", type: "no" }, |
||||
|
{ field: "文章标题", keyName: "title", type: "text" }, |
||||
|
{ |
||||
|
field: "标签", |
||||
|
keyName: "tagNameList", |
||||
|
type: "array", |
||||
|
arrayDiv: "、", |
||||
|
}, |
||||
|
{ field: "状态", keyName: "statusFlagName", type: "text" }, |
||||
|
{ field: "发布单位", keyName: "publisherName", type: "text" }, |
||||
|
{ field: "发布时间", keyName: "publishDate", type: "text" }, |
||||
|
{ |
||||
|
field: "发布范围", |
||||
|
keyName: "publishRangeDesc", |
||||
|
type: "text", |
||||
|
}, |
||||
|
{ field: "置顶", keyName: "isTopName", type: "text" }, |
||||
|
{ field: "点赞数", keyName: "likeCount", type: "text" }, |
||||
|
{ field: "转发量", keyName: "forwardCount", type: "text" }, |
||||
|
], |
||||
|
tableUrl: "/gov/voice/article/articleListV2", |
||||
|
mubanUrl: "", |
||||
|
importUrl: "", |
||||
|
exportUrl: "", |
||||
|
|
||||
|
addUrl: "/gov/voice/article/addOrSaveDraft", |
||||
|
editUrl: "/gov/voice/article/updateArticle", |
||||
|
infoUrl: "/gov/voice/article/detailV2", |
||||
|
delUrl: "/gov/voice/article/delete批量", |
||||
|
editAuth(item) { |
||||
|
return item.statusFlagName == "已发布"; |
||||
|
}, |
||||
|
delAuth(item) { |
||||
|
return item.statusFlagName == "已下线"; |
||||
|
}, |
||||
|
|
||||
|
editParams: [ |
||||
|
{ |
||||
|
field: "文章标题", |
||||
|
keyName: "title", |
||||
|
type: "input", |
||||
|
maxlength: 50, |
||||
|
editDisabled: true, |
||||
|
rules: [ |
||||
|
{ |
||||
|
required: true, |
||||
|
message: "文章标题不能为空", |
||||
|
trigger: "blur", |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
field: "封面图片", |
||||
|
keyName: "imgArr", |
||||
|
type: "upload", |
||||
|
limit: 1, |
||||
|
listType: "picture-card", |
||||
|
editDisabled: true, |
||||
|
rules: [], |
||||
|
value: () => [], |
||||
|
uploadUrl: window.SITE_CONFIG["apiURL"] + "/oss/file/article/upload", |
||||
|
supKeys: ["imgUrlArr", "imgUrl"], |
||||
|
supValues: [() => [], ""], |
||||
|
beforeImgUpload(file, item, that) { |
||||
|
console.log(file); |
||||
|
const isLt1M = file.size / 1024 / 1024 < 10; |
||||
|
const srcType = file.type; |
||||
|
|
||||
|
if (!isLt1M) { |
||||
|
that.$message.error("上传文件大小不能超过 10MB!"); |
||||
|
return false; |
||||
|
} |
||||
|
if (srcType.indexOf("image") == -1) { |
||||
|
that.$message.error("仅限图片格式"); |
||||
|
return false; |
||||
|
} |
||||
|
return true; |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
field: "发布范围", |
||||
|
keyName: "gridIdList", |
||||
|
type: "cascader", |
||||
|
value: () => [], |
||||
|
supKeys: ["publishRangeDesc"], |
||||
|
supValues: [""], |
||||
|
optionUrl: "/gov/org/customeragency/agencygridtree", |
||||
|
optionUrlParams: { |
||||
|
agencyId: this.$store.state.user.agencyId, |
||||
|
}, |
||||
|
optionList: [], |
||||
|
optionProps: { |
||||
|
multiple: true, |
||||
|
value: "agencyId", |
||||
|
label: "agencyName", |
||||
|
children: "subAgencyList", |
||||
|
checkStrictly: false, |
||||
|
emitPath: false, |
||||
|
}, |
||||
|
optionCook(obj) { |
||||
|
return [obj]; |
||||
|
}, |
||||
|
handleChangeFn(vals, item, that) { |
||||
|
console.log("handleChangeFn", vals); |
||||
|
const { optionList } = item; |
||||
|
const optionPlaneList = collapse(optionList, "subAgencyList"); |
||||
|
if (vals.length > 0) { |
||||
|
let selectedList = vals.map( |
||||
|
(v) => |
||||
|
getItemByIdInCascader( |
||||
|
optionPlaneList, |
||||
|
[v], |
||||
|
"agencyId", |
||||
|
"subAgencyList" |
||||
|
)[0] |
||||
|
); |
||||
|
console.log("handleChangeFn", selectedList); |
||||
|
let selectedFilterList = selectedList.filter( |
||||
|
(a) => a.level == "grid" |
||||
|
); |
||||
|
that.fmData[item["keyName"]] = selectedFilterList.map( |
||||
|
(a) => a.agencyId |
||||
|
); |
||||
|
that.fmData[item["supKeys"][0]] = selectedFilterList |
||||
|
.map((a) => a.agencyName) |
||||
|
.join("、"); |
||||
|
} else { |
||||
|
} |
||||
|
}, |
||||
|
rules: [ |
||||
|
{ |
||||
|
required: true, |
||||
|
message: "发布范围不能为空", |
||||
|
trigger: "blur", |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
field: "发布时间", |
||||
|
keyName: "publishDate", |
||||
|
type: "date", |
||||
|
value: dateFormat(new Date(), "yyyy-MM-dd"), |
||||
|
pickerOptions: { |
||||
|
disabledDate(time) { |
||||
|
return time.getTime() > Date.now(); |
||||
|
}, |
||||
|
}, |
||||
|
rules: [ |
||||
|
{ |
||||
|
required: true, |
||||
|
message: "发布时间不能为空", |
||||
|
trigger: "blur", |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
field: "发布单位", |
||||
|
keyName: "publisher", |
||||
|
type: "select", |
||||
|
optionUrl: "/gov/voice/article/publishagencylist", |
||||
|
optionList: [], |
||||
|
optionType: "group", |
||||
|
supKeys: ["publisherName", "publisherType"], |
||||
|
supValues: ["", ""], |
||||
|
optionCook(data) { |
||||
|
let ret = []; |
||||
|
const { agencyDeptList, agencyGridList, agencyId, agencyName } = |
||||
|
data; |
||||
|
if (agencyId) { |
||||
|
ret.push({ |
||||
|
label: "以组织名义", |
||||
|
optionList: [ |
||||
|
{ |
||||
|
label: agencyName, |
||||
|
value: agencyId, |
||||
|
type: "agency", |
||||
|
}, |
||||
|
], |
||||
|
}); |
||||
|
} |
||||
|
if (Array.isArray(agencyDeptList) && agencyDeptList.length > 0) { |
||||
|
ret.push({ |
||||
|
label: "以部门名义", |
||||
|
optionList: [ |
||||
|
...agencyDeptList.map((d) => ({ |
||||
|
label: d.agencyDeptName, |
||||
|
value: d.departmentId, |
||||
|
type: "department", |
||||
|
})), |
||||
|
], |
||||
|
}); |
||||
|
} |
||||
|
if (Array.isArray(agencyGridList) && agencyGridList.length > 0) { |
||||
|
ret.push({ |
||||
|
label: "以网格名义", |
||||
|
optionList: [ |
||||
|
...agencyGridList.map((d) => ({ |
||||
|
label: d.agencyGridName, |
||||
|
value: d.gridId, |
||||
|
type: "grid", |
||||
|
})), |
||||
|
], |
||||
|
}); |
||||
|
} |
||||
|
return ret; |
||||
|
}, |
||||
|
handleChangeFn(vals, item, that) { |
||||
|
const { optionList } = item; |
||||
|
let opts = []; |
||||
|
optionList.forEach((g) => { |
||||
|
opts = [...opts, ...g.optionList]; |
||||
|
}); |
||||
|
let publisher = opts.find((p) => vals == p.value); |
||||
|
that.fmData[item["supKeys"][0]] = publisher.label; |
||||
|
that.fmData[item["supKeys"][1]] = publisher.type; |
||||
|
}, |
||||
|
rules: [ |
||||
|
{ |
||||
|
required: true, |
||||
|
message: "发布单位不能为空", |
||||
|
trigger: "blur", |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
field: "文章标签", |
||||
|
keyName: "tagNameList", |
||||
|
type: "select", |
||||
|
multiple: true, |
||||
|
filterable: true, |
||||
|
allowCreate: true, |
||||
|
optionUrl: "/gov/voice/tag/taglist", |
||||
|
optionUrlParams: {}, |
||||
|
optionList: [], |
||||
|
optionCook(list) { |
||||
|
return list.map((item) => ({ |
||||
|
label: item.tagName, |
||||
|
value: item.tagName, |
||||
|
})); |
||||
|
}, |
||||
|
}, |
||||
|
{ |
||||
|
field: "内容", |
||||
|
keyName: "content", |
||||
|
type: "rich-text", |
||||
|
rules: [ |
||||
|
{ |
||||
|
required: true, |
||||
|
message: "内容不能为空", |
||||
|
trigger: "blur", |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
{ |
||||
|
field: "置顶", |
||||
|
keyName: "isTop", |
||||
|
type: "switch", |
||||
|
activeValue: "1", |
||||
|
inactiveValue: "0", |
||||
|
}, |
||||
|
{ |
||||
|
field: "消息推送", |
||||
|
keyName: "isPush", |
||||
|
type: "checkbox", |
||||
|
optionList:"是否通过公众号推送给社区居民" |
||||
|
}, |
||||
|
], |
||||
|
editFixedParams: { |
||||
|
type: "article", |
||||
|
}, |
||||
|
editElseRules: {}, |
||||
|
editConfig: { |
||||
|
confirmBtnName: "发布", |
||||
|
cookInfoFn(data) { |
||||
|
if (data.richTextFlag == "0") { |
||||
|
data.content = data.contentList |
||||
|
.map((item) => { |
||||
|
if (item.contentType == "text") { |
||||
|
return `<p>${item.content}</p>`; |
||||
|
} else if (item.contentType == "img") { |
||||
|
return `<img src="${item.content}" style="max-width:100%"></img>`; |
||||
|
} else if (item.contentType == "video") { |
||||
|
return `<video src="${item.content}" style="max-width:100%" controls></video>`; |
||||
|
} else if (item.contentType == "file") { |
||||
|
return `<a src="${item.content}" target="_blank">附件:${item.fileName}</a>`; |
||||
|
} |
||||
|
}) |
||||
|
.join(" "); |
||||
|
} else { |
||||
|
data.content = data.contentList[0].content; |
||||
|
} |
||||
|
if (data.imgUrl) { |
||||
|
data.imgArr = [ |
||||
|
{ |
||||
|
name: "封面", |
||||
|
url: data.imgUrl, |
||||
|
}, |
||||
|
]; |
||||
|
data.imgUrlArr = [data.imgUrl]; |
||||
|
} |
||||
|
|
||||
|
return data; |
||||
|
}, |
||||
|
|
||||
|
beforeSubmit(formType, fmData, that) { |
||||
|
if (fmData.isTop == "1" && !fmData.imgUrl) { |
||||
|
that.$message.error("请上传封面图片"); |
||||
|
return false; |
||||
|
} |
||||
|
return true; |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
formData: {}, |
||||
|
showAddImage: false, |
||||
|
uploadUlr: window.SITE_CONFIG["apiURL"] + "/oss/file/uploadvariedfile", |
||||
|
replayImgList: [], |
||||
|
hideUploadBtn: false, |
||||
|
selType: "top", |
||||
|
selArticleId: "", |
||||
|
selImgUrl: "", |
||||
|
}; |
||||
|
}, |
||||
|
components: { basePage } |
||||
|
|
||||
|
} |
||||
|
</script> |
||||
|
<style lang="scss"></style> |
Loading…
Reference in new issue