request->param(); $list = $model->lists($param); // 获取屏幕宽度 $screenWidth = isset($param['screenWidth']) ? floatval($param['screenWidth']) : 375; foreach($list as $index => $item) { // 解析style JSON $style = json_decode($item['style'], true); if (!$style) { $list[$index]['style'] = []; continue; } // 计算缩放比例 (基于背景图宽度) $backdropWidth = isset($style['backdrop']['width']) && $style['backdrop']['width'] > 0 ? floatval($style['backdrop']['width']) : 375; $scale = round($screenWidth / $backdropWidth, 4); // 需要缩放的数值字段(排除这些字段名) $excludeKeys = ['color', 'src', 'style', 'display', 'type', 'src']; // 递归处理style数组,对所有数值字段进行缩放 $this->scaleStyleValues($style, $scale, $excludeKeys); $list[$index]['style'] = $style; } return $this->renderSuccess('', $list); } /** * 递归缩放style中的数值字段 * @param array &$data 数据数组(引用传递) * @param float $scale 缩放比例 * @param array $excludeKeys 不需要缩放的键名 */ private function scaleStyleValues(&$data, $scale, $excludeKeys = []) { if (!is_array($data)) { return; } foreach ($data as $key => &$value) { if (is_array($value)) { // 递归处理子数组 $this->scaleStyleValues($value, $scale, $excludeKeys); } elseif (is_numeric($value) && !in_array($key, $excludeKeys)) { // 对数值进行缩放(非0值) if ($value != 0) { $value = round($value * $scale, 2); } } // 其他类型(字符串等)保持不变 } } /** * 获取模板详情 * @param $template_id * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function detail($template_id) { $model = new TemplateModel(); $detail = $model->detail($template_id); if (!$detail) { return $this->renderError('模板不存在'); } $detail['style'] = json_decode($detail['style'], true); return $this->renderSuccess($detail); } /** * 添加模板 */ public function add() { $param = request()->param(); $param['style'] = json_encode($param['style'], JSON_UNESCAPED_UNICODE); if ((new TemplateModel())->add($param)) { return $this->renderSuccess('添加成功'); } return $this->renderError('添加失败'); } /** * 编辑模板 */ public function edit() { $param = request()->param(); $model = (new TemplateModel())->detail($param['template_id']); if (!$model) { return $this->renderError('模板不存在'); } $param['style'] = json_encode($param['style'], JSON_UNESCAPED_UNICODE); unset($param['template_id']); if ($model->save($param)) { return $this->renderSuccess('', '编辑成功'); } return $this->renderError('编辑失败'); } }