Ethscriptions commited on
Commit
acee228
1 Parent(s): e5edf7a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +240 -283
app.py CHANGED
@@ -1,285 +1,242 @@
1
- import torch
2
- import gradio as gr
3
- from PIL import Image
4
- import qrcode
5
- from pathlib import Path
6
- from multiprocessing import cpu_count
7
  import requests
8
- import io
 
 
 
 
9
  import os
10
- from PIL import Image
11
-
12
- from diffusers import (
13
- StableDiffusionPipeline,
14
- StableDiffusionControlNetImg2ImgPipeline,
15
- ControlNetModel,
16
- DDIMScheduler,
17
- DPMSolverMultistepScheduler,
18
- DEISMultistepScheduler,
19
- HeunDiscreteScheduler,
20
- EulerDiscreteScheduler,
21
- )
22
-
23
- qrcode_generator = qrcode.QRCode(
24
- version=1,
25
- error_correction=qrcode.ERROR_CORRECT_H,
26
- box_size=10,
27
- border=4,
28
- )
29
-
30
- controlnet = ControlNetModel.from_pretrained(
31
- "DionTimmer/controlnet_qrcode-control_v1p_sd15", torch_dtype=torch.float16
32
- )
33
-
34
- pipe = StableDiffusionControlNetImg2ImgPipeline.from_pretrained(
35
- "runwayml/stable-diffusion-v1-5",
36
- controlnet=controlnet,
37
- safety_checker=None,
38
- torch_dtype=torch.float16,
39
- ).to("cuda")
40
- pipe.enable_xformers_memory_efficient_attention()
41
-
42
-
43
- def resize_for_condition_image(input_image: Image.Image, resolution: int):
44
- input_image = input_image.convert("RGB")
45
- W, H = input_image.size
46
- k = float(resolution) / min(H, W)
47
- H *= k
48
- W *= k
49
- H = int(round(H / 64.0)) * 64
50
- W = int(round(W / 64.0)) * 64
51
- img = input_image.resize((W, H), resample=Image.LANCZOS)
52
- return img
53
-
54
-
55
- SAMPLER_MAP = {
56
- "DPM++ Karras SDE": lambda config: DPMSolverMultistepScheduler.from_config(config, use_karras=True, algorithm_type="sde-dpmsolver++"),
57
- "DPM++ Karras": lambda config: DPMSolverMultistepScheduler.from_config(config, use_karras=True),
58
- "Heun": lambda config: HeunDiscreteScheduler.from_config(config),
59
- "Euler": lambda config: EulerDiscreteScheduler.from_config(config),
60
- "DDIM": lambda config: DDIMScheduler.from_config(config),
61
- "DEIS": lambda config: DEISMultistepScheduler.from_config(config),
62
- }
63
-
64
-
65
- def inference(
66
- qr_code_content: str,
67
- prompt: str,
68
- negative_prompt: str,
69
- guidance_scale: float = 10.0,
70
- controlnet_conditioning_scale: float = 2.0,
71
- strength: float = 0.8,
72
- seed: int = -1,
73
- init_image: Image.Image | None = None,
74
- qrcode_image: Image.Image | None = None,
75
- use_qr_code_as_init_image = True,
76
- sampler = "DPM++ Karras SDE",
77
- ):
78
- if prompt is None or prompt == "":
79
- raise gr.Error("Prompt is required")
80
-
81
- if qrcode_image is None and qr_code_content == "":
82
- raise gr.Error("QR Code Image or QR Code Content is required")
83
-
84
- pipe.scheduler = SAMPLER_MAP[sampler](pipe.scheduler.config)
85
-
86
- generator = torch.manual_seed(seed) if seed != -1 else torch.Generator()
87
-
88
- if qr_code_content != "" or qrcode_image.size == (1, 1):
89
- print("Generating QR Code from content")
90
- qr = qrcode.QRCode(
91
- version=1,
92
- error_correction=qrcode.constants.ERROR_CORRECT_H,
93
- box_size=10,
94
- border=4,
95
- )
96
- qr.add_data(qr_code_content)
97
- qr.make(fit=True)
98
-
99
- qrcode_image = qr.make_image(fill_color="black", back_color="white")
100
- qrcode_image = resize_for_condition_image(qrcode_image, 768)
101
- else:
102
- print("Using QR Code Image")
103
- qrcode_image = resize_for_condition_image(qrcode_image, 768)
104
-
105
- # hack due to gradio examples
106
- init_image = qrcode_image
107
-
108
- out = pipe(
109
- prompt=prompt,
110
- negative_prompt=negative_prompt,
111
- image=qrcode_image,
112
- control_image=qrcode_image, # type: ignore
113
- width=768, # type: ignore
114
- height=768, # type: ignore
115
- guidance_scale=float(guidance_scale),
116
- controlnet_conditioning_scale=float(controlnet_conditioning_scale), # type: ignore
117
- generator=generator,
118
- strength=float(strength),
119
- num_inference_steps=40,
120
- )
121
- return out.images[0] # type: ignore
122
-
123
-
124
- with gr.Blocks() as blocks:
125
- gr.Markdown(
126
- """
127
- # QR Code AI Art Generator
128
-
129
- ## 💡 How to generate beautiful QR codes
130
-
131
- We use the QR code image as the initial image **and** the control image, which allows you to generate
132
- QR Codes that blend in **very naturally** with your provided prompt.
133
- The strength parameter defines how much noise is added to your QR code and the noisy QR code is then guided towards both your prompt and the QR code image via Controlnet.
134
- Use a high strength value between 0.8 and 0.95 and choose a conditioning scale between 0.6 and 2.0.
135
- This mode arguably achieves the asthetically most appealing QR code images, but also requires more tuning of the controlnet conditioning scale and the strength value. If the generated image
136
- looks way to much like the original QR code, make sure to gently increase the *strength* value and reduce the *conditioning* scale. Also check out the examples below.
137
-
138
- model: https://huggingface.co/DionTimmer/controlnet_qrcode-control_v1p_sd15
139
-
140
- <a href="https://huggingface.co/spaces/huggingface-projects/QR-code-AI-art-generator?duplicate=true" style="display: inline-block;margin-top: .5em;margin-right: .25em;" target="_blank">
141
- <img style="margin-bottom: 0em;display: inline;margin-top: -.25em;" src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a> for no queue on your own hardware.</p>
142
- """
143
- )
144
-
145
- with gr.Row():
146
- with gr.Column():
147
- qr_code_content = gr.Textbox(
148
- label="QR Code Content",
149
- info="QR Code Content or URL",
150
- value="",
151
- )
152
- with gr.Accordion(label="QR Code Image (Optional)", open=False):
153
- qr_code_image = gr.Image(
154
- label="QR Code Image (Optional). Leave blank to automatically generate QR code",
155
- type="pil",
156
- )
157
-
158
- prompt = gr.Textbox(
159
- label="Prompt",
160
- info="Prompt that guides the generation towards",
161
- )
162
- negative_prompt = gr.Textbox(
163
- label="Negative Prompt",
164
- value="ugly, disfigured, low quality, blurry, nsfw",
165
- )
166
- use_qr_code_as_init_image = gr.Checkbox(label="Use QR code as init image", value=True, interactive=False, info="Whether init image should be QR code. Unclick to pass init image or generate init image with Stable Diffusion 2.1")
167
-
168
- with gr.Accordion(label="Init Images (Optional)", open=False, visible=False) as init_image_acc:
169
- init_image = gr.Image(label="Init Image (Optional). Leave blank to generate image with SD 2.1", type="pil")
170
-
171
-
172
- with gr.Accordion(
173
- label="Params: The generated QR Code functionality is largely influenced by the parameters detailed below",
174
- open=True,
175
- ):
176
- controlnet_conditioning_scale = gr.Slider(
177
- minimum=0.0,
178
- maximum=5.0,
179
- step=0.01,
180
- value=1.1,
181
- label="Controlnet Conditioning Scale",
182
- )
183
- strength = gr.Slider(
184
- minimum=0.0, maximum=1.0, step=0.01, value=0.9, label="Strength"
185
- )
186
- guidance_scale = gr.Slider(
187
- minimum=0.0,
188
- maximum=50.0,
189
- step=0.25,
190
- value=7.5,
191
- label="Guidance Scale",
192
- )
193
- sampler = gr.Dropdown(choices=list(SAMPLER_MAP.keys()), value="DPM++ Karras SDE", label="Sampler")
194
- seed = gr.Slider(
195
- minimum=-1,
196
- maximum=9999999999,
197
- step=1,
198
- value=2313123,
199
- label="Seed",
200
- randomize=True,
201
- )
202
- with gr.Row():
203
- run_btn = gr.Button("Run")
204
- with gr.Column():
205
- result_image = gr.Image(label="Result Image")
206
- run_btn.click(
207
- inference,
208
- inputs=[
209
- qr_code_content,
210
- prompt,
211
- negative_prompt,
212
- guidance_scale,
213
- controlnet_conditioning_scale,
214
- strength,
215
- seed,
216
- init_image,
217
- qr_code_image,
218
- use_qr_code_as_init_image,
219
- sampler,
220
- ],
221
- outputs=[result_image],
222
- )
223
-
224
- gr.Examples(
225
- examples=[
226
- [
227
- "https://huggingface.co/",
228
- "A sky view of a colorful lakes and rivers flowing through the desert",
229
- "ugly, disfigured, low quality, blurry, nsfw",
230
- 7.5,
231
- 1.3,
232
- 0.9,
233
- 5392011833,
234
- None,
235
- None,
236
- True,
237
- "DPM++ Karras SDE",
238
- ],
239
- [
240
- "https://huggingface.co/",
241
- "Bright sunshine coming through the cracks of a wet, cave wall of big rocks",
242
- "ugly, disfigured, low quality, blurry, nsfw",
243
- 7.5,
244
- 1.11,
245
- 0.9,
246
- 2523992465,
247
- None,
248
- None,
249
- True,
250
- "DPM++ Karras SDE",
251
- ],
252
- [
253
- "https://huggingface.co/",
254
- "Sky view of highly aesthetic, ancient greek thermal baths in beautiful nature",
255
- "ugly, disfigured, low quality, blurry, nsfw",
256
- 7.5,
257
- 1.5,
258
- 0.9,
259
- 2523992465,
260
- None,
261
- None,
262
- True,
263
- "DPM++ Karras SDE",
264
- ],
265
- ],
266
- fn=inference,
267
- inputs=[
268
- qr_code_content,
269
- prompt,
270
- negative_prompt,
271
- guidance_scale,
272
- controlnet_conditioning_scale,
273
- strength,
274
- seed,
275
- init_image,
276
- qr_code_image,
277
- use_qr_code_as_init_image,
278
- sampler,
279
- ],
280
- outputs=[result_image],
281
- cache_examples=True,
282
- )
283
-
284
- blocks.queue(concurrency_count=1, max_size=20)
285
- blocks.launch(share=bool(os.environ.get("SHARE", False)))
 
1
+ import streamlit as st
 
 
 
 
 
2
  import requests
3
+ import re
4
+ import json
5
+ import hashlib
6
+ import base64
7
+ import sqlite3
8
  import os
9
+
10
+ # 获取当前文件目录
11
+ current_dir = os.path.dirname(os.path.abspath(__file__))
12
+
13
+ # 构造数据库文件路径
14
+ rarbg_db_file = os.path.join(current_dir, 'rarbg_db.db')
15
+
16
+ my_style = '''
17
+ <style>
18
+ .tag {
19
+ display: inline-block;
20
+ padding: 2px 6px;
21
+ background-color: #f2f2f2; /* 默认的背景颜色 */
22
+ border-radius: 5px; /* 圆角效果 */
23
+ margin: 0 2px;
24
+ transition: background-color 0.3s; /* 平滑的颜色过渡效果 */
25
+ }
26
+
27
+ .tag:hover {
28
+ background-color: #cffd51; /* 鼠标经过时的背景颜色 */
29
+ }
30
+
31
+ .tag:active {
32
+ background-color: #cffd51; /* 鼠标按下时的背景颜色 */
33
+ }
34
+ </style>
35
+ '''
36
+
37
+
38
+ # 图片Base64
39
+ def image_to_base64(img_path):
40
+ with open(img_path, "rb") as image_file:
41
+ return base64.b64encode(image_file.read()).decode()
42
+
43
+
44
+ st.set_page_config(page_title="花醉红尘 — 花酒果酒连锁品牌", page_icon="🌞", layout='centered', initial_sidebar_state='auto')
45
+
46
+ # 首页
47
+ st.markdown(
48
+ f'# <a href="https://huazuihongchen.cn/" target="_self"><img src="data:image/jpeg;base64,{image_to_base64(os.path.join("huazuihongchen_logo_block.png"))}" alt="Image" width="52px" height="86px" style="border-radius: 8px; box-shadow: 0px 0px 0px rgba(0,0,0,0.1);"/></a> 花醉红尘 — 花酒果酒连锁品牌',
49
+ unsafe_allow_html=True)
50
+ st.subheader('', anchor=False, divider='red')
51
+ st.video('huazuihongchen.mp4', format="video/mp4", start_time=0)
52
+ st.markdown(
53
+ '在中国,也有着许多美丽的爱情故事。这些故事,不仅仅是一段段浪漫的爱情故事,更是体现了一个民族丰富的文化底蕴、精神内涵和价值观念,赋予了人们对爱情的新的定义和理解。')
54
+ st.markdown(
55
+ '品牌花醉红尘,正是基于这些美丽的爱情故事而诞生的。品牌以红色为主调,象征着热情与浪漫,也寓意着品牌对红尘世界的热爱和关注。品牌旗下的鲜花酒系列,则将鲜花的美丽与酒的香醇融合,打造出一种兼具美感、风味和具有文化内涵的新型酒品。')
56
+
57
+ brand_story = st.expander('品牌故事', expanded=False)
58
+ brand_story.markdown('## 《爱的千鹊桥》')
59
+
60
+ brand_story.markdown(
61
+ '我是花醉红尘创始人黄朝阳,品牌的创立源于我的一段爱情故事。那时是我奋斗的年龄,遇到了一位令我心动的女生。虽两心相悦,但爱情来临的时候我恰好一无所有,于是我努力打拼希望有足够能力照顾女生的时候再去表白。努力了一段时间后,当我回来想要向女生表白的时候,发现女生已经嫁人了。')
62
+
63
+ brand_story.markdown(
64
+ '女生犹如花一样娇美,爱是一种甜蜜的醉意,回想起相遇的种种经历,于是我把所有的爱意化作一份祝福,创立鲜花酒品牌“花醉红尘”,以此品牌祝福所有有情人终成眷属。')
65
+
66
+ brand_story.markdown('**愿以后所有男生都能无所畏惧,勇敢向喜欢的女生告白。**')
67
+
68
+ brand_story.markdown('**愿所有的女生都能被温柔以待。**')
69
+
70
+ brand_story.markdown('**愿爱永葆这份朝气。**')
71
+
72
+
73
+ st.markdown('## 系列产品')
74
+ tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs(["告白款 - 菊花酒", "告白款 - 桃花醉", "告白款 - 桂花酒", "告白款 - 茉莉花酒", "告白款 - 洛神花酒", "告白款 - 樱花醉", "告白款 - 玫瑰花酒"])
75
+ with tab1:
76
+ st.markdown(
77
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款菊花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
78
+ unsafe_allow_html=True)
79
+ st.markdown('')
80
+ st.markdown('### 告白款 - 菊花酒')
81
+ st.markdown('类型:花酒')
82
+ st.markdown('规格:500ml')
83
+ st.markdown('品牌:花醉红尘')
84
+ st.markdown('价格:¥128.00')
85
+
86
+ with tab2:
87
+ st.markdown(
88
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款桃花醉.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
89
+ unsafe_allow_html=True)
90
+ st.markdown('')
91
+ st.markdown('### 告白款 - 桃花醉')
92
+ st.markdown('类型:果酒')
93
+ st.markdown('规格:500ml')
94
+ st.markdown('品牌:花醉红尘')
95
+ st.markdown('价格:¥128.00')
96
+
97
+ with tab3:
98
+ st.markdown(
99
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款桂花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
100
+ unsafe_allow_html=True)
101
+ st.markdown('')
102
+ st.markdown('### 告白款 - 桂花酒')
103
+ st.markdown('类���:花酒')
104
+ st.markdown('规格:500ml')
105
+ st.markdown('品牌:花醉红尘')
106
+ st.markdown('价格:¥128.00')
107
+
108
+ with tab4:
109
+ st.markdown(
110
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款茉莉花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
111
+ unsafe_allow_html=True)
112
+ st.markdown('')
113
+ st.markdown('### 告白款 - 茉莉花酒')
114
+ st.markdown('类型:花酒')
115
+ st.markdown('规格:500ml')
116
+ st.markdown('品牌:花醉红尘')
117
+ st.markdown('价格:¥128.00')
118
+
119
+ with tab5:
120
+ st.markdown(
121
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款洛神花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
122
+ unsafe_allow_html=True)
123
+ st.markdown('')
124
+ st.markdown('### 告白款 - 洛神花酒')
125
+ st.markdown('类型:花酒')
126
+ st.markdown('规格:500ml')
127
+ st.markdown('品牌:花醉红尘')
128
+ st.markdown('价格:¥128.00')
129
+
130
+ with tab6:
131
+ st.markdown(
132
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款樱花醉.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
133
+ unsafe_allow_html=True)
134
+ st.markdown('')
135
+ st.markdown('### 告白款 - 樱花醉')
136
+ st.markdown('类型:果酒')
137
+ st.markdown('规格:500ml')
138
+ st.markdown('品牌:花醉红尘')
139
+ st.markdown('价格:¥128.00')
140
+
141
+ with tab7:
142
+ st.markdown(
143
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("告白款玫瑰花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
144
+ unsafe_allow_html=True)
145
+ st.markdown('')
146
+ st.markdown('### 告白款 - 玫瑰花酒')
147
+ st.markdown('类型:果酒')
148
+ st.markdown('规格:500ml')
149
+ st.markdown('品牌:花醉红尘')
150
+ st.markdown('价格:¥128.00')
151
+
152
+ tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs(["婚庆款 - 樱花醉", "婚庆款 - 洛神花酒", "婚庆款 - 桂花酒", "婚庆款 - 玫瑰花酒", "婚庆款 - 茉莉花酒", "婚庆款 - 菊花酒", "婚庆款 - 桃花醉"])
153
+ with tab1:
154
+ st.markdown(
155
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款樱花醉.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
156
+ unsafe_allow_html=True)
157
+ st.markdown('')
158
+ st.markdown('### 婚庆款 - 樱花醉')
159
+ st.markdown('类型:果酒')
160
+ st.markdown('规格:500ml')
161
+ st.markdown('品牌:花醉红尘')
162
+ st.markdown('价格:¥198.00')
163
+
164
+ with tab2:
165
+ st.markdown(
166
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款洛神花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
167
+ unsafe_allow_html=True)
168
+ st.markdown('')
169
+ st.markdown('### 婚庆款 - 洛神花酒')
170
+ st.markdown('类型:花酒')
171
+ st.markdown('规格:500ml')
172
+ st.markdown('品牌:花醉红尘')
173
+ st.markdown('价格:¥198.00')
174
+
175
+ with tab3:
176
+ st.markdown(
177
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款桂花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
178
+ unsafe_allow_html=True)
179
+ st.markdown('')
180
+ st.markdown('### 婚庆款 - 桂花酒')
181
+ st.markdown('类型:花酒')
182
+ st.markdown('规格:500ml')
183
+ st.markdown('品牌:花醉红尘')
184
+ st.markdown('价格:¥198.00')
185
+
186
+ with tab4:
187
+ st.markdown(
188
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款玫瑰花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
189
+ unsafe_allow_html=True)
190
+ st.markdown('')
191
+ st.markdown('### 婚庆款 - 玫瑰花酒')
192
+ st.markdown('类型:花酒')
193
+ st.markdown('规格:500ml')
194
+ st.markdown('品牌:花醉红尘')
195
+ st.markdown('价格:¥198.00')
196
+
197
+ with tab5:
198
+ st.markdown(
199
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款茉莉花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
200
+ unsafe_allow_html=True)
201
+ st.markdown('')
202
+ st.markdown('### 婚庆款 - 茉莉花酒')
203
+ st.markdown('类型:花酒')
204
+ st.markdown('规格��500ml')
205
+ st.markdown('品牌:花醉红尘')
206
+ st.markdown('价格:¥198.00')
207
+
208
+ with tab6:
209
+ st.markdown(
210
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款菊花酒.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
211
+ unsafe_allow_html=True)
212
+ st.markdown('')
213
+ st.markdown('### 婚庆款 - 菊花酒')
214
+ st.markdown('类型:花酒')
215
+ st.markdown('规格:500ml')
216
+ st.markdown('品牌:花醉红尘')
217
+ st.markdown('价格:¥198.00')
218
+
219
+ with tab7:
220
+ st.markdown(
221
+ f'<img src="data:image/jpeg;base64,{image_to_base64(os.path.join("婚庆款桃花醉.jpg"))}" alt="Image" style="max-width: 100%; width: 100%; height: auto; border-radius: 10px; display: block; box-shadow: 5px 5px 15px rgba(0,0,0,0.3);"/>',
222
+ unsafe_allow_html=True)
223
+ st.markdown('')
224
+ st.markdown('### 婚庆款 - 桃花醉')
225
+ st.markdown('类型:果酒')
226
+ st.markdown('规格:500ml')
227
+ st.markdown('品牌:花醉红尘')
228
+ st.markdown('价格:¥198.00')
229
+
230
+
231
+ industry_information = st.expander('行业资讯', expanded=False)
232
+ industry_information.markdown('## 行业资讯')
233
+ industry_information.markdown('[花之天下,花醉红尘鲜花酒](https://www.huazuihongchen.cn/nd.jsp?id=14)')
234
+ industry_information.markdown('[花果酒前景分析](https://www.huazuihongchen.cn/nd.jsp?id=4)')
235
+ industry_information.markdown('[钟爱花果酒](https://www.huazuihongchen.cn/nd.jsp?id=3)')
236
+
237
+ st.markdown('## 公司简介')
238
+ st.markdown('### 广州醉红尘贸易有限公司')
239
+ st.markdown('广州醉红尘贸易有限公司是一家位于广州市花都区的贸易公司,成立于2022年。公司主营酒类商品,涵盖国内外商品贸易、进出口贸易、跨境电商等领域。公司秉承“诚信、务实、创新、共赢”的经营理念,致力于为客户提供优质的商品和服务。')
240
+ st.markdown(
241
+ f'''{my_style}# <span class="tag"><a href="tel:4008705876" target="_blank" style="text-decoration: none;">招商加盟热线:4008705876 </span></a>
242
+ ''', unsafe_allow_html=True)