Commit ba6342c1 authored by 徐光星's avatar 徐光星

feat: 增加页面历史记录关联表

parent b60f711b
import { Controller, Context } from 'egg'; import { Controller, Context } from 'egg';
import _, { omitBy } from 'lodash'; import _, { omitBy } from 'lodash';
import { v1 as uuidv1 } from 'uuid'; import { v1 as uuidv1 } from 'uuid';
import { PageHistory } from '../model/pageHistory';
export default class EditorController extends Controller { export default class EditorController extends Controller {
public async login(ctx: Context) { public async login(ctx: Context) {
...@@ -16,9 +17,11 @@ export default class EditorController extends Controller { ...@@ -16,9 +17,11 @@ export default class EditorController extends Controller {
const pageInfo = ctx.request.body; const pageInfo = ctx.request.body;
try { try {
const result = await ctx.model.PageInfo.create({ ...pageInfo, uuid: uuidv1().replace(/-/g, ''), tenantId: ctx.headers['qg-tenant-id']}); const result = await ctx.model.PageInfo.create({ ...pageInfo, uuid: uuidv1().replace(/-/g, ''), tenantId: ctx.headers['qg-tenant-id']});
const uuid = result.dataValues.uuid;
await ctx.model.PageHistory.create({ ...pageInfo, uuid, tenantId: ctx.headers['qg-tenant-id']});
ctx.body = ctx.helper.ok(result); ctx.body = ctx.helper.ok(result);
await ctx.service.redis.del(`pageInfo:${result.dataValues.uuid}`); await ctx.service.redis.del(`pageInfo:${uuid}`);
await ctx.service.redis.del(`page:${result.dataValues.uuid}`); await ctx.service.redis.del(`page:${uuid}`);
} catch (error) { } catch (error) {
if (error.message.indexOf('Data too long') > -1 && error.message.indexOf('page_data') > -1) { if (error.message.indexOf('Data too long') > -1 && error.message.indexOf('page_data') > -1) {
error.message = '配置组件过多,请对组件进行删减'; error.message = '配置组件过多,请对组件进行删减';
...@@ -35,10 +38,12 @@ export default class EditorController extends Controller { ...@@ -35,10 +38,12 @@ export default class EditorController extends Controller {
if (ctx.headers['qg-tenant-id']) { if (ctx.headers['qg-tenant-id']) {
pageInfo.tenantId = +ctx.headers['qg-tenant-id']; pageInfo.tenantId = +ctx.headers['qg-tenant-id'];
} }
const uuid = pageInfo.uuid;
try { try {
const result = await ctx.model.PageInfo.update(pageInfo, {where: { uuid: pageInfo.uuid, tenantId: ctx.headers['qg-tenant-id'] }}); const result = await ctx.model.PageInfo.update(pageInfo, {where: { uuid: pageInfo.uuid, tenantId: ctx.headers['qg-tenant-id'] }});
await ctx.service.redis.del(`pageInfo:${pageInfo.uuid}`); await ctx.model.PageHistory.create({ ...pageInfo, tenantId: ctx.headers['qg-tenant-id']});
await ctx.service.redis.del(`page:${pageInfo.uuid}`); await ctx.service.redis.del(`pageInfo:${uuid}`);
await ctx.service.redis.del(`page:${uuid}`);
ctx.body = ctx.helper.ok(result); ctx.body = ctx.helper.ok(result);
} catch (error) { } catch (error) {
if (error.message.indexOf('Data too long') > -1 && error.message.indexOf('page_data') > -1) { if (error.message.indexOf('Data too long') > -1 && error.message.indexOf('page_data') > -1) {
...@@ -51,10 +56,9 @@ export default class EditorController extends Controller { ...@@ -51,10 +56,9 @@ export default class EditorController extends Controller {
public async get(ctx: Context) { public async get(ctx: Context) {
const { isEditor } = ctx.query; const { isEditor } = ctx.query;
let pageInfo = isEditor ? null : await ctx.service.redis.get(`pageInfo:${ctx.params.uuid}`); let pageInfo = isEditor ? null : await ctx.service.redis.get(`pageInfo:${ctx.params.uuid}`);
console.log('redis', pageInfo);
if (!pageInfo) { if (!pageInfo) {
pageInfo = await ctx.model.PageInfo.findOne({where: { uuid: ctx.params.uuid }}); pageInfo = await ctx.model.PageInfo.findOne({where: { uuid: ctx.params.uuid }});
console.log('sql', pageInfo); // console.log('sql', pageInfo);
if (ctx.query.lite && pageInfo) { if (ctx.query.lite && pageInfo) {
// 如果存在sheme移除掉 // 如果存在sheme移除掉
...@@ -92,7 +96,7 @@ export default class EditorController extends Controller { ...@@ -92,7 +96,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, order: [['updated_at', 'DESC']] }); offset: (+pageNo - 1) * +pageSize || 0, order: [['updated_at', 'DESC']], include: [PageHistory]});
ctx.body = ctx.helper.ok({ total, data }); ctx.body = ctx.helper.ok({ total, data });
} }
...@@ -125,6 +129,8 @@ export default class EditorController extends Controller { ...@@ -125,6 +129,8 @@ export default class EditorController extends Controller {
public async delete(ctx: Context) { public async delete(ctx: Context) {
const pageInfo = await ctx.model.PageInfo.update({ enable: 0 }, {where: { id: +ctx.params.pageId, tenantId: ctx.headers['qg-tenant-id'] }}); const pageInfo = await ctx.model.PageInfo.update({ enable: 0 }, {where: { id: +ctx.params.pageId, tenantId: ctx.headers['qg-tenant-id'] }});
const pageData = await ctx.model.PageInfo.find({where: { id: +ctx.params.pageId, tenantId: ctx.headers['qg-tenant-id'] }});
await ctx.model.PageHistory.destroy({where: { uuid: pageData.dataValues.uuid }});
ctx.body = ctx.helper.ok(pageInfo); ctx.body = ctx.helper.ok(pageInfo);
} }
public async getServerTime(ctx: Context) { public async getServerTime(ctx: Context) {
......
/**
* @desc 页面信息表
*/
import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull, ForeignKey, BelongsTo } from 'sequelize-typescript';
import { PageInfo } from './pageInfo';
@Table({
modelName: 'page_history',
freezeTableName: true
})
export class PageHistory extends Model<PageHistory> {
@PrimaryKey
@AutoIncrement
@Column({
type: DataType.INTEGER(11)
})
id: number;
@Column({
field: 'page_data',
type: DataType.TEXT
})
page: string;
@Column({
field: 'page_name',
type: DataType.STRING(32)
})
pageName: string;
@Column({
field: 'page_describe',
type: DataType.STRING(255)
})
pageDescribe: string;
@Column({
field: 'page_keywords',
type: DataType.STRING(255)
})
pageKeywords: string;
@ForeignKey(() => PageInfo)
@Column({
field: 'uuid',
type: DataType.UUID
})
uuid: string;
@BelongsTo(() => PageInfo)
pageInfo: PageInfo;
@Column({
field: 'redirectUrl',
type: DataType.STRING(255),
get() {
const redirectUrl = this.getDataValue('redirectUrl');
return !redirectUrl ? '' : redirectUrl;
},
})
redirectUrl: string;
@Column({
field: 'validEndTime',
type: DataType.STRING(32),
get() {
const validEndTime = this.getDataValue('validEndTime');
return !validEndTime ? '' : validEndTime;
},
})
validEndTime: string;
@Column({
field: 'validStartTime',
type: DataType.STRING(32),
get() {
const validStartTime = this.getDataValue('validStartTime');
return !validStartTime ? '' : validStartTime;
},
})
validStartTime: string;
@Column({
type: DataType.INTEGER(1)
})
enable: number;
@AllowNull(false)
@Column({
type: DataType.STRING(32)
})
author: string;
@Column({
type: DataType.STRING(32),
field: 'cover_image'
})
coverImage: string;
@Column({
type: DataType.INTEGER(1),
field: 'is_template'
})
isTemplate: number;
@Column({
type: DataType.INTEGER(1),
field: 'is_publish'
})
isPublish: number;
@Column({
type: DataType.DATE,
field: 'updated_at',
get() {
const moment = require('moment');
const updatedAt = this.getDataValue('updatedAt');
return moment(updatedAt).format('YYYY-MM-DD HH:mm:ss');
},
})
updatedAt: string;
@Column({
type: DataType.INTEGER(11),
field: 'tenant_id',
})
tenantId: number;
}
export default () => PageHistory;
\ No newline at end of file
/** /**
* @desc 页面信息表 * @desc 页面信息表
*/ */
import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull } from 'sequelize-typescript'; import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull, HasMany } from 'sequelize-typescript';
import { PageHistory } from './pageHistory';
@Table({ @Table({
modelName: 'page_config_info', modelName: 'page_config_info',
freezeTableName: true freezeTableName: true
...@@ -122,6 +122,9 @@ export class PageInfo extends Model<PageInfo> { ...@@ -122,6 +122,9 @@ export class PageInfo extends Model<PageInfo> {
field: 'tenant_id', field: 'tenant_id',
}) })
tenantId: number; tenantId: number;
@HasMany(() => PageHistory)
pageHistory: PageHistory[];
} }
export default () => PageInfo; export default () => PageInfo;
\ No newline at end of file
...@@ -46,7 +46,7 @@ function deleteUrlParams(url, ref) { ...@@ -46,7 +46,7 @@ function deleteUrlParams(url, ref) {
} }
} }
export default class ArticeService extends Service { export default class NavService extends Service {
private context: Context; private context: Context;
constructor(ctx: Context) { constructor(ctx: Context) {
super(ctx); super(ctx);
......
import { Context, Service } from 'egg';
export default class RecordsService extends Service {
private context: Context;
constructor(ctx: Context) {
super(ctx);
this.context = ctx;
}
}
...@@ -64,6 +64,27 @@ export interface PageInfo { ...@@ -64,6 +64,27 @@ export interface PageInfo {
validEndTime?: string; validEndTime?: string;
} }
export interface PageHistory {
id?: number;
page?: Page | string;
enable?: number;
author?: string;
coverImage?: string;
shareCoverImage?: string; // 分享缩略图
shareOpenMethod?: string; // 分享后的打开方式
isTemplate?: number | boolean;
isPublish?: number | boolean;
pageName?: string;
pageDescribe?: string;
pageKeywords?: string;
uuid?: string;
tenantId?: number;
diversion?: string;
redirectUrl?: string;
validStartTime?: string;
validEndTime?: string;
}
export default interface EditorState { export default interface EditorState {
pageInfo: PageInfo; pageInfo: PageInfo;
curEleIndex: number | null; curEleIndex: number | null;
......
...@@ -3,12 +3,14 @@ ...@@ -3,12 +3,14 @@
import 'egg'; import 'egg';
import ExportNavigatorConfig from '../../../app/model/navigatorConfig'; import ExportNavigatorConfig from '../../../app/model/navigatorConfig';
import ExportPageHistory from '../../../app/model/pageHistory';
import ExportPageInfo from '../../../app/model/pageInfo'; import ExportPageInfo from '../../../app/model/pageInfo';
import ExportTenantAuth from '../../../app/model/tenantAuth'; import ExportTenantAuth from '../../../app/model/tenantAuth';
declare module 'egg' { declare module 'egg' {
interface IModel { interface IModel {
NavigatorConfig: ReturnType<typeof ExportNavigatorConfig>; NavigatorConfig: ReturnType<typeof ExportNavigatorConfig>;
PageHistory: ReturnType<typeof ExportPageHistory>;
PageInfo: ReturnType<typeof ExportPageInfo>; PageInfo: ReturnType<typeof ExportPageInfo>;
TenantAuth: ReturnType<typeof ExportTenantAuth>; TenantAuth: ReturnType<typeof ExportTenantAuth>;
} }
......
...@@ -7,11 +7,13 @@ type AnyFunc<T = any> = (...args: any[]) => T; ...@@ -7,11 +7,13 @@ type AnyFunc<T = any> = (...args: any[]) => T;
type CanExportFunc = AnyFunc<Promise<any>> | AnyFunc<IterableIterator<any>>; type CanExportFunc = AnyFunc<Promise<any>> | AnyFunc<IterableIterator<any>>;
type AutoInstanceType<T, U = T extends CanExportFunc ? T : T extends AnyFunc ? ReturnType<T> : T> = U extends AnyClass ? InstanceType<U> : U; type AutoInstanceType<T, U = T extends CanExportFunc ? T : T extends AnyFunc ? ReturnType<T> : T> = U extends AnyClass ? InstanceType<U> : U;
import ExportNavigator from '../../../app/service/navigator'; import ExportNavigator from '../../../app/service/navigator';
import ExportRecords from '../../../app/service/records';
import ExportRedis from '../../../app/service/redis'; import ExportRedis from '../../../app/service/redis';
declare module 'egg' { declare module 'egg' {
interface IService { interface IService {
navigator: AutoInstanceType<typeof ExportNavigator>; navigator: AutoInstanceType<typeof ExportNavigator>;
records: AutoInstanceType<typeof ExportRecords>;
redis: AutoInstanceType<typeof ExportRedis>; redis: AutoInstanceType<typeof ExportRedis>;
} }
} }
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