from email.policy import default from settings import * from middleware import UnicornException import copy import requests from PIL import Image from io import BytesIO import base64 generate_templace = "/generate" # CUSTOMER_TEMPLATE_URL class CustomerTemplateService: def __init__(self): pass def generateTemplate(self,config_data,template_json): ''' 参数: config_data: 配置数据 template_json: 模板数据 ''' print("开始生成模板") # print("config_data",config_data) handler_config_data = self.__handler_config_data(config_data) print("handler_config_data",handler_config_data) headers = {"Content-Type": "application/json"} json_data = {"goodsList":handler_config_data,"canvasList":template_json} json_data = json.dumps(json_data,ensure_ascii=False) # print("json_data",json_data) template_result = requests.post(CUSTOMER_TEMPLATE_URL+generate_templace,data=json_data,headers=headers) resultJson = template_result.json() code = resultJson.get("code") msg = resultJson.get("msg") images = resultJson.get("images",[]) if code != 0: raise UnicornException(f"详情页生成失败,请检查模板数据是否正确:{msg}") for image in images: canvasIndex = image.get("canvasIndex") dataUrl = image.get("dataUrl") path = r"C:/Development/project/output/2025-12-05/详情图-测试" save_name = f"{path}/切片图-自定义-1/{int(canvasIndex)+1}.png" match dataUrl: case "model": # 复制模特图进行拼接 pass case "scene": # 复制场景图进行拼接 pass case _: self.save_base64_image(dataUrl,save_name) print("模板生成成功") def __handler_config_data(self,config_data): ''' 处理配置数据,返回一个新的数据对象 ''' # 深拷贝原始数据,确保不改变原数据对象 new_config_data = copy.deepcopy(config_data) # 如果输入是字典,则将其转换为目标结构 if isinstance(new_config_data, dict): result = [] for key, item in new_config_data.items(): # 提取需要添加的数据 additional_data = {k: v for k, v in item.items() if k not in ["款号", "货号资料"]} # 遍历货号资料,将额外数据添加到每个货号对象中 for product in item.get("货号资料", []): product.update(additional_data) # 构建目标结构 result.append({key: item}) return result return new_config_data def save_base64_image(self,base64_data, output_path): """ 将 Base64 编码的图像保存到本地文件 参数: - base64_data: str,Base64 编码的图像数据(不包含前缀如 "data:image/png;base64,") - output_path: str,保存图像的本地路径 """ if "data:image/jpeg;base64," in base64_data: base64_data = base64_data.split(",")[1] try: # 1. 解码 Base64 数据 image_data = base64.b64decode(base64_data) # 2. 加载图像数据 image = Image.open(BytesIO(image_data)) # 3. 检查路径是否存在,如果不存在则创建 directory = os.path.dirname(output_path) if directory and not os.path.exists(directory): os.makedirs(directory) print(f"目录已创建: {directory}") # 4. 保存图像到本地 image.save(output_path) print(f"图像已成功保存到 {output_path}") except Exception as e: print(f"保存图像失败: {e}") print(f"Base64 数据前 100 字符: {base64_data[:100]}")