npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ithinkdt/lowcode

v4.0.5

Published

iThinkDT Lowcode

Readme

@ithinkdt/lowcode

许可证

MIT

安装

npm i @ithinkdt/lowcode

需要您自行安装 peer 依赖 vue@>=3.5vue-router@>=4.5@ithinkdt/ui@>=4.0@ithinkdt/page@>=4.0ithinkdt-ui@>=1.8

介绍

@ithinkdt/lowcode 提供 iThinkDT 低代码页面搭建、运行渲染与实体建模能力,包括:

  • 低代码页面 Schema 定义与运行时渲染
  • 可视化页面搭建工作台
  • 物料体系(容器、通用展示、表单、低代码业务组件)
  • 状态定义(变量、请求、实体)
  • 动作定义(脚本方法)
  • 表达式、函数、字典、接口数据、图标等动态绑定
  • 实体模型、字段、索引、关系定义
  • 实体关系图设计器
  • 根据实体字段生成表单、查询表单、详情表单的辅助工具

核心概念

Schema

低代码页面由 LcSchema 描述:

import type { LcSchema } from '@ithinkdt/lowcode'

const schema: LcSchema = {
    name: '用户列表',
    state: [],
    methods: [],
    css: '.root { padding: 16px; }',
    css2: '.h5 .root { padding: 12px; }',
    tree: {
        id: 'root',
        type: 'RootContainer',
        label: '页面',
        container: true,
        props: {
            id: 'root',
            xScrollable: false,
        },
        css: '.root { }',
        css2: '.h5 .root { }',
        listeners: [],
        children: {
            default: [],
        },
    },
}

节点

每个页面节点由 LcNode 描述,核心字段包括:

| 字段 | 说明 | |------|------| | id | 节点唯一标识,也会作为默认 class | | type | 物料类型,如 ButtonInputFormContainer | | label | 工作台显示名称 | | props | 组件属性,支持表达式 | | css / css2 | Web / H5 样式 | | listeners | 事件绑定 | | children | 插槽子节点 | | container | 是否为容器 | | form | 是否为表单节点 |

页面工作台

LowcodeEngineWorkbench 用于可视化搭建页面。通常项目会把平台接口、文件服务、图标选择器、物料、状态定义、动作定义等注入到工作台引擎。

import { defineComponent, ref } from 'vue'
import { LowcodeEngineWorkbench, entity, request, script, variable } from '@ithinkdt/lowcode/engine/workbench'
import {
    base,
    button,
    flex,
    form,
    input,
    number,
    root,
    select,
    submitForm,
    text,
} from '@ithinkdt/lowcode/materials/workbench'

export default defineComponent({
    setup() {
        const terminal = ref<'WEB' | 'MOBILE'>('WEB')

        const engine = new LowcodeEngineWorkbench({
            getDictTypes: async () => [
                { label: '状态', value: 'status' },
            ],
            getApis: async () => [],
            getApi: async code => undefined,
            icons: {
                renderer: props => <IconSelect {...props} />,
            },
            file: {
                removeFile: async id => {},
                getFileInfos: async ids => [],
                previewFileUrl: id => `/api/files/${id}/preview`,
                downloadFileUrl: id => `/api/files/${id}/download`,
                uploadFile: async file => '',
            },
            materials: {
                container: {
                    label: '容器组件',
                    materials: [
                        root,
                        base,
                        flex,
                        form({ getEntities: async () => [] }),
                    ],
                },
                common: {
                    label: '通用组件',
                    materials: [
                        text,
                        button,
                    ],
                },
                form: {
                    label: '表单组件',
                    materials: [
                        input,
                        number,
                        select,
                        submitForm,
                    ],
                },
            },
            stateDefinitions: [
                variable,
                request,
                entity({ api: entityApi }),
            ],
            methodDefinitions: [
                script,
            ],
            providers: {
                msg: window.$msg,
                fetch,
            },
        })

        function save() {
            const schema = engine.toJSON()
            return fetch('/api/pages', {
                method: 'POST',
                body: JSON.stringify(schema),
            })
        }

        return () => (
            <engine.Workbench
                terminal={terminal.value}
                onSubmit={save}
                style={{ height: '100%' }}
            />
        )
    },
})

常用工作台方法

// 设置或重置 Schema
await engine.setSchema(schema)

// 导出完整 Schema
const schema = engine.toJSON()

// 创建节点并插入页面
const node = engine.createNode('Button', {
    label: '保存按钮',
    props: {
        text: '保存',
    },
})
engine.insertNode(node)

// 定义状态与动作
await engine.addState('form', 'var', '表单数据', {
    content: 'function getter() { return {} }',
})

await engine.addMethod('submit', 'script', '提交表单', {
    script: `export default async function submit() {
        await $fetch('/api/users', { method: 'POST', body: $state.form })
        $msg.success('保存成功')
    }`,
})

// 撤销、重做
engine.undo()
engine.redo()

页面渲染器

LowcodeEngineRenderer 用于在运行期渲染已保存的 Schema。运行期使用 @ithinkdt/lowcode/materials/renderer 中的组件定义。

import { defineComponent } from 'vue'
import { LowcodeEngineRenderer, entity, request, script, variable } from '@ithinkdt/lowcode/engine/renderer'
import {
    base,
    button,
    flex,
    form,
    input,
    root,
    submitForm,
    text,
} from '@ithinkdt/lowcode/materials/renderer'

export default defineComponent({
    props: {
        schema: { type: Object, required: true },
    },
    setup(props) {
        const engine = new LowcodeEngineRenderer({
            schema: props.schema,
            components: [
                root,
                base,
                flex,
                form,
                text,
                button,
                input,
                submitForm,
            ],
            stateDefinitions: [
                variable,
                request,
                entity({ api: entityApi }),
            ],
            methodDefinitions: [
                script,
            ],
            providers: {
                msg: window.$msg,
                fetch,
            },
            getApi: async code => undefined,
        })

        return () => <engine.Renderer />
    },
})

运行期更新 Schema

await engine.setSchema(nextSchema)

渲染器会重新应用状态、动作、节点树与样式,并在组件卸载时自动清理运行时注入。

物料

@ithinkdt/lowcode 将物料分为工作台物料和运行期组件:

| 入口 | 用途 | |------|------| | @ithinkdt/lowcode/materials/workbench | 工作台左侧可拖拽物料与属性面板配置 | | @ithinkdt/lowcode/materials/renderer | 运行期渲染组件 | | @ithinkdt/lowcode/materials | 物料类型声明 |

内置物料

| 分类 | 物料 | |------|------| | 容器 | RootContainerBaseContainerFlexContainerFormContainerFormItemDialogContainerDrawerContainerTabsContainer | | 通用 | TextButtonIconFileBtnDividerLinkHeadlineDataTablePaginTreeQrCodeImageImageGroup | | 表单 | InputPasswdTextareaNumberSwitchCheckboxDateDatetimeTimeSelectTransferRadiosCheckboxesColorRateSliderTagsUploadRichTextTreeSelectCascaderEditTableUserDeptSerialNo | | 低代码 | QueryFormSubmitForm |

组装物料

import {
    base,
    button,
    date,
    flex,
    form,
    input,
    root,
    serialNo,
    table,
    text,
    userDept,
} from '@ithinkdt/lowcode/materials/workbench'

const materials = {
    container: {
        label: '容器组件',
        materials: [
            root,
            base,
            flex,
            form({ getEntities: async () => [] }),
        ],
    },
    common: {
        label: '通用组件',
        materials: [
            text,
            button,
            table,
        ],
    },
    form: {
        label: '表单组件',
        materials: [
            input,
            date,
            userDept({
                users,
                groups,
                depts,
                getUsersByGroup,
                getUsersByDept,
                getUsersByUsername,
                getDeptsByCode,
            }),
            serialNo({
                getSerials,
                getSerialNo,
            }),
        ],
    },
}

自定义物料

import type { LcMaterial } from '@ithinkdt/lowcode/engine'

export const notice: LcMaterial<'Notice'> = {
    key: 'Notice',
    name: '提示',
    icon: NoticeIcon,
    component: Notice,
    props: {
        type: 'info',
        text: '提示内容',
    },
    css: () => ({
        margin: '8px 0',
    }),
    items: () => [
        { label: '类型', prop: 'type', type: 'select' },
        { label: '内容', prop: 'text', type: 'input' },
    ],
}

如果需要获得完整类型提示,可以扩展 LcMaterials

import type { LcMaterial } from '@ithinkdt/lowcode/engine'

declare module '@ithinkdt/lowcode/materials' {
    interface LcMaterials {
        Notice: LcMaterial<'Notice'>
    }
}

表达式与脚本

节点属性支持 {{ ... }} 表达式。运行时会注入:

| 变量 | 说明 | |------|------| | $state | 低代码状态 | | $methods | 低代码动作 | | $refs | 节点引用 | | $MODE | DEVPROD | | $TERMINAL | WEBH5 | | $<provider> | 构造引擎时传入的 providers,如 $msg$fetch |

常用表达式:

// 普通表达式
node.props.title = '{{ $state.form.name || "未命名" }}'

// 函数表达式
node.props.onClick = '{{ Fn: function onClick() { $methods.submit() } }}'

// 字典
node.props.options = '{{ Dict: status }}'

// 接口数据
node.props.options = '{{ ApiData: {"key":"userOptions","params":"({})","path":"data"} }}'

// 图标
node.props.icon = '{{ Icon: {"body":"data:image/svg+xml;base64,...","svg":true} }}'

脚本动作需要默认导出一个函数:

export default async function submit() {
    await $fetch('/api/users', {
        method: 'POST',
        body: $state.form,
    })
    $msg.success('保存成功')
}

状态与动作定义

内置状态

| 状态 | 工作台入口 | 渲染器入口 | 说明 | |------|------------|------------|------| | variable | @ithinkdt/lowcode/engine/workbench | @ithinkdt/lowcode/engine/renderer | 普通变量状态 | | request | @ithinkdt/lowcode/engine/workbench | @ithinkdt/lowcode/engine/renderer | 请求状态 | | entity | @ithinkdt/lowcode/engine/workbench | @ithinkdt/lowcode/engine/renderer | 实体数据状态 |

内置动作

| 动作 | 说明 | |------|------| | script | JavaScript / TypeScript 脚本动作 |

实体 API 适配

实体状态依赖 EntityApi,用于把模型 CRUD 能力接入低代码状态:

import { entity } from '@ithinkdt/lowcode/engine/renderer'

const entityState = entity({
    api: entityApi,
})

EntityApi 需要提供 fetchOnefetchListfetchPagepostOneputOnedeleteOnedeleteBatch 等方法。

实体设计器

EntityDesigner 提供实体、字段、索引、关系的可视化设计能力。

<script setup lang="ts">
import { ref } from 'vue'
import {
    EntityDesigner,
    type EntityDesignerInst,
    type DesignerTool,
} from '@ithinkdt/lowcode/entity/designer'
import type { Entity } from '@ithinkdt/lowcode/entity'

const designer = ref<EntityDesignerInst>()
const entities = ref<Entity[]>([])

const tools: DesignerTool[] = [
    {
        title: '刷新',
        type: 'primary',
        onClick: refresh,
    },
]

async function refresh() {
    entities.value = await fetch('/api/entities').then(res => res.json())
}

async function submit(nextEntities: Entity[]) {
    await fetch('/api/entities', {
        method: 'POST',
        body: JSON.stringify(nextEntities),
    })
    designer.value?.clear()
}
</script>

<template>
    <EntityDesigner
        ref="designer"
        class="size-full"
        app-code="admin"
        :entities="entities"
        :tools="tools"
        :get-dict-types="() => Promise.resolve([])"
        :get-serials="() => Promise.resolve([])"
        :support-languages="[
            { label: '简体中文', value: 'zh-CN' },
            { label: 'English', value: 'en-US' },
        ]"
        @submit="submit"
    />
</template>

实体模型

@ithinkdt/lowcode/entity 导出实体相关类型与常量:

| 导出 | 说明 | |------|------| | Entity | 实体定义 | | EntityField | 实体字段定义 | | EntityIndex | 实体索引定义 | | EntityRel | 实体关系定义 | | EntityFieldType | 字段类型枚举 | | RelType | 关系类型常量 | | patternMap | 常用字段格式正则 |

根据实体生成表单状态

createFormStateGetterByEntity 可根据实体字段生成表单、查询表单或详情表单的初始状态脚本。

import { createFormStateGetterByEntity } from '@ithinkdt/lowcode/materials/workbench'

await engine.addState('form', 'var', '表单数据', {
    resetable: false,
    content: createFormStateGetterByEntity(entity, 'form'),
})

await engine.addState('query', 'var', '查询条件', {
    resetable: false,
    content: createFormStateGetterByEntity(entity, 'query'),
})

await engine.addState('view', 'var', '详情数据', {
    resetable: false,
    content: createFormStateGetterByEntity(entity, 'view'),
})

API 参考

引擎

| 导出 | 说明 | |------|------| | LowcodeEngineCore | 工作台与渲染器公共基类 | | LowcodeEngineWorkbench | 可视化工作台引擎 | | LowcodeEngineRenderer | 运行期渲染引擎 | | LcSchema | 页面 Schema | | LcNode | 页面节点 | | LcMaterial | 工作台物料定义 | | LcComponent | 运行期组件定义 | | LcTemplate | 工作台模板定义 | | LcStateDefinition | 状态定义 | | LcMethodDefinition | 动作定义 | | getFieldFormMap | 实体字段到表单物料映射 | | getFieldQueryFormMap | 实体字段到查询物料映射 |

工作台构造参数

| 参数 | 说明 | |------|------| | materials | 物料分组 | | templates | 模板分组 | | getDictTypes | 获取字典类型 | | getApis / getApi | 获取接口列表与接口详情 | | icons.renderer | 图标选择器渲染函数 | | file | 文件上传、下载、预览、删除能力 | | stateDefinitions | 状态定义 | | methodDefinitions | 动作定义 | | providers | 注入脚本运行环境的外部能力 | | providerDocs | 工作台中展示的 provider 文档 | | mapPropItems / mapProItems | 扩展或改写属性面板配置 |

渲染器构造参数

| 参数 | 说明 | |------|------| | schema | 要渲染的页面 Schema | | components | 运行期组件列表 | | stateDefinitions | 状态定义 | | methodDefinitions | 动作定义 | | providers | 注入脚本运行环境的外部能力 | | getApi | 获取接口详情 |

导入路径

// 类型、实体工具、核心引擎类型
import { type LcSchema, type LcNode, type Entity } from '@ithinkdt/lowcode'

// 工作台
import { LowcodeEngineWorkbench, variable, request, entity, script } from '@ithinkdt/lowcode/engine/workbench'

// 渲染器
import {
    LowcodeEngineRenderer,
    variable as renderVariable,
    request as renderRequest,
    entity as renderEntity,
    script as renderScript,
} from '@ithinkdt/lowcode/engine/renderer'

// 物料类型
import type { LcMaterials } from '@ithinkdt/lowcode/materials'

// 工作台物料
import {
    root as wbRoot,
    base as wbBase,
    flex as wbFlex,
    form as wbForm,
    input as wbInput,
    button as wbButton,
} from '@ithinkdt/lowcode/materials/workbench'

// 运行期组件
import {
    root as renderRoot,
    base as renderBase,
    flex as renderFlex,
    form as renderForm,
    input as renderInput,
    button as renderButton,
} from '@ithinkdt/lowcode/materials/renderer'

// 实体模型
import { EntityFieldType, RelType } from '@ithinkdt/lowcode/entity'

// 实体设计器
import { EntityDesigner } from '@ithinkdt/lowcode/entity/designer'