You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Genie.jl是否有可用于现代网站上线的完整文档及全栈实操示例?

Genie.jl 全栈交互网站实现方案(含MySQL读写+下拉菜单组件)

首先明确:目前已有完整的原生实现路径可满足需求,无需依赖第三方拖拽类HTML编辑器,Genie生态内置的组件库、ORM工具即可完成从数据库交互到现代UI渲染的全流程。


前置依赖安装

需要安装的核心包如下:

  • Genie:Web核心框架
  • Stipple StippleUI:响应式前端组件库,内置下拉菜单等所有常用现代UI组件
  • SearchLight SearchLightMySQL:Genie官方ORM工具,直接对接MySQL数据库
  • MySQL:MySQL驱动
    安装命令(Julia包管理模式下执行):
pkg> add Genie Stipple StippleUI SearchLight SearchLightMySQL MySQL

完整实现步骤

步骤1:初始化Genie项目

执行命令生成标准化项目结构:
genie new ProductQueryApp
进入项目目录后启动Genie环境。

步骤2:配置MySQL连接并初始化数据表

  1. 打开项目下config/database.yml配置文件,填写你的MySQL连接地址、端口、用户名、密码、库名
  2. 生成数据表迁移脚本:
    SearchLight.new_migration("CreateProductsTable")
  3. 在生成的迁移脚本中定义表结构,示例字段如下:
module CreateProductsTable
using SearchLight, SearchLight.Migrations

function up()
  create_table(:products) do
    [
      primary_key()
      column(:name, :string, limit = 100, null = false)
      column(:category, :string, limit = 50, null = false)
      column(:price, :float, null = false)
    ]
  end
end

function down()
  drop_table(:products)
end
end
  1. 执行迁移完成数据表创建:
    SearchLight.migrate()
    你可以预先往products表中插入若干测试数据,用于后续下拉菜单联动测试。

步骤3:编写带下拉菜单的响应式页面

在项目根目录新建app.jl,写入以下核心代码:

using Genie, Genie.Renderer.Html, Stipple, StippleUI
using SearchLight, SearchLightMySQL
using ..ProductQueryApp.Products # 引入自动生成的Product模型

# 定义响应式数据模型
@reactive mutable struct PageModel <: ReactiveModel
  # 下拉菜单可选分类列表,支持从数据库动态读取
  category_options::R{Vector{String}} = ["请选择分类", "电子产品", "家居用品", "办公设备"]
  # 用户选中的下拉菜单值
  selected_category::R{String} = "请选择分类"
  # 对应分类下的产品列表,随下拉选中值联动更新
  product_list::R{Vector{String}} = []
  # 新增产品输入框绑定值
  new_product_name::R{String} = ""
  new_product_price::R{Float64} = 0.0
end

# 绑定下拉菜单选中事件:选中后自动查询MySQL对应分类的产品
@onchange selected_category model begin
  if model.selected_category[] != "请选择分类"
    products = find(Product, where = ["category = ?", model.selected_category[]])
    model.product_list[] = [p.name for p in products]
  else
    model.product_list[] = []
  end
end

# 绑定新增产品按钮事件:将用户输入写入MySQL
@event("add_new_product") function (model)
  if !isempty(model.new_product_name[]) && model.new_product_price[] > 0 && model.selected_category[] != "请选择分类"
    new_product = Product(
      name = model.new_product_name[],
      category = model.selected_category[],
      price = model.new_product_price[]
    )
    save!(new_product)
    # 刷新产品列表
    products = find(Product, where = ["category = ?", model.selected_category[]])
    model.product_list[] = [p.name for p in products]
    # 清空输入框
    model.new_product_name[] = ""
    model.new_product_price[] = 0.0
  end
end

# 页面路由
route("/") do
  model = PageModel()
  # 页面结构完全用StippleUI组件实现,内置样式符合现代设计规范
  page(model, class = "container mx-auto p-8 max-w-3xl", [
    h1("产品管理系统", class = "text-2xl font-bold mb-6")
    # 下拉菜单组件
    StippleUI.select(
      label = "选择产品分类",
      :selected_category,
      options = :category_options,
      class = "w-full mb-6"
    )
    # 新增产品表单
    Card(class = "mb-6 p-4", [
      h3("新增产品", class = "text-lg font-semibold mb-3")
      textfield("产品名称", :new_product_name, class = "w-full mb-3")
      numberfield("产品价格", :new_product_price, class = "w-full mb-3")
      btn("提交新增", @click("add_new_product"), color = "primary")
    ])
    # 产品列表展示区域,选中分类后自动显示
    Card(showif = !isempty(:product_list), class = "p-4", [
      h3("该分类下的产品", class = "text-lg font-semibold mb-3")
      list(:product_list, bordered = true)
    ])
  ]) |> html
end

# 启动服务,访问http://localhost:8000即可使用
up(8000, async = false)

部署说明

  • 本地测试直接运行julia app.jl即可访问
  • 生产环境可配合Nginx做反向代理,配置进程守护即可上线
  • 所有UI组件均内置Tailwind风格样式,无需额外编写CSS即可达到现代网页设计效果,也可自定义样式参数调整布局

内容的提问来源于stack exchange,提问作者TLJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:48:03