mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-07-01 15:32:48 +08:00
feat: 初步完成详情生成
This commit is contained in:
@@ -1,134 +0,0 @@
|
||||
# CURD详情页面生成功能实现计划
|
||||
|
||||
## 1. 需求分析
|
||||
|
||||
* 当前CURD生成功能不包含详情页面
|
||||
|
||||
* 详情页面需要合理布局:顶部是标题+ID,左侧8/12是主体,右侧4/12是基础字段
|
||||
|
||||
* 详情页面需要包含编辑、删除、返回等基础按钮操作
|
||||
|
||||
* 支持后续扩展更多字段
|
||||
|
||||
* 使用Layui栅格系统
|
||||
|
||||
## 2. 实现步骤
|
||||
|
||||
### 2.1 添加详情方法到CURD Trait
|
||||
|
||||
* 在 `CurdTraitBase.php` 中添加 `read` 方法
|
||||
|
||||
* 实现详情数据获取和页面渲染逻辑
|
||||
|
||||
### 2.2 创建详情页面模板
|
||||
|
||||
* 创建 `view/read.code` 主模板
|
||||
|
||||
* 设计Layui风格布局:
|
||||
* 顶部区域:标题、ID和操作按钮(编辑、删除、返回)
|
||||
* 内容区域:使用 `layui-row` 和 `layui-col-md-*` 实现8/4分栏
|
||||
* 左侧:主体字段(8列)
|
||||
* 右侧:基础字段(4列,包含创建时间、更新时间等)
|
||||
|
||||
### 2.3 修改BuildCurdServiceBase
|
||||
|
||||
* 在 `renderView` 方法中添加详情页面生成逻辑
|
||||
|
||||
* 实现字段分类:
|
||||
* 主体字段:除ID、创建时间、更新时间外的大部分字段
|
||||
* 基础字段:ID、创建时间、更新时间、状态等系统字段
|
||||
|
||||
* 添加详情页面到文件列表
|
||||
|
||||
### 2.4 更新JS文件生成
|
||||
|
||||
* 修改 `js/index.code` 模板
|
||||
|
||||
* 在操作列添加详情按钮
|
||||
|
||||
* 实现详情跳转逻辑
|
||||
|
||||
### 2.5 更新控制器模板
|
||||
|
||||
* 确保控制器支持详情页面路由
|
||||
|
||||
## 3. 布局设计(Layui风格)
|
||||
|
||||
```html
|
||||
<!-- 顶部区域 -->
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header detail-header">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col-md9">
|
||||
<h2 class="detail-title">{{title}}</h2>
|
||||
<div class="detail-id">ID: {{id}}</div>
|
||||
</div>
|
||||
<div class="layui-col-md3 text-right">
|
||||
<button class="layui-btn layui-btn-primary" onclick="window.history.back()">返回</button>
|
||||
<button class="layui-btn" onclick="location.href='{{editUrl}}'">编辑</button>
|
||||
<button class="layui-btn layui-btn-danger" onclick="deleteData({{id}})">删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 内容区域 -->
|
||||
<div class="layui-card-body">
|
||||
<div class="layui-row detail-content">
|
||||
<!-- 左侧主体内容(8/12) -->
|
||||
<div class="layui-col-md-8 detail-main">
|
||||
<div class="layui-form">
|
||||
<!-- 主体字段展示 -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 右侧基础信息(4/12) -->
|
||||
<div class="layui-col-md-4 detail-side">
|
||||
<div class="layui-form">
|
||||
<!-- 基础字段展示:创建时间、更新时间等 -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## 4. 字段分类规则
|
||||
|
||||
* **主体字段**:所有非系统字段,如名称、描述、内容等
|
||||
|
||||
* **基础字段**:
|
||||
* id
|
||||
* create_time
|
||||
* update_time
|
||||
* status
|
||||
* 其他系统相关字段
|
||||
|
||||
## 5. 实现要点
|
||||
|
||||
* 保持与Layui框架风格一致
|
||||
|
||||
* 遵循现有代码生成模式
|
||||
|
||||
* 支持后续字段扩展
|
||||
|
||||
* 确保详情页面与现有功能无缝集成
|
||||
|
||||
* 添加必要的JavaScript交互逻辑
|
||||
|
||||
## 6. 文件修改清单
|
||||
|
||||
1. `extend/base/admin/traits/CurdTraitBase.php` - 添加read方法
|
||||
2. `extend/base/admin/service/curd/templates/view/read.code` - 详情页面模板
|
||||
3. `extend/base/admin/service/curd/BuildCurdServiceBase.php` - 添加详情页面生成逻辑
|
||||
4. `extend/base/admin/service/curd/templates/js/index.code` - 添加详情按钮
|
||||
5. `extend/base/admin/service/curd/templates/js/read.code` - 详情页面JS逻辑
|
||||
|
||||
## 7. 详情页面按钮功能
|
||||
|
||||
* **返回**:返回上一页
|
||||
|
||||
* **编辑**:跳转到编辑页面
|
||||
|
||||
* **删除**:调用删除接口,删除当前数据
|
||||
|
||||
* 所有按钮使用Layui样式,保持一致的视觉效果
|
||||
@@ -27,13 +27,29 @@ class Goods extends AdminController
|
||||
|
||||
$this->model = new \app\admin\model\TestGoods();
|
||||
|
||||
$this->assign('select_list_status', $this->model::SELECT_LIST_STATUS, true);
|
||||
$select_list_status_list = [];
|
||||
foreach ($this->model::SELECT_LIST_STATUS as $key => $value) {
|
||||
$select_list_status_list[] = ['value' => $key, 'label' => $value];
|
||||
}
|
||||
$this->assign('select_list_status', $select_list_status_list, true);
|
||||
|
||||
$this->assign('select_list_time_status', $this->model::SELECT_LIST_TIME_STATUS, true);
|
||||
$select_list_time_status_list = [];
|
||||
foreach ($this->model::SELECT_LIST_TIME_STATUS as $key => $value) {
|
||||
$select_list_time_status_list[] = ['value' => $key, 'label' => $value];
|
||||
}
|
||||
$this->assign('select_list_time_status', $select_list_time_status_list, true);
|
||||
|
||||
$this->assign('select_list_is_recommend', $this->model::SELECT_LIST_IS_RECOMMEND, true);
|
||||
$select_list_is_recommend_list = [];
|
||||
foreach ($this->model::SELECT_LIST_IS_RECOMMEND as $key => $value) {
|
||||
$select_list_is_recommend_list[] = ['value' => $key, 'label' => $value];
|
||||
}
|
||||
$this->assign('select_list_is_recommend', $select_list_is_recommend_list, true);
|
||||
|
||||
$this->assign('select_list_shop_type', $this->model::SELECT_LIST_SHOP_TYPE, true);
|
||||
$select_list_shop_type_list = [];
|
||||
foreach ($this->model::SELECT_LIST_SHOP_TYPE as $key => $value) {
|
||||
$select_list_shop_type_list[] = ['value' => $key, 'label' => $value];
|
||||
}
|
||||
$this->assign('select_list_shop_type', $select_list_shop_type_list, true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -41,15 +41,39 @@ class TestGoods extends TimeModel
|
||||
protected $deleteTime = "delete_time";
|
||||
|
||||
|
||||
public const SELECT_LIST_STATUS = ['0'=>'正常','1'=>'禁用',];
|
||||
public const SELECT_LIST_STATUS = ['0' => '正常', '1' => '禁用'];
|
||||
|
||||
public const SELECT_LIST_TIME_STATUS = ['0'=>'未参加','1'=>'已开始','3'=>'已结束',];
|
||||
public const SELECT_LIST_TIME_STATUS = ['0' => '未参加', '1' => '已开始', '3' => '已结束'];
|
||||
|
||||
public const SELECT_LIST_IS_RECOMMEND = ['0'=>'不推荐','1'=>'推荐',];
|
||||
public const SELECT_LIST_IS_RECOMMEND = ['0' => '不推荐', '1' => '推荐'];
|
||||
|
||||
public const SELECT_LIST_SHOP_TYPE = ['taobao'=>'淘宝','jd'=>'京东',];
|
||||
public const SELECT_LIST_SHOP_TYPE = ['taobao' => '淘宝', 'jd' => '京东'];
|
||||
|
||||
/**
|
||||
* 商品图片获取器
|
||||
* @param $value
|
||||
* @return array
|
||||
*/
|
||||
public function getImagesListAttr($value, $data)
|
||||
{
|
||||
if (empty($data['images'])) {
|
||||
return [];
|
||||
}
|
||||
return explode('|', $data['images']);
|
||||
}
|
||||
/**
|
||||
* 检测报告获取器
|
||||
* @param $value
|
||||
* @return array
|
||||
*/
|
||||
public function getVerfiyFileListAttr($value, $data)
|
||||
{
|
||||
if (empty($data['verfiy_file'])) {
|
||||
return [];
|
||||
}
|
||||
return explode('|', $data['verfiy_file']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function mallCate()
|
||||
{
|
||||
@@ -57,4 +81,4 @@ class TestGoods extends TimeModel
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,8 @@ var init = {
|
||||
indexUrl: 'test.goods/index',
|
||||
addUrl: 'test.goods/add' + location.search,
|
||||
editUrl: 'test.goods/edit',
|
||||
readUrl: 'test.goods/read',
|
||||
deleteUrl: 'test.goods/delete',
|
||||
exportUrl: 'test.goods/export',
|
||||
modifyUrl: 'test.goods/modify',
|
||||
};
|
||||
};
|
||||
|
||||
@@ -2,7 +2,22 @@ $(function(){
|
||||
ua.table.render({
|
||||
init: init,
|
||||
cols: [[
|
||||
{type: 'checkbox'},
|
||||
{type: 'checkbox'},
|
||||
{field: 'id', title: 'id'},
|
||||
{field: 'cate_id', title: '分类ID'},
|
||||
{field: 'title', title: '商品名称'},
|
||||
{field: 'logo', title: '商品logo', templet: ua.table.image},
|
||||
{field: 'total_stock', title: '总库存'},
|
||||
{field: 'sort', title: '排序', edit: 'text'},
|
||||
{field: 'status', search: 'select', selectList: ua.getDataBrage('select_list_status'), title: '状态', templet: ua.table.switch},
|
||||
{field: 'cert_file', title: '合格证', templet: ua.table.url},
|
||||
{field: 'remark', title: '备注说明', templet: ua.table.text},
|
||||
{field: 'create_time', title: 'create_time'},
|
||||
{field: 'publish_time', title: '发布日期'},
|
||||
{field: 'sale_time', title: '售卖日期'},
|
||||
{field: 'intro', title: '简介'},
|
||||
{field: 'time_status', search: 'select', selectList: ua.getDataBrage('select_list_time_status'), title: '秒杀状态'},
|
||||
{field: 'is_recommend', search: 'select', selectList: ua.getDataBrage('select_list_is_recommend'), title: '是否推荐'},
|
||||
{field: 'shop_type', search: 'select', selectList: ua.getDataBrage('select_list_shop_type'), title: '商品类型'},
|
||||
{field: 'from_area', title: '产地'},
|
||||
{field: 'store_city', title: '仓库'},
|
||||
|
||||
@@ -19,7 +19,237 @@
|
||||
<!-- 左侧主体内容 -->
|
||||
<div class="layui-col-md8 detail-main">
|
||||
<div class="detail-field-group">
|
||||
<div class="detail-field-item"><div class="detail-field-label">分类ID</div><div class="detail-field-value">{$row.cate_id|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">商品名称</div><div class="detail-field-value">{$row.title|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">商品logo</div><div class="detail-field-value"><img src="{$row.logo}" class="detail-image" style="max-width: 200px; max-height: 200px;"></div></div><div class="detail-field-item"><div class="detail-field-label">商品图片</div><div class="detail-field-value">{$row.images|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">商品描述</div><div class="detail-field-value">{$row.describe|raw|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">总库存</div><div class="detail-field-value">{$row.total_stock|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">合格证</div><div class="detail-field-value">{$row.cert_file|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">检测报告</div><div class="detail-field-value">{$row.verfiy_file|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">备注说明</div><div class="detail-field-value">{$row.remark|raw|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">发布日期</div><div class="detail-field-value">{$row.publish_time|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">售卖日期</div><div class="detail-field-value">{$row.sale_time|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">简介</div><div class="detail-field-value">{$row.intro|raw|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">秒杀状态</div><div class="detail-field-value">{$row.time_status|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">是否推荐</div><div class="detail-field-value">{eq name="row.is_recommend" value="1"}启用{else/}禁用{/eq}</div></div><div class="detail-field-item"><div class="detail-field-label">商品类型</div><div class="detail-field-value">{$row.shop_type|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">商品标签</div><div class="detail-field-value">{$row.tag|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">商品标签(单选)</div><div class="detail-field-value">{$row.tag_backup|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">产地</div><div class="detail-field-value">{$row.from_area|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">仓库</div><div class="detail-field-value">{$row.store_city|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">商品标签 (输入)</div><div class="detail-field-value">{$row.tag_input|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">唯一id</div><div class="detail-field-value">{$row.uid|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">价格</div><div class="detail-field-value">{$row.price|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">详情</div><div class="detail-field-value">{$row.detail|default=''}</div></div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">分类ID</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.cate_id"}
|
||||
{$row.cate_id}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品名称</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.title"}
|
||||
{$row.title}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品logo</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.logo"}
|
||||
<img src="{$row.logo}" class="detail-image" style="max-width: 300px; max-height: 300px; border-radius: 4px; cursor: pointer;" onclick="layer.photos({photos: {data: [{src: this.src}]}, anim: 5})">
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无图片</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品图片</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.images_list"}
|
||||
{volist name="row.images_list" id="img"}
|
||||
<img src="{$img}" class="detail-image" style="max-width: 150px; max-height: 150px; margin-right: 10px; margin-bottom: 10px; border-radius: 4px; cursor: pointer;" onclick="layer.photos({photos: {data: {volist name='row.images_list' id='imgItem'}[{src: '{$imgItem}'}{notlast},{/notlast}]{/volist}}, start: {$key}}, anim: 5})">
|
||||
{/volist}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无图片</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item detail-field-full">
|
||||
<div class="detail-field-label">商品描述</div>
|
||||
<div class="detail-field-value detail-editor-content">
|
||||
{notempty name="row.describe"}
|
||||
{$row.describe|raw}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无内容</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">总库存</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.total_stock"}
|
||||
{$row.total_stock}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">合格证</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.cert_file"}
|
||||
<a href="{$row.cert_file}" target="_blank" class="layui-btn layui-btn-xs layui-btn-normal">
|
||||
<i class="layui-icon layui-icon-download-circle"></i> 下载文件
|
||||
</a>
|
||||
<div style="margin-top: 5px; color: #999; font-size: 12px;">{$row.cert_file}</div>
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无文件</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">检测报告</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.verfiy_file_list"}
|
||||
{volist name="row.verfiy_file_list" id="file"}
|
||||
<div style="margin-bottom: 8px;">
|
||||
<a href="{$file}" target="_blank" class="layui-btn layui-btn-xs layui-btn-normal">
|
||||
<i class="layui-icon layui-icon-download-circle"></i> 文件 {$key + 1}
|
||||
</a>
|
||||
<span style="margin-left: 10px; color: #999; font-size: 12px;">{$file}</span>
|
||||
</div>
|
||||
{/volist}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无文件</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">备注说明</div>
|
||||
<div class="detail-field-value" style="white-space: pre-wrap;">
|
||||
{notempty name="row.remark"}
|
||||
{$row.remark|raw}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无内容</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">发布日期</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.publish_time"}
|
||||
{$row.publish_time|date="Y-m-d H:i:s"}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">售卖日期</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.sale_time"}
|
||||
{$row.sale_time|date="Y-m-d H:i:s"}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">简介</div>
|
||||
<div class="detail-field-value" style="white-space: pre-wrap;">
|
||||
{notempty name="row.intro"}
|
||||
{$row.intro|raw}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无内容</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">秒杀状态</div>
|
||||
<div class="detail-field-value">
|
||||
{volist name="select_list_time_status" id="vo"}{eq name="vo.value" value="$row.time_status"}{$vo.label}{/eq}{/volist}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">是否推荐</div>
|
||||
<div class="detail-field-value">
|
||||
{volist name="select_list_is_recommend" id="vo"}{eq name="vo.value" value="$row.is_recommend"}<span class="layui-badge">{volist name="select_list_is_recommend" id="item"}{eq name="item.value" value="$row.is_recommend"}{$item.label}{/eq}{/volist}</span>{/eq}{/volist}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品类型</div>
|
||||
<div class="detail-field-value">
|
||||
{volist name="row.shop_type|explode=','" id="item"><span class="layui-badge layui-badge-rim" style="margin-right: 5px;">{volist name="select_list_shop_type" id="vo"}{eq name="vo.value" value="$item"}{$vo.label}{/eq}{/volist}</span>{/volist}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品标签</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.tag"}
|
||||
{$row.tag}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品标签(单选)</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.tag_backup"}
|
||||
{$row.tag_backup}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">产地</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.from_area"}
|
||||
{$row.from_area}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">仓库</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.store_city"}
|
||||
{$row.store_city}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">商品标签 (输入)</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.tag_input"}
|
||||
{$row.tag_input}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">唯一id</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.uid"}
|
||||
{$row.uid}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">价格</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.price"}
|
||||
{$row.price}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">详情</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.detail"}
|
||||
{$row.detail}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- 右侧基础信息 -->
|
||||
@@ -30,7 +260,33 @@
|
||||
<div class="detail-field-label">ID</div>
|
||||
<div class="detail-field-value">{$row.id}</div>
|
||||
</div>
|
||||
<div class="detail-field-item"><div class="detail-field-label">排序</div><div class="detail-field-value">{$row.sort|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">状态</div><div class="detail-field-value">{$row.status|default=''}</div></div><div class="detail-field-item"><div class="detail-field-label">create_time</div><div class="detail-field-value">{$row.create_time|default=''}</div></div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">排序</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.sort"}
|
||||
{$row.sort}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">状态</div>
|
||||
<div class="detail-field-value">
|
||||
{volist name="select_list_status" id="vo"}{eq name="vo.value" value="$row.status"}<span class="layui-badge">{volist name="select_list_status" id="item"}{eq name="item.value" value="$row.status"}{$item.label}{/eq}{/volist}</span>{/eq}{/volist}
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">create_time</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.create_time"}
|
||||
{$row.create_time}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -760,9 +760,9 @@ class BuildCurdServiceBase
|
||||
|
||||
$values = '[';
|
||||
foreach ($array as $k => $v) {
|
||||
$values .= "'{$k}'=>'{$v}',";
|
||||
$values .= "'{$k}' => '{$v}', ";
|
||||
}
|
||||
$values .= ']';
|
||||
$values = rtrim($values, ', ') . ']';
|
||||
$selectCode = $this->replaceTemplate(
|
||||
$this->getTemplate("model{$this->DS}select"),
|
||||
[
|
||||
@@ -774,6 +774,31 @@ class BuildCurdServiceBase
|
||||
return $selectCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建获取器模型(用于多图片、多文件字段).
|
||||
* @param $field
|
||||
* @param $val
|
||||
* @return mixed
|
||||
*/
|
||||
protected function buildAccessorModel($field, $val)
|
||||
{
|
||||
// 获取器名称,如 images -> ImagesListAttr
|
||||
$accessorName = Str::studly($field) . 'List';
|
||||
$separator = isset($val['define']) ? $val['define'] : '|';
|
||||
|
||||
$accessorCode = $this->replaceTemplate(
|
||||
$this->getTemplate("model{$this->DS}accessor"),
|
||||
[
|
||||
'comment' => $val['comment'],
|
||||
'accessorName' => $accessorName,
|
||||
'field' => $field,
|
||||
'separator' => $separator,
|
||||
]
|
||||
);
|
||||
|
||||
return $accessorCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建下拉框视图.
|
||||
* @param $field
|
||||
@@ -1179,6 +1204,7 @@ class BuildCurdServiceBase
|
||||
}
|
||||
|
||||
$selectList = '';
|
||||
$accessorList = '';
|
||||
|
||||
$doc_content = '';
|
||||
|
||||
@@ -1186,6 +1212,12 @@ class BuildCurdServiceBase
|
||||
if (isset($val['formType']) && in_array($val['formType'], ['select', 'switch', 'radio', 'checkbox']) && isset($val['define'])) {
|
||||
$selectList .= $this->buildSelectModel($field, $val['define']);
|
||||
}
|
||||
|
||||
// 为多图片和多文件字段生成获取器
|
||||
if (in_array($val['formType'], ['images', 'files'])) {
|
||||
$accessorList .= $this->buildAccessorModel($field, $val);
|
||||
}
|
||||
|
||||
$doc_content .= " * @property {$val['property_type']} \${$val['property_name']} {$val['comment']} {$val['data_list']}\n";
|
||||
}
|
||||
|
||||
@@ -1207,6 +1239,7 @@ class BuildCurdServiceBase
|
||||
'deleteTime' => $this->delete ? '"delete_time"' : 'false',
|
||||
'relationList' => $relationList,
|
||||
'selectList' => $selectList,
|
||||
'accessorList' => $accessorList,
|
||||
'doc_content' => $doc_content,
|
||||
]
|
||||
);
|
||||
@@ -1467,97 +1500,7 @@ class BuildCurdServiceBase
|
||||
continue;
|
||||
}
|
||||
|
||||
$templateFile = "view{$this->DS}module{$this->DS}input";
|
||||
$value = '{$row.' . $field . '|default=\'\'}';
|
||||
|
||||
// 根据字段类型选择不同的模板
|
||||
if ($val['formType'] == 'image') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}image";
|
||||
} elseif ($val['formType'] == 'images') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}images";
|
||||
} elseif ($val['formType'] == 'file') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}file";
|
||||
} elseif ($val['formType'] == 'files') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}files";
|
||||
} elseif ($val['formType'] == 'editor' || in_array($field, ['remark']) || $val['formType'] == 'textarea') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}textarea";
|
||||
$value = '{$row.' . $field . '|raw|default=\'\'}';
|
||||
} elseif ($val['formType'] == 'date') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}date";
|
||||
if (isset($val['define']) && !empty($val['define'])) {
|
||||
$define = $val['define'];
|
||||
} else {
|
||||
$define = 'datetime';
|
||||
}
|
||||
if (!in_array($define, ['year', 'month', 'date', 'time', 'datetime'])) {
|
||||
$define = 'datetime';
|
||||
}
|
||||
} elseif ($val['formType'] == 'radio' || $val['formType'] == 'switch') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}radio";
|
||||
if (isset($val['define']) && !empty($val['define'])) {
|
||||
$define = $this->buildRadioView($field, '{in name="k" value="$row.' . $field . '"}checked=""{/in}');
|
||||
}
|
||||
} elseif ($val['formType'] == 'checkbox') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}checkbox";
|
||||
if (isset($val['define']) && !empty($val['define'])) {
|
||||
$define = $this->buildCheckboxView($field, '{in name="k" value="$row.' . $field . '"}checked=""{/in}');
|
||||
}
|
||||
} elseif ($val['formType'] == 'select') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}select";
|
||||
if (isset($val['bindRelation'])) {
|
||||
$define = $this->buildOptionView($val['bindRelation'], '{in name="k" value="$row.' . $field . '"}selected=""{/in}');
|
||||
} elseif (isset($val['define']) && !empty($val['define'])) {
|
||||
$define = $this->buildOptionView($field, '{in name="k" value="$row.' . $field . '"}selected=""{/in}');
|
||||
}
|
||||
} elseif ($val['formType'] == 'relation') {
|
||||
$val['define']['type'] = 'radio';
|
||||
$val['define']['valueField'] = 'id';
|
||||
$val['define']['fieldName'] = $val['define']['relationBindSelect'];
|
||||
$templateFile = "view{$this->DS}module{$this->DS}table";
|
||||
$define = $this->buildTableView($field, $val, $value);
|
||||
} elseif ($val['formType'] == 'table') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}table";
|
||||
$define = $this->buildTableView($field, $val, $value);
|
||||
} elseif ($val['formType'] == 'city') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}city";
|
||||
$define = $this->buildCityView($field, $val, $value);
|
||||
} elseif ($val['formType'] == 'tag') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}tag";
|
||||
}
|
||||
|
||||
// 直接生成详情页面的字段展示HTML,使用简单的div结构
|
||||
$fieldContent = '<div class="detail-field-item">';
|
||||
$fieldContent .= '<div class="detail-field-label">' . $val['comment'] . '</div>';
|
||||
$fieldContent .= '<div class="detail-field-value">';
|
||||
|
||||
// 根据字段类型处理值的显示
|
||||
if ($val['formType'] == 'editor' || in_array($field, ['remark']) || $val['formType'] == 'textarea') {
|
||||
$fieldContent .= '{$row.' . $field . '|raw|default=\'\'}';
|
||||
} elseif ($val['formType'] == 'image') {
|
||||
$fieldContent .= '<img src="{$row.' . $field . '}" class="detail-image" style="max-width: 200px; max-height: 200px;">';
|
||||
} elseif ($val['formType'] == 'switch') {
|
||||
$fieldContent .= '{eq name="row.' . $field . '" value="1"}启用{else/}禁用{/eq}';
|
||||
} else {
|
||||
$fieldContent .= '{$row.' . $field . '|default=\'\'}';
|
||||
}
|
||||
|
||||
$fieldContent .= '</div>';
|
||||
$fieldContent .= '</div>';
|
||||
|
||||
// 注释掉表单模板生成逻辑
|
||||
/*
|
||||
$fieldContent = $this->replaceTemplate(
|
||||
$this->getTemplate($templateFile),
|
||||
[
|
||||
'comment' => $val['comment'],
|
||||
'field' => $field,
|
||||
'required' => '',
|
||||
'required_text' => '',
|
||||
'value' => $value,
|
||||
'define' => $define,
|
||||
]
|
||||
);
|
||||
*/
|
||||
$fieldContent = $this->buildReadFieldContent($field, $val);
|
||||
|
||||
// 根据字段类型分配到不同区域
|
||||
if (in_array($field, $basicFieldList)) {
|
||||
@@ -1570,7 +1513,6 @@ class BuildCurdServiceBase
|
||||
$viewReadValue = $this->replaceTemplate(
|
||||
$this->getTemplate("view{$this->DS}read"),
|
||||
[
|
||||
|
||||
'mainFields' => $mainFields,
|
||||
'basicFields' => $basicFields,
|
||||
]
|
||||
@@ -1661,7 +1603,22 @@ class BuildCurdServiceBase
|
||||
}
|
||||
}
|
||||
|
||||
$indexCols .= $this->formatColsRow("{width: 250, title: '操作', templet: ua.table.tool, operat: [{class: 'layui-btn layui-btn-primary layui-btn-xs', method: 'tab', field: 'id', text: '详情', title: '查看详情', auth: 'read', url: 'read', icon: ''}, 'edit', 'delete'], fixed:'right'},
|
||||
$indexCols .= $this->formatColsRow("{
|
||||
width: 250, title: '操作', templet: ua.table.tool, fixed: 'right', operat: [
|
||||
[{
|
||||
class: 'layui-btn layui-btn-primary layui-btn-xs',
|
||||
method: 'tab',
|
||||
field: 'id',
|
||||
text: '详情',
|
||||
title: '查看详情',
|
||||
auth: 'read',
|
||||
url: init.readUrl,
|
||||
icon: ''
|
||||
}],
|
||||
'edit',
|
||||
'delete'
|
||||
]
|
||||
},
|
||||
");
|
||||
|
||||
$js_index = $this->replaceTemplate(
|
||||
@@ -1884,4 +1841,79 @@ class BuildCurdServiceBase
|
||||
|
||||
return 'mixed';
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建详情页字段内容
|
||||
* @param $field
|
||||
* @param $val
|
||||
* @return string
|
||||
*/
|
||||
protected function buildReadFieldContent($field, $val)
|
||||
{
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readText";
|
||||
$define = '';
|
||||
|
||||
// 根据formType去获取具体的详情页模板
|
||||
if ($val['formType'] == 'image') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readImage";
|
||||
} elseif ($val['formType'] == 'images') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readImages";
|
||||
$define = isset($val['define']) ? $val['define'] : '|';
|
||||
} elseif ($val['formType'] == 'file') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readFile";
|
||||
} elseif ($val['formType'] == 'files') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readFiles";
|
||||
$define = isset($val['define']) ? $val['define'] : '|';
|
||||
} elseif ($val['formType'] == 'editor') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readEditor";
|
||||
} elseif (in_array($field, ['remark']) || $val['formType'] == 'textarea') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readTextarea";
|
||||
} elseif ($val['formType'] == 'date') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readDate";
|
||||
} elseif ($val['formType'] == 'radio' || $val['formType'] == 'switch') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readSwitch";
|
||||
if (isset($val['define']) && !empty($val['define'])) {
|
||||
// 构建下拉选择的显示值
|
||||
$var_name = $this->getFieldVarName($field);
|
||||
$define = '{volist name="' . $var_name . '" id="vo"}{eq name="vo.value" value="$row.' . $field . '"}<span class="layui-badge">{volist name="' . $var_name . '" id="item"}{eq name="item.value" value="$row.' . $field . '"}{$item.label}{/eq}{/volist}</span>{/eq}{/volist}';
|
||||
}
|
||||
} elseif ($val['formType'] == 'checkbox') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readSelect";
|
||||
if (isset($val['define']) && !empty($val['define'])) {
|
||||
$var_name = $this->getFieldVarName($field);
|
||||
$define = '{volist name="row.' . $field . '|explode=\',\'" id="item"><span class="layui-badge layui-badge-rim" style="margin-right: 5px;">{volist name="' . $var_name . '" id="vo"}{eq name="vo.value" value="$item"}{$vo.label}{/eq}{/volist}</span>{/volist}';
|
||||
}
|
||||
} elseif ($val['formType'] == 'select') {
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readSelect";
|
||||
if (isset($val['bindRelation'])) {
|
||||
$define = '{$row.' . $field . '}';
|
||||
} elseif (isset($val['define']) && !empty($val['define'])) {
|
||||
$var_name = $this->getFieldVarName($field);
|
||||
$define = '{volist name="' . $var_name . '" id="vo"}{eq name="vo.value" value="$row.' . $field . '"}{$vo.label}{/eq}{/volist}';
|
||||
}
|
||||
} elseif ($val['formType'] == 'relation') {
|
||||
// 关联表字段暂时使用文本显示
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readText";
|
||||
} elseif ($val['formType'] == 'table') {
|
||||
// 表格选择器暂时使用文本显示
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readText";
|
||||
} elseif ($val['formType'] == 'city') {
|
||||
// 城市选择器暂时使用文本显示
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readText";
|
||||
} elseif ($val['formType'] == 'tag') {
|
||||
// 标签暂时使用文本显示
|
||||
$templateFile = "view{$this->DS}module{$this->DS}readText";
|
||||
}
|
||||
|
||||
$fieldContent = $this->replaceTemplate(
|
||||
$this->getTemplate($templateFile),
|
||||
[
|
||||
'comment' => $val['comment'],
|
||||
'field' => $field,
|
||||
'define' => $define,
|
||||
]
|
||||
);
|
||||
|
||||
return $fieldContent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,2 +1,6 @@
|
||||
|
||||
$this->assign('{{var_name}}', $this->model::{{name}}, true);
|
||||
${{var_name}}_list = [];
|
||||
foreach ($this->model::{{name}} as $key => $value) {
|
||||
${{var_name}}_list[] = ['value' => $key, 'label' => $value];
|
||||
}
|
||||
$this->assign('{{var_name}}', ${{var_name}}_list, true);
|
||||
|
||||
@@ -4,7 +4,8 @@ var init = {
|
||||
indexUrl: '{{controllerUrl}}/index',
|
||||
addUrl: '{{controllerUrl}}/add' + location.search,
|
||||
editUrl: '{{controllerUrl}}/edit',
|
||||
readUrl: '{{controllerUrl}}/read',
|
||||
deleteUrl: '{{controllerUrl}}/delete',
|
||||
exportUrl: '{{controllerUrl}}/export',
|
||||
modifyUrl: '{{controllerUrl}}/modify',
|
||||
};
|
||||
};
|
||||
|
||||
12
extend/base/admin/service/curd/templates/model/accessor.code
Normal file
12
extend/base/admin/service/curd/templates/model/accessor.code
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* {{comment}}获取器
|
||||
* @param $value
|
||||
* @return array
|
||||
*/
|
||||
public function get{{accessorName}}Attr($value, $data)
|
||||
{
|
||||
if (empty($data['{{field}}'])) {
|
||||
return [];
|
||||
}
|
||||
return explode('{{separator}}', $data['{{field}}']);
|
||||
}
|
||||
@@ -15,7 +15,7 @@ class {{modelName}} extends TimeModel
|
||||
protected $deleteTime = {{deleteTime}};
|
||||
|
||||
{{selectList}}
|
||||
|
||||
{{accessorList}}
|
||||
{{relationList}}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.{{field}}"}
|
||||
{$row.{{field}}|date="Y-m-d H:i:s"}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="detail-field-item detail-field-full">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value detail-editor-content">
|
||||
{notempty name="row.{{field}}"}
|
||||
{$row.{{field}}|raw}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无内容</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,13 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.{{field}}"}
|
||||
<a href="{$row.{{field}}}" target="_blank" class="layui-btn layui-btn-xs layui-btn-normal">
|
||||
<i class="layui-icon layui-icon-download-circle"></i> 下载文件
|
||||
</a>
|
||||
<div style="margin-top: 5px; color: #999; font-size: 12px;">{$row.{{field}}}</div>
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无文件</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,17 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.{{field}}_list"}
|
||||
{volist name="row.{{field}}_list" id="file"}
|
||||
<div style="margin-bottom: 8px;">
|
||||
<a href="{$file}" target="_blank" class="layui-btn layui-btn-xs layui-btn-normal">
|
||||
<i class="layui-icon layui-icon-download-circle"></i> 文件 {$key + 1}
|
||||
</a>
|
||||
<span style="margin-left: 10px; color: #999; font-size: 12px;">{$file}</span>
|
||||
</div>
|
||||
{/volist}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无文件</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.{{field}}"}
|
||||
<img src="{$row.{{field}}}" class="detail-image" style="max-width: 300px; max-height: 300px; border-radius: 4px; cursor: pointer;" onclick="layer.photos({photos: {data: [{src: this.src}]}, anim: 5})">
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无图片</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,12 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.{{field}}_list"}
|
||||
{volist name="row.{{field}}_list" id="img"}
|
||||
<img src="{$img}" class="detail-image" style="max-width: 150px; max-height: 150px; margin-right: 10px; margin-bottom: 10px; border-radius: 4px; cursor: pointer;" onclick="layer.photos({photos: {data: {volist name='row.{{field}}_list' id='imgItem'}[{src: '{$imgItem}'}{notlast},{/notlast}]{/volist}}, start: {$key}}, anim: 5})">
|
||||
{/volist}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无图片</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,6 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{{define}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,6 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{{define}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value">
|
||||
{notempty name="row.{{field}}"}
|
||||
{$row.{{field}}}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无数据</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,10 @@
|
||||
<div class="detail-field-item">
|
||||
<div class="detail-field-label">{{comment}}</div>
|
||||
<div class="detail-field-value" style="white-space: pre-wrap;">
|
||||
{notempty name="row.{{field}}"}
|
||||
{$row.{{field}}|raw}
|
||||
{else/}
|
||||
<span class="layui-text-em">暂无内容</span>
|
||||
{/notempty}
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user