Commit 3f163cd3 authored by 郝聪敏's avatar 郝聪敏

feature: 修改bug

parent 51cd9cc8
<template>
<div id="app" class="layout" >
<Row type="flex" class="layout-container" v-if="!isDashboard">
<i-col :span="3" class="layout-menu-left">
<Menu :active-name="activeName" theme="dark" width="auto" :open-names="['1']" accordion @on-select="select">
<div class="layout-logo-left">低代码平台</div>
<Menu-item name="list">作品列表</Menu-item>
<Menu-item name="my">我的草稿</Menu-item>
<Menu-item name="template">创意模板</Menu-item>
</Menu>
</i-col>
<i-col :span="21" class="layout-menu-right">
<div class="layout-header">
<div class="avator">
<span>{{ username }}</span>
<span @click="logOut" style="cursor: pointer;">退出</span>
</div>
</div>
<div class="layout-content">
<slot></slot>
</div>
<div class="layout-copy">
2014-2021 &copy; QuantGroup
</div>
</i-col>
</Row>
<slot v-if="isDashboard"></slot>
</div>
</template>
<style lang="less">
#app {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.ivu-spin-fix {
z-index: 1000;
background-color: rgba(0, 0, 0, 0.8);
}
.layout {
border: 1px solid #d7dde4;
background: #f5f7f9;
position: relative;
border-radius: 4px;
overflow: auto;
height: 100%;
}
.layout-container {
height: 100%;
}
.layout-breadcrumb {
padding: 10px 15px 0;
}
.layout-content {
flex: 1;
margin: 15px;
overflow: auto;
background: #fff;
border-radius: 4px;
}
.layout-content-main {
padding: 10px;
}
.layout-copy {
text-align: center;
padding: 10px 0 20px;
color: #9ea7b4;
}
.layout-menu-left {
background: #464c5b;
}
.layout-menu-right {
display: flex;
flex-direction: column;
}
.layout-header {
height: 45px;
line-height: 45px;
background: #fff;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
.layout-ceiling-main {
float: right;
margin-right: 15px;
}
.layout-logo-left {
width: 90%;
height: 30px;
color: #fff;
font-size: 18px;
text-align: center;
background: #5b6270;
border-radius: 3px;
margin: 15px auto;
}
.layout-ceiling-main a {
color: #9ba7b5;
}
.ivu-col {
transition: width 0.2s ease-in-out;
}
.router-fade-enter-active,
.router-fade-leave-active {
transition: opacity 0.3s;
}
.router-fade-enter,
.router-fade-leave-active {
opacity: 0;
}
.avator {
float: right;
width: 120px;
height: 45px;
line-height: 45px;
font-size: 14px;
}
body {
/deep/ .cr-popup {
z-index: 1111;
}
}
</style>
<script lang="ts" src="./index.ts"></script>
\ No newline at end of file
......@@ -146,7 +146,6 @@
overflow: auto;
.layout-content {
flex: 1;
margin: 15Px;
height: 100%;
overflow: auto;
background: #fff;
......
......@@ -70,6 +70,7 @@
}
.layout-copy {
height: 45px;
text-align: center;
padding: 10px 0 20px;
color: #9ea7b4;
......
......@@ -38,6 +38,7 @@ export default class DynamicForm extends Vue {
}
handleSubmit(type) {
if (this.formCustom.isPublish) { return; }
this.$refs.formCustom.validate(async (valid) => {
if (valid) {
if (type === 'save') {
......@@ -60,6 +61,11 @@ export default class DynamicForm extends Vue {
this.handleSubmit('preview');
}
autoSave() {
this.formCustom.pageName = this.formCustom.pageName ?? '未命名';
this.handleSubmit('autoSave');
}
changeStyle(type) {
const gridEle = document.querySelector('.vue-grid-layout');
gridEle.childNodes.forEach(v => {
......
......@@ -55,7 +55,7 @@
}
}
.ivu-card {
/deep/.ivu-card {
position: relative;
overflow: hidden;
......@@ -64,7 +64,7 @@
}
&-body {
padding: 10px;
padding: 0;
}
.dynamic-row-popup {
......
<template>
<div class="color-selector">
<Input class="color-selector-input" v-model="color" placeholder="请输入" @input="change"></Input>
<ColorPicker placement="bottom-end" v-model="color" @on-change="change($event)" />
<ColorPicker placement="bottom-end" v-model="color" @on-active-change="change($event)" @on-change="change($event)" />
</div>
</template>
<script>
......@@ -36,7 +36,8 @@
align-items: center;
justify-content: space-between;
&-input {
flex-basis: 150px;
width: 100px !important;
flex-basis: 100px !important;
}
}
</style>
\ No newline at end of file
<template>
<div class="select">
<Select v-model="selected">
<Select style="width: 128px" v-model="selected">
<Option v-for="item in list" :value="item.id" :key="item.id">{{ item.label }}</Option>
</Select>
</div>
......
......@@ -7,6 +7,10 @@ const couponTypeList: object[] = [
id: 2,
name: '运费券',
},
{
id: 21,
name: '享花券',
},
];
const receiverTypeList: object[] = [
{
......
......@@ -30,7 +30,12 @@ export default class CouponTableModal extends Vue {
const res = await operationApi.couponList({...data, receiverType: 1});
const couponInfoList = res?.couponInfoList?.map(item => {
item.receiverTime = `${item.receiverStartTime.slice(0, 10)}--${item.receiverEndTime.slice(0, 10)}`;
item.useTime = item.useTimeStart ? `${item.useTimeStart}-${item.useTimeEnd}` : `自领取${item.receiverDaysValid}天后生效,有效天数${item.validDays}天`;
item.useTime = item.useTimeStart
? `${item.useTimeStart}-${item.useTimeEnd}`
: item.validHours
? `自领取后有效${item.validHours}小时`
: `自领取${item.receiverDaysValid}天后生效,有效天数${item.validDays}天`;
// item.useTime = item.useTimeStart ? `${item.useTimeStart}-${item.useTimeEnd}` : `自领取${item.receiverDaysValid}天后生效,有效天数${item.validDays}天`;
if (this.coupon.some(v => v === item.id)) {
item._checked = true;
}
......
......@@ -5,7 +5,7 @@
<h4>项目{{index + 1}}</h4>
<a @click="del(index)">删除</a>
</div>
<Form @submit.native.prevent :model="item" :label-width="80">
<Form @submit.native.prevent :model="item" :label-width="50">
<FormItem :prop="`${keywords.key}`" :label="keywords.name" :key="idx" v-for="(keywords, idx) in formControl">
<component :is="getComponent(keywords.type)" :options="item.options" v-model="item[keywords.key]" />
</FormItem>
......@@ -108,6 +108,9 @@
/deep/ .ivu-card-head{
background: #f0f2f5;
}
/deep/ .ivu-card-body {
padding: 10px !important;
}
.Fl-card-title {
display: flex;
justify-content: space-between;
......
......@@ -28,6 +28,13 @@ export default class DynamicForm extends Mixins(DynamicFormMixin) {
return this.value?.length;
}
getDefaultIds() {
if (validateType(this.value) === 'object') {
return this.value?.ids;
}
return this.value;
}
@Watch('curEleIndex', { immediate: true })
onElementChange(newVal) {
this.formControl.forEach(schame => {
......@@ -59,13 +66,14 @@ export default class DynamicForm extends Mixins(DynamicFormMixin) {
}
ok() {
const defaultIds = this.getDefaultIds();
if (this.table.length > 1) {
this.$emit('input', {
type: this.table[this.activeName].type,
ids: this.selections.map(v => v[this.table[this.activeName].key])
ids: this.selections.map(v => v[this.table[this.activeName].key])?.concat(defaultIds);
});
} else {
this.$emit('input', this.selections.map(v => v.id));
this.$emit('input', this.selections.map(v => v.id)?.concat(defaultIds));
}
}
......
......@@ -5,7 +5,7 @@
<div slot='title' class="Fl-card-title">
<a slot='title' @click="add()">{{editText('edit')}}</a>
</div>
<Form @submit.native.prevent :model="form" :label-width="80">
<Form @submit.native.prevent :model="form" :label-width="90">
<FormItem :prop="`${keywords.key}`" :label="keywords.name" :key="idx" v-for="(keywords, idx) in formControl">
<component :is="getComponent(keywords.type)" :options="keywords.options" v-model="form[keywords.key]" />
</FormItem>
......@@ -76,6 +76,7 @@
/deep/ .ivu-menu-item {
text-align: center;
padding: 10px 0;
justify-content: center;
}
}
}
......
<template>
<div>
<div class="upload">
<div class="upload-img" v-if="value">
<img :src="value">
<div class="upload-img" v-if="img">
<img :src="img">
<div class="upload-img-cover">
<Icon type="ios-trash-outline" @click.native="handleRemove()"></Icon>
</div>
</div>
<div id="upload">
<div :id="containerId" class="upload-container">
<Progress v-if="percent" vertical :percent="percent"></Progress>
<div :id="id">
<Icon type="camera" size="20"></Icon>
</div>
</div>
</div>
<Input v-model="img"></Input>
</div>
</template>
<script>
import '@/service/qiniu.service';
......@@ -26,13 +30,16 @@
},
data() {
return {
id: uuidv4().substr(0, 8)
id: uuidv4().substr(0, 8),
percent: 0,
img: this.value
}
},
methods: {
handleRemove () {
this.$emit('input', '');
this.$emit('change', '');
this.img = '';
this.$emit('input', this.img);
this.$emit('change', this.img);
},
uploadQiniu() {
var uploader = Qiniu.uploader({
......@@ -43,14 +50,15 @@
save_key: true, // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK会忽略对key的处理
domain: config.qiniuHost, // bucket 域名,下载资源时用到,**必需**
get_new_uptoken: false, // 设置上传文件的时候是否每次都重新获取新的token
container: 'upload', // 上传区域DOM ID,默认是browser_button的父元素,
container: this.containerId, // 上传区域DOM ID,默认是browser_button的父元素,
max_file_size: '10mb', // 最大文件体积限制
max_retries: 3, // 上传失败最大重试次数
chunk_size: '4mb', // 分块上传时,每片的体积
auto_start: true, // 选择文件后自动上传,若关闭需要自己绑定事件触发上传
init: {
FileUploaded: (up, file, info) => {
console.log(this);
// console.log(this);
this.percent = 0;
var res = JSON.parse(info);
if (res.businessCode === '0001') {
this.$Notice.error({
......@@ -62,25 +70,52 @@
title: '上传成功',
desc: '',
});
this.$emit('input', config.qiniuHost + res.hash);
this.$emit('change', config.qiniuHost + res.hash);
this.img = config.qiniuHost + res.hash;
this.$emit('input', this.img);
this.$emit('change', this.img);
// this.url = config.qiniuHost + res.hash;
}
},
BeforeUpload: (up, file) => {
// var chunk_size = plupload.parseSize(this.getOption('chunk_size'));
this.percent = 0;
},
UploadProgress: (up, file) => {
// var chunk_size = plupload.parseSize(this.getOption('chunk_size'));
this.percent = file.percent;
console.log('UploadProgress', file.percent);
},
Error: (up, err, errTip) => {
this.percent = 0;
}
},
});
},
},
computed: {
containerId() {
return `container_${this.id}`;
}
},
watch: {
value: {
handler(newVal) {
this.img = newVal;
},
immediate: true
}
},
mounted () {
this.uploadQiniu();
}
}
</script>
<style lang="less" scoped="">
<style lang="less" scoped>
.upload {
position: relative;
display: flex;
align-items: center;
margin-bottom: 10px;
width: 100%;
overflow: hidden;
&-img {
......@@ -122,15 +157,20 @@
}
}
#upload {
&-container {
text-align: center;
border: 1px dashed;
width: 56px;
height:56px;
height: 56px;
line-height: 56px;
#upload_pic {
}
/deep/ .ivu-progress {
box-sizing: content-box;
height: 50px;
line-height: 50px;
}
}
}
</style>
\ No newline at end of file
......@@ -14,6 +14,7 @@ import Textarea from './component/Textarea/index.vue';
import Number from './component/Number/index.vue';
import ColumnSelector from './component/ColumnSelector/index.vue';
import { resizeDiv, getStyle } from '@/service/utils.service';
import EventBus from '@service/eventBus.service';
@Component({ components: { Upload, ColorSelector, BaseSelect, FormList, Textarea, Number, ComponentSelect, GoodsTableModal, CouponTableModal, ColumnSelector }, name: 'DynamicForm' })
export default class DynamicForm extends Mixins(ContextMenuMixin, DynamicFormMixin) {
......@@ -102,9 +103,14 @@ export default class DynamicForm extends Mixins(ContextMenuMixin, DynamicFormMix
args: [667, 375],
},
{
content: '根据背景图片或组件自动调整宽高',
content: '根据背景图片调整宽高',
icon: 'image',
args: [667, 375, true],
args: [667, 375, 'image'],
},
{
content: '根据元素默认尺寸调整宽高',
icon: 'stop',
args: ['', '', 'element'],
},
{
content: '宽100%',
......@@ -251,11 +257,13 @@ export default class DynamicForm extends Mixins(ContextMenuMixin, DynamicFormMix
resizedEvent(h, w, responsive) {
const elements = this.pageData.elements[this.curEleIndex];
if (responsive) {
if (elements.name === 'freedom-container') {
if (responsive === 'image' && elements.commonStyle.backgroundImage) {
// if (elements.name === 'freedom-container') {
resizeDiv(elements.commonStyle.backgroundImage, 667, 375, (imgHeight) => {
this.updatePageInfo({ containerIndex: this.curEleIndex, data: { ...elements, point: { ...elements.point, w: w ?? elements.point.w, h: imgHeight ?? elements.point.h, responsive: true } } });
});
} else if (elements.id) {
// }
} else if (responsive === 'element' && elements.id) {
this.adjustHeight();
}
} else {
......@@ -263,11 +271,6 @@ export default class DynamicForm extends Mixins(ContextMenuMixin, DynamicFormMix
}
}
resizedChildEvent(type) {
this.$emit('resizedChildEvent', type);
// const containerEle = this.$refs.freedomContainer[this.curEleIndex];
}
changeAlignType(type) {
const freedomBody = document.querySelector('.freedom-body');
const curElement = (freedomBody as Element).children[this.curChildIndex];
......@@ -288,6 +291,8 @@ export default class DynamicForm extends Mixins(ContextMenuMixin, DynamicFormMix
top = ceil(divide(subtract(containerH, eleH), 2), 2); break;
case 'horizontal':
left = ceil(divide(subtract(containerW, eleW), 2), 2); break;
case 'full': case 'width': case 'height':
EventBus.$emit('resizedChildEvent', type);
default: break;
}
this.updatePageInfo({ containerIndex: this.curEleIndex, childIndex: this.curChildIndex, data: { ...elements, commonStyle: { ...elements.commonStyle, left, top } } });
......
......@@ -2,9 +2,9 @@
<div class="dynamic-form" v-if="isSelected">
<div class="dynamic-form-header">
<h2>{{ curElement.title }}</h2>
<div>{{ `ID: ${curElement.id}` }}</div>
<div>{{ `组件ID: ${curElement.id}` }}</div>
</div>
<Form class="dynamic-form-component" @submit.native.prevent :label-width="80" :model="form" v-if="curElement.schame && curElement.schame.length">
<Form class="dynamic-form-component" @submit.native.prevent :label-width="110" :model="form" v-if="curElement.schame && curElement.schame.length">
<h3 v-if="!hasGroup">组件属性</h3>
<template v-for="(item, index) in curElement.schame">
<div v-if="item.title">
......@@ -18,7 +18,7 @@
</FormItem>
</template>
</Form>
<Form class="dynamic-form-basic" @submit.native.prevent :label-width="80">
<Form class="dynamic-form-basic" @submit.native.prevent :label-width="110">
<h3>基础样式</h3>
<template v-if="childSelected">
<template v-for="item in styleSchame.curEle">
......@@ -97,15 +97,28 @@
margin-right: 10px;
}
}
/deep/ .ivu-form-item-label {
font-size: 14px;
/deep/ .ivu-form-item {
display: flex;
align-items: center;
&:before, &:after {
display: none;
}
/deep/ .ivu-input-number {
.ivu-form-item-label {
width: 97px;
line-height: 18px;
font-size: 12px;
text-align: left;
}
.ivu-input-number {
width: 60px;
}
/deep/ .ivu-form-item-content {
.ivu-form-item-content {
margin-left: 0 !important;
flex: 1;
.ivu-tooltip {
margin-right: 6px;
.ivu-btn-ghost {
......@@ -125,4 +138,5 @@
}
}
}
}
</style>
\ No newline at end of file
import {Component, Vue, Prop, Watch, Emit} from 'vue-property-decorator';
import DynamicForm from '@editor/component/DynamicForm/index.vue';
import DynamicPageForm from '@editor/component/DynamicPageForm/index.vue';
// import EventBus from '@service/eventBus.service';
@Component({ components: { DynamicPageForm, DynamicForm }, name: 'RecordModal' })
export default class DynamicFormTabs extends Vue {
@Emit('modProps')
modProps(props, ele, type) {
// return props, ele, type;
}
// @Emit('resizedChildEvent')
resizedChildEvent(type) {
// EventBus.$emit('resizedChildEvent', type);
// return type;
}
}
\ No newline at end of file
<template>
<Tabs class="dynamic-form-tabs">
<TabPane label="组件设置">
<dynamic-form @modProps="modProps" @resizedChildEvent="resizedChildEvent"></dynamic-form>
</TabPane>
<!-- <TabPane label="事件">事件</TabPane> -->
<TabPane label="页面设置">
<dynamic-page-form @modProps="modProps" @resizedChildEvent="resizedChildEvent"></dynamic-page-form>
</TabPane>
</Tabs>
</template>
<script lang="ts" src="./index.ts"></script>
<style lang="less" scoped>
.tabs-position() {
/deep/ .ivu-tabs-nav-scroll {
display: flex;
justify-content: center;
}
}
.dynamic-form-tabs {
height: 100%;
min-width: 320px;
.tabs-position();
background: #F5F6FA;
/deep/ .ivu-tabs-bar {
background: #fff;
margin-bottom: 0;
}
/deep/ .ivu-tabs-content {
height: calc(100% - 48px);
.ivu-tabs-tabpane {
height: 100%;
overflow-y: scroll;
overflow-x: hidden;
}
}
}
</style>
\ No newline at end of file
......@@ -56,9 +56,4 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
onPropsFormChange(newVal) {
this.$emit('modProps', newVal, 'page', 'props');
}
// resizedChildEvent(type) {
// this.$emit('resizedChildEvent', type);
// // const containerEle = this.$refs.freedomContainer[this.curEleIndex];
// }
}
\ No newline at end of file
......@@ -4,6 +4,7 @@ import TransformStyleMixin from '@/page/mixins/transformStyle.mixin';
import { cloneDeep, pick, omit, throttle } from 'lodash';
import { Action, Mutation, State, Getter } from 'vuex-class';
import { convertPointStyle, getStyle } from '@/service/utils.service';
import EventBus from '@service/eventBus.service';
// import CsGuideCube from '@/lib/DownloadGuide/index.vue';
// import CsMarquee from '@/lib/Marquee/index.vue';
......@@ -22,13 +23,6 @@ export default class FreedomContainer extends Mixins(ContextMenuMixin, Transform
dots: object = {};
get styles() {
return {
// background: `url(${this.backgroundImage}) no-repeat 0 0 / cover`,
// backgroundColor: this.backgroundColor
};
}
mousedown(childIndex, event) {
this.setDragable(false);
const childItem = cloneDeep(this.childItem);
......@@ -68,7 +62,7 @@ export default class FreedomContainer extends Mixins(ContextMenuMixin, Transform
onIndexChange(newVal) {
this.dots = {};
// console.log('onIndexChange');
if (this.curChildIndex || this.curChildIndex === 0) {
if (this.curChildIndex || this.curChildIndex === 0 && this.containerIndex === this.curEleIndex) {
this.setPointStyle();
}
}
......@@ -81,6 +75,15 @@ export default class FreedomContainer extends Mixins(ContextMenuMixin, Transform
}
}
mounted() {
EventBus.$on('resizedChildEvent', (type) => {
if (this.curEleIndex === this.containerIndex) {
this.setChildSize(type);
this.setPointStyle();
}
});
}
// 获取point计算后样式
setPointStyle() {
this.$nextTick(() => {
......@@ -105,6 +108,7 @@ export default class FreedomContainer extends Mixins(ContextMenuMixin, Transform
}
getHW(index) {
if (!this.$refs.childComponent || !this.$refs.childComponent.length) { return [0, 0]; }
const childComponent = this.$refs.childComponent[index];
return [getStyle(childComponent.$el, 'height'), getStyle(childComponent.$el, 'width')];
}
......
<template>
<div class="freedom" :ref="`freedomContainer${containerIndex}`" @click.stop="handleElementClick(containerIndex)">
<div class="freedom-body" :style="styles" :data-index="containerIndex">
<div class="freedom-body" :data-index="containerIndex">
<div v-for="(item, index) in childItem.child" :style="transformStyle(item.commonStyle, 'container')" :class="['freedom-body-item', { 'Fb-item_selected': curChildIndex === index }]" :key="index" @click.stop="handleElementClick(containerIndex, index)" @mousedown.stop.prevent="mousedown(index, $event)" @contextmenu.prevent.stop="show($event, containerIndex, index)">
<component ref="childComponent" :style="transformStyle(item.commonStyle, 'component')" :is="item.name" v-bind="item.props"></component>
<div class="freedom-body-dot"
......@@ -44,7 +44,7 @@
overflow: hidden;
&-item {
position: absolute;
z-index: 2;
z-index: 101;
font-size: 0;
&:after {
position: absolute;
......
import {Component, Vue, Prop, Watch, Emit} from 'vue-property-decorator';
import DynamicComponent from '@editor/component/DynamicComponent/index.vue';
import { basicComponents, businessComponents } from '@lib/config';
import { State } from 'vuex-class';
@Component({ components: { DynamicComponent }, name: 'RecordModal' })
export default class DynamicForm extends Vue {
@State(state => state.editor.templateList) templateList!: any[];
activeName: string = '1';
resources: object = { basicComponents, businessComponents };
// 选择组件库
selectMaterial(val: string) {
this.activeName = val;
}
@Emit('update:isDraging')
dragstart() {
return true;
}
@Emit('update:isDraging')
dragend() {
return false;
}
@Emit('addEle')
addEle(data) {
return data;
}
}
\ No newline at end of file
<template>
<div class="material">
<Menu class="Dc-left-menu" active-name="1" @on-select="selectMaterial">
<MenuItem name="1">
<Icon type="android-apps"></Icon>
<span>基础库</span>
</MenuItem>
<MenuItem name="2">
<Icon type="android-apps"></Icon>
<span>业务库</span>
</MenuItem>
<MenuItem name="3">
<Icon type="android-apps"></Icon>
<span>模版</span>
</MenuItem>
</Menu>
<div class="Dc-left-content">
<div v-show="activeName === '1'">
<dynamic-component type="basic" :data="resources.basicComponents" @addEle="addEle" @dragstart="dragstart" @dragend="dragend"></dynamic-component>
</div>
<div v-show="activeName === '2'">
<dynamic-component type="business" :data="resources.businessComponents" @addEle="addEle" @dragstart="dragstart" @dragend="dragend"></dynamic-component>
</div>
<div v-show="activeName === '3'">
<dynamic-component type="template" :data="templateList" @addEle="addEle" @dragstart="dragstart" @dragend="dragend"></dynamic-component>
</div>
</div>
</div>
</template>
<script lang="ts" src="./index.ts"></script>
<style lang="less" scoped>
.tabs-position() {
/deep/ .ivu-tabs-nav-scroll {
display: flex;
justify-content: center;
}
}
.material {
display: flex !important;
height: 100%;
.Dc-left-menu {
height: 100%;
width: 77px !important;
.ivu-menu-item {
padding-left: 0;
padding-right: 0;
display: flex;
flex-direction: column;
align-items: center;
i {
font-size: 18px !important;
}
span {
font-size: 14px;
line-height: 22px;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
-khtml-user-select: none;
user-select: none;
}
}
}
.Dc-left-content {
flex: 1;
padding: 8px;
background: #fff;
overflow-y: scroll;
}
.tabs-position();
}
</style>
\ No newline at end of file
import { Component, Vue, Prop, Watch, Emit, Mixins } from 'vue-property-decorator';
import { Getter, Action, State, Mutation } from 'vuex-class';
import type { PageInfo, Page, GridLayout } from '@store/modules/editor/state';
import TransformStyleMixin from '@page/mixins/transformStyle.mixin';
import FreedomContainer from '@editor/component/FreedomContainer/index.vue';
@Component({ components: { FreedomContainer }, name: 'OperationPanel' })
export default class OperationPanel extends Mixins(TransformStyleMixin) {
@Getter('pageData') pageData;
@State(state => state.editor.gridLayout) gridLayout?: GridLayout;
@State(state => state.editor.curEleIndex) curEleIndex!: number | null;
@State(state => state.editor.curChildIndex) curChildIndex!: number | null;
@Prop(Boolean) isDraging;
@Prop(Boolean) isDragIn;
get layout() {
return this.pageData.elements.map(v => v.point);
}
@Emit('update:isDragIn')
dragenter() {
return true;
}
@Emit('update:isDragIn')
dragleave() {
return false;
}
@Emit('dragover')
dragover(event) {
//
}
@Emit('drops')
drops(event) {
//
}
@Emit('handleElementClick')
handleElementClick(curEleIndex?: number | null, curChildIndex?: number | null) {
//
}
@Emit('show')
show(event, containerIndex, childIndex) {
//
}
@Emit('resizedEvent')
resizedEvent(i, h, w) {
//
}
@Emit('movedEvent')
movedEvent(i, newX, newY) {
//
}
@Emit('toggle')
toggle(val) {
//
}
}
\ No newline at end of file
<template>
<div :class="[{'Dcm-container-panel_in': isDragIn, 'Dcm-container-panel_draging': isDraging}, 'Dcm-container-panel']" @dragover.prevent @dragenter="dragenter" @dragover="dragover"
@dragleave="dragleave" @drop="drops">
<grid-layout
:layout.sync="layout"
:col-num="gridLayout.colNum"
:row-height="gridLayout.rowHeight"
:margin="[0, 0]"
:is-draggable="gridLayout.draggable"
:is-resizable="true"
:is-mirrored="false"
:vertical-compact="true"
:use-css-transforms="true"
:style="transformStyle(pageData.commonStyle)"
@click.native.stop="toggle(false)"
>
<grid-item @click.native.stop="handleElementClick(index, null)" v-for="(item, index) in pageData.elements"
:x="item.point.x"
:y="item.point.y"
:w="item.point.w"
:h="item.point.h"
:i="item.point.i"
:key="item.point.i + index"
@contextmenu.native.prevent="show($event, index)"
@resized="resizedEvent"
@moved="movedEvent"
:style="transformStyle(item.commonStyle, item.name)"
:class="{'Dcmcp-item_selected': curEleIndex === index && curChildIndex === null}">
<component ref="container" :id="item.id" class="Dcmcp-item-com" @handleElementClick="handleElementClick" :containerIndex="index" :childItem="item" :is="item.name" :key="index" v-bind="item.props"></component>
</grid-item>
</grid-layout>
</div>
</template>
<script lang="ts" src="./index.ts"></script>
<style lang="less" scoped>
.border() {
&:before {
position: absolute;
content: '';
border: 3px solid #2d8cf0 !important;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 1
}
}
.Dcm-container-panel {
margin: 30px auto;
width: 375px;
height: 667px;
min-height: 667px;
overflow-y: scroll;
background-color: rgb(244, 244, 244);
box-shadow: 2px 0px 10px rgba(0, 0, 0, 0.2);
/deep/ .vue-grid-layout {
min-height: 667px;
.vue-grid-item {
display: flex;
justify-content: center;
align-items: center;
overflow: hidden;
&:after {
position: absolute;
top: 0;
left: 0;
content: '';
width: 100%;
height: 100%;
z-index: 100;
}
&:hover {
.border();
}
.vue-resizable-handle {
z-index: 10000;
}
}
.Dcmcp-item_selected {
.border();
}
}
&_draging {
.Dcmcp-item-com {
* {
pointer-events: none;
}
}
opacity: 0.7;
}
}
</style>
\ No newline at end of file
......@@ -76,6 +76,7 @@ export default {
newVal.forEach(item => {
this.$set(this.searchForm, item.key, item.value || null)
});
console.log('searchCondition', newVal, this.searchForm);
},
immediate: true,
},
......@@ -184,9 +185,10 @@ export default {
// @import '../../styles/comment.less';
@padding: 25px;
.tableComStyle {
height: 100%;
background: #f5f5f5;
padding: 15px;
min-height: 1000px;
// min-height: 1000px;
.searchFormStyle {
text-align: left;
clear: both;
......
import {Component, Vue, Prop, Watch, Emit} from 'vue-property-decorator';
@Component({ name: 'RecordModal' })
export default class RecordModal extends Vue {
@Prop(Boolean) value;
showPopup: boolean = false;
@Watch('value', { immediate: true })
onValueChange(val) {
this.showPopup = val;
}
@Emit('ok')
ok() {
// return;
}
@Emit('cancel')
cancel() {
// return;
}
}
\ No newline at end of file
<template>
<Modal
v-model="showPopup"
@on-ok="ok"
@on-cancel="cancel"
width="360">
<p slot="header" style="color:#2d8cf0;text-align:center">
<Icon type="information-circled"></Icon>
<span>恢复提醒</span>
</p>
<div style="text-align:center">
<p>已检测到您上次编辑单位保存, 是否恢复?</p>
</div>
</Modal>
</template>
<script lang="ts" src="./index.ts"></script>
\ No newline at end of file
import { Component, Vue } from 'vue-property-decorator';
import { Getter, Mutation } from 'vuex-class';
import { isEqual } from 'lodash';
import localStorage from '@service/localStorage.service';
@Component({ name: 'AutoSaveMixin' })
export default class AutoSaveMixin extends Vue {
@Getter('pageInfo') pageInfo;
@Mutation('SET_PAGE_INFO') setPageInfo;
showRecordModal: boolean = false;
account: string = localStorage.get('user')?.account;
hasCompared: boolean = false;
timer: NodeJS.Timeout | null = null;
showRecord() {
// console.log('showRecord');
const record = localStorage.get(`${this.account}-${this.pageInfo.id}`);
if (record && !isEqual(record, this.pageInfo)) {
this.showRecordModal = true;
// console.log('showRecord', record, this.pageInfo);
return;
}
this.hasCompared = true;
}
autoSave() {
const interval = 5 * 1000;
this.timer = setInterval(() => {
// console.log('autoSave');
if (this.account && this.pageInfo && this.hasCompared) {
// console.log('autoSave in', this.pageInfo);
localStorage.set(`${this.account}-${this.pageInfo.id}`, this.pageInfo);
}
}, interval);
this.$once('hook:beforeDestroy', () => {
this.clearTimer();
});
}
removeDefaultCache(id = 0) {
this.clearTimer();
localStorage.remove(`${this.account}-${id}`);
this.autoSave();
}
clearTimer() {
clearInterval(this.timer as NodeJS.Timeout);
this.timer = null;
}
recover() {
// console.log('recover');
const record = localStorage.get(`${this.account}-${this.pageInfo.id}`);
this.setPageInfo(record);
this.hasCompared = true;
}
cancel() {
// console.log('cancel');
this.hasCompared = true;
}
}
\ No newline at end of file
......@@ -15,6 +15,10 @@ export default class GoodsTabsMixin extends Vue {
if (element.name === 'cs-goods-tabs' && element?.props?.list.length) {
const childs = [];
const childIndexs = [];
const idList = element.props.list.map(v => v.componentId);
if (idList.length && idList.length !== Array.from(new Set(idList)).length) {
throw new Error('商品标签不可重复选择组件');
}
element.props.list.forEach((data, index) => {
const index = pageData.elements.findIndex(v => v.id === data.componentId);
if (index !== -1) {
......
import { kebabCase, maxBy } from 'lodash';
import { kebabCase, maxBy, matches } from 'lodash';
import { Getter, Action, State, Mutation } from 'vuex-class';
import { Mixins, Component, Watch, Provide } from 'vue-property-decorator';
import VueGridLayout from 'vue-grid-layout';
import { basicComponents, businessComponents } from '@lib/config';
import config from '@config/index';
import TransformStyleMixin from '@page/mixins/transformStyle.mixin';
import DynamicComponent from '@editor/component/DynamicComponent/index.vue';
import FreedomContainer from '@editor/component/FreedomContainer/index.vue';
import DynamicForm from '@editor/component/DynamicForm/index.vue';
import DynamicPageForm from '@editor/component/DynamicPageForm/index.vue';
import ContextMenuMixin from '@editor/mixins/contextMenu.mixin';
import GoodsTabsMixin from '@editor/mixins/goodsTabs.mixin';
import BasicPageForm from '@editor/component/BasicPageForm/index.vue';
import AutoSaveMixin from '@editor/mixins/autoSave.mixin';
import BasicPageFormModal from '@editor/component/BasicPageFormModal/index.vue';
import RecordModal from '@editor/component/RecordModal/index.vue';
import MaterialMenu from '@editor/component/MaterialMenu/index.vue';
import DynamicFormTabs from '@editor/component/DynamicFormTabs/index.vue';
import localStorage from '@service/localStorage.service';
import EventBus from '@service/eventBus.service';
import { getStyle } from '@service/utils.service';
import OperationPanel from '@editor/component/OperationPanel/index.vue';
import type { PageInfo, Page, GridLayout } from '../../../store/modules/editor/state';
@Component({components: { DynamicComponent, FreedomContainer, DynamicForm, GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem, BasicPageForm, DynamicPageForm }, name: 'DashBoard'})
export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin, TransformStyleMixin) {
@Component({components: { GridLayout: VueGridLayout.GridLayout,
GridItem: VueGridLayout.GridItem, BasicPageFormModal, RecordModal, MaterialMenu, DynamicFormTabs, OperationPanel }, name: 'DashBoard'})
export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin, TransformStyleMixin, AutoSaveMixin) {
@Mutation('ADD_ELEMENTS') addElements;
@Mutation('SET_CUR_ELE_INDEX') setCurEleIndex;
@Mutation('SET_CUR_CHILD_INDEX') setCurChildIndex;
......@@ -37,15 +38,12 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
@State(state => state.editor.gridLayout) gridLayout?: GridLayout;
@State(state => state.editor.curEleIndex) curEleIndex!: number | null;
@State(state => state.editor.curChildIndex) curChildIndex!: number | null;
@State(state => state.editor.templateList) templateList!: any[];
@Provide() editor = this;
activeName: string = '1';
isCollapsed: boolean = true;
isDragIn: boolean = false;
isDraging: boolean = false;
resources: object = { basicComponents, businessComponents };
showSubmitPopup: boolean = false;
async created() {
......@@ -57,33 +55,45 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
await this.setTemplateInfo({ pageId: templateId });
}
this.getTemplateList();
// 历史记录
this.showRecord();
this.autoSave();
}
get layout() {
return this.pageData.elements.map(v => v.point);
beforeRouteLeave(to, from, next) {
console.log('beforeRouteLeave');
}
// 选择组件库
selectMaterial(val: string) {
this.activeName = val;
get layout() {
return this.pageData.elements.map(v => v.point);
}
async save(type: 'preview' | 'save', pageConfig) {
try {
const user = localStorage.get('user');
const isCreate = !!this.uuid;
if (!type) {
this.showSubmitPopup = true;
} else {
this.pageData.elements.sort((a, b) => a.point.y - b.point.y);
// 处理商品标签组件
const pageData = this.handleGoodsTabs();
const { pageName, pageDescribe, pageKeywords, coverImage, isPublish, isTemplate } = pageConfig;
const pageInfo = { page: JSON.stringify(pageData), author: user?.account, isPublish, pageName, pageDescribe, pageKeywords, coverImage, isTemplate } as pageInfo;
if (this.uuid) { pageInfo.uuid = this.uuid; }
await this.savePageData({ pageInfo, pageData: this.pageData });
if (this.uuid) { await this.getPageDate({ pageId: this.uuid }); }
this.showSubmitPopup = false;
// 清除新增数据时的缓存
if (!isCreate) { this.removeDefaultCache(); }
if (type === 'preview') {
window.open(`${config.h5Host}activity/${this.uuid}`);
}
}
} catch (e) {
this.showSubmitPopup = false;
this.$Message.error(e?.message || '出现未知错误!');
}
}
async preview() {
......@@ -105,21 +115,11 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
this.isCollapsed = val;
}
dragstart() {
this.isDraging = true;
}
dragend() {
this.isDraging = false;
}
dragenter() {
// console.log('dragenter');
this.isDragIn = true;
}
dragleave() {
// console.log('dragleave');
this.isDragIn = false;
}
......@@ -204,7 +204,6 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
movedEvent(i, newX, newY) {
EventBus.$emit('component-moved');
// console.log('MOVED i=' + i + ', X=' + newX + ', Y=' + newY);
}
/**
......@@ -212,7 +211,8 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
* @param {[type]} type 尺寸类型
*/
resizedChildEvent(type) {
const containerEle = this.$refs.container[(this.curEleIndex as number)];
const containerEle = this.$refs[`freedomContainer${containerIndex}`];
// const containerEle = this.$refs.container[(this.curEleIndex as number)];
containerEle.setChildSize(type);
containerEle.setPointStyle();
}
......
......@@ -10,105 +10,25 @@
</Col>
</Row>
<Row class="dashboard-container">
<Col class="dashboard-container-left" span="6">
<Menu class="Dc-left-menu" active-name="1" @on-select="selectMaterial">
<MenuItem name="1">
<Icon type="android-apps"></Icon>
<span>基础库</span>
</MenuItem>
<MenuItem name="2">
<Icon type="android-apps"></Icon>
<span>业务库</span>
</MenuItem>
<MenuItem name="3">
<Icon type="android-apps"></Icon>
<span>模版</span>
</MenuItem>
</Menu>
<div class="Dc-left-content">
<div v-show="activeName === '1'">
<dynamic-component type="basic" :data="resources.basicComponents" @addEle="addEle" @dragstart="dragstart" @dragend="dragend"></dynamic-component>
</div>
<div v-show="activeName === '2'">
<dynamic-component type="business" :data="resources.businessComponents" @addEle="addEle" @dragstart="dragstart" @dragend="dragend"></dynamic-component>
</div>
<div v-show="activeName === '3'">
<dynamic-component type="template" :data="templateList" @addEle="addEle" @dragstart="dragstart" @dragend="dragend"></dynamic-component>
</div>
</div>
<Col class="dashboard-container-left" span="7">
<material-menu @addEle='addEle' :isDraging.sync="isDraging" />
</Col>
<Col class="dashboard-container-middle" span="18">
<Col class="dashboard-container-middle" span="17">
<Row class="Dc-middle-row">
<Col :span="isCollapsed ? 24 : 16" class="Dc-middle-container" @click.native="toggle(true)">
<div :class="[{'Dcm-container-panel_in': isDragIn, 'Dcm-container-panel_draging': isDraging}, 'Dcm-container-panel']" @dragover.prevent @dragenter="dragenter" @dragover="dragover"
@dragleave="dragleave" @drop="drops">
<grid-layout
:layout.sync="layout"
:col-num="gridLayout.colNum"
:row-height="gridLayout.rowHeight"
:margin="[0, 0]"
:is-draggable="gridLayout.draggable"
:is-resizable="true"
:is-mirrored="false"
:vertical-compact="true"
:use-css-transforms="true"
:style="transformStyle(pageData.commonStyle)"
@click.native.stop="toggle(false)"
>
<grid-item @click.native.stop="handleElementClick(index, null)" v-for="(item, index) in pageData.elements"
:x="item.point.x"
:y="item.point.y"
:w="item.point.w"
:h="item.point.h"
:i="item.point.i"
:key="item.point.i"
@contextmenu.native.prevent="show($event, index)"
@resized="resizedEvent"
@moved="movedEvent"
:class="{'Dcmcp-item_selected': curEleIndex === index && curChildIndex === null}">
<component ref="container" :style="transformStyle(item.commonStyle, item.name)" :id="item.id" class="Dcmcp-item-com" @handleElementClick="handleElementClick" :containerIndex="index" :childItem="item" :is="item.name" :key="index" v-bind="item.props"></component>
</grid-item>
</grid-layout>
</div>
<OperationPanel :isDragIn.sync="isDragIn" :isDraging="isDraging" @dragover="dragover" @drops="drops" @handleElementClick="handleElementClick" @show="show" @resizedEvent="resizedEvent" @movedEvent="movedEvent" @toggle="toggle" />
</Col>
<Col span="8" :class="[{'Dcm-sider_none': isCollapsed}, 'Dc-middle-sider']">
<Tabs class="Dc-middle-editing">
<TabPane label="组件设置">
<dynamic-form @modProps="modProps" @resizedChildEvent="resizedChildEvent"></dynamic-form>
</TabPane>
<!-- <TabPane label="事件">事件</TabPane> -->
<TabPane label="页面设置">
<dynamic-page-form @modProps="modProps" @resizedChildEvent="resizedChildEvent"></dynamic-page-form>
</TabPane>
</Tabs>
<DynamicFormTabs @modProps="modProps" @resizedChildEvent="resizedChildEvent" />
</Col>
</Row>
</Col>
</Row>
<BasicPageForm ref="basicPageForm" v-model="showSubmitPopup" @submit="save" />
<BasicPageFormModal ref="basicPageForm" v-model="showSubmitPopup" @submit="save" />
<RecordModal ref="recordModal" v-model="showRecordModal" @ok="recover" @cancel="cancel" />
</Row>
</template>
<style lang="less" scoped>
.tabs-position() {
/deep/ .ivu-tabs-nav-scroll {
display: flex;
justify-content: center;
}
}
.border() {
&:before {
position: absolute;
content: '';
border: 3px solid #2d8cf0 !important;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 1
}
}
.dashboard {
min-width: 1280px;
height: 100% !important;
......@@ -132,40 +52,6 @@
}
&-container {
height: calc(100% - 48px);
&-left {
display: flex !important;
height: 100%;
.Dc-left-menu {
height: 100%;
width: 77px !important;
.ivu-menu-item {
padding-left: 0;
padding-right: 0;
display: flex;
flex-direction: column;
align-items: center;
i {
font-size: 18px !important;
}
span {
font-size: 14px;
line-height: 22px;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
-khtml-user-select: none;
user-select: none;
}
}
}
.Dc-left-content {
flex: 1;
padding: 8px;
background: #fff;
overflow-y: scroll;
}
.tabs-position();
}
&-middle {
height: 100%;
background: #f0f2f5;
......@@ -181,51 +67,6 @@
.ivu-col {
font-size: 20px;
text-align: center;
}
}
.Dcm-container-panel {
margin: 30px auto;
width: 375px;
height: 667px;
min-height: 667px;
overflow-y: scroll;
background-color: rgb(244, 244, 244);
box-shadow: 2px 0px 10px rgba(0, 0, 0, 0.2);
/deep/ .vue-grid-layout {
min-height: 667px;
.vue-grid-item {
position: relative;
text-align: center;
overflow: hidden;
&:after {
position: absolute;
top: 0;
left: 0;
content: '';
width: 100%;
height: 100%;
z-index: 1;
}
&:hover {
.border();
}
.vue-resizable-handle {
z-index: 10000;
}
}
.Dcmcp-item_selected {
.border();
}
}
&_draging {
.Dcmcp-item-com {
* {
pointer-events: none;
}
}
opacity: 0.7;
}
}
}
......@@ -235,24 +76,6 @@
background: #fff;
transition: width ease-in-out 0.5s;
overflow: hidden;
.Dc-middle-editing {
height: 100%;
min-width: 320px;
.tabs-position();
background: #F5F6FA;
/deep/ .ivu-tabs-bar {
background: #fff;
margin-bottom: 0;
}
/deep/ .ivu-tabs-content {
height: calc(100% - 48px);
.ivu-tabs-tabpane {
height: 100%;
overflow-y: scroll;
overflow-x: hidden;
}
}
}
}
.Dcm-sider_none {
position: absolute;
......
<template>
<div>
<QGTable
ref="qgTable"
:columns="columns"
......@@ -7,7 +6,6 @@
@newBtnClick="addPage"
>
</QGTable>
</div>
</template>
<script>
import editorApi from '@api/editor.api';
......
<template>
<div>
<QGTable
ref="qgTable"
:columns="columns"
......@@ -7,7 +6,6 @@
@newBtnClick="addPage"
>
</QGTable>
</div>
</template>
<script>
import editorApi from '@api/editor.api';
......@@ -77,7 +75,7 @@ export default {
title: '链接',
hideSearch: true,
render: (h, params) => {
return h('span', `${config.apiHost}activity/${params.row.uuid}`)
return h('span', `${config.h5Host}activity/${params.row.uuid}`)
}
},
{
......
<template>
<div>
<QGTable
:columns="columns"
:request="query"
@newBtnClick="addPage"
>
</QGTable>
</div>
</template>
<script>
import editorApi from '@api/editor.api';
......@@ -77,7 +75,7 @@ export default {
title: '链接',
hideSearch: true,
render: (h, params) => {
return h('span', `${config.apiHost}activity/${params.row.uuid}`)
return h('span', `${config.h5Host}activity/${params.row.uuid}`)
}
},
{
......
......@@ -52,7 +52,7 @@ export interface PageInfo {
isPublish?: number | boolean;
pageName?: string;
pageDescribe?: string;
pageKeyords?: string;
pageKeywords?: string;
uuid?: string;
}
......@@ -71,7 +71,7 @@ export const defaultState = {
id: 0,
pageName: '',
pageDescribe: '',
pageKeyords: '',
pageKeywords: '',
coverImage: 'http://activitystatic.q-gp.com/low_code.jpg',
isPublish: false,
isTemplate: false,
......@@ -82,7 +82,7 @@ export const defaultState = {
backgroundImage: ''
},
props: {
showBackTop: false
showBackTop: true,
},
elements: [],
}
......
......@@ -1469,9 +1469,9 @@
"integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA=="
},
"@qg/cherry-ui": {
"version": "2.20.1",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcherry-ui/-/cherry-ui-2.20.1.tgz",
"integrity": "sha512-Jk8Mke8sEyxC89ZYmC3kwlc7Qta8HkB/et3OTQahNWd4KDSRgWMjUu99I1OalgVDzL1R9iPqPk6LK8Ak5Kz5gQ==",
"version": "2.20.3",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcherry-ui/-/cherry-ui-2.20.3.tgz",
"integrity": "sha512-QFZdYc4F3v3Y+c4kz+dHjk5ooo+g12LeJi5HpWmPDCKoWRrgqW0soimLDoMx3cJkUsw2i1SzEjZ7URISJC1EMg==",
"requires": {
"@popperjs/core": "^2.5.4",
"vue-lazyload": "^1.3.3",
......@@ -1479,12 +1479,12 @@
}
},
"@qg/citrus-ui": {
"version": "0.0.29",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcitrus-ui/-/citrus-ui-0.0.29.tgz",
"integrity": "sha512-8Ca1e3/K+ts/kjG5+1EvNF3Cvkg/N6P1CtVTRN7SVRbM+5EYrIDaoC2qbt6K3ipSZ9EAb+t4qtKYdrT93NMASQ==",
"version": "0.0.34",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcitrus-ui/-/citrus-ui-0.0.34.tgz",
"integrity": "sha512-yj9jkif1cbWgs4fFZCUNrpqoRfQ2xiRQhW3C95MUKcVmOAxclTVYSalSuSjA9mCwubP3o6vTU6Y8av9X9mNSvg==",
"requires": {
"@better-scroll/core": "^2.1.1",
"@qg/cherry-ui": "^2.18.72",
"@qg/cherry-ui": "^2.20.3",
"@qg/js-bridge": "^1.1.9",
"axios": "^0.21.1",
"js-cookie": "^2.2.1",
......@@ -1494,11 +1494,11 @@
}
},
"@qg/js-bridge": {
"version": "1.1.10",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fjs-bridge/-/js-bridge-1.1.10.tgz",
"integrity": "sha512-g0Dd7pGuSvSLjsAoAZBnxmNsO6+pbh3pASC4F05CfN1qCJ13n1OpbOx2LPDRXuZkWAIe3ZaLwHOHiODEdv9exA==",
"version": "1.1.11",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fjs-bridge/-/js-bridge-1.1.11.tgz",
"integrity": "sha512-WVvkSUg2zcc2nblzYGxM/bVo+VDcANy/dw7vcbxLoW1Jega9Jm2d5FGSb7uS6m4746waghUUqcAWNJZ0Q5yeqA==",
"requires": {
"rollup": "^2.40.0"
"rollup": "^2.41.3"
}
},
"@riophae/vue-treeselect": {
......@@ -19826,9 +19826,9 @@
"integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w="
},
"rollup": {
"version": "2.41.2",
"resolved": "http://npmprivate.quantgroups.com/rollup/-/rollup-2.41.2.tgz",
"integrity": "sha512-6u8fJJXJx6fmvKrAC9DHYZgONvSkz8S9b/VFBjoQ6dkKdHyPpPbpqiNl2Bao9XBzDHpq672X6sGZ9G1ZBqAHMg==",
"version": "2.41.5",
"resolved": "http://npmprivate.quantgroups.com/rollup/-/rollup-2.41.5.tgz",
"integrity": "sha512-uG+WNNxhOYyeuO7oRt98GA2CNVRgQ67zca75UQVMPzMrLG9FUKzTCgvYVWhtB18TNbV7Uqxo97h+wErAnpFNJw==",
"requires": {
"fsevents": "~2.3.1"
}
......
......@@ -167,7 +167,7 @@ module.exports = {
externals: {
'vue': 'Vue',
'vue-router': 'VueRouter',
'iview': 'iview',
// 'iview': 'iview',
'vuex': 'Vuex',
'axios': 'axios',
'sa-sdk-javascript': 'sensorsDataAnalytic201505',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment