diff --git a/.trae/documents/添加CURD详情页面生成功能.md b/.trae/documents/添加CURD详情页面生成功能.md deleted file mode 100644 index 2d1b084..0000000 --- a/.trae/documents/添加CURD详情页面生成功能.md +++ /dev/null @@ -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 - -
-
-
-
-

{{title}}

-
ID: {{id}}
-
-
- - - -
-
-
- - -
-
- -
-
- -
-
- - -
-
- -
-
-
-
-
-``` - -## 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样式,保持一致的视觉效果 \ No newline at end of file diff --git a/.trae/rules/project_rules.md b/CODERULE.md similarity index 100% rename from .trae/rules/project_rules.md rename to CODERULE.md diff --git a/app/admin/controller/test/Goods.php b/app/admin/controller/test/Goods.php index 3601754..9d9a9eb 100644 --- a/app/admin/controller/test/Goods.php +++ b/app/admin/controller/test/Goods.php @@ -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); } diff --git a/app/admin/model/TestGoods.php b/app/admin/model/TestGoods.php index 0c12663..b7d911c 100644 --- a/app/admin/model/TestGoods.php +++ b/app/admin/model/TestGoods.php @@ -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 } -} \ No newline at end of file +} diff --git a/app/admin/view/test/goods/_common.js b/app/admin/view/test/goods/_common.js index 6e85503..ae3225b 100644 --- a/app/admin/view/test/goods/_common.js +++ b/app/admin/view/test/goods/_common.js @@ -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', -}; \ No newline at end of file +}; diff --git a/app/admin/view/test/goods/index.js b/app/admin/view/test/goods/index.js index 8c46dfe..01c9dcc 100644 --- a/app/admin/view/test/goods/index.js +++ b/app/admin/view/test/goods/index.js @@ -2,7 +2,22 @@ $(function(){ ua.table.render({ init: init, cols: [[ - {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: '仓库'}, {field: 'tag_input', title: '商品标签 (输入)'}, {field: 'uid', title: '唯一id'}, {field: 'price', title: '价格'}, {field: 'detail', title: '详情'}, {field: 'mallCate.id', title: ''}, {field: 'mallCate.title', title: '分类名'}, {field: 'mallCate.image', title: '分类图片', templet: ua.table.image}, {field: 'mallCate.sort', title: '排序', edit: 'text'}, {field: 'mallCate.status', title: '状态', templet: ua.table.switch}, {field: 'mallCate.remark', title: '备注说明', templet: ua.table.text}, {field: 'mallCate.create_time', title: '创建时间'}, {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'}, + {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: '仓库'}, {field: 'tag_input', title: '商品标签 (输入)'}, {field: 'uid', title: '唯一id'}, {field: 'price', title: '价格'}, {field: 'detail', title: '详情'}, {field: 'mallCate.id', title: ''}, {field: 'mallCate.title', title: '分类名'}, {field: 'mallCate.image', title: '分类图片', templet: ua.table.image}, {field: 'mallCate.sort', title: '排序', edit: 'text'}, {field: 'mallCate.status', title: '状态', templet: ua.table.switch}, {field: 'mallCate.remark', title: '备注说明', templet: ua.table.text}, {field: 'mallCate.create_time', title: '创建时间'}, { + 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' + ] + }, ]], }); diff --git a/app/admin/view/test/goods/read.html b/app/admin/view/test/goods/read.html index 4c29a4b..d0513e9 100644 --- a/app/admin/view/test/goods/read.html +++ b/app/admin/view/test/goods/read.html @@ -19,7 +19,237 @@
-
分类ID
{$row.cate_id|default=''}
商品名称
{$row.title|default=''}
商品logo
商品图片
{$row.images|default=''}
商品描述
{$row.describe|raw|default=''}
总库存
{$row.total_stock|default=''}
合格证
{$row.cert_file|default=''}
检测报告
{$row.verfiy_file|default=''}
备注说明
{$row.remark|raw|default=''}
发布日期
{$row.publish_time|default=''}
售卖日期
{$row.sale_time|default=''}
简介
{$row.intro|raw|default=''}
秒杀状态
{$row.time_status|default=''}
是否推荐
{eq name="row.is_recommend" value="1"}启用{else/}禁用{/eq}
商品类型
{$row.shop_type|default=''}
商品标签
{$row.tag|default=''}
商品标签(单选)
{$row.tag_backup|default=''}
产地
{$row.from_area|default=''}
仓库
{$row.store_city|default=''}
商品标签 (输入)
{$row.tag_input|default=''}
唯一id
{$row.uid|default=''}
价格
{$row.price|default=''}
详情
{$row.detail|default=''}
+
+
分类ID
+
+ {notempty name="row.cate_id"} + {$row.cate_id} + {else/} + 暂无数据 + {/notempty} +
+
+
+
商品名称
+
+ {notempty name="row.title"} + {$row.title} + {else/} + 暂无数据 + {/notempty} +
+
+
+
商品logo
+
+ {notempty name="row.logo"} + + {else/} + 暂无图片 + {/notempty} +
+
+
+
商品图片
+
+ {notempty name="row.images_list"} + {volist name="row.images_list" id="img"} + + {/volist} + {else/} + 暂无图片 + {/notempty} +
+
+
+
商品描述
+
+ {notempty name="row.describe"} + {$row.describe|raw} + {else/} + 暂无内容 + {/notempty} +
+
+
+
总库存
+
+ {notempty name="row.total_stock"} + {$row.total_stock} + {else/} + 暂无数据 + {/notempty} +
+
+
+
合格证
+
+ {notempty name="row.cert_file"} + + 下载文件 + +
{$row.cert_file}
+ {else/} + 暂无文件 + {/notempty} +
+
+
+
检测报告
+
+ {notempty name="row.verfiy_file_list"} + {volist name="row.verfiy_file_list" id="file"} +
+ + 文件 {$key + 1} + + {$file} +
+ {/volist} + {else/} + 暂无文件 + {/notempty} +
+
+
+
备注说明
+
+ {notempty name="row.remark"} + {$row.remark|raw} + {else/} + 暂无内容 + {/notempty} +
+
+
+
发布日期
+
+ {notempty name="row.publish_time"} + {$row.publish_time|date="Y-m-d H:i:s"} + {else/} + 暂无数据 + {/notempty} +
+
+
+
售卖日期
+
+ {notempty name="row.sale_time"} + {$row.sale_time|date="Y-m-d H:i:s"} + {else/} + 暂无数据 + {/notempty} +
+
+
+
简介
+
+ {notempty name="row.intro"} + {$row.intro|raw} + {else/} + 暂无内容 + {/notempty} +
+
+
+
秒杀状态
+
+ {volist name="select_list_time_status" id="vo"}{eq name="vo.value" value="$row.time_status"}{$vo.label}{/eq}{/volist} +
+
+
+
是否推荐
+
+ {volist name="select_list_is_recommend" id="vo"}{eq name="vo.value" value="$row.is_recommend"}{volist name="select_list_is_recommend" id="item"}{eq name="item.value" value="$row.is_recommend"}{$item.label}{/eq}{/volist}{/eq}{/volist} +
+
+
+
商品类型
+
+ {volist name="row.shop_type|explode=','" id="item">{volist name="select_list_shop_type" id="vo"}{eq name="vo.value" value="$item"}{$vo.label}{/eq}{/volist}{/volist} +
+
+
+
商品标签
+
+ {notempty name="row.tag"} + {$row.tag} + {else/} + 暂无数据 + {/notempty} +
+
+
+
商品标签(单选)
+
+ {notempty name="row.tag_backup"} + {$row.tag_backup} + {else/} + 暂无数据 + {/notempty} +
+
+
+
产地
+
+ {notempty name="row.from_area"} + {$row.from_area} + {else/} + 暂无数据 + {/notempty} +
+
+
+
仓库
+
+ {notempty name="row.store_city"} + {$row.store_city} + {else/} + 暂无数据 + {/notempty} +
+
+
+
商品标签 (输入)
+
+ {notempty name="row.tag_input"} + {$row.tag_input} + {else/} + 暂无数据 + {/notempty} +
+
+
+
唯一id
+
+ {notempty name="row.uid"} + {$row.uid} + {else/} + 暂无数据 + {/notempty} +
+
+
+
价格
+
+ {notempty name="row.price"} + {$row.price} + {else/} + 暂无数据 + {/notempty} +
+
+
+
详情
+
+ {notempty name="row.detail"} + {$row.detail} + {else/} + 暂无数据 + {/notempty} +
+
+
@@ -30,7 +260,33 @@
ID
{$row.id}
-
排序
{$row.sort|default=''}
状态
{$row.status|default=''}
create_time
{$row.create_time|default=''}
+
+
排序
+
+ {notempty name="row.sort"} + {$row.sort} + {else/} + 暂无数据 + {/notempty} +
+
+
+
状态
+
+ {volist name="select_list_status" id="vo"}{eq name="vo.value" value="$row.status"}{volist name="select_list_status" id="item"}{eq name="item.value" value="$row.status"}{$item.label}{/eq}{/volist}{/eq}{/volist} +
+
+
+
create_time
+
+ {notempty name="row.create_time"} + {$row.create_time} + {else/} + 暂无数据 + {/notempty} +
+
+ diff --git a/extend/base/admin/service/curd/BuildCurdServiceBase.php b/extend/base/admin/service/curd/BuildCurdServiceBase.php index e8eab14..7c1a79c 100644 --- a/extend/base/admin/service/curd/BuildCurdServiceBase.php +++ b/extend/base/admin/service/curd/BuildCurdServiceBase.php @@ -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 = '
'; - $fieldContent .= '
' . $val['comment'] . '
'; - $fieldContent .= '
'; - - // 根据字段类型处理值的显示 - if ($val['formType'] == 'editor' || in_array($field, ['remark']) || $val['formType'] == 'textarea') { - $fieldContent .= '{$row.' . $field . '|raw|default=\'\'}'; - } elseif ($val['formType'] == 'image') { - $fieldContent .= ''; - } elseif ($val['formType'] == 'switch') { - $fieldContent .= '{eq name="row.' . $field . '" value="1"}启用{else/}禁用{/eq}'; - } else { - $fieldContent .= '{$row.' . $field . '|default=\'\'}'; - } - - $fieldContent .= '
'; - $fieldContent .= '
'; - - // 注释掉表单模板生成逻辑 - /* - $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 . '"}{volist name="' . $var_name . '" id="item"}{eq name="item.value" value="$row.' . $field . '"}{$item.label}{/eq}{/volist}{/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">{volist name="' . $var_name . '" id="vo"}{eq name="vo.value" value="$item"}{$vo.label}{/eq}{/volist}{/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; + } } diff --git a/extend/base/admin/service/curd/templates/controller/select.code b/extend/base/admin/service/curd/templates/controller/select.code index ac7ddda..1387626 100644 --- a/extend/base/admin/service/curd/templates/controller/select.code +++ b/extend/base/admin/service/curd/templates/controller/select.code @@ -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); diff --git a/extend/base/admin/service/curd/templates/js/_common.code b/extend/base/admin/service/curd/templates/js/_common.code index a0f7405..1e45c83 100644 --- a/extend/base/admin/service/curd/templates/js/_common.code +++ b/extend/base/admin/service/curd/templates/js/_common.code @@ -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', -}; \ No newline at end of file +}; diff --git a/extend/base/admin/service/curd/templates/model/accessor.code b/extend/base/admin/service/curd/templates/model/accessor.code new file mode 100644 index 0000000..78b33fd --- /dev/null +++ b/extend/base/admin/service/curd/templates/model/accessor.code @@ -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}}']); + } diff --git a/extend/base/admin/service/curd/templates/model/model.code b/extend/base/admin/service/curd/templates/model/model.code index 31dd34c..ebe9836 100644 --- a/extend/base/admin/service/curd/templates/model/model.code +++ b/extend/base/admin/service/curd/templates/model/model.code @@ -15,7 +15,7 @@ class {{modelName}} extends TimeModel protected $deleteTime = {{deleteTime}}; {{selectList}} - + {{accessorList}} {{relationList}} -} \ No newline at end of file +} diff --git a/extend/base/admin/service/curd/templates/view/module/readDate.code b/extend/base/admin/service/curd/templates/view/module/readDate.code new file mode 100644 index 0000000..be95fba --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readDate.code @@ -0,0 +1,10 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}"} + {$row.{{field}}|date="Y-m-d H:i:s"} + {else/} + 暂无数据 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readEditor.code b/extend/base/admin/service/curd/templates/view/module/readEditor.code new file mode 100644 index 0000000..3503ead --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readEditor.code @@ -0,0 +1,10 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}"} + {$row.{{field}}|raw} + {else/} + 暂无内容 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readFile.code b/extend/base/admin/service/curd/templates/view/module/readFile.code new file mode 100644 index 0000000..c10eb68 --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readFile.code @@ -0,0 +1,13 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}"} + + 下载文件 + +
{$row.{{field}}}
+ {else/} + 暂无文件 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readFiles.code b/extend/base/admin/service/curd/templates/view/module/readFiles.code new file mode 100644 index 0000000..e290164 --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readFiles.code @@ -0,0 +1,17 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}_list"} + {volist name="row.{{field}}_list" id="file"} +
+ + 文件 {$key + 1} + + {$file} +
+ {/volist} + {else/} + 暂无文件 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readImage.code b/extend/base/admin/service/curd/templates/view/module/readImage.code new file mode 100644 index 0000000..aac69ed --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readImage.code @@ -0,0 +1,10 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}"} + + {else/} + 暂无图片 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readImages.code b/extend/base/admin/service/curd/templates/view/module/readImages.code new file mode 100644 index 0000000..82df787 --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readImages.code @@ -0,0 +1,12 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}_list"} + {volist name="row.{{field}}_list" id="img"} + + {/volist} + {else/} + 暂无图片 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readSelect.code b/extend/base/admin/service/curd/templates/view/module/readSelect.code new file mode 100644 index 0000000..e779548 --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readSelect.code @@ -0,0 +1,6 @@ +
+
{{comment}}
+
+ {{define}} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readSwitch.code b/extend/base/admin/service/curd/templates/view/module/readSwitch.code new file mode 100644 index 0000000..e779548 --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readSwitch.code @@ -0,0 +1,6 @@ +
+
{{comment}}
+
+ {{define}} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readText.code b/extend/base/admin/service/curd/templates/view/module/readText.code new file mode 100644 index 0000000..10c88b5 --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readText.code @@ -0,0 +1,10 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}"} + {$row.{{field}}} + {else/} + 暂无数据 + {/notempty} +
+
diff --git a/extend/base/admin/service/curd/templates/view/module/readTextarea.code b/extend/base/admin/service/curd/templates/view/module/readTextarea.code new file mode 100644 index 0000000..5d4f7bd --- /dev/null +++ b/extend/base/admin/service/curd/templates/view/module/readTextarea.code @@ -0,0 +1,10 @@ +
+
{{comment}}
+
+ {notempty name="row.{{field}}"} + {$row.{{field}}|raw} + {else/} + 暂无内容 + {/notempty} +
+