fix: do not clear data when migrating data
This commit is contained in:
		
							parent
							
								
									1aa7ee65ab
								
							
						
					
					
						commit
						866549ce26
					
				@ -5,10 +5,14 @@ import Database, { Model } from '@nocobase/database';
 | 
			
		||||
import actions from '../../../actions/src';
 | 
			
		||||
import associated from '../../../actions/src/middlewares/associated';
 | 
			
		||||
 | 
			
		||||
console.log(process.argv);
 | 
			
		||||
 | 
			
		||||
const clean = false;
 | 
			
		||||
 | 
			
		||||
const sync = {
 | 
			
		||||
  force: true,
 | 
			
		||||
  force: clean,
 | 
			
		||||
  alter: {
 | 
			
		||||
    drop: true,
 | 
			
		||||
    drop: clean,
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -38,102 +42,120 @@ const api = Api.create({
 | 
			
		||||
api.resourcer.use(associated);
 | 
			
		||||
api.resourcer.registerActionHandlers({...actions.common, ...actions.associate});
 | 
			
		||||
 | 
			
		||||
const data = {
 | 
			
		||||
  title: '后台应用',
 | 
			
		||||
  path: '/',
 | 
			
		||||
  type: 'layout',
 | 
			
		||||
  template: 'TopMenuLayout',
 | 
			
		||||
  sort: 10,
 | 
			
		||||
  children: [
 | 
			
		||||
    {
 | 
			
		||||
      title: '仪表盘',
 | 
			
		||||
      type: 'page',
 | 
			
		||||
      path: '/dashboard',
 | 
			
		||||
      icon: 'DashboardOutlined',
 | 
			
		||||
      template: 'page1',
 | 
			
		||||
      sort: 20,
 | 
			
		||||
      showInMenu: true,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      title: '数据',
 | 
			
		||||
      type: 'layout',
 | 
			
		||||
      path: '/collections',
 | 
			
		||||
      icon: 'DatabaseOutlined',
 | 
			
		||||
      template: 'SideMenuLayout',
 | 
			
		||||
      sort: 30,
 | 
			
		||||
      showInMenu: true,
 | 
			
		||||
      children: [
 | 
			
		||||
        // {
 | 
			
		||||
        //   title: '页面3',
 | 
			
		||||
        //   type: 'page',
 | 
			
		||||
        //   path: '/collections/page3',
 | 
			
		||||
        //   icon: 'dashboard',
 | 
			
		||||
        //   template: 'page3',
 | 
			
		||||
        //   sort: 40,
 | 
			
		||||
        // },
 | 
			
		||||
        // {
 | 
			
		||||
        //   title: '页面4',
 | 
			
		||||
        //   type: 'page',
 | 
			
		||||
        //   path: '/collections/page4',
 | 
			
		||||
        //   icon: 'dashboard',
 | 
			
		||||
        //   template: 'page4',
 | 
			
		||||
        //   sort: 50,
 | 
			
		||||
        // },
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      title: '用户',
 | 
			
		||||
      type: 'layout',
 | 
			
		||||
      path: '/users',
 | 
			
		||||
      icon: 'TeamOutlined',
 | 
			
		||||
      template: 'SideMenuLayout',
 | 
			
		||||
      sort: 70,
 | 
			
		||||
      showInMenu: true,
 | 
			
		||||
      children: [
 | 
			
		||||
        {
 | 
			
		||||
          title: '用户管理',
 | 
			
		||||
          type: 'collection',
 | 
			
		||||
          path: '/users/users',
 | 
			
		||||
          icon: 'UserOutlined',
 | 
			
		||||
          template: 'collection',
 | 
			
		||||
          collection: 'users',
 | 
			
		||||
          sort: 80,
 | 
			
		||||
          showInMenu: true,
 | 
			
		||||
        },
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      title: '配置',
 | 
			
		||||
      type: 'layout',
 | 
			
		||||
      path: '/settings',
 | 
			
		||||
      icon: 'SettingOutlined',
 | 
			
		||||
      template: 'SideMenuLayout',
 | 
			
		||||
      sort: 90,
 | 
			
		||||
      showInMenu: true,
 | 
			
		||||
      children: [
 | 
			
		||||
        {
 | 
			
		||||
          title: '页面与菜单',
 | 
			
		||||
          type: 'collection',
 | 
			
		||||
          collection: 'pages',
 | 
			
		||||
          path: '/settings/pages',
 | 
			
		||||
          icon: 'MenuOutlined',
 | 
			
		||||
          sort: 100,
 | 
			
		||||
          developerMode: true,
 | 
			
		||||
          showInMenu: true,
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          title: '数据表配置',
 | 
			
		||||
          type: 'collection',
 | 
			
		||||
          collection: 'collections',
 | 
			
		||||
          path: '/settings/collections',
 | 
			
		||||
          icon: 'TableOutlined',
 | 
			
		||||
          sort: 110,
 | 
			
		||||
          showInMenu: true,
 | 
			
		||||
        },
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
};
 | 
			
		||||
const data = [
 | 
			
		||||
  {
 | 
			
		||||
    title: '后台应用',
 | 
			
		||||
    path: '/',
 | 
			
		||||
    type: 'layout',
 | 
			
		||||
    template: 'TopMenuLayout',
 | 
			
		||||
    sort: 10,
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        title: '仪表盘',
 | 
			
		||||
        type: 'page',
 | 
			
		||||
        path: '/dashboard',
 | 
			
		||||
        icon: 'DashboardOutlined',
 | 
			
		||||
        template: 'page1',
 | 
			
		||||
        sort: 20,
 | 
			
		||||
        showInMenu: true,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        title: '数据',
 | 
			
		||||
        type: 'layout',
 | 
			
		||||
        path: '/collections',
 | 
			
		||||
        icon: 'DatabaseOutlined',
 | 
			
		||||
        template: 'SideMenuLayout',
 | 
			
		||||
        sort: 30,
 | 
			
		||||
        showInMenu: true,
 | 
			
		||||
        children: [
 | 
			
		||||
          // {
 | 
			
		||||
          //   title: '页面3',
 | 
			
		||||
          //   type: 'page',
 | 
			
		||||
          //   path: '/collections/page3',
 | 
			
		||||
          //   icon: 'dashboard',
 | 
			
		||||
          //   template: 'page3',
 | 
			
		||||
          //   sort: 40,
 | 
			
		||||
          // },
 | 
			
		||||
          // {
 | 
			
		||||
          //   title: '页面4',
 | 
			
		||||
          //   type: 'page',
 | 
			
		||||
          //   path: '/collections/page4',
 | 
			
		||||
          //   icon: 'dashboard',
 | 
			
		||||
          //   template: 'page4',
 | 
			
		||||
          //   sort: 50,
 | 
			
		||||
          // },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        title: '用户',
 | 
			
		||||
        type: 'layout',
 | 
			
		||||
        path: '/users',
 | 
			
		||||
        icon: 'TeamOutlined',
 | 
			
		||||
        template: 'SideMenuLayout',
 | 
			
		||||
        sort: 70,
 | 
			
		||||
        showInMenu: true,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            title: '用户管理',
 | 
			
		||||
            type: 'collection',
 | 
			
		||||
            path: '/users/users',
 | 
			
		||||
            icon: 'UserOutlined',
 | 
			
		||||
            template: 'collection',
 | 
			
		||||
            collection: 'users',
 | 
			
		||||
            sort: 80,
 | 
			
		||||
            showInMenu: true,
 | 
			
		||||
          },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        title: '配置',
 | 
			
		||||
        type: 'layout',
 | 
			
		||||
        path: '/settings',
 | 
			
		||||
        icon: 'SettingOutlined',
 | 
			
		||||
        template: 'SideMenuLayout',
 | 
			
		||||
        sort: 90,
 | 
			
		||||
        showInMenu: true,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            title: '页面与菜单',
 | 
			
		||||
            type: 'collection',
 | 
			
		||||
            collection: 'pages',
 | 
			
		||||
            path: '/settings/pages',
 | 
			
		||||
            icon: 'MenuOutlined',
 | 
			
		||||
            sort: 100,
 | 
			
		||||
            developerMode: true,
 | 
			
		||||
            showInMenu: true,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            title: '数据表配置',
 | 
			
		||||
            type: 'collection',
 | 
			
		||||
            collection: 'collections',
 | 
			
		||||
            path: '/settings/collections',
 | 
			
		||||
            icon: 'TableOutlined',
 | 
			
		||||
            sort: 110,
 | 
			
		||||
            showInMenu: true,
 | 
			
		||||
          },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    title: '登录页面',
 | 
			
		||||
    path: '/login',
 | 
			
		||||
    type: 'page',
 | 
			
		||||
    inherit: false,
 | 
			
		||||
    template: 'login',
 | 
			
		||||
    order: 120,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    title: '注册页面',
 | 
			
		||||
    path: '/register',
 | 
			
		||||
    type: 'page',
 | 
			
		||||
    inherit: false,
 | 
			
		||||
    template: 'register',
 | 
			
		||||
    order: 130,
 | 
			
		||||
  }
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
(async () => {
 | 
			
		||||
  await api
 | 
			
		||||
@ -150,44 +172,23 @@ const data = {
 | 
			
		||||
  await database.sync({
 | 
			
		||||
    // tables: ['collections', 'fields', 'actions', 'views', 'tabs'],
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  const Collection = database.getModel('collections');
 | 
			
		||||
  const [Collection, Page, User] = database.getModels(['collections', 'pages', 'users']);
 | 
			
		||||
  const tables = database.getTables([]);
 | 
			
		||||
 | 
			
		||||
  for (let table of tables) {
 | 
			
		||||
    await Collection.import(table.getOptions(), { migrate: false });
 | 
			
		||||
    await Collection.import(table.getOptions(), { update: true, migrate: false });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const Page = database.getModel('pages');
 | 
			
		||||
  const page = await Page.create(data);
 | 
			
		||||
  await page.updateAssociations(data);
 | 
			
		||||
 | 
			
		||||
  await Page.create({
 | 
			
		||||
    title: '登录页面',
 | 
			
		||||
    path: '/login',
 | 
			
		||||
    type: 'page',
 | 
			
		||||
    inherit: false,
 | 
			
		||||
    template: 'login',
 | 
			
		||||
    order: 120,
 | 
			
		||||
  await Page.import(data);
 | 
			
		||||
  await User.findOrCreate({
 | 
			
		||||
    where: {
 | 
			
		||||
      username: "admin",
 | 
			
		||||
    },
 | 
			
		||||
    defaults: {
 | 
			
		||||
      nickname: "超级管理员",
 | 
			
		||||
      password: "admin",
 | 
			
		||||
      username: "admin",
 | 
			
		||||
      token: "38979f07e1fca68fb3d2",
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  await Page.create({
 | 
			
		||||
    title: '注册页面',
 | 
			
		||||
    path: '/register',
 | 
			
		||||
    type: 'page',
 | 
			
		||||
    inherit: false,
 | 
			
		||||
    template: 'register',
 | 
			
		||||
    order: 130,
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  await database.getModel('users').create({
 | 
			
		||||
    nickname: "超级管理员",
 | 
			
		||||
    password: "admin",
 | 
			
		||||
    username: "admin",
 | 
			
		||||
    token: "38979f07e1fca68fb3d2",
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  await database.getModel('collections').import(require('./collections/example').default);
 | 
			
		||||
 | 
			
		||||
  await database.close();
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
@ -129,21 +129,66 @@ export class CollectionModel extends BaseModel {
 | 
			
		||||
 | 
			
		||||
  static async import(data: TableOptions, options: SaveOptions = {}): Promise<CollectionModel> {
 | 
			
		||||
    data = _.cloneDeep(data);
 | 
			
		||||
    const collection = await this.create({
 | 
			
		||||
      ...data,
 | 
			
		||||
    }, options);
 | 
			
		||||
    const items: any = {};
 | 
			
		||||
    // @ts-ignore
 | 
			
		||||
    const { update } = options;
 | 
			
		||||
    let collection;
 | 
			
		||||
    if (data.name) {
 | 
			
		||||
      collection = await this.findOne({
 | 
			
		||||
        ...options,
 | 
			
		||||
        where: {
 | 
			
		||||
          name: data.name,
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
    } else if (data.title) {
 | 
			
		||||
      collection = await this.findOne({
 | 
			
		||||
        ...options,
 | 
			
		||||
        where: {
 | 
			
		||||
          title: data.title,
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
    if (collection && update) {
 | 
			
		||||
      await collection.update(data, options);
 | 
			
		||||
    }
 | 
			
		||||
    if (!collection) {
 | 
			
		||||
      collection = await this.create(data, options);
 | 
			
		||||
    }
 | 
			
		||||
    const associations = ['fields', 'tabs', 'actions', 'views'];
 | 
			
		||||
    for (const key of associations) {
 | 
			
		||||
      if (!Array.isArray(data[key])) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      items[key] = data[key].map((item, sort) => ({
 | 
			
		||||
        ...item,
 | 
			
		||||
        sort,
 | 
			
		||||
      }));
 | 
			
		||||
      const Model = this.database.getModel(key);
 | 
			
		||||
      for (const item of data[key]) {
 | 
			
		||||
        let model;
 | 
			
		||||
        if (item.name) {
 | 
			
		||||
          model = await Model.findOne({
 | 
			
		||||
            ...options,
 | 
			
		||||
            where: {
 | 
			
		||||
              collection_name: collection.name,
 | 
			
		||||
              name: item.name,
 | 
			
		||||
            },
 | 
			
		||||
          });
 | 
			
		||||
        } else if (item.title) {
 | 
			
		||||
          model = await Model.findOne({
 | 
			
		||||
            ...options,
 | 
			
		||||
            where: {
 | 
			
		||||
              collection_name: collection.name,
 | 
			
		||||
              title: item.title,
 | 
			
		||||
            },
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
        if (model && update) {
 | 
			
		||||
          await model.update(item, options);
 | 
			
		||||
        }
 | 
			
		||||
        if (!model) {
 | 
			
		||||
          model = await Model.create({
 | 
			
		||||
            ...item,
 | 
			
		||||
            collection_name: collection.name,
 | 
			
		||||
          }, options);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    await collection.updateAssociations(items, options);
 | 
			
		||||
    return collection;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,3 +4,4 @@ export * from './collection';
 | 
			
		||||
export * from './field';
 | 
			
		||||
export * from './tab';
 | 
			
		||||
export * from './view';
 | 
			
		||||
export * from './page';
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								packages/plugin-collections/src/models/page.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								packages/plugin-collections/src/models/page.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
			
		||||
import _ from 'lodash';
 | 
			
		||||
import BaseModel from './base';
 | 
			
		||||
import { SaveOptions, Op } from 'sequelize';
 | 
			
		||||
 | 
			
		||||
interface PageImportOptions extends SaveOptions {
 | 
			
		||||
  parentId?: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 暂时放在这里
 | 
			
		||||
 */
 | 
			
		||||
export class PageModel extends BaseModel {
 | 
			
		||||
  static async import(items: any, options: PageImportOptions = {}): Promise<any> {
 | 
			
		||||
    const { parentId } = options;
 | 
			
		||||
    if (!Array.isArray(items)) {
 | 
			
		||||
      items = [items];
 | 
			
		||||
    }
 | 
			
		||||
    for (const item of items) {
 | 
			
		||||
      let page = await this.findOne({
 | 
			
		||||
        ...options,
 | 
			
		||||
        where: {
 | 
			
		||||
          path: item.path,
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
      if (!page) {
 | 
			
		||||
        page = await this.create({
 | 
			
		||||
          ...item,
 | 
			
		||||
          parent_id: parentId,
 | 
			
		||||
        }, options);
 | 
			
		||||
      }
 | 
			
		||||
      if (Array.isArray(item.children)) {
 | 
			
		||||
        await this.import(item.children, {
 | 
			
		||||
          ...options,
 | 
			
		||||
          parentId: page.id,
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user