feat:物料的 CRUD 功能完成

This commit is contained in:
wangxuefeng 2025-03-01 18:14:09 +08:00
parent e052752694
commit 76ffef36cd
4 changed files with 169 additions and 29 deletions

View File

@ -1 +1,3 @@
低代码相关接口文档: https://developer.shiyuegame.com/showdoc/web/#/231?page_id=15660
密码shiyuegame

View File

@ -46,7 +46,46 @@ export const updateFile = async (id: string, data: LowCodeFileSchema) => {
return response.data;
};
type PublishResponse = {
code: string;
data: object;
id?: string;
message: string;
};
export const deleteFile = async (id: string) => {
const response = await instance.delete(`/api/v1/files/${id}`);
return response.data;
};
/**
*
* @param {number} projectId - ID
* @returns {Promise<any>} Promise对象
* @example
* // 发布项目ID为123的所有文件
* await publishAllFile(123)
*/
export const publishAllFile = async (
projectId: number
): Promise<PublishResponse> => {
const response = await instance.post('/api/v1/files/publish', {
project_id: projectId
});
return response.data;
};
/**
*
* @param {string} fileId - ID
* @returns {Promise<any>} Promise对象
* @example
* // 发布文件ID为45tnbgeme的文件
* await publishFile('45tnbgeme')
*/
export const publishFile = async (fileId: string): Promise<PublishResponse> => {
const response = await instance.post('/api/v1/files/publish-file', {
file_id: fileId
});
return response.data;
};

View File

@ -1,23 +1,99 @@
import { type MaterialDescription } from '@vtj/core';
import instance from './instance';
export const getMaterialsList = async (data?: Record<string, any>) => {
const response = await instance.get('/api/v1/materials', {
params: data
});
// 定义响应类型
interface MaterialResponse {
code: number;
data: MaterialData | MaterialData[];
message: string;
}
/** 创建物料请求参数 */
interface CreateMaterialRequest {
project_id: number;
value: string;
}
/** 创建物料响应类型 */
interface CreateMaterialResponse {
code: number;
data: { id: string };
message: string;
}
/** 删除物料响应类型 */
interface DeleteMaterialResponse {
code: number;
data: { id: string };
message: string;
}
/**
*
* @param params
* @returns
*/
export const getMaterialsList = async (
params?: Record<string, any>
): Promise<MaterialResponse> => {
const response = await instance.get('/api/v1/materials', { params });
return response.data;
};
export const createMaterials = async (data: any) => {
const response = await instance.post('/api/v1/materials', data);
/**
* ID获取单个物料
* @param id ID
* @returns
*/
export const getMaterials = async (id: number): Promise<MaterialResponse> => {
const response = await instance.get(`/api/v1/materials/${id}`);
return response.data;
};
export const updateMaterials = async (id: string, data: any) => {
const response = await instance.put(`/api/v1/materials/${id}`, data);
type MaterialData = {
project_id: number;
value: Record<string, MaterialDescription>;
// 从原interface合并的字段
id?: number;
name?: string;
created_at?: string;
updated_at?: string;
};
function transformMaterialData(data: MaterialData) {
return {
...data,
value: JSON.stringify(data.value)
};
}
/**
*
* @param data value JSON
* @example
* postMaterials({ project_id: 1, value: '{"Authorization": "Bearer token"}' })
*/
export const postMaterials = async (
data: MaterialData
): Promise<CreateMaterialResponse> => {
const response = await instance.post(
'/api/v1/materials',
transformMaterialData(data)
);
return response.data;
};
export const deleteMaterials = async (id: string) => {
const response = await instance.delete(`/api/v1/materials/${id}`);
/**
*
* @param project_id ID
* @returns
* @example
* deleteMaterial('123').then(() => console.log('删除成功'))
*/
export const deleteMaterials = async (
project_id: number
): Promise<DeleteMaterialResponse> => {
const response = await instance.delete(`/api/v1/materials/${project_id}`);
return response.data;
};

View File

@ -7,10 +7,11 @@ import {
type ExtensionConfig,
type PageFile,
type BlockFile,
type NodeFromPlugin,
ProjectModel,
HistoryModel
} from '@vtj/core';
import { Storage, mapToObject } from '@vtj/utils';
import { mapToObject, Storage } from '@vtj/utils';
import { BaseService } from '@vtj/renderer';
import {
getProject,
@ -20,16 +21,18 @@ import {
getFile as getLowCodeFile,
deleteFile as deleteLowCodeFile,
getHistory as getLowCodeHistory,
updateHistory as updateLowCodeHistory,
deleteHistory as deleteLowCodeHistory,
getHistories as getLowCodeHistories,
createHistory as createLowCodeHistory,
getHistories
getHistories as getLowCodeHistories,
publishFile as publishLowCodeFile,
publishAllFile as publishLowCodeAllFile,
getMaterials as getLowCodeMaterials,
postMaterials as postLowCodeMaterials,
deleteMaterials as deleteLowCodeMaterials
} from '@/io';
const storage = new Storage({
type: 'local',
expired: 0
// prefix: '__VTJ_'
});
const stringifyFields = [
@ -46,7 +49,6 @@ export class LowCodeService extends BaseService {
const remoteProject = await getProject('2');
const model = new ProjectModel(remoteProject);
const dsl = model.toDsl();
storage.save(`project_${model.id}`, dsl);
return Promise.resolve(dsl);
}
@ -56,7 +58,7 @@ export class LowCodeService extends BaseService {
return Promise.resolve(extension as ExtensionConfig | undefined);
}
public saveProject(project: ProjectSchema): Promise<boolean> {
public async saveProject(project: ProjectSchema): Promise<boolean> {
const newProject = {
...project,
...Object.fromEntries(
@ -65,18 +67,34 @@ export class LowCodeService extends BaseService {
.map(([key, value]) => [key, JSON.stringify(value)])
)
};
updateProject('2', newProject);
const model = new ProjectModel(project);
storage.save(`project_${model.id}`, model.toDsl());
await updateProject('2', newProject);
return Promise.resolve(true);
}
public saveMaterials(
public getPluginMaterial(
from: NodeFromPlugin
): Promise<MaterialDescription | null> {
return Promise.resolve(null);
}
// TODO: 物料存储只有在发布为其他端 (比如 uinapp) 时才有用,当前版本时不需要的,暂且保留
public async saveMaterials(
project: ProjectSchema,
materials: Map<string, MaterialDescription>
): Promise<boolean> {
storage.save(`materials_${project.id}`, mapToObject(materials));
console.log('saveMaterials', materials);
const materialData = mapToObject(materials);
storage.save(`materials_${project.id}`, materialData);
console.log('saveMaterials', materialData);
// @ts-ignore
const existMaterials = await getLowCodeMaterials(project?.id);
console.log('existMaterials', existMaterials);
await postLowCodeMaterials({
// @ts-ignore
project_id: project?.id,
value: materialData
});
// @ts-ignore
await deleteLowCodeMaterials(project.id);
return Promise.resolve(true);
}
@ -132,7 +150,7 @@ export class LowCodeService extends BaseService {
}
public api = (type: string, data: any): Promise<any> => {
console.log('api', type, data);
// console.log('api', type, data);
return Promise.resolve(true);
};
@ -147,7 +165,7 @@ export class LowCodeService extends BaseService {
}
public async getHistory(fileId: string): Promise<HistorySchema> {
const histories = await getHistories({
const histories = await getLowCodeHistories({
project_id: 2,
file_id: fileId,
per_page: 50
@ -175,7 +193,7 @@ export class LowCodeService extends BaseService {
fileId: string,
historyItem: HistoryItem
): Promise<boolean> {
const saveHistory = await createLowCodeHistory({
await createLowCodeHistory({
project_id: 2,
file_id: fileId,
history_id: historyItem.id,
@ -189,8 +207,10 @@ export class LowCodeService extends BaseService {
return Promise.resolve(true);
}
public publish(project: ProjectSchema): Promise<boolean> {
console.log('整站发布 project', project);
return Promise.resolve(true);
return publishLowCodeAllFile(Number(project.id)).then((res) => {
console.log('整站发布', res);
return Promise.resolve(true);
});
}
public publishFile(
@ -198,6 +218,9 @@ export class LowCodeService extends BaseService {
file: PageFile | BlockFile
): Promise<boolean> {
console.log('发布页面', project, file);
return Promise.resolve(true);
return publishLowCodeFile(file.id).then((res) => {
console.log('发布页面', res);
return Promise.resolve(true);
});
}
}