# 后台时间显示优化示例 ## 概述 优化了UCore GridHelper中的创建时间/修改时间展示,统一使用"年-月-日 时:分:秒"格式,并新增了组合时间列功能。 ## 优化内容 ### 1. 优化现有方法 #### columnCreatedAt() 方法优化 ```php // 优化前 public function columnCreatedAt() { return $this->grid->column('created_at', '创建时间')->sortable(); } // 优化后 public function columnCreatedAt($field = 'created_at', $label = '创建时间') { return $this->columnDateTime($field, $label); } ``` #### columnUpdatedAt() 方法优化 ```php // 优化前 public function columnUpdatedAt() { return $this->grid->column('updated_at', '更新时间')->sortable(); } // 优化后 public function columnUpdatedAt($field = 'updated_at', $label = '更新时间') { return $this->columnDateTime($field, $label); } ``` ### 2. 新增组合时间列 #### columnTimes() 方法 ```php public function columnTimes($createdAtField = 'created_at', $updatedAtField = 'updated_at', $label = '时间信息') { return $this->grid->column($createdAtField, $label)->display(function ($createdAt) use ($updatedAtField) { $updatedAt = $this->{$updatedAtField} ?? ''; // 格式化创建时间 $createdAtFormatted = $this->formatDateTime($createdAt); $createdAtHtml = "
创建: {$createdAtFormatted}
"; // 格式化更新时间 $updatedAtHtml = ''; if ($updatedAt) { $updatedAtFormatted = $this->formatDateTime($updatedAt); $updatedAtHtml = "
更新: {$updatedAtFormatted}
"; } return $createdAtHtml . $updatedAtHtml; })->sortable(); } ``` ### 3. 统一格式化方法 #### formatDateTime() 私有方法 ```php private function formatDateTime($value) { // 检查空值(但不包括0,因为0是有效的时间戳) if (is_null($value) || $value === '') { return '-'; } // 如果是时间戳,转换为日期时间字符串 if (is_numeric($value)) { return date('Y-m-d H:i:s', $value); } // 如果是Carbon实例或DateTime对象 if ($value instanceof \Carbon\Carbon || $value instanceof \DateTime) { return $value->format('Y-m-d H:i:s'); } // 如果是字符串,尝试转换为标准格式 if (is_string($value)) { try { $date = new \DateTime($value); return $date->format('Y-m-d H:i:s'); } catch (\Exception $e) { return $value; // 如果转换失败,返回原值 } } return $value; } ``` ## 使用示例 ### 1. 基本用法(向后兼容) ```php gridMake(); $helper = $this->gridHelper($grid); // 现有代码无需修改,自动使用新的格式化 $helper->columnCreatedAt(); // 自动格式化为 Y-m-d H:i:s $helper->columnUpdatedAt(); // 自动格式化为 Y-m-d H:i:s return $grid; } } ``` ### 2. 自定义字段名 ```php protected function grid() { $grid = $this->gridMake(); $helper = $this->gridHelper($grid); // 使用自定义字段名和标签 $helper->columnCreatedAt('register_time', '注册时间'); $helper->columnUpdatedAt('last_login_time', '最后登录'); return $grid; } ``` ### 3. 组合时间列 ```php protected function grid() { $grid = $this->gridMake(); $helper = $this->gridHelper($grid); // 基本ID列 $helper->columnId(); // 业务字段 $grid->column('username', '用户名'); $grid->column('email', '邮箱'); // 使用组合时间列,节省空间 $helper->columnTimes(); // 默认使用 created_at 和 updated_at // 或者自定义字段 $helper->columnTimes('start_time', 'end_time', '活动时间'); return $grid; } ``` ### 4. 混合使用 ```php protected function grid() { $grid = $this->gridMake(); $helper = $this->gridHelper($grid); $helper->columnId(); $grid->column('title', '标题'); // 重要的时间字段单独显示 $helper->columnCreatedAt(); // 其他时间字段组合显示 $helper->columnTimes('published_at', 'expired_at', '发布时间'); return $grid; } ``` ## 显示效果 ### 1. 单独时间列 ``` 创建时间: 2023-12-25 14:30:45 更新时间: 2023-12-26 09:15:30 ``` ### 2. 组合时间列 ``` 时间信息: 创建: 2023-12-25 14:30:45 更新: 2023-12-26 09:15:30 ``` ## 优势 ### 1. 向后兼容 - 现有代码无需修改 - 自动应用新的格式化规则 ### 2. 统一格式 - 所有时间字段使用相同的 `Y-m-d H:i:s` 格式 - 消除了格式不一致的问题 ### 3. 灵活性 - 支持自定义字段名和标签 - 提供组合显示选项 ### 4. 空间优化 - 组合时间列可以节省列表空间 - 适合字段较多的管理页面 ### 5. 代码复用 - 统一的格式化逻辑 - 减少重复代码 ## 注意事项 1. **时区处理**: 时间戳会根据服务器时区进行转换 2. **空值显示**: null或空字符串显示为 `-` 3. **排序功能**: 所有时间列都自动支持排序 4. **错误处理**: 格式转换失败时返回原始值 5. **性能**: 格式化在前端显示时进行,不影响数据库查询 ## 测试验证 项目中包含了完整的单元测试,验证了优化后方法的正确性: ```bash vendor/bin/phpunit tests/Unit/UCore/GridHelperDateTimeTest.php # OK (2 tests, 13 assertions) ``` ## 迁移建议 ### 立即生效 现有使用 `columnCreatedAt()` 和 `columnUpdatedAt()` 的代码会自动使用新的格式化,无需修改。 ### 推荐优化 对于字段较多的列表页面,建议使用 `columnTimes()` 组合显示来节省空间: ```php // 推荐:使用组合时间列 $helper->columnTimes(); // 而不是: $helper->columnCreatedAt(); $helper->columnUpdatedAt(); ```