Commit 98b13b21 authored by 徐光星's avatar 徐光星

feat: 增加历史记录model、查询

parent ba6342c1
import { Console } from 'console';
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';
...@@ -17,8 +18,8 @@ export default class EditorController extends Controller { ...@@ -17,8 +18,8 @@ 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; const { uuid, id } = result.dataValues;
await ctx.model.PageHistory.create({ ...pageInfo, uuid, tenantId: ctx.headers['qg-tenant-id']}); await ctx.model.PageHistory.create({ ...pageInfo, uuid, pageId: id, tenantId: ctx.headers['qg-tenant-id']});
ctx.body = ctx.helper.ok(result); ctx.body = ctx.helper.ok(result);
await ctx.service.redis.del(`pageInfo:${uuid}`); await ctx.service.redis.del(`pageInfo:${uuid}`);
await ctx.service.redis.del(`page:${uuid}`); await ctx.service.redis.del(`page:${uuid}`);
...@@ -41,7 +42,9 @@ export default class EditorController extends Controller { ...@@ -41,7 +42,9 @@ export default class EditorController extends Controller {
const uuid = pageInfo.uuid; 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.model.PageHistory.create({ ...pageInfo, tenantId: ctx.headers['qg-tenant-id']}); const pageData = await ctx.model.PageInfo.findOne({where: { uuid }});
const pageId = pageData.id;
await ctx.model.PageHistory.create({ ...pageInfo, uuid, pageId, tenantId: ctx.headers['qg-tenant-id']});
await ctx.service.redis.del(`pageInfo:${uuid}`); await ctx.service.redis.del(`pageInfo:${uuid}`);
await ctx.service.redis.del(`page:${uuid}`); await ctx.service.redis.del(`page:${uuid}`);
ctx.body = ctx.helper.ok(result); ctx.body = ctx.helper.ok(result);
...@@ -96,7 +99,10 @@ export default class EditorController extends Controller { ...@@ -96,7 +99,10 @@ 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']], include: [PageHistory]}); offset: (+pageNo - 1) * +pageSize || 0, order: [['updated_at', 'DESC']], include: [PageHistory.scope('relative')]});
data.map(item => {
item.pageHistory && item.pageHistory.reverse();
})
ctx.body = ctx.helper.ok({ total, data }); ctx.body = ctx.helper.ok({ total, data });
} }
...@@ -130,7 +136,7 @@ export default class EditorController extends Controller { ...@@ -130,7 +136,7 @@ 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'] }}); 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 }}); await ctx.model.PageHistory.destroy({where: { pageId: pageData.dataValues.id }});
ctx.body = ctx.helper.ok(pageInfo); ctx.body = ctx.helper.ok(pageInfo);
} }
public async getServerTime(ctx: Context) { public async getServerTime(ctx: Context) {
......
/** /**
* @desc 页面信息表 * @desc 页面信息表
*/ */
import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull, ForeignKey, BelongsTo } from 'sequelize-typescript'; import { AutoIncrement, Column, DataType, Model, PrimaryKey, Table, AllowNull, ForeignKey, BelongsTo, DefaultScope, Scopes } from 'sequelize-typescript';
import { PageInfo } from './pageInfo'; import { PageInfo } from './pageInfo';
// @DefaultScope(() => ({
// attributes: ['id', 'primaryColor', 'secondaryColor', 'producedAt'],
// }))
@Scopes({
relative: {
attributes: ['id', 'author', 'updatedAt', 'createdAt']
}
})
@Table({ @Table({
modelName: 'page_history', modelName: 'page_history',
freezeTableName: true freezeTableName: true
...@@ -41,15 +51,14 @@ ...@@ -41,15 +51,14 @@
}) })
pageKeywords: string; pageKeywords: string;
@ForeignKey(() => PageInfo)
@Column({ @Column({
field: 'uuid', field: 'uuid',
type: DataType.UUID type: DataType.UUID
}) })
uuid: string; uuid: string;
@BelongsTo(() => PageInfo) // @BelongsTo(() => PageInfo)
pageInfo: PageInfo; // pageInfo: PageInfo;
@Column({ @Column({
field: 'redirectUrl', field: 'redirectUrl',
...@@ -120,7 +129,25 @@ ...@@ -120,7 +129,25 @@
}, },
}) })
updatedAt: string; updatedAt: string;
@Column({
type: DataType.DATE,
field: 'created_at',
get() {
const moment = require('moment');
const createdAt = this.getDataValue('createdAt');
return moment(createdAt).format('YYYY-MM-DD HH:mm:ss');
},
})
createdAt: string;
@ForeignKey(() => PageInfo)
@Column({
field: 'page_id',
type: DataType.INTEGER(11)
})
pageId: number;
@Column({ @Column({
type: DataType.INTEGER(11), type: DataType.INTEGER(11),
field: 'tenant_id', field: 'tenant_id',
......
...@@ -127,4 +127,5 @@ export class PageInfo extends Model<PageInfo> { ...@@ -127,4 +127,5 @@ export class PageInfo extends Model<PageInfo> {
pageHistory: PageHistory[]; pageHistory: PageHistory[];
} }
export default () => PageInfo; export default () => PageInfo;
\ No newline at end of file
<template>
<Modal width="700" v-model="show" title="历史记录" @on-visible-change="change">
<Table
:columns="columns"
:data="records"
class="tableStyle"
/>
<span slot="footer"></span>
</Modal>
</template>
<script>
export default {
props: {
value: {
type: Boolean,
default: false
},
records: {
type: Array,
default() {
return []
}
}
},
watch: {
value(val) {
this.show = val;
}
},
data() {
return {
show: false,
columns: [
{
title: '版本',
align: 'center',
render: (h, params) => {
console.log(params);
return h('span', this.records.length - params.index)
}
},
{
title: '更新时间',
key: 'updatedAt',
align: 'center'
},
{
key: 'author',
title: '操作人',
align: 'center'
}
]
}
},
created() {
this.show = this.value;
console.log(this.records, 123)
},
methods: {
change(val) {
if (!val) {
this.close();
}
},
close() {
this.$emit('close');
}
}
}
</script>
\ No newline at end of file
...@@ -82,15 +82,16 @@ ...@@ -82,15 +82,16 @@
/> />
</template> </template>
</div> </div>
<recordsModal v-model="showRecordsModal" :records="records" @close="showRecordsModal = false" />
</div> </div>
</template> </template>
<script> <script>
import Treeselect from '@riophae/vue-treeselect'; import Treeselect from '@riophae/vue-treeselect';
import '@riophae/vue-treeselect/dist/vue-treeselect.css'; import '@riophae/vue-treeselect/dist/vue-treeselect.css';
import { cloneDeep } from 'lodash'; import { cloneDeep } from 'lodash';
import recordsModal from './components/records.vue'
export default { export default {
components: { Treeselect }, components: { Treeselect, recordsModal },
props: { props: {
columns: { columns: {
type: Array, type: Array,
...@@ -114,7 +115,9 @@ export default { ...@@ -114,7 +115,9 @@ export default {
}, },
showSelected: false, // todo showSelected: false, // todo
searchCondition: [], searchCondition: [],
selectedTab: '1' selectedTab: '1',
records: [],
showRecordsModal: false
}; };
}, },
watch: { watch: {
...@@ -133,6 +136,11 @@ export default { ...@@ -133,6 +136,11 @@ export default {
} }
}, },
methods: { methods: {
showRecords(data) {
// 展示历史记录
this.records = data || [];
this.showRecordsModal = true;
},
changePageNo(page) { changePageNo(page) {
this.query(page); this.query(page);
this.$emit('on-page-change', page); this.$emit('on-page-change', page);
......
...@@ -145,6 +145,22 @@ export default { ...@@ -145,6 +145,22 @@ export default {
}, },
'修改' '修改'
), ),
h(
'Button',
{
props,
style: {
...style,
display: params.row.pageHistory && params.row.pageHistory.length ? 'inline-block' : 'none'
},
on: {
click: () => {
this.$refs.qgTable.showRecords(params.row.pageHistory);
},
},
},
'历史记录'
),
h( h(
'Poptip', 'Poptip',
{ {
......
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