成就页

This commit is contained in:
yulixing 2019-06-25 20:35:03 +08:00
parent 4bbf90f8d7
commit 8de0f0e1f1
6 changed files with 723 additions and 191 deletions

9
src/api/mp_share.js Normal file
View File

@ -0,0 +1,9 @@
import request from '@/utils/request'
export function getPic(data) {
return request({
url: '/games/mp_share/get_pic',
method: 'post',
data
})
}

View File

@ -68,6 +68,12 @@ const gamesRouter = {
name: 'GameDetailsShare',
meta: { title: '分享图' }
},
{
path: 'achievement',
component: () => import('@/views/games/details/achievement/index'),
name: 'GameDetailsAchievement',
meta: { title: '成就' }
},
{
path: 'share/edit',
component: () => import('@/views/games/details/share/edit'),

View File

@ -1,6 +1,6 @@
@font-face {
font-family: 'muyao';
src: url('~@/assets/fonts/muyao.ttf') format('truetype');
src: url('http://ptfwuko7v.bkt.clouddn.com/muyao.ttf') format('truetype');
}
@font-face {

View File

@ -0,0 +1,305 @@
<template>
<div class="main-content">
<el-select
v-model="platform_id"
style="width: 70%"
@change="changePlatform"
>
<el-option
v-for="item in platformsArr"
:key="item.platform.platform_id"
:label="item.platform.name"
:value="item.platform.platform_id"
/>
</el-select>
<el-collapse
v-model="activeNames"
@change="handleChange"
style="width: 60%"
>
<el-collapse-item
:title="ahievementForm.title || '未命名'"
name="1"
>
<el-form
ref="ahievementForm"
:model="ahievementForm"
:rules="ahievementFormRules"
style="width: 100%"
label-width="100px"
class="mgt-20 mgb-20"
>
<el-form-item
label="标题"
prop="title"
>
<el-input
v-model="ahievementForm.title"
style="width: 70%"
/>
</el-form-item>
<el-form-item
label="id"
prop="id"
>
<el-input
v-model="ahievementForm.id"
style="width: 70%"
/>
</el-form-item>
<el-form-item
label="提示文字"
prop="tip"
>
<el-input
v-model="ahievementForm.tip"
style="width: 70%"
/>
</el-form-item>
<el-form-item
label="奖励类型"
prop="reward_type"
>
<el-radio
v-model="ahievementForm.reward_type"
:label="1"
>称号</el-radio>
<el-radio
v-model="ahievementForm.reward_type"
:label="2"
>代币</el-radio>
<el-radio
v-model="ahievementForm.reward_type"
:label="0"
>其他</el-radio>
</el-form-item>
<el-form-item
label="奖励数量"
prop="reward_count"
>
<el-input
v-model="ahievementForm.reward_count"
style="width: 70%"
/>
</el-form-item>
<el-form-item
label="达成条件"
prop="need_type"
>
<el-select
v-model="ahievementForm.need_type"
placeholder="达成条件"
style="width: 70%"
>
<el-option
label="完成关卡"
value="shanghai"
/>
<el-option
label="完成题目"
value="beijing"
/>
<el-option
label="失败题目"
value="beijing"
/>
<el-option
label="邀请好友"
value="beijing"
/>
<el-option
label="观看视频"
value="beijing"
/>
<el-option
label="其他"
value="beijing"
/>
</el-select>
</el-form-item>
<el-form-item
label="达成数量"
prop="need_count"
>
<el-input
v-model.number="ahievementForm.need_count"
style="width: 70%"
/>
</el-form-item>
<el-form-item
label="默认获得"
prop="geted"
>
<el-radio
v-model="ahievementForm.geted"
:label="1"
></el-radio>
<el-radio
v-model="ahievementForm.geted"
:label="0"
></el-radio>
</el-form-item>
<el-form-item>
<el-button
type="primary"
size="small"
>保存</el-button>
<el-button
type="danger"
size="small"
>删除</el-button>
</el-form-item>
</el-form>
</el-collapse-item>
</el-collapse>
<div class="tip mgt-20 mgb-20">
暂无成就请添加成就配置
</div>
<el-button
style="width: 60%"
class="mgt-20"
>新增成就</el-button>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { getGame } from '@/api/games'
import getPageTitle from '@/utils/get-page-title'
import {
resetSettings,
getGameSettings,
saveGameSettings,
getSettingItems,
publishGameSettings,
saveSettingItem
} from '@/api/settings'
export default {
name: 'GameDetailsShare',
data() {
return {
// common
uid: '',
platform_id: '',
platformsArr: [],
gameInfo: {},
permEdit: false,
permPublish: false,
// form
ahievementForm: {},
ahievementFormRules: {
title: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
id: [{ required: true, message: '请选择活动区域', trigger: 'change' }],
reward_type: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
reward_count: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
need_type: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
need_count: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
geted: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
]
},
activeNames: '1',
defaultSetting: {
title: '',
id: '',
tip: '',
reward_type: 1,
reward_count: 1,
need_type: 1,
need_count: 1,
geted: 0
},
allAC: []
}
},
computed: {
...mapGetters(['userInfo'])
},
mounted() {
this.uid = this.$route.params.uid
this.permEdit =
this.userInfo.permissions.includes(`${this.uid}-edit`) ||
this.userInfo.permissions.includes(`${this.uid}-publish`) ||
this.userInfo.permissions.includes(`games-writeable`)
this.permPublish =
this.userInfo.permissions.includes(`${this.uid}-publish`) ||
this.userInfo.permissions.includes(`games-writeable`)
this.getGameInfo(this.getGameSettings)
},
methods: {
handleChange() {},
getGameInfo(cb) {
getGame({ uid: this.uid })
.then(res => {
const { data } = res
if (data.errcode === 0) {
this.gameInfo = data.gameInfo
this.platformsArr = data.gameInfo.platforms
this.$route.meta.title = this.gameInfo.game_name
document.title = getPageTitle(this.gameInfo.game_name)
if (this.$route.query.platform_id) {
this.platform_id = this.$route.query.platform_id
} else {
this.platform_id = this.platformsArr[0]
? this.platformsArr[0].platform.platform_id
: ''
}
if (cb && cb instanceof Function) cb()
}
})
.catch(err => {
console.log(err)
})
},
getGameSettings() {
getGameSettings({
uid: this.uid,
type: this.type === 'normal' ? 0 : 1,
id: this.gameInfo.game_id,
pid: this.platform_id
}).then(res => {
const { data } = res
if (data.errcode !== 0) {
this.$notify.error({
title: '错误',
message: data.errmsg
})
return
}
this.settingsForm.settings = data.records
this.selectedSettings = data.records
this.settingKeys = data.records.map(item => {
return item.key
})
if (data.published === false) {
this.tip = '配置已保存,待发布'
} else if (data.published === true) {
this.tip = '配置已发布'
}
if (this.settingsForm.settings.length === 0) this.tip = ''
this.changeState(false)
})
},
changePlatform() {}
}
}
</script>

View File

@ -6,6 +6,7 @@
<el-menu-item :index="`/games/details/${uid}/info`">详情</el-menu-item>
<el-menu-item v-if="uid !== 'new'" :index="`/games/details/${uid}/settings`">配置</el-menu-item>
<el-menu-item v-if="uid !== 'new'" :index="`/games/details/${uid}/share`">分享</el-menu-item>
<el-menu-item v-if="uid !== 'new'" :index="`/games/details/${uid}/achievement`">成就</el-menu-item>
<!-- <el-menu-item :index="`/games/details/${uid}/recommendation`">推荐</el-menu-item>
<el-menu-item :index="`/games/details/${uid}/reward`">奖励</el-menu-item>
<el-submenu :index="`/games/details/${uid}/gm/servers`">

View File

@ -35,11 +35,15 @@
placeholder="例500px"
/>
</el-form-item>
<el-form-item label="画布背景" prop="base_style.background">
<el-input
<el-form-item
label="画布背景"
prop="base_style.background"
class="form-item-color-picker"
>
<el-color-picker
v-model="tplForm.base_style.background"
placeholder="例:#fff"
/>
show-alpha
></el-color-picker>
</el-form-item>
<el-form-item label="画布圆角" prop="base_style['border-radius']">
<el-input
@ -48,7 +52,13 @@
/>
</el-form-item>
<el-form-item label="绘制组" prop="views">
<el-table :data="tplForm.views" style="width: 100%" size="mini">
<el-table
:data="tplForm.views"
style="width: 100%"
size="mini"
@row-click="rowClick"
:row-class-name="tableRowClassName"
>
<el-table-column type="index" width="30" />
<el-table-column label="内容" show-overflow-tooltip>
<template slot-scope="scope">
@ -76,16 +86,16 @@
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<span @click="editView(scope.$index, scope.row)"
<span @click.stop="editView(scope.$index, scope.row)"
><svg-icon icon-class="edit"
/></span>
<span @click="delView(scope.$index, scope.row)"
<span @click.stop="delView(scope.$index, scope.row)"
><svg-icon icon-class="close"
/></span>
<span @click="upView(scope.$index)"
<span @click.stop="upView(scope.$index)"
><svg-icon icon-class="up"
/></span>
<span @click="downView(scope.$index)"
<span @click.stop="downView(scope.$index)"
><svg-icon icon-class="down"
/></span>
</template>
@ -94,17 +104,6 @@
<span class="ipt-tip">图片绘制顺序为表格中条目顺序决定</span>
<el-button size="mini" @click="addView">添加</el-button>
</el-form-item>
<!-- <el-form-item label="水印" prop="comment">
<el-switch v-model="tplForm.resource" />
</el-form-item>
<div>
<el-form-item label="二维码" prop="comment">
<el-input v-model="tplForm.comment" type="text" />
</el-form-item>
<el-form-item label="文本" prop="comment">
<el-input v-model="tplForm.comment" type="text" />
</el-form-item>
</div> -->
<el-form-item label="预览图" v-if="tplForm.prev_url">
<el-image
:src="tplForm.prev_url"
@ -115,8 +114,8 @@
<el-input v-model="tplForm.comment" type="textarea" />
</el-form-item>
<el-form-item>
<el-button type="primary">保存</el-button>
<el-button type="success" @click="getPrevImg">生成预览图</el-button>
<el-button type="primary">保存</el-button>
</el-form-item>
</el-form>
</el-col>
@ -136,8 +135,8 @@
></el-image>
</template>
<template v-else-if="item.type === 'text'">
<p class="view" :key="index" :style="item.style">
{{ item.text }}
<p class="view text" :style="item.style" :key="index">
<span>{{ item.text }}</span>
</p>
</template>
<template v-else>
@ -153,7 +152,7 @@
<el-dialog
title="编辑绘制项目"
:visible.sync="modalVisible"
width="35%"
width="700px"
top="5vh"
:before-close="closeModal"
>
@ -184,6 +183,39 @@
>
<el-switch v-model="modalForm.replaceable"></el-switch>
</el-form-item>
<el-form-item label="是否可清除" prop="erasable">
<el-switch v-model="modalForm.erasable"></el-switch>
<span class="ipt-tip">用于水印元素</span>
</el-form-item>
<el-form-item
label="图片"
class="uploader-box"
v-if="modalForm.type === 'image'"
>
<el-upload
class="uploader"
action="/api/common/upload"
:show-file-list="false"
:on-success="uploadSuccess"
:on-error="uploadErr"
:headers="{
authorization: 'Bearer ' + token
}"
name="image-file"
:data="{
sub_path: '/mp-share/',
file_type: 'mp_share'
}"
>
<img
v-if="modalForm.type === 'image' ? modalForm.form[0].value : ''"
:src="modalForm.type === 'image' ? modalForm.form[0].value : ''"
class="uploader-img"
/>
<i v-else class="el-icon-plus uploader-icon" />
</el-upload>
</el-form-item>
<template v-for="(item, index) in modalForm.form">
<template v-if="item.iptType === 'select'">
<el-form-item
@ -191,6 +223,7 @@
:prop="`form[${index}].value`"
:key="index"
:rules="item.rules"
v-if="item.show"
>
<el-select v-model="item.value" style="width: 100%">
<el-option
@ -203,12 +236,63 @@
</el-form-item>
</template>
<template v-else-if="item.iptType === 'textarea'">
<el-form-item
:label="item.label"
:prop="`form[${index}].value`"
:key="index"
:rules="item.rules"
v-if="item.show"
>
<el-input
type="textarea"
v-model="item.value"
:placeholder="item.placeholder ? item.placeholder : ''"
/>
</el-form-item>
</template>
<template v-else-if="item.iptType === 'radio'">
<el-form-item
:label="item.label"
:prop="`form[${index}].value`"
:key="index"
:rules="item.rules"
v-if="item.show"
>
<el-radio
v-for="(al, idx) in item.data"
:key="idx"
v-model="item.value"
:label="al.value"
>{{ al.label }}</el-radio
>
</el-form-item>
</template>
<template v-else-if="item.iptType === 'color-picker'">
<el-form-item
:label="item.label"
:prop="`form[${index}].value`"
:key="index"
:rules="item.rules"
class="form-item-color-picker"
v-if="item.show"
>
<el-color-picker
v-model="item.value"
show-alpha
></el-color-picker>
</el-form-item>
</template>
<template v-else>
<el-form-item
:label="item.label"
:prop="`form[${index}].value`"
:key="index"
:rules="item.rules"
v-if="item.show"
>
<el-input
v-model="item.value"
@ -229,6 +313,8 @@
<script>
import vueJsonEditor from 'vue-json-editor'
import { getPic } from '@/api/mp_share'
import { getToken } from '@/utils/auth'
export default {
name: 'GameDetailsMpEdit',
@ -242,36 +328,85 @@ export default {
},
immediate: true,
deep: true
},
modalForm: {
handler: function(nVal, oVal) {
//
if (nVal.type === 'text') {
//
if (nVal.form[4].value === 'horizontal-tb') {
// x
nVal.form[1].show = true
// nVal.form[1].value = ''
//
nVal.form[5].show = true
// nVal.form[5].value = ''
//
nVal.form[9].show = true
// x
nVal.form[2].show = false
nVal.form[2].value = ''
//
nVal.form[6].show = false
nVal.form[6].value = ''
} else if (nVal.form[4].value === 'vertical-rl') {
//
// x
nVal.form[1].show = false
nVal.form[1].value = ''
//
nVal.form[5].show = false
nVal.form[5].value = ''
//
nVal.form[9].show = false
nVal.form[9].value = 'left'
// x
nVal.form[2].show = true
// nVal.form[2].value = ''
//
nVal.form[6].show = true
// nVal.form[6].value = ''
}
}
},
immediate: true,
deep: true
}
},
computed: {},
data() {
return {
//
token: '',
fonts: [
{
label: '沐瑶',
value: 'muyao',
name: 'muyao',
path: 'fonts/muyao.ttf'
path: 'fonts/muyao.ttf',
loc_path: '/fonts/muyao.ttf',
},
{
label: '手书体',
value: 'shoushuti',
name: 'shoushuti',
path: 'fonts/shoushuti.ttf'
path: 'fonts/shoushuti.ttf',
loc_path: '/fonts/shoushuti.ttf',
},
{
label: '思源',
value: 'siyuan',
name: 'siyuan',
path: 'fonts/siyuan.otf'
path: 'fonts/siyuan.otf',
loc_path: '/fonts/siyuan.otf',
},
{
label: '杨任东',
value: 'yangrendong',
name: 'yangrendong',
path: 'fonts/muyao.ttf'
path: 'fonts/yangrendong.ttf',
loc_path: '/fonts/yangrendong.ttf',
}
],
@ -279,12 +414,11 @@ export default {
tplForm: {
tpl_name: '',
tpl_id: '',
prev_url:
'https://client-1256832210.cos.ap-beijing.myqcloud.com/mp-share/5d09e26a62bb32868763dba3.jpeg',
prev_url: '',
base_style: {
width: '',
height: '',
background: '',
width: '400px',
height: '300px',
background: '#fff',
'border-radius': ''
},
views: [],
@ -306,7 +440,7 @@ export default {
{
type: 'array',
required: true,
len: 1,
min: 1,
message: '请至少添加一个绘制组'
}
]
@ -318,6 +452,7 @@ export default {
modalForm: {
type: '',
replaceable: false,
erasable: false,
form: []
},
modalFormRules: {
@ -344,105 +479,118 @@ export default {
value: '',
rules: [
{ required: true, message: '请输入图片 url', trigger: 'blur' }
]
],
show: true
},
{
label: '坐标x',
name: 'left',
value: '',
value: '0px',
placeholder: '例10px',
rules: [
{ required: true, message: '请输入图片坐标x', trigger: 'blur' }
]
],
show: true
},
{
label: '坐标y',
name: 'top',
value: '',
value: '0px',
placeholder: '例10px',
rules: [
{ required: true, message: '请输入图片坐标y', trigger: 'blur' }
]
],
show: true
},
{
label: '宽度',
name: 'width',
value: '',
value: '100px',
placeholder: '例100px',
rules: [
{ required: true, message: '请输入图片宽度', trigger: 'blur' }
]
],
show: true
},
{
label: '高度',
name: 'height',
value: '',
value: '100px',
placeholder: '例50px',
rules: [
{ required: true, message: '请输入图片高度', trigger: 'blur' }
]
],
show: true
},
{
label: '圆角',
name: 'border-radius',
value: '',
placeholder: '例10px',
rules: []
rules: [],
show: true
},
{
label: '边框',
name: 'border',
value: '',
placeholder: '例1px solid #333仅支持 solid 类型',
rules: []
rules: [],
show: true
},
{
label: '阴影',
name: 'box-shadow',
value: '',
placeholder: '例0px 0px 10px #333',
rules: []
rules: [],
show: true
},
{
label: '旋转角度',
name: 'rotate',
value: '',
placeholder: '例90',
rules: []
rules: [],
show: true
}
],
textForm: [
{
iptType: 'textarea',
label: '文本',
name: 'text',
value: '',
rules: [{ required: true, message: '请输入文本', trigger: 'blur' }]
rules: [{ required: true, message: '请输入文本', trigger: 'blur' }],
show: true
},
{
label: '坐标x',
label: '起始x',
name: 'left',
value: '',
placeholder: '例10px,文字横排时使用',
placeholder: '例10px,文本块起始横坐标',
rules: [
{
required: true,
message: '请输入文坐标x',
message: '请输入文本块起始坐标x',
trigger: 'blur'
}
]
],
show: true
},
{
label: '坐标x',
label: '结束x',
name: 'right',
value: '',
placeholder: '例10px, 文字竖排时使用',
placeholder: '例10px,文本块结束横坐标',
rules: [
{
required: true,
message: '请输入文坐标x',
message: '请输入文本块结束坐标x',
trigger: 'blur'
}
]
],
show: true
},
{
label: '坐标y',
@ -451,46 +599,69 @@ export default {
placeholder: '例10px',
rules: [
{ required: true, message: '请输入文字坐标y', trigger: 'blur' }
]
],
show: true
},
{
label: '最大宽度',
name: 'max-width',
iptType: 'radio',
data: [
{ label: '横排', value: 'horizontal-tb' },
{ label: '竖排', value: 'vertical-rl' }
],
label: '书写顺序',
name: 'writing-mode',
value: 'horizontal-tb',
rules: [],
show: true
},
{
label: '文本块宽度',
name: 'width',
value: '',
placeholder: '文字横排时使用,竖排默认 0',
placeholder: '100px',
rules: [
{ required: true, message: '请输入文本最大宽度', trigger: 'blur' }
]
],
show: true
},
{
label: '最大高度',
name: 'max-height',
label: '文本块高度',
name: 'height',
value: '',
placeholder: '文字竖排时使用,横排默认 0',
placeholder: '100px',
rules: [
{ required: true, message: '请输入文本最大高度', trigger: 'blur' }
]
{ required: true, message: '请输入文本高度', trigger: 'blur' }
],
show: true
},
{
label: '字体大小',
name: 'font-size',
value: '',
value: '16px',
placeholder: '例14px',
rules: [{ required: true, message: '请输入文本', trigger: 'blur' }]
rules: [{ required: true, message: '请输入文本', trigger: 'blur' }],
show: true
},
{
label: '字体行高',
name: 'font-size',
value: '',
name: 'line-height',
value: '32px',
placeholder: '例14px默认与字体大小相等',
rules: []
rules: [{ required: true, message: '请输入行高', trigger: 'blur' }],
show: true
},
{
iptType: 'radio',
data: [
{ label: '左对齐', value: 'left' },
{ label: '居中对齐', value: 'center' },
{ label: '右对齐', value: 'right' }
],
label: '对齐方式',
name: 'text-align',
value: '',
placeholder: '例center默认left可选left/center/right',
rules: []
value: 'left',
rules: [],
show: true
},
{
iptType: 'select',
@ -498,49 +669,54 @@ export default {
label: '字体类型',
name: 'font-family',
value: '',
rules: []
rules: [],
show: true
},
{
iptType: 'color-picker',
label: '颜色',
name: 'color',
value: '',
placeholder: '例:#fff默认为#000',
rules: []
},
{
label: '书写顺序',
name: 'writing-mode',
placeholder: '默认横排横排horizontal-tb竖排vertical-rl',
value: '',
rules: []
value: '#333',
placeholder: '例:#fff默认为#333',
rules: [],
show: true
},
{
iptType: 'radio',
data: [
{ label: '正常', value: '500' },
{ label: '加粗', value: '700' }
],
label: '字体粗细',
name: 'font-weight',
placeholder: '默认500加粗700',
value: '',
rules: []
value: '500',
rules: [],
show: true
},
{
label: '阴影',
name: 'text-shadow',
placeholder: '例2px 2px 2px #ccc',
value: '',
rules: []
rules: [],
show: true
},
{
label: '描边',
name: '-webkit-text-stroke',
value: '',
placeholder: '例1px #fff',
rules: []
rules: [],
show: true
},
{
label: '旋转角度',
name: 'rotate',
value: '',
placeholder: '例90',
rules: []
rules: [],
show: true
}
],
rectForm: [
@ -551,7 +727,8 @@ export default {
placeholder: '例10px',
rules: [
{ required: true, message: '请输入矩形坐标x', trigger: 'blur' }
]
],
show: true
},
{
label: '坐标y',
@ -560,97 +737,67 @@ export default {
placeholder: '例10px',
rules: [
{ required: true, message: '请输入矩形坐标y', trigger: 'blur' }
]
],
show: true
},
{
label: '宽度',
name: 'width',
placeholder: '例100px',
value: '',
rules: [{ required: true, message: '请输矩形宽度', trigger: 'blur' }]
rules: [{ required: true, message: '请输矩形宽度', trigger: 'blur' }],
show: true
},
{
label: '高度',
name: 'height',
value: '',
placeholder: '例100px',
rules: [{ required: true, message: '请输矩形高度', trigger: 'blur' }]
rules: [{ required: true, message: '请输矩形高度', trigger: 'blur' }],
show: true
},
{
iptType: 'color-picker',
label: '颜色',
name: 'background',
value: '',
value: '#fff',
placeholder: '例:#fff',
rules: []
rules: [],
show: true
},
{
label: '边框',
name: 'border',
value: '',
placeholder: '例1px solid #333仅支持 solid 类型',
rules: []
rules: [],
show: true
},
{
label: '圆角',
name: 'border-radius',
value: '',
placeholder: '例10px',
rules: []
rules: [],
show: true
},
{
label: '阴影',
name: 'box-shadow',
value: '',
placeholder: '例0px 0px 10px #333',
rules: []
rules: [],
show: true
},
{
label: '旋转角度',
name: 'rotate',
value: '',
placeholder: '例90',
rules: []
rules: [],
show: true
}
],
tplInfo: {
baseInfo: {
style: {
width: '250px',
height: '750px'
},
fonts: [
{
name: 'yangrendong',
path: 'fonts/yangrendong.ttf'
}
]
},
imgs: [
{
url:
'https://hbimg.huabanimg.com/8256f8640cceb4b4c6fc51a2f07503d69b53e1b236416-ZzsSSs_fw658',
replaceable: true,
style: {
width: '250px',
height: '250px',
top: '0',
left: '0'
}
}
],
texts: [
{
text:
'Lorem, ipsum dolor sit amet consectetur adipisicing elit. Itaquecumque, quis atque dignissimos consequuntur reiciendis iste. Consequatur sed dolores illo illum cumque labore esse fugiatsunt, autem quas, porro ut!',
style: {
color: '#333',
'writing-mode': 'vertical-rl',
'max-height': '200px',
'line-height': '36px'
}
}
]
},
//
previewInfo: {}
}
@ -661,6 +808,8 @@ export default {
this.textForm[i].data = this.fonts
}
}
// token
this.token = getToken()
},
methods: {
save() {},
@ -670,6 +819,7 @@ export default {
this.modalForm = {
type: '',
replaceable: false,
erasable: false,
form: []
}
this.isNewView = true
@ -716,6 +866,13 @@ export default {
this.tplForm.views.splice(index, 1)
this.tplForm.views.splice(index + 1, 0, temp)
},
tableRowClassName({ row, rowIndex }) {
row.index = rowIndex
},
rowClick(row, column, event) {
this.editView(row.index, row)
},
// modal
changeViewType(val) {
this.modalForm.type = val
@ -756,12 +913,21 @@ export default {
}
})
},
uploadSuccess(res, file) {
if (this.modalForm.type === 'image')
this.modalForm.form[0].value = res.url
this.$message.success('图片上传成功!')
},
uploadErr() {
this.$message.error('图片上传失败!')
},
formPrev(tpl) {
this.previewInfo.base_style = tpl.base_style
this.previewInfo.views = tpl.views.map(view => {
const result = {}
result.type = view.type
result.replaceable = view.replaceable
result.erasable = view.erasable
result.style = {}
view.form.map(ipt => {
if (ipt.name === 'url') {
@ -780,58 +946,81 @@ export default {
})
},
getPrevImg() {
// painter
const opt = {}
const fonts = []
//
opt.baseInfo = {}
opt.baseInfo.width = this.previewInfo.base_style.width
opt.baseInfo.height = this.previewInfo.base_style.height
opt.baseInfo['back-ground'] = this.previewInfo.base_style['back-ground']
opt.baseInfo['border-radius'] = this.previewInfo.base_style[
'border-radius'
]
//
opt.views = []
this.previewInfo.views.map(view => {
const obj = JSON.parse(JSON.stringify(view))
const style = obj.style
if (obj.type === 'text') {
if (
style['writing-mode'] === 'horizontal-tb' ||
!style['writing-mode']
) {
if (style['text-align'] === 'center') {
const maxWidth = parseInt(style['max-width'])
const left = parseInt(style.left)
style.left = left + maxWidth / 2
} else if (style['text-align'] === 'right') {
const maxWidth = parseInt(style['max-width'])
const left = parseInt(style.left)
style.left = left + maxWidth
}
} else if (style['writing-mode'] === 'vertical-rl') {
const right = parseInt(style.right)
const lineHeight =
parseInt(style['line-height']) || parseInt(style['font-size'])
style.left = parseInt(opt.baseInfo.width) - right - lineHeight
console.log(right, lineHeight, style.left)
}
this.$refs['tplForm'].validate(valid => {
if (valid) {
// painter
const opt = {}
const fonts = []
//
opt.baseInfo = {}
console.log(this.previewInfo.base_style)
opt.baseInfo.width = this.previewInfo.base_style.width
opt.baseInfo.height = this.previewInfo.base_style.height
opt.baseInfo['background'] = this.previewInfo.base_style['background']
opt.baseInfo['border-radius'] = this.previewInfo.base_style[
'border-radius'
]
//
opt.views = []
this.previewInfo.views.map(view => {
const obj = JSON.parse(JSON.stringify(view))
const style = obj.style
if (obj.type === 'text') {
if (
style['writing-mode'] === 'horizontal-tb' ||
!style['writing-mode']
) {
if (style['text-align'] === 'center') {
const width = parseInt(style.width)
const left = parseInt(style.left)
style.left = left + width / 2
} else if (style['text-align'] === 'right') {
const width = parseInt(style.width)
const left = parseInt(style.left)
style.left = left + width
}
} else if (style['writing-mode'] === 'vertical-rl') {
const right = parseInt(style.right)
const lineHeight =
parseInt(style['line-height']) || parseInt(style['font-size'])
style.left = parseInt(opt.baseInfo.width) - right - lineHeight
console.log(right, lineHeight, style.left)
}
if (style['font-family']) {
fonts.push(style['font-family'])
}
}
opt.views.push(obj)
})
// fonts
opt.fonts = []
this.fonts.map(font => {
if (fonts.indexOf(font.name) !== -1) {
opt.fonts.push(font)
if (style['font-family']) {
fonts.push(style['font-family'])
}
}
opt.views.push(obj)
})
// fonts
opt.baseInfo
opt.baseInfo.fonts = []
this.fonts.map(font => {
if (fonts.indexOf(font.name) !== -1) {
opt.baseInfo.fonts.push(font)
}
})
console.log('模板🤩', this.tplForm)
console.log('预览😘', this.previewInfo)
console.log('生成😡', opt)
//
getPic({ opt })
.then(res => {
const data = res.data
console.log(res)
if (data.errcode === 0) {
this.tplForm.prev_url = data.url
}
})
.catch(err => {
console.log(err)
})
} else {
this.$message.error('请按要求填写表单')
}
})
console.log('😡', opt)
}
}
}
@ -842,17 +1031,27 @@ export default {
.preview {
width: 100%;
min-height: 1334px;
padding: 20px 0;
min-height: 500px;
border: 1px solid #f0f0f0;
.main-box {
position: relative;
margin: 20px auto;
margin: 0 auto;
border: 1px solid #f0f0f0;
overflow: hidden;
.view {
position: absolute;
}
.view.text {
margin: 0;
white-space: pre-wrap;
span {
display: inline-block;
}
}
}
}
</style>
@ -863,6 +1062,18 @@ export default {
.p-mp-edit >>> .jsoneditor-vue {
height: 500px;
}
.p-mp-edit .form-item-color-picker >>> .el-form-item__content {
line-height: 0;
}
.p-mp-edit .form-item-color-picker >>> .el-color-picker {
width: 100%;
}
.p-mp-edit .form-item-color-picker >>> .el-color-picker__trigger {
width: 100%;
}
</style>