This commit is contained in:
liuye
2024-01-23 10:53:17 +08:00
48 changed files with 2418 additions and 1057 deletions

View File

@@ -3,13 +3,23 @@
<config-item label="数据类型">
<ai-select v-model="source.dataType" placeholder="请选择数据类型" :select-list="dataTypes"/>
</config-item>
<div class="codeEditor" v-if="['htmlData','staticData'].includes(source.dataType)">
<div class="codeEditor" v-if="['htmlData'].includes(source.dataType)">
<ai-dialog-btn :modal="false" dialog-title="编辑器" :customFooter="false"
@confirm="changeData(JSON.parse(content))" @open="content=contentstr">
<code-editor slot="btn" readonly :value="contentstr" :lang="dataLang" theme="github" width="100%" height="250"/>
<code-editor v-model="content" :lang="dataLang" theme="github" width="100%" height="440" wrap/>
</ai-dialog-btn>
</div>
<template v-else-if="source.dataType === 'staticData'">
<config-item label="设置列" class="tableStyle">
<div class="fill">
<table-editor v-model="colConfigs" :configs="[{field:'field',headerName:'属性',width:100},{field:'headerName',headerName:'名称',width:100}]"/>
</div>
</config-item>
<config-item label="设置数据" class="tableStyle" v-if="colConfigs.length>0">
<table-editor v-model="content" :configs="colConfigs"/>
</config-item>
</template>
<config-item v-else-if="source.dataType === 'dynamicData'" label="数据源">
<ai-select v-model="source.sourceDataId" placeholder="请选择数据源" :instance="instance"
:prop="{label:'description'}" @change="changeData"
@@ -29,10 +39,11 @@ import 'brace/mode/json'
import 'brace/snippets/json';
import 'brace/theme/github';
import 'brace/theme/monokai';
import TableEditor from "./tableEditor.vue";
export default {
name: "datasourcePicker",
components: {ConfigItem, AiDialogBtn, CodeEditor},
components: {TableEditor, ConfigItem, AiDialogBtn, CodeEditor},
model: {
event: "input",
prop: "options"
@@ -45,7 +56,8 @@ export default {
return {
dataTypes: Object.entries(DvCompData.types).map(e => ({id: e[0], label: e[1]})),
content: "",
loading: false
loading: false,
colConfigs: []
}
},
computed: {
@@ -76,5 +88,9 @@ export default {
position: relative;
padding-left: 10px;
}
.tableStyle {
align-items: normal;
}
}
</style>

View File

@@ -0,0 +1,42 @@
<script>
import Vue from 'vue'
console.log(window.AVUE)
export default {
name: "tableEditor",
model: {
event: "input",
prop: "tableData"
},
props: {
tableData: {default: () => []},
configs: {default: () => []}
},
computed: {
columns: v => v.configs
},
created() {
Vue.use(window.AVUE, {
size: 'small',
tableSize: 'small',
calcHeight: 48,
})
}
}
</script>
<template>
<section class="tableEditor">
<avue-crud/>
</section>
</template>
<style scoped lang="scss">
.tableEditor {
width: 100%;
height: auto;
.ag-theme-balham {
height: 300px;
}
}
</style>

View File

@@ -7,18 +7,18 @@
<ai-search-bar>
<template #left>
<ai-select
v-model="search.type"
@change="search.current = 1, getList()"
placeholder="请选择相册主题"
:selectList="dict.getDict('villagePictureAlbumType')">
v-model="search.type"
@change="search.current = 1, getList()"
placeholder="请选择相册主题"
:selectList="dict.getDict('villagePictureAlbumType')">
</ai-select>
<el-date-picker
v-model="search.timeTag"
type="month"
size="small"
@change="search.current = 1, getList()"
value-format="yyyy-MM"
placeholder="请选择日期">
v-model="search.timeTag"
type="month"
size="small"
@change="search.current = 1, getList()"
value-format="yyyy-MM"
placeholder="请选择日期">
</el-date-picker>
</template>
</ai-search-bar>
@@ -41,17 +41,17 @@
</div>
<div class="list-item__operate">
<el-button
type="text"
icon="iconfont iconExported"
class="list-item__operate--item"
@click="downloadImg(item.url, dict.getLabel('villagePictureAlbumType', item.type))">
type="text"
icon="iconfont iconExported"
class="list-item__operate--item"
@click="downloadImg(item.url, dict.getLabel('villagePictureAlbumType', item.type))">
下载
</el-button>
<el-button
@click="remove(item.id)"
type="text"
icon="iconfont iconDelete"
class="list-item__operate--item">
@click="remove(item.id)"
type="text"
icon="iconfont iconDelete"
class="list-item__operate--item">
删除
</el-button>
</div>
@@ -66,473 +66,473 @@
</template>
<script>
import { mapState } from 'vuex'
import Viewer from 'v-viewer'
import Vue from 'vue'
Vue.use(Viewer)
import {mapState} from 'vuex'
export default {
name: 'FormList',
props: {
instance: Function,
dict: Object,
areaId: String
},
export default {
name: 'FormList',
props: {
instance: Function,
dict: Object,
areaId: String
},
data () {
return {
search: {
current: 1,
areaId: '',
size: 1000000,
type: '',
timeTag: ''
},
isShowAdd: false,
form: {
},
list: [],
total: 0,
loading: false,
id: '',
disabledLevel: 0
}
},
data() {
return {
search: {
current: 1,
areaId: '',
size: 1000000,
type: '',
timeTag: ''
},
isShowAdd: false,
form: {},
list: [],
total: 0,
loading: false,
id: '',
disabledLevel: 0
}
},
computed: {
...mapState(['user']),
computed: {
...mapState(['user']),
imgList () {
return this.list.map(v => v.url)
}
},
imgList() {
return this.list.map(v => v.url)
}
},
created () {
created() {
this.loading = true
this.disabledLevel = this.user.info.areaList.length - 1
this.search.areaId = this.user.info.areaId
this.dict.load(['villagePictureAlbumType']).then(() => {
this.getList()
})
},
methods: {
changeArea() {
this.loading = true
this.disabledLevel = this.user.info.areaList.length - 1
this.search.areaId = this.user.info.areaId
this.dict.load(['villagePictureAlbumType']).then(() => {
this.search.current = 1
this.$nextTick(() => {
this.getList()
})
},
methods: {
changeArea () {
this.loading = true
this.search.current = 1
prevImg(index) {
const viewer = this.$el.querySelector('.images').$viewer
viewer.view(index)
},
this.$nextTick(() => {
this.getList()
})
},
prevImg (index) {
const viewer = this.$el.querySelector('.images').$viewer
viewer.view(index)
},
getList () {
this.instance.post(`/app/appvillagepicturealbum/list`, null, {
params: {
...this.search
}
}).then(res => {
if (res.code == 0) {
this.list = res.data.records
this.total = res.data.total
this.loading = false
} else {
this.loading = false
}
}).catch(() => {
this.loading = false
})
},
remove (id) {
this.$confirm('确定删除该相片?').then(() => {
this.instance.post(`/app/appvillagepicturealbum/delete?ids=${id}`).then(res => {
if (res.code == 0) {
this.$message.success('删除成功!')
this.getList()
}
})
})
},
downloadImg (url, name) {
let image = new Image()
image.setAttribute('crossOrigin', 'anonymous')
image.onload = function() {
let canvas = document.createElement('canvas')
canvas.width = image.width
canvas.height = image.height
let context = canvas.getContext('2d')
context.drawImage(image, 0, 0, image.width, image.height)
let url = canvas.toDataURL("image/png")
let a = document.createElement("a")
let event = new MouseEvent("click")
a.download = name
a.href = url
a.dispatchEvent(event)
getList() {
this.instance.post(`/app/appvillagepicturealbum/list`, null, {
params: {
...this.search
}
image.src = url
},
}).then(res => {
if (res.code == 0) {
this.list = res.data.records
this.total = res.data.total
this.loading = false
} else {
this.loading = false
}
}).catch(() => {
this.loading = false
})
},
toStop (id) {
this.$confirm('确定停止该表单').then(() => {
this.instance.post(`/app/appquestionnairetemplate/stopRelease?id=${id}`).then(res => {
if (res.code === 0) {
this.$message.success('停止成功!')
this.getList()
remove(id) {
this.$confirm('确定删除该相片').then(() => {
this.instance.post(`/app/appvillagepicturealbum/delete?ids=${id}`).then(res => {
if (res.code == 0) {
this.$message.success('删除成功')
this.getList()
}
})
})
},
downloadImg(url, name) {
let image = new Image()
image.setAttribute('crossOrigin', 'anonymous')
image.onload = function () {
let canvas = document.createElement('canvas')
canvas.width = image.width
canvas.height = image.height
let context = canvas.getContext('2d')
context.drawImage(image, 0, 0, image.width, image.height)
let url = canvas.toDataURL("image/png")
let a = document.createElement("a")
let event = new MouseEvent("click")
a.download = name
a.href = url
a.dispatchEvent(event)
}
image.src = url
},
toStop(id) {
this.$confirm('确定停止该表单?').then(() => {
this.instance.post(`/app/appquestionnairetemplate/stopRelease?id=${id}`).then(res => {
if (res.code === 0) {
this.$message.success('停止成功!')
this.getList()
}
})
})
},
showShare(info, isPreview) {
this.loading = true
this.info = info
this.instance.post(`/app/appquestionnairetemplate/queryQrCode?id=${info.id}`).then(res => {
if (res.code == 0) {
this.info.linkUrl = res.data.linkUrl
this.info.qrCodeUrl = res.data.qrCodeUrl
this.$nextTick(() => {
if (isPreview) {
this.isShowPreview = true
this.info.linkUrl = `${res.data.linkUrl}&preview=true#form`
} else {
this.isShowSuccess = true
}
})
})
},
}
showShare (info, isPreview) {
this.loading = true
this.info = info
this.loading = false
}).catch(() => {
this.loading = false
})
},
this.instance.post(`/app/appquestionnairetemplate/queryQrCode?id=${info.id}`).then(res => {
if (res.code == 0) {
this.info.linkUrl = res.data.linkUrl
this.info.qrCodeUrl = res.data.qrCodeUrl
this.$nextTick(() => {
if (isPreview) {
this.isShowPreview = true
this.info.linkUrl = `${res.data.linkUrl}&preview=true#form`
} else {
this.isShowSuccess = true
}
})
}
this.loading = false
}).catch(() => {
this.loading = false
})
},
toAdd (id) {
this.$emit('change', {
type: 'add',
params: {
id
}
})
}
toAdd(id) {
this.$emit('change', {
type: 'add',
params: {
id
}
})
}
}
}
</script>
<style scoped lang="scss">
.list {
:deep( .ai-list__content ){
width: 100%;
.ai-list__content--right {
width: 100%!important;
.list {
:deep( .ai-list__content ) {
width: 100%;
.ai-list__content--right-wrapper {
padding: 0!important;
background: transparent!important;
box-shadow: none!important;
}
.ai-list__content--right {
width: 100% !important;
.ai-list__content--right-wrapper {
padding: 0 !important;
background: transparent !important;
box-shadow: none !important;
}
}
:deep(.el-pager ){
li.active + li {
border-left: 1px solid #D0D4DC;
}
}
:deep(.el-pager ) {
li.active + li {
border-left: 1px solid #D0D4DC;
}
}
.newPagination {
width: 100%;
display: flex;
align-items: center;
height: 64px;
padding: 0 40px !important;
.el-pagination {
width: 100%;
padding: 0;
}
.newPagination {
width: 100%;
:deep( .el-pager li.active ) {
background-color: #fff !important;
color: #2266FF !important;
border-color: #2266FF;
}
:deep( .el-pager li ) {
background-color: #fff;
border: solid 1px #d0d4dc;
margin-left: 8px;
border-radius: 4px !important;
line-height: 26px !important;
}
.paginationPre {
display: flex;
height: 28px;
line-height: 1;
font-size: 14px;
font-weight: normal;
align-items: center;
height: 64px;
padding: 0 40px!important;
.el-pagination {
width: 100%;
padding: 0;
}
:deep( .el-pager li.active ){
background-color: #fff !important;
color: #2266FF !important;
border-color: #2266FF;
}
:deep( .el-pager li ){
background-color: #fff;
border: solid 1px #d0d4dc;
margin-left: 8px;
border-radius: 4px !important;
line-height: 26px !important;
}
.paginationPre {
.pagination-btns {
display: flex;
height: 28px;
line-height: 1;
font-size: 14px;
font-weight: normal;
align-items: center;
gap: 8px;
color: #2266FF !important;
.pagination-btns {
display: flex;
align-items: center;
gap: 8px;
:deep( span), :deep( div ) {
font-size: 12px;
cursor: pointer;
color: #2266FF !important;
:deep( span), :deep( div ){
font-size: 12px;
cursor: pointer;
color: #2266FF !important;
&:hover {
opacity: 0.8;
}
&:hover {
opacity: 0.8;
}
}
}
.paginationPre-total {
font-size: 12px;
color: #555;
.paginationPre-total {
font-size: 12px;
color: #555;
label {
padding: 0 2px;
font-weight: 700;
}
label {
padding: 0 2px;
font-weight: 700;
}
}
& > * + * {
margin-left: 24px;
}
& > * + * {
margin-left: 24px;
}
:deep( .el-pagination button), .el-pagination span:not([class*=suffix]) {
:deep( .el-pagination button), .el-pagination span:not([class*=suffix]) {
line-height: 1 !important;
}
:deep(.el-checkbox ) {
padding-left: 14px;
display: flex;
align-items: center;
.el-checkbox__input, .el-checkbox__inner {
width: 14px;
height: 14px;
min-width: 0 !important;
line-height: 1 !important;
}
:deep(.el-checkbox ){
padding-left: 14px;
display: flex;
align-items: center;
.el-checkbox__input, .el-checkbox__inner {
width: 14px;
height: 14px;
min-width: 0 !important;
line-height: 1 !important;
}
.el-checkbox__label {
font-size: 12px;
color: #222222;
height: auto !important;
line-height: 1 !important;
padding-left: 3px !important;
}
}
}
}
.form-list__list {
display: flex;
flex-wrap: wrap;
margin-top: 8px;
.list-item {
display: flex;
position: relative;
flex-direction: column;
justify-content: space-between;
margin-bottom: 12px;
padding: 18px 16px 16px;
.list-item__img {
width: 100%;
height: 140px;
cursor: pointer;
img {
width: 100%;
height: 140px;
object-fit: none;
}
}
&:hover {
.list-item__operate {
display: flex;
}
}
.list-item__operate {
display: none;
align-items: center;
position: absolute;
left: 0;
bottom: 0;
z-index: 1;
width: 100%;
height: 52px;
text-align: center;
background: #F7F8FA;
& > div {
flex: 1;
}
:deep( .el-button ){
margin-left: 0;
padding: 0;
i {
color: #8899BB;
font-size: 14px;
transition: all 0.3s;
}
.el-button + .el-button {
margin-left: 0;
}
span {
margin-left: 0;
color: #555555;
font-size: 12px;
transition: all 0.3s;
}
&:hover {
&.is-disabled {
i {
color: #8899BB;
}
span {
color: #555555;
}
}
}
}
.list-item__operate--item {
flex: 1;
&:hover {
:deep( i), :deep( span ){
color: #2266FF;
}
}
}
}
.list-item__bottom {
display: flex;
align-items: center;
justify-content: space-between;
color: #888888;
.el-checkbox__label {
font-size: 12px;
i {
font-style: normal;
}
.left {
display: flex;
align-items: center;
.tag {
height: 26px;
line-height: 26px;
margin-right: 8px;
padding: 0 6px;
border-radius: 4px;
background: #42D784;
color: #fff;
}
}
}
p {
line-height: 22px;
color: #333333;
font-size: 14px;
font-weight: 700;
}
.list-item__user {
display: flex;
align-items: center;
margin-top: 12px;
color: #888888;
font-size: 12px;
line-height: 20px;
& > div:first-child {
margin-right: 8px;
}
}
.list-item__title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 14px;
h2 {
color: #2EA222;
font-size: 12px;
}
span {
width: 64px;
height: 24px;
line-height: 24px;
text-align: center;
border-radius: 4px;
font-size: 12px;
}
}
}
.list-add {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 0;
cursor: pointer;
span {
font-size: 32px;
color: #8899bb;
}
h2 {
color: #555555;
font-size: 12px;
}
&:hover {
opacity: 0.6;
}
}
& > div {
width: calc((100% - 60px) / 4);
height: 216px;
margin: 0 20px 20px 0;
background: #FFFFFF;
box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.05);
border-radius: 2px;
&:nth-of-type(4n) {
margin-right: 0;
color: #222222;
height: auto !important;
line-height: 1 !important;
padding-left: 3px !important;
}
}
}
}
.form-list__list {
display: flex;
flex-wrap: wrap;
margin-top: 8px;
.list-item {
display: flex;
position: relative;
flex-direction: column;
justify-content: space-between;
margin-bottom: 12px;
padding: 18px 16px 16px;
.list-item__img {
width: 100%;
height: 140px;
cursor: pointer;
img {
width: 100%;
height: 140px;
object-fit: none;
}
}
&:hover {
.list-item__operate {
display: flex;
}
}
.list-item__operate {
display: none;
align-items: center;
position: absolute;
left: 0;
bottom: 0;
z-index: 1;
width: 100%;
height: 52px;
text-align: center;
background: #F7F8FA;
& > div {
flex: 1;
}
:deep( .el-button ) {
margin-left: 0;
padding: 0;
i {
color: #8899BB;
font-size: 14px;
transition: all 0.3s;
}
.el-button + .el-button {
margin-left: 0;
}
span {
margin-left: 0;
color: #555555;
font-size: 12px;
transition: all 0.3s;
}
&:hover {
&.is-disabled {
i {
color: #8899BB;
}
span {
color: #555555;
}
}
}
}
.list-item__operate--item {
flex: 1;
&:hover {
:deep( i), :deep( span ) {
color: #2266FF;
}
}
}
}
.list-item__bottom {
display: flex;
align-items: center;
justify-content: space-between;
color: #888888;
font-size: 12px;
i {
font-style: normal;
}
.left {
display: flex;
align-items: center;
.tag {
height: 26px;
line-height: 26px;
margin-right: 8px;
padding: 0 6px;
border-radius: 4px;
background: #42D784;
color: #fff;
}
}
}
p {
line-height: 22px;
color: #333333;
font-size: 14px;
font-weight: 700;
}
.list-item__user {
display: flex;
align-items: center;
margin-top: 12px;
color: #888888;
font-size: 12px;
line-height: 20px;
& > div:first-child {
margin-right: 8px;
}
}
.list-item__title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 14px;
h2 {
color: #2EA222;
font-size: 12px;
}
span {
width: 64px;
height: 24px;
line-height: 24px;
text-align: center;
border-radius: 4px;
font-size: 12px;
}
}
}
.list-add {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
padding: 0;
cursor: pointer;
span {
font-size: 32px;
color: #8899bb;
}
h2 {
color: #555555;
font-size: 12px;
}
&:hover {
opacity: 0.6;
}
}
& > div {
width: calc((100% - 60px) / 4);
height: 216px;
margin: 0 20px 20px 0;
background: #FFFFFF;
box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.05);
border-radius: 2px;
&:nth-of-type(4n) {
margin-right: 0;
}
}
}
}
</style>

View File

@@ -47,28 +47,28 @@
</span>
</span>
<span class="value" v-else>-</span></el-form-item>
<!-- <ai-title title="附件" isShowBottomBorder>-->
<!-- <template #rightBtn>-->
<!-- <el-button type="text" icon="iconfont iconDownload" @click="downLoadAll">下载全部</el-button>-->
<!-- </template>-->
<!-- </ai-title>-->
<!-- <el-form-item label-width="0">-->
<!-- <div v-if="obj.annex.length">-->
<!-- <div class="flie" v-for="(item, index) in obj.annex" :key="index"-->
<!-- @click="downFile(item)">-->
<!-- <p>-->
<!-- <svg aria-hidden="true" style="width:24px;height:24px;">-->
<!-- <use xlink:href="#iconAppendix_UNdownload"></use>-->
<!-- </svg>-->
<!-- <span>{{ item.name }}</span>-->
<!-- </p>-->
<!-- <span style="color:#999;">{{ (item.size / 1024).toFixed(2) + "KB" }}-->
<!-- <span class="iconfont iconDownload" style="color:#5088FF"></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="no-data" style="height:160px;width:100%;" v-else></div>-->
<!-- </el-form-item>-->
<!-- <ai-title title="附件" isShowBottomBorder>-->
<!-- <template #rightBtn>-->
<!-- <el-button type="text" icon="iconfont iconDownload" @click="downLoadAll">下载全部</el-button>-->
<!-- </template>-->
<!-- </ai-title>-->
<!-- <el-form-item label-width="0">-->
<!-- <div v-if="obj.annex.length">-->
<!-- <div class="flie" v-for="(item, index) in obj.annex" :key="index"-->
<!-- @click="downFile(item)">-->
<!-- <p>-->
<!-- <svg aria-hidden="true" style="width:24px;height:24px;">-->
<!-- <use xlink:href="#iconAppendix_UNdownload"></use>-->
<!-- </svg>-->
<!-- <span>{{ item.name }}</span>-->
<!-- </p>-->
<!-- <span style="color:#999;">{{ (item.size / 1024).toFixed(2) + "KB" }}-->
<!-- <span class="iconfont iconDownload" style="color:#5088FF"></span>-->
<!-- </span>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="no-data" style="height:160px;width:100%;" v-else></div>-->
<!-- </el-form-item>-->
<ai-title title="人员信息" isShowBottomBorder/>
<el-form-item label="与会组织">{{ arrLabel(obj.appThreeMeetingOrganizationList, 'name') }}</el-form-item>
<el-form-item label="主持人">{{ arrLabel(obj.hostList, 'userName') }}</el-form-item>
@@ -213,12 +213,8 @@
</template>
<script>
import Vue from 'vue'
import {mapState} from "vuex";
import moment from 'dayjs';
import Viewer from 'v-viewer'
Vue.use(Viewer)
export default {
name: "meetingDetail",
@@ -272,7 +268,7 @@ export default {
voteConfigs() {
return [
{label: "人员姓名", prop: "userName", align: 'center'},
{label: "投票选项", prop: "myVote", format: v => v ? (v === '1' ? '同意' : '不同意') : '-' },
{label: "投票选项", prop: "myVote", format: v => v ? (v === '1' ? '同意' : '不同意') : '-'},
{label: "投票时间", prop: "voteTime"},
]
},
@@ -430,7 +426,7 @@ export default {
},
//获取会议详请
getDetailInfo() {
this.detail.id&& this.instance.post(`/app/appthreemeetinginfo/queryDetailById?id=${this.detail.id}`).then(res => {
this.detail.id && this.instance.post(`/app/appthreemeetinginfo/queryDetailById?id=${this.detail.id}`).then(res => {
if (res?.data) {
res.data.annex = JSON.parse(res.data.annex);
res.data.meetingClassification = res.data.meetingClassification.split(',');
@@ -564,7 +560,7 @@ export default {
.addThreeMeeting {
height: 100%;
:deep( .el-form ){
:deep( .el-form ) {
.ailist-title {
padding: 0;
margin-bottom: 8px;
@@ -579,7 +575,7 @@ export default {
}
}
:deep(.ai-detail__content--wrapper ){
:deep(.ai-detail__content--wrapper ) {
.el-form {
width: 1000px;
margin: 0 auto;
@@ -591,11 +587,11 @@ export default {
margin-bottom: 8px;
}
:deep( .el-dialog__body ){
:deep( .el-dialog__body ) {
padding-top: 16px !important;
}
:deep( .iconfont ){
:deep( .iconfont ) {
color: #2266FF;
cursor: pointer;
}
@@ -680,7 +676,7 @@ export default {
}
}
:deep( .el-form-item__label ){
:deep( .el-form-item__label ) {
color: #999;
}
@@ -711,7 +707,7 @@ export default {
width: 100%;
}
:deep( .AiEchart ){
:deep( .AiEchart ) {
height: 160px;
}
}

View File

@@ -9,13 +9,13 @@
<ai-card title="标题信息">
<template slot="content">
<ai-wrapper label-width="70px" :columnsNumber="1">
<ai-info-item label="话题标题">{{detailObj.title}}</ai-info-item>
<ai-info-item label="话题标题">{{ detailObj.title }}</ai-info-item>
<ai-info-item label="关键字" v-if="detailObj.keyWords">
<el-tag
v-for="tag in detailObj.keyWords.split(',')"
:key="tag"
effect="plain">
{{tag}}
v-for="tag in detailObj.keyWords.split(',')"
:key="tag"
effect="plain">
{{ tag }}
</el-tag>
</ai-info-item>
<ai-info-item label="封面图片">
@@ -26,14 +26,14 @@
</template>
</ai-card>
<ai-card class="card" v-for="(item,index) in detailObj.contents" :key="index">
<template slot="title">{{item.question}}</template>
<template slot="right">话题来源{{item.questionSource}}</template>
<template slot="title">{{ item.question }}</template>
<template slot="right">话题来源{{ item.questionSource }}</template>
<template slot="content">
<div class="wrap">
<header>
<b>{{item.answerSource}}</b>&nbsp;&nbsp;回复
<b>{{ item.answerSource }}</b>&nbsp;&nbsp;回复
</header>
<p>{{item.answer}}</p>
<p>{{ item.answer }}</p>
<div v-viewer>
<img :src="p.url"
v-for="(p,q) in item.files" :key="q" alt="">
@@ -47,113 +47,109 @@
</template>
<script>
import Viewer from 'v-viewer' ;
import Vue from 'vue' ;
Vue.use(Viewer);
export default {
name: "hotDetail",
label: "热点详情",
props: {
instance: Function,
dict: Object,
permissions: Function,
areaId: String,
detail: Object
},
data() {
return {
detailObj: {},
}
},
methods: {
getDetail() {
this.instance.post(`/app/apphotsubject/detail`, null, {
params: {id: this.detail.id}
}).then(res => {
if (res && res.data) {
this.detailObj = res.data
}
})
},
},
created() {
this.getDetail()
export default {
name: "hotDetail",
label: "热点详情",
props: {
instance: Function,
dict: Object,
permissions: Function,
areaId: String,
detail: Object
},
data() {
return {
detailObj: {},
}
},
methods: {
getDetail() {
this.instance.post(`/app/apphotsubject/detail`, null, {
params: {id: this.detail.id}
}).then(res => {
if (res && res.data) {
this.detailObj = res.data
}
})
},
},
created() {
this.getDetail()
}
}
</script>
<style lang="scss" scoped>
.hotDetail {
height: 100%;
overflow: hidden;
.hotDetail {
height: 100%;
overflow: hidden;
.card {
:deep( .aibar ){
height: 94px !important;
flex-direction: column;
align-items: flex-start;
margin-bottom: 0px !important;
padding: 16px !important;
.card {
:deep( .aibar ) {
height: 94px !important;
flex-direction: column;
align-items: flex-start;
margin-bottom: 0px !important;
padding: 16px !important;
& > div {
line-height: 24px;
& > div {
line-height: 24px;
&:last-child {
font-size: 14px;
color: #888888;
}
}
}
:deep( .ai-card__body ){
padding: 12px 20px 22px !important;
}
.wrap {
background-color: #F5F6F9;
box-sizing: border-box;
padding: 16px;
header {
height: 40px;
font-size: 16px;
color: #222222;
line-height: 24px;
display: flex;
align-items: center;
border-bottom: 1px solid #EEEEEE;
b {
color: #2266FF;
}
}
p {
margin-top: 16px;
font-size: 16px;
color: #222222;
line-height: 32px;
text-indent: 2em;
&:last-child {
font-size: 14px;
color: #888888;
}
}
}
:deep( .el-tag){
background: #F3F4F7;
border-radius: 2px;
color: #222222;
border: 1px solid #D0D4DC;
margin-right: 8px;
:deep( .ai-card__body ) {
padding: 12px 20px 22px !important;
}
img {
width: 160px;
height: 160px;
border-radius: 2px;
margin-top: 16px;
margin-right: 8px;
.wrap {
background-color: #F5F6F9;
box-sizing: border-box;
padding: 16px;
header {
height: 40px;
font-size: 16px;
color: #222222;
line-height: 24px;
display: flex;
align-items: center;
border-bottom: 1px solid #EEEEEE;
b {
color: #2266FF;
}
}
p {
margin-top: 16px;
font-size: 16px;
color: #222222;
line-height: 32px;
text-indent: 2em;
}
}
}
:deep( .el-tag) {
background: #F3F4F7;
border-radius: 2px;
color: #222222;
border: 1px solid #D0D4DC;
margin-right: 8px;
}
img {
width: 160px;
height: 160px;
border-radius: 2px;
margin-top: 16px;
margin-right: 8px;
}
}
</style>

View File

@@ -31,10 +31,6 @@
</template>
<script>
import Viewer from 'v-viewer';
import Vue from 'vue';
Vue.use(Viewer);
export default {
name: "newsDetail",
props: {

View File

@@ -29,11 +29,8 @@
</template>
<script>
import Viewer from 'v-viewer';
export default {
name: "videoDetail",
components: {Viewer},
props: {
instance: Function,
dict: Object,

View File

@@ -326,10 +326,6 @@
<script>
import moment from 'dayjs'
import {mapState} from "vuex";
import Viewer from 'v-viewer'
import Vue from 'vue'
Vue.use(Viewer)
export default {
name: "approvalDetail",

View File

@@ -89,10 +89,6 @@
</template>
<script>
import { mapState } from 'vuex'
// import 'viewerjs/dist/viewer.css'
import Viewer from 'v-viewer'
import Vue from 'vue'
Vue.use(Viewer)
export default {
name: 'messageDetail',

View File

@@ -45,7 +45,7 @@
<h2 v-for="(item, index) in msgTypeList" :key="index" :class="msgType == index ? 'tab-active' : ''" @click="msgTypeClick(index)">{{item.name}}</h2>
</div>
<div class="search-content">
<el-date-picker v-model="time" size="small" type="daterange" value-format="yyyy-MM-dd"
<el-date-picker v-model="time" size="small" type="daterange" value-format="yyyy-MM-dd"
range-separator="" start-placeholder="开始日期" end-placeholder="结束日期" @change="onChange">
</el-date-picker>
<el-input size="small" placeholder="输入搜索内容" v-model="searchMsg" clearable
@@ -90,7 +90,7 @@
<video style="width: 300px; object-fit: fill;" controls :src="item.sdkFileUrl" v-if="item.msgType == 'video'"></video>
<ai-file-list v-if="item.msgType == 'file'"
<ai-file-list v-if="item.msgType == 'file'"
:fileList="item.files"
:fileOps="{ name: 'name', size: 'fileSizeStr' }"
></ai-file-list>
@@ -170,16 +170,11 @@
<script>
import { mapState } from 'vuex'
import Viewer from 'v-viewer'
import AMapLoader from '@amap/amap-jsapi-loader'
import Vue from 'vue'
Vue.use(Viewer);
import html2canvas from "html2canvas";
import jsPDF from "jspdf";
import { Loading } from "element-ui";
const PdfLoader = (ele, pdfFileName) => {
let loadingInstance = Loading.service({ fullscreen: true, text: '正在导出(请勿刷新/关闭页面)' });
ele.style.fontFamily = "宋体";
@@ -447,7 +442,7 @@
this.getMsgList()
},
getKeyWordList() {
var url = this.listInfo.seq ? `/app/appsessionarchiveinfo/listByKeywordRecord?seq=${this.listInfo.seq}`
var url = this.listInfo.seq ? `/app/appsessionarchiveinfo/listByKeywordRecord?seq=${this.listInfo.seq}`
: `/app/appsessionarchiveinfo/listByKeywordRecord?msgId=${this.params.msgId}`
this.instance.post(url, null, {
params: {
@@ -545,9 +540,9 @@
var height = document.querySelector('.content-right-info').scrollHeight - preveHeight
document.querySelector('.content-right-info').scrollTop = height
}
})
}
this.isLoading = false
}).catch(() => {
@@ -606,7 +601,7 @@
var height = document.querySelector('.content-right-info').scrollHeight - preveHeight
document.querySelector('.content-right-info').scrollTop = height
}
})
}
this.isLoading = false
@@ -655,7 +650,7 @@
},
openLink(row) {
document.write('<a href="" target="new"></a>');
window.open(row.linkUrl, "new");
window.open(row.linkUrl, "new");
},
cancel () {
this.$emit('change', {
@@ -878,7 +873,7 @@
max-width: calc(100% - 144px);
position: relative;
background-color: #f3f6f9;
span {
width: 0px;
height: 0px;
@@ -1000,7 +995,7 @@
}
}
.item-left {
.item-content-flex {
.item-content-flex {
.user-img {
margin: 0 20px 0 0;
}
@@ -1014,7 +1009,7 @@
margin-left: 16px;
}
}
}
.item-right {
width: 100%;
@@ -1042,7 +1037,7 @@
text-align: right;
}
}
}
}
.addressBook-left__list--wrapper::-webkit-scrollbar,

View File

@@ -289,14 +289,9 @@
<script>
import { mapState } from "vuex";
import Viewer from "v-viewer";
import AMapLoader from "@amap/amap-jsapi-loader";
import Vue from "vue";
Vue.use(Viewer);
import html2canvas from "html2canvas";
import jsPDF from "jspdf";
import { Loading } from "element-ui";
const PdfLoader = (ele, pdfFileName) => {
@@ -631,7 +626,7 @@ export default {
var dataURL = canvas.toDataURL("image/"+ext);
return dataURL;
},
initMap(lng, lat, zoom, mapId) {
AMapLoader.load({
key: "54a02a43d9828a8f9cd4f26fe281e74e",