AppML 教程

AppML 教程

AppML(Application Markup Language,应用标记语言)是 W3Schools 开发的一种面向数据库应用的描述性语言,通过 HTML 标签声明式地定义数据应用,无需编写大量 JavaScript 代码,即可创建数据驱动的 Web 应用。

核心思想

用 HTML 标签描述"应用长什么样、数据从哪来",由 AppML 引擎自动完成数据获取、渲染与交互:

<appml data="customers">
  <searchbox/>
  <table></table>
  <updateform/>
</appml>

主要特性

  • 声明式开发:用标签而非代码构建应用
  • 数据驱动:内置数据模型与 CRUD 操作
  • 自动界面:自动生成表格、表单、搜索框
  • 多种数据源:JSON、XML、文本、数据库
  • 易于学习:HTML 基础即可上手

学习路线

  1. 如何引入与使用 AppML
  2. 下载与架构
  3. 参考手册与案例(原型/模型/模板)
  4. Employees/Customers/Products 综合案例

如何使用 AppML

如何使用 AppML

1. 引入 AppML

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>AppML 应用</title>
  <script src="appml.js"></script>
</head>
<body>
  <appml>
    <!-- 应用内容 -->
  </appml>
</body>
</html>

2. 第一个 AppML 应用

<appml data="customers">
  <table></table>
</appml>

其中 data="customers" 指定数据源,<table></table> 自动生成数据表格。

3. 数据源定义

// appml_data.js 或 JSON 文件
var customers = {
    data: [
        { name: "张三", city: "北京", country: "中国" },
        { name: "李四", city: "上海", country: "中国" }
    ]
};

4. 常用标签

<appml>          应用根容器
<searchbox/>     搜索框
<table></table>   数据表格
<updateform>     编辑表单
<insertform>     新增表单
<deletebutton>   删除按钮
<item></item>     单条记录视图
<list></list>     数据列表

5. 完整示例

<!DOCTYPE html>
<html>
<head>
  <script src="appml.js"></script>
</head>
<body>
  <h1>客户管理</h1>
  <appml data="customers">
    <searchbox/>
    <table></table>
    <updateform></updateform>
    <insertform></insertform>
  </appml>
</body>
</html>

AppML 下载

AppML 下载

1. 下载 AppML

# 官方地址
# https://www.w3schools.com/appml/
# 下载 appml.js(核心引擎)

# 或使用 CDN
<script src="https://www.w3schools.com/lib/appml.js"></script>

# 完整包包含
appml.js           核心引擎
appml_data.js      示例数据
appml_database.js  数据库示例
readme.txt         说明文档

2. 本地使用

# 项目结构
myapp/
├── index.html      主页面
├── appml.js        引擎
├── data.js         数据定义
└── css/style.css   样式(可选)

3. 引入顺序

<head>
  <!-- 先引入 AppML 引擎 -->
  <script src="appml.js"></script>
  <!-- 再引入数据 -->
  <script src="data.js"></script>
</head>

4. 数据文件示例

// data.js
var employees = {
    "data": [
        { "name": "王五", "dept": "技术部", "salary": 12000 },
        { "name": "赵六", "dept": "市场部", "salary": 9000 }
    ],
    "search": ["name"],          // 可搜索字段
    "sort": ["name"],            // 可排序字段
    "update": ["name", "dept", "salary"]  // 可编辑字段
};

5. 版本与兼容

# AppML 是轻量库,依赖原生 JavaScript
# 无外部依赖(不需要 jQuery)
# 兼容现代浏览器

# 注意:AppML 官方已停止更新
# 学习价值:理解声明式数据绑定的思想

AppML 架构

AppML 架构

1. 三层架构

┌──────────────────────────┐
│ 视图层(View)             │
│  AppML 标签 + HTML        │
├──────────────────────────┤
│ 模型层(Model)            │
│  数据定义 data + 配置      │
├──────────────────────────┤
│ 引擎层(AppML Engine)     │
│  数据获取、渲染、交互       │
└──────────────────────────┘

2. 数据流程

1. 页面加载 AppML 标签
2. 引擎读取 data 属性指定的数据源
3. 获取数据(JS 对象 / JSON / 数据库)
4. 渲染表格/表单/列表
5. 响应用户操作(搜索/排序/编辑/删除)
6. 变更写回数据源

3. 数据源类型

# 1. 全局 JS 变量
data="customers"

# 2. JSON 文件
data="https://example.com/data.json"

# 3. 服务器接口
data="api/customers"

# 4. 数据库(需配合服务器端)
# 通过 PHP/ASP 提供 JSON 接口

4. 组件结构

<appml data="employees">
  <!-- 功能组件 -->
  <searchbox/>          搜索
  <sortmenu/>           排序菜单
  <table></table>        数据表格
  <details></details>    详情视图
  <updateform></updateform> 编辑表单
  <insertform></insertform> 新增表单
  <deletebutton></deletebutton> 删除
</appml>

5. 配置化

// 数据对象可携带完整配置
var products = {
    "data": [ ... ],
    "search": ["name", "category"],   // 可搜索字段
    "order": [["name", "asc"]],       // 默认排序
    "headers": { "name": "产品名" },  // 表头映射
    "update": ["name", "price"],      // 可更新字段
    "insert": ["name", "price"],      // 可新增字段
    "delete": true                    // 允许删除
};

AppML 参考手册

AppML 参考手册

1. AppML 标签

标签作用
<appml>应用根容器
<searchbox/>搜索输入框
<sortmenu/>排序下拉菜单
<table></table>数据表格
<list></list>数据列表
<details></details>记录详情
<updateform></updateform>编辑表单
<insertform></insertform>新增表单
<deletebutton></deletebutton>删除按钮
<item></item>单条记录模板
<status></status>状态栏

2. AppML 属性

data           数据源名称/URL
model          模型名称
view           视图名称
controller     控制器名称
appname        应用名称
database       数据库名
table          数据表名

3. 数据对象配置

{
  "data": [...],         // 数据数组
  "search": [...],       // 可搜索字段
  "order": [...],        // 排序规则
  "sort": [...],         // 可排序字段
  "update": [...],       // 可编辑字段
  "insert": [...],       // 可新增字段
  "headers": {...},      // 表头映射
  "display": {...},      // 显示格式
  "delete": true,        // 允许删除
  "primary": "id"        // 主键字段
}

4. 控制器方法

// 数据操作
appml.search(text)
appml.sort(field, direction)
appml.update(record)
appml.insert(record)
appml.delete(record)

// 视图切换
appml.showTable()
appml.showDetails(record)
appml.showUpdateForm(record)

5. 显示格式

// display 配置
"display": {
    "salary": { "type": "currency", "currency": "¥" },
    "birthday": { "type": "date", "format": "YYYY-MM-DD" },
    "active": { "type": "boolean", "true": "启用", "false": "停用" }
}

AppML 案例简介

AppML 案例简介

1. 案例目标

通过一个完整的"客户管理"案例,演示 AppML 从数据定义到完整应用的全过程,涵盖:数据模型、原型、模板、增删改查。

2. 案例结构

案例分阶段:
1. 原型(Prototype):基本界面
2. 模型(Model):定义数据结构
3. 模板(Template):复用布局
4. Employees:员工管理完整版
5. Customers:客户管理完整版
6. Products:产品管理完整版
7. 未来(扩展方向)

3. 数据准备

// customers.json
{
  "data": [
    { "id": 1, "name": "张三", "city": "北京", "country": "中国" },
    { "id": 2, "name": "John", "city": "New York", "country": "USA" },
    { "id": 3, "name": "田中", "city": "东京", "country": "日本" }
  ]
}

4. 页面骨架

<!DOCTYPE html>
<html>
<head>
  <script src="appml.js"></script>
</head>
<body>
  <h1>客户管理案例</h1>
  <appml data="customers">
    <searchbox/>
    <table></table>
  </appml>
</body>
</html>

5. 运行效果

自动生成:
- 搜索框:输入即过滤数据
- 数据表格:显示所有字段
- 点击行:进入详情(可配置)
- 分页/排序:按配置启用

AppML 案例原型

AppML 案例原型

1. 原型目标

先做出最简可用的界面,验证数据能否正确展示与交互,再逐步完善。

2. 最小原型

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script src="appml.js"></script>
  <script src="customers.js"></script>
</head>
<body>
  <h1>客户列表(原型)</h1>
  <appml data="customers">
    <table></table>
  </appml>
</body>
</html>

3. 数据文件

// customers.js
var customers = {
    data: [
        { name: "张三", city: "北京", country: "中国" },
        { name: "李四", city: "上海", country: "中国" },
        { name: "John", city: "London", country: "UK" }
    ]
};

4. 增加搜索与详情

<appml data="customers">
  <searchbox/>            <!-- 搜索 -->
  <table></table>          <!-- 列表 -->
  <details></details>      <!-- 点击行显示详情 -->
</appml>

5. 原型验证要点

  • 表格是否正确渲染全部数据
  • 搜索是否实时过滤
  • 点击行是否显示详情
  • 中文字符是否正常显示(UTF-8)

AppML 案例模型

AppML 案例模型

1. 模型定义

模型(Model)定义数据的结构、字段、校验与展示规则,是应用的核心配置。

// customers.js
var customers = {
    "model": "customer",
    "primary": "id",
    "data": [
        { "id": 1, "name": "张三", "city": "北京", "country": "中国", "email": "zhang@example.com" },
        { "id": 2, "name": "李四", "city": "上海", "country": "中国", "email": "li@example.com" }
    ],
    "search": ["name", "city", "country"],
    "order": [["name", "asc"]],
    "headers": {
        "id": "编号",
        "name": "姓名",
        "city": "城市",
        "country": "国家",
        "email": "邮箱"
    },
    "update": ["name", "city", "country", "email"],
    "insert": ["name", "city", "country", "email"],
    "delete": true
};

2. 字段校验

// 每个字段可定义类型与校验
"fields": {
    "email": {
        "type": "email",
        "required": true,
        "message": "邮箱格式不正确"
    },
    "id": {
        "type": "number",
        "editable": false
    },
    "country": {
        "type": "select",
        "options": ["中国", "美国", "日本", "英国"]
    }
}

3. 显示格式

"display": {
    "id": { "show": false },     // 隐藏主键
    "salary": { "type": "currency", "currency": "¥" },
    "hireDate": { "type": "date", "format": "YYYY-MM-DD" }
}

4. 模型与视图分离

// 一个模型多个视图(按需配置)
var customers = {
    "model": "customer",
    "view": {
        "table": { "fields": ["id", "name", "city"] },
        "details": { "fields": ["id", "name", "city", "country", "email"] },
        "form": { "fields": ["name", "city", "country", "email"] }
    },
    ...
};

AppML 案例模板

AppML 案例模板

1. 模板概念

模板(Template)定义统一的页面布局与样式,让多个应用共用外观,保持界面一致。

2. 页面模板

<!-- template.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="appml.css">
  <script src="appml.js"></script>
</head>
<body>
  <header>
    <h1>管理系统</h1>
    <nav>
      <a href="employees.html">员工管理</a>
      <a href="customers.html">客户管理</a>
      <a href="products.html">产品管理</a>
    </nav>
  </header>
  <main>
    <appml data="customers">...</appml>
  </main>
  <footer>Copyright © 2026</footer>
</body>
</html>

3. 样式模板

/* appml.css */
body { font-family: sans-serif; margin: 0; }
header { background: #2c3e50; color: #fff; padding: 12px 20px; }
nav a { color: #fff; margin-right: 15px; text-decoration: none; }
main { padding: 20px; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background: #f2f2f2; }
input[type="text"] { padding: 6px; margin: 4px; }

4. 复用组件

<!-- 使用模板引擎或服务端包含复用头部 -->
<!-- 简单方式:每个页面复制头部 + 改 appml data -->

<!-- employees.html -->
<appml data="employees">
  <searchbox/>
  <table></table>
</appml>

<!-- customers.html -->
<appml data="customers">
  <searchbox/>
  <table></table>
</appml>

AppML 案例 Employees

AppML 案例 Employees

1. 员工数据模型

// employees.js
var employees = {
    "model": "employee",
    "primary": "id",
    "data": [
        { "id": 1, "name": "王五", "dept": "技术部", "salary": 15000, "hireDate": "2020-03-15" },
        { "id": 2, "name": "赵六", "dept": "市场部", "salary": 12000, "hireDate": "2021-07-01" },
        { "id": 3, "name": "孙七", "dept": "人事部", "salary": 10000, "hireDate": "2022-01-20" }
    ],
    "search": ["name", "dept"],
    "order": [["dept", "asc"]],
    "headers": {
        "id": "编号",
        "name": "姓名",
        "dept": "部门",
        "salary": "薪资",
        "hireDate": "入职日期"
    },
    "display": {
        "salary": { "type": "currency", "currency": "¥" },
        "hireDate": { "type": "date", "format": "YYYY-MM-DD" }
    },
    "update": ["name", "dept", "salary"],
    "insert": ["name", "dept", "salary"],
    "delete": true
};

2. 员工页面

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script src="appml.js"></script>
  <script src="employees.js"></script>
</head>
<body>
  <h1>员工管理</h1>
  <appml data="employees">
    <searchbox/>
    <sortmenu/>
    <table></table>
    <details></details>
    <updateform></updateform>
    <insertform></insertform>
    <deletebutton></deletebutton>
  </appml>
</body>
</html>

3. 员工管理功能

  • 搜索:按姓名、部门过滤
  • 排序:按部门、薪资排序
  • 详情:点击行查看完整信息
  • 编辑:修改姓名/部门/薪资
  • 新增:添加新员工
  • 删除:移除员工记录

4. 部署注意

# 数据保存
# 纯前端时数据修改只在内存
# 持久化需后端接口支持

// 配置服务器端
var employees = {
    "data": "api/employees",       // 数据接口
    "updateURL": "api/employees/update",
    "insertURL": "api/employees/insert",
    "deleteURL": "api/employees/delete"
};

AppML 案例 Customers

AppML 案例 Customers

1. 客户数据模型

// customers.js
var customers = {
    "model": "customer",
    "primary": "id",
    "data": [
        { "id": 1, "name": "张三", "company": "科技有限公司", "city": "北京", "country": "中国", "email": "zhang@example.com" },
        { "id": 2, "name": "李四", "company": "贸易有限公司", "city": "上海", "country": "中国", "email": "li@example.com" },
        { "id": 3, "name": "John Smith", "company": "Tech Corp", "city": "London", "country": "UK", "email": "john@example.com" }
    ],
    "search": ["name", "company", "city", "country"],
    "order": [["name", "asc"]],
    "headers": {
        "id": "编号", "name": "姓名", "company": "公司",
        "city": "城市", "country": "国家", "email": "邮箱"
    },
    "update": ["name", "company", "city", "country", "email"],
    "insert": ["name", "company", "city", "country", "email"],
    "delete": true
};

2. 客户页面

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script src="appml.js"></script>
  <script src="customers.js"></script>
</head>
<body>
  <h1>客户管理</h1>
  <appml data="customers">
    <searchbox/>
    <table></table>
    <details></details>
    <updateform></updateform>
    <insertform></insertform>
    <deletebutton></deletebutton>
  </appml>
</body>
</html>

3. 高级配置

// 字段类型配置(下拉/校验)
"fields": {
    "country": {
        "type": "select",
        "options": ["中国", "美国", "英国", "日本"]
    },
    "email": {
        "type": "email",
        "required": true
    }
}

// 列宽与对齐
"columns": {
    "name": { "width": "20%" },
    "salary": { "align": "right" }
}

4. 数据管理操作

// 新增客户:点 Insert 按钮填表提交
// 编辑客户:点击行 → 修改 → 保存
// 删除客户:勾选 → Delete

// 确认删除(配置)
"deleteConfirm": "确定删除该客户吗?"

AppML 案例 Products

AppML 案例 Products

1. 产品数据模型

// products.js
var products = {
    "model": "product",
    "primary": "id",
    "data": [
        { "id": 1, "name": "笔记本电脑", "category": "电子产品", "price": 5999, "stock": 120 },
        { "id": 2, "name": "无线鼠标", "category": "配件", "price": 99, "stock": 500 },
        { "id": 3, "name": "机械键盘", "category": "配件", "price": 399, "stock": 200 },
        { "id": 4, "name": "显示器", "category": "电子产品", "price": 1599, "stock": 80 }
    ],
    "search": ["name", "category"],
    "order": [["category", "asc"], ["price", "desc"]],
    "headers": {
        "id": "编号", "name": "产品名", "category": "分类",
        "price": "价格", "stock": "库存"
    },
    "display": {
        "price": { "type": "currency", "currency": "¥" },
        "stock": { "type": "number", "color": { "min": 100, "color": "green" }, "alert": { "max": 100, "color": "red" } }
    },
    "update": ["name", "category", "price", "stock"],
    "insert": ["name", "category", "price", "stock"],
    "delete": true
};

2. 产品页面

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <script src="appml.js"></script>
  <script src="products.js"></script>
</head>
<body>
  <h1>产品管理</h1>
  <appml data="products">
    <searchbox/>
    <sortmenu/>
    <table></table>
    <details></details>
    <updateform></updateform>
    <insertform></insertform>
    <deletebutton></deletebutton>
  </appml>
</body>
</html>

3. 价格与库存展示

// display 高级用法
"display": {
    "price": {
        "type": "currency",
        "currency": "¥"
    },
    "stock": {
        "type": "number",
        // 低库存红色提示
        "conditional": {
            "if": "stock < 100",
            "color": "#e74c3c"
        }
    }
}

4. 库存预警

// 在页面 JS 中检查低库存
function checkStock() {
    var low = products.data.filter(function(p) {
        return p.stock < 100;
    });
    if (low.length > 0) {
        alert("低库存预警: " + low.length + " 个产品库存不足!");
    }
}
window.onload = checkStock;

AppML 案例未来

AppML 案例未来

1. 案例总结

通过 Employees、Customers、Products 三个案例,掌握了 AppML 的核心能力:

  • 声明式定义数据模型(字段、校验、显示)
  • 自动生成表格/表单/详情界面
  • 内置搜索、排序、增删改查
  • 模板复用与多页面组织

2. 扩展方向

  • 对接真实后端:数据源改为 REST API
  • 权限控制:按角色显示/隐藏操作
  • 图表报表:结合 Chart.js 展示统计
  • 多语言:表头与提示国际化
  • 样式定制:深度定制 CSS 主题

3. 连接后端示例

// 数据源指向后端接口
var customers = {
    "data": "api/customers",
    "updateURL": "api/customers",
    "insertURL": "api/customers",
    "deleteURL": "api/customers",
    "method": "get"
};

// 后端返回 JSON
// [{ "id": 1, "name": "张三", ... }]

4. 局限与替代

# AppML 官方已停止维护
# 学习价值:数据绑定与声明式开发思想

# 现代替代方案
Vue.js + Element UI     组件化数据应用
React + Ant Design      企业级前端
Bootstrap Table         表格增强
AdminLTE                后台管理模板

5. 结语

AppML 展示了"配置即应用"的理念:把数据结构与界面规则声明在数据对象中,引擎自动渲染。理解这一思想,无论转向 Vue、React 还是任何现代框架,都能更深刻地理解数据驱动开发的本质。

第 1 / 13 节