Commit 4801cd6b authored by 郝聪敏's avatar 郝聪敏

feature: 添加生成封面功能

parent c9d18904
...@@ -29,11 +29,12 @@ export default class EditorController extends Controller { ...@@ -29,11 +29,12 @@ export default class EditorController extends Controller {
} }
public async getList(ctx: Context) { public async getList(ctx: Context) {
const { type, pageSize, pageNo, author, pageName, isPublish } = ctx.query; const { type, pageSize, pageNo, author, pageName, isPublish, pageDescribe } = ctx.query;
const { like } = ctx.model.Sequelize.Op; const { like } = ctx.model.Sequelize.Op;
let where = omitBy({ let where = omitBy({
author: author && { like: `%${author}%`}, author: author && { like: `%${author}%`},
pageName: pageName && { like: `%${pageName}%`}, pageName: pageName && { like: `%${pageName}%`},
pageDescribe: pageDescribe && { like: `%${pageDescribe}%`},
isPublish, isPublish,
enable: 1 enable: 1
}, v => !trim(v)); }, v => !trim(v));
...@@ -45,7 +46,7 @@ export default class EditorController extends Controller { ...@@ -45,7 +46,7 @@ export default class EditorController extends Controller {
where = { ...where, isTemplate: 1 }; where = { ...where, isTemplate: 1 };
} }
const { count: total, rows: data } = await ctx.model.PageInfo.findAndCountAll({ where, limit: +pageSize || 10, const { count: total, rows: data } = await ctx.model.PageInfo.findAndCountAll({ where, limit: +pageSize || 10,
offset: (+pageNo - 1) * +pageSize || 0 }); offset: (+pageNo - 1) * +pageSize || 0, order: [['updated_at', 'DESC']] });
ctx.body = ctx.helper.ok({ total, data }); ctx.body = ctx.helper.ok({ total, data });
} }
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* @desc 页面信息表 * @desc 页面信息表
*/ */
import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull } from 'sequelize-typescript'; import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull } from 'sequelize-typescript';
@Table({ @Table({
modelName: 'page_info', modelName: 'page_info',
freezeTableName: true freezeTableName: true
...@@ -62,6 +63,18 @@ export class PageInfo extends Model<PageInfo> { ...@@ -62,6 +63,18 @@ export class PageInfo extends Model<PageInfo> {
field: 'is_publish' field: 'is_publish'
}) })
isPublish: number; isPublish: number;
@Column({
type: DataType.DATE,
field: 'updated_at',
get() {
const moment = require('moment');
const updatedAt = this.getDataValue('updatedAt');
console.log('updatedAt', moment(updatedAt).format('YYYY-MM-DD HH:mm:ss'));
return moment(updatedAt).format('YYYY-MM-DD HH:mm:ss');
},
})
updatedAt: string;
} }
export default () => PageInfo; export default () => PageInfo;
\ No newline at end of file
import http from '../service/http.service'; import http from '../service/http.service';
import config from '../config'; import config from '../config';
import axios from 'axios';
export default { export default {
getPageList(params) { getPageList(params) {
...@@ -20,4 +21,15 @@ export default { ...@@ -20,4 +21,15 @@ export default {
getTemplateList() { getTemplateList() {
return http.get('editor/get/template'); return http.get('editor/get/template');
}, },
getUpToken() {
return axios.get(`${config.opapiHost}/upload/getToken`);
},
uploadBase64(base64Str, name, token) {
return axios.post(`http://up-z0.qiniup.com/putb64/-1/key/${name}`, base64Str, {
headers: {
'content-type': 'application/octet-stream',
'Authorization': token,
}
});
}
}; };
\ No newline at end of file
const protocol = window.location.protocol; const protocol = EASY_ENV_IS_BROWSER ? window.location.protocol : 'http';
export default { export default {
apiHost: `http://localhost:7001/`, apiHost: `http://localhost:7001/`,
......
const protocol = window.location.protocol; const protocol = EASY_ENV_IS_BROWSER ? window.location.protocol : 'https';
export default { export default {
apiHost: `https://quantum-fe.liangkebang.net/`, apiHost: `https://quantum-fe.liangkebang.net/`,
......
...@@ -11,7 +11,7 @@ export const basicComponents = [ ...@@ -11,7 +11,7 @@ export const basicComponents = [
}, },
], ],
value: { value: {
backgroundImage: 'https://static.q-gp.com/new-xyqb-user-ui/public/static/img/landing-bg.6aa8a19.png'; backgroundImage: 'http://activitystatic.q-gp.com/landing-bg.png';
}, },
commonStyle: {} commonStyle: {}
}, },
...@@ -81,8 +81,8 @@ export const basicComponents = [ ...@@ -81,8 +81,8 @@ export const basicComponents = [
}, },
], ],
value: { value: {
width: '190px', width: '5.067rem',
height: '140px', height: '3.733rem',
src: 'https://appsync.lkbang.net/Fs0qmUsMry39AjHDf_W-qgn8XEy6', src: 'https://appsync.lkbang.net/Fs0qmUsMry39AjHDf_W-qgn8XEy6',
fit: 'contain', fit: 'contain',
}, },
...@@ -125,7 +125,7 @@ export const businessComponents = [ ...@@ -125,7 +125,7 @@ export const businessComponents = [
value: { value: {
btnTxt: '', btnTxt: '',
btnColor: '#ee0a24', btnColor: '#ee0a24',
btnImage: 'https://static.q-gp.com/new-xyqb-user-ui/public/static/img/landing-submit.d875947.png', btnImage: 'http://activitystatic.q-gp.com/landing-submit.png',
registerFrom: '', registerFrom: '',
vcBgColor: '#97d5ff' vcBgColor: '#97d5ff'
}, },
......
...@@ -18,9 +18,9 @@ export default class FreedomContainer extends Vue { ...@@ -18,9 +18,9 @@ export default class FreedomContainer extends Vue {
const style = {}; const style = {};
for (const key of Object.keys(styleObj)) { for (const key of Object.keys(styleObj)) {
if ( typeof styleObj[key] === 'number') { if ( typeof styleObj[key] === 'number') {
style[key] = `${(styleObj[key] / 37.5).toFixed(2)}rem`; style[key] = `${(styleObj[key] / 37.5).toFixed(3)}rem`;
} else { } else {
style[key] = styleObj[key].includes('px') ? `${(+(styleObj[key].slice(0, -2)) / 37.5).toFixed(2)}rem` : styleObj[key]; style[key] = styleObj[key].includes('px') ? `${(+(styleObj[key].slice(0, -2)) / 37.5).toFixed(3)}rem` : styleObj[key];
} }
if (key === 'backgroundImage') { if (key === 'backgroundImage') {
style.backgroundImage = `url(${style.backgroundImage})`; style.backgroundImage = `url(${style.backgroundImage})`;
......
...@@ -53,6 +53,9 @@ ...@@ -53,6 +53,9 @@
justify-content: center; justify-content: center;
align-items: center; align-items: center;
background: #fff; background: #fff;
&>*:first-child {
height: 100%;
}
} }
} }
} }
......
...@@ -2,10 +2,15 @@ import {Component, Vue, Prop, Watch} from 'vue-property-decorator'; ...@@ -2,10 +2,15 @@ import {Component, Vue, Prop, Watch} from 'vue-property-decorator';
import { Getter, State } from 'vuex-class'; import { Getter, State } from 'vuex-class';
import { reduce, ceil, subtract, divide } from 'lodash'; import { reduce, ceil, subtract, divide } from 'lodash';
import Upload from '@editor/component/DynamicForm/component/Upload/index.vue'; import Upload from '@editor/component/DynamicForm/component/Upload/index.vue';
import html2canvas from 'html2canvas';
import editorApi from '@api/editor.api';
import uuidv4 from 'uuid/v4';
import config from '@/config';
@Component({ components: { Upload }, name: 'BasicPageForm' }) @Component({ components: { Upload }, name: 'BasicPageForm' })
export default class DynamicForm extends Vue { export default class DynamicForm extends Vue {
@Getter('pageInfo') pageData; @Getter('pageInfo') pageData;
@Getter('pageId') pageId;
@Prop(Boolean) value; @Prop(Boolean) value;
showPopup: boolean = false; showPopup: boolean = false;
...@@ -29,13 +34,25 @@ export default class DynamicForm extends Vue { ...@@ -29,13 +34,25 @@ export default class DynamicForm extends Vue {
} }
handleSubmit(type) { handleSubmit(type) {
this.$refs.formCustom.validate((valid) => { this.$refs.formCustom.validate(async (valid) => {
if (valid) { if (valid) {
await this.createCoverImage();
this.$emit('submit', type, { ...this.formCustom, isPublish: this.formCustom.isPublish ? 1 : 0, isTemplate: this.formCustom.isTemplate ? 1 : 0 }); this.$emit('submit', type, { ...this.formCustom, isPublish: this.formCustom.isPublish ? 1 : 0, isTemplate: this.formCustom.isTemplate ? 1 : 0 });
} }
}); });
}, }
change(val) { change(val) {
this.$emit('input', val); this.$emit('input', val);
} }
async createCoverImage() {
const imgName = btoa(`coverImage-${uuidv4().substr(0, 8)}`);
const gridEle = document.querySelector('.Dcm-container-panel');
const canvas = await html2canvas(gridEle as HTMLElement, { useCORS: true });
const base64 = canvas.toDataURL();
const { data: { uptoken } } = await editorApi.getUpToken();
const { data: { key } } = await editorApi.uploadBase64(base64.split(',')[1], imgName, `UpToken ${uptoken}`);
this.formCustom.coverImage = config.qiniuHost + key;
}
} }
\ No newline at end of file
...@@ -7,9 +7,6 @@ ...@@ -7,9 +7,6 @@
<FormItem label="页面描述" prop="pageDescribe"> <FormItem label="页面描述" prop="pageDescribe">
<Input v-model="formCustom.pageDescribe" type="textarea" placeholder="请输入页面描述" :rows="3"></Input> <Input v-model="formCustom.pageDescribe" type="textarea" placeholder="请输入页面描述" :rows="3"></Input>
</FormItem> </FormItem>
<FormItem label="页面封面" prop="coverImage">
<Upload v-model="formCustom.coverImage" />
</FormItem>
<FormItem label="是否发布" prop="isPublish"> <FormItem label="是否发布" prop="isPublish">
<Checkbox v-model="formCustom.isPublish"></Checkbox> <Checkbox v-model="formCustom.isPublish"></Checkbox>
</FormItem> </FormItem>
...@@ -24,3 +21,18 @@ ...@@ -24,3 +21,18 @@
</Modal> </Modal>
</template> </template>
<script lang="ts" src="./index.ts"></script> <script lang="ts" src="./index.ts"></script>
<style lang="less">
.basic-form {
&-cover {
display: flex;
align-items: flex-start;
img {
margin-left: 15px;
width: 75px;
height: 133.4px;
border: 1px dashed;
object-fit: contain;
}
}
}
</style>
\ No newline at end of file
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
<Form ref="formCustom" :label-width="70"> <Form ref="formCustom" :label-width="70">
<FormItem label="尺寸" v-if="eleName === 'freedom-container'"> <FormItem label="尺寸" v-if="eleName === 'freedom-container'">
<Tooltip placement="top" content="全屏"> <Tooltip placement="top" content="全屏">
<Button type="ghost" icon="arrow-resize" @click="resizedEvent(667, 667)"></Button> <Button type="ghost" icon="arrow-resize" @click="resizedEvent(667, 12)"></Button>
</Tooltip> </Tooltip>
<Tooltip placement="top" content="根据背景图片自动调整宽高"> <Tooltip placement="top" content="根据背景图片自动调整宽高">
<Button type="ghost" icon="image" @click="resizedEvent(667, 375, true)" ></Button> <Button type="ghost" icon="image" @click="resizedEvent(667, 12, true)" ></Button>
</Tooltip> </Tooltip>
<Tooltip placement="top" content="宽100%"> <Tooltip placement="top" content="宽100%">
<Button type="ghost" icon="arrow-swap" @click="resizedEvent(null, 375)"></Button> <Button type="ghost" icon="arrow-swap" @click="resizedEvent(null, 12)"></Button>
</Tooltip> </Tooltip>
<Tooltip placement="top" content="高100%"> <Tooltip placement="top" content="高100%">
<Button type="ghost" icon="arrow-swap" @click="resizedEvent(667, null)" ></Button> <Button type="ghost" icon="arrow-swap" @click="resizedEvent(667, null)" ></Button>
......
...@@ -62,7 +62,7 @@ export default class DashBoard extends Mixins(ContextMenu) { ...@@ -62,7 +62,7 @@ export default class DashBoard extends Mixins(ContextMenu) {
get curElement() { get curElement() {
let element = {}; let element = {};
if (this.curEleIndex !== null) { if (this.curEleIndex !== null) {
if (this.curChildIndex !== null) { if (this.curChildIndex !== null && this.pageData.elements[this.curEleIndex]) {
element = this.pageData.elements[this.curEleIndex].child[this.curChildIndex]; element = this.pageData.elements[this.curEleIndex].child[this.curChildIndex];
} else { } else {
element = this.pageData.elements[this.curEleIndex]; element = this.pageData.elements[this.curEleIndex];
......
...@@ -160,6 +160,9 @@ ...@@ -160,6 +160,9 @@
&:hover { &:hover {
border: 1px dashed #0c0c0c !important; border: 1px dashed #0c0c0c !important;
} }
&>*:first-child {
height: 100%;
}
} }
.Dcmcp-item_selected { .Dcmcp-item_selected {
border: 1px dashed #0c0c0c !important; border: 1px dashed #0c0c0c !important;
......
...@@ -59,14 +59,20 @@ export default { ...@@ -59,14 +59,20 @@ export default {
src: params.row.coverImage, src: params.row.coverImage,
}, },
style: { style: {
width: '60px', width: '37.5px',
height: '60px' height: '66.7px',
objectFit: 'contain'
} }
} }
)] )]
); );
}, },
}, },
{
key: 'updatedAt',
title: '更新时间',
hideSearch: true
},
{ {
key: 'action', key: 'action',
title: '操作', title: '操作',
......
...@@ -63,8 +63,9 @@ export default { ...@@ -63,8 +63,9 @@ export default {
src: params.row.coverImage, src: params.row.coverImage,
}, },
style: { style: {
width: '60px', width: '37.5px',
height: '60px' height: '66.7px',
objectFit: 'contain'
} }
} }
)] )]
...@@ -90,6 +91,11 @@ export default { ...@@ -90,6 +91,11 @@ export default {
1: '', 1: '',
} }
}, },
{
key: 'updatedAt',
title: '更新时间',
hideSearch: true
},
{ {
key: 'action', key: 'action',
title: '操作', title: '操作',
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
import editorApi from '@api/editor.api'; import editorApi from '@api/editor.api';
import QGTable from '@editor/component/QgTable/index.vue'; import QGTable from '@editor/component/QgTable/index.vue';
import config from '@/config/index'; import config from '@/config/index';
export default { export default {
components: { components: {
QGTable, QGTable,
...@@ -62,8 +63,9 @@ export default { ...@@ -62,8 +63,9 @@ export default {
src: params.row.coverImage, src: params.row.coverImage,
}, },
style: { style: {
width: '60px', width: '37.5px',
height: '60px' height: '66.7px',
objectFit: 'contain'
} }
} }
)] )]
...@@ -78,6 +80,11 @@ export default { ...@@ -78,6 +80,11 @@ export default {
return h('span', `${config.apiHost}activity/${params.row.id}`) return h('span', `${config.apiHost}activity/${params.row.id}`)
} }
}, },
{
key: 'updatedAt',
title: '更新时间',
hideSearch: true
},
{ {
key: 'action', key: 'action',
title: '操作', title: '操作',
...@@ -112,7 +119,7 @@ export default { ...@@ -112,7 +119,7 @@ export default {
}, },
methods: { methods: {
async query(data) { async query(data) {
return editorApi.getPageList({ type: 'template' }); return editorApi.getPageList({ type: 'template', ...data });
}, },
addPage() { addPage() {
this.$router.push('/detail'); this.$router.push('/detail');
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
"dependencies": { "dependencies": {
"@better-scroll/core": "^2.0.5", "@better-scroll/core": "^2.0.5",
"@hubcarl/json-typescript-mapper": "^2.0.0", "@hubcarl/json-typescript-mapper": "^2.0.0",
"@qg/cherry-ui": "^2.5.27", "@qg/cherry-ui": "^2.17.66",
"axios": "^0.18.1", "axios": "^0.18.1",
"egg": "^2.3.0", "egg": "^2.3.0",
"egg-cors": "^2.1.1", "egg-cors": "^2.1.1",
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
"element-ui": "^2.0.8", "element-ui": "^2.0.8",
"extend": "~3.0.0", "extend": "~3.0.0",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"html2canvas": "^1.0.0-rc.7",
"iview": "^2.9.0", "iview": "^2.9.0",
"js-cookie": "^2.2.1", "js-cookie": "^2.2.1",
"lodash": "^4.17.4", "lodash": "^4.17.4",
......
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