quanwei
2 days ago 04102f7237efefa744090ed7c25f7b5d0807b679
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
namespace app\api\controller\plus\business;
 
use app\api\controller\Controller;
use app\api\model\plus\business\Template as TemplateModel;
 
class Template extends Controller
{
    /**
     * 获取模板列表
     */
    public function getList()
    {
        $model = new TemplateModel();
        $param = $this->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('编辑失败');
    }
}