前端学习路径

准备工作

  • 环境准备-1h
    安装基础环境,需要Node和PNPM如果已经安装检查对应版本,体验阶段建议版本保持一致

  • 克隆一个空工程-0.5h
    全新工程

  • 注意事项-0.5h
    静态资源解压,如果还没有对应的后端服务。可以使用:https://demo.oinone.top(Oinone演示环境),账号密码:admin/admin

前端基础

前端进阶

最后一步

当您实现玩基础和进阶的所有的效果,Oinone的整体使用您已经大致掌握了,接下来您可以找一个当前业务的场景来实现它把!

Oinone社区 作者:王海明原创文章,如若转载,请注明出处:https://doc.oinone.top/other/21654.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
王海明's avatar王海明数式管理员
Previous 2025年9月1日 pm2:16
Next 2025年9月4日 pm4:55

相关推荐

  • 无代码环境准备并快速启动

    注意: 启动无代码的过程中如果出现问题,请先在 常见问题 中寻找答案。如仍未解决,请及时在群里咨询。 视频教程(点此观看) docker安装从3分35秒开始 MySQL安装从6分30秒开始 部署无代码从21分50秒开始 一、进入服务器 ssh 用户名@服务器ip # 举例:ssh root@192.168.0.121 二、安装 Docker 1. 判断是否已安装 Docker docker -v 如果出现 Docker 版本号,说明已安装 Docker,如下图: 没有安装时显示如下图: 2. 安装并启动 Docker 已安装了 Docker:执行以下命令启动 Docker(未安装则忽略此步骤) # 启动 Docker systemctl start docker # 查看是否启动成功 docker -v 未安装 Docker 的情况:依次执行以下操作 # 删除原有版本 yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine yum install -y yum-utils yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo #提示 如果 docker 源异常,可以改用阿里云源: #yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 启动 Docker systemctl start docker # 查看是否启动成功 docker -v 3. 检查 Docker 是否启动成功 sudo systemctl status docker 出现如下图表示启动成功: 三、安装 MySQL 1. 判断是否已安装 MySQL mysql –version 如果出现 MySQL 版本号,说明已安装 MySQL。 没有安装会显示如下图: 2. 安装并启动 MySQL 查看服务器 glibc 版本 ldd –version 查看结果,如图: 下载 MySQL 压缩包 官网下载:MySQL 下载地址 在服务器上创建用户组和用户 # 添加用户组 groupadd mysql # 创建 MySQL 用户并添加到用户组 useradd -g mysql mysql 切换到mysql用户下 su mysql 上传mysql压缩包到服务器 # 注意:以下命令在新开的一个本地命令行执行,不进入服务器! scp path/to/your/mysql-8.0.40-linux-glibc2.17-x86_64.tar.xz(替换成本地电脑mysql压缩包的实际地址) username@ip_address:/home/mysql(替换成想要上传在服务器上的具体地址) 已经将mysql压缩包上传到服务器的某个文件夹成功之后,进入服务器的该文件内查看压缩包是否已经存在,执行ls,如图: 上传成功后,在服务器上解压 tar -Jxvf mysql-8.0.40-linux-glibc2.17-x86_64.tar.xz # 解压 MySQL 压缩包 创建软链 ln -s path/to/your/mysql-8.0.40-linux-glibc2.17-x86_64 mysql # 创建软链 进入mysql目录 cd mysql 配置文件与目录创建 MySQL 服务启动项很多,一般不通过命令行输入,而是写在配置文件中,启动时指定配置文件即可。如果没有指定配置文件,则会去 /etc/my.cnf 等默认路径下找配置文件。这里直接指定自己创建的配置文件,把一切都掌握在自己手里。 vi my.cnf # 执行此命令,然后写入以下配置 [mysqld] basedir=/home/mysql/mysql (改成mysql具体路径) datadir=/home/mysql/mysql/data/ (改成data具体路径) socket=/tmp/mysql.sock character-set-server=UTF8MB4…

    2024年10月30日
    2.1K00
  • 前端自定义组件之锚点分组

    本文将讲解如何通过自定义,实现锚点组件。这个锚点组件会根据界面设计器拖入的分组,动态解析出锚点。 实现路径 整体的实现思路是界面设计器拖个容器类的组件(这里以选项卡为例),自定义这个选项卡,往选项卡里拖拽的每个分组,每个锚点的名称是分组的标题。 1. 界面设计器拖出页面 我们界面设计器拖个选项卡组件,然后在选项页里拖拽任意多个分组。完成后点击右上角九宫格,选中选项卡,填入组件 api 名称,作用是把选项卡切换成我们自定义的锚点分组组件,这里的 api 名称和自定义组件的 widget 对应。最后发布页面,并绑定菜单。 2. 组件实现 widget 组件重写了选项卡,核心函数 renderGroups,通过 DslRender.render 方法渲染界面设计器拖拽的分组。 import { BasePackWidget, DslDefinition, DslRender, SPI, Widget } from '@oinone/kunlun-dependencies'; import TabsParseGroup from './TabsParseGroup.vue'; function fetchGroupChildren(widgets?: DslDefinition[], level = 1): DslDefinition[] { if (!widgets) { return []; } const children: DslDefinition[] = []; for (const widget of widgets) { if (widget.widget === 'group') { children.push(widget); } else if (level >= 1) { fetchGroupChildren(widget.widgets, level – 1).forEach((child) => children.push(child)); } } return children; } @SPI.ClassFactory( BasePackWidget.Token({ widget: 'TabsParseGroup' }) ) export class TabsParseGroupWidget extends BasePackWidget { public initialize(props) { super.initialize(props); this.setComponent(TabsParseGroup); return this; } // 获取分组的子元素 public get groupChildren(): DslDefinition[] { return fetchGroupChildren(this.template?.widgets); } @Widget.Reactive() public get groupTitles() { return this.groupChildren.map((group) => group.title); } // 根据容器子元素渲染左侧 @Widget.Method() public renderGroups() { if (this.groupChildren && this.groupChildren.length) { return this.groupChildren.map((group) => DslRender.render(group)); } } } vue组件核心内容是用component :is属性,渲染出配置的分组组件 <template> <div class="TabsParseGroup"> <a-anchor :affix="false"> <a-anchor-link v-for="(item, index) in groupTitles" :href="`#default-group-${index}`" :title="item" /> </a-anchor> <div v-for="(item, index) in groupComponents" :id="`default-group-${index}`"> <component :is="item" /> </div> </div> </template> <script lang="ts"> import { computed, defineComponent, PropType } from 'vue'; export default…

    2025年7月8日
    63700
  • 后端部署启动常见问题

    1、Windows启动如出现以下报错,直接点击 JAR manifest 即可 2、出现“未经许可授权模块无法访问" 报错: 原因: 有可能是因为jdk版本低于1.8_221版本。 解决方式: (1) 可以重装jdk,选择安装包里面提供的 (2) 低于1.8_221版本的需要覆盖掉jce, 原因:https://www.cnblogs.com/jinloooong/p/10619353.htmljce可以在这里下载, https://doc.oinone.top/install/backendinstall/13760.html 如果以上解决方式仍无效,请联系数式员工。 3、出现“境信息检查不通过,请根据以上提示信息进行修改" 报错: 原因: 新版本加了环境检验,同base库同Redis下中间件和版本不一致导致的校验失败 查看具体原因: 在看到报错信息后,日志向前翻(即看更早的日志)会看到错误的环境信息 ,有打印出具体的环境不一致的信息 解决方式: 需要保持同环境下的版本、中间件配置等一致 4、出现“创建数据库错误" 报错: 原因: 可能是因为开了防火墙,导致连接不上数据库 解决方式: 关闭防火墙:systemctl stop firewalld 或者放开对应的端口 5、出现“公共环境开启了元数据保护模式" Caused by: java.lang.UnsupportedOperationException: 公共环境开启了元数据保护模式,本地开发环境需配置 [pamirs.distribution.session.ownSign] at pro.shushi.pamirs.boot.standard.service.MetadataProtectedChecker.unsupportedLocalOperation(MetadataProtectedChecker.java:70) at pro.shushi.pamirs.boot.standard.service.MetadataProtectedChecker.process(MetadataProtectedChecker.java:63) at pro.shushi.pamirs.boot.common.spi.service.boot.DefaultBootModuleLifecycleBegin.run(DefaultBootModuleLifecycleBegin.java:35) at pro.shushi.pamirs.boot.common.process.PamirsBootMainProcessor.lambda$installOrLoad$2(PamirsBootMainProcessor.java:89) at pro.shushi.pamirs.boot.common.spi.api.boot.BootModuleLifecycleAroundApi.run(BootModuleLifecycleAroundApi.java:30) at pro.shushi.pamirs.boot.common.process.PamirsBootMainProcessor.installOrLoad(PamirsBootMainProcessor.java:66) at pro.shushi.pamirs.boot.common.initial.PamirsBootMainInitial.installOrLoad(PamirsBootMainInitial.java:119) at java.util.concurrent.CompletableFuture$AsyncRun.run$$$capture(CompletableFuture.java:1640) at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java) at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1632) at java.util.concurrent.ForkJoinTask.doExec$$$capture(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175) 原因: 共环境下元数据保护机制正常的保护提示,防止元数据被意外修改 解决方式: (1) 测试环境启动或体验阶段,可在启动配置增加【程序实参 (Program arguments)】-PmetaProtected=pamirs 后再进行启动。 (2) 多人协调场景参考 https://doc.oinone.top/oinone-faq/18544.html

    2024年10月31日
    2.7K00
  • 环境准备须知

    本地开发:本地使用idea开发,编写业务代码;服务器:用来部署无代码设计器的,安装docker、mysql等;本教程模拟的 本地是windows、 服务器是Centos的操作系统 注意事项条件 需要准备一台4核16G的Linux服务器 操作系统推荐CentOS 7.9 64位(其他兼容操作系统也可以) 1、互通性 ● 本地开发ip   能否调通   服务器ip   在本地执行命令:ping 192.168.0.121(替换成服务器ip) ● 部署docker的宿主机ip 能否调通 本地开发ip   进入服务器执行命令:ping 192.168.0.60(替换成自己的本地ip) 注意:推荐双向能互通,如果不通的话从无代码端访问本地数据会出现调用服务错误。 2、确定服务器系统架构 查看当前系统架构: 使用 arch(推荐使用) 或者uname -a 命令 x86_64:表示支持 AMD64 架构。 aarch64:表示支持 ARM64 架构 Oinone所有镜像均使用docker manifest支持amd64和arm64架构!(如果有其他架构请先联系数式人员确定能否使用) 注意!以上条件必须先明确好,再进入后面的部署。

    2024年10月30日
    1.6K00
  • 如何设计公用跳转动作(类似导入导出动作)

    背景 设计一个公共动作,在界面设计器可以拖到页面里,点击之后跳转指定页面。就像导入导出一样。 实现思路 元数据计算时,初始化跳转动作,为本模块以及依赖于本模块的所有模块生成该跳转动作。实现所有模型都有该跳转动作的元数据。 代码示例: package pro.shushi.pamirs.top.core.init; import com.google.common.collect.Lists; import org.apache.commons.collections4.MapUtils; import org.springframework.stereotype.Component; import pro.shushi.pamirs.boot.base.enmu.ActionTargetEnum; import pro.shushi.pamirs.boot.base.enmu.ActionTypeEnum; import pro.shushi.pamirs.boot.base.model.ViewAction; import pro.shushi.pamirs.boot.common.api.command.AppLifecycleCommand; import pro.shushi.pamirs.boot.common.extend.MetaDataEditor; import pro.shushi.pamirs.core.common.InitializationUtil; import pro.shushi.pamirs.meta.annotation.fun.extern.Slf4j; import pro.shushi.pamirs.meta.api.dto.meta.Meta; import pro.shushi.pamirs.meta.api.dto.meta.MetaData; import pro.shushi.pamirs.meta.domain.model.ModelDefinition; import pro.shushi.pamirs.meta.enmu.ActionContextTypeEnum; import pro.shushi.pamirs.meta.enmu.SystemSourceEnum; import pro.shushi.pamirs.meta.enmu.ViewTypeEnum; import pro.shushi.pamirs.top.api.TopModule; import pro.shushi.pamirs.top.api.model.Teacher; import java.util.*; import java.util.stream.Collectors; @Slf4j @Component public class DemoModuleAppInstall implements MetaDataEditor { @Override public void edit(AppLifecycleCommand command, Map<String, Meta> metaMap) { InitializationUtil util = InitializationUtil.get(metaMap, TopModule.MODULE_MODULE, TopModule.MODULE_NAME); if (util == null) { return; } if (MapUtils.isEmpty(metaMap)) { return; } Set<String> dependencyFileModels = metaMap.values().stream() .filter(v -> v.getData().containsKey(TopModule.MODULE_MODULE)) .map(Meta::getModule) .collect(Collectors.toSet()); for (String module : metaMap.keySet()) { if (!dependencyFileModels.contains(module)) { // 不依赖本模块,不生成跳转动作 continue; } Meta meta = metaMap.get(module); MetaData metaData = meta.getCurrentModuleData(); List<ModelDefinition> modelList = metaData.getDataList(ModelDefinition.MODEL_MODEL); for (ModelDefinition data : modelList) { makeDefaultModelViewAction(meta, data, dependencyFileModels); } } } // 跳转的xml模版 name public static final String DEFAULT_VIEW_NAME = "fixed_teacher_table"; private void makeDefaultModelViewAction(Meta meta, ModelDefinition data, Set<String> dependencyFileModels) { if (!dependencyFileModels.contains(data.getModule())) { // 当前模块使用了其他模块的模型,对方模块未依赖本模块,不生成跳转动作 return; } Map<String, Object> context = new HashMap<>(); context.put("model", "'" + data.getModel() + "'"); // 创建 跳转表格页面 viewAction,根据实际需求更改 makeDefaultViewAction(meta, data, "teacherListDialog", "教师表格", null, ActionContextTypeEnum.CONTEXT_FREE, ViewTypeEnum.TABLE, 99, Teacher.MODEL_MODEL, DEFAULT_VIEW_NAME,…

    2025年10月22日
    76100

Leave a Reply

Please Login to Comment