Commit 81bf55b8 authored by 郭志伟's avatar 郭志伟

Merge branch 'feat/share' into 'master'

Feat/share

See merge request !36
parents 77b75f28 4e0237a2
......@@ -7,18 +7,15 @@ export const basicComponents = [
coverImage: 'https://img.lkbang.net/citrus-ui/cherry-component-cover-free-container.png',
title: '自由容器',
config: [
// {
// key: 'backgroundImage',
// name: '背景图片',
// type: 'Upload'
// },
// {
// key: 'backgroundColor',
// name: '背景颜色',
// type: 'ColorSelector'
// },
{
key: 'link',
name: '跳转链接',
desc: '跳转链接',
type: 'text'
}
],
value: {
link: ''
// backgroundImage: 'http://activitystatic.q-gp.com/landing-bg.png';
// backgroundColor: '#fff'
},
......
......@@ -10,7 +10,8 @@ import { getStyle } from '@service/utils.service';
@Component({ components: { Upload }, name: 'BasicPageForm' })
export default class DynamicForm extends Vue {
@Getter('pageInfo') pageData;
@Getter('pageInfo') pageInfo;
@Getter('pageData') pageData;
@Prop(Boolean) value;
showPopup: boolean = false;
......@@ -20,13 +21,20 @@ export default class DynamicForm extends Vue {
ruleCustom: object = {
pageName: [
{ required: true, message: '请输入页面名称', trigger: 'blur' }
]
],
shareOpenMethod: [
{ validator: this.validateOpenMethod, trigger: 'blur' }
],
};
get enableShare() {
return this.pageData.props?.showShare;
}
@Watch('pageData', { immediate: true })
onPageDataChange(newVal) {
const { pageName, pageDescribe, pageKeywords, coverImage, isPublish, isTemplate } = this.pageData;
this.formCustom = { pageName, pageDescribe, pageKeywords, coverImage, isPublish: !!isPublish, isTemplate: !!isTemplate };
const { pageName, pageDescribe, pageKeywords, coverImage, isPublish, isTemplate, shareCoverImage, shareOpenMethod } = this.pageInfo;
this.formCustom = { pageName, pageDescribe, pageKeywords, coverImage, isPublish: !!isPublish, isTemplate: !!isTemplate, shareCoverImage, shareOpenMethod };
}
@Watch('value')
......@@ -38,7 +46,7 @@ export default class DynamicForm extends Vue {
}
handleSubmit(type) {
this.$refs.formCustom.validate(async (valid) => {
this.$refs.formCustom?.validate(async (valid) => {
if (valid) {
if (type === 'save') {
this.loadingSave = true;
......@@ -64,6 +72,13 @@ export default class DynamicForm extends Vue {
this.formCustom.pageName = this.formCustom.pageName || '未命名';
this.handleSubmit('autoSave');
}
validateOpenMethod(rule, value, callback) {
if (!value && this.enableShare) {
callback(new Error('请选择分享打开方式'));
} else {
callback();
}
}
changeStyle(type) {
const gridEle = document.querySelector('.vue-grid-layout');
......
......@@ -10,6 +10,17 @@
<FormItem label="页面关键字" prop="pageKeywords">
<Input v-model="formCustom.pageKeywords" type="textarea" placeholder="请输入页面关键字" :rows="3"></Input>
</FormItem>
<FormItem label="页面缩略图" prop="shareCoverImage">
<Upload v-model="formCustom.shareCoverImage" :show-input="false" />
<p class="basic-form__tip">可选,默认使用页面缩略图,建议图片比例1:1,图片格式jpg、png</p>
</FormItem>
<FormItem label="分享打开方式" prop="shareOpenMethod">
<RadioGroup v-model="formCustom.shareOpenMethod">
<Radio :label="1" :disabled="!enableShare">小程序</Radio>
<Radio :label="2" :disabled="!enableShare">APP</Radio>
</RadioGroup>
<p class="basic-form__tip">在H5中打开哪一个终端,当分享功能未启用时,此处不可选</p>
</FormItem>
<FormItem label="是否发布" prop="isPublish">
<i-switch v-model="formCustom.isPublish"></i-switch>
</FormItem>
......@@ -37,5 +48,9 @@
object-fit: contain;
}
}
&__tip {
color: #666;
line-height: 16px;
}
}
</style>
\ No newline at end of file
......@@ -8,6 +8,7 @@ export default class DynamicForm extends Vue {
@Getter('pageData') pageData;
@Prop([String, Number]) value;
@Prop(String) limitName;
selected: string = this.value;
list: object[] = [];
......@@ -31,7 +32,14 @@ export default class DynamicForm extends Vue {
updateOptions(val = this.curEleIndex) {
if (val || val === 0) {
const pointY = this.pageData?.elements[val]?.point?.y;
this.list = this.pageData?.elements?.filter(v => pointY < v?.point?.y)?.map((element, index) => ({ id: element.id, label: element.title + '-' + element.id}));
let list = [];
if (this.limitName) {
list = this.pageData?.elements?.filter(v => pointY < v?.point?.y && v?.name === this.limitName);
} else {
list = this.pageData?.elements?.filter(v => pointY < v?.point?.y);
}
this.list = list.map((element, index) => ({ id: element.id, label: element.title + '-' + element.id}));
console.log('curEleIndex', pointY, this.pageData?.elements?.filter(v => pointY < v?.point?.y), this.list);
}
}
......
......@@ -7,7 +7,7 @@
</div>
<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]" />
<component :is="getComponent(keywords.type)" v-bind="keywords.props" :limit-name="limitName" :options="keywords.options" v-model="item[keywords.key]" />
</FormItem>
</Form>
</Card>
......@@ -27,6 +27,7 @@
ColorSelector
},
props: {
limitName: String,
value: {
type: Array,
default: () => []
......
......@@ -16,7 +16,7 @@
</div>
</div>
</div>
<Input v-model="img" @input="handleImgUrlChange"></Input>
<Input v-if="showInput" v-model="img" @input="handleImgUrlChange"></Input>
</div>
</template>
<script>
......@@ -29,6 +29,10 @@
export default {
props: {
value: String,
showInput: {
type: Boolean,
default: true
}
},
data() {
return {
......
......@@ -10,11 +10,11 @@
<div v-if="item.title">
<h3>{{ item.title }}</h3>
<FormItem :label="child.name" :key="curElement.id + child.key" v-for="child in item.children">
<component :is="getComponent(child.type)" :options="child.options" :formControl="child.formControl" v-model="form[child.key]" />
<component :is="getComponent(child.type)" :options="child.options" :formControl="child.formControl" :limit-name="child.type === 'FormList' && curElement.name === 'cs-goods-tabs' ? 'cs-goods' : ''" v-model="form[child.key]" />
</FormItem>
</div>
<FormItem class="Df-component-formitem" v-else :label="item.name" >
<component :is="getComponent(item.type)" :options="item.options" :formControl="item.formControl" v-model="form[item.key]" />
<component :is="getComponent(item.type)" :options="item.options" :formControl="item.formControl" :limit-name="item.type === 'ComponentSelect' && curElement.name === 'cs-goods-tabs' ? 'cs-goods' : ''" v-model="form[item.key]" />
</FormItem>
</template>
</Form>
......
......@@ -60,6 +60,11 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
name: '返回顶部',
type: 'checkbox'
},
{
key: 'showShare',
name: '分享按钮',
type: 'checkbox'
},
{
key: 'btAttachVal',
name: '添加按钮',
......
......@@ -80,8 +80,8 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
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;
const { pageName, pageDescribe, pageKeywords, coverImage, isPublish, isTemplate, shareCoverImage, shareOpenMethod } = pageConfig;
const pageInfo = { page: JSON.stringify(pageData), author: user?.account, isPublish, pageName, pageDescribe, pageKeywords, coverImage, isTemplate, shareCoverImage, shareOpenMethod } 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 }); }
......
......@@ -48,6 +48,8 @@ export interface PageInfo {
enable?: number;
author?: string;
coverImage?: string;
shareCoverImage?: string; // 分享缩略图
shareOpenMethod?: string; // 分享后的打开方式
isTemplate?: number | boolean;
isPublish?: number | boolean;
pageName?: string;
......@@ -87,13 +89,20 @@ export const defaultState = {
pageBottomTxt: '没有更多啦~',
pageBottomColor: '#fff',
showBackTop: true,
showShare: true,
btAttachVal: [
{
persets: '购物车',
name: '购物车',
icon: 'shopping-cart-o',
icon: 'shopping-cart',
url: 'xyqb://shoppingCart?needLogin=1',
color: '#333',
background: '#fff'
iconColor: '#333',
background: '#fff',
shadow: true,
radius: true,
size: 46,
iconSize: 20
}
],
},
......
......@@ -1481,9 +1481,9 @@
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
},
"@popperjs/core": {
"version": "2.9.2",
"resolved": "http://npmprivate.quantgroups.com/@popperjs%2fcore/-/core-2.9.2.tgz",
"integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q=="
"version": "2.10.1",
"resolved": "http://npmprivate.quantgroups.com/@popperjs%2fcore/-/core-2.10.1.tgz",
"integrity": "sha1-co7NlasgequKmk5CHwQi2zKSMr4="
},
"@qg/apollo-nodejs": {
"version": "2.1.2",
......@@ -1491,9 +1491,9 @@
"integrity": "sha512-uOCUKu5mvX3PWee+7ZFXQSNIR1V5SN2JVE2yANmW9/wQOgpEct291gXGok8VMw0009HlTWB4JATURPwyOP2DFg=="
},
"@qg/cherry-ui": {
"version": "2.21.1",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcherry-ui/-/cherry-ui-2.21.1.tgz",
"integrity": "sha512-OQ9njfH6cs6FaNqPb7W+hEe/yftpdLXyjGXo2g4IwY7o/9Z5EH6Bn6B5X6dFGOka7LSyXyWRSfZzX0upIIpDFw==",
"version": "2.23.7",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcherry-ui/-/cherry-ui-2.23.7.tgz",
"integrity": "sha512-ZQ5valaspUkQfyUzoj7nzGqGW287NkK5WH7BB1q5LIb3kAaL/1YSF5J1j8Azn8aqtHq/xNqYMFIfb8YBsq00nw==",
"requires": {
"@popperjs/core": "^2.5.4",
"vue-lazyload": "^1.3.3",
......@@ -1501,13 +1501,13 @@
}
},
"@qg/citrus-ui": {
"version": "0.2.25",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcitrus-ui/-/citrus-ui-0.2.25.tgz",
"integrity": "sha512-61YOK7ybUD7cPn3WS91Pvin6r+yjCubNq21+D2E/mINb7yjzyhokkRkunU9aQ03U88KRpccXkR+MfhUP3pnvOA==",
"version": "0.2.29",
"resolved": "http://npmprivate.quantgroups.com/@qg%2fcitrus-ui/-/citrus-ui-0.2.29.tgz",
"integrity": "sha512-inMPAWHzFvNZSCqotDVlKnONmeYps98yGRck5V3cV/1dAiScBhWovyvxXGAnfCk0dfmjcm/5Tpw4pmjt04Xjnw==",
"requires": {
"@better-scroll/core": "^2.1.1",
"@qg/cherry-ui": "^2.21.1",
"@qg/js-bridge": "^1.1.12",
"@qg/cherry-ui": "^2.23.7",
"@qg/js-bridge": "^1.1.11",
"axios": "^0.21.1",
"intersection-observer": "^0.12.0",
"js-cookie": "^2.2.1",
......@@ -9003,9 +9003,9 @@
}
},
"es5-shim": {
"version": "4.5.15",
"resolved": "http://npmprivate.quantgroups.com/es5-shim/-/es5-shim-4.5.15.tgz",
"integrity": "sha512-FYpuxEjMeDvU4rulKqFdukQyZSTpzhg4ScQHrAosrlVpR6GFyaw14f74yn2+4BugniIS0Frpg7TvwZocU4ZMTw=="
"version": "4.6.2",
"resolved": "http://npmprivate.quantgroups.com/es5-shim/-/es5-shim-4.6.2.tgz",
"integrity": "sha1-gnzdDG+1vrJv02jWVDDoterrqUI="
},
"es6-iterator": {
"version": "2.0.3",
......@@ -18184,9 +18184,9 @@
}
},
"parse-headers": {
"version": "2.0.3",
"resolved": "http://npmprivate.quantgroups.com/parse-headers/-/parse-headers-2.0.3.tgz",
"integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA=="
"version": "2.0.4",
"resolved": "http://npmprivate.quantgroups.com/parse-headers/-/parse-headers-2.0.4.tgz",
"integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw=="
},
"parse-json": {
"version": "2.2.0",
......@@ -22480,9 +22480,9 @@
}
},
"url-toolkit": {
"version": "2.2.2",
"resolved": "http://npmprivate.quantgroups.com/url-toolkit/-/url-toolkit-2.2.2.tgz",
"integrity": "sha512-l25w6Sy+Iy3/IbogunxhWwljPaDnqpiKvrQRoLBm6DfISco7NyRIS7Zf6+Oxhy1T8kHxWdwLND7ZZba6NjXMug=="
"version": "2.2.3",
"resolved": "http://npmprivate.quantgroups.com/url-toolkit/-/url-toolkit-2.2.3.tgz",
"integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ=="
},
"urllib": {
"version": "2.37.1",
......
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