table.vue.ftl 和 form.vue.ftl 两个核心前端页面模板文件参考示例1

JeecgBoot企业级低代码平台实战:从核心原理到生产部署全解析 低代码开发平台通过可视化建模和代码生成技术,将通用业务功能模块化封装,其核心原理在于通过预置模板和约束性架构,将开发者的精力从重复的底层编码中解放出来,聚焦于业务逻辑创新。这一技术价值在于能大幅提升企业级应用,尤其是后台管理系统的开发效率,降低技术门槛和项目成本。在应用场景上,它特别适合企业内部管理系统、需要快速验证的MVP项目以及外包类项目,能高效处理表单、权限、报表等标准化需求。本文以JeecgBoot这一基于Spring Boot和Ant Design Vue的流行低代码平台为例,深入探讨其在实际项目 阅读详情

以下是符合 现代 Vue 3 + TypeScript + Element Plus 开发规范、遵循 企业级中后台应用设计标准 的两个核心前端页面模板文件:

  • table.vue.ftl:列表页(含分页、查询、操作)
  • form.vue.ftl:表单页(含创建/编辑、校验、提交)

这两个模板均基于 TypeScript + Composition API + <script setup> 语法,集成 Element Plus 组件库,并与前文生成的 api.ts 和 types.ts 无缝对接,包含详尽的中文注释,可直接用于代码生成器。


✅ 1. table.vue.ftl(列表页模板)

<template>
  <div class="app-container">
    <!-- 查询条件区域 -->
    <el-card shadow="never" class="search-card">
      <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="80px">
        <!-- 动态生成查询字段 -->
        <#list table.fields as field>
        <#-- 仅包含适合查询的字段(String、Integer、Boolean) -->
        <#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
        <#if field.propertyType == "String" || field.propertyType == "Integer" || field.propertyType == "Boolean">
        <el-form-item 
          label="${field.comment!}" 
          prop="${field.propertyName}"
        >
          <#if field.propertyType == "String">
          <el-input
            v-model="queryParams.${field.propertyName}"
            placeholder="请输入${field.comment!}"
            clearable
            @keyup.enter="handleSearch"
          />
          <#elseif field.propertyType == "Integer" || field.propertyType == "Long">
          <el-input
            v-model.number="queryParams.${field.propertyName}"
            placeholder="请输入${field.comment!}"
            clearable
            @keyup.enter="handleSearch"
          />
          <#elseif field.propertyType == "Boolean">
          <el-select
            v-model="queryParams.${field.propertyName}"
            placeholder="请选择${field.comment!}"
            clearable
          >
            <el-option :value="true" label="是" />
            <el-option :value="false" label="否" />
          </el-select>
          </#if>
        </el-form-item>
        </#if>
        </#if>
        </#list>

        <!-- 操作按钮 -->
        <el-form-item>
          <el-button type="primary" @click="handleSearch">查询</el-button>
          <el-button @click="handleReset">重置</el-button>
          <el-button type="success" @click="handleCreate" v-permission="'${table.mappingPath}:add'">
            新增
          </el-button>
        </el-form-item>
      </el-form>
    </el-card>

    <!-- 数据表格区域 -->
    <el-card shadow="never" class="table-card">
      <el-table
        :data="tableData"
        v-loading="loading"
        border
        style="width: 100%"
        row-key="id"
      >
        <!-- 动态生成表格列 -->
        <#list table.fields as field>
        <#-- 跳过敏感字段和逻辑删除字段 -->
        <#if !(field.name == 'password' || field.name == 'salt' || field.name == 'deleted')>
        <el-table-column
          prop="${field.propertyName}"
          label="${field.comment!}"
          <#if field.propertyType == "String" && field.propertyName == 'description'>width="200"<#else>width="120"</#if>
        >
          <#-- 时间字段特殊处理 -->
          <#if field.propertyType == "LocalDateTime" || field.propertyType == "LocalDate">
          <template #default="scope">
            {{ formatDate(scope.row.${field.propertyName}) }}
          </template>
          <#-- 布尔字段转文字 -->
          <#elseif field.propertyType == "Boolean">
          <template #default="scope">
            {{ scope.row.${field.propertyName} ? '是' : '否' }}
          </template>
          </#if>
        </el-table-column>
        </#if>
        </#list>

        <!-- 操作列 -->
        <el-table-column label="操作" fixed="right" width="200">
          <template #default="scope">
            <el-button
              type="primary"
              link
              size="small"
              @click="handleEdit(scope.row)"
              v-permission="'${table.mappingPath}:edit'"
            >
              编辑
            </el-button>
            <el-button
              type="danger"
              link
              size="small"
              @click="handleDelete(scope.row)"
              v-permission="'${table.mappingPath}:delete'"
            >
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>

      <!-- 分页组件 -->
      <el-pagination
        v-if="total > 0"
        :current-page="queryParams.page"
        :page-size="queryParams.size"
        :total="total"
        layout="total, sizes, prev, pager, next, jumper"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        class="pagination"
      />
    </el-card>
  </div>
</template>

<script setup lang="ts">
/**
 * ${table.comment!} 列表页
 *
 * 【功能说明】
 * 1. 支持条件查询、分页、排序
 * 2. 集成新增、编辑、删除操作
 * 3. 使用 Element Plus 组件库
 * 4. 权限控制(v-permission 指令)
 * 5. 时间格式化、布尔值转换等展示优化
 *
 * 【关键原则】
 * - 与后端 API 严格对齐(使用生成的 api.ts 和 types.ts)
 * - 查询参数与表格数据分离管理
 * - 操作前二次确认(删除)
 * - 加载状态反馈(v-loading)
 *
 * @author ${author}
 * @since ${date}
 */

// 导入 API 和类型
import { 
  list${entity}, 
  page${entity}, 
  delete${entity} 
} from '@/api/${table.mappingPath}';
import { 
  ${entity}Query, 
  ${entity}ListItemRes,
  PageRes 
} from '@/api/${table.mappingPath}/types';

// 导入工具函数
import { ElMessage, ElMessageBox } from 'element-plus';
import { ref, reactive, onMounted } from 'vue';
import { useRouter } from 'vue-router';

// 路由
const router = useRouter();

// 加载状态
const loading = ref(false);

// 查询参数(与 types.ts 中的 ${entity}Query 对齐)
const queryParams = reactive<${entity}Query>({
  page: 1,
  size: 10
  <#list table.fields as field>
  <#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
  <#if field.propertyType == "String" || field.propertyType == "Integer" || field.propertyType == "Boolean">
  , ${field.propertyName}: undefined
  </#if>
  </#if>
  </#list>
});

// 表格数据
const tableData = ref<${entity}ListItemRes[]>([]);
const total = ref(0);

// 查询表单引用
const queryFormRef = ref();

/**
 * 格式化时间(ISO 8601 → 友好格式)
 */
const formatDate = (dateStr: string | null | undefined): string => {
  if (!dateStr) return '-';
  const date = new Date(dateStr);
  return date.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit'
  });
};

/**
 * 获取列表数据(分页)
 */
const fetchList = async () => {
  loading.value = true;
  try {
    const res = await page${entity}(queryParams);
    if (res.data.code === 200) {
      const pageData = res.data.data as PageRes<${entity}ListItemRes>;
      tableData.value = pageData.list;
      total.value = pageData.total;
    } else {
      ElMessage.error(res.data.message || '获取列表失败');
    }
  } catch (error) {
    console.error('获取列表失败:', error);
  } finally {
    loading.value = false;
  }
};

/**
 * 查询
 */
const handleSearch = () => {
  queryParams.page = 1; // 重置页码
  fetchList();
};

/**
 * 重置查询条件
 */
const handleReset = () => {
  queryFormRef.value?.resetFields();
  queryParams.page = 1;
  fetchList();
};

/**
 * 分页大小改变
 */
const handleSizeChange = (val: number) => {
  queryParams.size = val;
  fetchList();
};

/**
 * 当前页码改变
 */
const handleCurrentChange = (val: number) => {
  queryParams.page = val;
  fetchList();
};

/**
 * 新增
 */
const handleCreate = () => {
  router.push({ name: '${entity}Form', query: { mode: 'create' } });
};

/**
 * 编辑
 */
const handleEdit = (row: ${entity}ListItemRes) => {
  router.push({ 
    name: '${entity}Form', 
    query: { mode: 'edit', id: row.id.toString() } 
  });
};

/**
 * 删除
 */
const handleDelete = (row: ${entity}ListItemRes) => {
  ElMessageBox.confirm(
    `确定要删除 "${row.<#-- 找一个合适的显示字段,如 name --><#list table.fields as field><#if field.propertyType == "String" && field.propertyName != "password">${field.propertyName}<#break></#if></#list>}" 吗?`,
    '提示',
    {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    }
  ).then(async () => {
    try {
      const res = await delete${entity}(row.id);
      if (res.data.code === 200) {
        ElMessage.success('删除成功');
        fetchList(); // 刷新列表
      } else {
        ElMessage.error(res.data.message || '删除失败');
      }
    } catch (error) {
      console.error('删除失败:', error);
    }
  });
};

// 页面加载时获取数据
onMounted(() => {
  fetchList();
});
</script>

<style scoped>
.app-container {
  padding: 20px;
}
.search-card {
  margin-bottom: 20px;
}
.table-card {
  :deep(.el-table) {
    margin-bottom: 20px;
  }
}
.pagination {
  display: flex;
  justify-content: flex-end;
}
</style>

✅ 2. form.vue.ftl(表单页模板)

<template>
  <div class="app-container">
    <el-card shadow="never">
      <template #header>
        <div class="card-header">
          <span>{{ mode === 'create' ? '新增${table.comment!}' : '编辑${table.comment!}' }}</span>
          <el-button type="primary" @click="handleSubmit" :loading="submitLoading">
            保存
          </el-button>
          <el-button @click="handleCancel">取消</el-button>
        </div>
      </template>

      <el-form
        :model="form"
        :rules="rules"
        ref="formRef"
        label-width="120px"
        :scroll-to-error="true"
      >
        <!-- 动态生成表单项 -->
        <#list table.fields as field>
        <#-- 跳过主键、基类字段和敏感字段 -->
        <#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
        <el-form-item 
          label="${field.comment!}" 
          prop="${field.propertyName}"
        >
          <#if field.propertyType == "String">
          <el-input
            v-model="form.${field.propertyName}"
            placeholder="请输入${field.comment!}"
            clearable
          />
          <#elseif field.propertyType == "Integer" || field.propertyType == "Long">
          <el-input
            v-model.number="form.${field.propertyName}"
            placeholder="请输入${field.comment!}"
            clearable
          />
          <#elseif field.propertyType == "Boolean">
          <el-switch
            v-model="form.${field.propertyName}"
            active-text="是"
            inactive-text="否"
          />
          <#elseif field.propertyType == "LocalDateTime" || field.propertyType == "LocalDate">
          <el-date-picker
            v-model="form.${field.propertyName}"
            type="datetime"
            placeholder="选择${field.comment!}"
            format="YYYY-MM-DD HH:mm:ss"
            value-format="YYYY-MM-DD HH:mm:ss"
          />
          </#if>
        </el-form-item>
        </#if>
        </#list>
      </el-form>
    </el-card>
  </div>
</template>

<script setup lang="ts">
/**
 * ${table.comment!} 表单页(新增/编辑)
 *
 * 【功能说明】
 * 1. 支持创建和编辑两种模式
 * 2. 表单校验(与后端 DTO 校验规则对齐)
 * 3. 自动加载编辑数据
 * 4. 提交成功后返回列表页
 *
 * 【关键原则】
 * - 表单数据与 API DTO 结构一致
 * - 编辑模式需先获取详情再填充表单
 * - 提交前校验,提交时 loading 状态
 * - 路由参数控制模式(mode=create/edit)
 *
 * @author ${author}
 * @since ${date}
 */

// 导入 API 和类型
import { 
  create${entity}, 
  update${entity}, 
  get${entity}Detail 
} from '@/api/${table.mappingPath}';
import { 
  ${entity}CreateReq, 
  ${entity}UpdateReq,
  ${entity}DetailRes 
} from '@/api/${table.mappingPath}/types';

// 导入工具
import { ElMessage } from 'element-plus';
import { ref, reactive, onMounted, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';

// 路由
const route = useRoute();
const router = useRouter();

// 表单引用
const formRef = ref();

// 提交状态
const submitLoading = ref(false);

// 表单模式(create / edit)
const mode = ref<'create' | 'edit'>('create');

// 表单数据(初始化为空)
const form = reactive<<#if table.fields?size gt 0>${entity}CreateReq<#else>Record<string, any></#if>>({
  <#list table.fields as field>
  <#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
  ${field.propertyName}: 
  <#if field.propertyType == "String">''
  <#elseif field.propertyType == "Integer" || field.propertyType == "Long">null
  <#elseif field.propertyType == "Boolean">false
  <#elseif field.propertyType == "LocalDateTime" || field.propertyType == "LocalDate">null
  <#else>null</#if><#if field_index < table.fields?size - 1>,</#if>
  </#if>
  </#list>
});

// 表单校验规则(与后端 DTO 校验对齐)
const rules = {
  <#list table.fields as field>
  <#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
  ${field.propertyName}: [
    {
      required: true,
      message: '${field.comment!}不能为空',
      trigger: 'blur'
    }
    <#if field.propertyType == "String">
    ,
    {
      max: 50,
      message: '${field.comment!}长度不能超过50个字符',
      trigger: 'blur'
    }
    </#if>
  ]<#if field_index < table.fields?size - 1>,</#if>
  </#if>
  </#list>
};

/**
 * 获取详情(编辑模式)
 */
const fetchDetail = async (id: number) => {
  try {
    const res = await get${entity}Detail(id);
    if (res.data.code === 200) {
      const detail = res.data.data as ${entity}DetailRes;
      // 填充表单(注意:时间字段需转换为字符串)
      Object.assign(form, detail);
    } else {
      ElMessage.error(res.data.message || '获取详情失败');
      handleCancel();
    }
  } catch (error) {
    console.error('获取详情失败:', error);
    handleCancel();
  }
};

/**
 * 提交表单
 */
const handleSubmit = async () => {
  await formRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      submitLoading.value = true;
      try {
        let res;
        if (mode.value === 'create') {
          // 创建
          res = await create${entity}(form as ${entity}CreateReq);
        } else {
          // 编辑(需包含 ID)
          const updateData = {
            id: Number(route.query.id),
            ...form
          } as ${entity}UpdateReq;
          res = await update${entity}(updateData);
        }
        
        if (res.data.code === 200) {
          ElMessage.success(mode.value === 'create' ? '新增成功' : '更新成功');
          handleCancel(); // 返回列表页
        } else {
          ElMessage.error(res.data.message || (mode.value === 'create' ? '新增失败' : '更新失败'));
        }
      } catch (error) {
        console.error(mode.value === 'create' ? '新增失败:' : '更新失败:', error);
      } finally {
        submitLoading.value = false;
      }
    }
  });
};

/**
 * 取消并返回列表页
 */
const handleCancel = () => {
  router.push({ name: '${entity}List' });
};

// 监听路由参数变化(支持从列表页直接编辑)
watch(
  () => route.query,
  (newQuery) => {
    const { mode: queryMode, id } = newQuery;
    mode.value = (queryMode as 'create' | 'edit') || 'create';
    
    if (mode.value === 'edit' && id) {
      fetchDetail(Number(id));
    } else {
      // 重置表单
      formRef.value?.resetFields();
    }
  },
  { immediate: true }
);
</script>

<style scoped>
.app-container {
  padding: 20px;
}
.card-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
</style>

🔍 关键设计说明与最佳实践

1. 前后端无缝集成
  • ✅ 类型安全:使用生成的 types.ts 确保表单/表格字段与后端 DTO/VO 严格对齐
  • ✅ API 调用:直接调用生成的 api.ts 函数,避免手写 URL 和参数
  • ✅ 错误处理:统一处理后端返回的 code !== 200 情况
2. 用户体验优化
  • ✅ 加载状态:v-loading 反馈异步操作
  • ✅ 时间格式化:ISO 字符串 → 本地友好格式
  • ✅ 布尔值转换:true/false → “是/否”
  • ✅ 表单校验:前端校验 + 后端校验双重保障
  • ✅ 操作确认:删除前二次确认
3. 权限与安全
  • ✅ 权限指令:v-permission 控制按钮显隐(需自行实现该指令)
  • ✅ 敏感字段过滤:模板中已排除 password、salt、deleted
  • ✅ 路由参数校验:编辑模式必须传 ID
4. 工程化规范
  • ✅ Composition API:使用 <script setup> + ref/reactive
  • ✅ TypeScript:完整类型定义,杜绝 any
  • ✅ 样式作用域:<style scoped> 避免样式污染
  • ✅ 响应式布局:适配不同屏幕尺寸
5. 扩展性设计
  • ✅ 动态字段生成:根据数据库表结构自动生成表单/表格
  • ✅ 预留扩展点:注释中提供常见场景示例(如导出、批量操作)
  • ✅ 组件化思想:可进一步拆分为 SearchForm.vue、ActionColumn.vue 等

🛠️ 配套使用建议

(1) 路由配置(router.ts)
{
  path: '/${table.mappingPath}',
  name: '${entity}List',
  component: () => import('@/views/${table.mappingPath}/table.vue')
},
{
  path: '/${table.mappingPath}/form',
  name: '${entity}Form',
  component: () => import('@/views/${table.mappingPath}/form.vue')
}
(2) 权限指令实现(可选)
// directive/permission.ts
app.directive('permission', {
  mounted(el, binding) {
    const { value } = binding;
    const permissions = store.getters.permissions; // 从 Vuex/Pinia 获取用户权限
    if (value && !permissions.includes(value)) {
      el.parentNode?.removeChild(el);
    }
  }
});
(3) 项目结构
src/
├── api/
│   └── user/
│       ├── index.ts      ← api.ts
│       └── types.ts
├── views/
│   └── user/
│       ├── table.vue     ← 列表页
│       └── form.vue      ← 表单页
└── router/
    └── index.ts

✅ 这两份模板体现了 “开箱即用” 和 “企业级健壮性” 的前端工程思想:

  • 自动生成完整 CRUD 页面
  • 类型安全贯穿始终
  • 用户体验细节到位
  • 安全与权限考虑周全
  • 代码结构清晰可维护

可作为团队标准模板,在代码生成流程中自动生成,大幅提升中后台应用开发效率。

Vue.js集成富文本编辑器实战项目 Vue.js 是一款渐进式 JavaScript 框架,凭借其轻量、易集成、响应式数据绑定和组件化开发理念,已成为现代前端开发中不可或缺的技术栈之一。其核心特性包括虚拟 DOM、指令系统、计算属性和响应式数据流,使得开发者能够高效构建可维护的单页应用(SPA)。富文本编辑器作为内容创作的重要工具,广泛应用于文章发布、内容管理系统(CMS)、博客平台等场景。它提供了文本格式化、图片插入、超链接、代码块、表格等基础功能,极大地提升了用户的输入体验和内容表现力。 阅读详情

相关推荐

ftl-vue-webpack:适用于webapp的vue.js,webpack和freemarker

ftl-vue-webpack 一个Vue.js多页&& spa项目,可以支持transform ftl并自动支持模拟刷新。 如果您想使用简单的纯html,请看 构建设置 # install dependencies npm install # serve with hot reload at localhost which is no self-mock npm run dev # if you want to mock yourself,please fire follow after 'dev' npm run dev-mock # if you want to mock ftl,please fire follow after 'dev' npm run ftl-mock # build for production with minification npm run buil

模板引擎:ftl文件生成word

FreeMarker 是一个用 Java 语言编写的模板引擎,基于模板来生成文本输出

程序和我有一个能跑就行了 3775

FreeMarker教程 ftl

FreeMarker教程 ftl,web前端 web开发 FreeMarkerFreeMarker教程 ftl,web前端 web开发 FreeMarker

.ftl文件 是什么文件

1、Freemarker模板的文件后缀名 2、Freemarker其实是一种比较简单的网页展示技术,说白了就是网页模板和数据模型的结合体。这种结合模式的好处就是,分离了网页界面设计人员和编程人员的工作,让他们各司其职。 据个人理解,Freemarker大致的工作方式是,网页模板里面嵌入了数据模型中的数据、Freemarker自定义流程控制语言、Freemarker自定义的操作函数等等,

小Y 9万+

后台使用freeMarker和前端使用vue的方法及遇到的问题

主要介绍了后台使用freeMarker和前端使用vue的方法及遇到的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

UE4_SpeedTree Shader源码分析

目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S...

zzgyy123的专栏 2629

Web前端:FreeMarker技术指南

一、什么是模板引擎,为什么要用模板引擎 在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。 很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术

ccecwg的专栏 1131

知识检索中的四大评估指标:准确率、精确率、召回率与F1分数详解

摘要:NLP算法面试中,评估知识检索系统的核心指标包括准确率、精确率、召回率和F1分数。准确率衡量整体预测正确性,但在样本不均衡时可能失真;精确率关注预测正类中的真实比例(查准能力),召回率衡量真实正类被预测的比例(查全能力)。F1分数是两者的调和平均,提供综合评估。这些指标通过混淆矩阵计算,并存在制约关系:提高召回率往往降低精确率,反之亦然。应用场景包括文档检索(评估结果质量和覆盖度)和文本分类(如垃圾邮件过滤)。面试需掌握指标区别、适用场景及平衡方法(如调整阈值)。F1分数在样本不平衡时比准确率更具参考

Ven%的博客 1762

项目中前端ftl模板了解

在项目中如前端页面list.ftl,代码部分如下: <!DOCTYPE html> <html> <#import "/spring.ftl" as spring> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Tell the browser to be responsive to scree

weixin_43862596的博客 3762

SwinIR实战:从环境搭建到模型训练的全流程解析

本文提供了SwinIR超分辨率模型从零开始的全流程实战指南。详细解析了基于PyTorch和Anaconda的环境搭建、数据准备与配置文件修改、训练启动与常见错误排查(如张量尺寸不匹配),以及模型评估方法,帮助读者高效部署并训练SwinIR模型。

weixin_28224217的博客 319

LVGL多线程编程避坑指南:从音乐播放器项目看UI与后台任务如何安全协作

本文深入探讨LVGL在多线程环境下的安全协作问题,以音乐播放器项目为例,解析UI与后台任务(如mplayer音频播放器)的典型冲突场景。提供全局互斥锁规范、任务队列异步处理等核心策略,并分享mplayer进程集成方案与进度条优化技巧,帮助开发者规避界面卡顿、内存损坏等常见问题。

weixin_42531494的博客 131

table.vue.ftl 和 form.vue.ftl 两个核心前端页面模板文件参考示例2

一个优秀的前端组件,不是功能越多越好,而是越准越稳。标准、安全、可复用的列表页。智能、自适应、零配置的表单页。✅复制此模板,你的前端项目将拥有业界标准的 CRUD 组件。✅从此,你的团队不再为“这个字段怎么显示”、“这个按钮怎么写”而争论。✅你的代码,就是最好的开发手册。

python15397的博客 395

Natural Language Processing

作者:禅与计算机程序设计艺术 1.简介 自然语言处理(NLP)是研究如何使计算机理解和处理自然语言的理论和方法,目的是让电脑更好的理解、获取、生成、存储和沟通人类语言。20世纪80年代末,IBM的三位博士陈天奇、周博磊和王力雄在贝尔实验室创建了首个自然语言处理系统——“布莱克多·艾森豪威尔”(Bletc

AI天才研究院 724

工作中使用到的单词(软件开发)_第五版

本文摘要: 本文为软件开发相关的术语与技术要点整理,主要包含2020-2025年间四版内容更新(No.01-41)。重点包括: 证书文件格式(PEM/P12)差异 外部API通信注意事项(Accept头设置、HTTPS连接问题) Postman工具使用技巧(Cookie管理、请求头设置) WAS配置相关经验(JVM设置、SSL连接问题) 数据库操作命令(DB2表结构修改) IBM安全管理组件(TAM/iv-user机制) 网络通信细节(chunked传输编码特性) 常用开发工具(curl、Postman)的

sun0322 2516

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

【GEOS-Chem模拟教程第二期上】生物质燃烧排放 GFED4 数据配置

生物质燃烧排放 GFED4 数据配置

WW、forever的博客 1298

什么是ftl?ftl和html的区别是什么?

FTL(FreeMarker Template Language)是一种模板语言,用于生成动态内容。它是一个开源的模板引擎,提供了丰富的语法和功能,用于在 Web 开发中生成动态的文本、HTML、XML 等内容。 使用 FTL 可以将模板与数据进行绑定,根据数据的不同生成不同的输出。

好看的皮囊千篇一律,有趣的灵魂万里挑一。 8556

手把手教你学SIMULINK模块库文件专栏-From Workspace 模块详解

模块是 Simulink 中的一个信号源模块,用于从 MATLAB 工作区加载数据作为输入信号。该模块允许用户将预先在 MATLAB 中生成的数据(如时间序列、矩阵或结构体)导入到 Simulink 模型中,从而实现更灵活的信号输入和仿真控制。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常灵活的工具,适用于需要从 MATLAB 工作区加载数据的各种场景。

MHD0815的博客 631

FreeMarker Thymeleaf - 前端模板引擎

概述 FreeMarker是一种模板引擎(基于模板和要改变的数据),主要用于MVC中的view层,生成html展示数据给客户端,可以完全替代jsp 它不是面向最终用户的,而是一个Java类库,是一款可以嵌入所开发产品的组件,后缀通常是ftl 它是一个基于模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部java程序通过数据库操作等生成数据传入template中,然后输出页面。它能够生成各种文本:HTML、XML、JSP、RTF、Java源代码等等,而且不需要Servlet环境,并且可

weixin_45453240的博客 848

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【java导出Word模板(FTL文件,含单元格合并)】

1.4IDEA中开始敲代码(条件姓名相同则合并单元格,依次推,多种情况合并也可使用)1.3查看ftl文件中的列名,${}是否都在中,如果标签内有其他内容删除即可。1.1新建Word模板,选择好需要的字体大小,居中样式等(下图是遍历数据,采用${}占位)1.8加载FTL文件输出文件流,返回给前端,ftl文件位于当前模块的Resource下。1.5FTL文件中遍历标签,结尾处结束,A相当于一个Student对象。1.6FTL文件合并。...

weixin_59831515的博客 5201

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

编辑ftl文件无提示_ftl编辑器(freemarker)的使用和说明

一、准备工作1.1下载文件可以从http://freemarker.sourceforge.net/站点下载最新的freemarker.jar包(目前最新版本是2.3.18)与eclipse插件(最新版本是0.9.14)。1.2安装eclipse插件将下载来的eclipse插件解压缩到本地磁盘,更改hudson.freemarker_ide_0.9.14文件夹中的freemarker-2.3.6....

weixin_27006759的博客 935

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Vue 基础(实战模板与命名指南)

聚焦三件事:模板化写法、使用选择、变量与函数命名规范。配合可复制的代码模板,快速搭建可靠页面。

Sky960722的博客 538

.ftl文件简介及语法

1、Freemarker模板的文件后缀名 2、Freemarker其实是一种比较简单的网页展示技术,说白了就是网页模板和数据模型的结合体。这种结合模式的好处就是,分离了网页界面设计人员和编程人员的工作,让他们各司其职。 据个人理解,Freemarker大致的工作方式是,网页模板里面嵌入了数据模型中的数据、Freemarker自定义流程控制语言、Freemarker自定义的操作函数等等,在装载网页

泡沫水灵灵的博客 7万+

ftl文件引入css,js

ftl引入css,js >文件结构一览 >jar包一览 >web.xml 关键一句话,就是springmvc的那个servlet,因为要用RESTFul风格,所以拦截/,并且让它去读springMVC来初始化(java /src 根路径)。 web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-inst

Aliloke的博客 1万+

以freemarker和vue为例深入理解后端渲染、前端渲染

目录 一、springboot集成freemaker demo 二、echarts图表,echarts已由百度迁入apache,官网。 三、vue.js 后端使用----非node环境vue-cli构建的vue使用方式 官网 四、freemarker后端渲染,vue前端渲染 五、案例:html转pdf的几个方案 一、springboot集成freemaker demo pom.xml <?xml version="1.0" encoding="UTF-8"?> <..

MJ的博客 5763

Springboot整合模板引擎之freemarker(七)

freemarker

wzcwmhp的博客 2062
上一篇: api.ts.ftl 和 types.ts.ftl 模板文件参考示例2
下一篇: table.vue.ftl 和 form.vue.ftl 两个核心前端页面模板文件参考示例2
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值