Merge branch 'hi-ucs-dev' into release

This commit is contained in:
wuhongjian 2022-12-29 17:34:40 +08:00
commit 6736a8d434
62 changed files with 9201 additions and 1890 deletions

View File

View File

@ -2,7 +2,7 @@
* @Author: hisense.wuhongjian
* @Date: 2022-04-11 10:11:40
* @LastEditors: hisense.wuhongjian
* @LastEditTime: 2022-08-29 09:54:59
* @LastEditTime: 2022-12-29 17:34:35
* @Description: 告诉大家这是什么
-->
<!DOCTYPE html>
@ -39,7 +39,8 @@
window.SITE_CONFIG['previewUrl'] = _global.config.previewUrl;
window.SITE_CONFIG['apiURL'] = _global.config.apiURL;
// WebSocket地址
window.SITE_CONFIG['socketURL'] =_global.config.socketURL;
// window.SITE_CONFIG['socketURL'] =_global.config.socketURL;
window.SITE_CONFIG['websocketURL'] = _global.config.websocketURL
</script>
</head>
<body>

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

View File

@ -118,6 +118,7 @@ t.model.description = '描述'
t.process = {}
t.process.name = '名称'
t.process.userName = '申请人'
t.process.key = '标识'
t.process.deployFile = '部署流程文件'
t.process.id = '流程ID'

View File

@ -105,8 +105,9 @@ import { messages } from '@/i18n'
import screenfull from 'screenfull'
import UpdatePassword from './main-navbar-update-password'
import { clearLoginInfo } from '@/utils'
// import Cookies from 'js-cookie'
// var socket = null
import Cookies from 'js-cookie'
import bus from '@/views/bus.js'
var socket = null
export default {
inject: ['refresh'],
data () {
@ -120,29 +121,32 @@ export default {
UpdatePassword
},
created () {
// var vue = this
// socket = new WebSocket(`${window.SITE_CONFIG['socketURL']}?token=${Cookies.get('token')}`)
// socket.onopen = function () {}
// socket.onerror = function () {
// vue.$notify.error({
// title: vue.$t('notice.disconnect'),
// message: vue.$t('notice.disconnectMessage')
// })
// }
// socket.onmessage = function (evt) {
// const result = JSON.parse(evt.data)
// //
// if (result.type === 0) {
// vue.messageTip = true
// vue.$notify({
// title: vue.$t('notice.new'),
// message: result.msg,
// type: 'info',
// duration: 5000
// })
// }
// }
const that = this
socket = new WebSocket(`${window.SITE_CONFIG.websocketURL}?token=${Cookies.get('ucsToken')}`)
socket.onopen = function () {}
socket.onerror = function () {}
socket.onmessage = function (res) {
switch (that.$route.name) {
case 'myAgent-CompetencyApplication':
bus.$emit('competencyApplicationInit')
break
case 'myAgent-AbilityResourceShelf':
bus.$emit('abilityResourceShelfInit')
break
case 'myAgent-ApplicationforCompetencyRequirements':
bus.$emit('applicationforRequirementsInit')
break
case 'myAgent-AbilityResourcesRemoved':
bus.$emit('AbilityResourcesRemovedInit')
break
case 'myAgent-CommentModeration':
bus.$emit('commentInit')
break
case 'activiti-RoomExamineAdmin':
bus.$emit('roomExamineAdminInit')
break
}
}
//
this.getUnReadCount()

View File

@ -0,0 +1,561 @@
<template>
<div>
<el-dialog custom-class="customClass" :visible.sync="areaVisibleCopy" :title="modalTypeText[modalType]"
@close="closeModal" :close-on-click-modal="false" :close-on-press-escape="false">
<!-- 挂载和修改 -->
<div class="right">
<el-form :model="dataForm" :rules="rules" ref="dataForm" @keyup.enter.native="dataFormSubmitHandle()"
:label-width="$i18n.locale === 'en-US' ? '120px' : '100px'">
<!-- 基本信息 -->
<div class="scrollBox" id="anchor1">
<div class="baseInner">
<el-form-item label="所属区市:" prop="unit">
<el-select v-model="dataForm.area" placeholder="请选择">
<el-option v-for="item in areas" :key="item.data" :label="item.name"
:value="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="赋能领域:" prop="unit">
<el-select v-model="dataForm.applicationArea" placeholder="请选择">
<el-option v-for="item in sceneAreas" :key="item.data" :label="item.dict_label"
:value="item.dict_value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="场景名称:" prop="name">
<el-input v-model="dataForm.name" placeholder="请输入名称" style="width:90%"></el-input>
</el-form-item>
<el-form-item label="场景描述:" prop="description">
<el-input type="textarea" :rows="3" v-model="dataForm.description" placeholder="请输入描述"
style="width:90%">
</el-input>
</el-form-item>
<el-form-item label="场景入口:">
<el-input v-model="dataForm.sceneUrl" placeholder="请输入场景入口" style="width:90%"></el-input>
</el-form-item>
<el-form-item label="场景图片:">
<el-upload ref="editUpload" class="upload-demo" :action="fileUploadUrl"
:on-success="eidtHandleAvatarSuccess" :before-upload="editBeforeAvatarUpload" :limit="1"
:file-list="[]" :on-remove="editUploadRemoveFile" :on-exceed="handleExceed" list-type="picture">
<div slot="tip" class="el-upload__tip">只能上传图片文件</div>
<div class="button-new">
<div>点击上传</div>
</div>
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
</el-upload>
</el-form-item>
</div>
</div>
</el-form>
</div>
<template slot="footer">
<el-button type="primary" @click="dataFormSubmitHandle()">提交</el-button>
<el-button @click="closeModal">{{ $t("cancel") }}</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import debounce from 'lodash/debounce'
import qs from 'qs'
import Cookies from 'js-cookie'
import upload from '@/views/modules/components/upload'
//
export const modalTypeText = {
add: '场景挂接',
update: '场景修改'
}
export default {
components: {
upload
},
watch: {
dataForm: {
handler(newVal) {
this.dataForm = newVal
},
deep: true,
immediate: true
},
areaVisible: {
handler(newVal) {
this.getSceneArea()
this.getArea()
this.areaVisibleCopy = newVal
if (this.modalType == 'add' && newVal) {
this.getDetail(this.dataForm)
}
},
immediate: true
}
},
props: {
modalType: {
type: String,
default: 'add'
},
areaVisible: {
type: Boolean,
default: false
}
},
data() {
return {
areas:[],//
sceneAreas:[],
fileUploadUrl: window.SITE_CONFIG.apiURL + '/upload',
dataForm: {
district: 1,//01
area: '',//
infrastructureCount: null,
dataSourceCount: null,
componentCount: null,
name: '',
applicationArea: '',//
description: '',
sceneUrl: '',
fuseAttrList: [
{
attrType: '构建步骤',
attrValue: [{ question: '', answer: [{ 'answer': '' }, { 'answer': '' }] }]
},
{
attrType: '基础设施',
attrValue: [{ name: '', type: '', dept: '' }]
},
{
attrType: '组件服务',
attrValue: [{ name: '', type: '', dept: '' }]
},
{
attrType: '数据资源',
attrValue: [{ name: '', type: '', dept: '' }]
},
{
attrType: '场景痛点',
attrValue: [{ description: '' }]
},
{
attrType: '解决方案',
attrValue: [{ description: '' }]
},
{
attrType: '服务图片',
attrValue: ''
}
],
},
rules: {
name: [
{
required: true,
message: '请输入名称',
trigger: 'change'
}
],
description: [
{
required: true,
message: '请输入描述',
trigger: 'change'
}
]
},
areaVisibleCopy: this.areaVisible,
displayInfo: {
name: '名称',
description: '描述'
},
modalTypeText: modalTypeText,
abilityListObj: {},
imgData: [],
//
handleExceed() {
this.$message({ type: 'error', message: '最多支持一张图片上传' })
},
imageUrl: ''
}
},
methods: {
//
getArea(){
const params = {
pid: '250000'
}
this.$http
.get('/sys/region/list/', {
params
})
.then((res) => {
this.areas = res.data.data
})
},
//
getSceneArea() {
const params = {
topCategoryName: '应用资源'
}
this.$http
.get('/category/getAllFilterCriteriaByTopCategory/', {
params
})
.then((res) => {
this.sceneAreas = res.data.data[0].typeList
})
},
clearForm() {
this.$refs.dataForm && this.$refs.dataForm.resetFields()
},
closeModal() {
this.$emit('closeModal')
},
//
dataFormSubmitHandle: debounce(
function () {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
this.$message.error('请检查表单是否填写完整')
return false
}
const methodsObj = {
add: 'post',
update: 'put'
}
// if (this.imageUrl == '') {
// this.$message.error('')
// return
// }
this.dataForm.fuseAttrList.find(v => v.attrType == '服务图片').attrValue = this.imageUrl || ''
const _obj = Object.assign({}, this.dataForm, {
type: '赋能场景'
})
this.dataForm.fuseAttrList.forEach(item => {
if(item.attrType!=='服务图片'){
item.attrValue = JSON.stringify(item.attrValue);
}
})
this.$http
[methodsObj[this.modalType]]('/fuse', _obj)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.$refs.dataForm && this.$refs.dataForm.resetFields()
this.$emit('refreshDataList')
this.$emit('closeModal')
}
})
})
.catch((err) => {
this.$message.error(err)
})
})
},
1000,
{ leading: true, trailing: false }
),
//
getDetail(data) {
this.dataForm = data
},
handleAvatarSuccess(res, file) {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.imageUrl = res.data
},
beforeAvatarUpload(file) {
const isImage =
file.type === 'image/jpeg' ||
file.type === 'image/jpg' ||
file.type === 'image/png'
if (!isImage) {
this.$message.error('上传头像图片只能是 jpg/png 格式!')
}
return isImage
},
addUploadRemoveFile(file, fileList) {
this.$refs.addUpload.clearFiles()
this.imageUrl = ''
},
editBeforeAvatarUpload(file) {
const isImage =
file.type === 'image/jpeg' ||
file.type === 'image/jpg' ||
file.type === 'image/png'
if (!isImage) {
this.$message.error('上传头像图片只能是 jpg/png 格式!')
}
return isImage
},
editUploadRemoveFile(file, fileList) {
this.$refs.editUpload.clearFiles()
this.imageUrl = ''
},
eidtHandleAvatarSuccess(res, file) {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.imageUrl = res.data
}
},
mounted() {
},
beforeDestroy() {
this.clearForm()
}
}
</script>
<style lang="scss" scoped>
.fixed {
position: sticky;
z-index: 10012;
top: 0;
left: 50%;
margin-left: -9.56rem;
}
.button-new {
height: 90px;
width: 128px;
border: 1px dashed rgba(198, 198, 198, 0.5);
border-radius: 2px;
background: #e9eff8;
color: #666666;
font-size: 14px;
margin-right: 8px;
}
.button-new div {
background: url('~@/assets/img/uploadAdd.png') no-repeat;
color: #666666;
background-position: center;
text-align: center;
height: 90px;
padding-top: 41px;
background-position-y: 22px;
}
.right {
width: 770px;
margin-left: 100px;
margin-top: 24px;
.info-inner {
margin-left: 10px;
margin-right: 10px;
}
.info-title {
font-size: 14px;
font-weight: bold;
}
.baseInfo {
border-radius: 2px;
}
.baseTitle {
padding-left: 20px;
color: #212121;
font-size: 16px;
margin-bottom: 10px;
margin-top: 32px;
background: url("~@/assets/img/biaoti.png") no-repeat;
background-position-y: 2px;
}
.baseInner {
background: rgba(244, 245, 248, 0.8);
padding: 24px 120px;
}
.baseInner1 {
background: rgba(244, 245, 248, 0.8);
padding: 24px 24px;
}
}
::v-deep .el-dialog__header {
background: #0058e1;
// height: 50px;
}
::v-deep .el-dialog__title {
line-height: 18px;
font-size: 18px;
color: #fff;
}
::v-deep .el-upload {
display: inline-flex;
}
::v-deep .el-dialog__body {
padding: 0px;
height: 580px;
overflow: auto;
}
.icon-input ::v-deep .el-input__inner {
cursor: pointer;
}
.detial-form ::v-deep {
.el-form-item {
margin-bottom: 0px;
line-height: 32px;
}
.el-form-item__label {
line-height: 32px;
}
.el-form-item__content {
line-height: 32px;
}
}
::v-deep .el-checkbox-button__inner {
width: 130px;
margin: 0 10px 5px;
border-left: unset !important;
border-radius: unset !important;
border: 1px solid #dcdfe6 !important;
}
</style>
<style lang="scss" scoped>
.mod-sys__menu {
.menu-list,
.icon-list {
.el-input__inner,
.el-input__suffix {
cursor: pointer;
}
}
&-icon-popover {
width: 458px;
overflow: hidden;
}
&-icon-inner {
width: 478px;
max-height: 258px;
overflow-x: hidden;
overflow-y: auto;
}
&-icon-list {
width: 458px;
padding: 0;
margin: -8px 0 0 -8px;
>.el-button {
padding: 8px;
margin: 8px 0 0 8px;
>span {
display: inline-block;
vertical-align: middle;
width: 18px;
height: 18px;
font-size: 18px;
}
}
}
}
.previewImg {
position: fixed;
z-index: 9999;
}
.name {
text-align: right;
vertical-align: middle;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 12px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
line-height: 32px;
width: 120px;
}
.text {
margin-left: 132px;
font-size: 14px;
color: #606266;
line-height: 32px;
}
.title {
text-align: center;
font-weight: 600;
font-size: 18px;
margin-bottom: 10px;
}
.first-title {
text-align: center;
font-weight: 600;
font-size: 18px;
margin-bottom: 10px;
}
.avatar {
height: 100px;
width: 100px;
display: block;
}
</style>

View File

@ -0,0 +1,839 @@
<template>
<div>
<el-dialog custom-class="customClass" :visible.sync="cityVisibleCopy" :title="modalTypeText[modalType]"
@close="closeModal" :close-on-click-modal="false" :close-on-press-escape="false">
<div class="left">
<div class="left-process">
<!-- <el-steps direction="vertical" :active="activeStep">
<el-step :key=index v-for="(item, index) in steps" :title=item @click.native="handleStep(index)"></el-step>
</el-steps> -->
<div class="li1" v-for="(item, index) in steps" :key="index" @click="handleStep(item, index)">
<div v-if="index == activeStepIndex">
<div class="node node1">{{ item.name }}</div>
<div class="borderLeft borderLeft1"></div>
</div>
<div v-else>
<div class="node">{{ item.name }}</div>
<div class="borderLeft"></div>
</div>
<div class="advice"></div>
</div>
</div>
</div>
<!-- 挂载和修改 -->
<div class="right">
<el-form :model="dataForm" :rules="rules" ref="dataForm" @keyup.enter.native="dataFormSubmitHandle()"
:label-width="$i18n.locale === 'en-US' ? '120px' : '100px'">
<!-- 基本信息 -->
<div class="scrollBox" id="anchor1">
<div class="baseTitle">
基本信息
</div>
<div class="baseInner">
<el-form-item label="赋能领域:" prop="unit">
<el-select v-model="dataForm.applicationArea" placeholder="请选择">
<el-option v-for="item in sceneAreas" :key="item.data" :label="item.dict_label"
:value="item.dict_value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="场景名称:" prop="name">
<el-input v-model="dataForm.name" placeholder="请输入名称" style="width:90%"></el-input>
</el-form-item>
<el-form-item label="场景描述:" prop="description">
<el-input type="textarea" :rows="3" v-model="dataForm.description" placeholder="请输入描述"
style="width:90%">
</el-input>
</el-form-item>
<el-form-item label="场景入口:">
<el-input v-model="dataForm.sceneUrl" placeholder="请输入场景入口" style="width:90%"></el-input>
</el-form-item>
<el-form-item label="场景图片:">
<el-upload ref="editUpload" class="upload-demo" :action="fileUploadUrl"
:on-success="eidtHandleAvatarSuccess" :before-upload="editBeforeAvatarUpload" :limit="1"
:file-list="[]" :on-remove="editUploadRemoveFile" :on-exceed="handleExceed" list-type="picture">
<div slot="tip" class="el-upload__tip">只能上传图片文件</div>
<div class="button-new">
<div>点击上传</div>
</div>
<img v-if="imageUrl" :src="imageUrl" class="avatar" />
</el-upload>
</el-form-item>
</div>
</div>
<!-- 场景痛点 -->
<div class="scrollBox" id="anchor2">
<div class="baseTitle">
场景痛点
</div>
<div class="baseInner">
<scene-one-input :dataForm="dataForm" title="场景痛点" @update="updateDataForm" ref="scenePainDom"
:keyTextObj="painKeyTextObj"></scene-one-input>
</div>
</div>
<!-- 解决方案 -->
<div class="scrollBox" id="anchor3">
<div class="baseTitle">
解决方案
</div>
<div class="baseInner">
<scene-one-input :dataForm="dataForm" title="解决方案" @update="updateDataForm" ref="solutionDom"
:keyTextObj="solutionKeyTextObj"></scene-one-input>
</div>
</div>
<!-- 使用能力 -->
<div class="scrollBox" id="anchor4">
<div class="baseTitle">
使用能力
</div>
<div class="baseInner1">
<div class="info-inner">
<ability-add :dataForm="dataForm" @update="updateDataForm" @updateCount="updateCount" ref="abilityAdd1"
title="基础设施" :typeList="baseTypeList"></ability-add>
</div>
<div style="border-bottom: 1px dashed #d3d3d3;margin-bottom: 23px;"></div>
<div class="info-inner">
<ability-add :dataForm="dataForm" @update="updateDataForm" @updateCount="updateCount" ref="abilityAdd2"
title="组件服务" :typeList="componetTypeList"></ability-add>
</div>
<div style="border-bottom: 1px dashed #d3d3d3;margin-bottom: 23px;"></div>
<div class="info-inner">
<ability-add :dataForm="dataForm" @update="updateDataForm" @updateCount="updateCount" ref="abilityAdd3"
title="数据资源" :typeList="dataTypeList"></ability-add>
</div>
</div>
<!-- <InfrastructureModal v-model="dataForm" :dataForm="dataForm" @update="updateDataForm" type="基础设施"
:modalType="modalType" ref="jcssDom"></InfrastructureModal>
<el-form-item label="基础设施总数" >
<el-input v-model="dataForm.infrastructureCount" onkeyup="value=value.replace(/[^\d]/g,0)" placeholder="请输入基础设施总数"></el-input>
</el-form-item>
<combine-ability v-model="dataForm" :dataForm="dataForm" @update="updateDataForm" type="数据资源" ref="sjzyDom"
:getDataParams="getListParams['数据资源']"></combine-ability>
<el-form-item label="数据资源总数" >
<el-input v-model="dataForm.dataSourceCount" onkeyup="value=value.replace(/[^\d]/g,0)" placeholder="请输入基础设施总数"></el-input>
</el-form-item>
<combine-ability v-model="dataForm" :dataForm="dataForm" @update="updateDataForm" type="组件服务" ref="zjfwDom"
:getDataParams="getListParams['组件服务']"></combine-ability>
<el-form-item label="组件服务总数" >
<el-input v-model="dataForm.componentCount" onkeyup="value=value.replace(/[^\d]/g,0)" placeholder="请输入基础设施总数"></el-input>
</el-form-item> -->
</div>
<!-- 构建步骤 -->
<div class="scrollBox" id="anchor5">
<div class="baseTitle">
构建步骤
</div>
<div class="baseInner1">
<scene-use-step :dataForm="dataForm" @update="updateDataForm" ref="sceneUseUpDom">
</scene-use-step>
</div>
</div>
</el-form>
</div>
<template slot="footer">
<el-button type="primary" @click="dataFormSubmitHandle()">提交</el-button>
<el-button @click="closeModal">{{ $t("cancel") }}</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import debounce from 'lodash/debounce'
import qs from 'qs'
import SceneUseStep from './components/scene-use-step.vue'
import SceneOneInput from './components/scene-one-input.vue'
import AbilityAdd from './components/ability-add.vue'
import CombineAbility from '../components/combine-ability.vue'
import CommonQuestion from '../components/common-question.vue'
import InfrastructureModal from './components/infrastructure-modal.vue'
import Cookies from 'js-cookie'
import upload from '@/views/modules/components/upload'
export const getDescJson = (text) => {
return {
descObj: {
text: `${text}描述`,
key: 'description'
}
}
}
//
export const modalTypeText = {
add: '场景挂接',
update: '场景修改'
}
export default {
components: {
SceneUseStep,
CombineAbility,
SceneOneInput,
upload,
CommonQuestion,
InfrastructureModal,
AbilityAdd
},
watch: {
dataForm: {
handler(newVal) {
this.dataForm = newVal
},
deep: true,
immediate: true
},
cityVisible: {
handler(newVal) {
this.getSceneArea()
this.cityVisibleCopy = newVal
if (this.modalType == 'add' && newVal) {
// localStorage.setItem('InfrastructureSearchData', JSON.stringify({}))
this.getDetail(this.dataForm)
}
},
immediate: true
}
},
props: {
modalType: {
type: String,
default: 'add'
},
cityVisible: {
type: Boolean,
default: false
}
},
data() {
return {
domArr: [],
scrollTop: 0,
selectNow: '',
activeStepIndex: 0,//
activeStepIndexs: 0,
baseTypeList: [{ value: '视频资源', label: '视频资源' }, { value: '云资源', label: '云资源' }, { value: '其他', label: '其他' }],
componetTypeList: [{ value: '智能算法', label: '智能算法' }, { value: ' 图层服务', label: ' 图层服务' },
{ value: '开发组件', label: '开发组件' }, { value: '业务组件', label: '业务组件' }],
dataTypeList: [{ value: '数据', label: '数据' }],
sceneAreas: [],//
steps: [{ 'name': '基本信息', 'id': "anchor1" },
{ 'name': '场景痛点', 'id': "anchor2" },
{ 'name': '解决方案', 'id': "anchor3" },
{ 'name': '使用能力', 'id': "anchor4" },
{ 'name': '构建步骤', 'id': "anchor5" }],
fileUploadUrl: window.SITE_CONFIG.apiURL + '/upload',
painKeyTextObj: getDescJson('痛点'),
solutionKeyTextObj: getDescJson('方案'),
dataForm: {
district: 0,//
area: '',//
infrastructureCount: null,
dataSourceCount: null,
componentCount: null,
name: '',
applicationArea: '',//
description: '',
sceneUrl: '',
fuseAttrList: [
{
attrType: '构建步骤',
attrValue: [{ question: '', answer: [{ 'answer': '' }, { 'answer': '' }] }]
},
{
attrType: '基础设施',
attrValue: [{ name: '', type: '', dept: '' }]
},
{
attrType: '组件服务',
attrValue: [{ name: '', type: '', dept: '' }]
},
{
attrType: '数据资源',
attrValue: [{ name: '', type: '', dept: '' }]
},
{
attrType: '场景痛点',
attrValue: [{ description: '' }]
},
{
attrType: '解决方案',
attrValue: [{ description: '' }]
},
{
attrType: '服务图片',
attrValue: ''
}
],
},
rules: {
name: [
{
required: true,
message: '请输入名称',
trigger: 'change'
}
],
description: [
{
required: true,
message: '请输入描述',
trigger: 'change'
}
]
},
checkList: ['基本信息', '场景痛点', '解决方案', '使用能力', '构建步骤'],
cityVisibleCopy: this.cityVisible,
displayInfo: {
name: '名称',
description: '描述'
},
modalTypeText: modalTypeText,
refsParseArray: {
sceneUseUpDom: '构建步骤',
moreAbilityDom: '更多能力',
scenePainDom: '场景痛点',
solutionDom: '解决方案',
abilityAdd1: '基础设施',
abilityAdd2: '组件服务',
abilityAdd3: '数据资源'
},
abilityListObj: {},
imgData: [],
//
handleExceed() {
this.$message({ type: 'error', message: '最多支持一张图片上传' })
},
imageUrl: ''
}
},
methods: {
handleStep(item, index) {
this.activeStepIndex = index
this.selectNow = item.id //
let top = document.querySelector('#' + item.id).offsetTop - 100
document.querySelectorAll(".customClass .el-dialog__body")[0].scrollTop = top
},
//
getSceneArea() {
const params = {
topCategoryName: '应用资源'
}
this.$http
.get('/category/getAllFilterCriteriaByTopCategory/', {
params
})
.then((res) => {
this.sceneAreas = res.data.data[0].typeList
})
},
clearForm() {
this.$refs.dataForm && this.$refs.dataForm.resetFields()
},
closeModal() {
this.$emit('closeModal')
},
//
updateDataForm(data) {
this.dataForm.fuseAttrList.map(v => {
if (v.attrType === data.title) {
v.attrValue = data.list
}
})
},
//
updateCount(data) {
if (data.title === '基础设施') {
this.dataForm.infrastructureCount = data.count
}
if (data.title === '组件服务') {
this.dataForm.componentCount = data.count
}
if (data.title === '数据资源') {
this.dataForm.dataSourceCount = data.count
}
},
//
dataFormSubmitHandle: debounce(
function () {
this.$refs.dataForm.validate((valid) => {
if (!valid) {
this.$message.error('请检查表单是否填写完整')
return false
}
const methodsObj = {
add: 'post',
update: 'put'
}
// if (this.imageUrl == '') {
// this.$message.error('')
// return
// }
this.dataForm.fuseAttrList.find(v => v.attrType == '服务图片').attrValue = this.imageUrl || ''
const _obj = Object.assign({}, this.dataForm, {
type: '赋能场景'
})
this.dataForm.fuseAttrList.forEach(item => {
if(item.attrType!=='服务图片'){
item.attrValue = JSON.stringify(item.attrValue);
}
})
this.$http
[methodsObj[this.modalType]]('/fuse', _obj)
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.$refs.dataForm && this.$refs.dataForm.resetFields()
this.$emit('refreshDataList')
this.$emit('closeModal')
}
})
})
.catch((err) => {
this.$message.error(err)
})
})
},
1000,
{ leading: true, trailing: false }
),
//
getDetail(data) {
this.dataForm = data
this.$nextTick(() => {
for (const key in this.refsParseArray) {
this.$refs[key] && this.$refs[key].getDataInfo && this.$refs[key].getDataInfo(data)
}
const _imgObj = data.fuseAttrList.find(v => v.attrType == '服务图片') || {}
this.imageUrl = _imgObj.attrValue
})
},
handleAvatarSuccess(res, file) {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.imageUrl = res.data
},
beforeAvatarUpload(file) {
const isImage =
file.type === 'image/jpeg' ||
file.type === 'image/jpg' ||
file.type === 'image/png'
if (!isImage) {
this.$message.error('上传头像图片只能是 jpg/png 格式!')
}
return isImage
},
addUploadRemoveFile(file, fileList) {
this.$refs.addUpload.clearFiles()
this.imageUrl = ''
},
editBeforeAvatarUpload(file) {
const isImage =
file.type === 'image/jpeg' ||
file.type === 'image/jpg' ||
file.type === 'image/png'
if (!isImage) {
this.$message.error('上传头像图片只能是 jpg/png 格式!')
}
return isImage
},
editUploadRemoveFile(file, fileList) {
this.$refs.editUpload.clearFiles()
this.imageUrl = ''
},
eidtHandleAvatarSuccess(res, file) {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.imageUrl = res.data
}
},
mounted() {
const that = this;
this.$nextTick(() => {
document.querySelector(".el-dialog__body").onscroll = function () {
let top = document.querySelectorAll(".customClass .el-dialog__body")[0].scrollTop - 100
if (top < document.querySelector('#anchor1').offsetTop - 100) {
that.activeStepIndexs = 0
}
else if (top < document.querySelector('#anchor2').offsetTop - 100) {
that.activeStepIndexs = 1
}
else if (top < document.querySelector('#anchor3').offsetTop - 100) {
that.activeStepIndexs = 2
}
else if (top < document.querySelector('#anchor4').offsetTop - 100) {
that.activeStepIndexs = 3
}
else if (top < document.querySelector('#anchor5').offsetTop - 100) {
that.activeStepIndexs = 4
} else {
that.activeStepIndexs = 0
}
if (that.activeStepIndex !== that.activeStepIndexs) {
that.activeStepIndex = that.activeStepIndexs;
that.$forceUpdate();
}
}
})
},
beforeDestroy() {
this.clearForm()
}
}
</script>
<style lang="scss" scoped>
.fixed {
position: sticky;
z-index: 10012;
top: 0;
left: 50%;
margin-left: -9.56rem;
}
.button-new {
height: 90px;
width: 128px;
border: 1px dashed rgba(198, 198, 198, 0.5);
border-radius: 2px;
background: #e9eff8;
color: #666666;
font-size: 14px;
margin-right: 8px;
}
.button-new div {
background: url('~@/assets/img/uploadAdd.png') no-repeat;
color: #666666;
background-position: center;
text-align: center;
height: 90px;
padding-top: 41px;
background-position-y: 22px;
}
.left {
width: 135px;
height: 650px;
position: fixed;
background: rgba(244, 245, 248, 0.8);
.left-process {
height: 300px;
position: fixed;
padding-left: 18px;
padding-top: 24px;
.li1 {
list-style: none;
box-sizing: border-box;
padding-left: 20px;
position: relative;
}
.borderLeft {
width: 1px;
height: 100%;
background-color: #1160e2;
position: absolute;
top: 11.225px;
bottom: 0;
left: -1px;
}
.borderLeft1 {
background-color: #1160e2;
;
}
.node::before {
z-index: 1;
content: "";
background-color: #fff;
border: 1px solid #1160e2;
width: 12px;
height: 12px;
color: #fff;
position: absolute;
border-radius: 50%;
left: 0;
top: 11.225px;
transform: translate(-50%, -50%);
}
.node {
cursor: pointer;
font-size: 16px;
line-height: 22.5px;
font-weight: 500;
color: #212121;
}
.node1 {
color: #0058e1;
}
.node1::before {
width: 16px;
height: 16px;
background-color: #fff;
border-radius: 50%;
border: 4px solid #1160e2;
}
.advice {
font-size: 10px;
color: #1160e2;
padding-bottom: 46px;
}
.li1:last-child .borderLeft {
display: none;
}
}
}
.right {
width: 770px;
margin-left: 157px;
margin-top: -5px;
.info-inner {
margin-left: 10px;
margin-right: 10px;
}
.info-title {
font-size: 14px;
font-weight: bold;
}
.baseInfo {
border-radius: 2px;
}
.baseTitle {
padding-left: 20px;
color: #212121;
font-size: 16px;
margin-bottom: 10px;
margin-top: 32px;
background: url("~@/assets/img/biaoti.png") no-repeat;
background-position-y: 2px;
}
.baseInner {
background: rgba(244, 245, 248, 0.8);
padding: 24px 120px;
}
.baseInner1 {
background: rgba(244, 245, 248, 0.8);
padding: 24px 24px;
}
}
::v-deep .el-dialog__header {
background: #0058e1;
// height: 50px;
}
::v-deep .el-dialog__title {
line-height: 18px;
font-size: 18px;
color: #fff;
}
::v-deep .el-upload {
display: inline-flex;
}
::v-deep .el-dialog__body {
padding: 0px;
height: 580px;
overflow: auto;
}
.icon-input ::v-deep .el-input__inner {
cursor: pointer;
}
.detial-form ::v-deep {
.el-form-item {
margin-bottom: 0px;
line-height: 32px;
}
.el-form-item__label {
line-height: 32px;
}
.el-form-item__content {
line-height: 32px;
}
}
::v-deep .el-checkbox-button__inner {
width: 130px;
margin: 0 10px 5px;
border-left: unset !important;
border-radius: unset !important;
border: 1px solid #dcdfe6 !important;
}
</style>
<style lang="scss" scoped>
.mod-sys__menu {
.menu-list,
.icon-list {
.el-input__inner,
.el-input__suffix {
cursor: pointer;
}
}
&-icon-popover {
width: 458px;
overflow: hidden;
}
&-icon-inner {
width: 478px;
max-height: 258px;
overflow-x: hidden;
overflow-y: auto;
}
&-icon-list {
width: 458px;
padding: 0;
margin: -8px 0 0 -8px;
>.el-button {
padding: 8px;
margin: 8px 0 0 8px;
>span {
display: inline-block;
vertical-align: middle;
width: 18px;
height: 18px;
font-size: 18px;
}
}
}
}
.previewImg {
position: fixed;
z-index: 9999;
}
.name {
text-align: right;
vertical-align: middle;
font-size: 14px;
color: #606266;
line-height: 40px;
padding: 0 12px 0 0;
-webkit-box-sizing: border-box;
box-sizing: border-box;
line-height: 32px;
width: 120px;
}
.text {
margin-left: 132px;
font-size: 14px;
color: #606266;
line-height: 32px;
}
.title {
text-align: center;
font-weight: 600;
font-size: 18px;
margin-bottom: 10px;
}
.first-title {
text-align: center;
font-weight: 600;
font-size: 18px;
margin-bottom: 10px;
}
.avatar {
height: 100px;
width: 100px;
display: block;
}
</style>

View File

@ -0,0 +1,239 @@
<template>
<div>
<div class="info-title">{{ title }}</div>
<el-form :inline="true">
<el-form-item label="使用总数">
<el-input
v-model="count"
onkeyup="value=value.replace(/[^\d]/g,0)"
placeholder="请输入总数"
style="width: 320px"
></el-input>
</el-form-item>
<el-form-item>
<div class="submit">
<a-button type="primary" @click="addBaseInfo">
<img
style="height: 12px; width: 12px; margin-top: -2px"
src="~@/assets/img/jiahao.png"
alt=""
/>
<span style="margin-left: 4px">添加实例数据</span>
</a-button>
</div>
</el-form-item>
</el-form>
<div style="margin-bottom: 20px">
<el-table v-if="dataInfo.length > 0" :data="dataInfo" border>
<el-table-column label="序号" width="55">
<template slot-scope="scope">{{
scope.$index + 1 > 9 ? scope.$index + 1 : "0" + (scope.$index + 1)
}}</template>
</el-table-column>
<el-table-column label="数据名称" width="180">
<template slot-scope="scope">
<el-input
v-model="scope.row.name"
placeholder="请输入数据名称"
></el-input>
</template>
</el-table-column>
<el-table-column label="类型" width="200">
<template slot-scope="scope">
<el-select :ref="scope.row.id" v-model="scope.row.type">
<el-option
v-for="item in typeList"
:label="item.label"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="来源部门" width="180">
<template slot-scope="scope">
<el-input
v-model="scope.row.dept"
placeholder="请输入来源部门"
></el-input>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<span
style="color: #0058e1"
@click="handleDelete(scope.$index, scope.row)"
>删除</span
>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
export default {
props: {
dataForm: {
type: Object,
default: () => {},
},
title: {
type: String,
default: "",
},
typeList: {
type: Array,
default: () => [],
},
},
watch: {
dataInfo: {
handler(newVal) {
this.dataInfo = newVal;
this.$emit("update", {
title: this.title,
list: newVal,
});
},
deep: true,
immediate: true,
},
count: {
handler(newVal) {
this.count = newVal;
this.$emit("updateCount", {
title: this.title,
count: newVal,
});
},
deep: true,
immediate: true,
},
},
data() {
return {
count: "",
dataInfo: [],
};
},
methods: {
addBaseInfo() {
let data = {
name: "",
type: "",
dept: "",
};
this.dataInfo.push(data);
},
handleDelete(row) {
this.dataInfo.splice(row, 1);
},
getDataInfo(dataForm) {
let arr = [];
if (dataForm && (dataForm.id || dataForm.id === 0)) {
if (this.title === "基础设施") {
this.count = dataForm.infrastructureCount;
}
if (this.title === "组件服务") {
this.count = dataForm.componentCount;
}
if (this.title === "数据资源") {
this.count = dataForm.dataSourceCount;
}
let fuseAttrList = dataForm.fuseAttrList || [];
let obj = fuseAttrList.find((v) => v.attrType === this.title) || {};
let attrValue = JSON.parse(obj.attrValue || "[]");
if (attrValue.length > 0) {
attrValue.map((v) => {
arr.push(v);
});
} else {
arr = [];
}
} else {
arr = [];
}
this.dataInfo = arr;
},
//
addItem() {
let index = this.dataInfo.length - 1;
if (this.dataInfo[index][this.keyTextObj.descObj.key] === "") {
return this.$message.warning("请填写完整信息!");
}
this.dataInfo.push({
[this.keyTextObj.descObj.key]: "",
});
},
//
deleteItem(index) {
this.$confirm("确认是否删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$message({
type: "success",
message: "删除成功!",
});
this.dataInfo.splice(index, 1);
})
.catch(() => {});
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-table thead {
height: 40px;
}
::v-deep .el-table th {
font-weight: normal;
background-color: #e3e4e5 !important;
}
.submit {
font-size: 0.14rem;
margin-left: 8px;
.ant-btn {
width: 128px;
height: 32px;
text-align: center;
background: #fff;
color: #0558e1;
border: 1px solid #0558e1;
border-radius: 2px;
font-size: 14px;
}
.ant-btn:hover {
background: #fff;
color: #0558e1;
opacity: 0.8;
}
.ant-btn:active {
background: #fff;
color: #0558e1;
opacity: 0.8;
}
}
.info-title {
font-size: 14px;
font-weight: bold;
margin-bottom: 16px;
}
.add-btn {
margin-left: 10px;
}
</style>

View File

@ -1,20 +1,39 @@
<template>
<div class="question-box">
<div class="title">
<!-- <div class="title">
{{ title }}
</div>
</div> -->
<div v-for="(item, index) in dataInfo" :key="index">
<el-form-item :label="keyTextObj.descObj.text">
<el-form-item :label=keyTextObj.descObj.text+(index+1)>
<el-input type="textarea" :rows="2" v-model="item[keyTextObj.descObj.key]"
:placeholder="`请输入${keyTextObj.descObj.text}`" style="width:90%">
</el-input>
<el-button style="margin-left:10px" @click="deleteItem(index)" type="danger" size="small"
v-if="dataInfo.length > 1">删除
</el-button>
<!-- <icon class="el-icon-remove" style="color:red;margin-left: 2px;"
@click="deleteItem(index)" type="danger" size="small"
v-if="dataInfo.length > 1"></icon> -->
<img
style="color:red;margin-left: 6px;"
@click="deleteItem(index)" type="danger" size="small"
v-if="dataInfo.length > 1"
src="~@/assets/img/deleteRed.png"
alt=""
/>
<!-- <el-button style="margin-left:10px" >删除
</el-button> -->
</el-form-item>
<el-button class="add-btn" size="small" v-if="index == dataInfo.length - 1" @click="addItem" type="primary">
添加
</el-button>
<!-- <el-button class="add-btn" icon="el-icon-circle-plus-outline" size="small" v-if="index == dataInfo.length - 1" @click="addItem" type="primary">
添加
</el-button> -->
<div class="submit">
<a-button type="primary" v-if="index == dataInfo.length - 1" @click="addItem" >
<img
style="height: 12px; width: 12px;margin-top: -2px;"
src="~@/assets/img/jiahao.png"
alt=""
/>
<span style="margin-left: 4px">添加{{keyTextObj.descObj.text}}</span>
</a-button>
</div>
</div>
</div>
</template>
@ -115,6 +134,31 @@ export default {
}
</script>
<style lang="scss" scoped>
.submit {
font-size: 0.14rem;
margin-left: 100px;
.ant-btn {
width: 386px;
height: 32px;
text-align: center;
background: #fff;
color: #0558e1;
border: 1px solid #0558e1;
border-radius: 2px;
font-size: 14px;
}
.ant-btn:hover{
background: #fff;
color: #0558e1;
opacity: 0.8;
}
.ant-btn:active{
background: #fff;
color: #0558e1;
opacity: 0.8
}
}
.question-box {
.title {
text-align: center;

View File

@ -1,14 +1,102 @@
<template>
<div class="question-box">
<div class="title">
能力使用步骤
<div>
<div v-for="(item, index) in dataInfo" :key="index">
<div class="question-box">
<span>步骤标题{{ index + 1 }}: </span>
<el-input
v-model="item.question"
placeholder="请输入标题"
style="width: 200px"
:disabled="disabledType"
>
</el-input>
<img
style="color: red; margin-left: 6px"
@click="deleteItem(index)"
type="danger"
size="small"
v-if="!disabledType && dataInfo.length > 1"
src="~@/assets/img/deleteRed.png"
alt=""
/>
</div>
<div class="question-box1">
<div
class="question-box-right"
v-for="(itemson, index) in item.answer"
:key="index"
>
<span>步骤小节: </span>
<el-input
v-if="index != item.answer.length - 1"
v-model="itemson.answer"
placeholder="请输入步骤小节"
style="width: 200px"
:disabled="disabledType"
>
</el-input>
<div v-else style="display: inline">
<el-input
v-model="itemson.answer"
placeholder="请输入步骤小节"
style="width: 200px"
:disabled="disabledType"
>
</el-input>
<div class="submit1">
<a-button type="primary" @click="addAnswerItem(item.answer)">
<img
style="height: 12px; width: 12px; margin-top: -2px"
src="~@/assets/img/jiahao.png"
alt=""
/>
<span style="margin-left: 4px">添加小节</span>
</a-button>
</div>
</div>
</div>
<!-- <a-button type="primary" v-if="!disabledType && index == dataInfo.length - 1"
@click="addItem">
<img
style="height: 12px; width: 12px;margin-top: -2px;"
src="~@/assets/img/jiahao.png"
alt=""
/>
<span style="margin-left: 4px">添加小节</span>
</a-button> -->
<!-- <div class="question-box-right">
<span>步骤小节: </span>
<el-input v-model="itemson.answer" placeholder="请输入步骤小节" style="width:200px"
:disabled="disabledType">
</el-input>
</div> -->
</div>
<div class="submit">
<a-button
type="primary"
v-if="!disabledType && index == dataInfo.length - 1"
@click="addItem"
>
<img
style="height: 12px; width: 12px; margin-top: -2px"
src="~@/assets/img/jiahao.png"
alt=""
/>
<span style="margin-left: 4px">添加步骤</span>
</a-button>
</div>
</div>
<!-- <div class="question-box">
<div v-for="(item, index) in dataInfo" :key="index">
<el-form-item label="标题" prop="question">
<el-form-item label="步骤标题" prop="question">
<el-input v-model="item.question" placeholder="请输入标题" style="width:90%" :disabled="disabledType">
</el-input>
</el-form-item>
<el-form-item label="解释说明" prop="question">
<el-form-item label="步骤" prop="question">
<el-input type="textarea" :rows="3" v-model="item.answer" placeholder="请输入解释说明" style="width:90%"
:disabled="disabledType">
</el-input>
@ -19,123 +107,180 @@
<el-button class="add-btn" size="small" v-if="!disabledType && index == dataInfo.length - 1"
@click="addItem" type="primary">添加
</el-button>
</div>
</div> -->
<div class="step-box">
<!-- <div class="step-box">
<el-steps :active="2">
<el-step status="finish" :title="item.question || `标题${index + 1}`" v-for="(item, index) in dataInfo"
:key="index">
</el-step>
</el-steps>
</div>
</div>
</div> -->
</div>
</template>
<script>
export default {
props: {
dataForm: {
type: Object,
default: () => { }
},
//
disabledType: {
type: Boolean,
default: false
},
props: {
dataForm: {
type: Object,
default: () => {},
},
data() {
return {
dataInfo: []
}
//
disabledType: {
type: Boolean,
default: false,
},
watch: {
dataInfo: {
handler(newVal) {
this.dataInfo = newVal;
this.$emit('update', {
title: '使用步骤',
list: newVal
})
},
deep: true,
immediate: true,
},
},
data() {
return {
dataInfo: [],
};
},
watch: {
dataInfo: {
handler(newVal) {
this.dataInfo = newVal;
this.$emit("update", {
title: "构建步骤",
list: newVal,
});
},
deep: true,
immediate: true,
},
methods: {
getDataInfo(dataForm) {
let arr = []
let fuseAttrList = dataForm.fuseAttrList || [];
let obj = fuseAttrList.find(v => v.attrType === '使用步骤') || {}
let attrValue = JSON.parse(obj.attrValue || "[]")
},
methods: {
getDataInfo(dataForm) {
let arr = [];
let fuseAttrList = dataForm.fuseAttrList || [];
let obj = fuseAttrList.find((v) => v.attrType === "构建步骤") || {};
let attrValue = obj.attrValue || [];
if (attrValue.length > 0) {
attrValue.map(v => {
arr.push({
question: v.question,
answer: v.answer,
})
})
} else {
arr = []
arr.push({
question: "",
answer: "",
})
}
this.dataInfo = arr;
},
//
addItem() {
let index = this.dataInfo.length - 1;
if (this.dataInfo[index].question === '' || this.dataInfo[index].answer === '') {
return this.$message.warning('请填写完整信息!')
}
if (this.dataInfo.length >= 6) {
return this.$message.warning('最多添加6个使用步骤')
}
this.dataInfo.push({
question: "",
answer: "",
})
},
//
deleteItem(index) {
this.$confirm('确认是否删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$message({
type: 'success',
message: '删除成功!'
});
this.dataInfo.splice(index, 1)
}).catch(() => {
});
}
}
}
if (attrValue.length > 0) {
attrValue = JSON.parse(attrValue);
attrValue.map((v) => {
arr.push({
question: v.question,
answer: v.answer,
});
});
} else {
arr = [];
arr.push({
question: "",
answer: [{ answer: "" }, { answer: "" }],
});
}
this.dataInfo = arr;
},
//
addItem() {
let index = this.dataInfo.length - 1;
if (this.dataInfo[index].answer === "") {
return this.$message.warning("请填写完整信息!");
}
if (this.dataInfo.length >= 6) {
return this.$message.warning("最多添加6个使用步骤");
}
this.dataInfo.push({
question: "",
answer: [{ answer: "" }, { answer: "" }],
});
},
addAnswerItem(itemson) {
itemson.push({});
},
//
deleteItem(index) {
this.$confirm("确认是否删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$message({
type: "success",
message: "删除成功!",
});
this.dataInfo.splice(index, 1);
})
.catch(() => {});
},
},
};
</script>
<style lang="scss" scoped>
.submit1 {
display: inline;
font-size: 0.14rem;
margin-left: 8px;
.ant-btn {
width: 94px;
height: 32px;
text-align: center;
background: #fff;
color: #0558e1;
border: 1px solid #0558e1;
border-radius: 2px;
font-size: 14px;
}
.ant-btn:hover {
background: #fff;
color: #0558e1;
opacity: 0.8;
}
.ant-btn:active {
background: #fff;
color: #0558e1;
opacity: 0.8;
}
}
.submit {
font-size: 0.14rem;
margin-left: 180px;
.ant-btn {
width: 370px;
height: 32px;
text-align: center;
background: #fff;
color: #0558e1;
border: 1px solid #0558e1;
border-radius: 2px;
font-size: 14px;
}
.ant-btn:hover {
background: #fff;
color: #0558e1;
opacity: 0.8;
}
.ant-btn:active {
background: #fff;
color: #0558e1;
opacity: 0.8;
}
}
.question-box {
margin-bottom: 20px;
margin-top: 40px;
.title {
text-align: center;
font-weight: 600;
font-size: 18px;
margin-bottom: 10px;
}
float: left;
width: 42%;
}
.question-box1 {
float: left;
width: 56%;
border-left: 1px solid #dfdfdf;
margin-bottom: 20px;
}
.question-box-right {
margin-left: 24px;
margin-bottom: 16px;
}
.step-box {
padding: 20px 10px 10px 10px;
padding: 20px 10px 10px 10px;
}
.add-btn {
margin-top: -12px;
margin-left: 100px;
margin-top: -12px;
margin-left: 100px;
}
</style>

View File

@ -1,6 +1,21 @@
<template>
<el-card shadow="never" class="aui-card--fill">
<div class="mod-ability__bsabilityai">
<div class="second-title">
<div
:class="[choose === 0 ? 'departmentStyle' : 'departmentStyle1']"
@click="handleChose(0)"
>
市级领域场景
</div>
<div
:class="[choose === 1 ? 'departmentStyle' : 'departmentStyle1']"
@click="handleChose(1)"
>
基层场景
</div>
</div>
<el-form :inline="true" :model="dataForm">
<el-form-item>
<el-input v-model="dataForm.name" placeholder="名称" clearable></el-input>
@ -40,21 +55,36 @@
</el-pagination>
<!-- 弹窗, 新增 / 修改 -->
<add-update-scene v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="query" @closeModal="closeModal"
<!-- <add-update-scene v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="query" @closeModal="closeModal"
:addOrUpdateVisible="addOrUpdateVisible" :modalType="modalType">
</add-update-scene>
</add-update-scene> -->
<!-- 市级挂接 -->
<city-add v-if="cityVisible" ref="cityAdd" @refreshDataList="query" @closeModal="closeModal"
:cityVisible="cityVisible" :modalType="modalType">
</city-add>
<!--基层挂架-->
<area-add v-if="areaVisible" ref="areaAdd" @refreshDataList="query" @closeModal="closeModal"
:areaVisible="areaVisible" :modalType="modalType">
</area-add>
</div>
</el-card>
</template>
<script>
import mixinViewModule from "@/mixins/view-module";
import AddUpdateScene from "./add-update-scene";
import cityAdd from "./city-add";
import areaAdd from "./area-add";
export default {
mixins: [mixinViewModule],
data() {
return {
//
cityVisible:false,
//
areaVisible:false,
//tab
choose: 0,
tableData: [],
childName: '',
mixinViewModuleOptions: {
@ -69,20 +99,27 @@ export default {
name: "",
order: 'desc',
orderField: 'create_date',
type: '赋能场景'
type: '赋能场景',
district: 0//0 1
},
qp: false,
modalType: 'add',
};
},
components: {
AddUpdateScene,
areaAdd,
cityAdd
},
mounted() {
window.addEventListener("resize", this.a);
this.fullScreen();
},
methods: {
handleChose(index) {
this.choose = index;
this.searchData()
},
deleteRow(id) {
this.$confirm('确认是否删除?', '提示', {
confirmButtonText: '确定',
@ -112,6 +149,7 @@ export default {
},
//
searchData() {
this.dataForm.district=this.choose
this.query()
},
//
@ -121,20 +159,36 @@ export default {
},
//
handleUpdate(val) {
this.addOrUpdateVisible = true;
if(this.choose==0){
this.cityVisible=true
}else{
this.areaVisible=true
}
this.modalType = 'update';
const cloneVal = JSON.parse(JSON.stringify(val))
this.$nextTick(() => {
this.$refs.addOrUpdate.getDetail(cloneVal)
if(this.choose==0){
this.$refs.cityAdd.getDetail(cloneVal)
}else{
this.$refs.areaAdd.getDetail(cloneVal)
}
})
},
//
addServe() {
this.addOrUpdateVisible = true
//this.addOrUpdateVisible = true
this.modalType = 'add';
if(this.choose===0){
this.cityVisible=true
}else{
this.areaVisible=true
}
},
closeModal() {
this.addOrUpdateVisible = false;
this.cityVisible = false;
this.areaVisible=false;
},
//
showDetail(val) {
@ -164,6 +218,32 @@ export default {
};
</script>
<style lang="scss" scoped>
.second-title {
margin-bottom: 16px;
font-size: 14px;
cursor: pointer;
text-align: center;
width: 100%;
height: 32px;
line-height: 32px;
background: rgb(0,0,0,0.03);
border-bottom: 1px solid #d9d9d9;
}
.departmentStyle {
float: left;
width: 100px;
color: #0058e1;
background-color: #fff;
border-right: 1px solid #d9d9d9;
border-left: 1px solid #d9d9d9;
border-top: 1px solid #d9d9d9;
}
.departmentStyle1 {
float: left;
width: 100px;
}
.el-tooltip__popper {
max-width: 50%;
}

View File

@ -230,7 +230,7 @@
:close-on-press-escape="false"
:destroy-on-close="true"
:before-close="clear"
width="50%"
width="60%"
>
<putOnTheShelf
ref="putOnTheShelf"
@ -271,6 +271,7 @@ export default {
radio: '',
showPutOnTheShelfFlag: false,
showPutOnTheShelfFlag2: false,
// routePath: '',
submitFrom: {
type: '组件服务',
deptId: '',
@ -328,7 +329,6 @@ export default {
this.dataForm.name = ''
this.dataForm.type = '组件服务'
this.$http.get('/sys/user/info').then(res => {
console.log('res', res.data.data, !res.data.data.superAdmin, this.$store.state.user.roleIdList)
this.superAdmin = res.data.data.superAdmin
})
},
@ -340,7 +340,6 @@ export default {
//
toppingCapacity (item) {
this.$http.put('/resource/pin_top/' + item.id).then(res => {
console.log('置顶', res.data.code)
if (res.data.code == 0) {
this.$message({
message: '置顶成功',
@ -420,7 +419,6 @@ export default {
})
this.dataList[index].infoList2 = dataListSinforList
})
console.log('this.dataList', this.dataList)
this.total = this.mixinViewModuleOptions.getDataListIsPage
? res.data.total
: 0
@ -443,7 +441,7 @@ export default {
},
showDetail (val) {
console.log(val)
window.open(window.SITE_CONFIG.previewUrl + '#/details?id=' + val.id)
window.open(window.SITE_CONFIG.previewUrl + '#/details?id=' + val.id + '&&hiddenBackFlag=true')
// this.addOrUpdateHandle(id)
// this.addOrUpdateVisible = true
// this.disabled = false
@ -490,7 +488,6 @@ export default {
this.uuidTwo = this.uuid(13, 16)
this.uuidSnum = this.uuidOne + this.uuidTwo
this.uuidSnum = this.uuidSnum.replace(/\s+/g, '')
console.log('this.uuidOne', this.uuidSnum)
},
showDocument (val) {
//
@ -629,6 +626,7 @@ export default {
},
//
clear () {
// this.$router.push(this.routePath)
console.log('清空----------------------------------------')
this.notFilled = []
this.showPutOnTheShelfFlag = false
@ -659,6 +657,7 @@ export default {
})
},
showPutOnTheShelfVue () {
// this.routePath = this.$route.path
this.showPutOnTheShelfFlag = false
this.showPutOnTheShelfFlag2 = true
this.submitFrom.infoList[0].attrValue = this.radio
@ -667,7 +666,6 @@ export default {
)[0].children
},
changeInfoList (obj) {
console.log(obj, this.submitFrom)
this.submitFrom.infoList = this.submitFrom.infoList.filter(
(item) => item.attrType !== obj.attrType
)
@ -691,14 +689,12 @@ export default {
},
//
deleteCompletely (row) {
console.log('完全删除===', row)
this.$confirm('确认是否删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$http.post('/resource/delResBySuAd?id=' + row.id).then(res => {
console.log('删除结果', res.data)
if (res.data.code == 0) {
this.$message({
type: 'success',
@ -715,7 +711,6 @@ export default {
})
},
submitData () {
console.log('提交11111111111===============>', this.putOnTheShelfList, this.submitFrom)
const arr = []
this.putOnTheShelfList.map((item) => {
item.children.map((child) => {
@ -824,6 +819,7 @@ export default {
}
})
})
this.submitFrom.infoList = this.submitFrom.infoList.sort(
(a, b) => arr.indexOf(a.attrType) - arr.indexOf(b.attrType)
)
@ -872,7 +868,6 @@ export default {
if ((this.radio === '业务组件' || this.radio === '开发组件') && (!this.submitFrom.infoList.filter(val => val.attrType === '组件地址')[0] || !this.submitFrom.infoList.filter(val => val.attrType === '组件地址')[0].attrValue)) {
this.notFilled.push('组件地址')
}
console.log(this.submitFrom, this.notFilled, '表单验证')
if (this.notFilled.length > 0) {
this.$message({
message: '请填写必填字段!',
@ -886,8 +881,6 @@ export default {
val.attrValue = this.radio
}
})
console.log('编辑===============>', this.submitFrom)
console.log(this.submitFrom.infoList, '===============abc')
//
const newArr = this.submitFrom.infoList.filter(
(element, index, self) => {
@ -911,7 +904,6 @@ export default {
})
.catch(() => {})
} else {
console.log('提交11111111111===============>', this.putOnTheShelfList, this.submitFrom)
this.$http
.post('/resource/insert?source= b', this.submitFrom)
.then(({ data: res }) => {

View File

@ -217,8 +217,8 @@
:close-on-press-escape='false'
:destroy-on-close='true'
:before-close='clear'
width="50%">
<putOnTheShelf :required="required" :notFilled="notFilled":putOnTheShelfList='putOnTheShelfList' @changeInfoList='changeInfoList' :type='radio' :typeInput='typeInput'></putOnTheShelf>
width="60%">
<putOnTheShelf :required="required" :notFilled="notFilled" :putOnTheShelfList='putOnTheShelfList' @changeInfoList='changeInfoList' :type='radio' :typeInput='typeInput'></putOnTheShelf>
<span slot="footer" class="dialog-footer">
<el-button @click="clear"> </el-button>
<el-button type="primary" @click="submitData"> </el-button>
@ -271,6 +271,7 @@ export default {
insertList: [],
putOnTheShelfList: [],
showPutOnTheShelfFlag2: false,
// routePath: '',
submitFrom: {
type: '应用资源',
deptId: '',
@ -358,7 +359,7 @@ export default {
})
},
showDetail (val) {
window.open(window.SITE_CONFIG.previewUrl + '#/details?id=' + val.id)
window.open(window.SITE_CONFIG.previewUrl + '#/details?id=' + val.id + '&&hiddenBackFlag=true')
// this.addOrUpdateVisible = true
// this.disabled = false
// this.$nextTick(() => {
@ -594,6 +595,7 @@ export default {
},
//
clear () {
// this.$router.push(this.routePath)
this.notFilled = []
this.showPutOnTheShelfFlag2 = false
this.insertList = []
@ -615,6 +617,7 @@ export default {
},
//
showPutOnTheShelf () {
// this.routePath = this.$route.path
this.showPutOnTheShelfFlag2 = true
this.$http.get('/category/getCategoryTree').then(res => {
this.insertList = res.data.data.filter(item => item.name === '应用资源')[0]

View File

@ -180,7 +180,7 @@
</el-table-column>
<el-table-column prop="yyzy" label="应用资源" min-width="100%">
</el-table-column>
<el-table-column prop="zj" label="总计" min-width="100%">
<el-table-column prop="count" label="总计" min-width="100%">
</el-table-column>
</el-table>
<el-table :data="tableData" :header-cell-style="{ textAlign: 'center' }" :cell-style="{ textAlign: 'center' }"
@ -205,7 +205,7 @@
</el-table-column>
<el-table-column prop="ysp" label="云视频" min-width="100%" >
</el-table-column>
<el-table-column prop="zj" label="总计" min-width="100%">
<el-table-column prop="count" label="总计" min-width="100%">
</el-table-column>
</el-table>
<!--明细表-->
@ -277,7 +277,7 @@ export default {
provideSelects: [],
departmentSelects: [],
departmentSelects1: [],
provideSelects1:[],
provideSelects1: [],
exportExcel: CONFIGITEM.configData[CONFIGITEM.version].apiURL + '/census/center/export',
exportExcelCondition: '',
exportExcelType: '',
@ -468,7 +468,6 @@ export default {
this.detailsVisible = false
},
handleCurrentChange (val) {
this.currentPage = val
// todo
if (this.departmentId === 3) {
@ -477,10 +476,8 @@ export default {
if (this.departmentId === 4) {
this.getTwoDetail(val)
}
},
// --
getFirstTree (page) {
if (this.examineStatus == '-1') {
@ -508,7 +505,6 @@ export default {
}
})
.then((res) => {
if (res.data.code !== 0) {
this.tableData =[]
this.tableDataClone = []
@ -556,7 +552,6 @@ export default {
})
}
})
},
// 使-使
getSecondTree (page) {
@ -593,33 +588,7 @@ export default {
}else{
const result = res.data.data
for (let i = 0; i < result.length; i++) {
if (!result[i].hasOwnProperty('yyzy')) {
result[i].yyzy = 0
}
if (!result[i].hasOwnProperty('kfzj')) {
result[i].kfzj = 0
}
if (!result[i].hasOwnProperty('znsf')) {
result[i].znsf = 0
}
if (!result[i].hasOwnProperty('tcfw')) {
result[i].tcfw = 0
}
if (!result[i].hasOwnProperty('ywzj')) {
result[i].ywzj = 0
}
if (!result[i].hasOwnProperty('hys')) {
result[i].hys = 0
}
result[i].zj =
parseInt(result[i].yyzy) +
parseInt(result[i].kfzj) +
parseInt(result[i].znsf) +
parseInt(result[i].ywzj) +
parseInt(result[i].tcfw) +
parseInt(result[i].hys)
}
this.tableData = res.data.data
this.tableDataClone = res.data.data
this.total = res.data.data.total
@ -630,8 +599,8 @@ export default {
endDate: this.endDate,
resourceName: this.resourceName
})
}
})
}
})
},
//
@ -705,28 +674,26 @@ export default {
})
.then((res) => {
if (res.data.code !== 0) {
this.tableData =[]
this.tableDataClone = []
this.total = 0
return this.$message.error("服务器内部异常")
}else{
this.tableData = res.data.data.list
this.tableDataClone = res.data.data.list
this.total = res.data.data.total
this.exportExcelCondition = qs.stringify({
approveStatus: this.status,
deptId: this.abilityDepartment,
startDate: this.startDate,
endDate: this.endDate,
resourceName: this.resourceName
})
}
this.tableData = []
this.tableDataClone = []
this.total = 0
return this.$message.error('服务器内部异常')
} else {
this.tableData = res.data.data.list
this.tableDataClone = res.data.data.list
this.total = res.data.data.total
this.exportExcelCondition = qs.stringify({
approveStatus: this.status,
deptId: this.abilityDepartment,
startDate: this.startDate,
endDate: this.endDate,
resourceName: this.resourceName
})
}
})
},
// 使
getTwoDetail (page) {
var passAndReview = '' // ""
if (this.examineStatus == '-1') {
this.status = ''
@ -756,31 +723,27 @@ export default {
}
})
.then((res) => {
if (res.data.code !== 0) {
this.tableData =[]
this.tableDataClone = []
this.total = 0
return this.$message.error("服务器内部异常")
}else{
this.tableData = res.data.data.list
this.tableDataClone = res.data.data.list
this.total = res.data.data.total
this.exportExcelCondition = qs.stringify({
approveStatus: this.status,
deptId: this.abilityDepartment,
startDate: this.startDate,
endDate: this.endDate,
resourceName: this.resourceName,
provideDept: this.provideDepartment
})
}
this.tableData = []
this.tableDataClone = []
this.total = 0
return this.$message.error('服务器内部异常')
} else {
this.tableData = res.data.data.list
this.tableDataClone = res.data.data.list
this.total = res.data.data.total
this.exportExcelCondition = qs.stringify({
approveStatus: this.status,
deptId: this.abilityDepartment,
startDate: this.startDate,
endDate: this.endDate,
resourceName: this.resourceName,
provideDept: this.provideDepartment
})
}
})
},
handleClick (row) {
if (this.choseId === 0) {
if (this.departmentId === 1) {
@ -809,8 +772,6 @@ export default {
// type
handleChose (index) {
this.checked = false
this.departmentId = index
this.currentPage = 1
@ -878,8 +839,8 @@ export default {
},
// //////////
goToDetail () {
this.abilityDepartment=''
this.provideDepartment=''
this.abilityDepartment = ''
this.provideDepartment = ''
this.currentPage = 1
this.pageSize = 10
@ -895,8 +856,8 @@ export default {
},
//
goToBack () {
this.abilityDepartment=''
this.provideDepartment=''
this.abilityDepartment = ''
this.provideDepartment = ''
this.checked = false
this.currentPage = 1,

View File

@ -215,6 +215,7 @@
</el-card>
</template>
<script>
import bus from '@/views/bus.js'
import Cookies from 'js-cookie'
export default {
data () {
@ -248,6 +249,13 @@ export default {
roomNameA: ''
}
},
created () {
bus.$off('roomExamineAdminInit')
bus.$on('roomExamineAdminInit', () => {
this.getSerach()
bus.$emit('updateTaskNum')
})
},
mounted () {
this.getSerach()
},

View File

@ -1,6 +1,7 @@
<template>
<el-card shadow="never" class="roomBox">
<div class="roomExamineSearch">
<p>会客厅名称 </p>
<el-input
v-model="roomNameA"
style="width: 160px"
@ -328,9 +329,10 @@ export default {
}
.roomExamineSearch {
display: flex;
width: 240px;
width: 340px;
margin-bottom: 20px;
justify-content: space-between;
align-items: baseline;
}
}
.dialog-footer {

View File

@ -34,7 +34,7 @@ export default {
tip: String,
maxCount: Number,
data: Array,
list: Array,
list: Object ,
emitFlag: String,
busType: Number
},
@ -46,13 +46,13 @@ export default {
},
methods: {
handleExceed (file) {
console.log(file)
},
handError (err, file, fileList) {
console.log(err, file, fileList)
},
handlePreview (file) {
console.log(file)
if (file.response) {
window.open(
window.SITE_CONFIG.previewUrl +
@ -74,7 +74,7 @@ export default {
message: file.name + '上传成功',
type: 'success'
})
console.log(file, fileList)
this.$emit('changeInfoList', {
attrType: this.title,
attrValue: file.response.data,
@ -91,7 +91,7 @@ export default {
}
},
handleRemove (file) {
console.log(file, '删除', this.title)
this.$emit('changeInfoList', {
attrType: this.title,
attrValue: '',
@ -104,7 +104,7 @@ export default {
if (this.list.note1) {
this.fileList.push({ name: this.list.note2 || '--', url: this.list.note1 })
}
console.log('上传组件===================>', this.list, this.fileList)
}
}
</script>

View File

@ -7,10 +7,13 @@
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<el-form-item>
<span>{{ $t('process.userName') + ':'}}</span>
</el-form-item>
<el-form-item>
<el-input
v-model="dataForm.processDefinitionId"
:placeholder="$t('process.name')"
v-model="dataForm.userName"
:placeholder="$t('process.userName')"
clearable
></el-input>
</el-form-item>

View File

@ -7,10 +7,13 @@
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<el-form-item>
<span>{{ $t('process.userName') + ':'}}</span>
</el-form-item>
<el-form-item>
<el-input
v-model="dataForm.processDefinitionId"
:placeholder="$t('process.name')"
v-model="dataForm.userName"
:placeholder="$t('process.userName')"
clearable
></el-input>
</el-form-item>

View File

@ -7,10 +7,13 @@
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<el-form-item>
<span>{{ $t('process.userName') + ':'}}</span>
</el-form-item>
<el-form-item>
<el-input
v-model="dataForm.processDefinitionId"
:placeholder="$t('process.name')"
v-model="dataForm.userName"
:placeholder="$t('process.userName')"
clearable
></el-input>
</el-form-item>

View File

@ -7,10 +7,13 @@
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<el-form-item>
<span>{{ $t('process.userName') + ':'}}</span>
</el-form-item>
<el-form-item>
<el-input
v-model="dataForm.processDefinitionId"
:placeholder="$t('process.name')"
v-model="dataForm.userName"
:placeholder="$t('process.userName')"
clearable
></el-input>
</el-form-item>

View File

@ -7,10 +7,13 @@
:model="dataForm"
@keyup.enter.native="getDataList()"
>
<el-form-item>
<span>{{ $t('process.userName') + ':'}}</span>
</el-form-item>
<el-form-item>
<el-input
v-model="dataForm.processDefinitionId"
:placeholder="$t('process.name')"
v-model="dataForm.userName"
:placeholder="$t('process.userName')"
clearable
></el-input>
</el-form-item>

View File

@ -318,6 +318,9 @@ export default {
onRemove (file, fileList) {
this.$nextTick(() => {
if (fileList.length == 0) {
this.ruleForm.pic =null
this.fileList = []
this.picImg =''
this.checkImgSuccess = false //
// this.$refs.ruleForm.validate() //,
}
@ -358,7 +361,7 @@ export default {
this.$http.get(`/meeting/${row.id}`).then(({ data: res }) => {
this.dialogFormVisible = true
this.ruleForm = res.data
if (res.data.pic != null) {
if (res.data.pic != null && res.data.pic != '') {
// let imgUrl = { name: res.data.name, url: res.data.pic }
// this.fileList.push(imgUrl)
this.picImg = res.data.pic

View File

@ -24,22 +24,26 @@
<span class="text" v-if="dataForm.content.applicationSystem">应用系统<span>{{
dataForm.content.applicationSystem || '--'
}}</span></span>
<span class="text"></span>
<template v-if="version == 'xihaian'">
<span class="text" v-if="version == 'xihaian'">申请期限:<span>
{{
dataForm.content.expireDate || '--'}}</span></span>
</template>
<template v-else>
<span class="text"></span>
</template>
</p>
<p>
<span v-if="dataForm.content.applicationSceneStr">应用场景<span>
{{ dataForm.content.applicationSceneStr || '--' }}</span></span>
</p>
<p>
<p>
<span>
需求依据<span>
{{ dataForm.content.applicationBackground || '--' }}</span></span>
</p>
<!-- <p>
<div>
<el-button type="primary" v-if="dataForm.content.attachment" size="small" @click="download(dataForm.content)">附件下载</el-button>
</div>
</p> -->
<p>
<div v-if="version == 'xihaian'">
<el-button type="primary" size="small" @click="download(dataForm.content)">附件下载</el-button>

View File

@ -26,7 +26,7 @@ js:
:placeholder="'请选择' + name">
<el-option
:value="itemSelect.dictLabel"
v-for="(itemSelect, indexSelect) in options"
v-for="(itemSelect, indexSelect) in optionsCopy"
:key="indexSelect">
{{ itemSelect.dictLabel }}
</el-option>
@ -38,9 +38,9 @@ js:
filterable
placeholder="请输入关键词"
@change="changeIiem(name,data.note1)"
:loading="loading">
>
<el-option
v-for="(itemSelect) in options"
v-for="(itemSelect) in optionsCopy"
:key="itemSelect.id"
:label="itemSelect.name"
:value="itemSelect.id">
@ -56,7 +56,7 @@ js:
>
<el-option
:value="itemSelect.dictLabel"
v-for="(itemSelect, indexSelect) in options"
v-for="(itemSelect, indexSelect) in optionsCopy"
:key="indexSelect">
{{ itemSelect.dictLabel }}
</el-option>
@ -66,7 +66,7 @@ js:
v-else-if="type === 'checkBox'"
>
<el-checkbox-group v-model="valueCheckBox" @change='chekBoxChange'>
<el-checkbox-button v-for="val in options" :label="val.dictLabel" :key="val.dictLabel">{{val.dictLabel}}</el-checkbox-button>
<el-checkbox-button v-for="val in optionsCopy" :label="val.dictLabel" :key="val.dictLabel">{{val.dictLabel}}</el-checkbox-button>
</el-checkbox-group>
</div>
<!-- 不可点的input框 -->
@ -81,12 +81,11 @@ js:
<!-- <el-radio-group v-model:value="data.note1" v-else-if="type == 'radio'">
<el-radio v-for="item in options" :label="item.dictLabel" :key="item.dictLabel">{{item.dictLabel}}</el-radio>
</el-radio-group> -->
<a-textarea v-else-if="type == 'textArea'" @change="changeIiem(name,data.note1)" v-model:value="data.note1" :showCount="true" :maxlength="200" :placeholder="'请填写' + name" />
<div class="block" v-else-if="type == 'date'">
<el-date-picker v-model="data.note1" type="date" :placeholder="'选择' + name" value-format="yyyy-MM-dd">
</el-date-picker>
</div>
<a-textarea v-else-if="type == 'textArea'" @change="changeIiem(name,data.note1)" v-model:value="data.note1" :showCount="true" :maxlength="200" :placeholder="'请填写' + name" />
<div class="block" v-else-if="type == 'date'">
<el-date-picker v-model="data.note1" type="date" :placeholder="'选择' + name" value-format="yyyy-MM-dd">
</el-date-picker>
</div>
</div>
</template>
<script>
@ -97,7 +96,7 @@ export default {
},
props: {
type: String,
data: Array,
data: Object,
name: String,
value: String,
changeField: Array,
@ -108,6 +107,7 @@ export default {
},
data () {
return {
optionsCopy:[],
//
valueCheckBox: [],
//
@ -134,7 +134,7 @@ export default {
res.data.list.forEach((element) => {
dataList.push(element)
})
this.options = dataList
this.optionsCopy = dataList
})
.catch(() => {})
} else if (this.data.name === '归属部门' || this.data.name === '所属产品线') {
@ -143,10 +143,9 @@ export default {
res.data.data.forEach((element) => {
dataList.push(element)
})
this.options = dataList
this.optionsCopy = dataList
if (!this.data.note1) {
this.$http.get('/sys/user/info').then(({ data: res }) => {
console.log(res.data)
this.data.note1 = res.data.deptId
})
}
@ -160,7 +159,6 @@ export default {
// this.options = dataList
if (this.data.note1 == null) {
this.$http.get('/sys/user/info').then(({ data: res }) => {
console.log(res.data)
this.data.note1 = res.data.realName || ''
})
}
@ -174,11 +172,12 @@ export default {
// this.options = dataList
if (this.data.note1 == null) {
this.$http.get('/sys/user/info').then(({ data: res }) => {
console.log(res.data)
this.data.note1 = res.data.mobile || ''
})
}
// })
}else{
this.optionsCopy=this.options
}
},
chekBoxChange (list) {
@ -200,7 +199,6 @@ export default {
},
showTypeClick (e) {
this.showType = e
console.log(e)
this.$emit('show-type', this.showType)
}
},

View File

@ -1,79 +1,76 @@
<!--
* @Author: hisense.liangjunhua
* @Date: 2022-07-08 09:54:50
* @LastEditors: hisense.liangjunhua
* @LastEditTime: 2022-07-28 20:09:53
* @LastEditors: Light
* @LastEditTime: 2022-12-20 10:42:37
* @Description: 多条数据特殊处理
-->
<template>
<div class="special">
<div class="top">{{configure.name}}</div>
<div class="bottom">
<div class="items" v-show="data.length > 0">
<div class="item" v-for="(val, index) in data" :key="'key1' + val.name + index">
<p>
<span>{{ configure.name }}-{{ index + 1 }}</span>
<span></span>
</p>
<p v-for="(attr,index2) in configure.list" :key="'key2' + attr.name + index2">
<span>{{ attr.name }}</span>
<span v-if="attr.type === 'image'">
<!-- <a-image :width="85" :height="60" :src="val.img" /> -->
<el-image
style="width: 85px; height: 60px"
:src="val.img"
:preview-src-list="[val.img]">
</el-image>
</span>
<span v-else>{{ val[attr.field] + (attr.company || '') }}</span>
</p>
<div class="del">
<i class="delImg" @click="del( index)"></i>
<div @click="del(configure.name, index)">删除</div>
</div>
</div>
</div>
<!-- <div class="add">添加更多{{ configure.name }}</div> -->
<div class="form" v-for="(val, index) in configure.list" :key="'key3' + val.name + index">
<span>{{ val.name }}</span>
<a-input v-model:value="val.note1" ::maxlength="24" :placeholder="'请填写' + val.name + ',不超过24个字符'"
v-if="val.type == 'input'"/>
<template v-if="val.type == 'input2'">
<a-input
v-model:value="val.note1"
:placeholder="'请填写' + val.name"
style="width: 570px;"
/>
<span style="width: 2.5rem; padding-left: 0.1rem">
{{
numType == '一次性买断'
? '元'
: numType == '按调用次数'
? '元/次'
: numType == '按并发路数'
? '元/路'
: numType == '按年计费'
? '元/年'
: ''
}}
</span>
</template>
<a-textarea v-model:value="val.note1" :showCount="true" :maxlength="200" :placeholder="'请填写' + val.name"
v-else-if="val.type == 'textArea'"/>
<a-input-number v-model:value="val.note1" :min="0" :max="9999" :step="0.01" string-mode
:placeholder="'请填写' + val.name" v-else-if="val.type == 'number'" />
<a-radio-group v-model:value="val.note1" :options="val.options" v-else-if="val.type == 'radio'" @change="radioChange"/>
<!-- <upload :key="showKey" type="图片" btnName="上传图片" :maxCount="1" :data="val" :list="[]" tip="支持图片类型大小不超过100M"
v-else-if="val.type == 'image'"></upload> -->
<upload :key="showKey" :child='val' limit='1' accept='.jpg,.png' v-else-if="val.type == 'image'"></upload>
</div>
<div class="submit">
<a-button type="primary" @click="add(configure.name)">添加更多</a-button>
<div class="special">
<div class="top">{{ configure.name }}</div>
<div class="bottom">
<div class="items" v-show="data.length > 0">
<div class="item" v-for="(val, index) in data" :key="'key1' + val.name + index">
<p>
<span>{{ configure.name }}-{{ index + 1 }}</span>
<span></span>
</p>
<p v-for="(attr, index2) in configure.list" :key="'key2' + attr.name + index2">
<span>{{ attr.name }}</span>
<span v-if="attr.type === 'image'">
<!-- <a-image :width="85" :height="60" :src="val.img" /> -->
<el-image style="width: 85px; height: 60px" :src="val.img" :preview-src-list="[val.img]">
</el-image>
</span>
<span v-else>{{ val[attr.field] + (attr.company || '') }}</span>
</p>
<div class="del">
<i class="updateImg" @click="update(configure.name, index)"></i>
<div @click="update(configure.name, index)" style="margin-right:10px;">修改</div>
<i class="delImg" @click="del(configure.name, index)"></i>
<div @click="del(configure.name, index)">删除</div>
</div>
</div>
</div>
<!-- <div class="add">添加更多{{ configure.name }}</div> -->
<div class="form" v-for="(val, index) in configure.list" :key="'key3' + val.name + index">
<span>{{ val.name }}</span>
<a-input v-model:value="val.note1" ::maxlength="24" :placeholder="'请填写' + val.name + ',不超过24个字符'"
v-if="val.type == 'input'" />
<template v-if="val.type == 'input2'">
<a-input v-model:value="val.note1" :placeholder="'请填写' + val.name" style="width: 570px;" />
<span style="width: 2.5rem; padding-left: 0.1rem">
{{
numType == '一次性买断'
? '元'
: numType == '按调用次数'
? '元/次'
: numType == '按并发路数'
? '元/路'
: numType == '按年计费'
? '元/年'
: ''
}}
</span>
</template>
<a-textarea v-model:value="val.note1" :showCount="true" :maxlength="200" :placeholder="'请填写' + val.name"
v-else-if="val.type == 'textArea'" />
<a-input-number v-model:value="val.note1" :min="0" :max="9999" :step="0.01" string-mode
:placeholder="'请填写' + val.name" v-else-if="val.type == 'number'" />
<a-radio-group v-model:value="val.note1" :options="val.options" v-else-if="val.type == 'radio'"
@change="radioChange" />
<!-- <upload :key="showKey" type="图片" btnName="上传图片" :maxCount="1" :data="val" :list="[]" tip="支持图片类型大小不超过100M"
v-else-if="val.type == 'image'"></upload> -->
<upload :key="showKey" :child='val' :limit=limit accept='.jpg,.png' v-else-if="val.type == 'image'"></upload>
</div>
<div class="submit">
<a-button type="primary" @click="add(configure.name)">添加更多</a-button>
</div>
</div>
</div>
</template>
<script>
import { deepClone } from '@/utils/form-generator'
import upload from '@/views/modules/ability/upload.vue'
// import upload from '@/views/modules/components/upload'
export default {
@ -85,16 +82,44 @@ export default {
configure: Object,
showData: Object
},
data () {
watch: {
configure: {
handler(newVal) {
let title = newVal.name
let list = newVal.list
let coloneData = deepClone(this.data)
if (list && list.length > 0) {
let obj = {}
list.forEach((item) => {
obj[item.field] = item.note1
})
if (obj.name || obj.question || obj.price) {
coloneData.push(obj)
}
}
if (coloneData.length > 0) {
this.$emit('changeInfoList', {
attrType: title,
attrValue: JSON.stringify(coloneData),
delFlag: 0
})
}
},
deep: true,
immediate: true,
},
},
data() {
return {
limit: 1,
data: [],
showKey: 0,
numType: '一次性买断'
}
},
methods: {
add (title, addFlag, submitFlag) {
console.log(title, addFlag, submitFlag)
add(title, addFlag, submitFlag) {
const list = this.configure.list
let flag = true
list.forEach((item) => {
@ -118,16 +143,16 @@ export default {
return
}
obj[item.field] =
item.note1 +
(this.numType === '一次性买断'
? '元'
: this.numType === '按调用次数'
? '元/次'
: this.numType === '按并发路数'
? '元/路'
: this.numType === '按年计费'
? '元/年'
: '')
item.note1 +
(this.numType === '一次性买断'
? '元'
: this.numType === '按调用次数'
? '元/次'
: this.numType === '按并发路数'
? '元/路'
: this.numType === '按年计费'
? '元/年'
: '')
} else {
obj[item.field] = item.note1
}
@ -162,7 +187,7 @@ export default {
}
}
},
del (title, index) {
del(title, index) {
this.data.splice(index, 1)
const str = this.data.length > 0 ? JSON.stringify(this.data) : ''
this.$emit('changeInfoList', {
@ -171,13 +196,24 @@ export default {
delFlag: 0
})
},
radioChange (e) {
console.log(e, 'wewewe')
update(title, index) {
const obj = this.data[index]
this.data.splice(index, 1)
const str = this.data.length > 0 ? JSON.stringify(this.data) : ''
this.$emit('changeInfoList', {
attrType: title,
attrValue: str,
delFlag: 0
})
this.configure.list.map(val => {
val.note1 = obj[val.field]
})
},
radioChange(e) {
this.numType = e.target.value
}
},
created () {
console.log('特殊处理=============>', this.showData)
created() {
if (this.configure.name === '计费标准信息' || this.configure.name === '常见问题') {
if (this.showData.children[0].note1) {
this.data = JSON.parse(this.showData.children[0].note1)
@ -214,6 +250,7 @@ export default {
.bottom {
margin-top: 25px;
margin-bottom: 25px;
.items {
background: #fafafa;
padding: 10px;
@ -232,7 +269,7 @@ export default {
}
}
p:nth-of-type(1) > span:nth-of-type(1) {
p:nth-of-type(1)>span:nth-of-type(1) {
font-size: 18px;
font-weight: 600;
}
@ -242,12 +279,22 @@ export default {
justify-content: flex-end;
align-items: center;
.updateImg {
cursor: pointer;
display: inline-block;
width: 16px;
height: 18px;
background: url("~@/assets/img/putOnTheShelf/update.png") no-repeat;
margin-right: 5px;
margin-bottom: 1px;
}
.delImg {
cursor: pointer;
display: inline-block;
width: 16px;
height: 18px;
background: url(~@/assets/img/putOnTheShelf/del.png) no-repeat;
background: url("~@/assets/img/putOnTheShelf/del.png") no-repeat;
margin-right: 5px;
}
@ -316,6 +363,7 @@ export default {
}
}
}
::v-deep .el-image__preview {
width: 100%;
height: 100%;
@ -371,15 +419,18 @@ export default {
justify-content: space-between;
align-items: center;
}
::v-deep .ant-input-number {
width: 200px;
}
::v-deep .ant-transfer-list-header-title {
font-size: 16px;
color: #303133;
font-weight: 400;
text-align: left;
}
textarea {
height: 100px;
resize: none;

View File

@ -1,61 +1,77 @@
<!--
* @Author: hisense.liangjunhua
* @Date: 2022-07-08 09:48:52
* @LastEditors: hisense.liangjunhua
* @LastEditTime: 2022-07-25 15:57:25
* @LastEditors: Light
* @LastEditTime: 2022-12-29 09:34:56
* @Description: 告诉大家这是什么
-->
<template>
<div class="put-on-the-shelf">
<div v-for="parent in putOnTheShelfList" :key='parent.id'>
<div v-for='child in parent.children' :key='child.id'>
<template v-if='judgmentType.filter(item => item.name==child.name).length === 0'>
<div class="top">{{child.name}}</div>
<div v-for="item in child.children" :key="item.id" class='item' v-show="(item.name != '来源应用' && item.name != '关联组件信息' && item.name != '技术文档') && !(
(showTypeName == '调用接口' && item.name == '平台地址') ||
(showTypeName == '调用接口' && item.name == 'SDK安装包') ||
(showTypeName == '平台对接' && item.name == 'SDK安装包') ||
(showTypeName == '平台对接' && item.name == '接口请求方式') ||
(showTypeName == '平台对接' && item.name == '服务接口') ||
(showTypeName == 'SDK' && item.name == '平台地址') ||
(showTypeName == 'SDK' && item.name == '接口请求方式') ||
(showTypeName == 'SDK' && item.name == '服务接口')
)">
<div class="box">
<div>
<span class="required" v-if="required.indexOf(item.name) > -1">*</span>
{{ item.name }}
<div class="left">
<div class="item" v-for="(parent,index) in putOnTheShelfList" :key="parent.id+'left'">
<div class="main" @click="selectItem(parent.name)" :class="selectName===parent.name?'select':''">
<div class="circular-box">
<div class="circular"></div>
</div>
<div class="name">{{ parent.name }}</div>
</div>
<div class="bottom" v-if="index !== putOnTheShelfList.length-1"></div>
</div>
<!-- <a-anchor @change="handlerAnchor" :affix="true" :get-current-anchor="'#'+putOnTheShelfList[0].name">
<a-anchor-link v-for="parent in putOnTheShelfList" :key="parent.id+'left'" :href="'#'+parent.name" :title="parent.name"/>
</a-anchor> -->
</div>
<div class="right" id="putOnTheShelf">
<div v-for="parent in showList" :key='parent.id' :id="parent.name">
<div v-for='child in parent.children' :key='child.id'>
<template v-if='judgmentType.filter(item => item.name==child.name).length === 0'>
<div class="top">{{child.name}}</div>
<div v-for="item in child.children" :key="item.id" class='item' v-show="(item.name != '来源应用' && item.name != '关联组件信息' && item.name != '技术文档') && !(
(showTypeName == '调用接口' && item.name == '平台地址') ||
(showTypeName == '调用接口' && item.name == 'SDK安装包') ||
(showTypeName == '平台对接' && item.name == 'SDK安装包') ||
(showTypeName == '平台对接' && item.name == '接口请求方式') ||
(showTypeName == '平台对接' && item.name == '服务接口') ||
(showTypeName == 'SDK' && item.name == '平台地址') ||
(showTypeName == 'SDK' && item.name == '接口请求方式') ||
(showTypeName == 'SDK' && item.name == '服务接口')
)">
<div class="box">
<div>
<span class="required" v-if="required.indexOf(item.name) > -1">*</span>
{{ item.name }}
</div>
<!-- <upload :list="[]" v-if="item.type == 'image'" type="图片" btnName="上传图片" :maxCount="1" :data="item"
tip="支持图片类型大小不超过100M"></upload> -->
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.jpg,.jpeg,.png' :list="item" v-if="item.type == 'image'" type="图片" btnName="上传图片" :maxCount="1"
:dataList="item" tip="支持文件类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.pdf,.ppt,.xlsx,.doc,.docx' :list="item" v-else-if="item.type == 'file' && item.name !== '使用手册'" type="文件" btnName="上传附件" :maxCount="1"
:dataList="item" tip="支持文件类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.pdf,.ppt,.xlsx,.doc,.docx' :list="item" v-else-if="item.name == '使用手册'" type="文件" btnName="上传附件" :maxCount="1" :dataList="item" :busType="2"
tip="支持文件类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.mp4' :list="item" v-else-if="item.type == 'video'" type="视频" btnName="上传视频" :maxCount="1" :dataList="item"
tip="支持视频类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.zip' :list="item" v-else-if="item.type == 'package' &&item.name != '上传附件'" type="安装包" btnName="上传安装包" :maxCount="1" :dataList="item"
tip="支持.zip类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.pdf,.ppt,.xlsx,.doc,.docx,.zip' :list="item" v-else-if="item.name == '上传附件'" type="附件" btnName="上传附件" :maxCount="1" :dataList="item"
tip="支持.doc,.docx,.zip,.ppt,.pdf类型大小不超过100M"></upload>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'AbilityType'" type="disabled" :data="item" :name="item.name" :value="typeInput"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'ComponentType'" type="disabled" :data="item" :name="item.name" :value="type"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'input'" type="input" :data="item" :name="item.name"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'select'" type="select" :data="item" :name="item.name" :options="item.options" @show-type="showType"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'checkBox'" type="checkBox" :data="item" :name="item.name" :options="item.options"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'radio'" type="radio" :data="item" :name="item.name" :options="item.options"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'textArea'" type="textArea" :data="item" :name="item.name"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'date'" type="date" :data="item" :name="item.name"></input-select-checkbox>
</div>
<!-- <upload :list="[]" v-if="item.type == 'image'" type="图片" btnName="上传图片" :maxCount="1" :data="item"
tip="支持图片类型大小不超过100M"></upload> -->
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.jpg,.jpeg,.png' :list="item" v-if="item.type == 'image'" type="图片" btnName="上传图片" :maxCount="1"
:dataList="item" tip="支持文件类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.pdf,.ppt,.xlsx,.doc,.docx' :list="item" v-else-if="item.type == 'file' && item.name !== '使用手册'" type="文件" btnName="上传附件" :maxCount="1"
:dataList="item" tip="支持文件类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.pdf,.ppt,.xlsx,.doc,.docx' :list="item" v-else-if="item.name == '使用手册'" type="文件" btnName="上传附件" :maxCount="1" :dataList="item" :busType="2"
tip="支持文件类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.mp4' :list="item" v-else-if="item.type == 'video'" type="视频" btnName="上传视频" :maxCount="1" :dataList="item"
tip="支持视频类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.zip' :list="item" v-else-if="item.type == 'package' &&item.name != '上传附件'" type="安装包" btnName="上传安装包" :maxCount="1" :dataList="item"
tip="支持.zip类型大小不超过100M"></upload>
<upload @changeInfoList='changeInfoList' :title='item.name' accept='.pdf,.ppt,.xlsx,.doc,.docx,.zip' :list="item" v-else-if="item.name == '上传附件'" type="附件" btnName="上传附件" :maxCount="1" :dataList="item"
tip="支持.doc,.docx,.zip,.ppt,.pdf类型大小不超过100M"></upload>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'AbilityType'" type="disabled" :data="item" :name="item.name" :value="typeInput"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'ComponentType'" type="disabled" :data="item" :name="item.name" :value="type"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'input'" type="input" :data="item" :name="item.name"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'select'" type="select" :data="item" :name="item.name" :options="item.options" @show-type="showType"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'checkBox'" type="checkBox" :data="item" :name="item.name" :options="item.options"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'radio'" type="radio" :data="item" :name="item.name" :options="item.options"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'textArea'" type="textArea" :data="item" :name="item.name"></input-select-checkbox>
<input-select-checkbox :changeField='changeField' :list="[]" v-else-if="item.type == 'date'" type="date" :data="item" :name="item.name"></input-select-checkbox>
</div>
<div class="requiredTips" v-show="notFilled.indexOf(item.name) > -1 && (item.type=='input' || item.type=='textArea') && changeField.indexOf(item.name) == -1">请填写{{item.name}}</div>
<div class="requiredTips" v-show="notFilled.indexOf(item.name) > -1 && (item.type=='select' || item.type=='checkBox' || item.type=='radio') && changeField.indexOf(item.name) == -1">请选择{{item.name}}</div>
</div>
</template>
<template v-else>
<special @submitData="submitData" ref="specialRef" :configure='judgmentType.filter(item => item.name==child.name)[0]' :showData='child' @changeInfoList='changeInfoList'></special>
</template>
<div class="requiredTips" v-show="notFilled.indexOf(item.name) > -1 && (item.type=='input' || item.type=='textArea') && changeField.indexOf(item.name) == -1">请填写{{item.name}}</div>
<div class="requiredTips" v-show="notFilled.indexOf(item.name) > -1 && (item.type=='select' || item.type=='checkBox' || item.type=='radio') && changeField.indexOf(item.name) == -1">请选择{{item.name}}</div>
</div>
</template>
<template v-else>
<special @submitData="submitData" ref="specialRef" :configure='judgmentType.filter(item => item.name==child.name)[0]' :showData='child' @changeInfoList='changeInfoList'></special>
</template>
</div>
</div>
</div>
</div>
@ -80,6 +96,8 @@ export default {
},
data () {
return {
selectName: '',
showList: [],
changeField: [],
judgmentType: [
{
@ -193,6 +211,20 @@ export default {
},
mounted () {
this.defaultContent()
// this.showList = this.putOnTheShelfList[0]
},
watch: {
putOnTheShelfList: {
handler (newVal, oldVal) {
if (this.showList.length === 0 && newVal.length > 0) {
this.showList = [this.putOnTheShelfList[0]]
this.selectName = this.showList[0].name
console.log('初始化', this.$router, this.$route)
}
},
deep: true,
immediate: true
}
},
methods: {
//
@ -234,22 +266,77 @@ export default {
},
showType (data) {
this.showTypeName = data
console.log(data, this.showTypeName, '传过来的showType')
},
selectItem (str) {
if (str) {
this.selectName = str
this.showList = this.putOnTheShelfList.filter(val => val.name === str)
this.$nextTick(() => {
console.log(document.querySelector('#putOnTheShelf'))
document.querySelector('#putOnTheShelf').scrollTop = 0
})
}
}
}
}
</script>
<style lang='scss' scoped>
.put-on-the-shelf {
height: 500px;
// height: 500px;
display: flex;
padding: 0 50px;
overflow-y: scroll;
}
.put-on-the-shelf::-webkit-scrollbar {
width: 0;
.left {
margin-right: 50px;
.main{
cursor: pointer;
display: flex;
align-items: center;
.circular-box{
width: 18px;
height: 18px;
border-radius: 9px;
border: 1px rgba($color: #0058e1, $alpha: 0) solid;
margin-right: 20px;
display: flex;
justify-content: center;
align-items: center;
.circular{
width: 10px;
height: 10px;
border-radius: 6px;
border: 1px #0058e1 solid;
}
}
}
.select{
.circular-box{
border: 1px #0058e1 solid;
.circular{
background: #0058e1;
}
}
}
.bottom{
height: 46px;
border-left: #0058e1 1px solid;
margin: -4px 0 -4px 9px;
}
}
.right {
height: 500px;
overflow-y: scroll;
}
.right::-webkit-scrollbar {
width: 0;
}
}
// .put-on-the-shelf::-webkit-scrollbar {
// width: 0;
// }
.top {
width: 800px;
color: #333333;
font-size: 22px;
display: flex;

View File

@ -89,9 +89,6 @@ export default {
},
(res) => {
// if (res.data.code !== 0) {
// return
// }
if (res.data.data && res.data.data.length > 0) {
this.data = res.data.data[0].values
this.data.map((item) => {
@ -108,8 +105,8 @@ export default {
}
} else {
this.trendChartData = {
xaxis: [],
ydata: []
xaxis: this.ydata,
ydata:this.xaxis
}
}
@ -118,7 +115,7 @@ export default {
})
},
(err) => {
console.log('err', err)
}
)
},

View File

@ -73,7 +73,7 @@ export default {
},
//
resourceData: [],
resourceColor: ['#7b2cff', '#fd5151', , '#2ca1ff', '#0adbfa', '#febe13', '#65e5dd', '#f071ff', '#85f67a'],
resourceColor: ['#7b2cff', '#fd5151' , '#2ca1ff', '#0adbfa', '#febe13', '#65e5dd', '#f071ff', '#85f67a'],
//
applyData: [],
applyColor: ['#5085f2', '#e75fc3', '#f87be2', '#f2719a', '#fca4bb', '#f59a8f', '#fdb301', '#57e7ec', '#cf9ef1'],

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,8 @@
/*
* @Author: hisense.wuhongjian
* @Date: 2020-07-07 16:03:23
* @LastEditors: Light
* @LastEditTime: 2022-12-08 13:42:49
* @LastEditors: hisense.wuhongjian
* @LastEditTime: 2022-12-29 17:34:17
* @Description: 系统静态参数配置
*/
var _global = {}
@ -68,7 +68,7 @@ var CONFIGITEM = {
// cameraUrl: '192.168.124.236:9537', // vpn
},
backUrl: 'http://10.134.135.9:9797',
apiURL: 'http://10.134.135.9:8888/renren-admin',
apiURL: 'http://10.134.135.92:8888/renren-admin',
// apiURL: 'http://192.168.124.233:8888/ucs-admin',
// previewUrl: 'http://10.134.135.9:9796/',
// websocketURL: '10.134.135.9:8888/ucs-admin', //

View File

@ -75,7 +75,7 @@
cursor: pointer;
}
.ant-message {
z-index: 10010!important;
z-index: 10012!important;
}
.ant-modal-wrap{
z-index: 10010!important;

View File

@ -1,8 +1,8 @@
<!--
* @Author: hisense.wuhongjian
* @Date: 2022-05-06 11:12:0011-18 19:07:53
* @LastEditors: Light
* @LastEditTime: 2022-12-16 09:41:27
* @Date: 2022-05-06 11:12:00
* @LastEditors: hisense.wuhongjian
* @LastEditTime: 2022-12-29 17:34:24
* @Description: 告诉大家这是什么
-->
<template>
@ -22,8 +22,9 @@
import { onBeforeUnmount, onMounted, watch, ref } from 'vue'
import { useRouter } from 'vue-router'
import mybus from '@/myplugins/mybus'
import { useStore } from 'vuex'
const router = useRouter()
const store = useStore()
const locale = zhCN
const token = Cookies.get('ucsToken')
const whoShow1 = ref(whoShow)
@ -88,49 +89,50 @@
}
}
const waterMarkInit = (newValue) => {
getUser().then((res) => {
if (res.data.code == 0) {
realName = res.data.data.realName
}
if (realName.length > 13) {
onWholeWaterMark(
[realName, moment().format('YYYY-MM-DD')],
800,
200,
24,
40
)
} else if (realName.length > 8) {
onWholeWaterMark(
[realName, moment().format('YYYY-MM-DD')],
600,
200,
24,
40
)
} else {
onWholeWaterMark(
[realName, moment().format('YYYY-MM-DD')],
450,
200,
24,
40
)
}
getCategoryTreePage({
page: 1,
limit: 999,
dictTypeId: '1592357067014803457',
}).then((res) => {
arr.length = 0
res.data.data.list.map((val) => {
arr.push(val.dictValue)
})
if (newValue) {
changeWaterMark(newValue)
}
// getUser().then((res) => {
// if (res.data.code == 0) {
// realName = res.data.data.realName
// }
realName = store.getters['user/realName']
if (realName.length > 13) {
onWholeWaterMark(
[realName, moment().format('YYYY-MM-DD')],
800,
200,
24,
40
)
} else if (realName.length > 8) {
onWholeWaterMark(
[realName, moment().format('YYYY-MM-DD')],
600,
200,
24,
40
)
} else {
onWholeWaterMark(
[realName, moment().format('YYYY-MM-DD')],
450,
200,
24,
40
)
}
getCategoryTreePage({
page: 1,
limit: 999,
dictTypeId: '1592357067014803457',
}).then((res) => {
arr.length = 0
res.data.data.list.map((val) => {
arr.push(val.dictValue)
})
if (newValue) {
changeWaterMark(newValue)
}
})
// })
}
watch(
() => router.currentRoute.value.path,
@ -142,16 +144,16 @@
realName,
realName.charCodeAt()
)
//
if (newValue == '/home') {
waterMarkInit(newValue)
}
// //
// if (newValue == '/home') {
// waterMarkInit(newValue)
// }
changeWaterMark(newValue)
},
{ immediate: true }
)
onMounted(() => {
// waterMarkInit()
waterMarkInit()
})
onBeforeUnmount(() => {
// 4.,

View File

@ -1,8 +1,8 @@
/*
* @Author: hisense.wuhongjian
* @Date: 2022-03-29 17:48:03
* @LastEditors: Light
* @LastEditTime: 2022-10-25 09:37:05
* @LastEditors: hisense.wuhongjian
* @LastEditTime: 2022-12-29 14:50:51
* @Description: 告诉大家这是什么
*/
import request from '@/utils/request'
@ -62,3 +62,11 @@ export function register() {
method: 'post',
})
}
//
export function getNavList(params) {
return request({
url: '/sys/menu/nav',
method: 'get',
params,
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

View File

@ -2,12 +2,10 @@
* @Author: hisense.wuhongjian
* @Date: 2022-03-29 17:48:03
* @LastEditors: hisense.wuhongjian
* @LastEditTime: 2022-08-06 15:00:49
* @LastEditTime: 2022-12-29 10:30:38
* @Description: 告诉大家这是什么
*/
import {
createApp
} from 'vue'
import { createApp } from 'vue'
import Antd from 'ant-design-vue'
import mitt from 'mitt'
import App from './App'
@ -17,8 +15,8 @@ import store from './store'
import 'ant-design-vue/dist/antd.css'
import '@/vab'
import * as echarts from 'echarts'
import * as moment from "moment"
import "dayjs/locale/zh-cn";
import * as moment from 'moment'
import 'dayjs/locale/zh-cn'
import vue3videoPlay from 'vue3-video-play-emiyagm' //
import 'vue3-video-play-emiyagm/dist/style.css' // css
import ElementPlus from 'element-plus'
@ -27,38 +25,37 @@ import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
console.log(111, 'main')
/**
* @author chuzhixin 1204505056@qq.com
* @description 正式环境默认使用mock正式项目记得注释后再打包
*/
// if (process.env.NODE_ENV === 'production') {
// const { mockXHR } = require('@/utils/static')
// mockXHR()
// }
/**
* @author chuzhixin 1204505056@qq.com
* @description 正式环境默认使用mock正式项目记得注释后再打包
*/
// if (process.env.NODE_ENV === 'production') {
// const { mockXHR } = require('@/utils/static')
// mockXHR()
// }
const emitter = mitt()
const app = createApp(App)
app.config.globalProperties.$emitter = emitter
app
.use(store)
.use(ElementPlus)
.use(router)
.use(echarts)
.use(vue3videoPlay)
.use(moment)
.use(Antd)
.use(ElementPlus)
.mount('#app')
.use(store)
.use(ElementPlus)
.use(router)
.use(echarts)
.use(vue3videoPlay)
.use(moment)
.use(Antd)
.use(ElementPlus)
.mount('#app')
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component)
app.component(key, component)
}
router.beforeEach((to, from, next) => {
// console.log('=========>', to, from, next)
document.documentElement.scrollTop = 0
document.body.scrollTop = 0
next()
// console.log('=========>', to, from, next)
document.documentElement.scrollTop = 0
document.body.scrollTop = 0
next()
})
//
// function judgeAgent() {
// let userAgent = navigator.userAgent // userAgent

View File

@ -425,16 +425,16 @@ export const constantRoutes = [
icon: 'error-warning-line',
},
},
//
{
path: '/assertReport',
name: 'assertReport',
component: () => import('@/views/assertReport'),
meta: {
title: '能力云图',
icon: 'error-warning-line',
},
//
{
path: '/assertReport',
name: 'assertReport',
component: () => import('@/views/assertReport'),
meta: {
title: '能力云图',
icon: 'error-warning-line',
},
},
//
{
path: '/AssignCaseDetailPage',

View File

@ -21,6 +21,7 @@ const state = () => ({
avatar: '',
role: 0, //
roleList: [], //
navList: [],
})
const getters = {
accessToken: (state) => state.accessToken,
@ -32,6 +33,7 @@ const getters = {
userId: (state) => state.userId,
deptName: (state) => state.deptName,
deptId: (state) => state.deptId,
navList: (state) => state.navList,
}
const mutations = {
/**
@ -77,6 +79,11 @@ const mutations = {
setDeptName(state, name) {
state.deptName = name
},
//
setNavList(state, nav) {
debugger
state.navList = nav
},
setDeptId(state, name) {
state.deptId = name
},

View File

@ -61,6 +61,7 @@ const instance = axios.create({
timeout: requestTimeout,
headers: {
'Content-Type': contentType,
'Accept-Language': 'zh-CN',
},
})

View File

@ -138,12 +138,20 @@
//
function viewDetails(id) {
console.log('id=========>', id)
router.push({
path: '/details',
// router.push({
// path: '/details',
// query: {
// id: id,
// },
// })
const detailPage = router.resolve({
path: '/details', //
query: {
id: id,
hiddenBackFlag: true,
},
})
window.open(detailPage.href, '_blank')
}
//
const praiseList = ref([])

View File

@ -59,12 +59,20 @@
//
function viewDetails(id) {
console.log('id=========>', id)
router.push({
path: '/demandDetails',
// router.push({
// path: '/demandDetails',
// query: {
// id: id,
// },
// })
const detailPage = router.resolve({
path: '/demandDetails', //
query: {
id: id,
// hiddenBackFlag: true,
},
})
window.open(detailPage.href, '_blank')
}
function jumpPage() {
router.push({

File diff suppressed because it is too large Load Diff

View File

@ -32,7 +32,11 @@
{{ val }}
</div>
</div>
</div>
<div class="bottom1">
{{total}}
</div>
</div>
<div class="item-box">
<div class="item" v-for="item in data.list" :key="item.id">
@ -64,6 +68,7 @@
const area = ref(null)
const typeName = ref('全市')
const typeName2 = ref('全部')
const total = ref(0)
if (selectArea && selectArea !== '全部') {
typeName2.value = selectArea
area.value = selectArea
@ -131,6 +136,7 @@
if (res.data.data.total.length < 9) {
dom.removeEventListener('scroll', viewMonitor, true)
}
total.value= res.data.data.total
// appList
res.data.data.appList.map((val) => {
if (!val.pic) {
@ -198,6 +204,12 @@
}
.application {
padding: 0 0.15rem;
.bottom1 {
margin-top: 67px;
margin-left: 928px;
color: #fff;
font-size: 0.2rem;
}
.select {
margin: 0.1rem 0 0.1rem 0.2rem;
color: #fff;
@ -225,6 +237,7 @@
background-size: 100%;
}
}
.bottom {
cursor: pointer;
position: absolute;

View File

@ -388,7 +388,13 @@
}
}
const closeMain = () => {
window.history.go(-1)
const showKey = router.currentRoute.value.query.showKey
router.push({
path: '/demandCenter',
query: {
toShowKey:showKey
},
})
}
onMounted(() => {
// const formData = computed(() => store.getters['home/demandDetailsData'])

View File

@ -175,6 +175,7 @@ const showDetail = (item) => {
path: '/demandDetails',
query: {
id: item.id,
showKey:selectedKeys.value,
},
})
}
@ -186,6 +187,10 @@ const toView = () => {
}
onMounted(() => {
const toShowKey = router.currentRoute.value.query.toShowKey
if(toShowKey){
selectedKeys.value=toShowKey
}
const params = {
page: pageNum.value,
limit: pageSize.value,

View File

@ -188,6 +188,9 @@
// that.pausePlay(iWndIndex)
if (!that.unStopable) {
setTimeout(() => {
that.videoDom = that.$refs.video333.querySelector('video') || {}
debugger
that.videoDom.pause()
// that.exportCanvasAsPNG('12preview_playCanvas0', 'test')
}, 0)
@ -234,7 +237,7 @@
},
(e) => {
console.error(e)
// message.error(':' + e)
message.error('网络繁忙,请稍后再试')
}
)
},

View File

@ -92,9 +92,12 @@
<div class="bottom" @click="goToView()">查看更多</div>
</div>
<div class="info">
<i class="img" @click="
jumpPage({ name: '个人中心', key: 'personalCenter' }, 'headerClick')
"></i>
<i
class="img"
@click="
jumpPage({ name: '个人中心', key: 'personalCenter' }, 'headerClick')
"
></i>
<a-tooltip placement="bottom">
<template #title>
<span>{{ user.realName }}</span>
@ -131,6 +134,7 @@
import { mynotice } from '@/api/home'
import { useStore } from 'vuex'
import { getSgcTotal } from '@/api/home'
import Cookies from 'js-cookie'
import mybus from '@/myplugins/mybus'
import { DETAIL_PAGE_CONTENT_DEFAULT_TAB } from '@/global/GlobalConfig.js'
@ -149,7 +153,13 @@
const select = ref(router.currentRoute.value.name)
const mynoticeFlag = ref(false)
const mynoticeData = ref([])
const navList = ref(navListManagement.navList)
const navList = ref([])
const asyncNav = store.getters['user/navList']
if (asyncNav.length > 0) {
navList.value = asyncNav
} else {
navList.value = navListManagement.navList
}
const targetRouter = ref('')
const backFlag = ref(false)
getUserInfo().then((res) => {
@ -165,6 +175,7 @@
})
}
})
console.log('navList------------>', navList)
const props = defineProps({
@ -422,7 +433,6 @@
})
mybus.on('changeMenuStyle', (data) => {
targetRouter.value = data
if (data.path == '/algorithmCompare') {
jumpPage(

View File

@ -148,6 +148,7 @@
const btnClick = (index) => {
itemIndex.value = index
if (index === 2) {
//
if (chooseId.value !== '') {
let placeTypeCode = []
placeTypeCode.push(chooseId.value)
@ -156,14 +157,18 @@
mybus.emit('clearLeftSelect')
}
} else {
//
if (selectId.value !== '') {
mybus.emit('getCameraByParentId', {
id: selectId.value,
reset: true,
})
} else {
mybus.emit('clearLeftSelect')
}
}
//
mybus.emit('resetMapSearch', index)
}
//
const tabClick = (id) => {
@ -244,6 +249,7 @@
if (newVal == '') {
mybus.emit('getCameraByParentId', {
id: '70be8c5b664f4bcf869d82f2e8335051',
reset: true,
})
}
})
@ -272,6 +278,7 @@
} else {
mybus.emit('getCameraByParentId', {
id: val.id,
reset: true,
})
}
}

View File

@ -2,7 +2,7 @@
* @Author: hisense.wuhongjian
* @Date: 2022-03-29 17:53:28
* @LastEditors: hisense.wuhongjian
* @LastEditTime: 2022-03-30 16:35:27
* @LastEditTime: 2022-12-29 15:12:28
* @Description: 告诉大家这是什么
-->
<template>

View File

@ -104,7 +104,8 @@
data-spm-anchor-id="a313x.7781069.0.i0"
></path>
</svg>
<img class="icon-poylon" @click="areaMode()" src="~@/supermap/image/icon-poylon.png">
<svg t="1672193537830" @click="areaMode()" class="icon-poylon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2814" width="48" height="48"><path d="M385.47911111 902.59911111h83.74044444v41.41511111h-83.74044444zM217.99822222 902.59911111h83.74044445v41.41511111h-83.74044445zM113.55022222 881.89155555h-41.41511111v62.12266667H134.25777778v-41.41511111h-20.70755556zM72.13511111 546.816h41.41511111v83.74044445h-41.41511111zM72.13511111 211.85422222h41.41511111v83.74044445h-41.41511111zM72.13511111 714.41066667h41.41511111v83.74044444h-41.41511111zM72.13511111 379.33511111h41.41511111V463.07555555h-41.41511111zM72.13511111 128.11377778h41.41511111v-20.70755556H134.25777778V65.99111111h-62.12266667zM553.07377778 65.99111111h83.74044444v41.41511111h-83.74044444zM720.55466667 65.99111111h83.74044444v41.41511111h-83.74044444zM385.47911111 65.99111111h83.74044444v41.41511111h-83.74044444zM217.99822222 65.99111111h83.74044445v41.41511111h-83.74044445zM888.03555555 65.99111111v41.41511111h20.70755556v20.70755556h41.41511111V65.99111111zM908.74311111 379.33511111h41.41511111V463.07555555h-41.41511111zM908.74311111 211.85422222h41.41511111v83.74044445h-41.41511111zM738.75911111 637.26933333l70.08711111-54.272c5.23377778-4.096 8.07822222-10.46755555 7.50933333-17.06666666-0.56888889-6.59911111-4.43733333-12.51555555-10.24-15.58755556L451.47022222 359.424c-6.82666667-3.64088889-15.13244445-2.95822222-21.27644444 1.70666667-6.144 4.77866667-8.87466667 12.62933333-7.05422223 20.13866666l95.91466667 391.168c1.59288889 6.48533333 6.25777778 11.60533333 12.51555556 13.76711112 6.25777778 2.16177778 13.19822222 1.024 18.432-2.95822223l70.08711111-54.272 151.552 195.69777778c3.86844445 5.00622222 9.67111111 7.62311111 15.47377778 7.62311111 4.20977778 0 8.41955555-1.36533333 11.94666666-4.096l87.60888889-67.81155556c4.096-3.18577778 6.82666667-7.85066667 7.39555556-12.97066666 0.68266667-5.12-0.79644445-10.35377778-3.98222223-14.44977778l-151.32444444-195.69777778z" p-id="2815" fill="#4093D7"></path></svg>
<!-- <img class=" icon-poylon-pos" @click="areaMode()" src="~@/supermap/image/icon-poylon.png"> -->
</div>
<video-play
@ -162,10 +163,12 @@
camreaTree: [],
camreaTreeIsShow: true,
camreaTreeSingle: [],
placeTypeCode: [], //
checkStatus: '2',
labelSearch: '',
timer: null,
openVideo: false,
labelMode: false, //
channelCode: [],
circleModeFlag: false,
areaModeFlag: false,
@ -175,15 +178,15 @@
whoShow1: whoShow,
mapSearchParam: {
//
parentId: '',
checkStatus: '1',
pageNum: '1',
pageSize: '20000',
regionId: '',
// checkStatus: '1',
// pageNum: '1',
// pageSize: '20000',
gpsX: '',
gpsY: '',
radius: '',
borderPolygonList: [],
type: 0, //012
type: 1, //012
},
pointAllData:[],
restaurants:[],
@ -220,13 +223,14 @@
mybus.on('getCameraByParentId', (val) => {
debugger
console.log('倒腾位置1')
console.info('根据部门进行查询')
//
if (val.reset) {
this.hiMapFun.mapFlyTo({lat:'36.017043',lng: '119.922772'}, 9)
}
this.mapSearchParam.parentId = val.id
this.mapSearchParam.type = "1"
this.mapSearchParam.pageSize = 10000
this.mapSearchParam.regionId = val.id
// this.mapSearchParam.type = "1"
// this.mapSearchParam.pageSize = 10000
this.getCameraByParentId('','department')
})
//
@ -245,17 +249,28 @@
})
//
mybus.off('cameraDataOnMap')
mybus.off('cameraDataOnMap')
mybus.on('cameraDataOnMap', (data) => {
this.addResourceTomap('videoMap', data)
})
//
mybus.off('CameraConditionPlaceType')
mybus.on('CameraConditionPlaceType', (data) => {
this.queryCameraConditionPlace(data)
console.info('根据标签进行查询')
this.placeTypeCode = data
this.queryCameraConditionPlace()
})
//
mybus.off('resetMapSearch')
mybus.on('resetMapSearch', (index) => {
if (index == 2) {
this.labelMode = true
this.queryCameraConditionPlace()
} else {
this.labelMode = false
this.getCameraByParentId('map')
}
})
//
mybus.off('clearLeftSelect')
mybus.on('clearLeftSelect', () => {
@ -270,11 +285,17 @@
}
},
//
queryCameraConditionPlace(data) {
queryCameraConditionPlace(param) {
debugger
let params = {
placeTypeCode: data,
placeTypeCode: this.placeTypeCode,...param
}
if (params.regionId) {
params.regionId = '70be8c5b664f4bcf869d82f2e8335051'
}
this.spinning = true;
CameraConditionPlaceType(params).then((res) => {
this.spinning = false;
const byteArray = this.unzip(res.data.data)
this.addResourceTomap('videoMap', byteArray)
})
@ -370,7 +391,12 @@
type: this.mapSearchParam.type,
}
// mybus.emit('getListByMap', params);
this.getCameraByParentId('map');
if (this.labelMode) {
debugger
this.queryCameraConditionPlace(params)
} else {
this.getCameraByParentId('map');
}
console.log("areaSelectResource -> latlngs", latlngs)
}
})
@ -399,11 +425,17 @@
circlePloygonLayer
)
console.log('查询图层为何发生了改变', e.layer)
this.mapSearchParam.gpsX = e.layer._latlng.lng
this.mapSearchParam.gpsY = e.layer._latlng.lat
this.mapSearchParam.regionId = this.mapSearchParam.regionId ||
'70be8c5b664f4bcf869d82f2e8335051',
this.mapSearchParam.longitude = e.layer._latlng.lng
this.mapSearchParam.latitude = e.layer._latlng.lat
this.mapSearchParam.radius = radius
this.mapSearchParam.type = 1
this.getCameraByParentId('map')
if (this.labelMode) {
this.queryCameraConditionPlace(this.mapSearchParam)
} else {
this.getCameraByParentId('map');
}
}
}
})
@ -419,11 +451,11 @@
// this.hiMapFun.mapFlyTo({lat:'36.017043',lng: '119.922772'}, 9)
let params = {
regionId:
this.mapSearchParam.parentId ||
this.mapSearchParam.regionId ||
'70be8c5b664f4bcf869d82f2e8335051',
name: this.mapSearchParam.cameraName || '',
longitude: this.mapSearchParam.gpsX || '',
latitude: this.mapSearchParam.gpsY || '',
longitude: this.mapSearchParam.gpsX || this.mapSearchParam.longitude || '',
latitude: this.mapSearchParam.gpsY || this.mapSearchParam.latitude || '',
radius: this.mapSearchParam.radius || '',
type: this.mapSearchParam.type,
borderPolygonList: this.mapSearchParam.borderPolygonList || [],
@ -453,7 +485,7 @@
this.spinning = false;
const byteArray = this.unzip(res.data.data)
if(type=='map'){
let params = this.mapSearchParam;
let params = JSON.parse(JSON.stringify(this.mapSearchParam));
// const byteArray = this.unzip(res.data.data)
params.dataSource = byteArray||0;
params.total = res.data.count||0;
@ -507,21 +539,19 @@
}
},
resetCircle(){
debugger
//
this.hiMapFun.removeLayerByLayerName('circlePloygonLayer')
//
this.mapSearchParam.gpsX = ''
this.mapSearchParam.gpsY = ''
this.mapSearchParam.longitude = ''
this.mapSearchParam.latitude = ''
this.mapSearchParam.radius = ''
this.mapSearchParam.type = 0;
const params = {
gpsX: this.mapSearchParam.gpsX,
gpsY: this.mapSearchParam.gpsY,
radius: this.mapSearchParam.radius,
type: this.mapSearchParam.type
}
this.getCameraByParentId('map')
// mybus.emit('getListByMap', params);
if (this.labelMode) {
this.queryCameraConditionPlace(this.mapSearchParam)
} else {
this.getCameraByParentId('map');
}
},
resetArea(){
//
@ -533,7 +563,12 @@
borderPolygonList: this.mapSearchParam.borderPolygonList,
type: this.mapSearchParam.type
}
this.getCameraByParentId('map')
if (this.labelMode) {
this.queryCameraConditionPlace(params)
} else {
this.getCameraByParentId('map');
}
// this.getCameraByParentId('map')
// mybus.emit('getListByMap', params);
},
//
@ -900,7 +935,7 @@
.leaflet-control-attribution {
display: none;
}
.icon, .icon-poylon {
.icon {
position: absolute;
bottom: 0.1rem;
right: 0.1rem;
@ -916,6 +951,11 @@
}
}
.icon-poylon {
position: absolute;
// bottom: 0.1rem;
right: 0.1rem;
z-index: 988;
cursor: pointer;
width: 0.46rem;
bottom: 0.6rem;
}

View File

@ -53,7 +53,9 @@
import { Encrypt } from '@/utils/crypto'
import { UserOutlined, LockOutlined } from '@ant-design/icons-vue'
import { message, Modal } from 'ant-design-vue'
import { getNavList } from '@/api/user'
import { useStore } from 'vuex'
// const store = useStore()
// 西
const isXiHaiAn = whoShow.itShowXiHaiAn
@ -74,6 +76,7 @@
devDependencies: devDependencies,
is360: false,
isIE: false,
store: useStore(),
canOpen: ['FF', 'Chrome'],
}
},
@ -94,7 +97,6 @@
mounted() {
this.form.username = ''
this.form.password = ''
if (!this.canOpen.includes(this.judgeAgent())) {
Modal.warning({
title: '提示',
@ -106,6 +108,24 @@
...mapActions({
login: 'user/login',
}),
getNavList() {
let navList = []
getNavList({
_t: new Date().getTime(),
}).then((res) => {
const nav = res.data.data.filter((item) => item.site === 1)
if (nav.length > 0) {
navList = nav.map((item) => {
item.key = item.url
item.innerKey = item.permissions
return item
})
}
console.log('后台获取到的站点', navList)
debugger
this.store.commit('user/setNavList', navList)
})
},
//
judgeAgent() {
let userAgent = navigator.userAgent // userAgent
@ -159,6 +179,7 @@
})
// window.localStorage.setItem('tokenStartTime', new Date().getTime())
window.sessionStorage.setItem('visits', JSON.stringify([]))
this.getNavList()
// console.log(this.handleRoute())
// 西
if (isXiHaiAn) {

View File

@ -8,13 +8,13 @@
<div class="bottom">
<div class="item" v-for="item in productServiceData" :key="item.id">
<div class="img" :class="item.imgType"></div>
<a-tooltip >
<a-tooltip>
<template #title>{{ item.name }}</template>
<div class="name">{{ item.name }}</div>
</a-tooltip>
<div class="dec">
<span>{{ item.deptName }}</span>
</div>
<span>{{ item.deptName }}</span>
</div>
<div class="text">
{{ item.description || '暂无描述' }}
</div>
@ -81,18 +81,26 @@
query: {
// select: '',
select: DETAIL_PAGE_CONTENT_DEFAULT_TAB,
orderField:'tdr.create_date'
orderField: 'tdr.create_date',
},
})
}
const selectOne = (id) => {
console.log('点击===============》', id)
router.push({
path: '/details',
// router.push({
// path: '/details',
// query: {
// id: id,
// },
// })
const detailPage = router.resolve({
path: '/details', //
query: {
id: id,
hiddenBackFlag: true,
},
})
window.open(detailPage.href, '_blank')
}
</script>
<style lang="less" scoped>
@ -177,15 +185,15 @@
word-break: break-all;
}
.dec {
margin: 8px 8px;
text-align: center;
padding-right: 10px;
color: #0058e1;
span {
background: rgba(0, 88, 225, 0.1);
padding: 5px 5px;
}
margin: 8px 8px;
text-align: center;
padding-right: 10px;
color: #0058e1;
span {
background: rgba(0, 88, 225, 0.1);
padding: 5px 5px;
}
}
.text {
width: 100%;
height: 0.9rem;

View File

@ -48,11 +48,10 @@
<div class="dec">
<span>{{ item.deptName }}</span>
</div>
<a-tooltip >
<a-tooltip>
<template #title>{{ item.description || '暂无描述' }}</template>
<div class="text">{{item.description || '暂无描述'}}</div>
<div class="text">{{ item.description || '暂无描述' }}</div>
</a-tooltip>
</div>
</div>
</div>
@ -65,302 +64,312 @@
</div>
</template>
<script setup>
import { ref } from 'vue'
import { pageWithAttrs } from '@/api/home.js'
import { useRouter } from 'vue-router'
import { useStore } from 'vuex'
import { DETAIL_PAGE_CONTENT_DEFAULT_TAB } from '@/global/GlobalConfig.js'
const store = useStore()
const router = useRouter()
const select = ref('申请量')
const selList = ref(['申请量', '收藏量'])
const list = ref([])
import { ref } from 'vue'
import { pageWithAttrs } from '@/api/home.js'
import { useRouter } from 'vue-router'
import { useStore } from 'vuex'
import { DETAIL_PAGE_CONTENT_DEFAULT_TAB } from '@/global/GlobalConfig.js'
const store = useStore()
const router = useRouter()
const select = ref('申请量')
const selList = ref(['申请量', '收藏量'])
const list = ref([])
const paramsGetResources = {
districtId: '',
pageNum: 1,
pageSize: 6,
type: '应用资源',
name: '',
infoList: [],
orderField: 'applyCount', // total visits applyCount score collectCount
orderType: 'DESC', // ASC DESC
}
const selectChange = (sel) => {
select.value = sel
switch (select.value) {
case '浏览量':
paramsGetResources.orderField = 'visits'
break
case '申请量':
paramsGetResources.orderField = 'applyCount'
break
case '收藏量':
paramsGetResources.orderField = 'collectCount'
break
default:
paramsGetResources.orderField = 'total'
break
const paramsGetResources = {
districtId: '',
pageNum: 1,
pageSize: 6,
type: '应用资源',
name: '',
infoList: [],
orderField: 'applyCount', // total visits applyCount score collectCount
orderType: 'DESC', // ASC DESC
}
const selectChange = (sel) => {
select.value = sel
switch (select.value) {
case '浏览量':
paramsGetResources.orderField = 'visits'
break
case '申请量':
paramsGetResources.orderField = 'applyCount'
break
case '收藏量':
paramsGetResources.orderField = 'collectCount'
break
default:
paramsGetResources.orderField = 'total'
break
}
getList()
}
const getList = () => {
pageWithAttrs(paramsGetResources).then((res) => {
console.log('查询列表============>', res.data.data.records)
res.data.data.records.forEach((val) => {
switch (val.type) {
case '组件服务':
val.imgType = 'zj'
break
case '应用资源':
val.imgType = 'yy'
break
case '基础设施':
val.imgType = 'jc'
break
case '数据资源':
val.imgType = 'sj'
break
case '知识库':
val.imgType = 'zs'
break
default:
val.imgType = 'zj'
break
}
})
list.value = res.data.data.records
})
}
getList()
}
const getList = () => {
pageWithAttrs(paramsGetResources).then((res) => {
console.log('查询列表============>', res.data.data.records)
res.data.data.records.forEach((val) => {
switch (val.type) {
case '组件服务':
val.imgType = 'zj'
break
case '应用资源':
val.imgType = 'yy'
break
case '基础设施':
val.imgType = 'jc'
break
case '数据资源':
val.imgType = 'sj'
break
case '知识库':
val.imgType = 'zs'
break
default:
val.imgType = 'zj'
break
}
})
list.value = res.data.data.records
})
}
getList()
function jumpPage() {
// store
store.commit('home/selectCardsData', {
selectCardsnum: '组件服务',
})
console.log('选中===================>', store.getters['home/selectCardsnum'])
router.push({
path: '/DetailsPageconetent',
query: {
// select: '',
select: DETAIL_PAGE_CONTENT_DEFAULT_TAB,
orderField:paramsGetResources.orderField //
},
})
}
const selectOne = (id) => {
console.log('点击===============》', id)
router.push({
path: '/details',
query: {
id: id,
},
})
}
function jumpPage() {
// store
store.commit('home/selectCardsData', {
selectCardsnum: '组件服务',
})
console.log(
'选中===================>',
store.getters['home/selectCardsnum']
)
router.push({
path: '/DetailsPageconetent',
query: {
// select: '',
select: DETAIL_PAGE_CONTENT_DEFAULT_TAB,
orderField: paramsGetResources.orderField, //
},
})
}
const selectOne = (id) => {
console.log('点击===============》', id)
// router.push({
// path: '/details',
// query: {
// id: id,
// },
// })
const detailPage = router.resolve({
path: '/details', //
query: {
id: id,
hiddenBackFlag: true,
},
})
window.open(detailPage.href, '_blank')
}
</script>
<style lang="less" scoped>
.popular-ability {
height: 6.8rem;
background: url('~@/assets/newHome/popular-bg.png') no-repeat;
background-size: 100%;
display: flex;
justify-content: center;
.main {
width: 13rem;
margin-top: 0.78rem;
.popular-ability {
height: 6.8rem;
background: url('~@/assets/newHome/popular-bg.png') no-repeat;
background-size: 100%;
display: flex;
flex-direction: column;
flex-wrap: wrap;
.top {
font-size: 0.3rem;
color: #fff;
text-align: center;
justify-content: center;
.main {
width: 13rem;
margin-top: 0.78rem;
display: flex;
flex-direction: column;
flex-wrap: wrap;
justify-content: center;
align-items: center;
.line {
width: 0.34rem;
height: 0.03rem;
background-color: #fff;
margin-top: 0.08rem;
}
}
.bottom {
display: flex;
justify-content: space-between;
margin-top: 0.52rem;
.left {
.top {
font-size: 0.3rem;
color: #fff;
text-align: center;
display: flex;
flex-direction: column;
flex-wrap: wrap;
.select {
cursor: pointer;
justify-content: center;
align-items: center;
.line {
width: 0.34rem;
height: 0.03rem;
background-color: #fff;
margin-top: 0.08rem;
}
}
.bottom {
display: flex;
justify-content: space-between;
margin-top: 0.52rem;
.left {
display: flex;
flex-direction: column;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: 1.05rem;
height: 2.1rem;
background: rgba(255, 255, 255, 0.08);
margin-bottom: 0.01rem;
border-right: 0.02rem solid rgba(233, 233, 233, 0.3);
.img {
width: 0.36rem;
height: 0.36rem;
background-size: 100%;
}
.fwl {
background: url('~@/assets/newHome/fwl-no.png') no-repeat;
background-size: contain;
}
.sgl {
background: url('~@/assets/newHome/sgl-no.png') no-repeat;
background-size: contain;
}
.scl {
background: url('~@/assets/newHome/scl-no.png') no-repeat;
background-size: contain;
}
.text {
color: rgba(255, 255, 255, 0.6);
font-size: 0.14rem;
}
}
.select:hover {
background: rgba(255, 255, 255, 0.12);
}
.checked {
background: rgba(255, 255, 255, 0.18) !important;
border-right: 0.02rem solid #fff;
}
}
.right {
cursor: pointer;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
margin-left: 0.2rem;
.item {
width: 3.78rem;
height: 2rem;
display: flex;
.item-left {
width: 0.83rem;
height: 100%;
.select {
cursor: pointer;
display: flex;
justify-content: center;
flex-direction: column;
flex-wrap: wrap;
align-items: center;
background: #eef1f8;
justify-content: center;
width: 1.05rem;
height: 2.1rem;
background: rgba(255, 255, 255, 0.08);
margin-bottom: 0.01rem;
border-right: 0.02rem solid rgba(233, 233, 233, 0.3);
.img {
width: 0.56rem;
height: 0.56rem;
width: 0.36rem;
height: 0.36rem;
background-size: 100%;
}
.zj {
background: url('~@/assets/newHome/popular-zj.png') no-repeat;
.fwl {
background: url('~@/assets/newHome/fwl-no.png') no-repeat;
background-size: contain;
}
.yy {
background: url('~@/assets/newHome/popular-yy.png') no-repeat;
.sgl {
background: url('~@/assets/newHome/sgl-no.png') no-repeat;
background-size: contain;
}
.jc {
background: url('~@/assets/newHome/popular-jc.png') no-repeat;
.scl {
background: url('~@/assets/newHome/scl-no.png') no-repeat;
background-size: contain;
}
.sj {
background: url('~@/assets/newHome/popular-sj.png') no-repeat;
background-size: contain;
}
.zs {
background: url('~@/assets/newHome/popular-zs.png') no-repeat;
background-size: contain;
}
}
.item-right {
width: 100%;
height: 100%;
background: #fff;
.fw {
width: 100%;
padding-right: 0.1rem;
padding-top: 0.03rem;
text-align: right;
color: 666;
font-size: 0.14rem;
color: #666;
}
.name {
font-size: 0.18rem;
color: #212121;
text-align: center;
margin-top: 0.05rem;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
word-break: break-all;
}
.dec {
margin: 8px 8px;
text-align: center;
padding-right: 10px;
color: #0058e1;
span {
background: rgba(0, 88, 225, 0.1);
padding: 5px 5px;
}
}
.text {
width: 100%;
padding: 0rem 0.03rem;
color: rgba(255, 255, 255, 0.6);
font-size: 0.14rem;
color: #212121;
line-height: 0.24rem;
height: 1rem;
word-break: break-all;
overflow: hidden;
}
}
.select:hover {
background: rgba(255, 255, 255, 0.12);
}
.checked {
background: rgba(255, 255, 255, 0.18) !important;
border-right: 0.02rem solid #fff;
}
}
.item:nth-of-type(4),
.item:nth-of-type(5),
.item:nth-of-type(6) {
margin-top: 0.2rem;
}
.item:hover {
border-radius: 0.02rem;
border: 0.01rem solid #0058e1;
box-shadow: 0rem 0.08rem 0.2rem rgba(0, 88, 225, 0.3);
.right {
cursor: pointer;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
margin-left: 0.2rem;
.item {
width: 3.78rem;
height: 2rem;
display: flex;
.item-left {
width: 0.83rem;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background: #eef1f8;
.img {
width: 0.56rem;
height: 0.56rem;
background-size: 100%;
}
.zj {
background: url('~@/assets/newHome/popular-zj.png') no-repeat;
background-size: contain;
}
.yy {
background: url('~@/assets/newHome/popular-yy.png') no-repeat;
background-size: contain;
}
.jc {
background: url('~@/assets/newHome/popular-jc.png') no-repeat;
background-size: contain;
}
.sj {
background: url('~@/assets/newHome/popular-sj.png') no-repeat;
background-size: contain;
}
.zs {
background: url('~@/assets/newHome/popular-zs.png') no-repeat;
background-size: contain;
}
}
.item-right {
width: 100%;
height: 100%;
background: #fff;
.fw {
width: 100%;
padding-right: 0.1rem;
padding-top: 0.03rem;
text-align: right;
color: 666;
font-size: 0.14rem;
color: #666;
}
.name {
font-size: 0.18rem;
color: #212121;
text-align: center;
margin-top: 0.05rem;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
word-break: break-all;
}
.dec {
margin: 8px 8px;
text-align: center;
padding-right: 10px;
color: #0058e1;
span {
background: rgba(0, 88, 225, 0.1);
padding: 5px 5px;
}
}
.text {
width: 100%;
padding: 0rem 0.03rem;
font-size: 0.14rem;
color: #212121;
line-height: 0.24rem;
height: 1rem;
word-break: break-all;
overflow: hidden;
}
}
}
.item:nth-of-type(4),
.item:nth-of-type(5),
.item:nth-of-type(6) {
margin-top: 0.2rem;
}
.item:hover {
border-radius: 0.02rem;
border: 0.01rem solid #0058e1;
box-shadow: 0rem 0.08rem 0.2rem rgba(0, 88, 225, 0.3);
}
}
}
}
.bottom-btn {
cursor: pointer;
text-align: center;
margin-top: 0.24rem;
color: #fff;
width: 1rem;
height: 0.24rem;
line-height: 0.24rem;
margin-left: 6rem;
span {
display: inline-block;
width: 0.1rem;
height: 0.1rem;
background: url('~@/assets/newHome/gd.png') no-repeat;
background-size: contain;
.bottom-btn {
cursor: pointer;
text-align: center;
margin-top: 0.24rem;
color: #fff;
width: 1rem;
height: 0.24rem;
line-height: 0.24rem;
margin-left: 6rem;
span {
display: inline-block;
width: 0.1rem;
height: 0.1rem;
background: url('~@/assets/newHome/gd.png') no-repeat;
background-size: contain;
}
}
.bottom-btn:hover {
background: rgba(0, 88, 225, 0.1);
}
}
.bottom-btn:hover {
background: rgba(0, 88, 225, 0.1);
}
}
}
</style>

View File

@ -104,12 +104,20 @@
}
const selectOne = (id) => {
console.log('点击===============》', id)
router.push({
path: '/details',
// router.push({
// path: '/details',
// query: {
// id: id,
// },
// })
const detailPage = router.resolve({
path: '/details', //
query: {
id: id,
hiddenBackFlag: true,
},
})
window.open(detailPage.href, '_blank')
}
</script>
<style lang="less" scoped>

View File

@ -557,8 +557,6 @@
height: 3rem;
display: flex;
position: fixed;
bottom: 1.56rem;
right: 0rem;
z-index: 10;
flex-direction: column;
justify-content: space-between;
@ -615,4 +613,22 @@
background-size: 140% 126%;
background-position: center;
}
@media only screen and (max-width: 1920px) {
.fixedmount {
bottom: 1.56rem;
right: 0rem;
}
}
@media only screen and (min-width: 1921px) and (max-width: 3840px) {
.fixedmount {
bottom: 1.56rem;
right: 9.6rem;
}
}
@media only screen and (min-width: 3841px) and (max-width: 5760px) {
.fixedmount {
bottom: 1.56rem;
right: 19.2rem;
}
}
</style>

View File

@ -405,6 +405,7 @@ const phoneVisible = ref(false)
//
const changeType = (item, index) => {
debugger
contentList.data = []
formState.value.name = ''
@ -1126,8 +1127,10 @@ const showPhoneModal = () => {
}
mybus.on('closeModal', (obj) => {
debugger
detailsVisible.value = false
changeType(obj.type, obj.index)
obj.name=obj.type
changeType(obj, obj.index)
})
onBeforeUnmount(() => {
mybus.off('closeModal')

View File

@ -144,7 +144,11 @@
联系方式
</div>
<div class="button" @click="showDetail(item)">查看详情</div>
<div class="button" @click="showAdd(item)" v-if="item.backToFirst">
<div
class="button"
@click="showAdd(item)"
v-if="typeName !== '能力申请' && item.backToFirst"
>
修改
</div>
<svg

View File

@ -2,7 +2,7 @@
* @Author: hisense.liangjunhua
* @Date: 2022-07-12 09:42:44
* @LastEditors: Light
* @LastEditTime: 2022-12-01 14:02:17
* @LastEditTime: 2022-12-19 10:54:23
* @Description:我的申请 能力申请 查看详情
-->
<template>
@ -35,9 +35,118 @@
<span>能力描述{{ props.refObj.dto.description }}</span>
<span>归属部门{{ props.refObj.dto.deptName }}</span>
</p>
<p v-for="item in props.refObj.dto.infoList" :key="item.attrType">
<span>{{ item.attrType + '' + item.attrValue }}</span>
</p>
<template
v-for="item in props.refObj.dto.infoList"
:key="item.attrType"
>
<p v-if="arr.indexOf(item.attrType) === -1">
<span>{{ item.attrType + '' + item.attrValue }}</span>
</p>
<template v-else-if="JSON.parse(item.attrValue)">
<div v-if="item.attrType === '算法优势'">
<div
v-for="(attr, index) in JSON.parse(item.attrValue)"
:key="item.attrType + index"
>
<div>{{ item.attrType + '-' + (index + 1) }}</div>
<div>
<span>算法优势名称{{ attr.name }}</span>
</div>
<div>
<span>算法优势描述{{ attr.desc }}</span>
</div>
</div>
</div>
<div v-else-if="item.attrType === '应用场景'">
<div
v-for="(attr, index) in JSON.parse(item.attrValue)"
:key="item.attrType + index"
>
<div>{{ item.attrType + '-' + (index + 1) }}</div>
<div>
<span>应用场景名称{{ attr.name }}</span>
</div>
<div>
<span>应用场景描述{{ attr.desc }}</span>
</div>
<div>
<span>
应用场景图片
<a-image :width="100" :src="attr.img" />
</span>
</div>
</div>
</div>
<div v-else-if="item.attrType === '计费标准信息'">
<div
v-for="(attr, index) in JSON.parse(item.attrValue)"
:key="item.attrType + index"
>
<div>{{ item.attrType + '-' + (index + 1) }}</div>
<div>
<span>计费方式{{ attr.type }}</span>
</div>
<div>
<span>计费标准{{ attr.price }}</span>
</div>
<div>
<span>计费标准描述{{ attr.desc }}</span>
</div>
</div>
</div>
<div v-else-if="item.attrType === '常见问题'">
<div
v-for="(attr, index) in JSON.parse(item.attrValue)"
:key="item.attrType + index"
>
<div>{{ item.attrType + '-' + (index + 1) }}</div>
<div>
<span>问题{{ attr.question }}</span>
</div>
<div>
<span>答复{{ attr.answer }}</span>
</div>
</div>
</div>
<div v-else-if="item.attrType === '功能介绍'">
<div
v-for="(attr, index) in JSON.parse(item.attrValue)"
:key="item.attrType + index"
>
<div>{{ item.attrType + '-' + (index + 1) }}</div>
<div>
<span>功能名称{{ attr.name }}</span>
</div>
<div>
<span>功能描述{{ attr.desc }}</span>
</div>
<div>
<span>
功能图片
<a-image :width="100" :src="attr.img" />
</span>
</div>
</div>
</div>
</template>
</template>
<!-- <p v-for="item in props.refObj.dto.infoList" :key="item.attrType">
<template v-if="arr.indexOf(item.attrType) === -1">
<span>{{ item.attrType + '' + item.attrValue }}</span>
</template>
<template v-else-if="item.attrType === '算法优势'">
<div
v-for="(attr, index) in JSON.parse(item.attrValue)"
:key="item.attrType + index"
>
<div>{{ item.attrType + '-' + (index + 1) }}</div>
<div>
<span>算法优势名称{{ attr.name }}</span>
<span>算法优势描述{{ attr.desc }}</span>
</div>
</div>
</template>
</p> -->
</div>
</div>
</div>
@ -52,11 +161,11 @@
})
console.log(props.refObj, '=====================================')
const arr = ['算法优势', '应用场景', '计费标准信息', '常见问题', '功能介绍']
if (props.refObj.dto.infoList) {
props.refObj.dto.infoList = props.refObj.dto.infoList.filter(
(val) => arr.indexOf(val.attrType) == -1
)
}
// if (props.refObj.dto.infoList) {
// props.refObj.dto.infoList = props.refObj.dto.infoList.filter(
// (val) => arr.indexOf(val.attrType) == -1
// )
// }
const endThis = () => {
endProcess({ instanceId: props.refObj.processInstanceId }).then((res) => {
if (res.data.code == 0) {
@ -104,6 +213,9 @@
.main {
background: #eee;
padding: 0.2rem 0.2rem 0.1rem;
div {
margin-bottom: 1em;
}
p {
display: flex;
justify-content: space-between;