commit b66f683dfb73ed7c7ac0ce72647cd9eb76482cf7
Author: HuangHai <10402852@qq.com>
Date: Mon Jan 12 07:49:18 2026 +0800
'commit'
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..1c2fda5
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/Crawler.iml b/.idea/Crawler.iml
new file mode 100644
index 0000000..4ba3f29
--- /dev/null
+++ b/.idea/Crawler.iml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..fad0e18
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..a1ff0d1
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..f1a2754
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..3f1db62
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Apps/Json/Ref/T6_PaChongGaoDe.py b/Apps/Json/Ref/T6_PaChongGaoDe.py
new file mode 100644
index 0000000..a04ad16
--- /dev/null
+++ b/Apps/Json/Ref/T6_PaChongGaoDe.py
@@ -0,0 +1,888 @@
+"""
+高德地图高精度坐标获取工具
+
+使用说明:
+1、注册用户,实名认证
+2、手动登录,选择微信登录,生成cookie
+3、复用这个cookie,打开浏览器,传入单位名称,查询坐标,得到小数点6位的坐标数据
+"""
+import json
+import os
+import random
+import re
+import sys
+import time
+import weakref
+
+from selenium import webdriver
+from selenium.webdriver.chrome.options import Options
+from selenium.webdriver.chrome.service import Service
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.support.ui import WebDriverWait
+
+# 添加SQLAlchemy同步操作
+from sqlalchemy import create_engine, text
+from sqlalchemy.orm import sessionmaker
+
+# 数据库连接配置
+from Config.Config import POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE
+
+# 创建同步数据库连接URL
+db_url = f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DATABASE}"
+
+# 创建数据库引擎和会话工厂
+engine = create_engine(db_url)
+SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+
+# 数据库操作函数
+def find(sql, params=None):
+ """
+ 执行SQL查询,返回所有结果
+
+ Args:
+ sql: SQL查询语句
+ params: 参数字典
+
+ Returns:
+ list: 查询结果的字典列表
+ """
+ with SessionLocal() as session:
+ result = session.execute(text(sql), params)
+ rows = result.fetchall()
+ return [dict(zip(result.keys(), row)) for row in rows]
+
+
+def findFirst(sql, params=None):
+ """
+ 执行SQL查询,返回第一条结果
+
+ Args:
+ sql: SQL查询语句
+ params: 参数字典
+
+ Returns:
+ dict or None: 第一条查询结果的字典,或None(如果没有结果)
+ """
+ with SessionLocal() as session:
+ result = session.execute(text(sql), params)
+ row = result.fetchone()
+ if row:
+ return dict(zip(result.keys(), row))
+ return None
+
+
+def execute_update(sql, params=None):
+ """
+ 执行SQL更新操作
+
+ Args:
+ sql: SQL语句
+ params: 参数字典
+
+ Returns:
+ int: 受影响的行数
+ """
+ with SessionLocal() as session:
+ with session.begin():
+ result = session.execute(text(sql), params)
+ return result.rowcount
+
+
+# 是否使用无头模式运行(True=无头模式,False=有界面模式)
+HEADLESS = False
+
+# 最大重试次数
+MAX_RETRIES = 1
+
+# WebDriver超时设置(秒)
+TIMEOUT_SHORT = 5
+TIMEOUT_MEDIUM = 10
+TIMEOUT_LONG = 15
+
+
+def parse_coordinates_info(text):
+ """解析坐标信息,提取第一个搜索结果的坐标"""
+ # 检查输入参数
+ if not text:
+ return None
+
+ try:
+ # 清理文本,移除可能的干扰字符
+ clean_text = re.sub(r'[\u3000\t\n\r ]+', ',', text) # 替换空格和制表符为逗号
+ clean_text = re.sub(r'[,,]+', ',', clean_text) # 统一使用英文逗号
+ clean_text = clean_text.strip(',') # 移除首尾逗号
+
+ # 匹配高德地图坐标格式 - 中国地区的坐标范围,放宽小数位数要求
+ pattern = r'([7-9]?[0-9]\.[0-9]{1,}|1[0-3][0-9]\.[0-9]{1,})[,,]\s*([1-8]?[0-9]\.[0-9]{1,}|90\.[0-9]{1,})'
+ matches = re.finditer(pattern, clean_text)
+
+ valid_coordinates = []
+
+ for match in matches:
+ lng = match.group(1).strip()
+ lat = match.group(2).strip()
+
+ # 转换为浮点数进行范围验证
+ try:
+ lng_float = float(lng)
+ lat_float = float(lat)
+
+ # 检查坐标是否在中国地区合理范围内
+ if 70 <= lng_float <= 140 and 0 <= lat_float <= 60:
+ # 计算坐标的精度(小数位数)
+ lng_precision = len(lng.split('.')[1]) if '.' in lng else 0
+ lat_precision = len(lat.split('.')[1]) if '.' in lat else 0
+
+ # 接受至少有1位小数的坐标,不再严格要求4位小数
+ valid_coordinates.append((lng_float, lat_float, lng, lat))
+ except ValueError:
+ continue
+
+ if valid_coordinates:
+ # 如果找到多个有效坐标,选择小数位数最多的
+ valid_coordinates.sort(
+ key=lambda x: len(x[2].split('.')[1]) + len(x[3].split('.')[1]) if '.' in x[2] and '.' in x[3] else 0,
+ reverse=True)
+ _, _, lng, lat = valid_coordinates[0]
+
+ return {
+ 'lng': lng,
+ 'lat': lat
+ }
+ else:
+ return None
+
+ except Exception as e:
+ return None
+
+
+def export_cookies_from_browser(driver, output_file='amap_cookies.json'):
+ """
+ 导出浏览器中的Cookie到文件
+
+ Args:
+ driver: WebDriver实例
+ output_file: Cookie导出文件路径
+
+ Returns:
+ bool: 导出是否成功
+ """
+ # 检查输入参数
+ if not driver:
+ print("❌ WebDriver实例无效")
+ return False
+
+ if not output_file:
+ print("❌ Cookie输出文件路径无效")
+ return False
+
+ try:
+ print(f"正在导出Cookie到文件: {output_file}")
+
+ # 确保目录存在
+ output_dir = os.path.dirname(output_file)
+ if output_dir and not os.path.exists(output_dir):
+ try:
+ os.makedirs(output_dir, exist_ok=True)
+ except Exception as e:
+ print(f"创建输出目录失败: {str(e)}")
+ return False
+
+ # 获取Cookie
+ cookies = driver.get_cookies()
+
+ if not cookies:
+ print("⚠️ 未获取到任何Cookie")
+ return False
+
+ # 保存Cookie到文件
+ with open(output_file, 'w', encoding='utf-8') as f:
+ json.dump(cookies, f, ensure_ascii=False, indent=2)
+
+ print(f"成功导出 {len(cookies)} 个Cookie")
+ print(f"Cookie已成功导出到: {os.path.abspath(output_file)}")
+ return True
+ except Exception as e:
+ print(f"导出Cookie失败: {str(e)}")
+ return False
+
+
+def load_cookies_to_browser(driver, cookie_file='amap_cookies.json'):
+ """
+ 从文件加载Cookie到浏览器
+
+ Args:
+ driver: WebDriver实例
+ cookie_file: Cookie文件路径
+
+ Returns:
+ bool: 加载是否成功
+ """
+ try:
+ # 检查输入参数
+ if not driver:
+ print("❌ WebDriver实例无效")
+ return False
+
+ if not cookie_file:
+ print("❌ Cookie文件路径无效")
+ return False
+
+ if not os.path.exists(cookie_file):
+ return False
+
+ # 先访问高德域名,确保Cookie可以被正确设置
+ import ssl
+ ssl._create_default_https_context = ssl._create_unverified_context
+ driver.get('https://www.amap.com')
+
+ time.sleep(1) # 等待页面加载
+
+ # 加载Cookie
+ with open(cookie_file, 'r', encoding='utf-8') as f:
+ cookies = json.load(f)
+
+ # 添加每个Cookie
+ success_count = 0
+ for cookie in cookies:
+ # 移除可能导致问题的属性
+ if 'expiry' in cookie:
+ cookie['expiry'] = int(cookie['expiry'])
+ if 'sameSite' in cookie and cookie['sameSite'] not in ['Strict', 'Lax', 'None']:
+ del cookie['sameSite']
+
+ try:
+ driver.add_cookie(cookie)
+ success_count += 1
+ except Exception as e:
+ #print(f"添加Cookie失败 (可能是安全策略限制): {cookie.get('name')} - {str(e)}")
+ pass
+
+ return True
+ except Exception as e:
+ print(f"加载Cookie失败: {str(e)}")
+ return False
+
+
+def get_location_coordinates(location_name, headless=False, cookie_file='amap_cookies.json', driver=None,
+ reuse_driver=False):
+ """
+ 获取指定名称地点的坐标信息
+
+ Args:
+ location_name (str): 要搜索的地点名称
+ headless (bool): 是否使用无头模式,默认False(有界面)
+ cookie_file (str): Cookie文件路径
+ driver: 可选的WebDriver实例(用于复用)
+ reuse_driver: 是否复用WebDriver实例
+
+ Returns:
+ dict or None: 包含名称、经度和纬度的字典,失败时返回None
+ """
+ # 检查输入参数
+ if not location_name or not location_name.strip():
+ print("❌ 地点名称无效")
+ return None
+
+ if not cookie_file or not os.path.exists(cookie_file):
+ print(f"❌ Cookie文件不存在或无效: {cookie_file}")
+ return None
+
+ # 浏览器管理标志
+ need_quit_driver = False
+
+ try:
+ # 如果没有提供driver,创建新的
+ if not driver:
+ # 设置Chrome浏览器参数
+ chrome_options = Options()
+ if headless:
+ chrome_options.add_argument('--headless')
+
+ # 添加必要的配置参数
+ # 我有GPU,可以放开
+ # chrome_options.add_argument('--disable-gpu')
+ chrome_options.add_argument('--no-sandbox')
+ chrome_options.add_argument('--disable-dev-shm-usage')
+ chrome_options.add_argument('--window-size=1920,1080')
+ chrome_options.add_argument('--lang=zh-CN')
+
+ # 禁用自动化控制特征
+ chrome_options.add_experimental_option('useAutomationExtension', False)
+ chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 防止自动化检测,关闭浏览器控制显示
+ chrome_options.add_argument('-ignore-certificate-errors') # 忽略证书错误
+ chrome_options.add_argument('-ignore-ssl-errors') # 忽略相关错误
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) # 防止自动化检测
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) # 防止自动化日志输出检测
+
+ # 添加随机User-Agent
+ user_agent = f'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{random.randint(80, 99)}.0.{random.randint(4000, 5000)}.{random.randint(100, 200)} Safari/537.36'
+ chrome_options.add_argument(f'user-agent={user_agent}')
+
+ # 尝试初始化WebDriver
+ service = Service()
+ try:
+ from webdriver_manager.chrome import ChromeDriverManager
+ driver_path = ChromeDriverManager().install()
+ service = Service(driver_path)
+ except:
+ pass
+
+ # 初始化WebDriver
+ driver = webdriver.Chrome(service=service, options=chrome_options)
+ need_quit_driver = True
+
+ # 最大化窗口(如果不是无头模式)
+ if not headless:
+ driver.maximize_window()
+
+ # 禁用自动化特征
+ driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+ "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
+ })
+
+ # 使用Cookie方式认证
+ cookies_loaded = load_cookies_to_browser(driver, cookie_file)
+ if not cookies_loaded:
+ print("Cookie认证失败,无法继续获取高精度坐标")
+ return None
+
+ # 访问高德地图坐标拾取工具
+ url = 'https://lbs.amap.com/tools/picker'
+ driver.get(url)
+
+ time.sleep(2) # 等待页面完全加载
+
+ # 定位搜索输入框并输入查询内容
+ try:
+ # 使用ID定位搜索框
+ search_input = WebDriverWait(driver, TIMEOUT_MEDIUM).until(
+ EC.presence_of_element_located((By.ID, 'txtSearch'))
+ )
+ except Exception as e:
+ print(f"定位搜索输入框失败: {e}")
+ return None
+
+ # 输入搜索内容
+ search_input.clear()
+ search_input.send_keys(location_name)
+
+ # 定位搜索按钮并点击
+ try:
+ # 尝试使用class选择器定位搜索按钮
+ search_button = WebDriverWait(driver, TIMEOUT_SHORT).until(
+ EC.presence_of_element_located((By.CLASS_NAME, 'btn-search'))
+ )
+ search_button.click()
+ except Exception as e:
+ print(f"定位搜索按钮失败: {e}")
+ # 尝试按回车键搜索
+ try:
+ search_input.send_keys(Keys.ENTER)
+ except Exception as e2:
+ print(f"回车键搜索也失败: {e2}")
+ return None
+
+ # 等待搜索结果加载完成并显示坐标
+ time.sleep(3) # 等待时间,确保页面完全加载并显示搜索结果和坐标
+
+ # 获取坐标信息 - 只使用成功的方式(从txtCoordinate元素的value属性获取)
+ coordinate_text = None
+
+ # 查找ID为txtCoordinate的元素(这是高德地图坐标拾取器的核心坐标显示元素)
+ try:
+ coordinate_element = WebDriverWait(driver, TIMEOUT_MEDIUM).until(
+ EC.presence_of_element_located((By.ID, 'txtCoordinate'))
+ )
+
+ # 获取value属性(这是input元素存储值的标准方式)
+ coordinate_value = coordinate_element.get_attribute('value')
+ if coordinate_value and coordinate_value.strip():
+ coordinate_text = coordinate_value.strip()
+ else:
+ print("警告: txtCoordinate元素的value属性为空")
+
+ # 作为备选,尝试获取text内容
+ coordinate_text_content = coordinate_element.text.strip()
+ if coordinate_text_content:
+ coordinate_text = coordinate_text_content
+ print(f"从text内容获取到坐标文本: '{coordinate_text}'")
+ except Exception as e:
+ print(f"查找或获取坐标元素失败: {e}")
+ return None
+
+ # 如果没有获取到坐标,返回失败
+ if not coordinate_text or coordinate_text.strip() == '':
+ print("未能获取到有效的坐标文本")
+ return None
+
+ # 解析坐标信息
+ print(f"解析坐标文本: '{coordinate_text}'")
+
+ coordinate_info = parse_coordinates_info(coordinate_text)
+ if coordinate_info:
+ # 进一步验证坐标的合理性(中国地区范围)
+ try:
+ lng = float(coordinate_info['lng'])
+ lat = float(coordinate_info['lat'])
+
+ # 中国地区的合理坐标范围
+ if 70 <= lng <= 140 and 0 <= lat <= 60:
+ print(f"成功获取坐标: {coordinate_info['lng']},{coordinate_info['lat']}")
+ return coordinate_info
+ else:
+ print(f"坐标超出中国地区合理范围 - 经度: {lng}, 纬度: {lat}")
+ return None
+ except (ValueError, TypeError):
+ print(f"坐标数值验证失败: {coordinate_info}")
+ return None
+ else:
+ print("坐标解析失败")
+ return None
+
+ except Exception as e:
+ print(f"获取坐标时发生错误: {e}")
+ return None
+ finally:
+ # 关闭浏览器(如果不是复用的)
+ if not reuse_driver and need_quit_driver and driver:
+ driver.close()
+ driver.quit()
+
+
+def get_multiple_locations_coordinates(location_names, headless=False, cookie_file='amap_cookies.json'):
+ """
+ 批量获取多个地点的坐标信息
+
+ Args:
+ location_names (list): 地点名称列表
+ headless (bool): 是否使用无头模式,默认False(有界面)
+ cookie_file (str): Cookie文件路径
+
+ Returns:
+ dict: 包含所有地点坐标信息的字典,键为地点名称,值为坐标信息字典或None(失败时)
+ """
+ # 检查输入参数
+ if not location_names:
+ print("❌ 地点列表为空,无需获取坐标")
+ return {}
+
+ print(f"开始批量获取坐标信息 - 地点数量: {len(location_names)}, 无头模式: {headless}")
+
+ # 存储所有地点的坐标信息
+ all_coordinates = {}
+ success_count = 0
+ failure_count = 0
+ skipped_count = 0
+ invalid_coord_count = 0
+
+ # 创建并复用浏览器实例
+ created_driver = None
+
+ # 记录是否已经退出,避免重复退出
+ driver_closed = False
+
+ try:
+ # 初始化Chrome浏览器
+ chrome_options = Options()
+ if headless:
+ chrome_options.add_argument('--headless')
+
+ # 添加必要的配置参数
+ # chrome_options.add_argument('--disable-gpu')
+ chrome_options.add_argument('--no-sandbox')
+ chrome_options.add_argument('--disable-dev-shm-usage')
+ chrome_options.add_argument('--window-size=1920,1080')
+ chrome_options.add_argument('--lang=zh-CN')
+ chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 防止自动化检测,关闭浏览器控制显示
+ chrome_options.add_argument('-ignore-certificate-errors') # 忽略证书错误
+ chrome_options.add_argument('-ignore-ssl-errors') # 忽略相关错误
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) # 防止自动化检测
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) # 防止自动化日志输出检测
+ chrome_options.add_experimental_option('useAutomationExtension', False)
+
+ # 添加随机User-Agent
+ user_agent = f'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{random.randint(80, 99)}.0.{random.randint(4000, 5000)}.{random.randint(100, 200)} Safari/537.36'
+ chrome_options.add_argument(f'user-agent={user_agent}')
+
+ # 尝试使用webdriver_manager
+ try:
+ from webdriver_manager.chrome import ChromeDriverManager
+ driver_path = ChromeDriverManager().install()
+ service = Service(driver_path)
+ print(f"成功使用webdriver_manager安装驱动: {driver_path}")
+ except:
+ print("使用系统默认的Chrome驱动")
+ service = Service()
+
+ # 初始化WebDriver
+ created_driver = webdriver.Chrome(service=service, options=chrome_options)
+
+ # 将创建的driver实例添加到全局跟踪集合中
+ if 'driver_instances' in globals():
+ driver_instances.add(created_driver)
+
+ # 最大化窗口(如果不是无头模式)
+ if not headless:
+ created_driver.maximize_window()
+
+ # 禁用自动化特征
+ created_driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+ "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
+ })
+
+ # 使用Cookie方式认证
+ print("尝试使用Cookie文件进行认证")
+ cookies_loaded = load_cookies_to_browser(created_driver, cookie_file)
+ if not cookies_loaded:
+ print("Cookie认证失败,无法继续获取高精度坐标")
+ return all_coordinates
+
+ # 访问高德地图坐标拾取工具
+ url = 'https://lbs.amap.com/tools/picker'
+ created_driver.get(url)
+ time.sleep(2) # 增加等待时间以确保页面完全加载
+
+ # 循环获取每个地点的坐标
+ for i, location_name in enumerate(location_names, 1):
+ print(f"处理地点 {i}/{len(location_names)}: '{location_name}'")
+
+ # 对每个地点查询
+ try:
+ # 调用get_location_coordinates获取坐标
+ result = get_location_coordinates(location_name, headless=headless, cookie_file=cookie_file,
+ driver=created_driver, reuse_driver=True)
+ except Exception as e:
+ print(f"❌ 地点: {location_name} - 查询出错: {str(e)},跳过该地点")
+ result = None
+ skipped_count += 1
+
+ # 存储结果
+ all_coordinates[location_name] = result
+
+ # 坐标获取成功,进行有效性验证
+ if result:
+ # 验证坐标的地理合理性(中国地区范围)
+ try:
+ lng = float(result['lng'])
+ lat = float(result['lat'])
+
+ # 中国地区的合理坐标范围
+ if 70 <= lng <= 140 and 0 <= lat <= 60:
+ # 检查坐标精度(至少4位小数)
+ lng_precision = len(result['lng'].split('.')[1]) if '.' in result['lng'] else 0
+ lat_precision = len(result['lat'].split('.')[1]) if '.' in result['lat'] else 0
+
+ if lng_precision >= 4 and lat_precision >= 4:
+ print(f"✅ 地点: {location_name} - 坐标获取成功: {result['lng']},{result['lat']}")
+ success_count += 1
+ else:
+ print(
+ f"⚠️ 地点: {location_name} - 坐标精度不足: {result['lng']},{result['lat']} (经度{lng_precision}位, 纬度{lat_precision}位小数)")
+ invalid_coord_count += 1
+ else:
+ print(f"⚠️ 地点: {location_name} - 坐标超出中国地区合理范围: {result['lng']},{result['lat']}")
+ invalid_coord_count += 1
+ except (ValueError, TypeError):
+ print(f"⚠️ 地点: {location_name} - 坐标数值无效: {result}")
+ invalid_coord_count += 1
+ else:
+ print(f"❌ 地点: {location_name} - 未能获取有效的坐标信息")
+ failure_count += 1
+
+ # 如果不是最后一个地点,添加短暂延迟以避免过快请求
+ if i < len(location_names):
+ delay_time = random.uniform(0.5, 2) # 减少延迟时间到0.5-2秒
+ print(f"添加延迟: {delay_time:.2f}秒")
+ time.sleep(delay_time)
+
+ except Exception as e:
+ print(f"❌ 批量坐标获取过程中发生错误: {str(e)}")
+
+ finally:
+ created_driver.close()
+
+ # 打印详细统计信息
+ print(f"\n{'=' * 60}")
+ print("批量坐标获取完成")
+ print(f"{'=' * 60}")
+ print(f"总查询地点数: {len(location_names)}")
+ print(f"成功获取: {success_count}")
+ print(f"获取失败: {failure_count}")
+ print(f"超时跳过: {skipped_count}")
+ print(f"无效坐标: {invalid_coord_count}")
+ print(f"获取到坐标数据的地点数: {len([c for c in all_coordinates.values() if c is not None])}")
+
+ # 计算实际成功率(只考虑成功获取的有效坐标)
+ actual_processed = success_count + failure_count + skipped_count + invalid_coord_count
+ if actual_processed > 0:
+ actual_success_rate = (success_count / actual_processed) * 100
+ print(f"实际成功率: {actual_success_rate:.1f}%")
+ else:
+ print("实际成功率: 0%")
+
+ print(f"{'=' * 60}")
+
+ # 返回结果字典
+ return all_coordinates
+
+
+def create_cookie_export_tool():
+ """
+ 创建一个Cookie导出工具,帮助用户手动登录后导出Cookie
+ """
+ print("\n===== Cookie导出工具 =====")
+ print("此工具将打开一个Chrome浏览器窗口,让您手动登录高德地图账号,")
+ print("登录成功后,按Enter键导出Cookie到文件。")
+ print("==========================")
+
+ # 设置Chrome浏览器参数
+ chrome_options = Options()
+ chrome_options.add_argument('--disable-gpu')
+ chrome_options.add_argument('--window-size=1920,1080')
+ chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
+ chrome_options.add_experimental_option('useAutomationExtension', False)
+
+ # 初始化WebDriver
+ driver = None
+ try:
+ # 尝试使用webdriver_manager
+ try:
+ from webdriver_manager.chrome import ChromeDriverManager
+ driver_path = ChromeDriverManager().install()
+ service = Service(driver_path)
+ except:
+ service = Service()
+
+ driver = webdriver.Chrome(service=service, options=chrome_options)
+ driver.maximize_window()
+
+ # 禁用自动化特征
+ driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+ "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
+ })
+
+ # 访问高德地图坐标拾取工具
+ url = 'https://lbs.amap.com/tools/picker'
+ print(f"\n正在打开高德地图坐标拾取工具: {url}")
+ import ssl
+ ssl._create_default_https_context = ssl._create_unverified_context
+ driver.get(url)
+
+ print("\n请在浏览器中手动登录高德地图账号。")
+ print("提示:建议使用微信扫码登录以避免验证码问题")
+ print("登录成功后,请按Enter键继续...")
+ input()
+
+ # 导出Cookie - 使用基于当前脚本所在目录的绝对路径
+ script_dir = os.path.dirname(os.path.abspath(__file__))
+ cookie_file = os.path.join(script_dir, '../Test/amap_cookies.json')
+ export_success = export_cookies_from_browser(driver, cookie_file)
+
+ if export_success:
+ print(f"\nCookie导出成功!文件保存为: {os.path.abspath(cookie_file)}")
+ print("您现在可以使用这个Cookie文件获取高精度坐标了。")
+ print("\n重要提示:")
+ print("1. 请妥善保管您的Cookie文件,不要分享给他人")
+ print("2. Cookie文件包含您的登录状态信息,请确保安全存储")
+ print("3. 当Cookie过期后,您需要重新运行此工具生成新的Cookie文件")
+
+ except Exception as e:
+ print(f"\n发生错误: {str(e)}")
+ finally:
+ if driver:
+ print("\n正在关闭浏览器...")
+ driver.quit()
+
+
+def main():
+ """
+ 主函数,用于测试和运行高德地图坐标获取工具
+ """
+ print("=== 高德地图高精度坐标获取工具 ====")
+
+ # 初始化参数
+ # 使用基于当前脚本所在目录的相对路径,确保在不同环境下都能正确访问
+ script_dir = os.path.dirname(os.path.abspath(__file__))
+ cookie_file = os.path.join(script_dir, '../Test/amap_cookies.json')
+
+ # 询问是否清空所有数据的经纬度
+ clear_coords = input("是否清空所有数据的经纬度,全新开始更新坐标?(y/n,默认n): ").strip().lower() == 'y'
+ if clear_coords:
+ print("正在清空所有学校的经纬度数据...")
+ try:
+ execute_update("UPDATE t_school SET longitude=0, latitude=0")
+ print("✅ 经纬度数据已清空")
+ except Exception as e:
+ print(f"❌ 清空经纬度数据失败: {str(e)}")
+ sys.exit(1)
+
+ # 从数据库查询需要更新坐标的学校(经纬度为0的学校)
+ print("正在从数据库查询需要更新坐标的学校...")
+ try:
+ results = find("SELECT org_name FROM t_school WHERE longitude=0 AND latitude=0 order by region_level1,region_level2,region_level3,school_type")
+ locations = [result['org_name'] for result in results]
+ print(f"✅ 找到 {len(locations)} 所需要更新坐标的学校")
+
+ if not locations:
+ print("所有学校都已有坐标数据,程序退出。")
+ sys.exit(0)
+
+ # 显示前10个学校作为预览
+ print("\n待处理学校列表预览:")
+ for i, loc in enumerate(locations[:10], 1):
+ print(f" {i}. {loc}")
+ if len(locations) > 10:
+ print(f" ... 等{len(locations) - 10}个学校")
+
+ except Exception as e:
+ print(f"❌ 查询学校列表失败: {str(e)}")
+ sys.exit(1)
+
+ # 检查Cookie文件
+ if not os.path.exists(cookie_file):
+ print(f"\nCookie文件 '{cookie_file}' 不存在。")
+ if input("是否现在运行Cookie导出工具? (y/n): ").strip().lower() == 'y':
+ create_cookie_export_tool()
+ else:
+ print("\n程序退出。没有有效的Cookie文件,无法获取高精度坐标。")
+ sys.exit(1)
+
+ print(f"\n运行参数: 无头模式{'启用' if HEADLESS else '禁用'}")
+
+ # 逐个获取坐标并立即更新数据库
+ print("\n开始逐个获取坐标并更新数据库...")
+ success_updates = 0
+ total_locations = len(locations)
+
+ # 创建浏览器实例(复用)
+ chrome_options = Options()
+ if HEADLESS:
+ chrome_options.add_argument('--headless')
+
+ # 添加必要的配置参数
+ chrome_options.add_argument('--no-sandbox')
+ chrome_options.add_argument('--disable-dev-shm-usage')
+ chrome_options.add_argument('--window-size=1920,1080')
+ chrome_options.add_argument('--lang=zh-CN')
+ chrome_options.add_argument("--disable-blink-features=AutomationControlled")
+ chrome_options.add_argument('-ignore-certificate-errors')
+ chrome_options.add_argument('-ignore-ssl-errors')
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
+ chrome_options.add_experimental_option('useAutomationExtension', False)
+
+ # 随机User-Agent
+ user_agent = f'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{random.randint(80, 99)}.0.{random.randint(4000, 5000)}.{random.randint(100, 200)} Safari/537.36'
+ chrome_options.add_argument(f'user-agent={user_agent}')
+
+ # 初始化WebDriver
+ try:
+ from webdriver_manager.chrome import ChromeDriverManager
+ driver_path = ChromeDriverManager().install()
+ service = Service(driver_path)
+ print(f"成功使用webdriver_manager安装驱动: {driver_path}")
+ except:
+ print("使用系统默认的Chrome驱动")
+ service = Service()
+
+ driver = webdriver.Chrome(service=service, options=chrome_options)
+
+ # 添加到全局跟踪集合
+ if 'driver_instances' in globals():
+ driver_instances.add(driver)
+
+ # 最大化窗口(如果不是无头模式)
+ if not HEADLESS:
+ driver.maximize_window()
+
+ # 禁用自动化特征
+ driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+ "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
+ })
+
+ # 使用Cookie方式认证
+ cookies_loaded = load_cookies_to_browser(driver, cookie_file)
+ if not cookies_loaded:
+ print("Cookie认证失败,无法继续获取高精度坐标")
+ driver.quit()
+ return
+
+ # 访问高德地图坐标拾取工具
+ url = 'https://lbs.amap.com/tools/picker'
+ driver.get(url)
+ time.sleep(2) # 等待页面完全加载
+
+ update_sql = "UPDATE t_school SET longitude = :lng, latitude = :lat WHERE org_name = :org_name"
+
+ try:
+ # 逐个处理每个地点
+ for i, location_name in enumerate(locations, 1):
+ print(f"处理地点 {i}/{total_locations}: '{location_name}'")
+
+ # 获取单个地点的坐标
+ try:
+ coords = get_location_coordinates(
+ location_name,
+ headless=HEADLESS,
+ cookie_file=cookie_file,
+ driver=driver,
+ reuse_driver=True
+ )
+
+ # 如果成功获取到坐标,立即更新数据库
+ if coords:
+ try:
+ execute_update(update_sql, {
+ 'lng': coords['lng'],
+ 'lat': coords['lat'],
+ 'org_name': location_name
+ })
+ success_updates += 1
+ print(f"✅ 地点: {location_name} - 坐标获取成功并更新数据库: {coords['lng']},{coords['lat']}")
+ except Exception as e:
+ print(f" ❌ 更新地点'{location_name}'失败: {str(e)}")
+ else:
+ print(f"❌ 地点: {location_name} - 未能获取有效的坐标信息")
+
+ # 添加短暂延迟以避免过快请求
+ if i < total_locations:
+ delay_time = random.uniform(0.5, 2)
+ print(f"添加延迟: {delay_time:.2f}秒")
+ time.sleep(delay_time)
+
+ except Exception as e:
+ print(f"❌ 地点: {location_name} - 查询出错: {str(e)}")
+
+ # 添加延迟后继续处理下一个地点
+ if i < total_locations:
+ time.sleep(random.uniform(0.5, 2))
+
+ finally:
+ # 关闭浏览器
+ driver.close()
+ driver.quit()
+
+ print(f"\n✅ 数据库更新完成,成功{success_updates}/{total_locations}条记录")
+
+ print("\n✅ 程序执行完成!")
+ print("\n提示:如需重新批量更新所有学校坐标,下次运行程序时选择清空所有数据的经纬度即可。")
+
+
+if __name__ == "__main__":
+ # 全局变量,用于跟踪所有创建的WebDriver实例
+ driver_instances = weakref.WeakSet()
+
+ try:
+ print("=== 高德地图高精度坐标获取工具 ===")
+ print("正在初始化...")
+ # 直接运行主程序
+ main()
+ except KeyboardInterrupt:
+ print("\n⚠️ 接收到键盘中断,退出程序")
+ except Exception as main_error:
+ print(f"\n❌ 主程序运行出错: {main_error}")
+
+ print("\n程序已退出")
diff --git a/Apps/Json/Ref/T7_PaChongGaoDePatch.py b/Apps/Json/Ref/T7_PaChongGaoDePatch.py
new file mode 100644
index 0000000..e1dbede
--- /dev/null
+++ b/Apps/Json/Ref/T7_PaChongGaoDePatch.py
@@ -0,0 +1,810 @@
+import json
+import random
+import asyncio
+import math
+from typing import List, Tuple, Dict, Any
+
+from DbKit.Db import Db
+
+
+def is_point_in_polygon(point: Tuple[float, float], polygon: List[Tuple[float, float]]) -> bool:
+ """
+ 射线法判断点是否在多边形内
+ :param point: (经度, 纬度)
+ :param polygon: 多边形顶点坐标列表
+ :return: True表示在多边形内
+ """
+ x, y = point
+ n = len(polygon)
+ inside = False
+
+ for i in range(n):
+ x1, y1 = polygon[i]
+ x2, y2 = polygon[(i + 1) % n]
+
+ # 检查点是否在边的y范围内
+ if ((y1 > y) != (y2 > y)):
+ # 计算交点x坐标
+ x_intersect = (x2 - x1) * (y - y1) / (y2 - y1) + x1
+
+ if x_intersect > x:
+ inside = not inside
+
+ return inside
+
+
+def load_geojson(json_path: str) -> List[List[Tuple[float, float]]]:
+ """
+ 从GeoJSON文件加载多边形数据(支持Polygon和MultiPolygon)
+ 返回: 多边形列表,每个多边形是(经度, 纬度)元组的列表
+ """
+ with open(json_path, 'r', encoding='utf-8') as f:
+ geo_data = json.load(f)
+
+ polygons = []
+ geometry_type = geo_data['features'][0]['geometry']['type']
+ coordinates = geo_data['features'][0]['geometry']['coordinates']
+
+ if geometry_type == 'Polygon':
+ polygons.append(coordinates[0])
+ elif geometry_type == 'MultiPolygon':
+ for polygon_coords in coordinates:
+ polygons.append(polygon_coords[0])
+
+ return polygons
+
+
+# 计算点集的分布统计信息
+def calculate_distribution_statistics(points):
+ """
+ 计算点集的分布统计信息
+
+ :param points: 点集 [(lon, lat), ...]
+ :return: 包含min_lon, max_lon, min_lat, max_lat, center_lon, center_lat, std_lon, std_lat的字典
+ """
+ if not points:
+ return None
+
+ lons = [p[0] for p in points]
+ lats = [p[1] for p in points]
+
+ min_lon, max_lon = min(lons), max(lons)
+ min_lat, max_lat = min(lats), max(lats)
+
+ # 计算中心点
+ center_lon = (min_lon + max_lon) / 2
+ center_lat = (min_lat + max_lat) / 2
+
+ # 计算标准差(衡量分布的分散程度)
+ mean_lon = sum(lons) / len(lons)
+ mean_lat = sum(lats) / len(lats)
+
+ std_lon = math.sqrt(sum((lon - mean_lon) ** 2 for lon in lons) / len(lons))
+ std_lat = math.sqrt(sum((lat - mean_lat) ** 2 for lat in lats) / len(lats))
+
+ return {
+ "min_lon": min_lon,
+ "max_lon": max_lon,
+ "min_lat": min_lat,
+ "max_lat": max_lat,
+ "center_lon": center_lon,
+ "center_lat": center_lat,
+ "std_lon": std_lon,
+ "std_lat": std_lat
+ }
+
+# 线性映射函数
+def linear_map(value, from_min, from_max, to_min, to_max):
+ """
+ 将值从一个范围线性映射到另一个范围
+
+ :param value: 输入值
+ :param from_min: 原始范围最小值
+ :param from_max: 原始范围最大值
+ :param to_min: 目标范围最小值
+ :param to_max: 目标范围最大值
+ :return: 映射后的值
+ """
+ # 处理除零情况
+ if from_max == from_min:
+ return (to_min + to_max) / 2
+ # 计算映射值
+ return (value - from_min) * (to_max - to_min) / (from_max - from_min) + to_min
+
+# 计算点到线段的最近点
+def closest_point_on_segment(point, line_start, line_end):
+ """
+ 计算点到线段的最近点
+
+ :param point: 点 [lon, lat]
+ :param line_start: 线段起点 [lon, lat]
+ :param line_end: 线段终点 [lon, lat]
+ :return: 线段上的最近点 [lon, lat]
+ """
+ # 将经纬度转换为向量
+ a = [point[0] - line_start[0], point[1] - line_start[1]]
+ b = [line_end[0] - line_start[0], line_end[1] - line_start[1]]
+
+ # 计算投影参数t
+ t = max(0, min(1, (a[0] * b[0] + a[1] * b[1]) / (b[0] ** 2 + b[1] ** 2) if (b[0] ** 2 + b[1] ** 2) > 0 else 0))
+
+ # 计算投影点
+ return [line_start[0] + t * b[0], line_start[1] + t * b[1]]
+
+# 计算两点之间的距离
+def calculate_distance(point1, point2):
+ """
+ 计算两点之间的欧几里得距离
+
+ :param point1: 第一个点 [lon, lat]
+ :param point2: 第二个点 [lon, lat]
+ :return: 两点之间的距离
+ """
+ return math.sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2)
+
+# 调整点到多边形边界
+def adjust_to_polygon_boundary(point, polygons):
+ """
+ 调整点到最近的多边形边界
+
+ :param point: 需要调整的点 [lon, lat]
+ :param polygons: 多边形列表
+ :return: 调整后的点 [lon, lat]
+ """
+ min_distance = float('inf')
+ closest_point = point
+
+ for polygon in polygons:
+ for i in range(len(polygon)):
+ p1 = polygon[i]
+ p2 = polygon[(i + 1) % len(polygon)]
+
+ # 计算点到线段的最近点
+ proj_point = closest_point_on_segment(point, p1, p2)
+ distance = calculate_distance(point, proj_point)
+
+ if distance < min_distance:
+ min_distance = distance
+ closest_point = proj_point
+
+ return closest_point
+
+# 将原始坐标映射到目标区域,保持相对位置关系
+def map_coordinates(original_points, polygons):
+ """
+ 将原始坐标映射到目标区域,保持相对位置关系
+
+ :param original_points: 原始坐标列表 [(original_lon, original_lat), ...]
+ :param polygons: 目标区域的多边形列表
+ :return: 映射后的坐标列表 [(mapped_lon, mapped_lat), ...]
+ """
+ if not original_points or not polygons:
+ return []
+
+ # 计算原始点集的分布统计
+ original_stats = calculate_distribution_statistics(original_points)
+ if not original_stats:
+ return []
+
+ # 获取目标区域的边界信息
+ all_target_points = []
+ for polygon in polygons:
+ all_target_points.extend(polygon)
+
+ if not all_target_points:
+ return []
+
+ target_lons = [p[0] for p in all_target_points]
+ target_lats = [p[1] for p in all_target_points]
+
+ target_min_lon, target_max_lon = min(target_lons), max(target_lons)
+ target_min_lat, target_max_lat = min(target_lats), max(target_lats)
+
+ # 收缩目标边界框,使生成的坐标更靠近县区中心
+ shrink_factor = 0.25 # 收缩25%,增大收缩比例使坐标更靠近中心
+ delta_lon = (target_max_lon - target_min_lon) * shrink_factor
+ delta_lat = (target_max_lat - target_min_lat) * shrink_factor
+ target_min_lon += delta_lon
+ target_max_lon -= delta_lon
+ target_min_lat += delta_lat
+ target_max_lat -= delta_lat
+
+ # 计算原始点集的边界
+ original_min_lon = original_stats["min_lon"]
+ original_max_lon = original_stats["max_lon"]
+ original_min_lat = original_stats["min_lat"]
+ original_max_lat = original_stats["max_lat"]
+
+ mapped_points = []
+ for original_lon, original_lat in original_points:
+ # 线性映射经度和纬度
+ mapped_lon = linear_map(original_lon, original_min_lon, original_max_lon, target_min_lon, target_max_lon)
+ mapped_lat = linear_map(original_lat, original_min_lat, original_max_lat, target_min_lat, target_max_lat)
+
+ # 检查映射后的点是否在目标区域内
+ if any(is_point_in_polygon((mapped_lon, mapped_lat), polygon) for polygon in polygons):
+ mapped_points.append((mapped_lon, mapped_lat))
+ else:
+ # 如果映射后的点不在目标区域内,调整到最近的边界
+ adjusted_lon, adjusted_lat = adjust_to_polygon_boundary([mapped_lon, mapped_lat], polygons)
+ mapped_points.append((adjusted_lon, adjusted_lat))
+
+ return mapped_points
+
+# 传统的均匀分布点生成算法(作为回退方案)
+def generate_uniform_points_fallback(polygons, n_points):
+ """
+ 在指定的多边形区域内生成均匀分布的点(回退方案)
+
+ :param polygons: 多边形列表,每个多边形是坐标点的列表
+ :param n_points: 需要生成的点数
+ :return: 生成的点列表 [(lon, lat), ...]
+ """
+ if not polygons:
+ return []
+
+ # 计算整体边界框
+ all_lons = [p[0] for polygon in polygons for p in polygon]
+ all_lats = [p[1] for polygon in polygons for p in polygon]
+ min_lon, max_lon = min(all_lons), max(all_lons)
+ min_lat, max_lat = min(all_lats), max(all_lats)
+
+ # 收缩边界框,使生成的坐标更靠近县区中心
+ lon_margin = (max_lon - min_lon) * 0.25 # 收缩25%,增大收缩比例使坐标更靠近中心
+ lat_margin = (max_lat - min_lat) * 0.25
+ min_lon = min_lon + lon_margin
+ max_lon = max_lon - lon_margin
+ min_lat = min_lat + lat_margin
+ max_lat = max_lat - lat_margin
+
+ # 计算每个多边形的面积,用于按比例分配点数
+ def calculate_polygon_area(polygon):
+ # 使用Shoelace公式计算多边形面积
+ area = 0.0
+ n = len(polygon)
+ for i in range(n):
+ j = (i + 1) % n
+ area += polygon[i][0] * polygon[j][1]
+ area -= polygon[j][0] * polygon[i][1]
+ return abs(area) / 2.0
+
+ # 计算每个多边形的面积
+ polygon_areas = [calculate_polygon_area(polygon) for polygon in polygons]
+ total_area = sum(polygon_areas)
+
+ # 根据面积比例分配每个多边形需要生成的点数
+ if total_area > 0:
+ points_per_polygon = [max(1, int(area / total_area * n_points)) for area in polygon_areas]
+ # 调整点数,确保总和等于n_points
+ points_per_polygon[-1] += n_points - sum(points_per_polygon)
+ else:
+ points_per_polygon = [n_points // len(polygons)] * len(polygons)
+ points_per_polygon[-1] += n_points - sum(points_per_polygon)
+
+ points = []
+
+ # 为每个多边形单独生成点
+ for polygon_index, (polygon, points_needed) in enumerate(zip(polygons, points_per_polygon)):
+ if points_needed <= 0:
+ continue
+
+ # 计算当前多边形的边界框
+ polygon_lons = [p[0] for p in polygon]
+ polygon_lats = [p[1] for p in polygon]
+ poly_min_lon, poly_max_lon = min(polygon_lons), max(polygon_lons)
+ poly_min_lat, poly_max_lat = min(polygon_lats), max(polygon_lats)
+
+ # 收缩当前多边形的边界框,使其更靠近中心
+ poly_lon_margin = (poly_max_lon - poly_min_lon) * 0.25 # 收缩25%,与全局收缩比例保持一致
+ poly_lat_margin = (poly_max_lat - poly_min_lat) * 0.25
+ poly_min_lon += poly_lon_margin
+ poly_max_lon -= poly_lon_margin
+ poly_min_lat += poly_lat_margin
+ poly_max_lat -= poly_lat_margin
+
+ # 为当前多边形生成足够的网格
+ cells_needed = max(points_needed * 2, 10) # 网格数量是点数的2倍,确保分布均匀
+ cols = math.ceil(math.sqrt(cells_needed))
+ rows = math.ceil(cells_needed / cols)
+
+ cell_width = (poly_max_lon - poly_min_lon) / cols
+ cell_height = (poly_max_lat - poly_min_lat) / rows
+
+ # 记录哪些网格已经生成了点
+ filled_cells = []
+ max_attempts_per_cell = 50
+
+ # 按网格生成点
+ for attempt in range(rows * cols * 2): # 增加尝试次数
+ if len(points) >= n_points:
+ break
+
+ # 随机选择一个网格
+ i = random.randint(0, rows - 1)
+ j = random.randint(0, cols - 1)
+ cell_key = (i, j)
+
+ # 如果这个网格已经生成了足够的点,跳过
+ if filled_cells.count(cell_key) >= math.ceil(points_needed / (rows * cols)):
+ continue
+
+ # 当前网格范围
+ cell_min_lon = poly_min_lon + j * cell_width
+ cell_max_lon = poly_min_lon + (j + 1) * cell_width
+ cell_min_lat = poly_min_lat + i * cell_height
+ cell_max_lat = poly_min_lat + (i + 1) * cell_height
+
+ # 在网格内尝试生成有效点
+ for _ in range(max_attempts_per_cell):
+ lon = random.uniform(cell_min_lon, cell_max_lon)
+ lat = random.uniform(cell_min_lat, cell_max_lat)
+
+ # 检查点是否在当前多边形内
+ if is_point_in_polygon((lon, lat), polygon):
+ points.append((lon, lat))
+ filled_cells.append(cell_key)
+ break
+
+ # 如果当前多边形的点数不足,使用均匀分布补充
+ while len(points) < sum(points_per_polygon[:polygon_index+1]):
+ lon = random.uniform(poly_min_lon, poly_max_lon)
+ lat = random.uniform(poly_min_lat, poly_max_lat)
+
+ if is_point_in_polygon((lon, lat), polygon):
+ points.append((lon, lat))
+
+ # 如果总点数还是不足,使用全局均匀分布补充
+ while len(points) < n_points:
+ # 随机选择一个多边形
+ polygon = random.choice(polygons)
+
+ # 计算该多边形的边界框
+ polygon_lons = [p[0] for p in polygon]
+ polygon_lats = [p[1] for p in polygon]
+ poly_min_lon, poly_max_lon = min(polygon_lons), max(polygon_lons)
+ poly_min_lat, poly_max_lat = min(polygon_lats), max(polygon_lats)
+
+ # 在边界框内随机生成点
+ for _ in range(100): # 最多尝试100次
+ lon = random.uniform(poly_min_lon, poly_max_lon)
+ lat = random.uniform(poly_min_lat, poly_max_lat)
+
+ if is_point_in_polygon((lon, lat), polygon):
+ points.append((lon, lat))
+ break
+
+ return points[:n_points]
+
+# 在指定的多边形区域内生成均匀分布的点
+async def generate_uniform_points(polygons: List[List[Tuple[float, float]]], num_points: int, original_coords=None) -> List[Tuple[float, float]]:
+ """
+ 在指定的多边形区域内生成均匀分布的点
+
+ :param polygons: 多边形列表,每个多边形是坐标点的列表
+ :param num_points: 需要生成的点数
+ :param original_coords: 原始坐标列表,用于参考相对位置关系
+ :return: 生成的点列表 [(lon, lat), ...]
+ """
+ if not polygons:
+ return []
+
+ # 如果提供了原始坐标,使用坐标映射算法
+ if original_coords and len(original_coords) > 1:
+ # 过滤掉None值的原始坐标
+ valid_original_coords = [(coord["original_longitude"], coord["original_latitude"])
+ for coord in original_coords
+ if coord["original_longitude"] is not None
+ and coord["original_latitude"] is not None]
+
+ if len(valid_original_coords) >= num_points:
+ # 如果原始坐标足够,直接使用映射算法
+ return map_coordinates(valid_original_coords[:num_points], polygons)
+ elif valid_original_coords: # 如果有部分原始坐标,先映射这些,再补充生成
+ mapped_points = map_coordinates(valid_original_coords, polygons)
+ # 计算还需要生成的点数
+ remaining_points = num_points - len(mapped_points)
+ if remaining_points > 0:
+ # 补充生成均匀分布的点
+ fallback_points = generate_uniform_points_fallback(polygons, remaining_points)
+ mapped_points.extend(fallback_points)
+ return mapped_points[:num_points]
+
+ # 如果没有原始坐标或原始坐标不足,使用传统的均匀分布点生成算法
+ return generate_uniform_points_fallback(polygons, num_points)
+
+
+# 导入数据库操作类
+db = Db()
+
+# 一共有哪些县区
+async def getAllArea():
+ sql = "select area_code,area_name from t_dm_area where area_level=3 order by area_code"
+ return await db.find(sql)
+
+
+# 根据名称获取县区代码
+async def getAreaCode(areaName):
+ sql = "select area_code from t_dm_area where area_level=3 and area_name=:area_name"
+ res = await db.findFirst(sql, {"area_name": areaName})
+ # 需要去掉最后的三个0
+ return str(res["area_code"])[:-3]
+
+# 从t_school_xy表获取指定县区和学校类型的原始坐标数据
+async def get_original_school_coordinates(region_level3: str, school_types: List[str]) -> List[Dict[str, Any]]:
+ """
+ 从t_school_xy表获取指定县区和学校类型的原始坐标数据
+
+ :param region_level3: 县区名称
+ :param school_types: 学校类型列表
+ :return: 包含学校信息和原始坐标的列表
+ """
+ if not school_types:
+ return []
+
+ # 构建SQL查询,获取原始坐标数据
+ placeholders = ",".join([f":type{i}" for i in range(len(school_types))])
+ sql = f"""
+ SELECT org_name, school_type, longitude AS original_longitude, latitude AS original_latitude,
+ region_level1, region_level2, region_level3, region_level4, region_level5
+ FROM t_school_xy
+ WHERE region_level3 = :region_level3 AND school_type IN ({placeholders})
+ """
+
+ params = {"region_level3": region_level3}
+ # 添加每个学校类型的参数
+ for i, st in enumerate(school_types):
+ params[f"type{i}"] = st
+
+ # 获取原始坐标数据
+ original_coords = await db.find(sql, params)
+
+ # 转换坐标数据类型,确保longitude和latitude是float类型
+ # 这可以避免与代码中其他float类型进行数学运算时出现类型不兼容错误
+ from decimal import Decimal
+ for coord in original_coords:
+ if isinstance(coord.get("original_longitude"), Decimal):
+ coord["original_longitude"] = float(coord["original_longitude"])
+ if isinstance(coord.get("original_latitude"), Decimal):
+ coord["original_latitude"] = float(coord["original_latitude"])
+
+ return original_coords
+
+
+def get_school_types_by_education_level(education_level: str) -> List[str]:
+ """
+ 根据学段获取对应的学校类型列表
+
+ :param education_level: 学段名称,可选值:学前、小学、初中、高中
+ :return: 对应学校类型的列表,用于SQL查询中的in子句
+ """
+ # 定义学段到学校类型的映射关系
+ school_type_mapping = {
+ "学前": ["附设幼儿班", "幼儿园"],
+ "小学": ["小学教学点", "小学", "附设小学班"],
+ "初中": ["初级中学", "专门学校", "附设普通初中班", "附设职业初中班", "九年一贯制学校"],
+ "高中": ["附设普通高中班", "高级中学", "十二年一贯制学校", "完全中学"]
+ }
+
+ # 返回对应的学校类型列表,如果输入无效则返回空列表
+ return school_type_mapping.get(education_level, [])
+
+
+# 获取指定县区+指定学校类型的学校,同时包含原始坐标信息
+async def getSchoolList(region_level3, school_type):
+ # region_level3 是指县区的名称
+ # 检查是否传入的是学段名称
+ if school_type in ["学前", "小学", "初中", "高中"]:
+ school_types = get_school_types_by_education_level(school_type)
+ if not school_types:
+ return []
+ # 使用in子句查询多个学校类型
+ placeholders = ",".join([f":type{i}" for i in range(len(school_types))])
+
+ # 1. 从t_school表获取需要更新的学校列表
+ sql_school = f"""
+ select region_level1,region_level2,region_level3,region_level4,region_level5,school_type,org_name
+ from t_school
+ where region_level3=:region_level3 and school_type in ({placeholders})
+ order by region_level1,region_level2,region_level3,region_level4,region_level5,school_type
+ """
+ params = {"region_level3": region_level3}
+ # 添加每个学校类型的参数
+ for i, st in enumerate(school_types):
+ params[f"type{i}"] = st
+
+ schools = await db.find(sql_school, params)
+
+ if not schools:
+ return []
+
+ # 2. 从t_school_xy表获取原始坐标数据
+ original_coords = await get_original_school_coordinates(region_level3, school_types)
+
+ # 3. 创建原始坐标字典,方便查找
+ original_coords_dict = {}
+ for coord in original_coords:
+ original_coords_dict[coord["org_name"]] = {
+ "original_longitude": coord["original_longitude"],
+ "original_latitude": coord["original_latitude"]
+ }
+
+ # 4. 合并原始坐标信息到学校列表
+ for school in schools:
+ org_name = school["org_name"]
+ if org_name in original_coords_dict:
+ school["original_longitude"] = original_coords_dict[org_name]["original_longitude"]
+ school["original_latitude"] = original_coords_dict[org_name]["original_latitude"]
+ else:
+ # 如果没有原始坐标,设置为None
+ school["original_longitude"] = None
+ school["original_latitude"] = None
+
+ return schools
+ else:
+ # 原有的单个学校类型查询逻辑(简化版,不包含原始坐标合并)
+ sql = "select region_level1,region_level2,region_level3,region_level4,region_level5,school_type,org_name from t_school where region_level3=:region_level3 and school_type=:school_type order by region_level1,region_level2,region_level3,region_level4,region_level5,school_type"
+ schools = await db.find(sql, {"region_level3": region_level3, "school_type": school_type})
+
+ # 获取原始坐标并合并
+ original_coords = await get_original_school_coordinates(region_level3, [school_type])
+ original_coords_dict = {
+ coord["org_name"]: {
+ "original_longitude": coord["original_longitude"],
+ "original_latitude": coord["original_latitude"]
+ }
+ for coord in original_coords
+ }
+
+ for school in schools:
+ org_name = school["org_name"]
+ if org_name in original_coords_dict:
+ school["original_longitude"] = original_coords_dict[org_name]["original_longitude"]
+ school["original_latitude"] = original_coords_dict[org_name]["original_latitude"]
+ else:
+ school["original_longitude"] = None
+ school["original_latitude"] = None
+
+ return schools
+
+
+# 获取指定县区下+指定学段的学校数量
+async def getSchoolCount(region_level3, school_type):
+ # 检查是否传入的是学段名称
+ if school_type in ["学前", "小学", "初中", "高中"]:
+ school_types = get_school_types_by_education_level(school_type)
+ if not school_types:
+ return {"c": 0}
+ # 使用in子句查询多个学校类型
+ placeholders = ",".join([f":type{i}" for i in range(len(school_types))])
+ sql = f"select count(1) as c from t_school where region_level3=:region_level3 and school_type in ({placeholders})"
+ params = {"region_level3": region_level3}
+ # 添加每个学校类型的参数
+ for i, st in enumerate(school_types):
+ params[f"type{i}"] = st
+ return await db.findFirst(sql, params)
+ else:
+ # 原有的单个学校类型查询逻辑
+ sql = "select count(1) as c from t_school where region_level3=:region_level3 and school_type=:school_type"
+ return await db.findFirst(sql, {"region_level3": region_level3, "school_type": school_type})
+
+
+# 更新学校经纬度
+async def updateSchool(org_name, longitude, latitude):
+ sql = "update t_school set longitude=:longitude,latitude=:latitude where org_name=:org_name"
+ return await db.execute_update(sql, {"org_name": org_name, "longitude": longitude, "latitude": latitude})
+
+# 重置所有学校坐标为0
+async def reset_all_school_coordinates():
+ """
+ 将所有学校的经纬度坐标重置为0
+ """
+ print("\n正在重置所有学校坐标...")
+ sql = "update t_school set longitude=0,latitude=0"
+ try:
+ result = await db.execute_update(sql, {})
+ print(f"✅ 成功重置 {result} 条学校记录的坐标")
+ return True
+ except Exception as e:
+ print(f"❌ 重置坐标失败: {str(e)}")
+ return False
+
+async def get_schools_by_county_and_level(county_name, education_level):
+ """
+ 获取指定县区和学段的学校列表,包含当前坐标信息
+ 只从t_school表获取数据,不依赖t_school_xy表
+ """
+ # 获取对应的学校类型列表
+ school_types = get_school_types_by_education_level(education_level)
+ if not school_types:
+ return []
+
+ # 使用in子句查询多个学校类型
+ placeholders = ",".join([f":type{i}" for i in range(len(school_types))])
+
+ # 从t_school表获取学校数据和当前坐标
+ sql = f"""
+ select region_level1, region_level2, region_level3, region_level4, region_level5,
+ school_type, org_name, longitude, latitude
+ from t_school
+ where region_level3=:county_name and school_type in ({placeholders})
+ order by region_level1, region_level2, region_level3, region_level4, region_level5, school_type
+ """
+
+ params = {"county_name": county_name}
+ # 添加每个学校类型的参数
+ for i, st in enumerate(school_types):
+ params[f"type{i}"] = st
+
+ schools = await db.find(sql, params)
+
+ # 转换坐标数据类型,确保longitude和latitude是float类型
+ from decimal import Decimal
+ for school in schools:
+ if isinstance(school.get("longitude"), Decimal):
+ school["longitude"] = float(school["longitude"])
+ if isinstance(school.get("latitude"), Decimal):
+ school["latitude"] = float(school["latitude"])
+
+ return schools
+
+def optimize_school_distribution(schools, polygons):
+ """
+ 优化学校坐标分布
+ - 对于已经在多边形内部的坐标,保持不变
+ - 对于不在多边形内部的坐标,将其调整到多边形中
+ """
+ if not schools:
+ return []
+
+ # 获取目标区域的边界信息
+ all_target_points = []
+ for polygon in polygons:
+ all_target_points.extend(polygon)
+
+ target_lons = [p[0] for p in all_target_points]
+ target_lats = [p[1] for p in all_target_points]
+
+ target_min_lon, target_max_lon = min(target_lons), max(target_lons)
+ target_min_lat, target_max_lat = min(target_lats), max(target_lats)
+
+ # 处理每个学校的坐标
+ optimized_coords = []
+ for school in schools:
+ lon, lat = school["longitude"], school["latitude"]
+
+ # 检查坐标是否已经在多边形内
+ if any(is_point_in_polygon((lon, lat), polygon) for polygon in polygons):
+ # 如果在多边形内,保持原坐标不变
+ optimized_coords.append((lon, lat))
+ else:
+ # 如果不在多边形内,将其调整到最近的多边形边界
+ adjusted_lon, adjusted_lat = adjust_to_polygon_boundary([lon, lat], polygons)
+ optimized_coords.append((adjusted_lon, adjusted_lat))
+
+ return optimized_coords
+
+async def process_school_coordinates():
+ """
+ 优化t_school表中现有学校坐标分布
+ 按县区和学段分组处理,美化坐标分布
+ 注意:这是一个补丁程序,只修改现有坐标,不重置为0
+ """
+ print("\n===== 学校坐标分布优化补丁 =====")
+ print("正在开始优化现有学校坐标分布...")
+
+ try:
+ # 1. 获取所有县区信息
+ areas = await getAllArea()
+ print(f"\n✅ 成功获取 {len(areas)} 个县区信息")
+
+ # 2. 定义需要处理的学段
+ education_levels = ["学前", "小学", "初中", "高中"]
+
+ # 3. 统计信息
+ total_schools = 0
+ processed_schools = 0
+ failed_counties = 0
+
+ # 4. 遍历所有县区
+ for area in areas:
+ county_name = area["area_name"]
+ area_code = str(area["area_code"])[:-3] # 去掉最后三位0
+
+ print(f"\n🔄 正在处理: {county_name} (代码: {area_code})")
+
+ # 5. 构建GeoJSON文件路径
+ geojson_path = f"d:\\dsWork\\YunNanProject\\Init\\Json\\{area_code}.json"
+
+ try:
+ # 6. 加载县区边界数据
+ polygons = load_geojson(geojson_path)
+ print(f"✅ 成功加载 {county_name} 边界数据")
+
+ # 7. 遍历所有学段
+ for education_level in education_levels:
+ print(f" 📚 学段: {education_level}")
+
+ try:
+ # 8. 获取该县区该学段的学校列表及其现有坐标
+ schools = await get_schools_by_county_and_level(county_name, education_level)
+
+ if not schools:
+ print(f" ⏭️ 该学段无待处理学校")
+ continue
+
+ # 过滤掉没有坐标的学校
+ schools_with_coords = [s for s in schools if s["longitude"] is not None and s["latitude"] is not None]
+
+ if not schools_with_coords:
+ print(f" ⏭️ 该学段没有有效坐标的学校")
+ continue
+
+ print(f" 📋 找到 {len(schools_with_coords)} 所需要优化坐标的学校")
+ total_schools += len(schools_with_coords)
+
+ # 9. 优化学校坐标分布
+ optimized_coords = optimize_school_distribution(schools_with_coords, polygons)
+
+ # 10. 更新学校坐标
+ for i, (school, (lon, lat)) in enumerate(zip(schools_with_coords, optimized_coords), 1):
+ org_name = school["org_name"]
+ result = await updateSchool(org_name, lon, lat)
+ if result:
+ processed_schools += 1
+ print(f" ✅ {i}/{len(schools_with_coords)} 已优化: {org_name}")
+ else:
+ print(f" ❌ {i}/{len(schools_with_coords)} 优化失败: {org_name}")
+
+ except Exception as e:
+ print(f" ⚠️ 处理{education_level}学段时出错: {str(e)}")
+ continue
+
+ except FileNotFoundError:
+ print(f"❌ 未找到 {county_name} 的GeoJSON文件: {geojson_path}")
+ failed_counties += 1
+ except Exception as e:
+ print(f"❌ 处理{county_name}时出错: {str(e)}")
+ failed_counties += 1
+ continue
+
+ # 12. 输出统计结果
+ print("\n" + "="*50)
+ print("🎯 批量处理完成!")
+ print(f"📊 统计信息:")
+ print(f" - 总县区数: {len(areas)}")
+ print(f" - 成功处理县区数: {len(areas) - failed_counties}")
+ print(f" - 失败县区数: {failed_counties}")
+ print(f" - 待处理学校总数: {total_schools}")
+ print(f" - 成功更新学校数: {processed_schools}")
+ print("="*50)
+
+ except Exception as e:
+ print(f"\n❌ 批量处理过程中发生错误: {str(e)}")
+ import traceback
+ traceback.print_exc()
+ raise
+ finally:
+ # 确保在正常执行和异常情况下都关闭数据库连接
+ if 'db' in globals() and hasattr(db, 'engine') and db.engine:
+ try:
+ await db.engine.dispose()
+ print("\n✅ 数据库连接已成功关闭")
+ except Exception as dispose_error:
+ print(f"\n❌ 关闭数据库连接时出错: {str(dispose_error)}")
+
+if __name__ == "__main__":
+ # 直接开始批量处理 - 为所有学校生成坐标
+ try:
+ asyncio.run(process_school_coordinates())
+ except KeyboardInterrupt:
+ print("\n⚠️ 程序被用户中断")
+ except Exception as e:
+ # 捕获并处理所有异常,包括asyncio和SSL相关错误
+ print(f"\n❌ 程序执行出错: {str(e)}")
+ print(" 错误类型:", type(e).__name__)
+ # 仅在需要详细调试时显示完整堆栈
+ print("\n详细错误信息:")
+ import traceback
+ traceback.print_exc()
+ finally:
+ print("\n程序已退出")
\ No newline at end of file
diff --git a/Apps/Json/amap_cookies.json b/Apps/Json/amap_cookies.json
new file mode 100644
index 0000000..d17d26a
--- /dev/null
+++ b/Apps/Json/amap_cookies.json
@@ -0,0 +1,89 @@
+[
+ {
+ "domain": ".amap.com",
+ "expiry": 1783436001,
+ "httpOnly": false,
+ "name": "tfstk",
+ "path": "/",
+ "sameSite": "None",
+ "secure": true,
+ "value": "gM_oFfTFRg-71NH4Sv874ohkZ_ZAwUTBK93ppepU0KJXJW9RTebhp6-FyUCRnBWVhe3JzeUHKTWM99fQNBJFL9vd2oUON_TB8RB3WPC5mpKEaTAE8sPe1BAUM3zSaLiH8ReTkUIGoi8Fw8wZHn52hBAEapWe0sRH3QReY9J20CRtUe8FLSv29Bkr8LuUumR93p8e8954iBp2ae8FLsPDObOaUL7FyZyL5IXlLBGRuQxkQ_JPw1bqo3o5OK0E8NSDqdupn2uFoQ5FNSuqSkpNfLK9ptzxref2tTpAQPuDuhj19BXur48R0i_WyZeip3YvehSem7zPiUvkjaKi1mLlYT_HVgcQ1s8PhG964owXiaQ9xdtm385AiL-GxTej8LIGgtxOkx39RtsFLBXqEgoq0coMm2O49ZoIA3RXidFP3WmOJLCWuSVmjptyGQJTiSmIA3RXidF0icYM4IOyB"
+ },
+ {
+ "domain": ".amap.com",
+ "httpOnly": true,
+ "name": "oauth_state",
+ "path": "/",
+ "sameSite": "None",
+ "secure": true,
+ "value": "e88390e153019eb5fdc2a6a361b08407"
+ },
+ {
+ "domain": ".amap.com",
+ "expiry": 1775660027,
+ "httpOnly": true,
+ "name": "passport_login",
+ "path": "/",
+ "sameSite": "None",
+ "secure": true,
+ "value": "MTIyMDQwNjY0MSxhbWFwMjc1OWtPR0wsdGtsaXFqZGE0dDNnbnRrY3dpbHFtZG1nbXdncGE2ZjUsMTc2Nzg4NDAyNyxOVEJpT1dRMVlqaGlOemRsWVRZeE4yRTBNVGswWkRreU5tVTBNVFF5WW1FPQ%3D%3D"
+ },
+ {
+ "domain": ".amap.com",
+ "expiry": 1768143203,
+ "httpOnly": false,
+ "name": "xlly_s",
+ "path": "/",
+ "sameSite": "None",
+ "secure": true,
+ "value": "1"
+ },
+ {
+ "domain": ".amap.com",
+ "expiry": 1802444002,
+ "httpOnly": false,
+ "name": "cna",
+ "path": "/",
+ "sameSite": "None",
+ "secure": true,
+ "value": "4rLmIViEnl4CAXzrzjwC3UGc"
+ },
+ {
+ "domain": "lbs.amap.com",
+ "expiry": 1802444003,
+ "httpOnly": false,
+ "name": "_uab_collina",
+ "path": "/tools",
+ "sameSite": "Lax",
+ "secure": false,
+ "value": "176788400312910602225889"
+ },
+ {
+ "domain": ".lbs.amap.com",
+ "httpOnly": false,
+ "name": "HMACCOUNT",
+ "path": "/",
+ "sameSite": "Lax",
+ "secure": false,
+ "value": "DAC02E19E8B24CB5"
+ },
+ {
+ "domain": ".lbs.amap.com",
+ "httpOnly": false,
+ "name": "Hm_lpvt_c8ac07c199b1c09a848aaab761f9f909",
+ "path": "/",
+ "sameSite": "Lax",
+ "secure": false,
+ "value": "1767884002"
+ },
+ {
+ "domain": ".lbs.amap.com",
+ "expiry": 1799420002,
+ "httpOnly": false,
+ "name": "Hm_lvt_c8ac07c199b1c09a848aaab761f9f909",
+ "path": "/",
+ "sameSite": "Lax",
+ "secure": false,
+ "value": "1767884002"
+ }
+]
\ No newline at end of file
diff --git a/Apps/XinDianTu/Coord.py b/Apps/XinDianTu/Coord.py
new file mode 100644
index 0000000..3077833
--- /dev/null
+++ b/Apps/XinDianTu/Coord.py
@@ -0,0 +1,145 @@
+import asyncio
+import os
+import sys
+import logging
+from sqlalchemy import text
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+# python -m pip install webdriver-manager selenium
+# https://googlechromelabs.github.io/chrome-for-testing/
+# https://storage.googleapis.com/chrome-for-testing-public/143.0.7499.192/win64/chromedriver-win64.zip
+# update t_station_profile_scd set coord_x=null,coord_y=null where id='95783932-1d32-48e4-9a38-6a6696a6a423'
+# 将项目根目录添加到系统路径,确保可以导入 Util, DbKit 和 Config 模块
+sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+
+from Util.PaChongGaoDeKit import PaChongGaoDeKit
+from DbKit.Db import Db
+from Config.Config import DB_URL
+
+class CookieInvalidError(Exception):
+ """自定义异常:表示 Cookie 无效或过期"""
+ pass
+
+async def main(check_cookie_first=True):
+ """
+ 坐标回填任务:自动扫描数据库中缺失坐标的场站地址,并通过高德地图补全。
+ :param check_cookie_first: 是否在开始前验证 Cookie 有效性
+ """
+ logger.info("正在启动 T4_Coord: 高德地图坐标回填任务...")
+
+ # 初始化数据库连接
+ db = Db(db_url=DB_URL)
+ await db.init_db()
+
+ # 初始化高德地图工具类(使用无头模式)
+ # 显式指定 Cookie 路径,确保跨目录运行时能找到文件
+ project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+ cookie_path = os.path.join(project_root, 'Json', 'amap_cookies.json')
+
+ if not os.path.exists(cookie_path):
+ logger.error(f"错误:未找到 Cookie 文件:{cookie_path}")
+ # 如果要求检查且文件不存在,直接抛出异常以便上层处理
+ if check_cookie_first:
+ await db.close()
+ raise CookieInvalidError("Cookie file not found")
+ logger.error("请先运行 Tools/T3_GetAmapCookie.py 生成有效 Cookie。")
+ return
+
+ kit = PaChongGaoDeKit(cookie_file=cookie_path, headless=False)
+
+ try:
+ # 0. Cookie 有效性探针
+ if check_cookie_first:
+ logger.info("正在验证高德地图 Cookie 有效性...")
+ loop = asyncio.get_event_loop()
+ # 使用一个肯定存在的地址进行测试
+ test_addr = "北京市天安门"
+ t_lng, t_lat = await loop.run_in_executor(None, kit.get_coordinate, test_addr)
+
+ if not t_lng:
+ logger.warning(f"Cookie 验证失败:无法获取测试地址 '{test_addr}' 的坐标。")
+ logger.warning("判定 Cookie 已失效或过期。")
+ raise CookieInvalidError("Cookie invalid or expired")
+ else:
+ logger.info(f"Cookie 验证通过 (测试坐标: {t_lng}, {t_lat})。")
+
+ async with await db.get_session() as session:
+ # 1. 查询所有地址不为空但缺失坐标的唯一地址
+ sql_missing = """
+ SELECT DISTINCT address
+ FROM t_station_profile_scd
+ WHERE address IS NOT NULL
+ AND address != ''
+ AND (coord_x IS NULL OR coord_y IS NULL)
+ """
+ result = await session.execute(text(sql_missing))
+ missing_addresses = [row[0] for row in result.fetchall()]
+
+ logger.info(f"共发现 {len(missing_addresses)} 个缺失坐标的唯一地址。")
+
+ for address in missing_addresses:
+ logger.info(f"\n正在处理地址: {address}")
+
+ # 2. 检查数据库中其他记录是否已经存有该地址的坐标(去重复查询)
+ # 这样可以最大程度减少对高德地图接口的调用
+ sql_check = """
+ SELECT coord_x, coord_y
+ FROM t_station_profile_scd
+ WHERE address = :addr
+ AND coord_x IS NOT NULL
+ AND coord_y IS NOT NULL
+ LIMIT 1
+ """
+ existing = await session.execute(text(sql_check), {"addr": address})
+ row = existing.fetchone()
+
+ lng, lat = None, None
+
+ if row:
+ lng, lat = row[0], row[1]
+ logger.info(f" -> 在数据库中找到现有坐标: {lng}, {lat}")
+ else:
+ # 3. 数据库中没有,调用高德地图进行查询
+ logger.info(" -> 数据库中无记录,正在查询高德地图...")
+ # 在线程池中运行同步的 Selenium 调用,避免阻塞异步循环
+ loop = asyncio.get_event_loop()
+ lng, lat = await loop.run_in_executor(None, kit.get_coordinate, address)
+
+ if lng and lat:
+ logger.info(f" -> 高德地图返回坐标: {lng}, {lat}")
+ else:
+ logger.info(" -> 高德地图未返回有效坐标。")
+
+ # 4. 如果获取到了坐标,更新数据库中所有匹配该地址的记录
+ if lng and lat:
+ sql_update = """
+ UPDATE t_station_profile_scd
+ SET coord_x = :lng, coord_y = :lat
+ WHERE address = :addr
+ """
+ await session.execute(text(sql_update), {
+ "lng": lng,
+ "lat": lat,
+ "addr": address
+ })
+ await session.commit()
+ logger.info(f" -> 已成功更新数据库中地址为 '{address}' 的记录。")
+ else:
+ logger.info(f" -> 跳过更新 (未找到有效坐标)。")
+
+ except Exception as e:
+ logger.error(f"执行过程中出错: {e}")
+ finally:
+ # 释放资源
+ kit.close()
+ await db.close()
+ logger.info("\n任务执行结束。")
+
+if __name__ == "__main__":
+ # 针对 Windows 平台的异步策略设置
+ if sys.platform == 'win32':
+ asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
+ asyncio.run(main())
diff --git a/Apps/XinDianTu/Crawler.py b/Apps/XinDianTu/Crawler.py
new file mode 100644
index 0000000..96550b5
--- /dev/null
+++ b/Apps/XinDianTu/Crawler.py
@@ -0,0 +1,581 @@
+# coding=utf-8
+import asyncio
+import logging
+import uuid
+import os
+import sys
+import json
+import time
+import hashlib
+from PIL import Image
+
+# 将项目根目录添加到 sys.path
+project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+import uiautomator2 as u2
+from Core.BaseCrawler import BaseCrawler
+from Util import Kit
+from Util.Kit import take_screenshot
+from Util.ObsUtil import ObsUploader
+from Util.RedisKit import RedisKit
+from Util.PaddleOCRKit import get_ocr_kit
+import cv2
+from Apps.XinDianTu.Service import XinDianTuService
+from Config.Config import (
+ OBS_TMP_PREFIX, CDN_DOMAIN, SCROLL_DISTANCE_RATIO,
+ MAX_SCROLLS, REDIS_STATION_EXPIRE,
+ WAIT_DETAIL_PAGE_LOAD, WAIT_BACK_TO_LIST, WAIT_AFTER_SCROLL,
+ MAX_CRAWL_DISTANCE
+)
+
+# --- 用户配置区域 ---
+# 是否保留截图文件(True=保留备查,False=随用随删)
+KEEP_SCREENSHOTS = True
+
+# [Testing] 是否在启动时清除 Redis 中的场站处理记录
+# True: 每次运行前清除记录,方便反复测试同一个场站
+# False: 生产模式,保留记录以避免重复爬取
+TEST_CLEAR_REDIS = True
+
+# 配置说明:
+# SCROLL_DISTANCE_RATIO 控制翻页时的滑动距离(在 Config.py 中修改)。
+# 对于华为 Mate 20x 等分辨率较低或屏幕较小的手机,如果发现翻页时跳过了某些场站,
+# 请尝试减小 SCROLL_DISTANCE_RATIO(例如设置为 0.4 或 0.3)。
+# 这样每次滑动的距离变短,可以确保所有场站都能被完整显示并识别。
+
+# 配置日志输出
+logging.basicConfig(
+ level=logging.INFO,
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+ handlers=[
+ logging.StreamHandler(sys.stdout)
+ ]
+)
+logger = logging.getLogger("StationList")
+
+# 强制设置所有相关模块的日志级别为 INFO,防止被第三方库干扰
+logging.getLogger("PaddleOCRKit").setLevel(logging.INFO)
+logging.getLogger("Util.Kit").setLevel(logging.INFO)
+logging.getLogger("OpenXinDianTu").setLevel(logging.INFO)
+logging.getLogger("FullProcess").setLevel(logging.INFO)
+
+class XinDianTuCrawler(BaseCrawler):
+ """
+ 新电途小程序爬虫实现
+ """
+ def __init__(self, service=None):
+ super().__init__(service)
+ # 初始化配置参数
+ self.max_scrolls = MAX_SCROLLS
+ self.uploader = ObsUploader()
+ self.redis_kit = RedisKit()
+
+ async def start(self):
+ """
+ 实现 BaseCrawler 的启动入口
+ """
+ # 兼容旧逻辑,直接调用 main
+ await main(self.service)
+
+ async def open_app(self):
+ # 实际逻辑在 Opener.py,此处可作为封装层
+ pass
+
+ async def crawl_list(self):
+ # 实际逻辑在 get_station_list,此处可作为封装层
+ pass
+
+ async def crawl_detail(self, station_info):
+ pass
+
+async def get_station_list(d, service, uploader, max_scrolls=MAX_SCROLLS):
+ """
+ 获取场站列表并处理翻页
+ """
+ all_stations = []
+ seen_names = set()
+ redis_kit = RedisKit()
+
+ # 确保在“找桩”或者首页列表界面
+ window_size = d.window_size()
+ w, h = window_size[0], window_size[1]
+
+ # 获取设备信息以用于坐标计算
+ device_info = d.info
+ device_info['width'] = w
+ device_info['height'] = h
+
+ logger.info(f"设备信息: {device_info.get('productName')} | 窗口分辨率: {w}x{h}")
+
+ max_distance_reached = False
+ stop_reason = "max_scrolls_reached" # 默认停止原因:达到最大翻页次数
+
+ # 存储后台异步任务
+ background_tasks = []
+
+ for i in range(max_scrolls + 1):
+ if max_distance_reached:
+ logger.info("已达到最大抓取距离,停止翻页。")
+ stop_reason = "max_distance_reached"
+ break
+ logger.info(f"正在处理第 {i + 1} 页...")
+
+ # 1. 拍摄截图
+ logger.info(f"Step [1/6] 正在拍摄列表页截图...")
+ t_shot = time.time()
+ image_uuid = str(uuid.uuid4())
+ # 使用相对路径: 基于当前脚本目录下的 Images 文件夹
+ base_dir = os.path.dirname(os.path.abspath(__file__))
+ save_dir = os.path.join(base_dir, "./Images")
+ screenshot_path = take_screenshot(d, image_uuid, save_dir=save_dir)
+ logger.info(f"Step [1/6] 列表页截图已完成: {screenshot_path} (耗时: {time.time() - t_shot:.2f}s)")
+
+ # 校验截图实际尺寸
+ img_w, img_h = 0, 0
+ try:
+ with Image.open(screenshot_path) as img:
+ img_w, img_h = img.size
+ logger.info(f"截图实际尺寸: {img_w}x{img_h}")
+ # 如果截图尺寸与窗口尺寸不符,更新 device_info 以适配坐标换算
+ if img_w != w or img_h != h:
+ logger.warning(f"检测到截图尺寸 ({img_w}x{img_h}) 与窗口尺寸 ({w}x{h}) 不一致,将以截图尺寸为准进行坐标换算。")
+ device_info['width'] = img_w
+ device_info['height'] = img_h
+ except Exception as e:
+ logger.warning(f"无法获取截图尺寸信息: {e}")
+
+ # 2. 使用 Kit.crop_cards_from_image 进行切片和生成 _vl.jpg
+ logger.info("Step [2/6] 正在执行本地图形学切片分析,识别场站卡片并生成绿色方框图...")
+ t_crop = time.time()
+ # 这会生成 _vl.jpg 和 .json
+ Kit.crop_cards_from_image(screenshot_path)
+ logger.info(f"Step [2/6] 图形学切片分析完成 (耗时: {time.time() - t_crop:.2f}s)")
+
+ # 读取生成的元数据
+ json_path = screenshot_path.replace(".jpg", ".json")
+ vl_img_path = screenshot_path.replace(".jpg", "_vl.jpg")
+
+ if not os.path.exists(json_path) or not os.path.exists(vl_img_path):
+ logger.error(f"❌ Step [2/6] 失败: 未生成有效的 JSON 或 VL 图片 (JSON: {os.path.exists(json_path)}, VL: {os.path.exists(vl_img_path)})")
+ logger.warning("可能未识别到任何卡片,跳过当前页")
+ continue
+
+ logger.info(f"Step [3/6] 绿色方框图已生成: {vl_img_path}")
+
+ with open(json_path, 'r', encoding='utf-8') as f:
+ json_metadata = json.load(f)
+
+ # --- New Logic: Local OCR via PaddleOCRKit ---
+ logger.info("Step [4/6] 正在开始本地 OCR 识别流程,将识别出的卡片逐一交给 OCR...")
+ t_ocr_total = time.time()
+
+ stations = []
+ try:
+ ocr_kit = get_ocr_kit()
+
+ # 读取原始截图进行裁剪 (比读取 _vl.jpg 更干净,没有绿框干扰)
+ original_img = cv2.imread(screenshot_path)
+
+ if "cards" in json_metadata and original_img is not None:
+ h_img, w_img = original_img.shape[:2]
+ num_cards = len(json_metadata['cards'])
+ logger.info(f"检测到 {num_cards} 个场站卡片,准备开始逐一 OCR 识别...")
+
+ for idx, card in enumerate(json_metadata["cards"]):
+ # card: {"id": 1, "rect": [x1, y1, x2, y2], "click_point": [cx, cy]}
+ rect = card.get("rect")
+ if not rect: continue
+ x1, y1, x2, y2 = rect
+
+ # 边界检查
+ x1 = max(0, min(x1, w_img))
+ x2 = max(0, min(x2, w_img))
+ y1 = max(0, min(y1, h_img))
+ y2 = max(0, min(y2, h_img))
+
+ if x2 <= x1 or y2 <= y1: continue
+
+ # 裁剪卡片
+ cropped_card = original_img[y1:y2, x1:x2]
+
+ # 识别
+ logger.info(f"正在识别第 {idx+1}/{num_cards} 个卡片 (区域: {rect})...")
+ t_card_start = time.time()
+ parsed_data = ocr_kit.recognize(cropped_card)
+ t_card_end = time.time()
+
+ # Log detailed OCR result
+ logger.info(f"卡片 {idx+1} OCR 识别耗时: {t_card_end - t_card_start:.2f}s")
+
+ if parsed_data and parsed_data.get("station_name"):
+ # 格式化数据以匹配原有结构
+ piles_list = parsed_data.get("piles", [])
+ piles_str_parts = []
+ for p in piles_list:
+ p_type = p.get("type", "")
+ p_free = p.get("free", 0)
+ p_total = p.get("total", 0)
+ piles_str_parts.append(f"{p_type}:{p_free}/{p_total}")
+
+ piles_str = " ".join(piles_str_parts)
+
+ station_info = {
+ "station_name": parsed_data.get("station_name"),
+ "price": str(parsed_data.get("price")) if parsed_data.get("price") is not None else "",
+ "pro_price": "", # 暂未解析
+ "piles": piles_str,
+ "distance": parsed_data.get("distance", ""),
+ "uia_center_x": card["click_point"][0],
+ "uia_center_y": card["click_point"][1],
+ "tags": parsed_data.get("tags", []),
+ "parking_info": parsed_data.get("parking", "")
+ }
+ logger.info(f"✅ 成功解析场站: {station_info['station_name']} | 距离: {station_info['distance']}")
+
+ # 立即记录场站基础状态信息 (电桩、价格等)
+ try:
+ await service.record_station_status(station_info)
+ except Exception as e:
+ logger.error(f"❌ 记录场站状态失败: {e}")
+
+ stations.append(station_info)
+ else:
+ logger.warning(f"⚠️ 卡片 {idx+1} 未能识别出有效场站名称")
+
+ except Exception as e:
+ logger.error(f"❌ Local OCR processing failed: {e}", exc_info=True)
+
+ logger.info(f"Step [5/6] 本地 OCR 解析完成 (总耗时: {time.time() - t_ocr_total:.2f}s) | 成功识别: {len(stations)}/{len(json_metadata.get('cards', []))}")
+
+ if not stations:
+ logger.warning("当前页面未检测到任何有效的场站信息")
+ else:
+ logger.info(f"Step [6/6] 准备开始逐一点击场站进入详情页 (共 {len(stations)} 个)...")
+ new_stations_found = False
+ for s_idx, s in enumerate(stations):
+ name = s.get("station_name")
+
+ # 过滤掉明显的非场站名称
+ if not name:
+ continue
+
+ # --- 短期去重:检查 Redis 缓存 ---
+ # 2分钟内如果处理过该场站,则跳过
+ redis_key = f"processed_station:{name}"
+ if await redis_kit.exists(redis_key):
+ logger.info(f"场站 {name} 在 2 分钟内已处理过,跳过")
+ continue
+
+ if name in seen_names:
+ continue
+
+ # 使用从 JSON 元数据中恢复的点击坐标
+ x = s.get("uia_center_x")
+ y = s.get("uia_center_y")
+
+ if x is None or y is None:
+ logger.warning(f"场站 {name} 缺少坐标信息,无法进入详情页")
+ continue
+
+ seen_names.add(name)
+ all_stations.append(s)
+ new_stations_found = True
+
+ # 打印基本信息
+ price = s.get("price")
+ pro_price = s.get("pro_price")
+ piles_str = s.get("piles", "")
+ distance_str = s.get("distance", "")
+
+ # 检查距离
+ dist_log_part = ""
+ if distance_str:
+ try:
+ import re
+ dist_match = re.search(r"(\d+(\.\d+)?)", distance_str)
+ if dist_match:
+ dist_val = float(dist_match.group(1))
+ is_km = "km" in distance_str.lower()
+ dist_km = dist_val if is_km else dist_val / 1000.0
+
+ # 将距离解析结果和限制检查合并到日志中
+ dist_log_part = f" (解析: {dist_km:.2f}km / 限: {MAX_CRAWL_DISTANCE}km)"
+
+ if dist_km >= MAX_CRAWL_DISTANCE:
+ logger.info(f"当前场站 {name} 距离 {dist_km}km (原始: {distance_str}) 已达到或超过限制 {MAX_CRAWL_DISTANCE}km。")
+ max_distance_reached = True
+ except Exception as e:
+ logger.warning(f"解析距离出错: {distance_str}, {e}")
+
+ pro_info = f" | PRO会员价: {pro_price}" if pro_price else ""
+ # 确保距离始终显示,如果为空则显示 "未知"
+ display_distance = distance_str if distance_str else "未知"
+ logger.info(f"正在处理第 {s_idx+1} 个场站: {name} | 价格: {price}{pro_info} | 枪: {piles_str} | 距离: {display_distance}{dist_log_part}")
+
+ if max_distance_reached:
+ break
+
+ # --- 点击进入详情页记录地址 ---
+ # 使用相对坐标点击,以适应不同分辨率
+ if img_w > 0 and img_h > 0:
+ rel_x = max(0.0, min(1.0, x / img_w))
+ rel_y = max(0.0, min(1.0, y / img_h))
+ logger.info(f"👉 正在点击进入详情页: {name} (相对坐标: {rel_x:.3f}, {rel_y:.3f})")
+ d.click(rel_x, rel_y)
+ else:
+ logger.info(f"👉 正在点击进入详情页: {name} (绝对坐标: {x}, {y})")
+ d.click(x, y)
+
+ await asyncio.sleep(WAIT_DETAIL_PAGE_LOAD) # 等待详情页加载
+
+ # 尝试获取并保存地址
+ address_recorded = False
+ for retry in range(2):
+ # 1. 拍摄详情页截图
+ t_d_shot = time.time()
+ detail_uuid = str(uuid.uuid4())
+ detail_screenshot_path = take_screenshot(d, detail_uuid, save_dir=save_dir)
+ logger.info(f"Step [详情页截图] 耗时: {time.time() - t_d_shot:.4f}s")
+
+ # 2. 上传至 OBS
+ t_d_up = time.time()
+ detail_object_key = f"{OBS_TMP_PREFIX}/{detail_uuid}.jpg"
+ up_success, _ = uploader.upload_file(detail_object_key, detail_screenshot_path)
+ logger.info(f"Step [上传详情页截图] 耗时: {time.time() - t_d_up:.4f}s")
+
+ if up_success:
+ detail_url = f"https://{CDN_DOMAIN}/{detail_object_key}"
+ # 3. 解析并保存地址 (异步后台处理)
+ # 定义异步任务函数
+ async def _process_address_task(task_name, task_url, task_dev_info, task_redis_key):
+ t_addr_task = time.time()
+ try:
+ addr_res = await service.process_station_address(task_name, task_url, device_info=task_dev_info)
+ logger.info(f"Step [解析并保存地址-后台] 耗时: {time.time() - t_addr_task:.4f}s")
+ if addr_res.get("address"):
+ logger.info(f"成功记录地址: {addr_res.get('address')}")
+ # 记录到 Redis,设置过期时间
+ await redis_kit.set_data(task_redis_key, "1", expire=REDIS_STATION_EXPIRE)
+ except Exception as e:
+ logger.error(f"后台处理地址失败 ({task_name}): {e}")
+
+ # 创建并启动任务
+ addr_task = asyncio.create_task(_process_address_task(name, detail_url, device_info, redis_key))
+ background_tasks.append(addr_task)
+ logger.info(f"已提交地址解析任务到后台: {name}")
+
+ # 标记为已记录以跳出 retry 循环
+ address_recorded = True
+
+ # 清理详情页临时截图
+ if not KEEP_SCREENSHOTS and os.path.exists(detail_screenshot_path):
+ os.remove(detail_screenshot_path)
+
+ break # 直接跳出 retry 循环
+
+ # --- 抓取价格时段信息 (New Feature) ---
+ # 仅在测试模式下或特定需求下启用
+ try:
+ logger.info(f"开始抓取价格时段信息: {name}")
+
+ # 使用几何特征识别 "全部时段" 按钮
+ # 临时截图
+ temp_uuid = "temp_find_expand"
+ screenshot_path = take_screenshot(d, temp_uuid, save_dir="Temp")
+
+ # 尝试识别,将调试图片保存到 Images 目录
+ t_find = time.time()
+ pos = Kit.find_expand_button_position(screenshot_path, debug_dir=save_dir, debug_filename_prefix=name)
+ logger.info(f"Step [识别展开按钮] 耗时: {time.time() - t_find:.4f}s")
+
+ # 清理截图
+ try:
+ os.remove(screenshot_path)
+ except:
+ pass
+
+ if pos:
+ x, y = pos
+ logger.info(f"通过几何特征找到 '全部时段' 按钮: ({x}, {y})")
+ d.click(x, y)
+ await asyncio.sleep(1.5)
+
+ # 抓取3屏截图
+ price_image_urls = []
+ for p_idx in range(1, 4):
+ # 使用场站名称的MD5值作为文件名前缀,避免中文和特殊字符导致的URL问题
+ t_p_loop = time.time()
+ name_md5 = hashlib.md5(name.encode('utf-8')).hexdigest()
+ p_uuid = f"{name_md5}_price_{p_idx}"
+ p_path = take_screenshot(d, p_uuid, save_dir=save_dir)
+ logger.info(f"已保存价格时段截图 {p_idx} (Station: {name}, MD5: {name_md5}): {p_path}")
+
+ # 上传到 OBS
+ p_object_key = f"{OBS_TMP_PREFIX}/{p_uuid}.jpg"
+ success, _ = uploader.upload_file(p_object_key, p_path)
+ if success:
+ p_url = f"https://{CDN_DOMAIN}/{p_object_key}"
+ price_image_urls.append(p_url)
+ logger.info(f"截图上传成功: {p_url}")
+ else:
+ logger.warning(f"截图上传失败: {p_path}")
+
+ logger.info(f"Step [价格截图与上传-{p_idx}] 耗时: {time.time() - t_p_loop:.4f}s")
+
+ if p_idx < 3:
+ d.swipe_ext("up", scale=0.7)
+ await asyncio.sleep(1.0)
+
+ # 调用服务解析价格时段 (异步后台处理)
+ if price_image_urls:
+ logger.info(f"正在调用接口解析电费时段数据 ({len(price_image_urls)} 张图片) - 转入后台...")
+
+ async def _process_price_task(task_name, task_urls, task_dev_info):
+ t_price_task = time.time()
+ try:
+ await service.process_price_schedule(task_name, task_urls, device_info=task_dev_info)
+ logger.info(f"Step [解析电费时段数据-后台] 耗时: {time.time() - t_price_task:.4f}s")
+ logger.info(f"电费时段数据解析完成: {task_name}")
+ except Exception as e:
+ logger.error(f"后台处理价格时段失败 ({task_name}): {e}")
+
+ price_task = asyncio.create_task(_process_price_task(name, price_image_urls, device_info))
+ background_tasks.append(price_task)
+ else:
+ logger.warning("未能获取到有效的价格时段截图,跳过解析")
+ else:
+ logger.warning(f"未能通过几何特征识别 '全部时段' 按钮")
+
+ except Exception as e:
+ logger.warning(f"抓取价格时段信息时发生异常: {e}")
+
+ # 测试模式:仅处理第一个场站
+ # logger.info("测试模式:仅处理第一个场站,即将退出 (Y3)")
+ # return all_stations
+
+ # 返回列表页
+ d.press("back")
+ await asyncio.sleep(WAIT_BACK_TO_LIST) # 等待列表页重新稳定
+
+ if not new_stations_found and i > 0:
+ logger.info("未发现更多新场站,停止下拉。")
+ # 如果需要强行爬取所有,可以注释掉 break
+ # break
+
+ # 5. 如果还没到最后一页,执行下拉
+ if i < max_scrolls and not max_distance_reached:
+ logger.info(f"执行下拉翻页 (距离比例: {SCROLL_DISTANCE_RATIO})...")
+ # 根据配置的比例计算滑动起始和终点
+ # 保证滑动在屏幕中心区域进行
+ start_y = 0.5 + (SCROLL_DISTANCE_RATIO / 2)
+ end_y = 0.5 - (SCROLL_DISTANCE_RATIO / 2)
+ d.swipe(w * 0.5, h * start_y, w * 0.5, h * end_y, duration=0.5)
+ await asyncio.sleep(WAIT_AFTER_SCROLL) # 等待页面加载和列表稳定
+
+ # 清理列表页截图
+ if not KEEP_SCREENSHOTS:
+ if os.path.exists(screenshot_path):
+ os.remove(screenshot_path)
+ if os.path.exists(vl_img_path):
+ os.remove(vl_img_path)
+ if os.path.exists(json_path):
+ os.remove(json_path)
+
+ logger.info(f"爬取任务结束,正在等待 {len(background_tasks)} 个后台处理任务完成...")
+ if background_tasks:
+ await asyncio.gather(*background_tasks)
+ logger.info("所有后台任务已完成。")
+
+ logger.info(f"任务结束,共采集到 {len(all_stations)} 个场站。停止原因: {stop_reason}")
+ return all_stations
+
+def clean_images_dir():
+ """清理 Images 目录下除保留文件外的所有文件"""
+ base_dir = os.path.dirname(os.path.abspath(__file__))
+ images_dir = os.path.join(base_dir, "Images")
+
+ if not os.path.exists(images_dir):
+ return
+
+ keep_files = {'1.jpg', '2.jpg', '3.jpg', '4.jpg'}
+ logger.info(f"正在清理 Images 目录 (保留: {keep_files})...")
+
+ deleted_count = 0
+ for filename in os.listdir(images_dir):
+ if filename in keep_files:
+ continue
+
+ file_path = os.path.join(images_dir, filename)
+ try:
+ if os.path.isfile(file_path):
+ os.remove(file_path)
+ deleted_count += 1
+ except Exception as e:
+ logger.warning(f"删除文件失败 {filename}: {e}")
+
+ logger.info(f"清理完成,共删除 {deleted_count} 个文件。")
+
+async def clean_redis_data(redis_kit):
+ """清除 Redis 中的场站处理记录"""
+ if TEST_CLEAR_REDIS:
+ logger.info("测试模式开启:正在清除 Redis 中的场站处理记录 (processed_station:*)...")
+ keys = await redis_kit.keys("processed_station:*")
+ if keys:
+ count = await redis_kit.delete(*keys)
+ logger.info(f"已清除 {count} 条场站处理记录")
+ else:
+ logger.info("未发现旧的场站处理记录")
+
+async def main(service=None, do_cleanup=True):
+ # 连接设备
+ d = u2.connect()
+
+ # 初始化服务
+ should_close_service = False
+ if service is None:
+ service = XinDianTuService()
+ should_close_service = True
+ # 初始化数据库连接(XinDianTuService 需要)
+ await service.init_db()
+
+ uploader = ObsUploader()
+ redis_kit = RedisKit()
+
+ try:
+ if do_cleanup:
+ # 清理图片目录
+ clean_images_dir()
+
+ # [Testing] 如果配置为测试模式,启动时清除 Redis 记录
+ await clean_redis_data(redis_kit)
+
+ # 清理过期数据
+ # await service.cleanup_old_data()
+
+ # 获取场站列表
+ stations = await get_station_list(d, service, uploader, max_scrolls=MAX_SCROLLS)
+
+ if stations:
+ logger.info("场站列表采集完成。")
+ else:
+ logger.warning("未采集到任何场站信息。")
+
+ return True
+
+ except Exception as e:
+ logger.exception(f"运行过程中出现异常: {e}")
+ return False
+ finally:
+ # 关闭数据库连接
+ if should_close_service:
+ await service.close_db()
+
+if __name__ == "__main__":
+ try:
+ asyncio.run(main())
+ except KeyboardInterrupt:
+ logger.info("程序被用户中断.")
+ except Exception as e:
+ logger.exception(f"程序崩溃: {e}")
diff --git a/Apps/XinDianTu/GetCookie.py b/Apps/XinDianTu/GetCookie.py
new file mode 100644
index 0000000..9e67a81
--- /dev/null
+++ b/Apps/XinDianTu/GetCookie.py
@@ -0,0 +1,64 @@
+import os
+import sys
+import logging
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+# pip install selenium
+# 将项目根目录添加到系统路径,确保可以导入 Util 模块
+# 注意:PaChongGaoDeKit 位于 Util 目录下
+current_dir = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(os.path.join(current_dir, '..'))
+
+from Util.PaChongGaoDeKit import PaChongGaoDeKit
+
+def run_login_tool(force=False):
+ """
+ 运行高德地图 Cookie 获取工具。
+ :param force: 如果为 True,则跳过 'Cookie 已存在' 的询问,直接开始流程。
+ :return: Boolean, True 表示获取成功, False 表示失败或取消。
+ """
+ logger.info("正在启动高德地图 Cookie 获取工具,使用手机号18686619970+验证码登录即可!")
+
+ # 默认将 Cookie 保存到项目根目录下的 Json/amap_cookies.json
+ cookie_path = os.path.join(current_dir, '../Json/amap_cookies.json')
+
+ # 检查 Cookie 文件是否已存在
+ if os.path.exists(cookie_path) and not force:
+ logger.info(f"提示:检测到已存在 Cookie 文件: {os.path.abspath(cookie_path)}")
+ logger.info("如果您本地的 Cookie 文件没有过期且可以正常使用,则不需要重新生成。")
+
+ user_choice = input("是否仍要继续运行并重新获取 Cookie?(y/n): ").strip().lower()
+ if user_choice != 'y':
+ logger.info("用户取消操作,程序退出。")
+ return False
+
+ logger.info("\n" + "-"*60)
+ logger.info("即将开始获取 Cookie,请按照以下步骤操作:")
+ logger.info("1. 程序将自动打开一个 Chrome 浏览器窗口。")
+ logger.info("2. 请在该窗口中完成高德地图账号登录(扫码或账号密码)。")
+ logger.info("3. 登录成功后,保持页面处于控制台或个人中心状态。")
+ logger.info("4. 回到此终端窗口,按下回车键,程序将保存 Cookie 并自动关闭浏览器。")
+ logger.info("-"*60 + "\n")
+
+ # 初始化工具类,强制开启非无头模式(显示浏览器窗口)以便手动登录
+ # 确保 Json 目录存在
+ os.makedirs(os.path.dirname(cookie_path), exist_ok=True)
+
+ kit = PaChongGaoDeKit(headless=False, cookie_file=cookie_path)
+
+ try:
+ # 执行登录并保存流程
+ return kit.login_and_save_cookies()
+ except Exception as e:
+ logger.error(f"执行过程中发生意外错误: {e}")
+ return False
+ finally:
+ # 关闭浏览器资源
+ kit.close()
+ logger.info("工具运行结束。")
+
+if __name__ == "__main__":
+ run_login_tool()
diff --git a/Apps/XinDianTu/Images/.OKUU_flag_expand.jpg b/Apps/XinDianTu/Images/.OKUU_flag_expand.jpg
new file mode 100644
index 0000000..dbebdf9
Binary files /dev/null and b/Apps/XinDianTu/Images/.OKUU_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/000a46ca-21de-40fe-853b-7ab733e789dc.jpg b/Apps/XinDianTu/Images/000a46ca-21de-40fe-853b-7ab733e789dc.jpg
new file mode 100644
index 0000000..fa6f192
Binary files /dev/null and b/Apps/XinDianTu/Images/000a46ca-21de-40fe-853b-7ab733e789dc.jpg differ
diff --git a/Apps/XinDianTu/Images/00593070-d0f8-47b1-a5bc-274b2e41aed7.jpg b/Apps/XinDianTu/Images/00593070-d0f8-47b1-a5bc-274b2e41aed7.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/00593070-d0f8-47b1-a5bc-274b2e41aed7.jpg differ
diff --git a/Apps/XinDianTu/Images/007da665-7d1b-40dd-8d28-93d376270a8e.jpg b/Apps/XinDianTu/Images/007da665-7d1b-40dd-8d28-93d376270a8e.jpg
new file mode 100644
index 0000000..8a801cf
Binary files /dev/null and b/Apps/XinDianTu/Images/007da665-7d1b-40dd-8d28-93d376270a8e.jpg differ
diff --git a/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_1.jpg b/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_1.jpg
new file mode 100644
index 0000000..8641633
Binary files /dev/null and b/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_2.jpg b/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_2.jpg
new file mode 100644
index 0000000..8447b32
Binary files /dev/null and b/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_3.jpg b/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_3.jpg
new file mode 100644
index 0000000..be86ec3
Binary files /dev/null and b/Apps/XinDianTu/Images/008df3941d343f6e848811d4f61b18b4_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_1.jpg b/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_1.jpg
new file mode 100644
index 0000000..cb52507
Binary files /dev/null and b/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_2.jpg b/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_2.jpg
new file mode 100644
index 0000000..1949d24
Binary files /dev/null and b/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_3.jpg b/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_3.jpg
new file mode 100644
index 0000000..7542fa3
Binary files /dev/null and b/Apps/XinDianTu/Images/009322986cc21b2cc65982ec0e4742d2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef.jpg b/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef.jpg
new file mode 100644
index 0000000..5cee03d
Binary files /dev/null and b/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef.jpg differ
diff --git a/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef_flag.jpg b/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef_flag.jpg
new file mode 100644
index 0000000..f4ada23
Binary files /dev/null and b/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef_vl.jpg b/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef_vl.jpg
new file mode 100644
index 0000000..e54774e
Binary files /dev/null and b/Apps/XinDianTu/Images/00c3c976-07e8-4039-aa27-523fa00208ef_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/00cdb168-4bb4-4a9d-ae7c-98e324ccfb51.jpg b/Apps/XinDianTu/Images/00cdb168-4bb4-4a9d-ae7c-98e324ccfb51.jpg
new file mode 100644
index 0000000..ba99a9e
Binary files /dev/null and b/Apps/XinDianTu/Images/00cdb168-4bb4-4a9d-ae7c-98e324ccfb51.jpg differ
diff --git a/Apps/XinDianTu/Images/0177a88f-daf7-42d7-8b28-c9cbce8a76a6.jpg b/Apps/XinDianTu/Images/0177a88f-daf7-42d7-8b28-c9cbce8a76a6.jpg
new file mode 100644
index 0000000..bb7ea22
Binary files /dev/null and b/Apps/XinDianTu/Images/0177a88f-daf7-42d7-8b28-c9cbce8a76a6.jpg differ
diff --git a/Apps/XinDianTu/Images/020e54a4-3d68-4612-9a0b-1c9976e8ec50.jpg b/Apps/XinDianTu/Images/020e54a4-3d68-4612-9a0b-1c9976e8ec50.jpg
new file mode 100644
index 0000000..05614d4
Binary files /dev/null and b/Apps/XinDianTu/Images/020e54a4-3d68-4612-9a0b-1c9976e8ec50.jpg differ
diff --git a/Apps/XinDianTu/Images/02b78492-9d8a-4c47-a6ee-87def2890163.jpg b/Apps/XinDianTu/Images/02b78492-9d8a-4c47-a6ee-87def2890163.jpg
new file mode 100644
index 0000000..75b783d
Binary files /dev/null and b/Apps/XinDianTu/Images/02b78492-9d8a-4c47-a6ee-87def2890163.jpg differ
diff --git a/Apps/XinDianTu/Images/0313040f-efb2-467b-ab22-8798ce322ac3.jpg b/Apps/XinDianTu/Images/0313040f-efb2-467b-ab22-8798ce322ac3.jpg
new file mode 100644
index 0000000..4b06c90
Binary files /dev/null and b/Apps/XinDianTu/Images/0313040f-efb2-467b-ab22-8798ce322ac3.jpg differ
diff --git a/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6.jpg b/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6.jpg
new file mode 100644
index 0000000..64c7113
Binary files /dev/null and b/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6.jpg differ
diff --git a/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6_flag.jpg b/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6_flag.jpg
new file mode 100644
index 0000000..80c9d50
Binary files /dev/null and b/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6_vl.jpg b/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6_vl.jpg
new file mode 100644
index 0000000..c872db2
Binary files /dev/null and b/Apps/XinDianTu/Images/032ceeb4-1f23-402b-bb56-a5d3dba395e6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_1.jpg b/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_1.jpg
new file mode 100644
index 0000000..18d2630
Binary files /dev/null and b/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_2.jpg b/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_2.jpg
new file mode 100644
index 0000000..a3a6d44
Binary files /dev/null and b/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_3.jpg b/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_3.jpg
new file mode 100644
index 0000000..83d403c
Binary files /dev/null and b/Apps/XinDianTu/Images/03691cd6ea88646d7ee2f7320844f36b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/03ddecac-0f44-4ae9-80d1-fa6fb34cb1e9.jpg b/Apps/XinDianTu/Images/03ddecac-0f44-4ae9-80d1-fa6fb34cb1e9.jpg
new file mode 100644
index 0000000..7162a9f
Binary files /dev/null and b/Apps/XinDianTu/Images/03ddecac-0f44-4ae9-80d1-fa6fb34cb1e9.jpg differ
diff --git a/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14.jpg b/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14.jpg
new file mode 100644
index 0000000..c5c0161
Binary files /dev/null and b/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14.jpg differ
diff --git a/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14_flag.jpg b/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14_flag.jpg
new file mode 100644
index 0000000..a10349c
Binary files /dev/null and b/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14_vl.jpg b/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14_vl.jpg
new file mode 100644
index 0000000..7d4b559
Binary files /dev/null and b/Apps/XinDianTu/Images/0455a9de-6a2e-4e36-a287-8ad9d7b2cb14_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_1.jpg b/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_1.jpg
new file mode 100644
index 0000000..782047e
Binary files /dev/null and b/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_2.jpg b/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_2.jpg
new file mode 100644
index 0000000..0843b34
Binary files /dev/null and b/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_3.jpg b/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_3.jpg
new file mode 100644
index 0000000..95453b8
Binary files /dev/null and b/Apps/XinDianTu/Images/04584f4b077b02da8231de5219b3cea0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/046f1b02-291f-46be-80a3-e7c0a90b3fe3.jpg b/Apps/XinDianTu/Images/046f1b02-291f-46be-80a3-e7c0a90b3fe3.jpg
new file mode 100644
index 0000000..09202e8
Binary files /dev/null and b/Apps/XinDianTu/Images/046f1b02-291f-46be-80a3-e7c0a90b3fe3.jpg differ
diff --git a/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_1.jpg b/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_1.jpg
new file mode 100644
index 0000000..3b9a777
Binary files /dev/null and b/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_2.jpg b/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_2.jpg
new file mode 100644
index 0000000..1289b6a
Binary files /dev/null and b/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_3.jpg b/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_3.jpg
new file mode 100644
index 0000000..ccb61e9
Binary files /dev/null and b/Apps/XinDianTu/Images/048759d6c266651539d5a7d848eede57_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844.jpg b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844.jpg
new file mode 100644
index 0000000..2aeb11b
Binary files /dev/null and b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844.jpg differ
diff --git a/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844.json b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844.json
new file mode 100644
index 0000000..f609a9a
--- /dev/null
+++ b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844.json
@@ -0,0 +1,20 @@
+{
+ "image": "04b5e613-8e21-408b-ae93-b878a6126844.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 226,
+ 720,
+ 428
+ ],
+ "click_point": [
+ 124,
+ 266
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844_flag.jpg b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844_flag.jpg
new file mode 100644
index 0000000..949eb6b
Binary files /dev/null and b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844_vl.jpg b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844_vl.jpg
new file mode 100644
index 0000000..e4b4db2
Binary files /dev/null and b/Apps/XinDianTu/Images/04b5e613-8e21-408b-ae93-b878a6126844_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc.jpg b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc.jpg
new file mode 100644
index 0000000..aed3cda
Binary files /dev/null and b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc.jpg differ
diff --git a/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc.json b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc.json
new file mode 100644
index 0000000..8a22ae9
--- /dev/null
+++ b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc.json
@@ -0,0 +1,59 @@
+{
+ "image": "04fb17c6-124c-4661-9c50-ead044d94ebc.jpg",
+ "width": 720,
+ "height": 259,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 581
+ ],
+ "click_point": [
+ 121,
+ 439
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 595,
+ 700,
+ 844
+ ],
+ "click_point": [
+ 121,
+ 644
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 852,
+ 700,
+ 1101
+ ],
+ "click_point": [
+ 121,
+ 901
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1115,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1166
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc_flag.jpg b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc_flag.jpg
new file mode 100644
index 0000000..440f942
Binary files /dev/null and b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc_vl.jpg b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc_vl.jpg
new file mode 100644
index 0000000..03847c5
Binary files /dev/null and b/Apps/XinDianTu/Images/04fb17c6-124c-4661-9c50-ead044d94ebc_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/051ffe99-ba1e-4363-8ec4-e7e3133a8c4b.jpg b/Apps/XinDianTu/Images/051ffe99-ba1e-4363-8ec4-e7e3133a8c4b.jpg
new file mode 100644
index 0000000..c6c657b
Binary files /dev/null and b/Apps/XinDianTu/Images/051ffe99-ba1e-4363-8ec4-e7e3133a8c4b.jpg differ
diff --git a/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_1.jpg b/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_1.jpg
new file mode 100644
index 0000000..ed08442
Binary files /dev/null and b/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_2.jpg b/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_2.jpg
new file mode 100644
index 0000000..d525c48
Binary files /dev/null and b/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_3.jpg b/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_3.jpg
new file mode 100644
index 0000000..9f1c727
Binary files /dev/null and b/Apps/XinDianTu/Images/05233e7d863ef07ae8fc3bdbd77a70b2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_1.jpg b/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_1.jpg
new file mode 100644
index 0000000..e6ddbb4
Binary files /dev/null and b/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_2.jpg b/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_2.jpg
new file mode 100644
index 0000000..d810351
Binary files /dev/null and b/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_3.jpg b/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_3.jpg
new file mode 100644
index 0000000..8af26a8
Binary files /dev/null and b/Apps/XinDianTu/Images/058a66080f5f62810bc61df5edb88343_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/05915ddc-4f28-40a6-ae99-aa65fa382ef6.jpg b/Apps/XinDianTu/Images/05915ddc-4f28-40a6-ae99-aa65fa382ef6.jpg
new file mode 100644
index 0000000..d3bfae4
Binary files /dev/null and b/Apps/XinDianTu/Images/05915ddc-4f28-40a6-ae99-aa65fa382ef6.jpg differ
diff --git a/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb.jpg b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb.jpg
new file mode 100644
index 0000000..3620df7
Binary files /dev/null and b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb.jpg differ
diff --git a/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb.json b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb.json
new file mode 100644
index 0000000..9bb897b
--- /dev/null
+++ b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb.json
@@ -0,0 +1,46 @@
+{
+ "image": "05af72de-43b4-445f-9435-935bf4a3f9fb.jpg",
+ "width": 720,
+ "height": 140,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 428,
+ 700,
+ 677
+ ],
+ "click_point": [
+ 121,
+ 477
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 690,
+ 700,
+ 965
+ ],
+ "click_point": [
+ 121,
+ 745
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 979,
+ 700,
+ 1228
+ ],
+ "click_point": [
+ 121,
+ 1028
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb_flag.jpg b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb_flag.jpg
new file mode 100644
index 0000000..7f58f04
Binary files /dev/null and b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb_vl.jpg b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb_vl.jpg
new file mode 100644
index 0000000..9a9e383
Binary files /dev/null and b/Apps/XinDianTu/Images/05af72de-43b4-445f-9435-935bf4a3f9fb_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/05eaf8a3-8236-4b9e-bee1-3115217f49d5.jpg b/Apps/XinDianTu/Images/05eaf8a3-8236-4b9e-bee1-3115217f49d5.jpg
new file mode 100644
index 0000000..2ef5250
Binary files /dev/null and b/Apps/XinDianTu/Images/05eaf8a3-8236-4b9e-bee1-3115217f49d5.jpg differ
diff --git a/Apps/XinDianTu/Images/05ff2b26-72c7-4014-8657-d63c47c2d47f.jpg b/Apps/XinDianTu/Images/05ff2b26-72c7-4014-8657-d63c47c2d47f.jpg
new file mode 100644
index 0000000..0529894
Binary files /dev/null and b/Apps/XinDianTu/Images/05ff2b26-72c7-4014-8657-d63c47c2d47f.jpg differ
diff --git a/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed.jpg b/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed.jpg
new file mode 100644
index 0000000..b26ff47
Binary files /dev/null and b/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed.jpg differ
diff --git a/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed_flag.jpg b/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed_flag.jpg
new file mode 100644
index 0000000..b7f22b9
Binary files /dev/null and b/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed_vl.jpg b/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed_vl.jpg
new file mode 100644
index 0000000..a2bc820
Binary files /dev/null and b/Apps/XinDianTu/Images/06091644-a1fc-480e-a2fd-7c6565a8aaed_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_1.jpg b/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_1.jpg
new file mode 100644
index 0000000..6a4b680
Binary files /dev/null and b/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_2.jpg b/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_2.jpg
new file mode 100644
index 0000000..99f4875
Binary files /dev/null and b/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_3.jpg b/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_3.jpg
new file mode 100644
index 0000000..271baa2
Binary files /dev/null and b/Apps/XinDianTu/Images/06717523240dc3e8dad859ff6101434c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556.jpg b/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556.jpg
new file mode 100644
index 0000000..d3534d9
Binary files /dev/null and b/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556.jpg differ
diff --git a/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556_flag.jpg b/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556_flag.jpg
new file mode 100644
index 0000000..f1bf085
Binary files /dev/null and b/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556_vl.jpg b/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556_vl.jpg
new file mode 100644
index 0000000..bd3a94d
Binary files /dev/null and b/Apps/XinDianTu/Images/06757ffa-6f6f-4706-884a-d3d255474556_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/06bf220a-f218-423f-88cf-44ad06545a99.jpg b/Apps/XinDianTu/Images/06bf220a-f218-423f-88cf-44ad06545a99.jpg
new file mode 100644
index 0000000..ba03456
Binary files /dev/null and b/Apps/XinDianTu/Images/06bf220a-f218-423f-88cf-44ad06545a99.jpg differ
diff --git a/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e.jpg b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e.jpg
new file mode 100644
index 0000000..b441f37
Binary files /dev/null and b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e.jpg differ
diff --git a/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e.json b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e.json
new file mode 100644
index 0000000..67d8918
--- /dev/null
+++ b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e.json
@@ -0,0 +1,46 @@
+{
+ "image": "06ec294c-ce75-4a42-9c15-caaa2d57e60e.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 491,
+ 700,
+ 740
+ ],
+ "click_point": [
+ 121,
+ 540
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 997
+ ],
+ "click_point": [
+ 121,
+ 797
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1011,
+ 700,
+ 1260
+ ],
+ "click_point": [
+ 121,
+ 1060
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e_flag.jpg b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e_flag.jpg
new file mode 100644
index 0000000..a10474e
Binary files /dev/null and b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e_vl.jpg b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e_vl.jpg
new file mode 100644
index 0000000..e43771e
Binary files /dev/null and b/Apps/XinDianTu/Images/06ec294c-ce75-4a42-9c15-caaa2d57e60e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06.jpg b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06.jpg
new file mode 100644
index 0000000..2f8dd90
Binary files /dev/null and b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06.jpg differ
diff --git a/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06.json b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06.json
new file mode 100644
index 0000000..384bb54
--- /dev/null
+++ b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06.json
@@ -0,0 +1,46 @@
+{
+ "image": "07237cb5-4f55-4e7f-8ae6-3a927d046e06.jpg",
+ "width": 720,
+ "height": 243,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 514,
+ 700,
+ 789
+ ],
+ "click_point": [
+ 121,
+ 569
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 802,
+ 700,
+ 1117
+ ],
+ "click_point": [
+ 121,
+ 865
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1131,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1179
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06_flag.jpg b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06_flag.jpg
new file mode 100644
index 0000000..ee71ced
Binary files /dev/null and b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06_vl.jpg b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06_vl.jpg
new file mode 100644
index 0000000..a5524b7
Binary files /dev/null and b/Apps/XinDianTu/Images/07237cb5-4f55-4e7f-8ae6-3a927d046e06_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52.jpg b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52.jpg
new file mode 100644
index 0000000..ed66bf9
Binary files /dev/null and b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52.jpg differ
diff --git a/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52.json b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52.json
new file mode 100644
index 0000000..e523a27
--- /dev/null
+++ b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52.json
@@ -0,0 +1,46 @@
+{
+ "image": "0724d0ef-941c-4d3c-a911-4b3e84343e52.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 515,
+ 700,
+ 764
+ ],
+ "click_point": [
+ 121,
+ 564
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 772,
+ 700,
+ 1021
+ ],
+ "click_point": [
+ 121,
+ 821
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1035,
+ 700,
+ 1284
+ ],
+ "click_point": [
+ 121,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52_flag.jpg b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52_flag.jpg
new file mode 100644
index 0000000..d416c0f
Binary files /dev/null and b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52_vl.jpg b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52_vl.jpg
new file mode 100644
index 0000000..18a9e8b
Binary files /dev/null and b/Apps/XinDianTu/Images/0724d0ef-941c-4d3c-a911-4b3e84343e52_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45.jpg b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45.jpg
new file mode 100644
index 0000000..df09105
Binary files /dev/null and b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45.jpg differ
diff --git a/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45.json b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45.json
new file mode 100644
index 0000000..d63a424
--- /dev/null
+++ b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45.json
@@ -0,0 +1,20 @@
+{
+ "image": "072e1a31-67c9-427e-9979-67118ea0df45.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 170,
+ 720,
+ 372
+ ],
+ "click_point": [
+ 124,
+ 210
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45_flag.jpg b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45_flag.jpg
new file mode 100644
index 0000000..674374b
Binary files /dev/null and b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45_vl.jpg b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45_vl.jpg
new file mode 100644
index 0000000..3716a82
Binary files /dev/null and b/Apps/XinDianTu/Images/072e1a31-67c9-427e-9979-67118ea0df45_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0770ecef-1903-4684-9dac-a3fb01ee1d80.jpg b/Apps/XinDianTu/Images/0770ecef-1903-4684-9dac-a3fb01ee1d80.jpg
new file mode 100644
index 0000000..b2100d0
Binary files /dev/null and b/Apps/XinDianTu/Images/0770ecef-1903-4684-9dac-a3fb01ee1d80.jpg differ
diff --git a/Apps/XinDianTu/Images/0775d83c-8912-4fa0-9c07-d2ff5a577081.jpg b/Apps/XinDianTu/Images/0775d83c-8912-4fa0-9c07-d2ff5a577081.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/0775d83c-8912-4fa0-9c07-d2ff5a577081.jpg differ
diff --git a/Apps/XinDianTu/Images/07aa2084-03b9-4777-aac4-a89e18ca25f5.jpg b/Apps/XinDianTu/Images/07aa2084-03b9-4777-aac4-a89e18ca25f5.jpg
new file mode 100644
index 0000000..4867acb
Binary files /dev/null and b/Apps/XinDianTu/Images/07aa2084-03b9-4777-aac4-a89e18ca25f5.jpg differ
diff --git a/Apps/XinDianTu/Images/07afb5d0-c7a4-4bc5-ab3b-7c4421f204a9.jpg b/Apps/XinDianTu/Images/07afb5d0-c7a4-4bc5-ab3b-7c4421f204a9.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/07afb5d0-c7a4-4bc5-ab3b-7c4421f204a9.jpg differ
diff --git a/Apps/XinDianTu/Images/07e1c7a0-24a3-4581-842e-b450de6cd5e4.jpg b/Apps/XinDianTu/Images/07e1c7a0-24a3-4581-842e-b450de6cd5e4.jpg
new file mode 100644
index 0000000..41598a5
Binary files /dev/null and b/Apps/XinDianTu/Images/07e1c7a0-24a3-4581-842e-b450de6cd5e4.jpg differ
diff --git a/Apps/XinDianTu/Images/082fc1ff-85e3-4017-a3ec-c47cc4ea5359.jpg b/Apps/XinDianTu/Images/082fc1ff-85e3-4017-a3ec-c47cc4ea5359.jpg
new file mode 100644
index 0000000..10f8498
Binary files /dev/null and b/Apps/XinDianTu/Images/082fc1ff-85e3-4017-a3ec-c47cc4ea5359.jpg differ
diff --git a/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_1.jpg b/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_1.jpg
new file mode 100644
index 0000000..74480ba
Binary files /dev/null and b/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_2.jpg b/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_2.jpg
new file mode 100644
index 0000000..cead87c
Binary files /dev/null and b/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_3.jpg b/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_3.jpg
new file mode 100644
index 0000000..de6e100
Binary files /dev/null and b/Apps/XinDianTu/Images/0833fa0b08b5cc569d1416c9f656fa84_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/0843ec15-d861-4abc-87fe-d8cd4bbf218f.jpg b/Apps/XinDianTu/Images/0843ec15-d861-4abc-87fe-d8cd4bbf218f.jpg
new file mode 100644
index 0000000..2ad26f4
Binary files /dev/null and b/Apps/XinDianTu/Images/0843ec15-d861-4abc-87fe-d8cd4bbf218f.jpg differ
diff --git a/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_1.jpg b/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_1.jpg
new file mode 100644
index 0000000..c632488
Binary files /dev/null and b/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_2.jpg b/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_2.jpg
new file mode 100644
index 0000000..66b9912
Binary files /dev/null and b/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_3.jpg b/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_3.jpg
new file mode 100644
index 0000000..21ed55f
Binary files /dev/null and b/Apps/XinDianTu/Images/085453222c05d3aa8bbaa295940c5aff_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/0876054b-01a4-483b-946d-bf63cf1dc320.jpg b/Apps/XinDianTu/Images/0876054b-01a4-483b-946d-bf63cf1dc320.jpg
new file mode 100644
index 0000000..5fdafc8
Binary files /dev/null and b/Apps/XinDianTu/Images/0876054b-01a4-483b-946d-bf63cf1dc320.jpg differ
diff --git a/Apps/XinDianTu/Images/0884d0c8-56b5-4dbf-bcd4-85eda9fd895f.jpg b/Apps/XinDianTu/Images/0884d0c8-56b5-4dbf-bcd4-85eda9fd895f.jpg
new file mode 100644
index 0000000..8c78c19
Binary files /dev/null and b/Apps/XinDianTu/Images/0884d0c8-56b5-4dbf-bcd4-85eda9fd895f.jpg differ
diff --git a/Apps/XinDianTu/Images/08a7a15e-b116-4f34-872b-3656251da8ed.jpg b/Apps/XinDianTu/Images/08a7a15e-b116-4f34-872b-3656251da8ed.jpg
new file mode 100644
index 0000000..390b5fa
Binary files /dev/null and b/Apps/XinDianTu/Images/08a7a15e-b116-4f34-872b-3656251da8ed.jpg differ
diff --git a/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3.jpg b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3.jpg
new file mode 100644
index 0000000..ab5343b
Binary files /dev/null and b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3.jpg differ
diff --git a/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3.json b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3.json
new file mode 100644
index 0000000..2b17fc6
--- /dev/null
+++ b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3.json
@@ -0,0 +1,59 @@
+{
+ "image": "08ab4e30-0758-4b32-b101-9d3a408308e3.jpg",
+ "width": 720,
+ "height": 162,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 612
+ ],
+ "click_point": [
+ 121,
+ 445
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 625,
+ 700,
+ 871
+ ],
+ "click_point": [
+ 121,
+ 674
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 884,
+ 700,
+ 1199
+ ],
+ "click_point": [
+ 121,
+ 947
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1212,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1244
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3_flag.jpg b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3_flag.jpg
new file mode 100644
index 0000000..12cb663
Binary files /dev/null and b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3_vl.jpg b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3_vl.jpg
new file mode 100644
index 0000000..d6971c4
Binary files /dev/null and b/Apps/XinDianTu/Images/08ab4e30-0758-4b32-b101-9d3a408308e3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/09bbd08e-cafe-48da-8ac2-ec4808795fce.jpg b/Apps/XinDianTu/Images/09bbd08e-cafe-48da-8ac2-ec4808795fce.jpg
new file mode 100644
index 0000000..be87543
Binary files /dev/null and b/Apps/XinDianTu/Images/09bbd08e-cafe-48da-8ac2-ec4808795fce.jpg differ
diff --git a/Apps/XinDianTu/Images/0a0acaf4-101d-4765-b222-a8176f5588ee.jpg b/Apps/XinDianTu/Images/0a0acaf4-101d-4765-b222-a8176f5588ee.jpg
new file mode 100644
index 0000000..db226a8
Binary files /dev/null and b/Apps/XinDianTu/Images/0a0acaf4-101d-4765-b222-a8176f5588ee.jpg differ
diff --git a/Apps/XinDianTu/Images/0a14e0af-2b26-4595-9b94-6cfe02fbc442.jpg b/Apps/XinDianTu/Images/0a14e0af-2b26-4595-9b94-6cfe02fbc442.jpg
new file mode 100644
index 0000000..2689abc
Binary files /dev/null and b/Apps/XinDianTu/Images/0a14e0af-2b26-4595-9b94-6cfe02fbc442.jpg differ
diff --git a/Apps/XinDianTu/Images/0a5311ec-3051-4949-ab58-b2dcd4d42924.jpg b/Apps/XinDianTu/Images/0a5311ec-3051-4949-ab58-b2dcd4d42924.jpg
new file mode 100644
index 0000000..2289221
Binary files /dev/null and b/Apps/XinDianTu/Images/0a5311ec-3051-4949-ab58-b2dcd4d42924.jpg differ
diff --git a/Apps/XinDianTu/Images/0a620483-2ebc-4a9b-8fad-6d0c64d471df.jpg b/Apps/XinDianTu/Images/0a620483-2ebc-4a9b-8fad-6d0c64d471df.jpg
new file mode 100644
index 0000000..b1f4054
Binary files /dev/null and b/Apps/XinDianTu/Images/0a620483-2ebc-4a9b-8fad-6d0c64d471df.jpg differ
diff --git a/Apps/XinDianTu/Images/0ab47780-46ed-42fd-af27-937afa48f7f8.jpg b/Apps/XinDianTu/Images/0ab47780-46ed-42fd-af27-937afa48f7f8.jpg
new file mode 100644
index 0000000..df98f49
Binary files /dev/null and b/Apps/XinDianTu/Images/0ab47780-46ed-42fd-af27-937afa48f7f8.jpg differ
diff --git a/Apps/XinDianTu/Images/0b478652-986f-4fcc-8d6b-d9334246d920.jpg b/Apps/XinDianTu/Images/0b478652-986f-4fcc-8d6b-d9334246d920.jpg
new file mode 100644
index 0000000..bde9559
Binary files /dev/null and b/Apps/XinDianTu/Images/0b478652-986f-4fcc-8d6b-d9334246d920.jpg differ
diff --git a/Apps/XinDianTu/Images/0b7df473-aa76-4b44-bb11-cea4518346af.jpg b/Apps/XinDianTu/Images/0b7df473-aa76-4b44-bb11-cea4518346af.jpg
new file mode 100644
index 0000000..2100572
Binary files /dev/null and b/Apps/XinDianTu/Images/0b7df473-aa76-4b44-bb11-cea4518346af.jpg differ
diff --git a/Apps/XinDianTu/Images/0b93c421-fdef-418b-8d37-79796db52ee3.jpg b/Apps/XinDianTu/Images/0b93c421-fdef-418b-8d37-79796db52ee3.jpg
new file mode 100644
index 0000000..d3e1039
Binary files /dev/null and b/Apps/XinDianTu/Images/0b93c421-fdef-418b-8d37-79796db52ee3.jpg differ
diff --git a/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23.jpg b/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23.jpg
new file mode 100644
index 0000000..d59743d
Binary files /dev/null and b/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23.jpg differ
diff --git a/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23_flag.jpg b/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23_flag.jpg
new file mode 100644
index 0000000..35f299c
Binary files /dev/null and b/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23_vl.jpg b/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23_vl.jpg
new file mode 100644
index 0000000..13a1e86
Binary files /dev/null and b/Apps/XinDianTu/Images/0c2dab60-017f-4cb5-a046-6fdcf3569b23_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_1.jpg b/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_1.jpg
new file mode 100644
index 0000000..6ded888
Binary files /dev/null and b/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_2.jpg b/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_2.jpg
new file mode 100644
index 0000000..f55df14
Binary files /dev/null and b/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_3.jpg b/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_3.jpg
new file mode 100644
index 0000000..ac5212d
Binary files /dev/null and b/Apps/XinDianTu/Images/0c4795df818e465f846e919f181d2f95_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362.jpg b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362.jpg
new file mode 100644
index 0000000..c7a9b27
Binary files /dev/null and b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362.jpg differ
diff --git a/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362.json b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362.json
new file mode 100644
index 0000000..7c6ca01
--- /dev/null
+++ b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362.json
@@ -0,0 +1,46 @@
+{
+ "image": "0ccc94f1-ef6c-4bc5-932d-c7158d828362.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 489,
+ 700,
+ 740
+ ],
+ "click_point": [
+ 121,
+ 539
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 754,
+ 700,
+ 1000
+ ],
+ "click_point": [
+ 121,
+ 803
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1009,
+ 700,
+ 1260
+ ],
+ "click_point": [
+ 121,
+ 1059
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362_flag.jpg b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362_flag.jpg
new file mode 100644
index 0000000..75d26ac
Binary files /dev/null and b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362_vl.jpg b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362_vl.jpg
new file mode 100644
index 0000000..0b72850
Binary files /dev/null and b/Apps/XinDianTu/Images/0ccc94f1-ef6c-4bc5-932d-c7158d828362_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c.jpg b/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c.jpg
new file mode 100644
index 0000000..5cd4340
Binary files /dev/null and b/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c.jpg differ
diff --git a/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c_flag.jpg b/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c_flag.jpg
new file mode 100644
index 0000000..aa092aa
Binary files /dev/null and b/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c_vl.jpg b/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c_vl.jpg
new file mode 100644
index 0000000..ec7c899
Binary files /dev/null and b/Apps/XinDianTu/Images/0d49288d-830f-4f43-8ce9-74c6c0543a9c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0d631c9c-1e16-444d-a575-af033ba88f69.jpg b/Apps/XinDianTu/Images/0d631c9c-1e16-444d-a575-af033ba88f69.jpg
new file mode 100644
index 0000000..67f0025
Binary files /dev/null and b/Apps/XinDianTu/Images/0d631c9c-1e16-444d-a575-af033ba88f69.jpg differ
diff --git a/Apps/XinDianTu/Images/0da5854a-c01f-43e2-bd12-1235a87cac71.jpg b/Apps/XinDianTu/Images/0da5854a-c01f-43e2-bd12-1235a87cac71.jpg
new file mode 100644
index 0000000..db140bb
Binary files /dev/null and b/Apps/XinDianTu/Images/0da5854a-c01f-43e2-bd12-1235a87cac71.jpg differ
diff --git a/Apps/XinDianTu/Images/0da58656-73fd-4e6d-82d5-d8dfbfb07bea.jpg b/Apps/XinDianTu/Images/0da58656-73fd-4e6d-82d5-d8dfbfb07bea.jpg
new file mode 100644
index 0000000..bb2c845
Binary files /dev/null and b/Apps/XinDianTu/Images/0da58656-73fd-4e6d-82d5-d8dfbfb07bea.jpg differ
diff --git a/Apps/XinDianTu/Images/0dc1e4a6-4825-4776-8a65-507595d973fc.jpg b/Apps/XinDianTu/Images/0dc1e4a6-4825-4776-8a65-507595d973fc.jpg
new file mode 100644
index 0000000..588b0a1
Binary files /dev/null and b/Apps/XinDianTu/Images/0dc1e4a6-4825-4776-8a65-507595d973fc.jpg differ
diff --git a/Apps/XinDianTu/Images/0dd664bf-998c-4559-bd79-6349ffdad5d2.jpg b/Apps/XinDianTu/Images/0dd664bf-998c-4559-bd79-6349ffdad5d2.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/0dd664bf-998c-4559-bd79-6349ffdad5d2.jpg differ
diff --git a/Apps/XinDianTu/Images/0de0be35-f520-434a-889c-91e81048452c.jpg b/Apps/XinDianTu/Images/0de0be35-f520-434a-889c-91e81048452c.jpg
new file mode 100644
index 0000000..173aff6
Binary files /dev/null and b/Apps/XinDianTu/Images/0de0be35-f520-434a-889c-91e81048452c.jpg differ
diff --git a/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0.jpg b/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0.jpg
new file mode 100644
index 0000000..ad3d201
Binary files /dev/null and b/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0.jpg differ
diff --git a/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0_flag.jpg b/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0_flag.jpg
new file mode 100644
index 0000000..d972a8e
Binary files /dev/null and b/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0_vl.jpg b/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0_vl.jpg
new file mode 100644
index 0000000..fd0c874
Binary files /dev/null and b/Apps/XinDianTu/Images/0e429da1-f362-4225-be6c-b219b53ea9c0_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0e5fcc12-1477-4492-a0b5-e7f92dc5d43b.jpg b/Apps/XinDianTu/Images/0e5fcc12-1477-4492-a0b5-e7f92dc5d43b.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/0e5fcc12-1477-4492-a0b5-e7f92dc5d43b.jpg differ
diff --git a/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400.jpg b/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400.jpg
new file mode 100644
index 0000000..05eb257
Binary files /dev/null and b/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400.jpg differ
diff --git a/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400_flag.jpg b/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400_flag.jpg
new file mode 100644
index 0000000..ce89e43
Binary files /dev/null and b/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400_vl.jpg b/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400_vl.jpg
new file mode 100644
index 0000000..7700ad5
Binary files /dev/null and b/Apps/XinDianTu/Images/0e78b587-4e6f-49f0-84e2-9c854d217400_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_1.jpg b/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_1.jpg
new file mode 100644
index 0000000..34e914c
Binary files /dev/null and b/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_2.jpg b/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_2.jpg
new file mode 100644
index 0000000..9bd266c
Binary files /dev/null and b/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_3.jpg b/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_3.jpg
new file mode 100644
index 0000000..9201bf7
Binary files /dev/null and b/Apps/XinDianTu/Images/0e90394b07744d490c13f89b78f6dba0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/0ee63453-6749-4b73-97d8-da17017f0e0e.jpg b/Apps/XinDianTu/Images/0ee63453-6749-4b73-97d8-da17017f0e0e.jpg
new file mode 100644
index 0000000..f587eee
Binary files /dev/null and b/Apps/XinDianTu/Images/0ee63453-6749-4b73-97d8-da17017f0e0e.jpg differ
diff --git a/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c.jpg b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c.jpg
new file mode 100644
index 0000000..e947525
Binary files /dev/null and b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c.jpg differ
diff --git a/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c.json b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c.json
new file mode 100644
index 0000000..f3ab092
--- /dev/null
+++ b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c.json
@@ -0,0 +1,46 @@
+{
+ "image": "0f39b0af-3ce1-42c8-a060-6a6037fd318c.jpg",
+ "width": 720,
+ "height": 275,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 467,
+ 700,
+ 716
+ ],
+ "click_point": [
+ 121,
+ 516
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 724,
+ 700,
+ 973
+ ],
+ "click_point": [
+ 121,
+ 773
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 986,
+ 700,
+ 1261
+ ],
+ "click_point": [
+ 121,
+ 1041
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c_flag.jpg b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c_flag.jpg
new file mode 100644
index 0000000..f5700a2
Binary files /dev/null and b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c_vl.jpg b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c_vl.jpg
new file mode 100644
index 0000000..87a59fb
Binary files /dev/null and b/Apps/XinDianTu/Images/0f39b0af-3ce1-42c8-a060-6a6037fd318c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_1.jpg b/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_1.jpg
new file mode 100644
index 0000000..e1f691f
Binary files /dev/null and b/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_2.jpg b/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_2.jpg
new file mode 100644
index 0000000..e24a5b5
Binary files /dev/null and b/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_3.jpg b/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_3.jpg
new file mode 100644
index 0000000..edb83e6
Binary files /dev/null and b/Apps/XinDianTu/Images/0f5876b9e2336e16780663d94fd75f68_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9.jpg b/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9.jpg
new file mode 100644
index 0000000..ce81d78
Binary files /dev/null and b/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9.jpg differ
diff --git a/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9_flag.jpg b/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9_flag.jpg
new file mode 100644
index 0000000..3a87e8a
Binary files /dev/null and b/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9_vl.jpg b/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9_vl.jpg
new file mode 100644
index 0000000..8115962
Binary files /dev/null and b/Apps/XinDianTu/Images/0f860345-7a56-4bbe-9e6c-215a80b5c3d9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac.jpg b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac.jpg
new file mode 100644
index 0000000..2e54cb8
Binary files /dev/null and b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac.jpg differ
diff --git a/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac.json b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac.json
new file mode 100644
index 0000000..0ed6e7a
--- /dev/null
+++ b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac.json
@@ -0,0 +1,46 @@
+{
+ "image": "0fb4025f-444d-4197-865c-82698cfbb5ac.jpg",
+ "width": 720,
+ "height": 274,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 481,
+ 700,
+ 732
+ ],
+ "click_point": [
+ 121,
+ 531
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 746,
+ 700,
+ 992
+ ],
+ "click_point": [
+ 121,
+ 795
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1006,
+ 700,
+ 1280
+ ],
+ "click_point": [
+ 121,
+ 1060
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac_flag.jpg b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac_flag.jpg
new file mode 100644
index 0000000..a6f6d18
Binary files /dev/null and b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac_vl.jpg b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac_vl.jpg
new file mode 100644
index 0000000..7dab539
Binary files /dev/null and b/Apps/XinDianTu/Images/0fb4025f-444d-4197-865c-82698cfbb5ac_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/0fc04f82-4d2d-4237-a7c4-95507186d4a1.jpg b/Apps/XinDianTu/Images/0fc04f82-4d2d-4237-a7c4-95507186d4a1.jpg
new file mode 100644
index 0000000..a8ab690
Binary files /dev/null and b/Apps/XinDianTu/Images/0fc04f82-4d2d-4237-a7c4-95507186d4a1.jpg differ
diff --git a/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_1.jpg b/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_1.jpg
new file mode 100644
index 0000000..f0f311f
Binary files /dev/null and b/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_2.jpg b/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_2.jpg
new file mode 100644
index 0000000..8285d0c
Binary files /dev/null and b/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_3.jpg b/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_3.jpg
new file mode 100644
index 0000000..d0b8ea6
Binary files /dev/null and b/Apps/XinDianTu/Images/0fc65107e57a93a5c0d852f6e8265bc0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/0fd0dd67-239c-4ad8-b86a-1fa8176b8e20.jpg b/Apps/XinDianTu/Images/0fd0dd67-239c-4ad8-b86a-1fa8176b8e20.jpg
new file mode 100644
index 0000000..b1dbb3f
Binary files /dev/null and b/Apps/XinDianTu/Images/0fd0dd67-239c-4ad8-b86a-1fa8176b8e20.jpg differ
diff --git a/Apps/XinDianTu/Images/0fe1fa87-e01e-41f5-a64f-7d2f5b4fd11f.jpg b/Apps/XinDianTu/Images/0fe1fa87-e01e-41f5-a64f-7d2f5b4fd11f.jpg
new file mode 100644
index 0000000..3277dcf
Binary files /dev/null and b/Apps/XinDianTu/Images/0fe1fa87-e01e-41f5-a64f-7d2f5b4fd11f.jpg differ
diff --git a/Apps/XinDianTu/Images/0fe41967-2df0-4217-8e84-53ca5f3ed598.jpg b/Apps/XinDianTu/Images/0fe41967-2df0-4217-8e84-53ca5f3ed598.jpg
new file mode 100644
index 0000000..c84209a
Binary files /dev/null and b/Apps/XinDianTu/Images/0fe41967-2df0-4217-8e84-53ca5f3ed598.jpg differ
diff --git a/Apps/XinDianTu/Images/1.0768_flag_expand.jpg b/Apps/XinDianTu/Images/1.0768_flag_expand.jpg
new file mode 100644
index 0000000..d989438
Binary files /dev/null and b/Apps/XinDianTu/Images/1.0768_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/103便民充电站_flag_expand.jpg b/Apps/XinDianTu/Images/103便民充电站_flag_expand.jpg
new file mode 100644
index 0000000..2fe1050
Binary files /dev/null and b/Apps/XinDianTu/Images/103便民充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/105f3cf5-601b-4dfd-8496-86df4feb38c8.jpg b/Apps/XinDianTu/Images/105f3cf5-601b-4dfd-8496-86df4feb38c8.jpg
new file mode 100644
index 0000000..7a721fb
Binary files /dev/null and b/Apps/XinDianTu/Images/105f3cf5-601b-4dfd-8496-86df4feb38c8.jpg differ
diff --git a/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6.jpg b/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6.jpg
new file mode 100644
index 0000000..812392c
Binary files /dev/null and b/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6.jpg differ
diff --git a/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6_flag.jpg b/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6_flag.jpg
new file mode 100644
index 0000000..750cf8c
Binary files /dev/null and b/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6_vl.jpg b/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6_vl.jpg
new file mode 100644
index 0000000..8b9dc9a
Binary files /dev/null and b/Apps/XinDianTu/Images/107df946-d2b5-4754-8aae-b35f36c6dfb6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_1.jpg b/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_1.jpg
new file mode 100644
index 0000000..2e5d797
Binary files /dev/null and b/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_2.jpg b/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_2.jpg
new file mode 100644
index 0000000..e89a1d1
Binary files /dev/null and b/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_3.jpg b/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_3.jpg
new file mode 100644
index 0000000..6a8a6a8
Binary files /dev/null and b/Apps/XinDianTu/Images/10922eedd7d94c6fd52c5501e1eeae44_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_1.jpg b/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_1.jpg
new file mode 100644
index 0000000..ebac5f8
Binary files /dev/null and b/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_2.jpg b/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_2.jpg
new file mode 100644
index 0000000..030432b
Binary files /dev/null and b/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_3.jpg b/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_3.jpg
new file mode 100644
index 0000000..62408ea
Binary files /dev/null and b/Apps/XinDianTu/Images/10df39e58400c3a51efa88e8ca3839a5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/10e39149-db4a-4c4f-8d7e-2997f20ea4fa.jpg b/Apps/XinDianTu/Images/10e39149-db4a-4c4f-8d7e-2997f20ea4fa.jpg
new file mode 100644
index 0000000..7c48ffb
Binary files /dev/null and b/Apps/XinDianTu/Images/10e39149-db4a-4c4f-8d7e-2997f20ea4fa.jpg differ
diff --git a/Apps/XinDianTu/Images/1150402a-91ea-4028-be4a-c5f2f0aa4bc4.jpg b/Apps/XinDianTu/Images/1150402a-91ea-4028-be4a-c5f2f0aa4bc4.jpg
new file mode 100644
index 0000000..cadfafb
Binary files /dev/null and b/Apps/XinDianTu/Images/1150402a-91ea-4028-be4a-c5f2f0aa4bc4.jpg differ
diff --git a/Apps/XinDianTu/Images/117c8f78-da76-4596-bb9f-ec3a57dadd76.jpg b/Apps/XinDianTu/Images/117c8f78-da76-4596-bb9f-ec3a57dadd76.jpg
new file mode 100644
index 0000000..4bce638
Binary files /dev/null and b/Apps/XinDianTu/Images/117c8f78-da76-4596-bb9f-ec3a57dadd76.jpg differ
diff --git a/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_1.jpg b/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_1.jpg
new file mode 100644
index 0000000..0826089
Binary files /dev/null and b/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_2.jpg b/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_2.jpg
new file mode 100644
index 0000000..cd6451a
Binary files /dev/null and b/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_3.jpg b/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_3.jpg
new file mode 100644
index 0000000..e121887
Binary files /dev/null and b/Apps/XinDianTu/Images/11a032146324bcce219948ed1f3a9116_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/11d64b2c-e96d-45eb-994f-624525ced6ce.jpg b/Apps/XinDianTu/Images/11d64b2c-e96d-45eb-994f-624525ced6ce.jpg
new file mode 100644
index 0000000..31f732e
Binary files /dev/null and b/Apps/XinDianTu/Images/11d64b2c-e96d-45eb-994f-624525ced6ce.jpg differ
diff --git a/Apps/XinDianTu/Images/12229aa2-dbd3-4974-a43f-bda126236a25.jpg b/Apps/XinDianTu/Images/12229aa2-dbd3-4974-a43f-bda126236a25.jpg
new file mode 100644
index 0000000..fc61f29
Binary files /dev/null and b/Apps/XinDianTu/Images/12229aa2-dbd3-4974-a43f-bda126236a25.jpg differ
diff --git a/Apps/XinDianTu/Images/122b29ee-b1fe-4220-abb6-235d84cbd858.jpg b/Apps/XinDianTu/Images/122b29ee-b1fe-4220-abb6-235d84cbd858.jpg
new file mode 100644
index 0000000..f125954
Binary files /dev/null and b/Apps/XinDianTu/Images/122b29ee-b1fe-4220-abb6-235d84cbd858.jpg differ
diff --git a/Apps/XinDianTu/Images/12e3dfc2-d0dc-4022-95a7-9f993ec4ca84.jpg b/Apps/XinDianTu/Images/12e3dfc2-d0dc-4022-95a7-9f993ec4ca84.jpg
new file mode 100644
index 0000000..c49093e
Binary files /dev/null and b/Apps/XinDianTu/Images/12e3dfc2-d0dc-4022-95a7-9f993ec4ca84.jpg differ
diff --git a/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4.jpg b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4.jpg
new file mode 100644
index 0000000..4851be8
Binary files /dev/null and b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4.jpg differ
diff --git a/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4.json b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4.json
new file mode 100644
index 0000000..440fb59
--- /dev/null
+++ b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4.json
@@ -0,0 +1,46 @@
+{
+ "image": "12efc390-24d3-4e1c-b274-36e839c7b1a4.jpg",
+ "width": 720,
+ "height": 248,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 540,
+ 700,
+ 788
+ ],
+ "click_point": [
+ 121,
+ 589
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 801,
+ 700,
+ 1047
+ ],
+ "click_point": [
+ 121,
+ 850
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1060,
+ 700,
+ 1308
+ ],
+ "click_point": [
+ 121,
+ 1109
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4_flag.jpg b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4_flag.jpg
new file mode 100644
index 0000000..6c414d3
Binary files /dev/null and b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4_vl.jpg b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4_vl.jpg
new file mode 100644
index 0000000..ace0b88
Binary files /dev/null and b/Apps/XinDianTu/Images/12efc390-24d3-4e1c-b274-36e839c7b1a4_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1331a921-8276-451b-96be-364fb8cdc5da.jpg b/Apps/XinDianTu/Images/1331a921-8276-451b-96be-364fb8cdc5da.jpg
new file mode 100644
index 0000000..3b46765
Binary files /dev/null and b/Apps/XinDianTu/Images/1331a921-8276-451b-96be-364fb8cdc5da.jpg differ
diff --git a/Apps/XinDianTu/Images/136324b0-03d6-48b7-80df-bae9e689524a.jpg b/Apps/XinDianTu/Images/136324b0-03d6-48b7-80df-bae9e689524a.jpg
new file mode 100644
index 0000000..abf6a8d
Binary files /dev/null and b/Apps/XinDianTu/Images/136324b0-03d6-48b7-80df-bae9e689524a.jpg differ
diff --git a/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_1.jpg b/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_1.jpg
new file mode 100644
index 0000000..4602151
Binary files /dev/null and b/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_2.jpg b/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_2.jpg
new file mode 100644
index 0000000..506230a
Binary files /dev/null and b/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_3.jpg b/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_3.jpg
new file mode 100644
index 0000000..3446c2b
Binary files /dev/null and b/Apps/XinDianTu/Images/1382fd3275ca6547d5cc22f740c0eca7_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_1.jpg b/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_1.jpg
new file mode 100644
index 0000000..9e984af
Binary files /dev/null and b/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_2.jpg b/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_2.jpg
new file mode 100644
index 0000000..7029425
Binary files /dev/null and b/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_3.jpg b/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_3.jpg
new file mode 100644
index 0000000..c9212a1
Binary files /dev/null and b/Apps/XinDianTu/Images/141225706b307805ec6cc373811ecbf5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/142b5ae4-ebdb-4c59-9cfd-782f31ca1c4f.jpg b/Apps/XinDianTu/Images/142b5ae4-ebdb-4c59-9cfd-782f31ca1c4f.jpg
new file mode 100644
index 0000000..3f2f9db
Binary files /dev/null and b/Apps/XinDianTu/Images/142b5ae4-ebdb-4c59-9cfd-782f31ca1c4f.jpg differ
diff --git a/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461.jpg b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461.jpg
new file mode 100644
index 0000000..b20ab0d
Binary files /dev/null and b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461.jpg differ
diff --git a/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461.json b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461.json
new file mode 100644
index 0000000..4f74e86
--- /dev/null
+++ b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461.json
@@ -0,0 +1,46 @@
+{
+ "image": "144884b2-3950-4855-b363-a90f09e0b461.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 537,
+ 700,
+ 788
+ ],
+ "click_point": [
+ 121,
+ 587
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 802,
+ 700,
+ 1048
+ ],
+ "click_point": [
+ 121,
+ 851
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1057,
+ 700,
+ 1308
+ ],
+ "click_point": [
+ 121,
+ 1107
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461_flag.jpg b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461_flag.jpg
new file mode 100644
index 0000000..f9dfe88
Binary files /dev/null and b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461_vl.jpg b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461_vl.jpg
new file mode 100644
index 0000000..033c1a0
Binary files /dev/null and b/Apps/XinDianTu/Images/144884b2-3950-4855-b363-a90f09e0b461_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_1.jpg b/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_1.jpg
new file mode 100644
index 0000000..b77fbfa
Binary files /dev/null and b/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_2.jpg b/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_2.jpg
new file mode 100644
index 0000000..1ab1aed
Binary files /dev/null and b/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_3.jpg b/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_3.jpg
new file mode 100644
index 0000000..9feec86
Binary files /dev/null and b/Apps/XinDianTu/Images/146d5145417966bcd3c41f4d42e90743_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/14d64ce3-dc07-40d9-9fca-7966e12d7255.jpg b/Apps/XinDianTu/Images/14d64ce3-dc07-40d9-9fca-7966e12d7255.jpg
new file mode 100644
index 0000000..d0008c3
Binary files /dev/null and b/Apps/XinDianTu/Images/14d64ce3-dc07-40d9-9fca-7966e12d7255.jpg differ
diff --git a/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_1.jpg b/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_1.jpg
new file mode 100644
index 0000000..12aa917
Binary files /dev/null and b/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_2.jpg b/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_2.jpg
new file mode 100644
index 0000000..c784cfc
Binary files /dev/null and b/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_3.jpg b/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_3.jpg
new file mode 100644
index 0000000..5c3b831
Binary files /dev/null and b/Apps/XinDianTu/Images/150854c607bf6e2a0065eff403492c32_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_1.jpg b/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_1.jpg
new file mode 100644
index 0000000..3e6007d
Binary files /dev/null and b/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_2.jpg b/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_2.jpg
new file mode 100644
index 0000000..4b6b626
Binary files /dev/null and b/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_3.jpg b/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_3.jpg
new file mode 100644
index 0000000..de587b6
Binary files /dev/null and b/Apps/XinDianTu/Images/1551babfe1bb3b67b05248aed2bdcb06_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/15f28117-37d5-4009-9216-832e6aca8ae2.jpg b/Apps/XinDianTu/Images/15f28117-37d5-4009-9216-832e6aca8ae2.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/15f28117-37d5-4009-9216-832e6aca8ae2.jpg differ
diff --git a/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_1.jpg b/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_1.jpg
new file mode 100644
index 0000000..89555d5
Binary files /dev/null and b/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_2.jpg b/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_2.jpg
new file mode 100644
index 0000000..529eb5f
Binary files /dev/null and b/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_3.jpg b/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_3.jpg
new file mode 100644
index 0000000..6cf7738
Binary files /dev/null and b/Apps/XinDianTu/Images/16362c8ac1d27dfc3ee9274c0df267a6_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa.jpg b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa.jpg
new file mode 100644
index 0000000..e333967
Binary files /dev/null and b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa.jpg differ
diff --git a/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa.json b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa.json
new file mode 100644
index 0000000..790d7be
--- /dev/null
+++ b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa.json
@@ -0,0 +1,46 @@
+{
+ "image": "1718ff81-5ea0-4643-bf38-e0a976e4fdfa.jpg",
+ "width": 720,
+ "height": 149,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 444,
+ 700,
+ 692
+ ],
+ "click_point": [
+ 121,
+ 493
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 705,
+ 700,
+ 951
+ ],
+ "click_point": [
+ 121,
+ 754
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 964,
+ 700,
+ 1212
+ ],
+ "click_point": [
+ 121,
+ 1013
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa_flag.jpg b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa_flag.jpg
new file mode 100644
index 0000000..174c68d
Binary files /dev/null and b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa_vl.jpg b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa_vl.jpg
new file mode 100644
index 0000000..cd0765c
Binary files /dev/null and b/Apps/XinDianTu/Images/1718ff81-5ea0-4643-bf38-e0a976e4fdfa_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/172463a4-f526-4b0b-b619-fd912352644c.jpg b/Apps/XinDianTu/Images/172463a4-f526-4b0b-b619-fd912352644c.jpg
new file mode 100644
index 0000000..fc84d08
Binary files /dev/null and b/Apps/XinDianTu/Images/172463a4-f526-4b0b-b619-fd912352644c.jpg differ
diff --git a/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3.jpg b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3.jpg
new file mode 100644
index 0000000..de62923
Binary files /dev/null and b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3.jpg differ
diff --git a/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3.json b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3.json
new file mode 100644
index 0000000..95a35d8
--- /dev/null
+++ b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3.json
@@ -0,0 +1,46 @@
+{
+ "image": "1739219c-6d22-41a0-94a5-7cd745b118f3.jpg",
+ "width": 720,
+ "height": 148,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 418,
+ 700,
+ 692
+ ],
+ "click_point": [
+ 121,
+ 472
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 706,
+ 700,
+ 952
+ ],
+ "click_point": [
+ 121,
+ 755
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 961,
+ 700,
+ 1212
+ ],
+ "click_point": [
+ 121,
+ 1011
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3_flag.jpg b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3_flag.jpg
new file mode 100644
index 0000000..dd3e0d8
Binary files /dev/null and b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3_vl.jpg b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3_vl.jpg
new file mode 100644
index 0000000..2037570
Binary files /dev/null and b/Apps/XinDianTu/Images/1739219c-6d22-41a0-94a5-7cd745b118f3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5.jpg b/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5.jpg
new file mode 100644
index 0000000..632e9cf
Binary files /dev/null and b/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5.jpg differ
diff --git a/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5_flag.jpg b/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5_flag.jpg
new file mode 100644
index 0000000..758d731
Binary files /dev/null and b/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5_vl.jpg b/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5_vl.jpg
new file mode 100644
index 0000000..6f96015
Binary files /dev/null and b/Apps/XinDianTu/Images/1999fc34-69b7-4e8f-8efa-84e418d539c5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9.jpg b/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9.jpg
new file mode 100644
index 0000000..a498aa9
Binary files /dev/null and b/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9.jpg differ
diff --git a/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9_flag.jpg b/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9_flag.jpg
new file mode 100644
index 0000000..6c1e891
Binary files /dev/null and b/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9_vl.jpg b/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9_vl.jpg
new file mode 100644
index 0000000..633573b
Binary files /dev/null and b/Apps/XinDianTu/Images/19d2ffff-71c2-4469-b1b7-2867bc6540b9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/19ed0a48-506c-4d04-9262-aac0e36987cd.jpg b/Apps/XinDianTu/Images/19ed0a48-506c-4d04-9262-aac0e36987cd.jpg
new file mode 100644
index 0000000..061a14a
Binary files /dev/null and b/Apps/XinDianTu/Images/19ed0a48-506c-4d04-9262-aac0e36987cd.jpg differ
diff --git a/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_1.jpg b/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_1.jpg
new file mode 100644
index 0000000..622fe30
Binary files /dev/null and b/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_2.jpg b/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_2.jpg
new file mode 100644
index 0000000..56bda5e
Binary files /dev/null and b/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_3.jpg b/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_3.jpg
new file mode 100644
index 0000000..25bd00e
Binary files /dev/null and b/Apps/XinDianTu/Images/19fae0897cde48cde7a239db72995628_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1a34ee77-88d0-468a-9722-258dfba1739a.jpg b/Apps/XinDianTu/Images/1a34ee77-88d0-468a-9722-258dfba1739a.jpg
new file mode 100644
index 0000000..9ad4a3c
Binary files /dev/null and b/Apps/XinDianTu/Images/1a34ee77-88d0-468a-9722-258dfba1739a.jpg differ
diff --git a/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8.jpg b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8.jpg
new file mode 100644
index 0000000..8bc72ef
Binary files /dev/null and b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8.jpg differ
diff --git a/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8.json b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8.json
new file mode 100644
index 0000000..3ffc7b7
--- /dev/null
+++ b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8.json
@@ -0,0 +1,46 @@
+{
+ "image": "1a47e9cb-acf3-489b-9ca7-c66775a116f8.jpg",
+ "width": 720,
+ "height": 138,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 459,
+ 700,
+ 708
+ ],
+ "click_point": [
+ 121,
+ 508
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 716,
+ 700,
+ 965
+ ],
+ "click_point": [
+ 121,
+ 765
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 979,
+ 700,
+ 1228
+ ],
+ "click_point": [
+ 121,
+ 1028
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8_flag.jpg b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8_flag.jpg
new file mode 100644
index 0000000..879fe4e
Binary files /dev/null and b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8_vl.jpg b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8_vl.jpg
new file mode 100644
index 0000000..8fe2500
Binary files /dev/null and b/Apps/XinDianTu/Images/1a47e9cb-acf3-489b-9ca7-c66775a116f8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812.jpg b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812.jpg
new file mode 100644
index 0000000..eca2561
Binary files /dev/null and b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812.jpg differ
diff --git a/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812.json b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812.json
new file mode 100644
index 0000000..0af9c9e
--- /dev/null
+++ b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812.json
@@ -0,0 +1,59 @@
+{
+ "image": "1a9ca99e-7873-4a31-893b-128633355812.jpg",
+ "width": 720,
+ "height": 205,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 636
+ ],
+ "click_point": [
+ 121,
+ 450
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 649,
+ 700,
+ 895
+ ],
+ "click_point": [
+ 121,
+ 698
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 908,
+ 700,
+ 1156
+ ],
+ "click_point": [
+ 121,
+ 957
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1169,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1210
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812_flag.jpg b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812_flag.jpg
new file mode 100644
index 0000000..3ab0441
Binary files /dev/null and b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812_vl.jpg b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812_vl.jpg
new file mode 100644
index 0000000..8256b60
Binary files /dev/null and b/Apps/XinDianTu/Images/1a9ca99e-7873-4a31-893b-128633355812_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3.jpg b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3.jpg
new file mode 100644
index 0000000..6d8566e
Binary files /dev/null and b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3.jpg differ
diff --git a/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3.json b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3.json
new file mode 100644
index 0000000..05fcefb
--- /dev/null
+++ b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3.json
@@ -0,0 +1,46 @@
+{
+ "image": "1aaa6400-3fd6-4750-abe6-7efb59fb59e3.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 466,
+ 700,
+ 740
+ ],
+ "click_point": [
+ 121,
+ 520
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 754,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 803
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3_flag.jpg b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3_flag.jpg
new file mode 100644
index 0000000..b358ae1
Binary files /dev/null and b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3_vl.jpg b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3_vl.jpg
new file mode 100644
index 0000000..6ecdf95
Binary files /dev/null and b/Apps/XinDianTu/Images/1aaa6400-3fd6-4750-abe6-7efb59fb59e3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1abfb181-74a3-4f05-8c4c-b5f4127e0fdb.jpg b/Apps/XinDianTu/Images/1abfb181-74a3-4f05-8c4c-b5f4127e0fdb.jpg
new file mode 100644
index 0000000..d9c0e45
Binary files /dev/null and b/Apps/XinDianTu/Images/1abfb181-74a3-4f05-8c4c-b5f4127e0fdb.jpg differ
diff --git a/Apps/XinDianTu/Images/1ac5237a-c466-4a85-b2f0-8ee1fc1c3a10.jpg b/Apps/XinDianTu/Images/1ac5237a-c466-4a85-b2f0-8ee1fc1c3a10.jpg
new file mode 100644
index 0000000..d1e30ee
Binary files /dev/null and b/Apps/XinDianTu/Images/1ac5237a-c466-4a85-b2f0-8ee1fc1c3a10.jpg differ
diff --git a/Apps/XinDianTu/Images/1adf3b19-493d-4764-8595-41936b647207.jpg b/Apps/XinDianTu/Images/1adf3b19-493d-4764-8595-41936b647207.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/1adf3b19-493d-4764-8595-41936b647207.jpg differ
diff --git a/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_1.jpg b/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_1.jpg
new file mode 100644
index 0000000..77bfb5c
Binary files /dev/null and b/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_2.jpg b/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_2.jpg
new file mode 100644
index 0000000..c52b553
Binary files /dev/null and b/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_3.jpg b/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_3.jpg
new file mode 100644
index 0000000..903bbae
Binary files /dev/null and b/Apps/XinDianTu/Images/1b08ff9d15fcb506882a3cac53e56d4e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf.jpg b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf.jpg
new file mode 100644
index 0000000..5c1cb37
Binary files /dev/null and b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf.jpg differ
diff --git a/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf.json b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf.json
new file mode 100644
index 0000000..7517634
--- /dev/null
+++ b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf.json
@@ -0,0 +1,46 @@
+{
+ "image": "1b41ce05-e895-4266-88b0-c500e0645daf.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 460,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 514
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf_flag.jpg b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf_flag.jpg
new file mode 100644
index 0000000..1059792
Binary files /dev/null and b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf_vl.jpg b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf_vl.jpg
new file mode 100644
index 0000000..b724914
Binary files /dev/null and b/Apps/XinDianTu/Images/1b41ce05-e895-4266-88b0-c500e0645daf_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.jpg b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.jpg
new file mode 100644
index 0000000..2e06834
Binary files /dev/null and b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.jpg differ
diff --git a/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.json b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.json
new file mode 100644
index 0000000..ed370c5
--- /dev/null
+++ b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.json
@@ -0,0 +1,46 @@
+{
+ "image": "1b81f0d7-3d14-4449-8b99-b1e7555ca1ed.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 546,
+ 700,
+ 792
+ ],
+ "click_point": [
+ 121,
+ 595
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 801,
+ 700,
+ 1044
+ ],
+ "click_point": [
+ 121,
+ 849
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1058,
+ 700,
+ 1304
+ ],
+ "click_point": [
+ 121,
+ 1107
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed_flag.jpg b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed_flag.jpg
new file mode 100644
index 0000000..6f211a6
Binary files /dev/null and b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed_vl.jpg b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed_vl.jpg
new file mode 100644
index 0000000..8012b72
Binary files /dev/null and b/Apps/XinDianTu/Images/1b81f0d7-3d14-4449-8b99-b1e7555ca1ed_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1bb03c60-dd62-4c1f-b7e0-b7d401eccc43.jpg b/Apps/XinDianTu/Images/1bb03c60-dd62-4c1f-b7e0-b7d401eccc43.jpg
new file mode 100644
index 0000000..8b6cd36
Binary files /dev/null and b/Apps/XinDianTu/Images/1bb03c60-dd62-4c1f-b7e0-b7d401eccc43.jpg differ
diff --git a/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781.jpg b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781.jpg
new file mode 100644
index 0000000..1e4870e
Binary files /dev/null and b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781.jpg differ
diff --git a/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781.json b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781.json
new file mode 100644
index 0000000..0c47970
--- /dev/null
+++ b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781.json
@@ -0,0 +1,59 @@
+{
+ "image": "1bc1fef5-477e-44a4-a496-7b1458369781.jpg",
+ "width": 720,
+ "height": 226,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 615
+ ],
+ "click_point": [
+ 121,
+ 446
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 628,
+ 700,
+ 876
+ ],
+ "click_point": [
+ 121,
+ 677
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 889,
+ 700,
+ 1135
+ ],
+ "click_point": [
+ 121,
+ 938
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1148,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1193
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781_flag.jpg b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781_flag.jpg
new file mode 100644
index 0000000..8c954c4
Binary files /dev/null and b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781_vl.jpg b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781_vl.jpg
new file mode 100644
index 0000000..65a97f0
Binary files /dev/null and b/Apps/XinDianTu/Images/1bc1fef5-477e-44a4-a496-7b1458369781_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8.jpg b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8.jpg
new file mode 100644
index 0000000..b6b13ab
Binary files /dev/null and b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8.jpg differ
diff --git a/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8.json b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8.json
new file mode 100644
index 0000000..6e7661e
--- /dev/null
+++ b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8.json
@@ -0,0 +1,46 @@
+{
+ "image": "1bc826eb-8096-431d-b19e-145feef681f8.jpg",
+ "width": 720,
+ "height": 310,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 569,
+ 700,
+ 764
+ ],
+ "click_point": [
+ 121,
+ 608
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 776,
+ 700,
+ 1052
+ ],
+ "click_point": [
+ 121,
+ 831
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1064,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1126
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8_flag.jpg b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8_flag.jpg
new file mode 100644
index 0000000..5e56240
Binary files /dev/null and b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8_vl.jpg b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8_vl.jpg
new file mode 100644
index 0000000..7882f48
Binary files /dev/null and b/Apps/XinDianTu/Images/1bc826eb-8096-431d-b19e-145feef681f8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_1.jpg b/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_1.jpg
new file mode 100644
index 0000000..f8cd558
Binary files /dev/null and b/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_2.jpg b/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_2.jpg
new file mode 100644
index 0000000..f62edd0
Binary files /dev/null and b/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_3.jpg b/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_3.jpg
new file mode 100644
index 0000000..c3cb6a9
Binary files /dev/null and b/Apps/XinDianTu/Images/1be1daa56d27d12d2f5a8e0c96799b1f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1c7d1c61-46a8-408e-8b27-64e8c2a9efdc.jpg b/Apps/XinDianTu/Images/1c7d1c61-46a8-408e-8b27-64e8c2a9efdc.jpg
new file mode 100644
index 0000000..3f0f257
Binary files /dev/null and b/Apps/XinDianTu/Images/1c7d1c61-46a8-408e-8b27-64e8c2a9efdc.jpg differ
diff --git a/Apps/XinDianTu/Images/1cb85453-362a-4052-980e-2e0793d1e0f5.jpg b/Apps/XinDianTu/Images/1cb85453-362a-4052-980e-2e0793d1e0f5.jpg
new file mode 100644
index 0000000..14a202c
Binary files /dev/null and b/Apps/XinDianTu/Images/1cb85453-362a-4052-980e-2e0793d1e0f5.jpg differ
diff --git a/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_1.jpg b/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_1.jpg
new file mode 100644
index 0000000..627c778
Binary files /dev/null and b/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_2.jpg b/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_2.jpg
new file mode 100644
index 0000000..9397e75
Binary files /dev/null and b/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_3.jpg b/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_3.jpg
new file mode 100644
index 0000000..37618dc
Binary files /dev/null and b/Apps/XinDianTu/Images/1cdd99887a30ac54aba6ce6df6bf4b2e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1cef69e3-8ec0-452c-a456-57443b4ae5a6.jpg b/Apps/XinDianTu/Images/1cef69e3-8ec0-452c-a456-57443b4ae5a6.jpg
new file mode 100644
index 0000000..78cb8bc
Binary files /dev/null and b/Apps/XinDianTu/Images/1cef69e3-8ec0-452c-a456-57443b4ae5a6.jpg differ
diff --git a/Apps/XinDianTu/Images/1d1e004c-2bf7-421f-95d0-8a621eed34fb.jpg b/Apps/XinDianTu/Images/1d1e004c-2bf7-421f-95d0-8a621eed34fb.jpg
new file mode 100644
index 0000000..acb006f
Binary files /dev/null and b/Apps/XinDianTu/Images/1d1e004c-2bf7-421f-95d0-8a621eed34fb.jpg differ
diff --git a/Apps/XinDianTu/Images/1d33f95e-1c32-492a-b35c-962e9175b051.jpg b/Apps/XinDianTu/Images/1d33f95e-1c32-492a-b35c-962e9175b051.jpg
new file mode 100644
index 0000000..7ced238
Binary files /dev/null and b/Apps/XinDianTu/Images/1d33f95e-1c32-492a-b35c-962e9175b051.jpg differ
diff --git a/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78.jpg b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78.jpg
new file mode 100644
index 0000000..d84cd90
Binary files /dev/null and b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78.jpg differ
diff --git a/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78.json b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78.json
new file mode 100644
index 0000000..34bab38
--- /dev/null
+++ b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78.json
@@ -0,0 +1,46 @@
+{
+ "image": "1d6c617b-b19e-4771-9b19-39d8b9da4f78.jpg",
+ "width": 720,
+ "height": 253,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 572,
+ 700,
+ 820
+ ],
+ "click_point": [
+ 121,
+ 621
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 832,
+ 700,
+ 1108
+ ],
+ "click_point": [
+ 121,
+ 887
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1121,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1171
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78_flag.jpg b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78_flag.jpg
new file mode 100644
index 0000000..909079f
Binary files /dev/null and b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78_vl.jpg b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78_vl.jpg
new file mode 100644
index 0000000..d0e74c3
Binary files /dev/null and b/Apps/XinDianTu/Images/1d6c617b-b19e-4771-9b19-39d8b9da4f78_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_1.jpg b/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_1.jpg
new file mode 100644
index 0000000..dedceff
Binary files /dev/null and b/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_2.jpg b/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_2.jpg
new file mode 100644
index 0000000..dab16e9
Binary files /dev/null and b/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_3.jpg b/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_3.jpg
new file mode 100644
index 0000000..84fb4e7
Binary files /dev/null and b/Apps/XinDianTu/Images/1da00f0e2f55fa81ad1c897f00b1dac8_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1dfe3cc6-0965-412c-8e2d-c72612c27a79.jpg b/Apps/XinDianTu/Images/1dfe3cc6-0965-412c-8e2d-c72612c27a79.jpg
new file mode 100644
index 0000000..4d0a8f0
Binary files /dev/null and b/Apps/XinDianTu/Images/1dfe3cc6-0965-412c-8e2d-c72612c27a79.jpg differ
diff --git a/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418.jpg b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418.jpg
new file mode 100644
index 0000000..a396a79
Binary files /dev/null and b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418.jpg differ
diff --git a/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418.json b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418.json
new file mode 100644
index 0000000..5805723
--- /dev/null
+++ b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418.json
@@ -0,0 +1,33 @@
+{
+ "image": "1e5bed23-d00d-4cf6-b2d8-67e6d0461418.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418_flag.jpg b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418_flag.jpg
new file mode 100644
index 0000000..58c2194
Binary files /dev/null and b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418_vl.jpg b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418_vl.jpg
new file mode 100644
index 0000000..bc2cd75
Binary files /dev/null and b/Apps/XinDianTu/Images/1e5bed23-d00d-4cf6-b2d8-67e6d0461418_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_1.jpg b/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_1.jpg
new file mode 100644
index 0000000..5bf02f9
Binary files /dev/null and b/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_2.jpg b/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_2.jpg
new file mode 100644
index 0000000..0324a21
Binary files /dev/null and b/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_3.jpg b/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_3.jpg
new file mode 100644
index 0000000..1452371
Binary files /dev/null and b/Apps/XinDianTu/Images/1e6c3428aaf71fa7f2b8d3a6a8514b83_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/1f256466-0b5d-4212-8c78-c58ed59c5fa7.jpg b/Apps/XinDianTu/Images/1f256466-0b5d-4212-8c78-c58ed59c5fa7.jpg
new file mode 100644
index 0000000..1a779ee
Binary files /dev/null and b/Apps/XinDianTu/Images/1f256466-0b5d-4212-8c78-c58ed59c5fa7.jpg differ
diff --git a/Apps/XinDianTu/Images/1f7f9df8-2d05-44d1-8e31-2a44c5248dd1.jpg b/Apps/XinDianTu/Images/1f7f9df8-2d05-44d1-8e31-2a44c5248dd1.jpg
new file mode 100644
index 0000000..170bd32
Binary files /dev/null and b/Apps/XinDianTu/Images/1f7f9df8-2d05-44d1-8e31-2a44c5248dd1.jpg differ
diff --git a/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7.jpg b/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7.jpg
new file mode 100644
index 0000000..91a085d
Binary files /dev/null and b/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7.jpg differ
diff --git a/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7_flag.jpg b/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7_flag.jpg
new file mode 100644
index 0000000..a2bce02
Binary files /dev/null and b/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7_vl.jpg b/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7_vl.jpg
new file mode 100644
index 0000000..d5a4791
Binary files /dev/null and b/Apps/XinDianTu/Images/1f946336-f302-4114-b25d-a7015b17cfe7_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225.jpg b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225.jpg
new file mode 100644
index 0000000..8571c53
Binary files /dev/null and b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225.jpg differ
diff --git a/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225.json b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225.json
new file mode 100644
index 0000000..b94731e
--- /dev/null
+++ b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225.json
@@ -0,0 +1,46 @@
+{
+ "image": "1fe06d69-c4c9-4050-9782-2d99a71fb225.jpg",
+ "width": 720,
+ "height": 154,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 441,
+ 700,
+ 687
+ ],
+ "click_point": [
+ 121,
+ 490
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 700,
+ 700,
+ 948
+ ],
+ "click_point": [
+ 121,
+ 749
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 961,
+ 700,
+ 1207
+ ],
+ "click_point": [
+ 121,
+ 1010
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225_flag.jpg b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225_flag.jpg
new file mode 100644
index 0000000..4c2ad39
Binary files /dev/null and b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225_vl.jpg b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225_vl.jpg
new file mode 100644
index 0000000..dadd294
Binary files /dev/null and b/Apps/XinDianTu/Images/1fe06d69-c4c9-4050-9782-2d99a71fb225_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9.jpg b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9.jpg
new file mode 100644
index 0000000..219304a
Binary files /dev/null and b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9.jpg differ
diff --git a/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9.json b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9.json
new file mode 100644
index 0000000..f2e2346
--- /dev/null
+++ b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9.json
@@ -0,0 +1,46 @@
+{
+ "image": "1ff1de21-5569-41df-a3e1-fd49731b74b9.jpg",
+ "width": 720,
+ "height": 130,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 436,
+ 700,
+ 684
+ ],
+ "click_point": [
+ 121,
+ 485
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 696,
+ 700,
+ 972
+ ],
+ "click_point": [
+ 121,
+ 751
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 985,
+ 700,
+ 1231
+ ],
+ "click_point": [
+ 121,
+ 1034
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9_flag.jpg b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9_flag.jpg
new file mode 100644
index 0000000..afe6abd
Binary files /dev/null and b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9_vl.jpg b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9_vl.jpg
new file mode 100644
index 0000000..4430e4b
Binary files /dev/null and b/Apps/XinDianTu/Images/1ff1de21-5569-41df-a3e1-fd49731b74b9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/1ff3591b-0488-416e-8ae2-27d822ed0661.jpg b/Apps/XinDianTu/Images/1ff3591b-0488-416e-8ae2-27d822ed0661.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/1ff3591b-0488-416e-8ae2-27d822ed0661.jpg differ
diff --git a/Apps/XinDianTu/Images/200ca460-5485-4fd1-9660-b77d20c7438f.jpg b/Apps/XinDianTu/Images/200ca460-5485-4fd1-9660-b77d20c7438f.jpg
new file mode 100644
index 0000000..a862577
Binary files /dev/null and b/Apps/XinDianTu/Images/200ca460-5485-4fd1-9660-b77d20c7438f.jpg differ
diff --git a/Apps/XinDianTu/Images/20761508-1037-4b8f-aa6f-8614325b78ee.jpg b/Apps/XinDianTu/Images/20761508-1037-4b8f-aa6f-8614325b78ee.jpg
new file mode 100644
index 0000000..a9116a6
Binary files /dev/null and b/Apps/XinDianTu/Images/20761508-1037-4b8f-aa6f-8614325b78ee.jpg differ
diff --git a/Apps/XinDianTu/Images/2088b1f6-5b4d-4a11-b622-86f27c974a97.jpg b/Apps/XinDianTu/Images/2088b1f6-5b4d-4a11-b622-86f27c974a97.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/2088b1f6-5b4d-4a11-b622-86f27c974a97.jpg differ
diff --git a/Apps/XinDianTu/Images/2123ecae-617e-4763-8249-a0dfb04af1b3.jpg b/Apps/XinDianTu/Images/2123ecae-617e-4763-8249-a0dfb04af1b3.jpg
new file mode 100644
index 0000000..9026a9d
Binary files /dev/null and b/Apps/XinDianTu/Images/2123ecae-617e-4763-8249-a0dfb04af1b3.jpg differ
diff --git a/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_1.jpg b/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_1.jpg
new file mode 100644
index 0000000..115344f
Binary files /dev/null and b/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_2.jpg b/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_2.jpg
new file mode 100644
index 0000000..baee6fa
Binary files /dev/null and b/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_3.jpg b/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_3.jpg
new file mode 100644
index 0000000..0d4ee62
Binary files /dev/null and b/Apps/XinDianTu/Images/224bb7bf3220155ae08be472c903b598_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de.jpg b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de.jpg
new file mode 100644
index 0000000..febd31d
Binary files /dev/null and b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de.jpg differ
diff --git a/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de.json b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de.json
new file mode 100644
index 0000000..360673f
--- /dev/null
+++ b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de.json
@@ -0,0 +1,33 @@
+{
+ "image": "22702e95-d549-490b-9619-bfa1a91591de.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de_flag.jpg b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de_flag.jpg
new file mode 100644
index 0000000..47c4032
Binary files /dev/null and b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de_vl.jpg b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de_vl.jpg
new file mode 100644
index 0000000..a8febd3
Binary files /dev/null and b/Apps/XinDianTu/Images/22702e95-d549-490b-9619-bfa1a91591de_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/22c19ad1-b65a-4ff0-8669-aa451facdd40.jpg b/Apps/XinDianTu/Images/22c19ad1-b65a-4ff0-8669-aa451facdd40.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/22c19ad1-b65a-4ff0-8669-aa451facdd40.jpg differ
diff --git a/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872.jpg b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872.jpg
new file mode 100644
index 0000000..f71da1c
Binary files /dev/null and b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872.jpg differ
diff --git a/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872.json b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872.json
new file mode 100644
index 0000000..d4c8d7e
--- /dev/null
+++ b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872.json
@@ -0,0 +1,46 @@
+{
+ "image": "22c8524e-daee-4d42-a292-254a3d260872.jpg",
+ "width": 720,
+ "height": 166,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 428,
+ 700,
+ 676
+ ],
+ "click_point": [
+ 121,
+ 477
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 689,
+ 700,
+ 935
+ ],
+ "click_point": [
+ 121,
+ 738
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 948,
+ 700,
+ 1196
+ ],
+ "click_point": [
+ 121,
+ 997
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872_flag.jpg b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872_flag.jpg
new file mode 100644
index 0000000..99e3605
Binary files /dev/null and b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872_vl.jpg b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872_vl.jpg
new file mode 100644
index 0000000..dc956ed
Binary files /dev/null and b/Apps/XinDianTu/Images/22c8524e-daee-4d42-a292-254a3d260872_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/22e03cee-84f5-41b7-837a-1a78ae490c62.jpg b/Apps/XinDianTu/Images/22e03cee-84f5-41b7-837a-1a78ae490c62.jpg
new file mode 100644
index 0000000..00a42f2
Binary files /dev/null and b/Apps/XinDianTu/Images/22e03cee-84f5-41b7-837a-1a78ae490c62.jpg differ
diff --git a/Apps/XinDianTu/Images/2315ed14-7afa-46be-a795-b131b106bc45.jpg b/Apps/XinDianTu/Images/2315ed14-7afa-46be-a795-b131b106bc45.jpg
new file mode 100644
index 0000000..10f8498
Binary files /dev/null and b/Apps/XinDianTu/Images/2315ed14-7afa-46be-a795-b131b106bc45.jpg differ
diff --git a/Apps/XinDianTu/Images/23606c9a-4f0c-4179-a3a5-9f759ee076c7.jpg b/Apps/XinDianTu/Images/23606c9a-4f0c-4179-a3a5-9f759ee076c7.jpg
new file mode 100644
index 0000000..f00c410
Binary files /dev/null and b/Apps/XinDianTu/Images/23606c9a-4f0c-4179-a3a5-9f759ee076c7.jpg differ
diff --git a/Apps/XinDianTu/Images/23d78378-844d-4bbf-bef8-b7891d824132.jpg b/Apps/XinDianTu/Images/23d78378-844d-4bbf-bef8-b7891d824132.jpg
new file mode 100644
index 0000000..51f0827
Binary files /dev/null and b/Apps/XinDianTu/Images/23d78378-844d-4bbf-bef8-b7891d824132.jpg differ
diff --git a/Apps/XinDianTu/Images/2438b8ea-5d31-4e3d-aa04-6751abb878e8.jpg b/Apps/XinDianTu/Images/2438b8ea-5d31-4e3d-aa04-6751abb878e8.jpg
new file mode 100644
index 0000000..3cc593d
Binary files /dev/null and b/Apps/XinDianTu/Images/2438b8ea-5d31-4e3d-aa04-6751abb878e8.jpg differ
diff --git a/Apps/XinDianTu/Images/244b5974-1082-4c9c-91a1-46dc83cfb3cd.jpg b/Apps/XinDianTu/Images/244b5974-1082-4c9c-91a1-46dc83cfb3cd.jpg
new file mode 100644
index 0000000..2f38155
Binary files /dev/null and b/Apps/XinDianTu/Images/244b5974-1082-4c9c-91a1-46dc83cfb3cd.jpg differ
diff --git a/Apps/XinDianTu/Images/246626bc-7545-4839-bd85-16f32b1c5150.jpg b/Apps/XinDianTu/Images/246626bc-7545-4839-bd85-16f32b1c5150.jpg
new file mode 100644
index 0000000..66d2d32
Binary files /dev/null and b/Apps/XinDianTu/Images/246626bc-7545-4839-bd85-16f32b1c5150.jpg differ
diff --git a/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_1.jpg b/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_1.jpg
new file mode 100644
index 0000000..22ab944
Binary files /dev/null and b/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_2.jpg b/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_2.jpg
new file mode 100644
index 0000000..1a07df1
Binary files /dev/null and b/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_3.jpg b/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_3.jpg
new file mode 100644
index 0000000..2660d50
Binary files /dev/null and b/Apps/XinDianTu/Images/248486b5675d31482aa54d3b04ec625c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/25068c96-74e0-4080-932f-1ba8be0e3c1d.jpg b/Apps/XinDianTu/Images/25068c96-74e0-4080-932f-1ba8be0e3c1d.jpg
new file mode 100644
index 0000000..eae11ad
Binary files /dev/null and b/Apps/XinDianTu/Images/25068c96-74e0-4080-932f-1ba8be0e3c1d.jpg differ
diff --git a/Apps/XinDianTu/Images/2521f0b6-f0d1-4fe7-85d1-7d5be0be0741.jpg b/Apps/XinDianTu/Images/2521f0b6-f0d1-4fe7-85d1-7d5be0be0741.jpg
new file mode 100644
index 0000000..bef5cea
Binary files /dev/null and b/Apps/XinDianTu/Images/2521f0b6-f0d1-4fe7-85d1-7d5be0be0741.jpg differ
diff --git a/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_1.jpg b/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_1.jpg
new file mode 100644
index 0000000..16cbbba
Binary files /dev/null and b/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_2.jpg b/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_2.jpg
new file mode 100644
index 0000000..904dba7
Binary files /dev/null and b/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_3.jpg b/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_3.jpg
new file mode 100644
index 0000000..69dd4f0
Binary files /dev/null and b/Apps/XinDianTu/Images/257b8217701b891b273f7ae8619a8d61_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/25c14065-084e-4868-8c4e-a4dc7e5bbd69.jpg b/Apps/XinDianTu/Images/25c14065-084e-4868-8c4e-a4dc7e5bbd69.jpg
new file mode 100644
index 0000000..a2d3d8b
Binary files /dev/null and b/Apps/XinDianTu/Images/25c14065-084e-4868-8c4e-a4dc7e5bbd69.jpg differ
diff --git a/Apps/XinDianTu/Images/25c2d575-ec9d-4a0c-992d-0ff630b0c341.jpg b/Apps/XinDianTu/Images/25c2d575-ec9d-4a0c-992d-0ff630b0c341.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/25c2d575-ec9d-4a0c-992d-0ff630b0c341.jpg differ
diff --git a/Apps/XinDianTu/Images/25f9f4a3-ac34-4178-8c95-aabdf3c89f5a.jpg b/Apps/XinDianTu/Images/25f9f4a3-ac34-4178-8c95-aabdf3c89f5a.jpg
new file mode 100644
index 0000000..040deab
Binary files /dev/null and b/Apps/XinDianTu/Images/25f9f4a3-ac34-4178-8c95-aabdf3c89f5a.jpg differ
diff --git a/Apps/XinDianTu/Images/26055c1c-6166-440c-884e-170b1d78e43f.jpg b/Apps/XinDianTu/Images/26055c1c-6166-440c-884e-170b1d78e43f.jpg
new file mode 100644
index 0000000..441a1a3
Binary files /dev/null and b/Apps/XinDianTu/Images/26055c1c-6166-440c-884e-170b1d78e43f.jpg differ
diff --git a/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_1.jpg b/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_1.jpg
new file mode 100644
index 0000000..1d35191
Binary files /dev/null and b/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_2.jpg b/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_2.jpg
new file mode 100644
index 0000000..9349132
Binary files /dev/null and b/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_3.jpg b/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_3.jpg
new file mode 100644
index 0000000..3782f81
Binary files /dev/null and b/Apps/XinDianTu/Images/261ef902278897794a375d002cebcbe5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_1.jpg b/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_1.jpg
new file mode 100644
index 0000000..a1e1948
Binary files /dev/null and b/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_2.jpg b/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_2.jpg
new file mode 100644
index 0000000..1bef1fb
Binary files /dev/null and b/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_3.jpg b/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_3.jpg
new file mode 100644
index 0000000..be96231
Binary files /dev/null and b/Apps/XinDianTu/Images/262af466ab8cd6410f042203288a9882_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_1.jpg b/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_1.jpg
new file mode 100644
index 0000000..fc1c725
Binary files /dev/null and b/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_2.jpg b/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_2.jpg
new file mode 100644
index 0000000..4925d5d
Binary files /dev/null and b/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_3.jpg b/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_3.jpg
new file mode 100644
index 0000000..5ed6ba0
Binary files /dev/null and b/Apps/XinDianTu/Images/264802909ee0d95457dc1d0cb3e843d0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b.jpg b/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b.jpg
new file mode 100644
index 0000000..febe602
Binary files /dev/null and b/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b.jpg differ
diff --git a/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b_flag.jpg b/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b_flag.jpg
new file mode 100644
index 0000000..3591ef4
Binary files /dev/null and b/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b_vl.jpg b/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b_vl.jpg
new file mode 100644
index 0000000..1127be6
Binary files /dev/null and b/Apps/XinDianTu/Images/267f22b0-01fb-4ca8-a735-5393eb15f89b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.jpg b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.jpg
new file mode 100644
index 0000000..4f8ebef
Binary files /dev/null and b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.jpg differ
diff --git a/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.json b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.json
new file mode 100644
index 0000000..2b48f43
--- /dev/null
+++ b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.json
@@ -0,0 +1,46 @@
+{
+ "image": "26871553-02dc-4ac0-9fa8-30e9a4f7c2a8.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 506,
+ 700,
+ 772
+ ],
+ "click_point": [
+ 121,
+ 559
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 778,
+ 700,
+ 1060
+ ],
+ "click_point": [
+ 121,
+ 834
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1068,
+ 700,
+ 1317
+ ],
+ "click_point": [
+ 121,
+ 1117
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8_flag.jpg b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8_flag.jpg
new file mode 100644
index 0000000..786ffd0
Binary files /dev/null and b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8_vl.jpg b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8_vl.jpg
new file mode 100644
index 0000000..6c6e5d9
Binary files /dev/null and b/Apps/XinDianTu/Images/26871553-02dc-4ac0-9fa8-30e9a4f7c2a8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/26b2dd06-670f-44cf-9b21-a5dda48efefb.jpg b/Apps/XinDianTu/Images/26b2dd06-670f-44cf-9b21-a5dda48efefb.jpg
new file mode 100644
index 0000000..30eb657
Binary files /dev/null and b/Apps/XinDianTu/Images/26b2dd06-670f-44cf-9b21-a5dda48efefb.jpg differ
diff --git a/Apps/XinDianTu/Images/26e8344b-999c-48e2-a0d0-40ee29f9ac03.jpg b/Apps/XinDianTu/Images/26e8344b-999c-48e2-a0d0-40ee29f9ac03.jpg
new file mode 100644
index 0000000..a701bb0
Binary files /dev/null and b/Apps/XinDianTu/Images/26e8344b-999c-48e2-a0d0-40ee29f9ac03.jpg differ
diff --git a/Apps/XinDianTu/Images/2700ec34-3766-46fd-a679-26157701580e.jpg b/Apps/XinDianTu/Images/2700ec34-3766-46fd-a679-26157701580e.jpg
new file mode 100644
index 0000000..56abf96
Binary files /dev/null and b/Apps/XinDianTu/Images/2700ec34-3766-46fd-a679-26157701580e.jpg differ
diff --git a/Apps/XinDianTu/Images/27849736-d453-48b1-9177-3f24a938f497.jpg b/Apps/XinDianTu/Images/27849736-d453-48b1-9177-3f24a938f497.jpg
new file mode 100644
index 0000000..629bc23
Binary files /dev/null and b/Apps/XinDianTu/Images/27849736-d453-48b1-9177-3f24a938f497.jpg differ
diff --git a/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_1.jpg b/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_1.jpg
new file mode 100644
index 0000000..e1622f3
Binary files /dev/null and b/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_2.jpg b/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_2.jpg
new file mode 100644
index 0000000..09fc625
Binary files /dev/null and b/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_3.jpg b/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_3.jpg
new file mode 100644
index 0000000..8aece1d
Binary files /dev/null and b/Apps/XinDianTu/Images/27cd67d06379ded91549878cb557fb59_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/27dce550-6982-426c-894d-5e5cdb5623c0.jpg b/Apps/XinDianTu/Images/27dce550-6982-426c-894d-5e5cdb5623c0.jpg
new file mode 100644
index 0000000..320e75f
Binary files /dev/null and b/Apps/XinDianTu/Images/27dce550-6982-426c-894d-5e5cdb5623c0.jpg differ
diff --git a/Apps/XinDianTu/Images/27e4b78b-7545-4ddb-a16e-c6a5cf6cec54.jpg b/Apps/XinDianTu/Images/27e4b78b-7545-4ddb-a16e-c6a5cf6cec54.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/27e4b78b-7545-4ddb-a16e-c6a5cf6cec54.jpg differ
diff --git a/Apps/XinDianTu/Images/2811694e-50fe-4402-9dce-a2c1018588c8.jpg b/Apps/XinDianTu/Images/2811694e-50fe-4402-9dce-a2c1018588c8.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/2811694e-50fe-4402-9dce-a2c1018588c8.jpg differ
diff --git a/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_1.jpg b/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_1.jpg
new file mode 100644
index 0000000..5fbd848
Binary files /dev/null and b/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_2.jpg b/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_2.jpg
new file mode 100644
index 0000000..25088cc
Binary files /dev/null and b/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_3.jpg b/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_3.jpg
new file mode 100644
index 0000000..c857883
Binary files /dev/null and b/Apps/XinDianTu/Images/286cfad82cf40322775281e0c65f82b5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2874b431-3faf-481a-94a0-9b8f602e5311.jpg b/Apps/XinDianTu/Images/2874b431-3faf-481a-94a0-9b8f602e5311.jpg
new file mode 100644
index 0000000..0961c76
Binary files /dev/null and b/Apps/XinDianTu/Images/2874b431-3faf-481a-94a0-9b8f602e5311.jpg differ
diff --git a/Apps/XinDianTu/Images/28803ab9-0743-456a-9d91-c1ca30815832.jpg b/Apps/XinDianTu/Images/28803ab9-0743-456a-9d91-c1ca30815832.jpg
new file mode 100644
index 0000000..f521026
Binary files /dev/null and b/Apps/XinDianTu/Images/28803ab9-0743-456a-9d91-c1ca30815832.jpg differ
diff --git a/Apps/XinDianTu/Images/28d2ca4f-fc44-4b00-bfd6-f4b68d0f9493.jpg b/Apps/XinDianTu/Images/28d2ca4f-fc44-4b00-bfd6-f4b68d0f9493.jpg
new file mode 100644
index 0000000..2dcd561
Binary files /dev/null and b/Apps/XinDianTu/Images/28d2ca4f-fc44-4b00-bfd6-f4b68d0f9493.jpg differ
diff --git a/Apps/XinDianTu/Images/29494739-45eb-43d9-96a9-25a66db1936f.jpg b/Apps/XinDianTu/Images/29494739-45eb-43d9-96a9-25a66db1936f.jpg
new file mode 100644
index 0000000..a19dd3a
Binary files /dev/null and b/Apps/XinDianTu/Images/29494739-45eb-43d9-96a9-25a66db1936f.jpg differ
diff --git a/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.jpg b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.jpg
new file mode 100644
index 0000000..0ad7592
Binary files /dev/null and b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.jpg differ
diff --git a/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.json b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.json
new file mode 100644
index 0000000..0df3bac
--- /dev/null
+++ b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.json
@@ -0,0 +1,59 @@
+{
+ "image": "29584ac0-e5c4-4f0b-aa02-5687ff64d4d9.jpg",
+ "width": 720,
+ "height": 228,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 612
+ ],
+ "click_point": [
+ 121,
+ 445
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 626,
+ 700,
+ 872
+ ],
+ "click_point": [
+ 121,
+ 675
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 881,
+ 700,
+ 1132
+ ],
+ "click_point": [
+ 121,
+ 931
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1146,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1191
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9_flag.jpg b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9_flag.jpg
new file mode 100644
index 0000000..c0fdc06
Binary files /dev/null and b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9_vl.jpg b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9_vl.jpg
new file mode 100644
index 0000000..83130c2
Binary files /dev/null and b/Apps/XinDianTu/Images/29584ac0-e5c4-4f0b-aa02-5687ff64d4d9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c.jpg b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c.jpg
new file mode 100644
index 0000000..cbfe373
Binary files /dev/null and b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c.jpg differ
diff --git a/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c.json b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c.json
new file mode 100644
index 0000000..02e72d6
--- /dev/null
+++ b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c.json
@@ -0,0 +1,46 @@
+{
+ "image": "296116f3-d5d6-49b3-91ec-61ef1b9c913c.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 537,
+ 700,
+ 783
+ ],
+ "click_point": [
+ 121,
+ 586
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 796,
+ 700,
+ 1044
+ ],
+ "click_point": [
+ 121,
+ 845
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1057,
+ 700,
+ 1303
+ ],
+ "click_point": [
+ 121,
+ 1106
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c_flag.jpg b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c_flag.jpg
new file mode 100644
index 0000000..eecde06
Binary files /dev/null and b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c_vl.jpg b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c_vl.jpg
new file mode 100644
index 0000000..40b9b29
Binary files /dev/null and b/Apps/XinDianTu/Images/296116f3-d5d6-49b3-91ec-61ef1b9c913c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_1.jpg b/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_1.jpg
new file mode 100644
index 0000000..035a671
Binary files /dev/null and b/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_2.jpg b/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_2.jpg
new file mode 100644
index 0000000..eae517c
Binary files /dev/null and b/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_3.jpg b/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_3.jpg
new file mode 100644
index 0000000..cddaed8
Binary files /dev/null and b/Apps/XinDianTu/Images/29c5908ff11cd498b9bc91ff6f62042d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/29cc2603-fd26-44c3-8581-e85479ac70f1.jpg b/Apps/XinDianTu/Images/29cc2603-fd26-44c3-8581-e85479ac70f1.jpg
new file mode 100644
index 0000000..11a9689
Binary files /dev/null and b/Apps/XinDianTu/Images/29cc2603-fd26-44c3-8581-e85479ac70f1.jpg differ
diff --git a/Apps/XinDianTu/Images/2a2e0157-5d85-4119-a050-062c2ea96429.jpg b/Apps/XinDianTu/Images/2a2e0157-5d85-4119-a050-062c2ea96429.jpg
new file mode 100644
index 0000000..1382763
Binary files /dev/null and b/Apps/XinDianTu/Images/2a2e0157-5d85-4119-a050-062c2ea96429.jpg differ
diff --git a/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5.jpg b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5.jpg
new file mode 100644
index 0000000..b1611de
Binary files /dev/null and b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5.jpg differ
diff --git a/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5.json b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5.json
new file mode 100644
index 0000000..b211273
--- /dev/null
+++ b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5.json
@@ -0,0 +1,46 @@
+{
+ "image": "2a6b5ae5-7bf4-4135-968b-967dae73f9a5.jpg",
+ "width": 720,
+ "height": 292,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 564,
+ 700,
+ 813
+ ],
+ "click_point": [
+ 121,
+ 613
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 827,
+ 700,
+ 1076
+ ],
+ "click_point": [
+ 121,
+ 876
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1082,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1140
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5_flag.jpg b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5_flag.jpg
new file mode 100644
index 0000000..f3e49df
Binary files /dev/null and b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5_vl.jpg b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5_vl.jpg
new file mode 100644
index 0000000..b1bdd1c
Binary files /dev/null and b/Apps/XinDianTu/Images/2a6b5ae5-7bf4-4135-968b-967dae73f9a5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda.jpg b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda.jpg
new file mode 100644
index 0000000..4c4801b
Binary files /dev/null and b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda.jpg differ
diff --git a/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda.json b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda.json
new file mode 100644
index 0000000..f20db33
--- /dev/null
+++ b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda.json
@@ -0,0 +1,59 @@
+{
+ "image": "2a7d95e2-fafd-4947-8abe-fece8e9d1dda.jpg",
+ "width": 720,
+ "height": 228,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 612
+ ],
+ "click_point": [
+ 121,
+ 445
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 626,
+ 700,
+ 872
+ ],
+ "click_point": [
+ 121,
+ 675
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 881,
+ 700,
+ 1132
+ ],
+ "click_point": [
+ 121,
+ 931
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1146,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1191
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda_flag.jpg b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda_flag.jpg
new file mode 100644
index 0000000..823e04b
Binary files /dev/null and b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda_vl.jpg b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda_vl.jpg
new file mode 100644
index 0000000..691f707
Binary files /dev/null and b/Apps/XinDianTu/Images/2a7d95e2-fafd-4947-8abe-fece8e9d1dda_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2ab216b4-f1e4-4d16-970e-056b89824fef.jpg b/Apps/XinDianTu/Images/2ab216b4-f1e4-4d16-970e-056b89824fef.jpg
new file mode 100644
index 0000000..6388a07
Binary files /dev/null and b/Apps/XinDianTu/Images/2ab216b4-f1e4-4d16-970e-056b89824fef.jpg differ
diff --git a/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_1.jpg b/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_1.jpg
new file mode 100644
index 0000000..3b60393
Binary files /dev/null and b/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_2.jpg b/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_2.jpg
new file mode 100644
index 0000000..e6e75a3
Binary files /dev/null and b/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_3.jpg b/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_3.jpg
new file mode 100644
index 0000000..ff00cd1
Binary files /dev/null and b/Apps/XinDianTu/Images/2ac4e662f05497d2b134339e0a185662_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_1.jpg b/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_1.jpg
new file mode 100644
index 0000000..81db86e
Binary files /dev/null and b/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_2.jpg b/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_2.jpg
new file mode 100644
index 0000000..14eb2a7
Binary files /dev/null and b/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_3.jpg b/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_3.jpg
new file mode 100644
index 0000000..04812c3
Binary files /dev/null and b/Apps/XinDianTu/Images/2b099f377adcad33d219e99e6a7123bf_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_1.jpg b/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_1.jpg
new file mode 100644
index 0000000..76800b0
Binary files /dev/null and b/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_2.jpg b/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_2.jpg
new file mode 100644
index 0000000..b17d113
Binary files /dev/null and b/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_3.jpg b/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_3.jpg
new file mode 100644
index 0000000..a0d84a5
Binary files /dev/null and b/Apps/XinDianTu/Images/2b0c93cc0753965c4483ab8478f23671_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816.jpg b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816.jpg
new file mode 100644
index 0000000..082c5d9
Binary files /dev/null and b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816.jpg differ
diff --git a/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816.json b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816.json
new file mode 100644
index 0000000..26cd46f
--- /dev/null
+++ b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816.json
@@ -0,0 +1,59 @@
+{
+ "image": "2b721ea3-5e4b-493e-bc45-144527fe8816.jpg",
+ "width": 720,
+ "height": 186,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 403,
+ 700,
+ 655
+ ],
+ "click_point": [
+ 121,
+ 453
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 668,
+ 700,
+ 916
+ ],
+ "click_point": [
+ 121,
+ 717
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 929,
+ 700,
+ 1175
+ ],
+ "click_point": [
+ 121,
+ 978
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1188,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1225
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816_flag.jpg b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816_flag.jpg
new file mode 100644
index 0000000..3b48e70
Binary files /dev/null and b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816_vl.jpg b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816_vl.jpg
new file mode 100644
index 0000000..dfcea97
Binary files /dev/null and b/Apps/XinDianTu/Images/2b721ea3-5e4b-493e-bc45-144527fe8816_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2b7c58bd-4271-430e-aaab-577d6671e90a.jpg b/Apps/XinDianTu/Images/2b7c58bd-4271-430e-aaab-577d6671e90a.jpg
new file mode 100644
index 0000000..2bc27d1
Binary files /dev/null and b/Apps/XinDianTu/Images/2b7c58bd-4271-430e-aaab-577d6671e90a.jpg differ
diff --git a/Apps/XinDianTu/Images/2b8d36df-b374-4ec7-bd5f-fb799b7a223f.jpg b/Apps/XinDianTu/Images/2b8d36df-b374-4ec7-bd5f-fb799b7a223f.jpg
new file mode 100644
index 0000000..9e8e56c
Binary files /dev/null and b/Apps/XinDianTu/Images/2b8d36df-b374-4ec7-bd5f-fb799b7a223f.jpg differ
diff --git a/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_1.jpg b/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_1.jpg
new file mode 100644
index 0000000..0bbd5e7
Binary files /dev/null and b/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_2.jpg b/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_2.jpg
new file mode 100644
index 0000000..e1c5a03
Binary files /dev/null and b/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_3.jpg b/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_3.jpg
new file mode 100644
index 0000000..60f9661
Binary files /dev/null and b/Apps/XinDianTu/Images/2bc3454229b525136a5b8e156e9d8359_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2bc6b54b-c3cb-45a8-99ab-8c1d61bdd68b.jpg b/Apps/XinDianTu/Images/2bc6b54b-c3cb-45a8-99ab-8c1d61bdd68b.jpg
new file mode 100644
index 0000000..6ceed5c
Binary files /dev/null and b/Apps/XinDianTu/Images/2bc6b54b-c3cb-45a8-99ab-8c1d61bdd68b.jpg differ
diff --git a/Apps/XinDianTu/Images/2be4a5eb-be51-45fb-af52-37d4a7dea78e.jpg b/Apps/XinDianTu/Images/2be4a5eb-be51-45fb-af52-37d4a7dea78e.jpg
new file mode 100644
index 0000000..47fa682
Binary files /dev/null and b/Apps/XinDianTu/Images/2be4a5eb-be51-45fb-af52-37d4a7dea78e.jpg differ
diff --git a/Apps/XinDianTu/Images/2bfcb741-400e-4965-a385-f70e09450163.jpg b/Apps/XinDianTu/Images/2bfcb741-400e-4965-a385-f70e09450163.jpg
new file mode 100644
index 0000000..fa47857
Binary files /dev/null and b/Apps/XinDianTu/Images/2bfcb741-400e-4965-a385-f70e09450163.jpg differ
diff --git a/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_1.jpg b/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_1.jpg
new file mode 100644
index 0000000..e80fcf3
Binary files /dev/null and b/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_2.jpg b/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_2.jpg
new file mode 100644
index 0000000..cf54000
Binary files /dev/null and b/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_3.jpg b/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_3.jpg
new file mode 100644
index 0000000..426bc55
Binary files /dev/null and b/Apps/XinDianTu/Images/2c0779252aae27fff8c40f080b5f876a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_1.jpg b/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_1.jpg
new file mode 100644
index 0000000..2f5f360
Binary files /dev/null and b/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_2.jpg b/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_2.jpg
new file mode 100644
index 0000000..19e0ab9
Binary files /dev/null and b/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_3.jpg b/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_3.jpg
new file mode 100644
index 0000000..a06390a
Binary files /dev/null and b/Apps/XinDianTu/Images/2c2e09d33d0091272e58778f20e82f0a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_1.jpg b/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_1.jpg
new file mode 100644
index 0000000..5de4761
Binary files /dev/null and b/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_2.jpg b/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_2.jpg
new file mode 100644
index 0000000..d2167dc
Binary files /dev/null and b/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_3.jpg b/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_3.jpg
new file mode 100644
index 0000000..bd36a2b
Binary files /dev/null and b/Apps/XinDianTu/Images/2c594eb65c42fa3d83bbaf05665debe7_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_1.jpg b/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_1.jpg
new file mode 100644
index 0000000..841c8c3
Binary files /dev/null and b/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_2.jpg b/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_2.jpg
new file mode 100644
index 0000000..f72c46a
Binary files /dev/null and b/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_3.jpg b/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_3.jpg
new file mode 100644
index 0000000..a06558a
Binary files /dev/null and b/Apps/XinDianTu/Images/2c93ab55bf45efb69ae20ff1dbb8ed2d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731.jpg b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731.jpg
new file mode 100644
index 0000000..49cbd60
Binary files /dev/null and b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731.jpg differ
diff --git a/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731.json b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731.json
new file mode 100644
index 0000000..811e94e
--- /dev/null
+++ b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731.json
@@ -0,0 +1,46 @@
+{
+ "image": "2cc88195-457f-4d80-ad87-863905e75731.jpg",
+ "width": 720,
+ "height": 170,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 647
+ ],
+ "click_point": [
+ 121,
+ 452
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 656,
+ 700,
+ 902
+ ],
+ "click_point": [
+ 121,
+ 705
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 916,
+ 700,
+ 1190
+ ],
+ "click_point": [
+ 121,
+ 970
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731_flag.jpg b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731_flag.jpg
new file mode 100644
index 0000000..53d80ab
Binary files /dev/null and b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731_vl.jpg b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731_vl.jpg
new file mode 100644
index 0000000..097b77f
Binary files /dev/null and b/Apps/XinDianTu/Images/2cc88195-457f-4d80-ad87-863905e75731_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5.jpg b/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5.jpg
new file mode 100644
index 0000000..798c1b6
Binary files /dev/null and b/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5.jpg differ
diff --git a/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5_flag.jpg b/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5_flag.jpg
new file mode 100644
index 0000000..c07d5a8
Binary files /dev/null and b/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5_vl.jpg b/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5_vl.jpg
new file mode 100644
index 0000000..e2ceb93
Binary files /dev/null and b/Apps/XinDianTu/Images/2d1f7382-45a5-483e-be60-bf65d96a53c5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2d6690e0-0edf-4d6c-b250-f61d028fcc20.jpg b/Apps/XinDianTu/Images/2d6690e0-0edf-4d6c-b250-f61d028fcc20.jpg
new file mode 100644
index 0000000..03ccf14
Binary files /dev/null and b/Apps/XinDianTu/Images/2d6690e0-0edf-4d6c-b250-f61d028fcc20.jpg differ
diff --git a/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7.jpg b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7.jpg
new file mode 100644
index 0000000..3312ee9
Binary files /dev/null and b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7.jpg differ
diff --git a/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7.json b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7.json
new file mode 100644
index 0000000..c2dba1c
--- /dev/null
+++ b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7.json
@@ -0,0 +1,46 @@
+{
+ "image": "2d6fac22-8666-411c-9c6e-5d2cc60e04a7.jpg",
+ "width": 720,
+ "height": 160,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 434,
+ 700,
+ 680
+ ],
+ "click_point": [
+ 121,
+ 483
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 689,
+ 700,
+ 940
+ ],
+ "click_point": [
+ 121,
+ 739
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 954,
+ 700,
+ 1200
+ ],
+ "click_point": [
+ 121,
+ 1003
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7_flag.jpg b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7_flag.jpg
new file mode 100644
index 0000000..a27ea4d
Binary files /dev/null and b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7_vl.jpg b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7_vl.jpg
new file mode 100644
index 0000000..e702335
Binary files /dev/null and b/Apps/XinDianTu/Images/2d6fac22-8666-411c-9c6e-5d2cc60e04a7_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.jpg b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.jpg
new file mode 100644
index 0000000..c3e32f3
Binary files /dev/null and b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.jpg differ
diff --git a/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.json b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.json
new file mode 100644
index 0000000..59f0e9e
--- /dev/null
+++ b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.json
@@ -0,0 +1,59 @@
+{
+ "image": "2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515.jpg",
+ "width": 720,
+ "height": 195,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 620
+ ],
+ "click_point": [
+ 121,
+ 447
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 628,
+ 700,
+ 877
+ ],
+ "click_point": [
+ 121,
+ 677
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 890,
+ 700,
+ 1165
+ ],
+ "click_point": [
+ 121,
+ 945
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1179,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1218
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515_flag.jpg b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515_flag.jpg
new file mode 100644
index 0000000..59599ce
Binary files /dev/null and b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515_vl.jpg b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515_vl.jpg
new file mode 100644
index 0000000..b2fc966
Binary files /dev/null and b/Apps/XinDianTu/Images/2dc1fd3d-dae3-4fd7-b37f-4a40f4f96515_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_1.jpg b/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_1.jpg
new file mode 100644
index 0000000..1eef130
Binary files /dev/null and b/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_2.jpg b/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_2.jpg
new file mode 100644
index 0000000..3f60b47
Binary files /dev/null and b/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_3.jpg b/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_3.jpg
new file mode 100644
index 0000000..71f9976
Binary files /dev/null and b/Apps/XinDianTu/Images/2dee20791a6e13d398cb5750e115e25a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691.jpg b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691.jpg
new file mode 100644
index 0000000..9d97b1a
Binary files /dev/null and b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691.jpg differ
diff --git a/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691.json b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691.json
new file mode 100644
index 0000000..6c34d5a
--- /dev/null
+++ b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691.json
@@ -0,0 +1,59 @@
+{
+ "image": "2e10a0cc-e45b-49d8-8ea7-bea771a02691.jpg",
+ "width": 720,
+ "height": 260,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 580
+ ],
+ "click_point": [
+ 121,
+ 439
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 594,
+ 700,
+ 840
+ ],
+ "click_point": [
+ 121,
+ 643
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 849,
+ 700,
+ 1100
+ ],
+ "click_point": [
+ 121,
+ 899
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1114,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1166
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691_flag.jpg b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691_flag.jpg
new file mode 100644
index 0000000..0c99123
Binary files /dev/null and b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691_vl.jpg b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691_vl.jpg
new file mode 100644
index 0000000..2782563
Binary files /dev/null and b/Apps/XinDianTu/Images/2e10a0cc-e45b-49d8-8ea7-bea771a02691_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2e23e43d-becb-4802-9d47-6493ace95c8e.jpg b/Apps/XinDianTu/Images/2e23e43d-becb-4802-9d47-6493ace95c8e.jpg
new file mode 100644
index 0000000..744b3ff
Binary files /dev/null and b/Apps/XinDianTu/Images/2e23e43d-becb-4802-9d47-6493ace95c8e.jpg differ
diff --git a/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_1.jpg b/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_1.jpg
new file mode 100644
index 0000000..d28eeeb
Binary files /dev/null and b/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_2.jpg b/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_2.jpg
new file mode 100644
index 0000000..023473e
Binary files /dev/null and b/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_3.jpg b/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_3.jpg
new file mode 100644
index 0000000..db95400
Binary files /dev/null and b/Apps/XinDianTu/Images/2e55ffa8542c55ad2e43e0f6eb15bbb7_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200.jpg b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200.jpg
new file mode 100644
index 0000000..2dca735
Binary files /dev/null and b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200.jpg differ
diff --git a/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200.json b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200.json
new file mode 100644
index 0000000..8ab6e19
--- /dev/null
+++ b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200.json
@@ -0,0 +1,46 @@
+{
+ "image": "2ea1e346-95ca-410e-9452-8da33a14e200.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 572,
+ 700,
+ 821
+ ],
+ "click_point": [
+ 121,
+ 621
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 835,
+ 700,
+ 1084
+ ],
+ "click_point": [
+ 121,
+ 884
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1092,
+ 700,
+ 1341
+ ],
+ "click_point": [
+ 121,
+ 1141
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200_flag.jpg b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200_flag.jpg
new file mode 100644
index 0000000..5a2cd08
Binary files /dev/null and b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200_vl.jpg b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200_vl.jpg
new file mode 100644
index 0000000..e5643d7
Binary files /dev/null and b/Apps/XinDianTu/Images/2ea1e346-95ca-410e-9452-8da33a14e200_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_1.jpg b/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_1.jpg
new file mode 100644
index 0000000..7f23c69
Binary files /dev/null and b/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_2.jpg b/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_2.jpg
new file mode 100644
index 0000000..2802dd7
Binary files /dev/null and b/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_3.jpg b/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_3.jpg
new file mode 100644
index 0000000..7856ef1
Binary files /dev/null and b/Apps/XinDianTu/Images/2ee94c6a513746db707b4ab713736c5d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2f3a9346-a307-4c7c-ae0a-8e8af6aa94bc.jpg b/Apps/XinDianTu/Images/2f3a9346-a307-4c7c-ae0a-8e8af6aa94bc.jpg
new file mode 100644
index 0000000..70f31fa
Binary files /dev/null and b/Apps/XinDianTu/Images/2f3a9346-a307-4c7c-ae0a-8e8af6aa94bc.jpg differ
diff --git a/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a.jpg b/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a.jpg
new file mode 100644
index 0000000..2c9acc7
Binary files /dev/null and b/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a.jpg differ
diff --git a/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a_flag.jpg b/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a_flag.jpg
new file mode 100644
index 0000000..f3fb3ec
Binary files /dev/null and b/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a_vl.jpg b/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a_vl.jpg
new file mode 100644
index 0000000..d2c5d7c
Binary files /dev/null and b/Apps/XinDianTu/Images/2f4311e9-7958-4c76-81c5-c7f4ffc2d25a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2f4411b5-63c0-4a19-af0e-0f8cdb8f7358.jpg b/Apps/XinDianTu/Images/2f4411b5-63c0-4a19-af0e-0f8cdb8f7358.jpg
new file mode 100644
index 0000000..b065fa2
Binary files /dev/null and b/Apps/XinDianTu/Images/2f4411b5-63c0-4a19-af0e-0f8cdb8f7358.jpg differ
diff --git a/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c.jpg b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c.jpg
new file mode 100644
index 0000000..928f789
Binary files /dev/null and b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c.jpg differ
diff --git a/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c.json b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c.json
new file mode 100644
index 0000000..0d94170
--- /dev/null
+++ b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c.json
@@ -0,0 +1,46 @@
+{
+ "image": "2f88b71a-73e9-4c4a-9743-2ced018e728c.jpg",
+ "width": 720,
+ "height": 150,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 622
+ ],
+ "click_point": [
+ 121,
+ 447
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 636,
+ 700,
+ 950
+ ],
+ "click_point": [
+ 121,
+ 698
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 964,
+ 700,
+ 1215
+ ],
+ "click_point": [
+ 121,
+ 1014
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c_flag.jpg b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c_flag.jpg
new file mode 100644
index 0000000..b130e29
Binary files /dev/null and b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c_vl.jpg b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c_vl.jpg
new file mode 100644
index 0000000..f4a5e50
Binary files /dev/null and b/Apps/XinDianTu/Images/2f88b71a-73e9-4c4a-9743-2ced018e728c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2fb06e6c-0877-4ded-8592-97b50fe973b2.jpg b/Apps/XinDianTu/Images/2fb06e6c-0877-4ded-8592-97b50fe973b2.jpg
new file mode 100644
index 0000000..431e2f4
Binary files /dev/null and b/Apps/XinDianTu/Images/2fb06e6c-0877-4ded-8592-97b50fe973b2.jpg differ
diff --git a/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_1.jpg b/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_1.jpg
new file mode 100644
index 0000000..bcddf20
Binary files /dev/null and b/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_2.jpg b/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_2.jpg
new file mode 100644
index 0000000..ec352bd
Binary files /dev/null and b/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_3.jpg b/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_3.jpg
new file mode 100644
index 0000000..5d362e1
Binary files /dev/null and b/Apps/XinDianTu/Images/2fc61a1de988d57a4b14d5766589a876_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_1.jpg b/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_1.jpg
new file mode 100644
index 0000000..5220570
Binary files /dev/null and b/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_2.jpg b/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_2.jpg
new file mode 100644
index 0000000..c075bd4
Binary files /dev/null and b/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_3.jpg b/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_3.jpg
new file mode 100644
index 0000000..bdb416b
Binary files /dev/null and b/Apps/XinDianTu/Images/2fe3733c21b415d224a3598a8adbf8e3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8.jpg b/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8.jpg
new file mode 100644
index 0000000..5ffffa3
Binary files /dev/null and b/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8.jpg differ
diff --git a/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8_flag.jpg b/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8_flag.jpg
new file mode 100644
index 0000000..5ca0f6d
Binary files /dev/null and b/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8_vl.jpg b/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8_vl.jpg
new file mode 100644
index 0000000..0de5ec7
Binary files /dev/null and b/Apps/XinDianTu/Images/2fe857ff-7309-46a1-aa15-263720d4f4b8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/2ffd7b67-0e32-44cb-8f3f-bcc35ace6b04.jpg b/Apps/XinDianTu/Images/2ffd7b67-0e32-44cb-8f3f-bcc35ace6b04.jpg
new file mode 100644
index 0000000..7b2fb88
Binary files /dev/null and b/Apps/XinDianTu/Images/2ffd7b67-0e32-44cb-8f3f-bcc35ace6b04.jpg differ
diff --git a/Apps/XinDianTu/Images/2ffe8171-78d7-4569-b05b-80aec5ab6720.jpg b/Apps/XinDianTu/Images/2ffe8171-78d7-4569-b05b-80aec5ab6720.jpg
new file mode 100644
index 0000000..45be2c1
Binary files /dev/null and b/Apps/XinDianTu/Images/2ffe8171-78d7-4569-b05b-80aec5ab6720.jpg differ
diff --git a/Apps/XinDianTu/Images/300cf978-0fd5-4827-a1ac-49e579418c87.jpg b/Apps/XinDianTu/Images/300cf978-0fd5-4827-a1ac-49e579418c87.jpg
new file mode 100644
index 0000000..bff04f5
Binary files /dev/null and b/Apps/XinDianTu/Images/300cf978-0fd5-4827-a1ac-49e579418c87.jpg differ
diff --git a/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_1.jpg b/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_1.jpg
new file mode 100644
index 0000000..60b83c8
Binary files /dev/null and b/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_2.jpg b/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_2.jpg
new file mode 100644
index 0000000..9f9fb98
Binary files /dev/null and b/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_3.jpg b/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_3.jpg
new file mode 100644
index 0000000..8fb28c4
Binary files /dev/null and b/Apps/XinDianTu/Images/300d866c1124e8ce94a421ea5c69128e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/301c40d6-8c59-4fdc-a1c7-eac0d2a8271f.jpg b/Apps/XinDianTu/Images/301c40d6-8c59-4fdc-a1c7-eac0d2a8271f.jpg
new file mode 100644
index 0000000..2d051bc
Binary files /dev/null and b/Apps/XinDianTu/Images/301c40d6-8c59-4fdc-a1c7-eac0d2a8271f.jpg differ
diff --git a/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_1.jpg b/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_1.jpg
new file mode 100644
index 0000000..20cac75
Binary files /dev/null and b/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_2.jpg b/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_2.jpg
new file mode 100644
index 0000000..6bafaa0
Binary files /dev/null and b/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_3.jpg b/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_3.jpg
new file mode 100644
index 0000000..ab14420
Binary files /dev/null and b/Apps/XinDianTu/Images/302a88d94c579fd88553734607c0cdcc_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5.jpg b/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5.jpg
new file mode 100644
index 0000000..94c00f7
Binary files /dev/null and b/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5.jpg differ
diff --git a/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5_flag.jpg b/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5_flag.jpg
new file mode 100644
index 0000000..805ba5c
Binary files /dev/null and b/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5_vl.jpg b/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5_vl.jpg
new file mode 100644
index 0000000..b5f03ed
Binary files /dev/null and b/Apps/XinDianTu/Images/305dadf8-440e-42c9-b982-8a4d6c59dfa5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3069bfa5-6498-4efd-90e7-c333b538b319.jpg b/Apps/XinDianTu/Images/3069bfa5-6498-4efd-90e7-c333b538b319.jpg
new file mode 100644
index 0000000..48b480b
Binary files /dev/null and b/Apps/XinDianTu/Images/3069bfa5-6498-4efd-90e7-c333b538b319.jpg differ
diff --git a/Apps/XinDianTu/Images/3084da95-e3af-462e-8357-d1ae35b11927.jpg b/Apps/XinDianTu/Images/3084da95-e3af-462e-8357-d1ae35b11927.jpg
new file mode 100644
index 0000000..5ac9c2d
Binary files /dev/null and b/Apps/XinDianTu/Images/3084da95-e3af-462e-8357-d1ae35b11927.jpg differ
diff --git a/Apps/XinDianTu/Images/30b8385a-d032-4cfa-a9c5-65b2c16fae3b.jpg b/Apps/XinDianTu/Images/30b8385a-d032-4cfa-a9c5-65b2c16fae3b.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/30b8385a-d032-4cfa-a9c5-65b2c16fae3b.jpg differ
diff --git a/Apps/XinDianTu/Images/30e4f92e-488e-4bbf-909f-efa6ad653a40.jpg b/Apps/XinDianTu/Images/30e4f92e-488e-4bbf-909f-efa6ad653a40.jpg
new file mode 100644
index 0000000..739aee0
Binary files /dev/null and b/Apps/XinDianTu/Images/30e4f92e-488e-4bbf-909f-efa6ad653a40.jpg differ
diff --git a/Apps/XinDianTu/Images/310f731c-c44e-446b-a5ef-53c3e0101055.jpg b/Apps/XinDianTu/Images/310f731c-c44e-446b-a5ef-53c3e0101055.jpg
new file mode 100644
index 0000000..a087bda
Binary files /dev/null and b/Apps/XinDianTu/Images/310f731c-c44e-446b-a5ef-53c3e0101055.jpg differ
diff --git a/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107.jpg b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107.jpg
new file mode 100644
index 0000000..34eea98
Binary files /dev/null and b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107.jpg differ
diff --git a/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107.json b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107.json
new file mode 100644
index 0000000..986f6b4
--- /dev/null
+++ b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107.json
@@ -0,0 +1,59 @@
+{
+ "image": "312075ce-f823-4e52-8e39-dcb36405e107.jpg",
+ "width": 720,
+ "height": 210,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 607
+ ],
+ "click_point": [
+ 121,
+ 444
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 616,
+ 700,
+ 862
+ ],
+ "click_point": [
+ 121,
+ 665
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 876,
+ 700,
+ 1150
+ ],
+ "click_point": [
+ 121,
+ 930
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1164,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1206
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107_flag.jpg b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107_flag.jpg
new file mode 100644
index 0000000..27b2f27
Binary files /dev/null and b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107_vl.jpg b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107_vl.jpg
new file mode 100644
index 0000000..bd88f55
Binary files /dev/null and b/Apps/XinDianTu/Images/312075ce-f823-4e52-8e39-dcb36405e107_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_1.jpg b/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_1.jpg
new file mode 100644
index 0000000..503df6d
Binary files /dev/null and b/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_2.jpg b/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_2.jpg
new file mode 100644
index 0000000..c58b787
Binary files /dev/null and b/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_3.jpg b/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_3.jpg
new file mode 100644
index 0000000..de6cbc3
Binary files /dev/null and b/Apps/XinDianTu/Images/3141a2ef40757d810bed6e5857f147d9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421.jpg b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421.jpg
new file mode 100644
index 0000000..fb5a240
Binary files /dev/null and b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421.jpg differ
diff --git a/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421.json b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421.json
new file mode 100644
index 0000000..3c1a700
--- /dev/null
+++ b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421.json
@@ -0,0 +1,59 @@
+{
+ "image": "318c0c1b-b109-465e-aa1f-0aab45231421.jpg",
+ "width": 720,
+ "height": 216,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 596
+ ],
+ "click_point": [
+ 121,
+ 442
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 610,
+ 700,
+ 884
+ ],
+ "click_point": [
+ 121,
+ 664
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 898,
+ 700,
+ 1144
+ ],
+ "click_point": [
+ 121,
+ 947
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1158,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1201
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421_flag.jpg b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421_flag.jpg
new file mode 100644
index 0000000..f1a8e9d
Binary files /dev/null and b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421_vl.jpg b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421_vl.jpg
new file mode 100644
index 0000000..b56e533
Binary files /dev/null and b/Apps/XinDianTu/Images/318c0c1b-b109-465e-aa1f-0aab45231421_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/31ada685-6fba-4d7c-b894-434026bb37d4.jpg b/Apps/XinDianTu/Images/31ada685-6fba-4d7c-b894-434026bb37d4.jpg
new file mode 100644
index 0000000..60c42a7
Binary files /dev/null and b/Apps/XinDianTu/Images/31ada685-6fba-4d7c-b894-434026bb37d4.jpg differ
diff --git a/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_1.jpg b/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_1.jpg
new file mode 100644
index 0000000..fe2a5c3
Binary files /dev/null and b/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_2.jpg b/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_2.jpg
new file mode 100644
index 0000000..6a68867
Binary files /dev/null and b/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_3.jpg b/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_3.jpg
new file mode 100644
index 0000000..ae48002
Binary files /dev/null and b/Apps/XinDianTu/Images/31f2659eec061c2361f31bd1513019e8_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/32781951-4c03-4db4-a801-791d25d0c3d7.jpg b/Apps/XinDianTu/Images/32781951-4c03-4db4-a801-791d25d0c3d7.jpg
new file mode 100644
index 0000000..66a0a50
Binary files /dev/null and b/Apps/XinDianTu/Images/32781951-4c03-4db4-a801-791d25d0c3d7.jpg differ
diff --git a/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_1.jpg b/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_1.jpg
new file mode 100644
index 0000000..fd24de1
Binary files /dev/null and b/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_2.jpg b/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_2.jpg
new file mode 100644
index 0000000..cdff85f
Binary files /dev/null and b/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_3.jpg b/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_3.jpg
new file mode 100644
index 0000000..79398d9
Binary files /dev/null and b/Apps/XinDianTu/Images/32b629c84d7b5a0d4d1aaa3b5f646cc2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/32d5b959-6668-40f1-9015-b9f4ed21b741.jpg b/Apps/XinDianTu/Images/32d5b959-6668-40f1-9015-b9f4ed21b741.jpg
new file mode 100644
index 0000000..4a6d105
Binary files /dev/null and b/Apps/XinDianTu/Images/32d5b959-6668-40f1-9015-b9f4ed21b741.jpg differ
diff --git a/Apps/XinDianTu/Images/33476cf8-d9e3-4685-852b-38b587e701c1.jpg b/Apps/XinDianTu/Images/33476cf8-d9e3-4685-852b-38b587e701c1.jpg
new file mode 100644
index 0000000..1e604f5
Binary files /dev/null and b/Apps/XinDianTu/Images/33476cf8-d9e3-4685-852b-38b587e701c1.jpg differ
diff --git a/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e.jpg b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e.jpg
new file mode 100644
index 0000000..3a45c6b
Binary files /dev/null and b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e.jpg differ
diff --git a/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e.json b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e.json
new file mode 100644
index 0000000..acaa84e
--- /dev/null
+++ b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e.json
@@ -0,0 +1,46 @@
+{
+ "image": "33542fa5-77a4-4c8e-91e5-b12e1722728e.jpg",
+ "width": 720,
+ "height": 241,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 481,
+ 700,
+ 727
+ ],
+ "click_point": [
+ 121,
+ 530
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 740,
+ 700,
+ 1015
+ ],
+ "click_point": [
+ 121,
+ 795
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1028,
+ 700,
+ 1269
+ ],
+ "click_point": [
+ 121,
+ 1076
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e_flag.jpg b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e_flag.jpg
new file mode 100644
index 0000000..938ae52
Binary files /dev/null and b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e_vl.jpg b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e_vl.jpg
new file mode 100644
index 0000000..595cb9c
Binary files /dev/null and b/Apps/XinDianTu/Images/33542fa5-77a4-4c8e-91e5-b12e1722728e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/33ad73eb-2f4f-48d1-9315-e54f71b5737b.jpg b/Apps/XinDianTu/Images/33ad73eb-2f4f-48d1-9315-e54f71b5737b.jpg
new file mode 100644
index 0000000..4a5ef20
Binary files /dev/null and b/Apps/XinDianTu/Images/33ad73eb-2f4f-48d1-9315-e54f71b5737b.jpg differ
diff --git a/Apps/XinDianTu/Images/3415debd-ccca-4ba8-9ce0-837606820db7.jpg b/Apps/XinDianTu/Images/3415debd-ccca-4ba8-9ce0-837606820db7.jpg
new file mode 100644
index 0000000..b0301b8
Binary files /dev/null and b/Apps/XinDianTu/Images/3415debd-ccca-4ba8-9ce0-837606820db7.jpg differ
diff --git a/Apps/XinDianTu/Images/348dc972-e6ec-4f24-a4c2-5b23c5636418.jpg b/Apps/XinDianTu/Images/348dc972-e6ec-4f24-a4c2-5b23c5636418.jpg
new file mode 100644
index 0000000..30b4450
Binary files /dev/null and b/Apps/XinDianTu/Images/348dc972-e6ec-4f24-a4c2-5b23c5636418.jpg differ
diff --git a/Apps/XinDianTu/Images/349a7215-25c8-41d0-91fd-bf818cc81d26.jpg b/Apps/XinDianTu/Images/349a7215-25c8-41d0-91fd-bf818cc81d26.jpg
new file mode 100644
index 0000000..661b46f
Binary files /dev/null and b/Apps/XinDianTu/Images/349a7215-25c8-41d0-91fd-bf818cc81d26.jpg differ
diff --git a/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5.jpg b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5.jpg
new file mode 100644
index 0000000..ff9b0c3
Binary files /dev/null and b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5.jpg differ
diff --git a/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5.json b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5.json
new file mode 100644
index 0000000..7184c8a
--- /dev/null
+++ b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5.json
@@ -0,0 +1,59 @@
+{
+ "image": "34b7570d-88ca-4b27-9732-340ab08ad1b5.jpg",
+ "width": 720,
+ "height": 226,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 615
+ ],
+ "click_point": [
+ 121,
+ 446
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 628,
+ 700,
+ 876
+ ],
+ "click_point": [
+ 121,
+ 677
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 889,
+ 700,
+ 1135
+ ],
+ "click_point": [
+ 121,
+ 938
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1148,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1193
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5_flag.jpg b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5_flag.jpg
new file mode 100644
index 0000000..92312d6
Binary files /dev/null and b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5_vl.jpg b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5_vl.jpg
new file mode 100644
index 0000000..5cbbbcf
Binary files /dev/null and b/Apps/XinDianTu/Images/34b7570d-88ca-4b27-9732-340ab08ad1b5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc.jpg b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc.jpg
new file mode 100644
index 0000000..e447585
Binary files /dev/null and b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc.jpg differ
diff --git a/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc.json b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc.json
new file mode 100644
index 0000000..3778227
--- /dev/null
+++ b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc.json
@@ -0,0 +1,46 @@
+{
+ "image": "3544ba39-533e-40f0-a808-edd7643e78fc.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 563,
+ 700,
+ 812
+ ],
+ "click_point": [
+ 121,
+ 612
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 820,
+ 700,
+ 1069
+ ],
+ "click_point": [
+ 121,
+ 869
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1083,
+ 700,
+ 1332
+ ],
+ "click_point": [
+ 121,
+ 1132
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc_flag.jpg b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc_flag.jpg
new file mode 100644
index 0000000..209bdf6
Binary files /dev/null and b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc_vl.jpg b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc_vl.jpg
new file mode 100644
index 0000000..e77620b
Binary files /dev/null and b/Apps/XinDianTu/Images/3544ba39-533e-40f0-a808-edd7643e78fc_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76.jpg b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76.jpg
new file mode 100644
index 0000000..a1f3191
Binary files /dev/null and b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76.jpg differ
diff --git a/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76.json b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76.json
new file mode 100644
index 0000000..da75737
--- /dev/null
+++ b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76.json
@@ -0,0 +1,46 @@
+{
+ "image": "35a7cd50-54a9-40d4-8419-013eda396c76.jpg",
+ "width": 720,
+ "height": 101,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 505,
+ 700,
+ 756
+ ],
+ "click_point": [
+ 121,
+ 555
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 770,
+ 700,
+ 1056
+ ],
+ "click_point": [
+ 121,
+ 827
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1065,
+ 700,
+ 1264
+ ],
+ "click_point": [
+ 121,
+ 1104
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76_flag.jpg b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76_flag.jpg
new file mode 100644
index 0000000..68a77a6
Binary files /dev/null and b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76_vl.jpg b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76_vl.jpg
new file mode 100644
index 0000000..98e944b
Binary files /dev/null and b/Apps/XinDianTu/Images/35a7cd50-54a9-40d4-8419-013eda396c76_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_1.jpg b/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_1.jpg
new file mode 100644
index 0000000..7afebb5
Binary files /dev/null and b/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_2.jpg b/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_2.jpg
new file mode 100644
index 0000000..20aec8c
Binary files /dev/null and b/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_3.jpg b/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_3.jpg
new file mode 100644
index 0000000..7cb3c03
Binary files /dev/null and b/Apps/XinDianTu/Images/35fe44301197b5bf8a54ecb54c688481_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595.jpg b/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595.jpg
new file mode 100644
index 0000000..a3d4fe7
Binary files /dev/null and b/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595.jpg differ
diff --git a/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595_flag.jpg b/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595_flag.jpg
new file mode 100644
index 0000000..81f5e77
Binary files /dev/null and b/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595_vl.jpg b/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595_vl.jpg
new file mode 100644
index 0000000..9fd8321
Binary files /dev/null and b/Apps/XinDianTu/Images/36048be3-a3f2-4084-8ba4-08e4dff07595_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/365dba7b-3226-4b0e-9f87-1f858c16f962.jpg b/Apps/XinDianTu/Images/365dba7b-3226-4b0e-9f87-1f858c16f962.jpg
new file mode 100644
index 0000000..e1cd19c
Binary files /dev/null and b/Apps/XinDianTu/Images/365dba7b-3226-4b0e-9f87-1f858c16f962.jpg differ
diff --git a/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71.jpg b/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71.jpg
new file mode 100644
index 0000000..287c569
Binary files /dev/null and b/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71.jpg differ
diff --git a/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71_flag.jpg b/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71_flag.jpg
new file mode 100644
index 0000000..d932e8d
Binary files /dev/null and b/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71_vl.jpg b/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71_vl.jpg
new file mode 100644
index 0000000..58df70b
Binary files /dev/null and b/Apps/XinDianTu/Images/36c4f387-7488-4e80-9e80-3fe2610fde71_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/36fd34d8-ae12-4467-950a-58dc1d0a1e70.jpg b/Apps/XinDianTu/Images/36fd34d8-ae12-4467-950a-58dc1d0a1e70.jpg
new file mode 100644
index 0000000..ba556c1
Binary files /dev/null and b/Apps/XinDianTu/Images/36fd34d8-ae12-4467-950a-58dc1d0a1e70.jpg differ
diff --git a/Apps/XinDianTu/Images/36ff278d-b85c-40e2-85ae-3119e75345b2.jpg b/Apps/XinDianTu/Images/36ff278d-b85c-40e2-85ae-3119e75345b2.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/36ff278d-b85c-40e2-85ae-3119e75345b2.jpg differ
diff --git a/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524.jpg b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524.jpg
new file mode 100644
index 0000000..bab5389
Binary files /dev/null and b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524.jpg differ
diff --git a/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524.json b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524.json
new file mode 100644
index 0000000..c548962
--- /dev/null
+++ b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524.json
@@ -0,0 +1,46 @@
+{
+ "image": "370037fe-360b-4a7d-8440-c2d6d7d61524.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 570,
+ 700,
+ 816
+ ],
+ "click_point": [
+ 121,
+ 619
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 825,
+ 700,
+ 1076
+ ],
+ "click_point": [
+ 121,
+ 875
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1090,
+ 700,
+ 1336
+ ],
+ "click_point": [
+ 121,
+ 1139
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524_flag.jpg b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524_flag.jpg
new file mode 100644
index 0000000..6a4c4cd
Binary files /dev/null and b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524_vl.jpg b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524_vl.jpg
new file mode 100644
index 0000000..658d78b
Binary files /dev/null and b/Apps/XinDianTu/Images/370037fe-360b-4a7d-8440-c2d6d7d61524_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_1.jpg b/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_1.jpg
new file mode 100644
index 0000000..28c0703
Binary files /dev/null and b/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_2.jpg b/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_2.jpg
new file mode 100644
index 0000000..9194231
Binary files /dev/null and b/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_3.jpg b/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_3.jpg
new file mode 100644
index 0000000..d630cd6
Binary files /dev/null and b/Apps/XinDianTu/Images/371ebbd47ac3d1f5f647de65cf8c5f68_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_1.jpg b/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_1.jpg
new file mode 100644
index 0000000..aaf6cf4
Binary files /dev/null and b/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_2.jpg b/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_2.jpg
new file mode 100644
index 0000000..f2ef9b5
Binary files /dev/null and b/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_3.jpg b/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_3.jpg
new file mode 100644
index 0000000..77f8b15
Binary files /dev/null and b/Apps/XinDianTu/Images/372a872c213d229da28a9d8c298739b6_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44.jpg b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44.jpg
new file mode 100644
index 0000000..e4fba0c
Binary files /dev/null and b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44.jpg differ
diff --git a/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44.json b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44.json
new file mode 100644
index 0000000..6ab59a4
--- /dev/null
+++ b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44.json
@@ -0,0 +1,46 @@
+{
+ "image": "3752e811-5ffb-4b28-8a7f-fa2195570d44.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 420,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 482
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44_flag.jpg b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44_flag.jpg
new file mode 100644
index 0000000..07d223f
Binary files /dev/null and b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44_vl.jpg b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44_vl.jpg
new file mode 100644
index 0000000..9dc977b
Binary files /dev/null and b/Apps/XinDianTu/Images/3752e811-5ffb-4b28-8a7f-fa2195570d44_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/37950833-2cd4-4dd8-8af7-5cd1ca1c7e6b.jpg b/Apps/XinDianTu/Images/37950833-2cd4-4dd8-8af7-5cd1ca1c7e6b.jpg
new file mode 100644
index 0000000..1f5634a
Binary files /dev/null and b/Apps/XinDianTu/Images/37950833-2cd4-4dd8-8af7-5cd1ca1c7e6b.jpg differ
diff --git a/Apps/XinDianTu/Images/3801be6a-bf76-456d-9b16-02a7c4ce9959.jpg b/Apps/XinDianTu/Images/3801be6a-bf76-456d-9b16-02a7c4ce9959.jpg
new file mode 100644
index 0000000..ce0be01
Binary files /dev/null and b/Apps/XinDianTu/Images/3801be6a-bf76-456d-9b16-02a7c4ce9959.jpg differ
diff --git a/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_1.jpg b/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_1.jpg
new file mode 100644
index 0000000..82c3b1e
Binary files /dev/null and b/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_2.jpg b/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_2.jpg
new file mode 100644
index 0000000..edf84b0
Binary files /dev/null and b/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_3.jpg b/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_3.jpg
new file mode 100644
index 0000000..a445b5f
Binary files /dev/null and b/Apps/XinDianTu/Images/3819253d16da8a9fba1bd4ee8fca8f60_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3887d639-dc4c-4017-9eed-330aaf972c06.jpg b/Apps/XinDianTu/Images/3887d639-dc4c-4017-9eed-330aaf972c06.jpg
new file mode 100644
index 0000000..9b499d6
Binary files /dev/null and b/Apps/XinDianTu/Images/3887d639-dc4c-4017-9eed-330aaf972c06.jpg differ
diff --git a/Apps/XinDianTu/Images/3900d4d9-f1cf-435c-88c8-69f9190ce3e7.jpg b/Apps/XinDianTu/Images/3900d4d9-f1cf-435c-88c8-69f9190ce3e7.jpg
new file mode 100644
index 0000000..4c95239
Binary files /dev/null and b/Apps/XinDianTu/Images/3900d4d9-f1cf-435c-88c8-69f9190ce3e7.jpg differ
diff --git a/Apps/XinDianTu/Images/3961e2f3-ac95-4936-b757-a6651f97b896.jpg b/Apps/XinDianTu/Images/3961e2f3-ac95-4936-b757-a6651f97b896.jpg
new file mode 100644
index 0000000..10f8498
Binary files /dev/null and b/Apps/XinDianTu/Images/3961e2f3-ac95-4936-b757-a6651f97b896.jpg differ
diff --git a/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_1.jpg b/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_1.jpg
new file mode 100644
index 0000000..36359b6
Binary files /dev/null and b/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_2.jpg b/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_2.jpg
new file mode 100644
index 0000000..4baf39b
Binary files /dev/null and b/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_3.jpg b/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_3.jpg
new file mode 100644
index 0000000..22e9594
Binary files /dev/null and b/Apps/XinDianTu/Images/39d86c5ca5f561e2cb728db522fce3f0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.jpg b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.jpg
new file mode 100644
index 0000000..997e766
Binary files /dev/null and b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.jpg differ
diff --git a/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.json b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.json
new file mode 100644
index 0000000..55bad35
--- /dev/null
+++ b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.json
@@ -0,0 +1,59 @@
+{
+ "image": "39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec.jpg",
+ "width": 720,
+ "height": 194,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 403,
+ 700,
+ 647
+ ],
+ "click_point": [
+ 121,
+ 451
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 660,
+ 700,
+ 908
+ ],
+ "click_point": [
+ 121,
+ 709
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 921,
+ 700,
+ 1167
+ ],
+ "click_point": [
+ 121,
+ 970
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1180,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1218
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec_flag.jpg b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec_flag.jpg
new file mode 100644
index 0000000..8c1cb8f
Binary files /dev/null and b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec_vl.jpg b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec_vl.jpg
new file mode 100644
index 0000000..2513b1d
Binary files /dev/null and b/Apps/XinDianTu/Images/39faa7ba-c3ff-4ea9-b15d-8a3f02e62dec_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3a07d9bc-0962-4cb6-8f14-32fe00ecaa78.jpg b/Apps/XinDianTu/Images/3a07d9bc-0962-4cb6-8f14-32fe00ecaa78.jpg
new file mode 100644
index 0000000..faedb09
Binary files /dev/null and b/Apps/XinDianTu/Images/3a07d9bc-0962-4cb6-8f14-32fe00ecaa78.jpg differ
diff --git a/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_1.jpg b/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_1.jpg
new file mode 100644
index 0000000..1e1bc2e
Binary files /dev/null and b/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_2.jpg b/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_2.jpg
new file mode 100644
index 0000000..702ec9e
Binary files /dev/null and b/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_3.jpg b/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_3.jpg
new file mode 100644
index 0000000..151962c
Binary files /dev/null and b/Apps/XinDianTu/Images/3a27c15881b8b8ae8fd14ea6c8813311_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_1.jpg b/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_1.jpg
new file mode 100644
index 0000000..f3dea37
Binary files /dev/null and b/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_2.jpg b/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_2.jpg
new file mode 100644
index 0000000..24fce26
Binary files /dev/null and b/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_3.jpg b/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_3.jpg
new file mode 100644
index 0000000..1c86a1d
Binary files /dev/null and b/Apps/XinDianTu/Images/3a2f7d16ce4a3bfd9e64cb06feab0c00_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b.jpg b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b.jpg
new file mode 100644
index 0000000..2699bb3
Binary files /dev/null and b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b.jpg differ
diff --git a/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b.json b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b.json
new file mode 100644
index 0000000..5bd1f98
--- /dev/null
+++ b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b.json
@@ -0,0 +1,46 @@
+{
+ "image": "3a7b18f0-7999-487e-93f9-4812cb01c39b.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 444,
+ 700,
+ 733
+ ],
+ "click_point": [
+ 121,
+ 501
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 746,
+ 700,
+ 1021
+ ],
+ "click_point": [
+ 121,
+ 801
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1035,
+ 700,
+ 1284
+ ],
+ "click_point": [
+ 121,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b_flag.jpg b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b_flag.jpg
new file mode 100644
index 0000000..0432f05
Binary files /dev/null and b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b_vl.jpg b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b_vl.jpg
new file mode 100644
index 0000000..4629674
Binary files /dev/null and b/Apps/XinDianTu/Images/3a7b18f0-7999-487e-93f9-4812cb01c39b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3a8efa14-0642-4bc4-a5e0-d1f711d2110b.jpg b/Apps/XinDianTu/Images/3a8efa14-0642-4bc4-a5e0-d1f711d2110b.jpg
new file mode 100644
index 0000000..b6a0ee9
Binary files /dev/null and b/Apps/XinDianTu/Images/3a8efa14-0642-4bc4-a5e0-d1f711d2110b.jpg differ
diff --git a/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.jpg b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.jpg
new file mode 100644
index 0000000..39a53f5
Binary files /dev/null and b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.jpg differ
diff --git a/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.json b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.json
new file mode 100644
index 0000000..4a4ba26
--- /dev/null
+++ b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.json
@@ -0,0 +1,46 @@
+{
+ "image": "3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0.jpg",
+ "width": 720,
+ "height": 300,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 554,
+ 700,
+ 800
+ ],
+ "click_point": [
+ 121,
+ 603
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 809,
+ 700,
+ 1060
+ ],
+ "click_point": [
+ 121,
+ 859
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1074,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1134
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0_flag.jpg b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0_flag.jpg
new file mode 100644
index 0000000..dea3245
Binary files /dev/null and b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0_vl.jpg b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0_vl.jpg
new file mode 100644
index 0000000..937c22e
Binary files /dev/null and b/Apps/XinDianTu/Images/3ae9284e-5c0d-4d13-bf00-49bf6d19fcb0_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3b1f812d-c5e8-4f97-9f8f-aa5c54fdf540.jpg b/Apps/XinDianTu/Images/3b1f812d-c5e8-4f97-9f8f-aa5c54fdf540.jpg
new file mode 100644
index 0000000..191f94f
Binary files /dev/null and b/Apps/XinDianTu/Images/3b1f812d-c5e8-4f97-9f8f-aa5c54fdf540.jpg differ
diff --git a/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_1.jpg b/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_1.jpg
new file mode 100644
index 0000000..be6b243
Binary files /dev/null and b/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_2.jpg b/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_2.jpg
new file mode 100644
index 0000000..ab6a02d
Binary files /dev/null and b/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_3.jpg b/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_3.jpg
new file mode 100644
index 0000000..19d1c97
Binary files /dev/null and b/Apps/XinDianTu/Images/3b3736efdb165309b51905d6b23168b6_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3b702ad0-edd0-49b3-b97a-f5681532d5a9.jpg b/Apps/XinDianTu/Images/3b702ad0-edd0-49b3-b97a-f5681532d5a9.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/3b702ad0-edd0-49b3-b97a-f5681532d5a9.jpg differ
diff --git a/Apps/XinDianTu/Images/3b8f37bd-943a-4133-83a4-a2e802514cd6.jpg b/Apps/XinDianTu/Images/3b8f37bd-943a-4133-83a4-a2e802514cd6.jpg
new file mode 100644
index 0000000..bc2035a
Binary files /dev/null and b/Apps/XinDianTu/Images/3b8f37bd-943a-4133-83a4-a2e802514cd6.jpg differ
diff --git a/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628.jpg b/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628.jpg
new file mode 100644
index 0000000..19a0f85
Binary files /dev/null and b/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628.jpg differ
diff --git a/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628_flag.jpg b/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628_flag.jpg
new file mode 100644
index 0000000..36e710c
Binary files /dev/null and b/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628_vl.jpg b/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628_vl.jpg
new file mode 100644
index 0000000..b373a6a
Binary files /dev/null and b/Apps/XinDianTu/Images/3b975610-8d11-446d-96ac-60e546a60628_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_1.jpg b/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_1.jpg
new file mode 100644
index 0000000..eb764c6
Binary files /dev/null and b/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_2.jpg b/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_2.jpg
new file mode 100644
index 0000000..bda4cca
Binary files /dev/null and b/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_3.jpg b/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_3.jpg
new file mode 100644
index 0000000..9171709
Binary files /dev/null and b/Apps/XinDianTu/Images/3b9ef1c2e37fe3df2a3b9d578246a77c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_1.jpg b/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_1.jpg
new file mode 100644
index 0000000..f9e5a39
Binary files /dev/null and b/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_2.jpg b/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_2.jpg
new file mode 100644
index 0000000..84f90aa
Binary files /dev/null and b/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_3.jpg b/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_3.jpg
new file mode 100644
index 0000000..08e1e09
Binary files /dev/null and b/Apps/XinDianTu/Images/3bc721c862950803c106a29f36570095_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9.jpg b/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9.jpg
new file mode 100644
index 0000000..ef0b4ba
Binary files /dev/null and b/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9.jpg differ
diff --git a/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9_flag.jpg b/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9_flag.jpg
new file mode 100644
index 0000000..02fea09
Binary files /dev/null and b/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9_vl.jpg b/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9_vl.jpg
new file mode 100644
index 0000000..e5158b6
Binary files /dev/null and b/Apps/XinDianTu/Images/3c9d515d-1480-4979-929d-527ccdbc54b9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3caeef31-6342-457f-9ca0-c4faae810ab5.jpg b/Apps/XinDianTu/Images/3caeef31-6342-457f-9ca0-c4faae810ab5.jpg
new file mode 100644
index 0000000..4abcf96
Binary files /dev/null and b/Apps/XinDianTu/Images/3caeef31-6342-457f-9ca0-c4faae810ab5.jpg differ
diff --git a/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_1.jpg b/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_1.jpg
new file mode 100644
index 0000000..51248e3
Binary files /dev/null and b/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_2.jpg b/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_2.jpg
new file mode 100644
index 0000000..d0f41fa
Binary files /dev/null and b/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_3.jpg b/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_3.jpg
new file mode 100644
index 0000000..d249849
Binary files /dev/null and b/Apps/XinDianTu/Images/3cc33368ea4a48998b9614d11be4b685_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_1.jpg b/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_1.jpg
new file mode 100644
index 0000000..4b1475f
Binary files /dev/null and b/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_2.jpg b/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_2.jpg
new file mode 100644
index 0000000..e228515
Binary files /dev/null and b/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_3.jpg b/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_3.jpg
new file mode 100644
index 0000000..d5b612f
Binary files /dev/null and b/Apps/XinDianTu/Images/3d371e6cf37922d5ef28d1181e230870_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c.jpg b/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c.jpg
new file mode 100644
index 0000000..f85fdce
Binary files /dev/null and b/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c.jpg differ
diff --git a/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c_flag.jpg b/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c_flag.jpg
new file mode 100644
index 0000000..d741fc7
Binary files /dev/null and b/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c_vl.jpg b/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c_vl.jpg
new file mode 100644
index 0000000..df9ea8f
Binary files /dev/null and b/Apps/XinDianTu/Images/3d5c172f-3ac8-4afb-a0dc-80ab62e53d5c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.jpg b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.jpg
new file mode 100644
index 0000000..262a0f1
Binary files /dev/null and b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.jpg differ
diff --git a/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.json b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.json
new file mode 100644
index 0000000..a6bedde
--- /dev/null
+++ b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.json
@@ -0,0 +1,33 @@
+{
+ "image": "3d76ecf4-df6f-4023-8b53-ccc08e0a88bd.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd_flag.jpg b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd_flag.jpg
new file mode 100644
index 0000000..d97863a
Binary files /dev/null and b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd_vl.jpg b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd_vl.jpg
new file mode 100644
index 0000000..083133c
Binary files /dev/null and b/Apps/XinDianTu/Images/3d76ecf4-df6f-4023-8b53-ccc08e0a88bd_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_1.jpg b/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_1.jpg
new file mode 100644
index 0000000..ed0adf1
Binary files /dev/null and b/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_2.jpg b/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_2.jpg
new file mode 100644
index 0000000..25b8669
Binary files /dev/null and b/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_3.jpg b/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_3.jpg
new file mode 100644
index 0000000..732a547
Binary files /dev/null and b/Apps/XinDianTu/Images/3e1bce2fdf00c344e8fa6c8145a21352_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3e35feb3-26cf-44a7-9199-8b2b5d4c7938.jpg b/Apps/XinDianTu/Images/3e35feb3-26cf-44a7-9199-8b2b5d4c7938.jpg
new file mode 100644
index 0000000..a8b260c
Binary files /dev/null and b/Apps/XinDianTu/Images/3e35feb3-26cf-44a7-9199-8b2b5d4c7938.jpg differ
diff --git a/Apps/XinDianTu/Images/3e5b9de6-936d-48e3-8347-590d1a3d811b.jpg b/Apps/XinDianTu/Images/3e5b9de6-936d-48e3-8347-590d1a3d811b.jpg
new file mode 100644
index 0000000..191f94f
Binary files /dev/null and b/Apps/XinDianTu/Images/3e5b9de6-936d-48e3-8347-590d1a3d811b.jpg differ
diff --git a/Apps/XinDianTu/Images/3e8fcf10-ee6e-4aa8-8380-42a39b047628.jpg b/Apps/XinDianTu/Images/3e8fcf10-ee6e-4aa8-8380-42a39b047628.jpg
new file mode 100644
index 0000000..136d8d7
Binary files /dev/null and b/Apps/XinDianTu/Images/3e8fcf10-ee6e-4aa8-8380-42a39b047628.jpg differ
diff --git a/Apps/XinDianTu/Images/3e982128-e9b0-478b-b9f2-aefb5a9d017e.jpg b/Apps/XinDianTu/Images/3e982128-e9b0-478b-b9f2-aefb5a9d017e.jpg
new file mode 100644
index 0000000..d3245cd
Binary files /dev/null and b/Apps/XinDianTu/Images/3e982128-e9b0-478b-b9f2-aefb5a9d017e.jpg differ
diff --git a/Apps/XinDianTu/Images/3e9e40d8-cb1a-4d0c-9087-1b63d494d893.jpg b/Apps/XinDianTu/Images/3e9e40d8-cb1a-4d0c-9087-1b63d494d893.jpg
new file mode 100644
index 0000000..cfb2989
Binary files /dev/null and b/Apps/XinDianTu/Images/3e9e40d8-cb1a-4d0c-9087-1b63d494d893.jpg differ
diff --git a/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_1.jpg b/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_1.jpg
new file mode 100644
index 0000000..b279d2f
Binary files /dev/null and b/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_2.jpg b/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_2.jpg
new file mode 100644
index 0000000..c480c7b
Binary files /dev/null and b/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_3.jpg b/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_3.jpg
new file mode 100644
index 0000000..f87b385
Binary files /dev/null and b/Apps/XinDianTu/Images/3ef63bf91d829ed31f42db4b11183518_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/3f0b8312-6388-4b54-be34-299fd8b85798.jpg b/Apps/XinDianTu/Images/3f0b8312-6388-4b54-be34-299fd8b85798.jpg
new file mode 100644
index 0000000..d678452
Binary files /dev/null and b/Apps/XinDianTu/Images/3f0b8312-6388-4b54-be34-299fd8b85798.jpg differ
diff --git a/Apps/XinDianTu/Images/3f0f103a-f4d1-498b-9df4-31b6d4a47439.jpg b/Apps/XinDianTu/Images/3f0f103a-f4d1-498b-9df4-31b6d4a47439.jpg
new file mode 100644
index 0000000..60a028d
Binary files /dev/null and b/Apps/XinDianTu/Images/3f0f103a-f4d1-498b-9df4-31b6d4a47439.jpg differ
diff --git a/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157.jpg b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157.jpg
new file mode 100644
index 0000000..dabe407
Binary files /dev/null and b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157.jpg differ
diff --git a/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157.json b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157.json
new file mode 100644
index 0000000..738d915
--- /dev/null
+++ b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157.json
@@ -0,0 +1,46 @@
+{
+ "image": "3f1f4eaf-92b6-4866-a7dc-e22f16e55157.jpg",
+ "width": 720,
+ "height": 116,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 450,
+ 700,
+ 724
+ ],
+ "click_point": [
+ 121,
+ 504
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 738,
+ 700,
+ 984
+ ],
+ "click_point": [
+ 121,
+ 787
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 993,
+ 700,
+ 1244
+ ],
+ "click_point": [
+ 121,
+ 1043
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157_flag.jpg b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157_flag.jpg
new file mode 100644
index 0000000..c388e7d
Binary files /dev/null and b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157_vl.jpg b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157_vl.jpg
new file mode 100644
index 0000000..3e9fb4a
Binary files /dev/null and b/Apps/XinDianTu/Images/3f1f4eaf-92b6-4866-a7dc-e22f16e55157_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.jpg b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.jpg
new file mode 100644
index 0000000..7921e3d
Binary files /dev/null and b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.jpg differ
diff --git a/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.json b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.json
new file mode 100644
index 0000000..5763b30
--- /dev/null
+++ b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.json
@@ -0,0 +1,46 @@
+{
+ "image": "3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6.jpg",
+ "width": 720,
+ "height": 322,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 532,
+ 700,
+ 780
+ ],
+ "click_point": [
+ 121,
+ 581
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 793,
+ 700,
+ 1039
+ ],
+ "click_point": [
+ 121,
+ 842
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1052,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1116
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6_flag.jpg b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6_flag.jpg
new file mode 100644
index 0000000..791a193
Binary files /dev/null and b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6_vl.jpg b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6_vl.jpg
new file mode 100644
index 0000000..eb8cdf2
Binary files /dev/null and b/Apps/XinDianTu/Images/3f5b51ae-ac8a-43e2-ab64-c8191bc49ca6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/400d5e52-3ac7-4431-a313-28f76a142369.jpg b/Apps/XinDianTu/Images/400d5e52-3ac7-4431-a313-28f76a142369.jpg
new file mode 100644
index 0000000..0e6c22f
Binary files /dev/null and b/Apps/XinDianTu/Images/400d5e52-3ac7-4431-a313-28f76a142369.jpg differ
diff --git a/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f.jpg b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f.jpg
new file mode 100644
index 0000000..e6e5f86
Binary files /dev/null and b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f.jpg differ
diff --git a/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f.json b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f.json
new file mode 100644
index 0000000..525741e
--- /dev/null
+++ b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f.json
@@ -0,0 +1,46 @@
+{
+ "image": "4019e577-0d04-4c4a-8918-65c1be57561f.jpg",
+ "width": 720,
+ "height": 118,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 448,
+ 700,
+ 724
+ ],
+ "click_point": [
+ 121,
+ 503
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 737,
+ 700,
+ 983
+ ],
+ "click_point": [
+ 121,
+ 786
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 996,
+ 700,
+ 1244
+ ],
+ "click_point": [
+ 121,
+ 1045
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f_flag.jpg b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f_flag.jpg
new file mode 100644
index 0000000..e954a74
Binary files /dev/null and b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f_vl.jpg b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f_vl.jpg
new file mode 100644
index 0000000..3a19de0
Binary files /dev/null and b/Apps/XinDianTu/Images/4019e577-0d04-4c4a-8918-65c1be57561f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_1.jpg b/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_1.jpg
new file mode 100644
index 0000000..8bf3eb4
Binary files /dev/null and b/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_2.jpg b/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_2.jpg
new file mode 100644
index 0000000..5ca139a
Binary files /dev/null and b/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_3.jpg b/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_3.jpg
new file mode 100644
index 0000000..04103e1
Binary files /dev/null and b/Apps/XinDianTu/Images/404cec960fd9c44700e321cc89bf9668_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4078ad5b-59d4-4bb1-ad6e-d8ea18706c35.jpg b/Apps/XinDianTu/Images/4078ad5b-59d4-4bb1-ad6e-d8ea18706c35.jpg
new file mode 100644
index 0000000..8277f0f
Binary files /dev/null and b/Apps/XinDianTu/Images/4078ad5b-59d4-4bb1-ad6e-d8ea18706c35.jpg differ
diff --git a/Apps/XinDianTu/Images/408efd84-29e1-466f-832f-d4022d440ba4.jpg b/Apps/XinDianTu/Images/408efd84-29e1-466f-832f-d4022d440ba4.jpg
new file mode 100644
index 0000000..f987796
Binary files /dev/null and b/Apps/XinDianTu/Images/408efd84-29e1-466f-832f-d4022d440ba4.jpg differ
diff --git a/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854.jpg b/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854.jpg
new file mode 100644
index 0000000..51fbfe5
Binary files /dev/null and b/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854.jpg differ
diff --git a/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854_flag.jpg b/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854_flag.jpg
new file mode 100644
index 0000000..a46f1ea
Binary files /dev/null and b/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854_vl.jpg b/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854_vl.jpg
new file mode 100644
index 0000000..d164992
Binary files /dev/null and b/Apps/XinDianTu/Images/40aad3bd-37f6-44a9-9c78-91829bfe7854_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_1.jpg b/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_1.jpg
new file mode 100644
index 0000000..1db2ff4
Binary files /dev/null and b/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_2.jpg b/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_2.jpg
new file mode 100644
index 0000000..baa3544
Binary files /dev/null and b/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_3.jpg b/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_3.jpg
new file mode 100644
index 0000000..7a33a34
Binary files /dev/null and b/Apps/XinDianTu/Images/413ebbfd4b12ed5780999abf2fc32c31_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/41452967-430c-4b09-a573-c66cfea4a3dd.jpg b/Apps/XinDianTu/Images/41452967-430c-4b09-a573-c66cfea4a3dd.jpg
new file mode 100644
index 0000000..1795a9f
Binary files /dev/null and b/Apps/XinDianTu/Images/41452967-430c-4b09-a573-c66cfea4a3dd.jpg differ
diff --git a/Apps/XinDianTu/Images/41c64cb3-c1ef-4455-b09b-9dd2bae14829.jpg b/Apps/XinDianTu/Images/41c64cb3-c1ef-4455-b09b-9dd2bae14829.jpg
new file mode 100644
index 0000000..c88d42f
Binary files /dev/null and b/Apps/XinDianTu/Images/41c64cb3-c1ef-4455-b09b-9dd2bae14829.jpg differ
diff --git a/Apps/XinDianTu/Images/41d35ecd-5a0d-43fc-9d08-22b4b1025f40.jpg b/Apps/XinDianTu/Images/41d35ecd-5a0d-43fc-9d08-22b4b1025f40.jpg
new file mode 100644
index 0000000..234b9af
Binary files /dev/null and b/Apps/XinDianTu/Images/41d35ecd-5a0d-43fc-9d08-22b4b1025f40.jpg differ
diff --git a/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_1.jpg b/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_1.jpg
new file mode 100644
index 0000000..0eee5c8
Binary files /dev/null and b/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_2.jpg b/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_2.jpg
new file mode 100644
index 0000000..f39d437
Binary files /dev/null and b/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_3.jpg b/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_3.jpg
new file mode 100644
index 0000000..28bd1ce
Binary files /dev/null and b/Apps/XinDianTu/Images/41e0861901270870f9b8c31c459cfb86_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4217f121-581d-47c9-8ba5-c03b9be72644.jpg b/Apps/XinDianTu/Images/4217f121-581d-47c9-8ba5-c03b9be72644.jpg
new file mode 100644
index 0000000..6e8b6a5
Binary files /dev/null and b/Apps/XinDianTu/Images/4217f121-581d-47c9-8ba5-c03b9be72644.jpg differ
diff --git a/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088.jpg b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088.jpg
new file mode 100644
index 0000000..7277950
Binary files /dev/null and b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088.jpg differ
diff --git a/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088.json b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088.json
new file mode 100644
index 0000000..699e61c
--- /dev/null
+++ b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088.json
@@ -0,0 +1,46 @@
+{
+ "image": "42272eae-83f2-4594-9088-695e84cb3088.jpg",
+ "width": 720,
+ "height": 274,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 538,
+ 700,
+ 784
+ ],
+ "click_point": [
+ 121,
+ 587
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 793,
+ 700,
+ 1044
+ ],
+ "click_point": [
+ 121,
+ 843
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1058,
+ 700,
+ 1332
+ ],
+ "click_point": [
+ 121,
+ 1112
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088_flag.jpg b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088_flag.jpg
new file mode 100644
index 0000000..e3fa296
Binary files /dev/null and b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088_vl.jpg b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088_vl.jpg
new file mode 100644
index 0000000..85cb49f
Binary files /dev/null and b/Apps/XinDianTu/Images/42272eae-83f2-4594-9088-695e84cb3088_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38.jpg b/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38.jpg
new file mode 100644
index 0000000..7e00f08
Binary files /dev/null and b/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38.jpg differ
diff --git a/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38_flag.jpg b/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38_flag.jpg
new file mode 100644
index 0000000..d28a37e
Binary files /dev/null and b/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38_vl.jpg b/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38_vl.jpg
new file mode 100644
index 0000000..2c9bee1
Binary files /dev/null and b/Apps/XinDianTu/Images/42c0e7d8-1431-443c-b557-6e7b89db6a38_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_1.jpg b/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_1.jpg
new file mode 100644
index 0000000..b969556
Binary files /dev/null and b/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_2.jpg b/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_2.jpg
new file mode 100644
index 0000000..7c5d2d1
Binary files /dev/null and b/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_3.jpg b/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_3.jpg
new file mode 100644
index 0000000..2329c7c
Binary files /dev/null and b/Apps/XinDianTu/Images/430c7cfb669ef748f405db298869984e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/437dc6f5-96bc-468f-8aa3-cebbc86df194.jpg b/Apps/XinDianTu/Images/437dc6f5-96bc-468f-8aa3-cebbc86df194.jpg
new file mode 100644
index 0000000..eaf0264
Binary files /dev/null and b/Apps/XinDianTu/Images/437dc6f5-96bc-468f-8aa3-cebbc86df194.jpg differ
diff --git a/Apps/XinDianTu/Images/437f0d93-1044-451a-b1e2-96170ff5de5e.jpg b/Apps/XinDianTu/Images/437f0d93-1044-451a-b1e2-96170ff5de5e.jpg
new file mode 100644
index 0000000..bc37f7c
Binary files /dev/null and b/Apps/XinDianTu/Images/437f0d93-1044-451a-b1e2-96170ff5de5e.jpg differ
diff --git a/Apps/XinDianTu/Images/438f790d-1a92-4a4c-afc2-a51b97fed0c6.jpg b/Apps/XinDianTu/Images/438f790d-1a92-4a4c-afc2-a51b97fed0c6.jpg
new file mode 100644
index 0000000..5e6a153
Binary files /dev/null and b/Apps/XinDianTu/Images/438f790d-1a92-4a4c-afc2-a51b97fed0c6.jpg differ
diff --git a/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_1.jpg b/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_1.jpg
new file mode 100644
index 0000000..93f6699
Binary files /dev/null and b/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_2.jpg b/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_2.jpg
new file mode 100644
index 0000000..6bda667
Binary files /dev/null and b/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_3.jpg b/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_3.jpg
new file mode 100644
index 0000000..56165ed
Binary files /dev/null and b/Apps/XinDianTu/Images/43b32db8f9c7f59f6c81444a5fec617b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_1.jpg b/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_1.jpg
new file mode 100644
index 0000000..d7fbfc5
Binary files /dev/null and b/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_2.jpg b/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_2.jpg
new file mode 100644
index 0000000..aabcc2b
Binary files /dev/null and b/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_3.jpg b/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_3.jpg
new file mode 100644
index 0000000..69110a3
Binary files /dev/null and b/Apps/XinDianTu/Images/43c4f9efce82deed7bf23de5982e9a31_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/43e48da7-48bb-4c94-9652-869a280ddba9.jpg b/Apps/XinDianTu/Images/43e48da7-48bb-4c94-9652-869a280ddba9.jpg
new file mode 100644
index 0000000..5c311d8
Binary files /dev/null and b/Apps/XinDianTu/Images/43e48da7-48bb-4c94-9652-869a280ddba9.jpg differ
diff --git a/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_1.jpg b/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_1.jpg
new file mode 100644
index 0000000..77470ee
Binary files /dev/null and b/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_2.jpg b/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_2.jpg
new file mode 100644
index 0000000..6b543d6
Binary files /dev/null and b/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_3.jpg b/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_3.jpg
new file mode 100644
index 0000000..85f52b5
Binary files /dev/null and b/Apps/XinDianTu/Images/43f9144d236276db2c7cd8421aa29773_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_1.jpg b/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_1.jpg
new file mode 100644
index 0000000..9c3ec0c
Binary files /dev/null and b/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_2.jpg b/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_2.jpg
new file mode 100644
index 0000000..0a15919
Binary files /dev/null and b/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_3.jpg b/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_3.jpg
new file mode 100644
index 0000000..799655b
Binary files /dev/null and b/Apps/XinDianTu/Images/4401fa0cbb4188f9eccdfdb08f8d1590_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_1.jpg b/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_1.jpg
new file mode 100644
index 0000000..9fea8b9
Binary files /dev/null and b/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_2.jpg b/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_2.jpg
new file mode 100644
index 0000000..f4648f0
Binary files /dev/null and b/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_3.jpg b/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_3.jpg
new file mode 100644
index 0000000..2901505
Binary files /dev/null and b/Apps/XinDianTu/Images/441781a1119f18f4e1f0f544aa9212a2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/442ecaa6-cefb-4239-9fd5-8a871c7856c8.jpg b/Apps/XinDianTu/Images/442ecaa6-cefb-4239-9fd5-8a871c7856c8.jpg
new file mode 100644
index 0000000..b9acdcf
Binary files /dev/null and b/Apps/XinDianTu/Images/442ecaa6-cefb-4239-9fd5-8a871c7856c8.jpg differ
diff --git a/Apps/XinDianTu/Images/442f2595-3081-4551-a360-b2f7a91fe52b.jpg b/Apps/XinDianTu/Images/442f2595-3081-4551-a360-b2f7a91fe52b.jpg
new file mode 100644
index 0000000..a4213a8
Binary files /dev/null and b/Apps/XinDianTu/Images/442f2595-3081-4551-a360-b2f7a91fe52b.jpg differ
diff --git a/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_1.jpg b/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_1.jpg
new file mode 100644
index 0000000..13c2723
Binary files /dev/null and b/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_2.jpg b/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_2.jpg
new file mode 100644
index 0000000..786a24d
Binary files /dev/null and b/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_3.jpg b/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_3.jpg
new file mode 100644
index 0000000..a348677
Binary files /dev/null and b/Apps/XinDianTu/Images/4432f450d30b88b0f8c90ce87317e341_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4433873f-9535-4bb4-8af8-9b202187e9c1.jpg b/Apps/XinDianTu/Images/4433873f-9535-4bb4-8af8-9b202187e9c1.jpg
new file mode 100644
index 0000000..1608286
Binary files /dev/null and b/Apps/XinDianTu/Images/4433873f-9535-4bb4-8af8-9b202187e9c1.jpg differ
diff --git a/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_1.jpg b/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_1.jpg
new file mode 100644
index 0000000..5aef13b
Binary files /dev/null and b/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_2.jpg b/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_2.jpg
new file mode 100644
index 0000000..0437811
Binary files /dev/null and b/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_3.jpg b/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_3.jpg
new file mode 100644
index 0000000..fa0c380
Binary files /dev/null and b/Apps/XinDianTu/Images/4469ac9e0bac972fe2193280c7afd927_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/447ee3d8-9cd1-40e3-a160-a1d2177db0f9.jpg b/Apps/XinDianTu/Images/447ee3d8-9cd1-40e3-a160-a1d2177db0f9.jpg
new file mode 100644
index 0000000..01ff65e
Binary files /dev/null and b/Apps/XinDianTu/Images/447ee3d8-9cd1-40e3-a160-a1d2177db0f9.jpg differ
diff --git a/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56.jpg b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56.jpg
new file mode 100644
index 0000000..23c86c1
Binary files /dev/null and b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56.jpg differ
diff --git a/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56.json b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56.json
new file mode 100644
index 0000000..1f75110
--- /dev/null
+++ b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56.json
@@ -0,0 +1,46 @@
+{
+ "image": "44ce2269-a354-499a-9c79-f723098f1e56.jpg",
+ "width": 720,
+ "height": 124,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 426,
+ 700,
+ 700
+ ],
+ "click_point": [
+ 121,
+ 480
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 714,
+ 700,
+ 960
+ ],
+ "click_point": [
+ 121,
+ 763
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 974,
+ 700,
+ 1236
+ ],
+ "click_point": [
+ 121,
+ 1026
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56_flag.jpg b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56_flag.jpg
new file mode 100644
index 0000000..a00f9e4
Binary files /dev/null and b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56_vl.jpg b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56_vl.jpg
new file mode 100644
index 0000000..d3f31c3
Binary files /dev/null and b/Apps/XinDianTu/Images/44ce2269-a354-499a-9c79-f723098f1e56_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd.jpg b/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd.jpg
new file mode 100644
index 0000000..72e9248
Binary files /dev/null and b/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd.jpg differ
diff --git a/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd_flag.jpg b/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd_flag.jpg
new file mode 100644
index 0000000..43b5ae1
Binary files /dev/null and b/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd_vl.jpg b/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd_vl.jpg
new file mode 100644
index 0000000..5ba7cc4
Binary files /dev/null and b/Apps/XinDianTu/Images/452f9f27-db25-45ba-bda4-f533b7fea1bd_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/456c6520-312f-49c9-8a27-4a46e3d85f9b.jpg b/Apps/XinDianTu/Images/456c6520-312f-49c9-8a27-4a46e3d85f9b.jpg
new file mode 100644
index 0000000..a248adf
Binary files /dev/null and b/Apps/XinDianTu/Images/456c6520-312f-49c9-8a27-4a46e3d85f9b.jpg differ
diff --git a/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68.jpg b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68.jpg
new file mode 100644
index 0000000..ab899ae
Binary files /dev/null and b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68.jpg differ
diff --git a/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68.json b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68.json
new file mode 100644
index 0000000..e9b654d
--- /dev/null
+++ b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68.json
@@ -0,0 +1,59 @@
+{
+ "image": "45aeffbe-7c7b-493a-b6b5-16183bbb6c68.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 644
+ ],
+ "click_point": [
+ 121,
+ 452
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 652,
+ 700,
+ 901
+ ],
+ "click_point": [
+ 121,
+ 701
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 915,
+ 700,
+ 1164
+ ],
+ "click_point": [
+ 121,
+ 964
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1172,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1212
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68_flag.jpg b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68_flag.jpg
new file mode 100644
index 0000000..6a9f875
Binary files /dev/null and b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68_vl.jpg b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68_vl.jpg
new file mode 100644
index 0000000..9c6e8ba
Binary files /dev/null and b/Apps/XinDianTu/Images/45aeffbe-7c7b-493a-b6b5-16183bbb6c68_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/45bced78-e7df-4b5d-8fa0-fcff767c80f2.jpg b/Apps/XinDianTu/Images/45bced78-e7df-4b5d-8fa0-fcff767c80f2.jpg
new file mode 100644
index 0000000..31a915c
Binary files /dev/null and b/Apps/XinDianTu/Images/45bced78-e7df-4b5d-8fa0-fcff767c80f2.jpg differ
diff --git a/Apps/XinDianTu/Images/45f3d5a4-1bfc-49b7-a072-2e2da3abb2fc.jpg b/Apps/XinDianTu/Images/45f3d5a4-1bfc-49b7-a072-2e2da3abb2fc.jpg
new file mode 100644
index 0000000..726aab2
Binary files /dev/null and b/Apps/XinDianTu/Images/45f3d5a4-1bfc-49b7-a072-2e2da3abb2fc.jpg differ
diff --git a/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4.jpg b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4.jpg
new file mode 100644
index 0000000..17fb53c
Binary files /dev/null and b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4.jpg differ
diff --git a/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4.json b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4.json
new file mode 100644
index 0000000..3e1d7cd
--- /dev/null
+++ b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4.json
@@ -0,0 +1,46 @@
+{
+ "image": "4635da8e-532a-4850-8318-cc177f41b7e4.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 546,
+ 700,
+ 792
+ ],
+ "click_point": [
+ 121,
+ 595
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 806,
+ 700,
+ 1080
+ ],
+ "click_point": [
+ 121,
+ 860
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1089,
+ 700,
+ 1340
+ ],
+ "click_point": [
+ 121,
+ 1139
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4_flag.jpg b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4_flag.jpg
new file mode 100644
index 0000000..61fab5f
Binary files /dev/null and b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4_vl.jpg b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4_vl.jpg
new file mode 100644
index 0000000..bb306e5
Binary files /dev/null and b/Apps/XinDianTu/Images/4635da8e-532a-4850-8318-cc177f41b7e4_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/464fdfe3-3d64-4712-9dd1-d42ea419fc6f.jpg b/Apps/XinDianTu/Images/464fdfe3-3d64-4712-9dd1-d42ea419fc6f.jpg
new file mode 100644
index 0000000..4a6eccf
Binary files /dev/null and b/Apps/XinDianTu/Images/464fdfe3-3d64-4712-9dd1-d42ea419fc6f.jpg differ
diff --git a/Apps/XinDianTu/Images/468c19ef-fa53-41af-8d42-c7e268fc76f0.jpg b/Apps/XinDianTu/Images/468c19ef-fa53-41af-8d42-c7e268fc76f0.jpg
new file mode 100644
index 0000000..b24ac3c
Binary files /dev/null and b/Apps/XinDianTu/Images/468c19ef-fa53-41af-8d42-c7e268fc76f0.jpg differ
diff --git a/Apps/XinDianTu/Images/46b801b7-0eaa-4a8c-89e4-12aaaeced42a.jpg b/Apps/XinDianTu/Images/46b801b7-0eaa-4a8c-89e4-12aaaeced42a.jpg
new file mode 100644
index 0000000..19a4a6a
Binary files /dev/null and b/Apps/XinDianTu/Images/46b801b7-0eaa-4a8c-89e4-12aaaeced42a.jpg differ
diff --git a/Apps/XinDianTu/Images/46b8c5a6-1250-4d9c-8912-c3bbd1f5ea19.jpg b/Apps/XinDianTu/Images/46b8c5a6-1250-4d9c-8912-c3bbd1f5ea19.jpg
new file mode 100644
index 0000000..c529b04
Binary files /dev/null and b/Apps/XinDianTu/Images/46b8c5a6-1250-4d9c-8912-c3bbd1f5ea19.jpg differ
diff --git a/Apps/XinDianTu/Images/46c53dd0-8def-43e0-86b2-bb78d669a320.jpg b/Apps/XinDianTu/Images/46c53dd0-8def-43e0-86b2-bb78d669a320.jpg
new file mode 100644
index 0000000..c95304a
Binary files /dev/null and b/Apps/XinDianTu/Images/46c53dd0-8def-43e0-86b2-bb78d669a320.jpg differ
diff --git a/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_1.jpg b/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_1.jpg
new file mode 100644
index 0000000..3b36b24
Binary files /dev/null and b/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_2.jpg b/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_2.jpg
new file mode 100644
index 0000000..762a5cd
Binary files /dev/null and b/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_3.jpg b/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_3.jpg
new file mode 100644
index 0000000..38a0c32
Binary files /dev/null and b/Apps/XinDianTu/Images/472558ae579dff78c6e04b53a9fcc0fb_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/474f36db-d7d4-44c9-8b5a-ed699593da19.jpg b/Apps/XinDianTu/Images/474f36db-d7d4-44c9-8b5a-ed699593da19.jpg
new file mode 100644
index 0000000..43f4292
Binary files /dev/null and b/Apps/XinDianTu/Images/474f36db-d7d4-44c9-8b5a-ed699593da19.jpg differ
diff --git a/Apps/XinDianTu/Images/477ba52e-099d-4689-868d-d4f2e4c3dd5c.jpg b/Apps/XinDianTu/Images/477ba52e-099d-4689-868d-d4f2e4c3dd5c.jpg
new file mode 100644
index 0000000..814caaa
Binary files /dev/null and b/Apps/XinDianTu/Images/477ba52e-099d-4689-868d-d4f2e4c3dd5c.jpg differ
diff --git a/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_1.jpg b/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_1.jpg
new file mode 100644
index 0000000..65ab05d
Binary files /dev/null and b/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_2.jpg b/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_2.jpg
new file mode 100644
index 0000000..aed2cd1
Binary files /dev/null and b/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_3.jpg b/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_3.jpg
new file mode 100644
index 0000000..ab8780d
Binary files /dev/null and b/Apps/XinDianTu/Images/47f646e21bf82ca72d3dfd56683dcad2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4861e50f-070b-43a6-995f-30e37b73ebfe.jpg b/Apps/XinDianTu/Images/4861e50f-070b-43a6-995f-30e37b73ebfe.jpg
new file mode 100644
index 0000000..fc3f71b
Binary files /dev/null and b/Apps/XinDianTu/Images/4861e50f-070b-43a6-995f-30e37b73ebfe.jpg differ
diff --git a/Apps/XinDianTu/Images/48830e39-bac6-42c0-a277-779e281e3ea4.jpg b/Apps/XinDianTu/Images/48830e39-bac6-42c0-a277-779e281e3ea4.jpg
new file mode 100644
index 0000000..927b6fb
Binary files /dev/null and b/Apps/XinDianTu/Images/48830e39-bac6-42c0-a277-779e281e3ea4.jpg differ
diff --git a/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095.jpg b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095.jpg
new file mode 100644
index 0000000..1f2606b
Binary files /dev/null and b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095.jpg differ
diff --git a/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095.json b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095.json
new file mode 100644
index 0000000..83bfbbd
--- /dev/null
+++ b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095.json
@@ -0,0 +1,33 @@
+{
+ "image": "489065dd-c55c-4a8b-a880-7965a8a1b095.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095_flag.jpg b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095_flag.jpg
new file mode 100644
index 0000000..0ba3858
Binary files /dev/null and b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095_vl.jpg b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095_vl.jpg
new file mode 100644
index 0000000..0f2ff70
Binary files /dev/null and b/Apps/XinDianTu/Images/489065dd-c55c-4a8b-a880-7965a8a1b095_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_1.jpg b/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_1.jpg
new file mode 100644
index 0000000..87b6271
Binary files /dev/null and b/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_2.jpg b/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_2.jpg
new file mode 100644
index 0000000..6e02d77
Binary files /dev/null and b/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_3.jpg b/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_3.jpg
new file mode 100644
index 0000000..0a18ebf
Binary files /dev/null and b/Apps/XinDianTu/Images/48b63126df65bfb173b6c342710cecd9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99.jpg b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99.jpg
new file mode 100644
index 0000000..27afe47
Binary files /dev/null and b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99.jpg differ
diff --git a/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99.json b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99.json
new file mode 100644
index 0000000..4a896d6
--- /dev/null
+++ b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99.json
@@ -0,0 +1,46 @@
+{
+ "image": "4956d6e0-7082-4c24-93cc-7f1a531a8b99.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99_flag.jpg b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99_flag.jpg
new file mode 100644
index 0000000..467bbfe
Binary files /dev/null and b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99_vl.jpg b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99_vl.jpg
new file mode 100644
index 0000000..c1e4048
Binary files /dev/null and b/Apps/XinDianTu/Images/4956d6e0-7082-4c24-93cc-7f1a531a8b99_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_1.jpg b/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_1.jpg
new file mode 100644
index 0000000..6cc04b1
Binary files /dev/null and b/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_2.jpg b/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_2.jpg
new file mode 100644
index 0000000..a95faa1
Binary files /dev/null and b/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_3.jpg b/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_3.jpg
new file mode 100644
index 0000000..039a0b7
Binary files /dev/null and b/Apps/XinDianTu/Images/496ff3a8bf7c5d9abb042d703af1ffa2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/49b71da9-d6f3-4cfe-a1e3-130b8e4e8216.jpg b/Apps/XinDianTu/Images/49b71da9-d6f3-4cfe-a1e3-130b8e4e8216.jpg
new file mode 100644
index 0000000..702f4e0
Binary files /dev/null and b/Apps/XinDianTu/Images/49b71da9-d6f3-4cfe-a1e3-130b8e4e8216.jpg differ
diff --git a/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b.jpg b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b.jpg
new file mode 100644
index 0000000..c91dabd
Binary files /dev/null and b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b.jpg differ
diff --git a/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b.json b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b.json
new file mode 100644
index 0000000..d169c9c
--- /dev/null
+++ b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b.json
@@ -0,0 +1,46 @@
+{
+ "image": "49fb2e10-498f-42b6-856b-ede5b458fc4b.jpg",
+ "width": 720,
+ "height": 142,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 452,
+ 700,
+ 700
+ ],
+ "click_point": [
+ 121,
+ 501
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 713,
+ 700,
+ 959
+ ],
+ "click_point": [
+ 121,
+ 762
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 972,
+ 700,
+ 1220
+ ],
+ "click_point": [
+ 121,
+ 1021
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b_flag.jpg b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b_flag.jpg
new file mode 100644
index 0000000..03ad9bc
Binary files /dev/null and b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b_vl.jpg b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b_vl.jpg
new file mode 100644
index 0000000..8307eea
Binary files /dev/null and b/Apps/XinDianTu/Images/49fb2e10-498f-42b6-856b-ede5b458fc4b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/4aadbb6c-4d38-4422-8b71-fa6b0a56fcf4.jpg b/Apps/XinDianTu/Images/4aadbb6c-4d38-4422-8b71-fa6b0a56fcf4.jpg
new file mode 100644
index 0000000..4a94403
Binary files /dev/null and b/Apps/XinDianTu/Images/4aadbb6c-4d38-4422-8b71-fa6b0a56fcf4.jpg differ
diff --git a/Apps/XinDianTu/Images/4ac7c76b-9995-4a03-8c98-9a34bd31f04e.jpg b/Apps/XinDianTu/Images/4ac7c76b-9995-4a03-8c98-9a34bd31f04e.jpg
new file mode 100644
index 0000000..c9fb58a
Binary files /dev/null and b/Apps/XinDianTu/Images/4ac7c76b-9995-4a03-8c98-9a34bd31f04e.jpg differ
diff --git a/Apps/XinDianTu/Images/4aec4748-0a72-4df6-907f-1e4991d35d3c.jpg b/Apps/XinDianTu/Images/4aec4748-0a72-4df6-907f-1e4991d35d3c.jpg
new file mode 100644
index 0000000..91fbf5f
Binary files /dev/null and b/Apps/XinDianTu/Images/4aec4748-0a72-4df6-907f-1e4991d35d3c.jpg differ
diff --git a/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6.jpg b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6.jpg
new file mode 100644
index 0000000..a746fb8
Binary files /dev/null and b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6.jpg differ
diff --git a/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6.json b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6.json
new file mode 100644
index 0000000..1570ec1
--- /dev/null
+++ b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6.json
@@ -0,0 +1,46 @@
+{
+ "image": "4b664132-2400-4f1f-84b6-7d4869b8a2d6.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 538,
+ 700,
+ 820
+ ],
+ "click_point": [
+ 121,
+ 594
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 828,
+ 700,
+ 1077
+ ],
+ "click_point": [
+ 121,
+ 877
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1091,
+ 700,
+ 1337
+ ],
+ "click_point": [
+ 121,
+ 1140
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6_flag.jpg b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6_flag.jpg
new file mode 100644
index 0000000..9f2f26b
Binary files /dev/null and b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6_vl.jpg b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6_vl.jpg
new file mode 100644
index 0000000..aad7ba1
Binary files /dev/null and b/Apps/XinDianTu/Images/4b664132-2400-4f1f-84b6-7d4869b8a2d6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/4b76d9c0-4efd-4226-84f7-92ea88cde3f4.jpg b/Apps/XinDianTu/Images/4b76d9c0-4efd-4226-84f7-92ea88cde3f4.jpg
new file mode 100644
index 0000000..ede5272
Binary files /dev/null and b/Apps/XinDianTu/Images/4b76d9c0-4efd-4226-84f7-92ea88cde3f4.jpg differ
diff --git a/Apps/XinDianTu/Images/4b8f2621-6f68-4ae4-b039-37317d150508.jpg b/Apps/XinDianTu/Images/4b8f2621-6f68-4ae4-b039-37317d150508.jpg
new file mode 100644
index 0000000..8aada27
Binary files /dev/null and b/Apps/XinDianTu/Images/4b8f2621-6f68-4ae4-b039-37317d150508.jpg differ
diff --git a/Apps/XinDianTu/Images/4bab7c7b-95e6-4db6-b511-6a0ae2c196ff.jpg b/Apps/XinDianTu/Images/4bab7c7b-95e6-4db6-b511-6a0ae2c196ff.jpg
new file mode 100644
index 0000000..978c715
Binary files /dev/null and b/Apps/XinDianTu/Images/4bab7c7b-95e6-4db6-b511-6a0ae2c196ff.jpg differ
diff --git a/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_1.jpg b/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_1.jpg
new file mode 100644
index 0000000..79ca012
Binary files /dev/null and b/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_2.jpg b/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_2.jpg
new file mode 100644
index 0000000..e166899
Binary files /dev/null and b/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_3.jpg b/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_3.jpg
new file mode 100644
index 0000000..d53a7a4
Binary files /dev/null and b/Apps/XinDianTu/Images/4bbd712569a5bd108a02c6ff3a70ec3e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_1.jpg b/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_1.jpg
new file mode 100644
index 0000000..85006c1
Binary files /dev/null and b/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_2.jpg b/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_2.jpg
new file mode 100644
index 0000000..bbd44ae
Binary files /dev/null and b/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_3.jpg b/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_3.jpg
new file mode 100644
index 0000000..5c80351
Binary files /dev/null and b/Apps/XinDianTu/Images/4bbda6d25273a895ee79e1dc4c4c166d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_1.jpg b/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_1.jpg
new file mode 100644
index 0000000..da6d10c
Binary files /dev/null and b/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_2.jpg b/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_2.jpg
new file mode 100644
index 0000000..4e8d1da
Binary files /dev/null and b/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_3.jpg b/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_3.jpg
new file mode 100644
index 0000000..9b533e1
Binary files /dev/null and b/Apps/XinDianTu/Images/4be0672cc8bb1a202a5b7be59f02c1e8_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4be19216-d2e3-46a2-a564-706b22cd46a3.jpg b/Apps/XinDianTu/Images/4be19216-d2e3-46a2-a564-706b22cd46a3.jpg
new file mode 100644
index 0000000..23c5ec8
Binary files /dev/null and b/Apps/XinDianTu/Images/4be19216-d2e3-46a2-a564-706b22cd46a3.jpg differ
diff --git a/Apps/XinDianTu/Images/4c35e094-4bb4-4635-ae44-50e07d5e79d8.jpg b/Apps/XinDianTu/Images/4c35e094-4bb4-4635-ae44-50e07d5e79d8.jpg
new file mode 100644
index 0000000..2a187dc
Binary files /dev/null and b/Apps/XinDianTu/Images/4c35e094-4bb4-4635-ae44-50e07d5e79d8.jpg differ
diff --git a/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e.jpg b/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e.jpg
new file mode 100644
index 0000000..a23efb6
Binary files /dev/null and b/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e.jpg differ
diff --git a/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e_flag.jpg b/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e_flag.jpg
new file mode 100644
index 0000000..ee2bc9e
Binary files /dev/null and b/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e_vl.jpg b/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e_vl.jpg
new file mode 100644
index 0000000..56e75b6
Binary files /dev/null and b/Apps/XinDianTu/Images/4c576a34-7990-498b-89d6-d688baab8e1e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_1.jpg b/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_1.jpg
new file mode 100644
index 0000000..5994de1
Binary files /dev/null and b/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_2.jpg b/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_2.jpg
new file mode 100644
index 0000000..cfb5d2b
Binary files /dev/null and b/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_3.jpg b/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_3.jpg
new file mode 100644
index 0000000..1167155
Binary files /dev/null and b/Apps/XinDianTu/Images/4c96a07e19adc085cb583899071c94ca_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f.jpg b/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f.jpg
new file mode 100644
index 0000000..cc9ea5c
Binary files /dev/null and b/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f.jpg differ
diff --git a/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f_flag.jpg b/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f_flag.jpg
new file mode 100644
index 0000000..41f8ae9
Binary files /dev/null and b/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f_vl.jpg b/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f_vl.jpg
new file mode 100644
index 0000000..79053d8
Binary files /dev/null and b/Apps/XinDianTu/Images/4ca9f7f1-7cd7-4583-8ca3-7ab2f2c34b0f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/4cf5785f-b6b1-4485-88a1-0296d60f5e05.jpg b/Apps/XinDianTu/Images/4cf5785f-b6b1-4485-88a1-0296d60f5e05.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/4cf5785f-b6b1-4485-88a1-0296d60f5e05.jpg differ
diff --git a/Apps/XinDianTu/Images/4d62d6a2-5041-4207-bab7-47e3480b9005.jpg b/Apps/XinDianTu/Images/4d62d6a2-5041-4207-bab7-47e3480b9005.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/4d62d6a2-5041-4207-bab7-47e3480b9005.jpg differ
diff --git a/Apps/XinDianTu/Images/4dc4a74c-1763-4e1d-a90e-0b2054050e55.jpg b/Apps/XinDianTu/Images/4dc4a74c-1763-4e1d-a90e-0b2054050e55.jpg
new file mode 100644
index 0000000..9c66909
Binary files /dev/null and b/Apps/XinDianTu/Images/4dc4a74c-1763-4e1d-a90e-0b2054050e55.jpg differ
diff --git a/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f.jpg b/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f.jpg
new file mode 100644
index 0000000..c4e876c
Binary files /dev/null and b/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f.jpg differ
diff --git a/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f_flag.jpg b/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f_flag.jpg
new file mode 100644
index 0000000..a93a788
Binary files /dev/null and b/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f_vl.jpg b/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f_vl.jpg
new file mode 100644
index 0000000..41afd3b
Binary files /dev/null and b/Apps/XinDianTu/Images/4dd2f75a-3d4c-45eb-96b3-ac4637fd0f7f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/4e08f65f-a102-4e4a-a329-31dbe6491cb0.jpg b/Apps/XinDianTu/Images/4e08f65f-a102-4e4a-a329-31dbe6491cb0.jpg
new file mode 100644
index 0000000..b065fa2
Binary files /dev/null and b/Apps/XinDianTu/Images/4e08f65f-a102-4e4a-a329-31dbe6491cb0.jpg differ
diff --git a/Apps/XinDianTu/Images/4e24f8ef-d15a-43ef-9989-96c594720a20.jpg b/Apps/XinDianTu/Images/4e24f8ef-d15a-43ef-9989-96c594720a20.jpg
new file mode 100644
index 0000000..d94a742
Binary files /dev/null and b/Apps/XinDianTu/Images/4e24f8ef-d15a-43ef-9989-96c594720a20.jpg differ
diff --git a/Apps/XinDianTu/Images/4e2c0bd4-bf0d-4605-8aff-24ebc8ef1e5f.jpg b/Apps/XinDianTu/Images/4e2c0bd4-bf0d-4605-8aff-24ebc8ef1e5f.jpg
new file mode 100644
index 0000000..0f5a9c1
Binary files /dev/null and b/Apps/XinDianTu/Images/4e2c0bd4-bf0d-4605-8aff-24ebc8ef1e5f.jpg differ
diff --git a/Apps/XinDianTu/Images/4e33d1de-d8d2-45e4-b405-e6c5b0304bed.jpg b/Apps/XinDianTu/Images/4e33d1de-d8d2-45e4-b405-e6c5b0304bed.jpg
new file mode 100644
index 0000000..e763937
Binary files /dev/null and b/Apps/XinDianTu/Images/4e33d1de-d8d2-45e4-b405-e6c5b0304bed.jpg differ
diff --git a/Apps/XinDianTu/Images/4e64fadf-c52a-4f59-88ac-2db5f45c650a.jpg b/Apps/XinDianTu/Images/4e64fadf-c52a-4f59-88ac-2db5f45c650a.jpg
new file mode 100644
index 0000000..3370734
Binary files /dev/null and b/Apps/XinDianTu/Images/4e64fadf-c52a-4f59-88ac-2db5f45c650a.jpg differ
diff --git a/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_1.jpg b/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_1.jpg
new file mode 100644
index 0000000..13f8eff
Binary files /dev/null and b/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_2.jpg b/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_2.jpg
new file mode 100644
index 0000000..d6dee08
Binary files /dev/null and b/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_3.jpg b/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_3.jpg
new file mode 100644
index 0000000..53a1d71
Binary files /dev/null and b/Apps/XinDianTu/Images/4e8288b89938c2a05b0d7934f04b2f3e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/4ec41bfa-bae1-4211-8c95-b382c0a3a9ac.jpg b/Apps/XinDianTu/Images/4ec41bfa-bae1-4211-8c95-b382c0a3a9ac.jpg
new file mode 100644
index 0000000..2549bbe
Binary files /dev/null and b/Apps/XinDianTu/Images/4ec41bfa-bae1-4211-8c95-b382c0a3a9ac.jpg differ
diff --git a/Apps/XinDianTu/Images/4f597d61-a488-4203-ab77-812769f4685b.jpg b/Apps/XinDianTu/Images/4f597d61-a488-4203-ab77-812769f4685b.jpg
new file mode 100644
index 0000000..56ac4c9
Binary files /dev/null and b/Apps/XinDianTu/Images/4f597d61-a488-4203-ab77-812769f4685b.jpg differ
diff --git a/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_1.jpg b/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_1.jpg
new file mode 100644
index 0000000..48bd3f2
Binary files /dev/null and b/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_2.jpg b/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_2.jpg
new file mode 100644
index 0000000..adceca4
Binary files /dev/null and b/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_3.jpg b/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_3.jpg
new file mode 100644
index 0000000..bc50973
Binary files /dev/null and b/Apps/XinDianTu/Images/4f8c1f9a8c6cf8616f07635dfc307e68_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_1.jpg b/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_1.jpg
new file mode 100644
index 0000000..3b0fe52
Binary files /dev/null and b/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_2.jpg b/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_2.jpg
new file mode 100644
index 0000000..d45fc3d
Binary files /dev/null and b/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_3.jpg b/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_3.jpg
new file mode 100644
index 0000000..0dfc938
Binary files /dev/null and b/Apps/XinDianTu/Images/5009ae88967682e03212dd2d8cf43d6b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/504bfe6d-3928-4789-b330-1a2458607e11.jpg b/Apps/XinDianTu/Images/504bfe6d-3928-4789-b330-1a2458607e11.jpg
new file mode 100644
index 0000000..3862227
Binary files /dev/null and b/Apps/XinDianTu/Images/504bfe6d-3928-4789-b330-1a2458607e11.jpg differ
diff --git a/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04.jpg b/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04.jpg
new file mode 100644
index 0000000..c91c038
Binary files /dev/null and b/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04.jpg differ
diff --git a/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04_flag.jpg b/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04_flag.jpg
new file mode 100644
index 0000000..62efa95
Binary files /dev/null and b/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04_vl.jpg b/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04_vl.jpg
new file mode 100644
index 0000000..b9f1745
Binary files /dev/null and b/Apps/XinDianTu/Images/50c4a70a-dcc1-4355-8df2-0d7251849b04_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_1.jpg b/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_1.jpg
new file mode 100644
index 0000000..e686b4f
Binary files /dev/null and b/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_2.jpg b/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_2.jpg
new file mode 100644
index 0000000..e686b4f
Binary files /dev/null and b/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_3.jpg b/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_3.jpg
new file mode 100644
index 0000000..e686b4f
Binary files /dev/null and b/Apps/XinDianTu/Images/51526d4d3ee2ba8e069732b43b6e283e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/51658f41-8b93-453d-824e-548342e786ab.jpg b/Apps/XinDianTu/Images/51658f41-8b93-453d-824e-548342e786ab.jpg
new file mode 100644
index 0000000..49ccae0
Binary files /dev/null and b/Apps/XinDianTu/Images/51658f41-8b93-453d-824e-548342e786ab.jpg differ
diff --git a/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d.jpg b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d.jpg
new file mode 100644
index 0000000..7c66eda
Binary files /dev/null and b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d.jpg differ
diff --git a/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d.json b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d.json
new file mode 100644
index 0000000..dd55d43
--- /dev/null
+++ b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d.json
@@ -0,0 +1,59 @@
+{
+ "image": "5192b572-f670-40bb-b80d-18d3eed3b65d.jpg",
+ "width": 720,
+ "height": 173,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 420,
+ 700,
+ 668
+ ],
+ "click_point": [
+ 121,
+ 469
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 681,
+ 700,
+ 927
+ ],
+ "click_point": [
+ 121,
+ 730
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 940,
+ 700,
+ 1188
+ ],
+ "click_point": [
+ 121,
+ 989
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1201,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1235
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d_flag.jpg b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d_flag.jpg
new file mode 100644
index 0000000..d9fbeb1
Binary files /dev/null and b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d_vl.jpg b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d_vl.jpg
new file mode 100644
index 0000000..7957118
Binary files /dev/null and b/Apps/XinDianTu/Images/5192b572-f670-40bb-b80d-18d3eed3b65d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/5198afa6-e6f8-418a-aae3-b217cef8d902.jpg b/Apps/XinDianTu/Images/5198afa6-e6f8-418a-aae3-b217cef8d902.jpg
new file mode 100644
index 0000000..452efc1
Binary files /dev/null and b/Apps/XinDianTu/Images/5198afa6-e6f8-418a-aae3-b217cef8d902.jpg differ
diff --git a/Apps/XinDianTu/Images/51f35e99-6b84-4a77-94a7-a838c1d70234.jpg b/Apps/XinDianTu/Images/51f35e99-6b84-4a77-94a7-a838c1d70234.jpg
new file mode 100644
index 0000000..60a8af5
Binary files /dev/null and b/Apps/XinDianTu/Images/51f35e99-6b84-4a77-94a7-a838c1d70234.jpg differ
diff --git a/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716.jpg b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716.jpg
new file mode 100644
index 0000000..fd34d4f
Binary files /dev/null and b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716.jpg differ
diff --git a/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716.json b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716.json
new file mode 100644
index 0000000..ea9bd2c
--- /dev/null
+++ b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716.json
@@ -0,0 +1,46 @@
+{
+ "image": "5238e4d6-1af7-4632-bd91-303a10a59716.jpg",
+ "width": 720,
+ "height": 138,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 457,
+ 700,
+ 703
+ ],
+ "click_point": [
+ 121,
+ 506
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 716,
+ 700,
+ 964
+ ],
+ "click_point": [
+ 121,
+ 765
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 977,
+ 700,
+ 1223
+ ],
+ "click_point": [
+ 121,
+ 1026
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716_flag.jpg b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716_flag.jpg
new file mode 100644
index 0000000..f693001
Binary files /dev/null and b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716_vl.jpg b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716_vl.jpg
new file mode 100644
index 0000000..c81c57e
Binary files /dev/null and b/Apps/XinDianTu/Images/5238e4d6-1af7-4632-bd91-303a10a59716_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/52a3a950-8f74-4b00-8067-33b9ecceac07.jpg b/Apps/XinDianTu/Images/52a3a950-8f74-4b00-8067-33b9ecceac07.jpg
new file mode 100644
index 0000000..5a23c09
Binary files /dev/null and b/Apps/XinDianTu/Images/52a3a950-8f74-4b00-8067-33b9ecceac07.jpg differ
diff --git a/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_1.jpg b/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_1.jpg
new file mode 100644
index 0000000..30723c5
Binary files /dev/null and b/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_2.jpg b/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_2.jpg
new file mode 100644
index 0000000..2039150
Binary files /dev/null and b/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_3.jpg b/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_3.jpg
new file mode 100644
index 0000000..759e34e
Binary files /dev/null and b/Apps/XinDianTu/Images/52b782c5752b7d9383db5b623165dac9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27.jpg b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27.jpg
new file mode 100644
index 0000000..2842912
Binary files /dev/null and b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27.jpg differ
diff --git a/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27.json b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27.json
new file mode 100644
index 0000000..ecab551
--- /dev/null
+++ b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27.json
@@ -0,0 +1,46 @@
+{
+ "image": "532a7670-b287-4aa9-a866-644a9d073a27.jpg",
+ "width": 720,
+ "height": 274,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 580,
+ 700,
+ 829
+ ],
+ "click_point": [
+ 121,
+ 629
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 843,
+ 700,
+ 1092
+ ],
+ "click_point": [
+ 121,
+ 892
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1100,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1154
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27_flag.jpg b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27_flag.jpg
new file mode 100644
index 0000000..469a37a
Binary files /dev/null and b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27_vl.jpg b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27_vl.jpg
new file mode 100644
index 0000000..96a5811
Binary files /dev/null and b/Apps/XinDianTu/Images/532a7670-b287-4aa9-a866-644a9d073a27_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_1.jpg b/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_1.jpg
new file mode 100644
index 0000000..87169ed
Binary files /dev/null and b/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_2.jpg b/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_2.jpg
new file mode 100644
index 0000000..adda83b
Binary files /dev/null and b/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_3.jpg b/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_3.jpg
new file mode 100644
index 0000000..42e3083
Binary files /dev/null and b/Apps/XinDianTu/Images/537ba37393b449947a195ff6d216659e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb.jpg b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb.jpg
new file mode 100644
index 0000000..605edb7
Binary files /dev/null and b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb.jpg differ
diff --git a/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb.json b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb.json
new file mode 100644
index 0000000..69561cf
--- /dev/null
+++ b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb.json
@@ -0,0 +1,46 @@
+{
+ "image": "53fd7056-4903-4286-921e-72d7d0380edb.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 572,
+ 700,
+ 821
+ ],
+ "click_point": [
+ 121,
+ 621
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 835,
+ 700,
+ 1084
+ ],
+ "click_point": [
+ 121,
+ 884
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1092,
+ 700,
+ 1341
+ ],
+ "click_point": [
+ 121,
+ 1141
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb_flag.jpg b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb_flag.jpg
new file mode 100644
index 0000000..f42a425
Binary files /dev/null and b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb_vl.jpg b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb_vl.jpg
new file mode 100644
index 0000000..d7b9e6e
Binary files /dev/null and b/Apps/XinDianTu/Images/53fd7056-4903-4286-921e-72d7d0380edb_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/5412f7dc-451f-4b78-adec-9622d432ec91.jpg b/Apps/XinDianTu/Images/5412f7dc-451f-4b78-adec-9622d432ec91.jpg
new file mode 100644
index 0000000..a4fd87c
Binary files /dev/null and b/Apps/XinDianTu/Images/5412f7dc-451f-4b78-adec-9622d432ec91.jpg differ
diff --git a/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7.jpg b/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7.jpg
new file mode 100644
index 0000000..bc94dd7
Binary files /dev/null and b/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7.jpg differ
diff --git a/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7_flag.jpg b/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7_flag.jpg
new file mode 100644
index 0000000..3d790b8
Binary files /dev/null and b/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7_vl.jpg b/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7_vl.jpg
new file mode 100644
index 0000000..bb3d07a
Binary files /dev/null and b/Apps/XinDianTu/Images/545699d3-92bc-4331-b0f7-18251cb103b7_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_1.jpg b/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_1.jpg
new file mode 100644
index 0000000..81f00b9
Binary files /dev/null and b/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_2.jpg b/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_2.jpg
new file mode 100644
index 0000000..ae44b01
Binary files /dev/null and b/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_3.jpg b/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_3.jpg
new file mode 100644
index 0000000..ae44b01
Binary files /dev/null and b/Apps/XinDianTu/Images/54b99239c85a360fb77537170495f315_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105.jpg b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105.jpg
new file mode 100644
index 0000000..3b43880
Binary files /dev/null and b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105.jpg differ
diff --git a/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105.json b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105.json
new file mode 100644
index 0000000..aa02ec8
--- /dev/null
+++ b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105.json
@@ -0,0 +1,46 @@
+{
+ "image": "54bd17cc-5270-44da-90ed-5d2357b99105.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 500,
+ 700,
+ 751
+ ],
+ "click_point": [
+ 121,
+ 550
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 760,
+ 700,
+ 1079
+ ],
+ "click_point": [
+ 121,
+ 823
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1088,
+ 700,
+ 1334
+ ],
+ "click_point": [
+ 121,
+ 1137
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105_flag.jpg b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105_flag.jpg
new file mode 100644
index 0000000..102c43e
Binary files /dev/null and b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105_vl.jpg b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105_vl.jpg
new file mode 100644
index 0000000..816cd4c
Binary files /dev/null and b/Apps/XinDianTu/Images/54bd17cc-5270-44da-90ed-5d2357b99105_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/54ea18e5-a661-4d4f-9fb1-359b0570e2c9.jpg b/Apps/XinDianTu/Images/54ea18e5-a661-4d4f-9fb1-359b0570e2c9.jpg
new file mode 100644
index 0000000..87c69b3
Binary files /dev/null and b/Apps/XinDianTu/Images/54ea18e5-a661-4d4f-9fb1-359b0570e2c9.jpg differ
diff --git a/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865.jpg b/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865.jpg
new file mode 100644
index 0000000..6abfe75
Binary files /dev/null and b/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865.jpg differ
diff --git a/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865_flag.jpg b/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865_flag.jpg
new file mode 100644
index 0000000..c610912
Binary files /dev/null and b/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865_vl.jpg b/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865_vl.jpg
new file mode 100644
index 0000000..ac466e2
Binary files /dev/null and b/Apps/XinDianTu/Images/5518e461-5105-4dc6-93d2-cdce7723d865_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/555944de-520a-4d9c-94f5-1d781f7f2974.jpg b/Apps/XinDianTu/Images/555944de-520a-4d9c-94f5-1d781f7f2974.jpg
new file mode 100644
index 0000000..5496a48
Binary files /dev/null and b/Apps/XinDianTu/Images/555944de-520a-4d9c-94f5-1d781f7f2974.jpg differ
diff --git a/Apps/XinDianTu/Images/560e1073-834c-4930-9ae9-790e0e46193f.jpg b/Apps/XinDianTu/Images/560e1073-834c-4930-9ae9-790e0e46193f.jpg
new file mode 100644
index 0000000..b1a7e6c
Binary files /dev/null and b/Apps/XinDianTu/Images/560e1073-834c-4930-9ae9-790e0e46193f.jpg differ
diff --git a/Apps/XinDianTu/Images/565c310a-4298-4102-aff2-f722ed563c57.jpg b/Apps/XinDianTu/Images/565c310a-4298-4102-aff2-f722ed563c57.jpg
new file mode 100644
index 0000000..4e35e7c
Binary files /dev/null and b/Apps/XinDianTu/Images/565c310a-4298-4102-aff2-f722ed563c57.jpg differ
diff --git a/Apps/XinDianTu/Images/568cd91b-df7f-4524-8df6-1c8047260d7f.jpg b/Apps/XinDianTu/Images/568cd91b-df7f-4524-8df6-1c8047260d7f.jpg
new file mode 100644
index 0000000..0221345
Binary files /dev/null and b/Apps/XinDianTu/Images/568cd91b-df7f-4524-8df6-1c8047260d7f.jpg differ
diff --git a/Apps/XinDianTu/Images/5707c04c-621e-4c53-8abb-cf9edab17995.jpg b/Apps/XinDianTu/Images/5707c04c-621e-4c53-8abb-cf9edab17995.jpg
new file mode 100644
index 0000000..22be6cd
Binary files /dev/null and b/Apps/XinDianTu/Images/5707c04c-621e-4c53-8abb-cf9edab17995.jpg differ
diff --git a/Apps/XinDianTu/Images/57313579-b7e4-4e65-a2ff-bf8e2b362bbb.jpg b/Apps/XinDianTu/Images/57313579-b7e4-4e65-a2ff-bf8e2b362bbb.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/57313579-b7e4-4e65-a2ff-bf8e2b362bbb.jpg differ
diff --git a/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313.jpg b/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313.jpg
new file mode 100644
index 0000000..5a924c7
Binary files /dev/null and b/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313.jpg differ
diff --git a/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313_flag.jpg b/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313_flag.jpg
new file mode 100644
index 0000000..e8ee05d
Binary files /dev/null and b/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313_vl.jpg b/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313_vl.jpg
new file mode 100644
index 0000000..e764609
Binary files /dev/null and b/Apps/XinDianTu/Images/575bbdd5-7d3c-4e75-afaa-625637919313_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/5776a58c-22ce-42e8-85e2-8bfa326b40a9.jpg b/Apps/XinDianTu/Images/5776a58c-22ce-42e8-85e2-8bfa326b40a9.jpg
new file mode 100644
index 0000000..484ed53
Binary files /dev/null and b/Apps/XinDianTu/Images/5776a58c-22ce-42e8-85e2-8bfa326b40a9.jpg differ
diff --git a/Apps/XinDianTu/Images/5782125e-2487-44df-bb3c-fc8b54643cec.jpg b/Apps/XinDianTu/Images/5782125e-2487-44df-bb3c-fc8b54643cec.jpg
new file mode 100644
index 0000000..19d251c
Binary files /dev/null and b/Apps/XinDianTu/Images/5782125e-2487-44df-bb3c-fc8b54643cec.jpg differ
diff --git a/Apps/XinDianTu/Images/57852613-215c-40a1-82bf-e067581df4de.jpg b/Apps/XinDianTu/Images/57852613-215c-40a1-82bf-e067581df4de.jpg
new file mode 100644
index 0000000..14fc4ce
Binary files /dev/null and b/Apps/XinDianTu/Images/57852613-215c-40a1-82bf-e067581df4de.jpg differ
diff --git a/Apps/XinDianTu/Images/578f3851-d017-4f91-b1f7-f766cf6a40f7.jpg b/Apps/XinDianTu/Images/578f3851-d017-4f91-b1f7-f766cf6a40f7.jpg
new file mode 100644
index 0000000..edc8b88
Binary files /dev/null and b/Apps/XinDianTu/Images/578f3851-d017-4f91-b1f7-f766cf6a40f7.jpg differ
diff --git a/Apps/XinDianTu/Images/5799aa9f-998d-4e1b-a9c7-86f35f628753.jpg b/Apps/XinDianTu/Images/5799aa9f-998d-4e1b-a9c7-86f35f628753.jpg
new file mode 100644
index 0000000..9a53a51
Binary files /dev/null and b/Apps/XinDianTu/Images/5799aa9f-998d-4e1b-a9c7-86f35f628753.jpg differ
diff --git a/Apps/XinDianTu/Images/57a21f0f-ac29-4077-ba7b-7ae464ba1459.jpg b/Apps/XinDianTu/Images/57a21f0f-ac29-4077-ba7b-7ae464ba1459.jpg
new file mode 100644
index 0000000..441a1a3
Binary files /dev/null and b/Apps/XinDianTu/Images/57a21f0f-ac29-4077-ba7b-7ae464ba1459.jpg differ
diff --git a/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5.jpg b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5.jpg
new file mode 100644
index 0000000..ede6bca
Binary files /dev/null and b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5.jpg differ
diff --git a/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5.json b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5.json
new file mode 100644
index 0000000..f0ac425
--- /dev/null
+++ b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5.json
@@ -0,0 +1,46 @@
+{
+ "image": "57d056ba-72db-436b-9add-6aa6b9a04cd5.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 545,
+ 700,
+ 791
+ ],
+ "click_point": [
+ 121,
+ 594
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 804,
+ 700,
+ 1052
+ ],
+ "click_point": [
+ 121,
+ 853
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1065,
+ 700,
+ 1311
+ ],
+ "click_point": [
+ 121,
+ 1114
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5_flag.jpg b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5_flag.jpg
new file mode 100644
index 0000000..37a5888
Binary files /dev/null and b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5_vl.jpg b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5_vl.jpg
new file mode 100644
index 0000000..f0e8a40
Binary files /dev/null and b/Apps/XinDianTu/Images/57d056ba-72db-436b-9add-6aa6b9a04cd5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/580509b4-9a59-45ae-9065-bcc42aa6a043.jpg b/Apps/XinDianTu/Images/580509b4-9a59-45ae-9065-bcc42aa6a043.jpg
new file mode 100644
index 0000000..e3111d4
Binary files /dev/null and b/Apps/XinDianTu/Images/580509b4-9a59-45ae-9065-bcc42aa6a043.jpg differ
diff --git a/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_1.jpg b/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_1.jpg
new file mode 100644
index 0000000..70769a0
Binary files /dev/null and b/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_2.jpg b/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_2.jpg
new file mode 100644
index 0000000..28c28be
Binary files /dev/null and b/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_3.jpg b/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_3.jpg
new file mode 100644
index 0000000..5a97390
Binary files /dev/null and b/Apps/XinDianTu/Images/584f40a3a3b0b1eb8f92468d8b094c91_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/58907250-cb8e-4413-afa0-0e0da3c614eb.jpg b/Apps/XinDianTu/Images/58907250-cb8e-4413-afa0-0e0da3c614eb.jpg
new file mode 100644
index 0000000..1289995
Binary files /dev/null and b/Apps/XinDianTu/Images/58907250-cb8e-4413-afa0-0e0da3c614eb.jpg differ
diff --git a/Apps/XinDianTu/Images/58b7debc-33db-49c8-a83b-bf8ca016cde5.jpg b/Apps/XinDianTu/Images/58b7debc-33db-49c8-a83b-bf8ca016cde5.jpg
new file mode 100644
index 0000000..565c548
Binary files /dev/null and b/Apps/XinDianTu/Images/58b7debc-33db-49c8-a83b-bf8ca016cde5.jpg differ
diff --git a/Apps/XinDianTu/Images/59265863-2f20-4c90-b800-8915fe445c6e.jpg b/Apps/XinDianTu/Images/59265863-2f20-4c90-b800-8915fe445c6e.jpg
new file mode 100644
index 0000000..d91067e
Binary files /dev/null and b/Apps/XinDianTu/Images/59265863-2f20-4c90-b800-8915fe445c6e.jpg differ
diff --git a/Apps/XinDianTu/Images/59371d3e-6f7f-4003-b2fa-3d6e7fbda9fc.jpg b/Apps/XinDianTu/Images/59371d3e-6f7f-4003-b2fa-3d6e7fbda9fc.jpg
new file mode 100644
index 0000000..2ad26f4
Binary files /dev/null and b/Apps/XinDianTu/Images/59371d3e-6f7f-4003-b2fa-3d6e7fbda9fc.jpg differ
diff --git a/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a.jpg b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a.jpg
new file mode 100644
index 0000000..d26978c
Binary files /dev/null and b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a.jpg differ
diff --git a/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a.json b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a.json
new file mode 100644
index 0000000..7f436d3
--- /dev/null
+++ b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a.json
@@ -0,0 +1,59 @@
+{
+ "image": "59375d5d-a7e2-45b4-9556-04a96fb4169a.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 599
+ ],
+ "click_point": [
+ 121,
+ 443
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 608,
+ 700,
+ 808
+ ],
+ "click_point": [
+ 121,
+ 648
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 817,
+ 700,
+ 1068
+ ],
+ "click_point": [
+ 121,
+ 867
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1082,
+ 700,
+ 1328
+ ],
+ "click_point": [
+ 121,
+ 1131
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a_flag.jpg b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a_flag.jpg
new file mode 100644
index 0000000..9b4d657
Binary files /dev/null and b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a_vl.jpg b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a_vl.jpg
new file mode 100644
index 0000000..946558a
Binary files /dev/null and b/Apps/XinDianTu/Images/59375d5d-a7e2-45b4-9556-04a96fb4169a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/59c35a64-3dc9-4686-9876-3026f832e470.jpg b/Apps/XinDianTu/Images/59c35a64-3dc9-4686-9876-3026f832e470.jpg
new file mode 100644
index 0000000..3457a34
Binary files /dev/null and b/Apps/XinDianTu/Images/59c35a64-3dc9-4686-9876-3026f832e470.jpg differ
diff --git a/Apps/XinDianTu/Images/59e0fae4-e79e-4dbb-af1f-1c0fff0a8760.jpg b/Apps/XinDianTu/Images/59e0fae4-e79e-4dbb-af1f-1c0fff0a8760.jpg
new file mode 100644
index 0000000..f6c776b
Binary files /dev/null and b/Apps/XinDianTu/Images/59e0fae4-e79e-4dbb-af1f-1c0fff0a8760.jpg differ
diff --git a/Apps/XinDianTu/Images/59f4b853-4d71-4052-b850-02813391bee7.jpg b/Apps/XinDianTu/Images/59f4b853-4d71-4052-b850-02813391bee7.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/59f4b853-4d71-4052-b850-02813391bee7.jpg differ
diff --git a/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023.jpg b/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023.jpg
new file mode 100644
index 0000000..7f516cc
Binary files /dev/null and b/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023.jpg differ
diff --git a/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023_flag.jpg b/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023_flag.jpg
new file mode 100644
index 0000000..3e37bb8
Binary files /dev/null and b/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023_vl.jpg b/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023_vl.jpg
new file mode 100644
index 0000000..8b7a668
Binary files /dev/null and b/Apps/XinDianTu/Images/5c22b605-3d66-4853-b0fa-ee818cc19023_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/5c40a941-408e-4d1d-83dd-14c718ab23f5.jpg b/Apps/XinDianTu/Images/5c40a941-408e-4d1d-83dd-14c718ab23f5.jpg
new file mode 100644
index 0000000..6fefd1b
Binary files /dev/null and b/Apps/XinDianTu/Images/5c40a941-408e-4d1d-83dd-14c718ab23f5.jpg differ
diff --git a/Apps/XinDianTu/Images/5c99b782-7ed9-440d-94e5-a1d9e9f1665d.jpg b/Apps/XinDianTu/Images/5c99b782-7ed9-440d-94e5-a1d9e9f1665d.jpg
new file mode 100644
index 0000000..db0cda0
Binary files /dev/null and b/Apps/XinDianTu/Images/5c99b782-7ed9-440d-94e5-a1d9e9f1665d.jpg differ
diff --git a/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_1.jpg b/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_1.jpg
new file mode 100644
index 0000000..b4413df
Binary files /dev/null and b/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_2.jpg b/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_2.jpg
new file mode 100644
index 0000000..339949a
Binary files /dev/null and b/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_3.jpg b/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_3.jpg
new file mode 100644
index 0000000..26b9de9
Binary files /dev/null and b/Apps/XinDianTu/Images/5c9c4ffcc37e88e41b6f5c5b54eb5e5c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5ccb9e28-c4d5-40c2-85bb-daae2eae37da.jpg b/Apps/XinDianTu/Images/5ccb9e28-c4d5-40c2-85bb-daae2eae37da.jpg
new file mode 100644
index 0000000..aac7569
Binary files /dev/null and b/Apps/XinDianTu/Images/5ccb9e28-c4d5-40c2-85bb-daae2eae37da.jpg differ
diff --git a/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_1.jpg b/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_1.jpg
new file mode 100644
index 0000000..475bb2c
Binary files /dev/null and b/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_2.jpg b/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_2.jpg
new file mode 100644
index 0000000..36becd4
Binary files /dev/null and b/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_3.jpg b/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_3.jpg
new file mode 100644
index 0000000..6d1daeb
Binary files /dev/null and b/Apps/XinDianTu/Images/5dd24dc2c6b055635b9611b423ca4c05_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5ddd0baa-dd85-474c-b313-a49437cc5103.jpg b/Apps/XinDianTu/Images/5ddd0baa-dd85-474c-b313-a49437cc5103.jpg
new file mode 100644
index 0000000..26c6455
Binary files /dev/null and b/Apps/XinDianTu/Images/5ddd0baa-dd85-474c-b313-a49437cc5103.jpg differ
diff --git a/Apps/XinDianTu/Images/5e0e15de-c084-4ef0-a3c6-1c40fb3dbcd2.jpg b/Apps/XinDianTu/Images/5e0e15de-c084-4ef0-a3c6-1c40fb3dbcd2.jpg
new file mode 100644
index 0000000..5d733a4
Binary files /dev/null and b/Apps/XinDianTu/Images/5e0e15de-c084-4ef0-a3c6-1c40fb3dbcd2.jpg differ
diff --git a/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_1.jpg b/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_1.jpg
new file mode 100644
index 0000000..db9b195
Binary files /dev/null and b/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_2.jpg b/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_2.jpg
new file mode 100644
index 0000000..e104f61
Binary files /dev/null and b/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_3.jpg b/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_3.jpg
new file mode 100644
index 0000000..bd5d704
Binary files /dev/null and b/Apps/XinDianTu/Images/5e18eb3c67fc8cfcfb6c8d99ce073c61_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_1.jpg b/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_1.jpg
new file mode 100644
index 0000000..53dd7df
Binary files /dev/null and b/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_2.jpg b/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_2.jpg
new file mode 100644
index 0000000..36b4ae9
Binary files /dev/null and b/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_3.jpg b/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_3.jpg
new file mode 100644
index 0000000..29896fd
Binary files /dev/null and b/Apps/XinDianTu/Images/5e2f6538827b92d40263cc52ffdda4e3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e.jpg b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e.jpg
new file mode 100644
index 0000000..a9c6e7b
Binary files /dev/null and b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e.jpg differ
diff --git a/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e.json b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e.json
new file mode 100644
index 0000000..1684a5a
--- /dev/null
+++ b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e.json
@@ -0,0 +1,59 @@
+{
+ "image": "5ebecda3-75c6-480c-8466-789a1af09d1e.jpg",
+ "width": 720,
+ "height": 205,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 640
+ ],
+ "click_point": [
+ 121,
+ 451
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 649,
+ 700,
+ 900
+ ],
+ "click_point": [
+ 121,
+ 699
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 914,
+ 700,
+ 1160
+ ],
+ "click_point": [
+ 121,
+ 963
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1169,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1210
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e_flag.jpg b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e_flag.jpg
new file mode 100644
index 0000000..89e42bc
Binary files /dev/null and b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e_vl.jpg b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e_vl.jpg
new file mode 100644
index 0000000..106dcec
Binary files /dev/null and b/Apps/XinDianTu/Images/5ebecda3-75c6-480c-8466-789a1af09d1e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/5ed5b89f-7bda-4415-89f4-b60c54634f1b.jpg b/Apps/XinDianTu/Images/5ed5b89f-7bda-4415-89f4-b60c54634f1b.jpg
new file mode 100644
index 0000000..7e2dd8a
Binary files /dev/null and b/Apps/XinDianTu/Images/5ed5b89f-7bda-4415-89f4-b60c54634f1b.jpg differ
diff --git a/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_1.jpg b/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_1.jpg
new file mode 100644
index 0000000..cdc9cc2
Binary files /dev/null and b/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_2.jpg b/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_2.jpg
new file mode 100644
index 0000000..d3e766f
Binary files /dev/null and b/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_3.jpg b/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_3.jpg
new file mode 100644
index 0000000..25769bf
Binary files /dev/null and b/Apps/XinDianTu/Images/5ef7978e956367bb157db8494b629a70_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_1.jpg b/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_1.jpg
new file mode 100644
index 0000000..43d22bf
Binary files /dev/null and b/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_2.jpg b/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_2.jpg
new file mode 100644
index 0000000..94128f4
Binary files /dev/null and b/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_3.jpg b/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_3.jpg
new file mode 100644
index 0000000..f40a50e
Binary files /dev/null and b/Apps/XinDianTu/Images/5f217e4e89e271b82821342409c1629c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_1.jpg b/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_1.jpg
new file mode 100644
index 0000000..0fa38f1
Binary files /dev/null and b/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_2.jpg b/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_2.jpg
new file mode 100644
index 0000000..78b2779
Binary files /dev/null and b/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_3.jpg b/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_3.jpg
new file mode 100644
index 0000000..6a5f369
Binary files /dev/null and b/Apps/XinDianTu/Images/5f33f912f80e5e8e3bea3d5d39efb7d5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6.jpg b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6.jpg
new file mode 100644
index 0000000..3c45da9
Binary files /dev/null and b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6.jpg differ
diff --git a/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6.json b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6.json
new file mode 100644
index 0000000..2272a8a
--- /dev/null
+++ b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6.json
@@ -0,0 +1,46 @@
+{
+ "image": "5f412db9-dc00-469f-b21e-d384083adeb6.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 460,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 514
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6_flag.jpg b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6_flag.jpg
new file mode 100644
index 0000000..9bbdbca
Binary files /dev/null and b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6_vl.jpg b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6_vl.jpg
new file mode 100644
index 0000000..4b0481d
Binary files /dev/null and b/Apps/XinDianTu/Images/5f412db9-dc00-469f-b21e-d384083adeb6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_1.jpg b/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_1.jpg
new file mode 100644
index 0000000..386d1d2
Binary files /dev/null and b/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_2.jpg b/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_2.jpg
new file mode 100644
index 0000000..d29b75f
Binary files /dev/null and b/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_3.jpg b/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_3.jpg
new file mode 100644
index 0000000..426b34f
Binary files /dev/null and b/Apps/XinDianTu/Images/5f50fcaa5622304f2a37a87b8f2d35d4_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_1.jpg b/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_1.jpg
new file mode 100644
index 0000000..26a1ed7
Binary files /dev/null and b/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_2.jpg b/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_2.jpg
new file mode 100644
index 0000000..dfa60df
Binary files /dev/null and b/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_3.jpg b/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_3.jpg
new file mode 100644
index 0000000..f826286
Binary files /dev/null and b/Apps/XinDianTu/Images/5f86963820ac06cb25a05cd1f1e129e0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/5fa20c06-6727-484a-b0e1-b4fcbf317ecc.jpg b/Apps/XinDianTu/Images/5fa20c06-6727-484a-b0e1-b4fcbf317ecc.jpg
new file mode 100644
index 0000000..0079cdf
Binary files /dev/null and b/Apps/XinDianTu/Images/5fa20c06-6727-484a-b0e1-b4fcbf317ecc.jpg differ
diff --git a/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_1.jpg b/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_1.jpg
new file mode 100644
index 0000000..722d0dc
Binary files /dev/null and b/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_2.jpg b/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_2.jpg
new file mode 100644
index 0000000..67808f6
Binary files /dev/null and b/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_3.jpg b/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_3.jpg
new file mode 100644
index 0000000..3e5c644
Binary files /dev/null and b/Apps/XinDianTu/Images/60244607e4c6d8a25b31ec39b9c529cc_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6031df7f-fd16-4219-9c63-fad63d1fd167.jpg b/Apps/XinDianTu/Images/6031df7f-fd16-4219-9c63-fad63d1fd167.jpg
new file mode 100644
index 0000000..9b43b68
Binary files /dev/null and b/Apps/XinDianTu/Images/6031df7f-fd16-4219-9c63-fad63d1fd167.jpg differ
diff --git a/Apps/XinDianTu/Images/60557759-92f7-4870-991b-38b65e3c43b2.jpg b/Apps/XinDianTu/Images/60557759-92f7-4870-991b-38b65e3c43b2.jpg
new file mode 100644
index 0000000..81a5836
Binary files /dev/null and b/Apps/XinDianTu/Images/60557759-92f7-4870-991b-38b65e3c43b2.jpg differ
diff --git a/Apps/XinDianTu/Images/60817265-bf2f-42c3-9a29-bb41ce151209.jpg b/Apps/XinDianTu/Images/60817265-bf2f-42c3-9a29-bb41ce151209.jpg
new file mode 100644
index 0000000..88623e2
Binary files /dev/null and b/Apps/XinDianTu/Images/60817265-bf2f-42c3-9a29-bb41ce151209.jpg differ
diff --git a/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e.jpg b/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e.jpg
new file mode 100644
index 0000000..719a41b
Binary files /dev/null and b/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e.jpg differ
diff --git a/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e_flag.jpg b/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e_flag.jpg
new file mode 100644
index 0000000..f8a196c
Binary files /dev/null and b/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e_vl.jpg b/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e_vl.jpg
new file mode 100644
index 0000000..0841aa8
Binary files /dev/null and b/Apps/XinDianTu/Images/609fadba-ff2c-4e1f-9635-d58afaa1f01e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c.jpg b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c.jpg
new file mode 100644
index 0000000..9496ac7
Binary files /dev/null and b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c.jpg differ
diff --git a/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c.json b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c.json
new file mode 100644
index 0000000..22c4bab
--- /dev/null
+++ b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c.json
@@ -0,0 +1,33 @@
+{
+ "image": "60b36f47-550b-4495-86a1-825492684d5c.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c_flag.jpg b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c_flag.jpg
new file mode 100644
index 0000000..22775a6
Binary files /dev/null and b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c_vl.jpg b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c_vl.jpg
new file mode 100644
index 0000000..9fe7143
Binary files /dev/null and b/Apps/XinDianTu/Images/60b36f47-550b-4495-86a1-825492684d5c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_1.jpg b/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_1.jpg
new file mode 100644
index 0000000..5dc0b11
Binary files /dev/null and b/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_2.jpg b/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_2.jpg
new file mode 100644
index 0000000..982f9a6
Binary files /dev/null and b/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_3.jpg b/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_3.jpg
new file mode 100644
index 0000000..279de6a
Binary files /dev/null and b/Apps/XinDianTu/Images/60d912fc3427f2eb4ee5feaee7d48335_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/60e43882-4d1e-44f4-a915-4422a6791ffe.jpg b/Apps/XinDianTu/Images/60e43882-4d1e-44f4-a915-4422a6791ffe.jpg
new file mode 100644
index 0000000..b460351
Binary files /dev/null and b/Apps/XinDianTu/Images/60e43882-4d1e-44f4-a915-4422a6791ffe.jpg differ
diff --git a/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832.jpg b/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832.jpg
new file mode 100644
index 0000000..1540448
Binary files /dev/null and b/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832.jpg differ
diff --git a/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832_flag.jpg b/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832_flag.jpg
new file mode 100644
index 0000000..60c5004
Binary files /dev/null and b/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832_vl.jpg b/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832_vl.jpg
new file mode 100644
index 0000000..0485262
Binary files /dev/null and b/Apps/XinDianTu/Images/615f5dd8-9f9c-46b8-b4d1-d3b37cb6f832_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/61654888-9e33-4c17-b1fe-976c0bf64b81.jpg b/Apps/XinDianTu/Images/61654888-9e33-4c17-b1fe-976c0bf64b81.jpg
new file mode 100644
index 0000000..c7c566d
Binary files /dev/null and b/Apps/XinDianTu/Images/61654888-9e33-4c17-b1fe-976c0bf64b81.jpg differ
diff --git a/Apps/XinDianTu/Images/621d5cee-0c96-4348-8b8f-b87f2f602346.jpg b/Apps/XinDianTu/Images/621d5cee-0c96-4348-8b8f-b87f2f602346.jpg
new file mode 100644
index 0000000..62a0292
Binary files /dev/null and b/Apps/XinDianTu/Images/621d5cee-0c96-4348-8b8f-b87f2f602346.jpg differ
diff --git a/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.jpg b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.jpg
new file mode 100644
index 0000000..25e455b
Binary files /dev/null and b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.jpg differ
diff --git a/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.json b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.json
new file mode 100644
index 0000000..1dddad2
--- /dev/null
+++ b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.json
@@ -0,0 +1,46 @@
+{
+ "image": "625e1cbe-52b5-4e1b-80a8-5ebeda9ea089.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 515,
+ 700,
+ 764
+ ],
+ "click_point": [
+ 121,
+ 564
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 770,
+ 700,
+ 1037
+ ],
+ "click_point": [
+ 121,
+ 823
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1051,
+ 700,
+ 1300
+ ],
+ "click_point": [
+ 121,
+ 1100
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089_flag.jpg b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089_flag.jpg
new file mode 100644
index 0000000..a182969
Binary files /dev/null and b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089_vl.jpg b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089_vl.jpg
new file mode 100644
index 0000000..11764af
Binary files /dev/null and b/Apps/XinDianTu/Images/625e1cbe-52b5-4e1b-80a8-5ebeda9ea089_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c.jpg b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c.jpg
new file mode 100644
index 0000000..fff17b9
Binary files /dev/null and b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c.jpg differ
diff --git a/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c.json b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c.json
new file mode 100644
index 0000000..60d6f8c
--- /dev/null
+++ b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c.json
@@ -0,0 +1,59 @@
+{
+ "image": "625e53c3-fefb-4614-b301-dc803df3ab1c.jpg",
+ "width": 720,
+ "height": 218,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 628
+ ],
+ "click_point": [
+ 121,
+ 448
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 636,
+ 700,
+ 885
+ ],
+ "click_point": [
+ 121,
+ 685
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 899,
+ 700,
+ 1148
+ ],
+ "click_point": [
+ 121,
+ 948
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1156,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1199
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c_flag.jpg b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c_flag.jpg
new file mode 100644
index 0000000..e2c6497
Binary files /dev/null and b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c_vl.jpg b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c_vl.jpg
new file mode 100644
index 0000000..5203e84
Binary files /dev/null and b/Apps/XinDianTu/Images/625e53c3-fefb-4614-b301-dc803df3ab1c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/62b32a22-dbce-4baa-9e0b-47929a2a10ec.jpg b/Apps/XinDianTu/Images/62b32a22-dbce-4baa-9e0b-47929a2a10ec.jpg
new file mode 100644
index 0000000..7688760
Binary files /dev/null and b/Apps/XinDianTu/Images/62b32a22-dbce-4baa-9e0b-47929a2a10ec.jpg differ
diff --git a/Apps/XinDianTu/Images/62cc0ada-1eba-45e5-8d35-63eea8a5f864.jpg b/Apps/XinDianTu/Images/62cc0ada-1eba-45e5-8d35-63eea8a5f864.jpg
new file mode 100644
index 0000000..45fdd40
Binary files /dev/null and b/Apps/XinDianTu/Images/62cc0ada-1eba-45e5-8d35-63eea8a5f864.jpg differ
diff --git a/Apps/XinDianTu/Images/62f3ac61-24cf-4c4e-a8ac-7091dce8abc9.jpg b/Apps/XinDianTu/Images/62f3ac61-24cf-4c4e-a8ac-7091dce8abc9.jpg
new file mode 100644
index 0000000..be10920
Binary files /dev/null and b/Apps/XinDianTu/Images/62f3ac61-24cf-4c4e-a8ac-7091dce8abc9.jpg differ
diff --git a/Apps/XinDianTu/Images/632291ed-0c21-4d38-a68e-f6f972166ac7.jpg b/Apps/XinDianTu/Images/632291ed-0c21-4d38-a68e-f6f972166ac7.jpg
new file mode 100644
index 0000000..2cb1442
Binary files /dev/null and b/Apps/XinDianTu/Images/632291ed-0c21-4d38-a68e-f6f972166ac7.jpg differ
diff --git a/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a.jpg b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a.jpg
new file mode 100644
index 0000000..e737106
Binary files /dev/null and b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a.jpg differ
diff --git a/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a.json b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a.json
new file mode 100644
index 0000000..8687200
--- /dev/null
+++ b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a.json
@@ -0,0 +1,46 @@
+{
+ "image": "63785f7c-a11a-4a3b-8237-6fb78cfb344a.jpg",
+ "width": 720,
+ "height": 275,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 579,
+ 700,
+ 828
+ ],
+ "click_point": [
+ 121,
+ 628
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 836,
+ 700,
+ 1085
+ ],
+ "click_point": [
+ 121,
+ 885
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1099,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1154
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a_flag.jpg b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a_flag.jpg
new file mode 100644
index 0000000..7bc0b2e
Binary files /dev/null and b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a_vl.jpg b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a_vl.jpg
new file mode 100644
index 0000000..f525227
Binary files /dev/null and b/Apps/XinDianTu/Images/63785f7c-a11a-4a3b-8237-6fb78cfb344a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6385a6e5-f5b4-437f-9559-3d7857f85b5b.jpg b/Apps/XinDianTu/Images/6385a6e5-f5b4-437f-9559-3d7857f85b5b.jpg
new file mode 100644
index 0000000..2c67a64
Binary files /dev/null and b/Apps/XinDianTu/Images/6385a6e5-f5b4-437f-9559-3d7857f85b5b.jpg differ
diff --git a/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9.jpg b/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9.jpg
new file mode 100644
index 0000000..3e1c406
Binary files /dev/null and b/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9.jpg differ
diff --git a/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9_flag.jpg b/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9_flag.jpg
new file mode 100644
index 0000000..230d119
Binary files /dev/null and b/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9_vl.jpg b/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9_vl.jpg
new file mode 100644
index 0000000..bdc2f89
Binary files /dev/null and b/Apps/XinDianTu/Images/63921e5d-1cd3-414c-b2f6-d9071d2040a9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/63e10178-56c2-4a3c-a6dc-10596508cd60.jpg b/Apps/XinDianTu/Images/63e10178-56c2-4a3c-a6dc-10596508cd60.jpg
new file mode 100644
index 0000000..66ff00a
Binary files /dev/null and b/Apps/XinDianTu/Images/63e10178-56c2-4a3c-a6dc-10596508cd60.jpg differ
diff --git a/Apps/XinDianTu/Images/6406cf94-e8da-432b-81c6-ab00e92b5d0d.jpg b/Apps/XinDianTu/Images/6406cf94-e8da-432b-81c6-ab00e92b5d0d.jpg
new file mode 100644
index 0000000..bf041a7
Binary files /dev/null and b/Apps/XinDianTu/Images/6406cf94-e8da-432b-81c6-ab00e92b5d0d.jpg differ
diff --git a/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_1.jpg b/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_1.jpg
new file mode 100644
index 0000000..4ab2fcc
Binary files /dev/null and b/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_2.jpg b/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_2.jpg
new file mode 100644
index 0000000..1d7b0d9
Binary files /dev/null and b/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_3.jpg b/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_3.jpg
new file mode 100644
index 0000000..2a02379
Binary files /dev/null and b/Apps/XinDianTu/Images/64e50221ec0b8a9c5104778efe3db226_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179.jpg b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179.jpg
new file mode 100644
index 0000000..630ea1c
Binary files /dev/null and b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179.jpg differ
diff --git a/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179.json b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179.json
new file mode 100644
index 0000000..9a7d67d
--- /dev/null
+++ b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179.json
@@ -0,0 +1,59 @@
+{
+ "image": "65297e0b-c19a-4015-b9a9-c85173d80179.jpg",
+ "width": 720,
+ "height": 162,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 582
+ ],
+ "click_point": [
+ 121,
+ 439
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 596,
+ 700,
+ 910
+ ],
+ "click_point": [
+ 121,
+ 658
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 924,
+ 700,
+ 1198
+ ],
+ "click_point": [
+ 121,
+ 978
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1212,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1244
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179_flag.jpg b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179_flag.jpg
new file mode 100644
index 0000000..93ebce2
Binary files /dev/null and b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179_vl.jpg b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179_vl.jpg
new file mode 100644
index 0000000..e94c30b
Binary files /dev/null and b/Apps/XinDianTu/Images/65297e0b-c19a-4015-b9a9-c85173d80179_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6546fc1f-48c3-43bb-b97c-86019ddd5e20.jpg b/Apps/XinDianTu/Images/6546fc1f-48c3-43bb-b97c-86019ddd5e20.jpg
new file mode 100644
index 0000000..690a163
Binary files /dev/null and b/Apps/XinDianTu/Images/6546fc1f-48c3-43bb-b97c-86019ddd5e20.jpg differ
diff --git a/Apps/XinDianTu/Images/6598a6d3-d6f4-49dc-8694-1aedebc2b03d.jpg b/Apps/XinDianTu/Images/6598a6d3-d6f4-49dc-8694-1aedebc2b03d.jpg
new file mode 100644
index 0000000..b11be71
Binary files /dev/null and b/Apps/XinDianTu/Images/6598a6d3-d6f4-49dc-8694-1aedebc2b03d.jpg differ
diff --git a/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_1.jpg b/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_1.jpg
new file mode 100644
index 0000000..7d7045d
Binary files /dev/null and b/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_2.jpg b/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_2.jpg
new file mode 100644
index 0000000..7d22e38
Binary files /dev/null and b/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_3.jpg b/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_3.jpg
new file mode 100644
index 0000000..6812749
Binary files /dev/null and b/Apps/XinDianTu/Images/65abb2a91f474d37cc9027527806ad6a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/65ac9202-a8be-4d28-9177-e26cd4376d5b.jpg b/Apps/XinDianTu/Images/65ac9202-a8be-4d28-9177-e26cd4376d5b.jpg
new file mode 100644
index 0000000..f16a99b
Binary files /dev/null and b/Apps/XinDianTu/Images/65ac9202-a8be-4d28-9177-e26cd4376d5b.jpg differ
diff --git a/Apps/XinDianTu/Images/65b30772-046e-436c-8266-2d7b15c5d4f4.jpg b/Apps/XinDianTu/Images/65b30772-046e-436c-8266-2d7b15c5d4f4.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/65b30772-046e-436c-8266-2d7b15c5d4f4.jpg differ
diff --git a/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_1.jpg b/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_1.jpg
new file mode 100644
index 0000000..aedf802
Binary files /dev/null and b/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_2.jpg b/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_2.jpg
new file mode 100644
index 0000000..6814ece
Binary files /dev/null and b/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_3.jpg b/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_3.jpg
new file mode 100644
index 0000000..d996572
Binary files /dev/null and b/Apps/XinDianTu/Images/660f62504b97da46a83411ace99db252_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_1.jpg b/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_1.jpg
new file mode 100644
index 0000000..a58bf11
Binary files /dev/null and b/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_2.jpg b/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_2.jpg
new file mode 100644
index 0000000..610e32c
Binary files /dev/null and b/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_3.jpg b/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_3.jpg
new file mode 100644
index 0000000..387cf8e
Binary files /dev/null and b/Apps/XinDianTu/Images/665295d8daec3d0b550bf45582e87936_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/669357ab-9517-4b69-88c7-d6d9b6522b0b.jpg b/Apps/XinDianTu/Images/669357ab-9517-4b69-88c7-d6d9b6522b0b.jpg
new file mode 100644
index 0000000..33b914a
Binary files /dev/null and b/Apps/XinDianTu/Images/669357ab-9517-4b69-88c7-d6d9b6522b0b.jpg differ
diff --git a/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e.jpg b/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e.jpg
new file mode 100644
index 0000000..db7fa18
Binary files /dev/null and b/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e.jpg differ
diff --git a/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e_flag.jpg b/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e_flag.jpg
new file mode 100644
index 0000000..4f16412
Binary files /dev/null and b/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e_vl.jpg b/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e_vl.jpg
new file mode 100644
index 0000000..9db772f
Binary files /dev/null and b/Apps/XinDianTu/Images/66abce88-68b4-469a-bfcb-e31d0f59d96e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb.jpg b/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb.jpg
new file mode 100644
index 0000000..b5c4448
Binary files /dev/null and b/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb.jpg differ
diff --git a/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb_flag.jpg b/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb_flag.jpg
new file mode 100644
index 0000000..e917ac0
Binary files /dev/null and b/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb_vl.jpg b/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb_vl.jpg
new file mode 100644
index 0000000..5d27fae
Binary files /dev/null and b/Apps/XinDianTu/Images/674840d1-609d-4c39-8b45-e63119df52fb_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816.jpg b/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816.jpg
new file mode 100644
index 0000000..939eef2
Binary files /dev/null and b/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816.jpg differ
diff --git a/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816_flag.jpg b/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816_flag.jpg
new file mode 100644
index 0000000..1e93afb
Binary files /dev/null and b/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816_vl.jpg b/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816_vl.jpg
new file mode 100644
index 0000000..cd8bdcb
Binary files /dev/null and b/Apps/XinDianTu/Images/67583fa2-806a-4758-b90b-4d0837ffe816_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/679fe50f-5310-41a4-bcaa-8e4919b4b272.jpg b/Apps/XinDianTu/Images/679fe50f-5310-41a4-bcaa-8e4919b4b272.jpg
new file mode 100644
index 0000000..103e27a
Binary files /dev/null and b/Apps/XinDianTu/Images/679fe50f-5310-41a4-bcaa-8e4919b4b272.jpg differ
diff --git a/Apps/XinDianTu/Images/67c80638-e7a5-4a2b-8149-6b47e507a4f1.jpg b/Apps/XinDianTu/Images/67c80638-e7a5-4a2b-8149-6b47e507a4f1.jpg
new file mode 100644
index 0000000..2c253ea
Binary files /dev/null and b/Apps/XinDianTu/Images/67c80638-e7a5-4a2b-8149-6b47e507a4f1.jpg differ
diff --git a/Apps/XinDianTu/Images/67d61e1d-5309-44aa-b0e9-204da34c1df0.jpg b/Apps/XinDianTu/Images/67d61e1d-5309-44aa-b0e9-204da34c1df0.jpg
new file mode 100644
index 0000000..a5f0beb
Binary files /dev/null and b/Apps/XinDianTu/Images/67d61e1d-5309-44aa-b0e9-204da34c1df0.jpg differ
diff --git a/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6.jpg b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6.jpg
new file mode 100644
index 0000000..6dd84cb
Binary files /dev/null and b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6.jpg differ
diff --git a/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6.json b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6.json
new file mode 100644
index 0000000..4eacbb7
--- /dev/null
+++ b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6.json
@@ -0,0 +1,46 @@
+{
+ "image": "67d692e9-3a96-450c-bc04-73e41b77b3b6.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 529,
+ 700,
+ 775
+ ],
+ "click_point": [
+ 121,
+ 578
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 788,
+ 700,
+ 1036
+ ],
+ "click_point": [
+ 121,
+ 837
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1049,
+ 700,
+ 1295
+ ],
+ "click_point": [
+ 121,
+ 1098
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6_flag.jpg b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6_flag.jpg
new file mode 100644
index 0000000..dcee0eb
Binary files /dev/null and b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6_vl.jpg b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6_vl.jpg
new file mode 100644
index 0000000..f9871ce
Binary files /dev/null and b/Apps/XinDianTu/Images/67d692e9-3a96-450c-bc04-73e41b77b3b6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/67f1b971-0b4d-4db0-bcbf-85cc48a644e4.jpg b/Apps/XinDianTu/Images/67f1b971-0b4d-4db0-bcbf-85cc48a644e4.jpg
new file mode 100644
index 0000000..d520954
Binary files /dev/null and b/Apps/XinDianTu/Images/67f1b971-0b4d-4db0-bcbf-85cc48a644e4.jpg differ
diff --git a/Apps/XinDianTu/Images/68158657-f148-4d65-8c33-b29ae115afe8.jpg b/Apps/XinDianTu/Images/68158657-f148-4d65-8c33-b29ae115afe8.jpg
new file mode 100644
index 0000000..56f9b91
Binary files /dev/null and b/Apps/XinDianTu/Images/68158657-f148-4d65-8c33-b29ae115afe8.jpg differ
diff --git a/Apps/XinDianTu/Images/6825f1e9-54bc-42ea-a069-c77673d1639c.jpg b/Apps/XinDianTu/Images/6825f1e9-54bc-42ea-a069-c77673d1639c.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/6825f1e9-54bc-42ea-a069-c77673d1639c.jpg differ
diff --git a/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_1.jpg b/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_1.jpg
new file mode 100644
index 0000000..4fd1dbd
Binary files /dev/null and b/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_2.jpg b/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_2.jpg
new file mode 100644
index 0000000..b2712cb
Binary files /dev/null and b/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_3.jpg b/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_3.jpg
new file mode 100644
index 0000000..30f39e9
Binary files /dev/null and b/Apps/XinDianTu/Images/68c1b296cafc1068d978198619f8d252_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/68df053d-9429-4992-a096-d9216d1f8c99.jpg b/Apps/XinDianTu/Images/68df053d-9429-4992-a096-d9216d1f8c99.jpg
new file mode 100644
index 0000000..02505bf
Binary files /dev/null and b/Apps/XinDianTu/Images/68df053d-9429-4992-a096-d9216d1f8c99.jpg differ
diff --git a/Apps/XinDianTu/Images/6903fce0-2ab3-4b66-b463-1e084f542c55.jpg b/Apps/XinDianTu/Images/6903fce0-2ab3-4b66-b463-1e084f542c55.jpg
new file mode 100644
index 0000000..fe581b8
Binary files /dev/null and b/Apps/XinDianTu/Images/6903fce0-2ab3-4b66-b463-1e084f542c55.jpg differ
diff --git a/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_1.jpg b/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_1.jpg
new file mode 100644
index 0000000..d235550
Binary files /dev/null and b/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_2.jpg b/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_2.jpg
new file mode 100644
index 0000000..05e86f7
Binary files /dev/null and b/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_3.jpg b/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_3.jpg
new file mode 100644
index 0000000..e350103
Binary files /dev/null and b/Apps/XinDianTu/Images/690f2a893be12bea9dfed55f9185a22b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/692a50b9-40fb-4571-bf0c-2a0f33d77aca.jpg b/Apps/XinDianTu/Images/692a50b9-40fb-4571-bf0c-2a0f33d77aca.jpg
new file mode 100644
index 0000000..99a6162
Binary files /dev/null and b/Apps/XinDianTu/Images/692a50b9-40fb-4571-bf0c-2a0f33d77aca.jpg differ
diff --git a/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6.jpg b/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6.jpg
new file mode 100644
index 0000000..7ab7576
Binary files /dev/null and b/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6.jpg differ
diff --git a/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6_flag.jpg b/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6_flag.jpg
new file mode 100644
index 0000000..13c8dc5
Binary files /dev/null and b/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6_vl.jpg b/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6_vl.jpg
new file mode 100644
index 0000000..32b6260
Binary files /dev/null and b/Apps/XinDianTu/Images/69698d1e-e2c4-474c-af73-e60f23986ea6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/697176ea-a9ec-4640-9c2f-ec8ede98457f.jpg b/Apps/XinDianTu/Images/697176ea-a9ec-4640-9c2f-ec8ede98457f.jpg
new file mode 100644
index 0000000..769c6f7
Binary files /dev/null and b/Apps/XinDianTu/Images/697176ea-a9ec-4640-9c2f-ec8ede98457f.jpg differ
diff --git a/Apps/XinDianTu/Images/6983b5ed-6a2a-4699-9edf-daae38f0e02f.jpg b/Apps/XinDianTu/Images/6983b5ed-6a2a-4699-9edf-daae38f0e02f.jpg
new file mode 100644
index 0000000..602ca4b
Binary files /dev/null and b/Apps/XinDianTu/Images/6983b5ed-6a2a-4699-9edf-daae38f0e02f.jpg differ
diff --git a/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873.jpg b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873.jpg
new file mode 100644
index 0000000..a54f0e3
Binary files /dev/null and b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873.jpg differ
diff --git a/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873.json b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873.json
new file mode 100644
index 0000000..5bf3fe1
--- /dev/null
+++ b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873.json
@@ -0,0 +1,46 @@
+{
+ "image": "69badcfd-f2ee-4350-b99c-ff1bbd303873.jpg",
+ "width": 720,
+ "height": 268,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 586,
+ 700,
+ 832
+ ],
+ "click_point": [
+ 121,
+ 635
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 841,
+ 700,
+ 1092
+ ],
+ "click_point": [
+ 121,
+ 891
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1106,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1159
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873_flag.jpg b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873_flag.jpg
new file mode 100644
index 0000000..643f0f2
Binary files /dev/null and b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873_vl.jpg b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873_vl.jpg
new file mode 100644
index 0000000..509ea2d
Binary files /dev/null and b/Apps/XinDianTu/Images/69badcfd-f2ee-4350-b99c-ff1bbd303873_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f.jpg b/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f.jpg
new file mode 100644
index 0000000..d0b1750
Binary files /dev/null and b/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f.jpg differ
diff --git a/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f_flag.jpg b/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f_flag.jpg
new file mode 100644
index 0000000..50b73b7
Binary files /dev/null and b/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f_vl.jpg b/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f_vl.jpg
new file mode 100644
index 0000000..6d53473
Binary files /dev/null and b/Apps/XinDianTu/Images/69edfc8f-a9b1-49da-bb48-279bcbc96c7f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033.jpg b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033.jpg
new file mode 100644
index 0000000..100e922
Binary files /dev/null and b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033.jpg differ
diff --git a/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033.json b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033.json
new file mode 100644
index 0000000..0a8ab32
--- /dev/null
+++ b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033.json
@@ -0,0 +1,46 @@
+{
+ "image": "6a0f0155-b63a-4346-ae2f-788e5894f033.jpg",
+ "width": 720,
+ "height": 117,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 449,
+ 700,
+ 700
+ ],
+ "click_point": [
+ 121,
+ 499
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 714,
+ 700,
+ 960
+ ],
+ "click_point": [
+ 121,
+ 763
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 974,
+ 700,
+ 1248
+ ],
+ "click_point": [
+ 121,
+ 1028
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033_flag.jpg b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033_flag.jpg
new file mode 100644
index 0000000..614bce6
Binary files /dev/null and b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033_vl.jpg b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033_vl.jpg
new file mode 100644
index 0000000..f562b36
Binary files /dev/null and b/Apps/XinDianTu/Images/6a0f0155-b63a-4346-ae2f-788e5894f033_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_1.jpg b/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_1.jpg
new file mode 100644
index 0000000..1d98587
Binary files /dev/null and b/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_2.jpg b/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_2.jpg
new file mode 100644
index 0000000..a55f920
Binary files /dev/null and b/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_3.jpg b/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_3.jpg
new file mode 100644
index 0000000..f35ebed
Binary files /dev/null and b/Apps/XinDianTu/Images/6a2b238be2e61cb60301e73269edd419_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6a46a20a-0a57-4b66-aef2-a72d93f27e62.jpg b/Apps/XinDianTu/Images/6a46a20a-0a57-4b66-aef2-a72d93f27e62.jpg
new file mode 100644
index 0000000..ad4f9b1
Binary files /dev/null and b/Apps/XinDianTu/Images/6a46a20a-0a57-4b66-aef2-a72d93f27e62.jpg differ
diff --git a/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_1.jpg b/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_1.jpg
new file mode 100644
index 0000000..642118a
Binary files /dev/null and b/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_2.jpg b/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_2.jpg
new file mode 100644
index 0000000..12757b0
Binary files /dev/null and b/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_3.jpg b/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_3.jpg
new file mode 100644
index 0000000..111ab9d
Binary files /dev/null and b/Apps/XinDianTu/Images/6a56be1db1a5fb4ed8a1de4f234e2a5a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6a836f9b-6ee1-4a94-8050-3d26aedc5e1d.jpg b/Apps/XinDianTu/Images/6a836f9b-6ee1-4a94-8050-3d26aedc5e1d.jpg
new file mode 100644
index 0000000..c2584aa
Binary files /dev/null and b/Apps/XinDianTu/Images/6a836f9b-6ee1-4a94-8050-3d26aedc5e1d.jpg differ
diff --git a/Apps/XinDianTu/Images/6b04f4db-5aa0-417a-a5b9-591eba6d4c18.jpg b/Apps/XinDianTu/Images/6b04f4db-5aa0-417a-a5b9-591eba6d4c18.jpg
new file mode 100644
index 0000000..be472f5
Binary files /dev/null and b/Apps/XinDianTu/Images/6b04f4db-5aa0-417a-a5b9-591eba6d4c18.jpg differ
diff --git a/Apps/XinDianTu/Images/6b62d610-1064-4ba4-9d3b-8475909ba664.jpg b/Apps/XinDianTu/Images/6b62d610-1064-4ba4-9d3b-8475909ba664.jpg
new file mode 100644
index 0000000..975b0da
Binary files /dev/null and b/Apps/XinDianTu/Images/6b62d610-1064-4ba4-9d3b-8475909ba664.jpg differ
diff --git a/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6.jpg b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6.jpg
new file mode 100644
index 0000000..b003047
Binary files /dev/null and b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6.jpg differ
diff --git a/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6.json b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6.json
new file mode 100644
index 0000000..6673545
--- /dev/null
+++ b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6.json
@@ -0,0 +1,46 @@
+{
+ "image": "6b7fe8da-36c0-4721-8587-b57dc66953c6.jpg",
+ "width": 720,
+ "height": 116,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 473,
+ 700,
+ 724
+ ],
+ "click_point": [
+ 121,
+ 523
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 738,
+ 700,
+ 984
+ ],
+ "click_point": [
+ 121,
+ 787
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 993,
+ 700,
+ 1244
+ ],
+ "click_point": [
+ 121,
+ 1043
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6_flag.jpg b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6_flag.jpg
new file mode 100644
index 0000000..64aa31e
Binary files /dev/null and b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6_vl.jpg b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6_vl.jpg
new file mode 100644
index 0000000..261ac1a
Binary files /dev/null and b/Apps/XinDianTu/Images/6b7fe8da-36c0-4721-8587-b57dc66953c6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6b969787-f06f-4c73-96f7-4398e6c1bef3.jpg b/Apps/XinDianTu/Images/6b969787-f06f-4c73-96f7-4398e6c1bef3.jpg
new file mode 100644
index 0000000..bd8f100
Binary files /dev/null and b/Apps/XinDianTu/Images/6b969787-f06f-4c73-96f7-4398e6c1bef3.jpg differ
diff --git a/Apps/XinDianTu/Images/6c0ada2f-2ff1-4888-8ba2-07fa9b61c72a.jpg b/Apps/XinDianTu/Images/6c0ada2f-2ff1-4888-8ba2-07fa9b61c72a.jpg
new file mode 100644
index 0000000..6e8cd0c
Binary files /dev/null and b/Apps/XinDianTu/Images/6c0ada2f-2ff1-4888-8ba2-07fa9b61c72a.jpg differ
diff --git a/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_1.jpg b/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_1.jpg
new file mode 100644
index 0000000..b817237
Binary files /dev/null and b/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_2.jpg b/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_2.jpg
new file mode 100644
index 0000000..d0c7f14
Binary files /dev/null and b/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_3.jpg b/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_3.jpg
new file mode 100644
index 0000000..d23d50a
Binary files /dev/null and b/Apps/XinDianTu/Images/6c5f1cc9e1d162895b362e694d12c40c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6cbdf389-61b8-4a4b-87c2-9a2028de02f6.jpg b/Apps/XinDianTu/Images/6cbdf389-61b8-4a4b-87c2-9a2028de02f6.jpg
new file mode 100644
index 0000000..1c79a03
Binary files /dev/null and b/Apps/XinDianTu/Images/6cbdf389-61b8-4a4b-87c2-9a2028de02f6.jpg differ
diff --git a/Apps/XinDianTu/Images/6cd745af-d04f-4c85-ba5d-ea463aaf7d48.jpg b/Apps/XinDianTu/Images/6cd745af-d04f-4c85-ba5d-ea463aaf7d48.jpg
new file mode 100644
index 0000000..eef8a58
Binary files /dev/null and b/Apps/XinDianTu/Images/6cd745af-d04f-4c85-ba5d-ea463aaf7d48.jpg differ
diff --git a/Apps/XinDianTu/Images/6d2a9ab7-6a63-4985-9317-a1a0941d0604.jpg b/Apps/XinDianTu/Images/6d2a9ab7-6a63-4985-9317-a1a0941d0604.jpg
new file mode 100644
index 0000000..4755a94
Binary files /dev/null and b/Apps/XinDianTu/Images/6d2a9ab7-6a63-4985-9317-a1a0941d0604.jpg differ
diff --git a/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_1.jpg b/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_1.jpg
new file mode 100644
index 0000000..bc299cc
Binary files /dev/null and b/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_2.jpg b/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_2.jpg
new file mode 100644
index 0000000..00c4d69
Binary files /dev/null and b/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_3.jpg b/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_3.jpg
new file mode 100644
index 0000000..8d529ef
Binary files /dev/null and b/Apps/XinDianTu/Images/6d2cf0a7775b13d81e5e5cd4fb6722af_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6d4bf64c-5237-4cc8-aa35-2aea74fb7e7a.jpg b/Apps/XinDianTu/Images/6d4bf64c-5237-4cc8-aa35-2aea74fb7e7a.jpg
new file mode 100644
index 0000000..13cd4e1
Binary files /dev/null and b/Apps/XinDianTu/Images/6d4bf64c-5237-4cc8-aa35-2aea74fb7e7a.jpg differ
diff --git a/Apps/XinDianTu/Images/6d5d2afa-7161-46c5-a83b-fa4d0acb9ba9.jpg b/Apps/XinDianTu/Images/6d5d2afa-7161-46c5-a83b-fa4d0acb9ba9.jpg
new file mode 100644
index 0000000..28587ea
Binary files /dev/null and b/Apps/XinDianTu/Images/6d5d2afa-7161-46c5-a83b-fa4d0acb9ba9.jpg differ
diff --git a/Apps/XinDianTu/Images/6d621e76-4864-4611-bcda-ab3eaddc0b66.jpg b/Apps/XinDianTu/Images/6d621e76-4864-4611-bcda-ab3eaddc0b66.jpg
new file mode 100644
index 0000000..94d79a5
Binary files /dev/null and b/Apps/XinDianTu/Images/6d621e76-4864-4611-bcda-ab3eaddc0b66.jpg differ
diff --git a/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3.jpg b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3.jpg
new file mode 100644
index 0000000..327aac4
Binary files /dev/null and b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3.jpg differ
diff --git a/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3.json b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3.json
new file mode 100644
index 0000000..1010787
--- /dev/null
+++ b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3.json
@@ -0,0 +1,46 @@
+{
+ "image": "6d9b002e-bb81-4401-aa40-b477aea5dbf3.jpg",
+ "width": 720,
+ "height": 141,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 436,
+ 700,
+ 700
+ ],
+ "click_point": [
+ 121,
+ 488
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 713,
+ 700,
+ 959
+ ],
+ "click_point": [
+ 121,
+ 762
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 972,
+ 700,
+ 1220
+ ],
+ "click_point": [
+ 121,
+ 1021
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3_flag.jpg b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3_flag.jpg
new file mode 100644
index 0000000..bea9def
Binary files /dev/null and b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3_vl.jpg b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3_vl.jpg
new file mode 100644
index 0000000..2fc3c23
Binary files /dev/null and b/Apps/XinDianTu/Images/6d9b002e-bb81-4401-aa40-b477aea5dbf3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_1.jpg b/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_1.jpg
new file mode 100644
index 0000000..9f9d164
Binary files /dev/null and b/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_2.jpg b/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_2.jpg
new file mode 100644
index 0000000..9151cad
Binary files /dev/null and b/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_3.jpg b/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_3.jpg
new file mode 100644
index 0000000..d440daf
Binary files /dev/null and b/Apps/XinDianTu/Images/6d9e31f66e9a3c8337396d23ed493349_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_1.jpg b/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_1.jpg
new file mode 100644
index 0000000..ad36a94
Binary files /dev/null and b/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_2.jpg b/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_2.jpg
new file mode 100644
index 0000000..e274de9
Binary files /dev/null and b/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_3.jpg b/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_3.jpg
new file mode 100644
index 0000000..d2bead9
Binary files /dev/null and b/Apps/XinDianTu/Images/6dc32170fc5848bf7775937c95f3bb1b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd.jpg b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd.jpg
new file mode 100644
index 0000000..093c37a
Binary files /dev/null and b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd.jpg differ
diff --git a/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd.json b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd.json
new file mode 100644
index 0000000..4dd77b2
--- /dev/null
+++ b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd.json
@@ -0,0 +1,59 @@
+{
+ "image": "6dd29486-084f-46bf-ae37-40fc485503cd.jpg",
+ "width": 720,
+ "height": 235,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 605
+ ],
+ "click_point": [
+ 121,
+ 444
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 619,
+ 700,
+ 868
+ ],
+ "click_point": [
+ 121,
+ 668
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 876,
+ 700,
+ 1125
+ ],
+ "click_point": [
+ 121,
+ 925
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1139,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1186
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd_flag.jpg b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd_flag.jpg
new file mode 100644
index 0000000..e509c80
Binary files /dev/null and b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd_vl.jpg b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd_vl.jpg
new file mode 100644
index 0000000..52d4085
Binary files /dev/null and b/Apps/XinDianTu/Images/6dd29486-084f-46bf-ae37-40fc485503cd_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a.jpg b/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a.jpg
new file mode 100644
index 0000000..51b6fe9
Binary files /dev/null and b/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a.jpg differ
diff --git a/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a_flag.jpg b/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a_flag.jpg
new file mode 100644
index 0000000..f8cd819
Binary files /dev/null and b/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a_vl.jpg b/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a_vl.jpg
new file mode 100644
index 0000000..4861388
Binary files /dev/null and b/Apps/XinDianTu/Images/6de89b09-56b0-4c51-b0fc-0659465a2b4a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_1.jpg b/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_1.jpg
new file mode 100644
index 0000000..59eeb64
Binary files /dev/null and b/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_2.jpg b/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_2.jpg
new file mode 100644
index 0000000..dda54e7
Binary files /dev/null and b/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_3.jpg b/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_3.jpg
new file mode 100644
index 0000000..62e1dc0
Binary files /dev/null and b/Apps/XinDianTu/Images/6e0a734a419a0513adc4d50f038fe934_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af.jpg b/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af.jpg
new file mode 100644
index 0000000..dc49eb2
Binary files /dev/null and b/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af.jpg differ
diff --git a/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af_flag.jpg b/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af_flag.jpg
new file mode 100644
index 0000000..a16c6f4
Binary files /dev/null and b/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af_vl.jpg b/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af_vl.jpg
new file mode 100644
index 0000000..622a042
Binary files /dev/null and b/Apps/XinDianTu/Images/6e71d593-3725-4d9f-9027-0daca648c1af_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_1.jpg b/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_1.jpg
new file mode 100644
index 0000000..15e23e5
Binary files /dev/null and b/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_2.jpg b/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_2.jpg
new file mode 100644
index 0000000..1f1ed09
Binary files /dev/null and b/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_3.jpg b/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_3.jpg
new file mode 100644
index 0000000..23719cd
Binary files /dev/null and b/Apps/XinDianTu/Images/6e9229eeae31339ac6763aee4e5c3b3e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_1.jpg b/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_1.jpg
new file mode 100644
index 0000000..1e8c2a0
Binary files /dev/null and b/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_2.jpg b/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_2.jpg
new file mode 100644
index 0000000..6eec67a
Binary files /dev/null and b/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_3.jpg b/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_3.jpg
new file mode 100644
index 0000000..7b02130
Binary files /dev/null and b/Apps/XinDianTu/Images/6e98604696d223518f47f36b6207700b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_1.jpg b/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_1.jpg
new file mode 100644
index 0000000..6017a3f
Binary files /dev/null and b/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_2.jpg b/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_2.jpg
new file mode 100644
index 0000000..a87cfe4
Binary files /dev/null and b/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_3.jpg b/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_3.jpg
new file mode 100644
index 0000000..7f627a6
Binary files /dev/null and b/Apps/XinDianTu/Images/6ebdd03017f8226fbfa2db8be4e3d6db_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/6f1d45b5-c53d-4c48-97cc-331ed2e7abd7.jpg b/Apps/XinDianTu/Images/6f1d45b5-c53d-4c48-97cc-331ed2e7abd7.jpg
new file mode 100644
index 0000000..c503b48
Binary files /dev/null and b/Apps/XinDianTu/Images/6f1d45b5-c53d-4c48-97cc-331ed2e7abd7.jpg differ
diff --git a/Apps/XinDianTu/Images/6f770615-1ae9-45f4-ac9f-c6962a9c0775.jpg b/Apps/XinDianTu/Images/6f770615-1ae9-45f4-ac9f-c6962a9c0775.jpg
new file mode 100644
index 0000000..92a3337
Binary files /dev/null and b/Apps/XinDianTu/Images/6f770615-1ae9-45f4-ac9f-c6962a9c0775.jpg differ
diff --git a/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92.jpg b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92.jpg
new file mode 100644
index 0000000..1d9dada
Binary files /dev/null and b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92.jpg differ
diff --git a/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92.json b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92.json
new file mode 100644
index 0000000..325b893
--- /dev/null
+++ b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92.json
@@ -0,0 +1,59 @@
+{
+ "image": "6f7ef59f-85c6-47f0-990e-17c667bc5e92.jpg",
+ "width": 720,
+ "height": 218,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 622
+ ],
+ "click_point": [
+ 121,
+ 447
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 636,
+ 700,
+ 887
+ ],
+ "click_point": [
+ 121,
+ 686
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 896,
+ 700,
+ 1142
+ ],
+ "click_point": [
+ 121,
+ 945
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1156,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1199
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92_flag.jpg b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92_flag.jpg
new file mode 100644
index 0000000..2a04a50
Binary files /dev/null and b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92_vl.jpg b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92_vl.jpg
new file mode 100644
index 0000000..6c94af1
Binary files /dev/null and b/Apps/XinDianTu/Images/6f7ef59f-85c6-47f0-990e-17c667bc5e92_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec.jpg b/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec.jpg
new file mode 100644
index 0000000..fd58c00
Binary files /dev/null and b/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec.jpg differ
diff --git a/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec_flag.jpg b/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec_flag.jpg
new file mode 100644
index 0000000..bcf84d1
Binary files /dev/null and b/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec_vl.jpg b/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec_vl.jpg
new file mode 100644
index 0000000..090dc4b
Binary files /dev/null and b/Apps/XinDianTu/Images/6fff356e-fd20-4dd9-9a66-d0858d3dc6ec_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/70146400-c45f-4f05-b232-74b298750dce.jpg b/Apps/XinDianTu/Images/70146400-c45f-4f05-b232-74b298750dce.jpg
new file mode 100644
index 0000000..83aac54
Binary files /dev/null and b/Apps/XinDianTu/Images/70146400-c45f-4f05-b232-74b298750dce.jpg differ
diff --git a/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_1.jpg b/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_1.jpg
new file mode 100644
index 0000000..fe62d5e
Binary files /dev/null and b/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_2.jpg b/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_2.jpg
new file mode 100644
index 0000000..149b14c
Binary files /dev/null and b/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_3.jpg b/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_3.jpg
new file mode 100644
index 0000000..5001881
Binary files /dev/null and b/Apps/XinDianTu/Images/703cb911778dc3b075282511696612e2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b.jpg b/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b.jpg
new file mode 100644
index 0000000..fa20abc
Binary files /dev/null and b/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b.jpg differ
diff --git a/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b_flag.jpg b/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b_flag.jpg
new file mode 100644
index 0000000..5253bd2
Binary files /dev/null and b/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b_vl.jpg b/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b_vl.jpg
new file mode 100644
index 0000000..d3f021e
Binary files /dev/null and b/Apps/XinDianTu/Images/709aed90-9959-4c8f-8116-51a97abdd13b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/711fb003-04c5-406e-a2aa-5a78973eec2e.jpg b/Apps/XinDianTu/Images/711fb003-04c5-406e-a2aa-5a78973eec2e.jpg
new file mode 100644
index 0000000..fd59085
Binary files /dev/null and b/Apps/XinDianTu/Images/711fb003-04c5-406e-a2aa-5a78973eec2e.jpg differ
diff --git a/Apps/XinDianTu/Images/712010d1-232e-4599-9658-8a1de65481fa.jpg b/Apps/XinDianTu/Images/712010d1-232e-4599-9658-8a1de65481fa.jpg
new file mode 100644
index 0000000..a95c421
Binary files /dev/null and b/Apps/XinDianTu/Images/712010d1-232e-4599-9658-8a1de65481fa.jpg differ
diff --git a/Apps/XinDianTu/Images/7144a1a5-7263-408a-8cab-1a281b1fb6e5.jpg b/Apps/XinDianTu/Images/7144a1a5-7263-408a-8cab-1a281b1fb6e5.jpg
new file mode 100644
index 0000000..96ec565
Binary files /dev/null and b/Apps/XinDianTu/Images/7144a1a5-7263-408a-8cab-1a281b1fb6e5.jpg differ
diff --git a/Apps/XinDianTu/Images/7149267f-105f-4f57-aa28-770cce2130f4.jpg b/Apps/XinDianTu/Images/7149267f-105f-4f57-aa28-770cce2130f4.jpg
new file mode 100644
index 0000000..7999f66
Binary files /dev/null and b/Apps/XinDianTu/Images/7149267f-105f-4f57-aa28-770cce2130f4.jpg differ
diff --git a/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca.jpg b/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca.jpg
new file mode 100644
index 0000000..bcdcd71
Binary files /dev/null and b/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca.jpg differ
diff --git a/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca_flag.jpg b/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca_flag.jpg
new file mode 100644
index 0000000..7161f12
Binary files /dev/null and b/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca_vl.jpg b/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca_vl.jpg
new file mode 100644
index 0000000..32ebfb3
Binary files /dev/null and b/Apps/XinDianTu/Images/715f852b-05b1-4840-9690-fd1117e244ca_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75.jpg b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75.jpg
new file mode 100644
index 0000000..8a1034a
Binary files /dev/null and b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75.jpg differ
diff --git a/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75.json b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75.json
new file mode 100644
index 0000000..9d31f20
--- /dev/null
+++ b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75.json
@@ -0,0 +1,46 @@
+{
+ "image": "71909d83-6654-476c-9587-d8e5ff555d75.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75_flag.jpg b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75_flag.jpg
new file mode 100644
index 0000000..d036982
Binary files /dev/null and b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75_vl.jpg b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75_vl.jpg
new file mode 100644
index 0000000..34e1031
Binary files /dev/null and b/Apps/XinDianTu/Images/71909d83-6654-476c-9587-d8e5ff555d75_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_1.jpg b/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_1.jpg
new file mode 100644
index 0000000..79575ac
Binary files /dev/null and b/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_2.jpg b/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_2.jpg
new file mode 100644
index 0000000..653e60f
Binary files /dev/null and b/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_3.jpg b/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_3.jpg
new file mode 100644
index 0000000..89ac68b
Binary files /dev/null and b/Apps/XinDianTu/Images/71dbe0b3f951cec982e860b682c7e1c7_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/71e3737b-8d8c-463a-bc31-e250cdb5dbfe.jpg b/Apps/XinDianTu/Images/71e3737b-8d8c-463a-bc31-e250cdb5dbfe.jpg
new file mode 100644
index 0000000..d98b061
Binary files /dev/null and b/Apps/XinDianTu/Images/71e3737b-8d8c-463a-bc31-e250cdb5dbfe.jpg differ
diff --git a/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_1.jpg b/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_1.jpg
new file mode 100644
index 0000000..c544200
Binary files /dev/null and b/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_2.jpg b/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_2.jpg
new file mode 100644
index 0000000..049e919
Binary files /dev/null and b/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_3.jpg b/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_3.jpg
new file mode 100644
index 0000000..9c051ee
Binary files /dev/null and b/Apps/XinDianTu/Images/72028a13165cac1763cfe9ee03e2b6f1_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e.jpg b/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e.jpg
new file mode 100644
index 0000000..1e697c8
Binary files /dev/null and b/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e.jpg differ
diff --git a/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e_flag.jpg b/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e_flag.jpg
new file mode 100644
index 0000000..41de912
Binary files /dev/null and b/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e_vl.jpg b/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e_vl.jpg
new file mode 100644
index 0000000..2f4259a
Binary files /dev/null and b/Apps/XinDianTu/Images/721bb81a-9e24-491a-86f0-b76a55a2ea5e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_1.jpg b/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_1.jpg
new file mode 100644
index 0000000..5dc0b11
Binary files /dev/null and b/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_2.jpg b/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_2.jpg
new file mode 100644
index 0000000..339e029
Binary files /dev/null and b/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_3.jpg b/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_3.jpg
new file mode 100644
index 0000000..279de6a
Binary files /dev/null and b/Apps/XinDianTu/Images/7224af9d79189abd22ce8f5b272e0fa1_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/7243bb45-dc6c-4489-bddd-0f09bde5b26f.jpg b/Apps/XinDianTu/Images/7243bb45-dc6c-4489-bddd-0f09bde5b26f.jpg
new file mode 100644
index 0000000..89cb94d
Binary files /dev/null and b/Apps/XinDianTu/Images/7243bb45-dc6c-4489-bddd-0f09bde5b26f.jpg differ
diff --git a/Apps/XinDianTu/Images/7280233f-12c3-45f8-baec-39fc761c74bb.jpg b/Apps/XinDianTu/Images/7280233f-12c3-45f8-baec-39fc761c74bb.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/7280233f-12c3-45f8-baec-39fc761c74bb.jpg differ
diff --git a/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2.jpg b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2.jpg
new file mode 100644
index 0000000..c57ae06
Binary files /dev/null and b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2.jpg differ
diff --git a/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2.json b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2.json
new file mode 100644
index 0000000..b95c56f
--- /dev/null
+++ b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2.json
@@ -0,0 +1,46 @@
+{
+ "image": "72bf1c88-5586-4dd5-be0c-97a95373ffe2.jpg",
+ "width": 720,
+ "height": 138,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 456,
+ 700,
+ 702
+ ],
+ "click_point": [
+ 121,
+ 505
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 716,
+ 700,
+ 967
+ ],
+ "click_point": [
+ 121,
+ 766
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 976,
+ 700,
+ 1222
+ ],
+ "click_point": [
+ 121,
+ 1025
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2_flag.jpg b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2_flag.jpg
new file mode 100644
index 0000000..2478554
Binary files /dev/null and b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2_vl.jpg b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2_vl.jpg
new file mode 100644
index 0000000..b4d6375
Binary files /dev/null and b/Apps/XinDianTu/Images/72bf1c88-5586-4dd5-be0c-97a95373ffe2_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4.jpg b/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4.jpg
new file mode 100644
index 0000000..8782ac6
Binary files /dev/null and b/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4.jpg differ
diff --git a/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4_flag.jpg b/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4_flag.jpg
new file mode 100644
index 0000000..0710da9
Binary files /dev/null and b/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4_vl.jpg b/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4_vl.jpg
new file mode 100644
index 0000000..96c4843
Binary files /dev/null and b/Apps/XinDianTu/Images/730b1694-ce81-47a0-92dd-5bcf4d7105e4_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/732cd16e-05b0-41ac-9f2b-4dea50dd899d.jpg b/Apps/XinDianTu/Images/732cd16e-05b0-41ac-9f2b-4dea50dd899d.jpg
new file mode 100644
index 0000000..2b0cba1
Binary files /dev/null and b/Apps/XinDianTu/Images/732cd16e-05b0-41ac-9f2b-4dea50dd899d.jpg differ
diff --git a/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed.jpg b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed.jpg
new file mode 100644
index 0000000..5d0997a
Binary files /dev/null and b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed.jpg differ
diff --git a/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed.json b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed.json
new file mode 100644
index 0000000..685cacf
--- /dev/null
+++ b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed.json
@@ -0,0 +1,46 @@
+{
+ "image": "737a6b3b-327c-4a15-862f-fa77a8f155ed.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 540,
+ 700,
+ 791
+ ],
+ "click_point": [
+ 121,
+ 590
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 800,
+ 700,
+ 1119
+ ],
+ "click_point": [
+ 121,
+ 863
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1128,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1177
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed_flag.jpg b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed_flag.jpg
new file mode 100644
index 0000000..9e8ae07
Binary files /dev/null and b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed_vl.jpg b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed_vl.jpg
new file mode 100644
index 0000000..e103b1b
Binary files /dev/null and b/Apps/XinDianTu/Images/737a6b3b-327c-4a15-862f-fa77a8f155ed_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7385b67c-a190-4fcf-ac07-5568017862b0.jpg b/Apps/XinDianTu/Images/7385b67c-a190-4fcf-ac07-5568017862b0.jpg
new file mode 100644
index 0000000..eeeb167
Binary files /dev/null and b/Apps/XinDianTu/Images/7385b67c-a190-4fcf-ac07-5568017862b0.jpg differ
diff --git a/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d.jpg b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d.jpg
new file mode 100644
index 0000000..a944c18
Binary files /dev/null and b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d.jpg differ
diff --git a/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d.json b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d.json
new file mode 100644
index 0000000..454fb3c
--- /dev/null
+++ b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d.json
@@ -0,0 +1,46 @@
+{
+ "image": "7395797a-4677-4c82-8888-0efabbd7893d.jpg",
+ "width": 720,
+ "height": 277,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 577,
+ 700,
+ 828
+ ],
+ "click_point": [
+ 121,
+ 627
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 842,
+ 700,
+ 1088
+ ],
+ "click_point": [
+ 121,
+ 891
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1097,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1152
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d_flag.jpg b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d_flag.jpg
new file mode 100644
index 0000000..02276fb
Binary files /dev/null and b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d_vl.jpg b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d_vl.jpg
new file mode 100644
index 0000000..7a5910e
Binary files /dev/null and b/Apps/XinDianTu/Images/7395797a-4677-4c82-8888-0efabbd7893d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/73f6e8b7-d26a-42ea-8c66-fc5582120dd8.jpg b/Apps/XinDianTu/Images/73f6e8b7-d26a-42ea-8c66-fc5582120dd8.jpg
new file mode 100644
index 0000000..32e9ac2
Binary files /dev/null and b/Apps/XinDianTu/Images/73f6e8b7-d26a-42ea-8c66-fc5582120dd8.jpg differ
diff --git a/Apps/XinDianTu/Images/746390d3-834a-45e2-8af0-54e15fc4caac.jpg b/Apps/XinDianTu/Images/746390d3-834a-45e2-8af0-54e15fc4caac.jpg
new file mode 100644
index 0000000..ff8cae9
Binary files /dev/null and b/Apps/XinDianTu/Images/746390d3-834a-45e2-8af0-54e15fc4caac.jpg differ
diff --git a/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b.jpg b/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b.jpg
new file mode 100644
index 0000000..35eae63
Binary files /dev/null and b/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b.jpg differ
diff --git a/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b_flag.jpg b/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b_flag.jpg
new file mode 100644
index 0000000..b4c7afa
Binary files /dev/null and b/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b_vl.jpg b/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b_vl.jpg
new file mode 100644
index 0000000..9aa172c
Binary files /dev/null and b/Apps/XinDianTu/Images/748d1472-6c7b-4811-9919-dd2fd8169d6b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/75268d6c-feb7-4d9f-98c0-72d6cbb7ad53.jpg b/Apps/XinDianTu/Images/75268d6c-feb7-4d9f-98c0-72d6cbb7ad53.jpg
new file mode 100644
index 0000000..280a334
Binary files /dev/null and b/Apps/XinDianTu/Images/75268d6c-feb7-4d9f-98c0-72d6cbb7ad53.jpg differ
diff --git a/Apps/XinDianTu/Images/7531034b-9835-4f1e-a8db-ae181cfde221.jpg b/Apps/XinDianTu/Images/7531034b-9835-4f1e-a8db-ae181cfde221.jpg
new file mode 100644
index 0000000..560abfe
Binary files /dev/null and b/Apps/XinDianTu/Images/7531034b-9835-4f1e-a8db-ae181cfde221.jpg differ
diff --git a/Apps/XinDianTu/Images/753ee01f-22f4-4547-9abd-e7aae156d4ca.jpg b/Apps/XinDianTu/Images/753ee01f-22f4-4547-9abd-e7aae156d4ca.jpg
new file mode 100644
index 0000000..a21d2b0
Binary files /dev/null and b/Apps/XinDianTu/Images/753ee01f-22f4-4547-9abd-e7aae156d4ca.jpg differ
diff --git a/Apps/XinDianTu/Images/756aab77-1bcd-422d-b3d4-2d7eb8e9fc9b.jpg b/Apps/XinDianTu/Images/756aab77-1bcd-422d-b3d4-2d7eb8e9fc9b.jpg
new file mode 100644
index 0000000..f61a1ec
Binary files /dev/null and b/Apps/XinDianTu/Images/756aab77-1bcd-422d-b3d4-2d7eb8e9fc9b.jpg differ
diff --git a/Apps/XinDianTu/Images/75a0ae09-0839-4af8-bfac-ec24e86a6403.jpg b/Apps/XinDianTu/Images/75a0ae09-0839-4af8-bfac-ec24e86a6403.jpg
new file mode 100644
index 0000000..c74c6d6
Binary files /dev/null and b/Apps/XinDianTu/Images/75a0ae09-0839-4af8-bfac-ec24e86a6403.jpg differ
diff --git a/Apps/XinDianTu/Images/75cf47ff-352d-43ae-b76f-762ca2e9acd7.jpg b/Apps/XinDianTu/Images/75cf47ff-352d-43ae-b76f-762ca2e9acd7.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/75cf47ff-352d-43ae-b76f-762ca2e9acd7.jpg differ
diff --git a/Apps/XinDianTu/Images/76264fd7-7da6-4a7e-9ec1-b7174c63fe60.jpg b/Apps/XinDianTu/Images/76264fd7-7da6-4a7e-9ec1-b7174c63fe60.jpg
new file mode 100644
index 0000000..77a1d7c
Binary files /dev/null and b/Apps/XinDianTu/Images/76264fd7-7da6-4a7e-9ec1-b7174c63fe60.jpg differ
diff --git a/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_1.jpg b/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_1.jpg
new file mode 100644
index 0000000..8a18ddf
Binary files /dev/null and b/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_2.jpg b/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_2.jpg
new file mode 100644
index 0000000..f0b16af
Binary files /dev/null and b/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_3.jpg b/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_3.jpg
new file mode 100644
index 0000000..3fc776b
Binary files /dev/null and b/Apps/XinDianTu/Images/76311eb4bd472cd05677177182e329a7_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_1.jpg b/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_1.jpg
new file mode 100644
index 0000000..f6dc632
Binary files /dev/null and b/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_2.jpg b/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_2.jpg
new file mode 100644
index 0000000..21f6ff1
Binary files /dev/null and b/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_3.jpg b/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_3.jpg
new file mode 100644
index 0000000..69b40f7
Binary files /dev/null and b/Apps/XinDianTu/Images/766b45b2697dd6e6db789468ee56918e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/76dad16c-e409-4c1d-93f8-3459ad233125.jpg b/Apps/XinDianTu/Images/76dad16c-e409-4c1d-93f8-3459ad233125.jpg
new file mode 100644
index 0000000..c410f70
Binary files /dev/null and b/Apps/XinDianTu/Images/76dad16c-e409-4c1d-93f8-3459ad233125.jpg differ
diff --git a/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a.jpg b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a.jpg
new file mode 100644
index 0000000..6716d76
Binary files /dev/null and b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a.jpg differ
diff --git a/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a.json b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a.json
new file mode 100644
index 0000000..3060404
--- /dev/null
+++ b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a.json
@@ -0,0 +1,46 @@
+{
+ "image": "77cf9c4a-2392-41e5-b623-81c653279a1a.jpg",
+ "width": 720,
+ "height": 266,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 588,
+ 700,
+ 836
+ ],
+ "click_point": [
+ 121,
+ 637
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 849,
+ 700,
+ 1095
+ ],
+ "click_point": [
+ 121,
+ 898
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1108,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1161
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a_flag.jpg b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a_flag.jpg
new file mode 100644
index 0000000..368526d
Binary files /dev/null and b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a_vl.jpg b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a_vl.jpg
new file mode 100644
index 0000000..5eeb181
Binary files /dev/null and b/Apps/XinDianTu/Images/77cf9c4a-2392-41e5-b623-81c653279a1a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/784713f2-82fd-4af4-8cdd-22e4f8bf7cf1.jpg b/Apps/XinDianTu/Images/784713f2-82fd-4af4-8cdd-22e4f8bf7cf1.jpg
new file mode 100644
index 0000000..a2ea5c4
Binary files /dev/null and b/Apps/XinDianTu/Images/784713f2-82fd-4af4-8cdd-22e4f8bf7cf1.jpg differ
diff --git a/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39.jpg b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39.jpg
new file mode 100644
index 0000000..a3186bb
Binary files /dev/null and b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39.jpg differ
diff --git a/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39.json b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39.json
new file mode 100644
index 0000000..07ab03c
--- /dev/null
+++ b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39.json
@@ -0,0 +1,46 @@
+{
+ "image": "784b3b2e-56a7-456b-97e2-22e26db82f39.jpg",
+ "width": 720,
+ "height": 166,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 428,
+ 700,
+ 679
+ ],
+ "click_point": [
+ 121,
+ 478
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 688,
+ 700,
+ 934
+ ],
+ "click_point": [
+ 121,
+ 737
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 948,
+ 700,
+ 1199
+ ],
+ "click_point": [
+ 121,
+ 998
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39_flag.jpg b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39_flag.jpg
new file mode 100644
index 0000000..1cc7231
Binary files /dev/null and b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39_vl.jpg b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39_vl.jpg
new file mode 100644
index 0000000..b9732d9
Binary files /dev/null and b/Apps/XinDianTu/Images/784b3b2e-56a7-456b-97e2-22e26db82f39_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/787ef273-e992-4bf7-8a60-1afd5cdd1241.jpg b/Apps/XinDianTu/Images/787ef273-e992-4bf7-8a60-1afd5cdd1241.jpg
new file mode 100644
index 0000000..8a08750
Binary files /dev/null and b/Apps/XinDianTu/Images/787ef273-e992-4bf7-8a60-1afd5cdd1241.jpg differ
diff --git a/Apps/XinDianTu/Images/79222f30-a896-486c-8b98-a56959d81077.jpg b/Apps/XinDianTu/Images/79222f30-a896-486c-8b98-a56959d81077.jpg
new file mode 100644
index 0000000..1b5e38b
Binary files /dev/null and b/Apps/XinDianTu/Images/79222f30-a896-486c-8b98-a56959d81077.jpg differ
diff --git a/Apps/XinDianTu/Images/79268cbb-4520-41d4-b256-be08c72f184d.jpg b/Apps/XinDianTu/Images/79268cbb-4520-41d4-b256-be08c72f184d.jpg
new file mode 100644
index 0000000..f9baa44
Binary files /dev/null and b/Apps/XinDianTu/Images/79268cbb-4520-41d4-b256-be08c72f184d.jpg differ
diff --git a/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa.jpg b/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa.jpg
new file mode 100644
index 0000000..d8d292d
Binary files /dev/null and b/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa.jpg differ
diff --git a/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa_flag.jpg b/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa_flag.jpg
new file mode 100644
index 0000000..d8a2d9a
Binary files /dev/null and b/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa_vl.jpg b/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa_vl.jpg
new file mode 100644
index 0000000..ee74a3d
Binary files /dev/null and b/Apps/XinDianTu/Images/794f95ee-4e91-403d-b69a-8f8aac0ededa_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/79550c30-469a-43d6-930a-729d4734c743.jpg b/Apps/XinDianTu/Images/79550c30-469a-43d6-930a-729d4734c743.jpg
new file mode 100644
index 0000000..a6b6e79
Binary files /dev/null and b/Apps/XinDianTu/Images/79550c30-469a-43d6-930a-729d4734c743.jpg differ
diff --git a/Apps/XinDianTu/Images/79557e50-02b6-4253-b656-754b7e521e56.jpg b/Apps/XinDianTu/Images/79557e50-02b6-4253-b656-754b7e521e56.jpg
new file mode 100644
index 0000000..65c873b
Binary files /dev/null and b/Apps/XinDianTu/Images/79557e50-02b6-4253-b656-754b7e521e56.jpg differ
diff --git a/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97.jpg b/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97.jpg
new file mode 100644
index 0000000..08a485d
Binary files /dev/null and b/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97.jpg differ
diff --git a/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97_flag.jpg b/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97_flag.jpg
new file mode 100644
index 0000000..80ebbf3
Binary files /dev/null and b/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97_vl.jpg b/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97_vl.jpg
new file mode 100644
index 0000000..1ca3836
Binary files /dev/null and b/Apps/XinDianTu/Images/799713b1-a3fa-46aa-a698-3aa5a048ed97_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/79cce94d-c710-47a0-8a25-3d6730f9fcc6.jpg b/Apps/XinDianTu/Images/79cce94d-c710-47a0-8a25-3d6730f9fcc6.jpg
new file mode 100644
index 0000000..f057391
Binary files /dev/null and b/Apps/XinDianTu/Images/79cce94d-c710-47a0-8a25-3d6730f9fcc6.jpg differ
diff --git a/Apps/XinDianTu/Images/7a0b6551-6be4-4966-bb24-a2ff5f1ab1f1.jpg b/Apps/XinDianTu/Images/7a0b6551-6be4-4966-bb24-a2ff5f1ab1f1.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/7a0b6551-6be4-4966-bb24-a2ff5f1ab1f1.jpg differ
diff --git a/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504.jpg b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504.jpg
new file mode 100644
index 0000000..a1edaab
Binary files /dev/null and b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504.jpg differ
diff --git a/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504.json b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504.json
new file mode 100644
index 0000000..6072a89
--- /dev/null
+++ b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504.json
@@ -0,0 +1,46 @@
+{
+ "image": "7a33d10b-0df5-4b7e-91c2-0357f4b96504.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 494,
+ 700,
+ 768
+ ],
+ "click_point": [
+ 121,
+ 548
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 777,
+ 700,
+ 1028
+ ],
+ "click_point": [
+ 121,
+ 827
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1042,
+ 700,
+ 1288
+ ],
+ "click_point": [
+ 121,
+ 1091
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504_flag.jpg b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504_flag.jpg
new file mode 100644
index 0000000..b41a7fb
Binary files /dev/null and b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504_vl.jpg b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504_vl.jpg
new file mode 100644
index 0000000..4b762f7
Binary files /dev/null and b/Apps/XinDianTu/Images/7a33d10b-0df5-4b7e-91c2-0357f4b96504_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7a5f1518-84ae-48de-96ea-42880f0e4f39.jpg b/Apps/XinDianTu/Images/7a5f1518-84ae-48de-96ea-42880f0e4f39.jpg
new file mode 100644
index 0000000..c043cf1
Binary files /dev/null and b/Apps/XinDianTu/Images/7a5f1518-84ae-48de-96ea-42880f0e4f39.jpg differ
diff --git a/Apps/XinDianTu/Images/7a948847-f470-4f35-9f9d-20e789ced9ce.jpg b/Apps/XinDianTu/Images/7a948847-f470-4f35-9f9d-20e789ced9ce.jpg
new file mode 100644
index 0000000..2cf9ab6
Binary files /dev/null and b/Apps/XinDianTu/Images/7a948847-f470-4f35-9f9d-20e789ced9ce.jpg differ
diff --git a/Apps/XinDianTu/Images/7b15026f-3c17-4a38-b6a9-0b4bc2fd339e.jpg b/Apps/XinDianTu/Images/7b15026f-3c17-4a38-b6a9-0b4bc2fd339e.jpg
new file mode 100644
index 0000000..beca069
Binary files /dev/null and b/Apps/XinDianTu/Images/7b15026f-3c17-4a38-b6a9-0b4bc2fd339e.jpg differ
diff --git a/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c.jpg b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c.jpg
new file mode 100644
index 0000000..b627ec0
Binary files /dev/null and b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c.jpg differ
diff --git a/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c.json b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c.json
new file mode 100644
index 0000000..7843e48
--- /dev/null
+++ b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c.json
@@ -0,0 +1,46 @@
+{
+ "image": "7b1748c4-b443-4bf5-8f03-08a206b47d6c.jpg",
+ "width": 720,
+ "height": 170,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 644
+ ],
+ "click_point": [
+ 121,
+ 452
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 656,
+ 700,
+ 932
+ ],
+ "click_point": [
+ 121,
+ 711
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 945,
+ 700,
+ 1191
+ ],
+ "click_point": [
+ 121,
+ 994
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c_flag.jpg b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c_flag.jpg
new file mode 100644
index 0000000..a0d83b5
Binary files /dev/null and b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c_vl.jpg b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c_vl.jpg
new file mode 100644
index 0000000..77361cc
Binary files /dev/null and b/Apps/XinDianTu/Images/7b1748c4-b443-4bf5-8f03-08a206b47d6c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7b430b5b-fe60-412a-a4d9-61c33cff84a7.jpg b/Apps/XinDianTu/Images/7b430b5b-fe60-412a-a4d9-61c33cff84a7.jpg
new file mode 100644
index 0000000..299329e
Binary files /dev/null and b/Apps/XinDianTu/Images/7b430b5b-fe60-412a-a4d9-61c33cff84a7.jpg differ
diff --git a/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc.jpg b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc.jpg
new file mode 100644
index 0000000..5d6ee83
Binary files /dev/null and b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc.jpg differ
diff --git a/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc.json b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc.json
new file mode 100644
index 0000000..60ad373
--- /dev/null
+++ b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc.json
@@ -0,0 +1,59 @@
+{
+ "image": "7b53beb5-416e-449e-b55e-efe1daf8f4dc.jpg",
+ "width": 720,
+ "height": 254,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 591
+ ],
+ "click_point": [
+ 121,
+ 441
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 600,
+ 700,
+ 846
+ ],
+ "click_point": [
+ 121,
+ 649
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 860,
+ 700,
+ 1111
+ ],
+ "click_point": [
+ 121,
+ 910
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1120,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1170
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc_flag.jpg b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc_flag.jpg
new file mode 100644
index 0000000..4d29af7
Binary files /dev/null and b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc_vl.jpg b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc_vl.jpg
new file mode 100644
index 0000000..d37a38a
Binary files /dev/null and b/Apps/XinDianTu/Images/7b53beb5-416e-449e-b55e-efe1daf8f4dc_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7baa83f2-0ddf-4698-949e-8c7963cbae63.jpg b/Apps/XinDianTu/Images/7baa83f2-0ddf-4698-949e-8c7963cbae63.jpg
new file mode 100644
index 0000000..2ad26f4
Binary files /dev/null and b/Apps/XinDianTu/Images/7baa83f2-0ddf-4698-949e-8c7963cbae63.jpg differ
diff --git a/Apps/XinDianTu/Images/7bcabe4b-84a2-4077-816c-a587e4b5e990.jpg b/Apps/XinDianTu/Images/7bcabe4b-84a2-4077-816c-a587e4b5e990.jpg
new file mode 100644
index 0000000..dfc8b97
Binary files /dev/null and b/Apps/XinDianTu/Images/7bcabe4b-84a2-4077-816c-a587e4b5e990.jpg differ
diff --git a/Apps/XinDianTu/Images/7bf8ae8b-9237-46af-8cd0-7468e678dd51.jpg b/Apps/XinDianTu/Images/7bf8ae8b-9237-46af-8cd0-7468e678dd51.jpg
new file mode 100644
index 0000000..580598b
Binary files /dev/null and b/Apps/XinDianTu/Images/7bf8ae8b-9237-46af-8cd0-7468e678dd51.jpg differ
diff --git a/Apps/XinDianTu/Images/7c6e86f1-6bdf-4e0f-855b-5e8762c8d867.jpg b/Apps/XinDianTu/Images/7c6e86f1-6bdf-4e0f-855b-5e8762c8d867.jpg
new file mode 100644
index 0000000..7805cb1
Binary files /dev/null and b/Apps/XinDianTu/Images/7c6e86f1-6bdf-4e0f-855b-5e8762c8d867.jpg differ
diff --git a/Apps/XinDianTu/Images/7c803228-e72b-4cf7-958c-a9ef4f955d79.jpg b/Apps/XinDianTu/Images/7c803228-e72b-4cf7-958c-a9ef4f955d79.jpg
new file mode 100644
index 0000000..77653e3
Binary files /dev/null and b/Apps/XinDianTu/Images/7c803228-e72b-4cf7-958c-a9ef4f955d79.jpg differ
diff --git a/Apps/XinDianTu/Images/7c8a30dc-c7c8-4d36-a479-b38217dc7e33.jpg b/Apps/XinDianTu/Images/7c8a30dc-c7c8-4d36-a479-b38217dc7e33.jpg
new file mode 100644
index 0000000..9c5858d
Binary files /dev/null and b/Apps/XinDianTu/Images/7c8a30dc-c7c8-4d36-a479-b38217dc7e33.jpg differ
diff --git a/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_1.jpg b/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_1.jpg
new file mode 100644
index 0000000..dce2f15
Binary files /dev/null and b/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_2.jpg b/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_2.jpg
new file mode 100644
index 0000000..ee02c62
Binary files /dev/null and b/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_3.jpg b/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_3.jpg
new file mode 100644
index 0000000..ba500ab
Binary files /dev/null and b/Apps/XinDianTu/Images/7cd484f5b9aec6c2b2625a656d412ac3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.jpg b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.jpg
new file mode 100644
index 0000000..d923ad1
Binary files /dev/null and b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.jpg differ
diff --git a/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.json b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.json
new file mode 100644
index 0000000..5330f37
--- /dev/null
+++ b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.json
@@ -0,0 +1,46 @@
+{
+ "image": "7cf8e0e4-2201-4f5a-ada2-3af2414e06bf.jpg",
+ "width": 720,
+ "height": 269,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 585,
+ 700,
+ 831
+ ],
+ "click_point": [
+ 121,
+ 634
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 844,
+ 700,
+ 1092
+ ],
+ "click_point": [
+ 121,
+ 893
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1105,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1158
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf_flag.jpg b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf_flag.jpg
new file mode 100644
index 0000000..baf63f3
Binary files /dev/null and b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf_vl.jpg b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf_vl.jpg
new file mode 100644
index 0000000..cc357a3
Binary files /dev/null and b/Apps/XinDianTu/Images/7cf8e0e4-2201-4f5a-ada2-3af2414e06bf_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7d965628-4424-433c-a027-6e6e5dbd0bb3.jpg b/Apps/XinDianTu/Images/7d965628-4424-433c-a027-6e6e5dbd0bb3.jpg
new file mode 100644
index 0000000..ff6a387
Binary files /dev/null and b/Apps/XinDianTu/Images/7d965628-4424-433c-a027-6e6e5dbd0bb3.jpg differ
diff --git a/Apps/XinDianTu/Images/7dfec1fc-8fa1-4c53-8d58-d7df0b4f89f0.jpg b/Apps/XinDianTu/Images/7dfec1fc-8fa1-4c53-8d58-d7df0b4f89f0.jpg
new file mode 100644
index 0000000..ca0079c
Binary files /dev/null and b/Apps/XinDianTu/Images/7dfec1fc-8fa1-4c53-8d58-d7df0b4f89f0.jpg differ
diff --git a/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_1.jpg b/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_1.jpg
new file mode 100644
index 0000000..0389dec
Binary files /dev/null and b/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_2.jpg b/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_2.jpg
new file mode 100644
index 0000000..4b77d20
Binary files /dev/null and b/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_3.jpg b/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_3.jpg
new file mode 100644
index 0000000..cc2b2f1
Binary files /dev/null and b/Apps/XinDianTu/Images/7e15d9895fbdbc4e699005113125edc0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/7e79b32c-bb50-4b3c-855f-b619fdd0bcc1.jpg b/Apps/XinDianTu/Images/7e79b32c-bb50-4b3c-855f-b619fdd0bcc1.jpg
new file mode 100644
index 0000000..dbe7447
Binary files /dev/null and b/Apps/XinDianTu/Images/7e79b32c-bb50-4b3c-855f-b619fdd0bcc1.jpg differ
diff --git a/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb.jpg b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb.jpg
new file mode 100644
index 0000000..8e22ea0
Binary files /dev/null and b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb.jpg differ
diff --git a/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb.json b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb.json
new file mode 100644
index 0000000..3ba2459
--- /dev/null
+++ b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb.json
@@ -0,0 +1,20 @@
+{
+ "image": "7e9b0398-dc75-4de2-980c-7330aaaba8fb.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 226,
+ 720,
+ 428
+ ],
+ "click_point": [
+ 124,
+ 266
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb_flag.jpg b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb_flag.jpg
new file mode 100644
index 0000000..9888095
Binary files /dev/null and b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb_vl.jpg b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb_vl.jpg
new file mode 100644
index 0000000..70f82a6
Binary files /dev/null and b/Apps/XinDianTu/Images/7e9b0398-dc75-4de2-980c-7330aaaba8fb_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06.jpg b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06.jpg
new file mode 100644
index 0000000..098a3a4
Binary files /dev/null and b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06.jpg differ
diff --git a/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06.json b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06.json
new file mode 100644
index 0000000..771cf08
--- /dev/null
+++ b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06.json
@@ -0,0 +1,46 @@
+{
+ "image": "7eaf9942-380f-48fc-8ef1-05679e375f06.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 521,
+ 700,
+ 767
+ ],
+ "click_point": [
+ 121,
+ 570
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 780,
+ 700,
+ 1028
+ ],
+ "click_point": [
+ 121,
+ 829
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1041,
+ 700,
+ 1287
+ ],
+ "click_point": [
+ 121,
+ 1090
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06_flag.jpg b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06_flag.jpg
new file mode 100644
index 0000000..f7c0d4d
Binary files /dev/null and b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06_vl.jpg b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06_vl.jpg
new file mode 100644
index 0000000..7e48af6
Binary files /dev/null and b/Apps/XinDianTu/Images/7eaf9942-380f-48fc-8ef1-05679e375f06_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_1.jpg b/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_1.jpg
new file mode 100644
index 0000000..e93bcae
Binary files /dev/null and b/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_2.jpg b/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_2.jpg
new file mode 100644
index 0000000..e9aa022
Binary files /dev/null and b/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_3.jpg b/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_3.jpg
new file mode 100644
index 0000000..845b78b
Binary files /dev/null and b/Apps/XinDianTu/Images/7ee235977c8911d0d3a0d104bb479dae_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d.jpg b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d.jpg
new file mode 100644
index 0000000..aa47d84
Binary files /dev/null and b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d.jpg differ
diff --git a/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d.json b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d.json
new file mode 100644
index 0000000..caee4af
--- /dev/null
+++ b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d.json
@@ -0,0 +1,46 @@
+{
+ "image": "7ef977fd-44ac-434d-93d7-85a08b8ad75d.jpg",
+ "width": 720,
+ "height": 126,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 403,
+ 700,
+ 679
+ ],
+ "click_point": [
+ 121,
+ 458
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 688,
+ 700,
+ 974
+ ],
+ "click_point": [
+ 121,
+ 745
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 988,
+ 700,
+ 1239
+ ],
+ "click_point": [
+ 121,
+ 1038
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d_flag.jpg b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d_flag.jpg
new file mode 100644
index 0000000..ccdc5bc
Binary files /dev/null and b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d_vl.jpg b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d_vl.jpg
new file mode 100644
index 0000000..dfda0ab
Binary files /dev/null and b/Apps/XinDianTu/Images/7ef977fd-44ac-434d-93d7-85a08b8ad75d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424.jpg b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424.jpg
new file mode 100644
index 0000000..08b6236
Binary files /dev/null and b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424.jpg differ
diff --git a/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424.json b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424.json
new file mode 100644
index 0000000..95a2254
--- /dev/null
+++ b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424.json
@@ -0,0 +1,46 @@
+{
+ "image": "7f40fad8-9d6e-480b-bc14-93a9f7911424.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 547,
+ 700,
+ 796
+ ],
+ "click_point": [
+ 121,
+ 596
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 804,
+ 700,
+ 1045
+ ],
+ "click_point": [
+ 121,
+ 852
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1059,
+ 700,
+ 1308
+ ],
+ "click_point": [
+ 121,
+ 1108
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424_flag.jpg b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424_flag.jpg
new file mode 100644
index 0000000..1334b0d
Binary files /dev/null and b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424_vl.jpg b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424_vl.jpg
new file mode 100644
index 0000000..287d377
Binary files /dev/null and b/Apps/XinDianTu/Images/7f40fad8-9d6e-480b-bc14-93a9f7911424_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/7f8ef046-e39a-4784-b940-e48d70ba6632.jpg b/Apps/XinDianTu/Images/7f8ef046-e39a-4784-b940-e48d70ba6632.jpg
new file mode 100644
index 0000000..6a2a31c
Binary files /dev/null and b/Apps/XinDianTu/Images/7f8ef046-e39a-4784-b940-e48d70ba6632.jpg differ
diff --git a/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_1.jpg b/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_1.jpg
new file mode 100644
index 0000000..d61d19f
Binary files /dev/null and b/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_2.jpg b/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_2.jpg
new file mode 100644
index 0000000..9cce495
Binary files /dev/null and b/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_3.jpg b/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_3.jpg
new file mode 100644
index 0000000..dfd61f5
Binary files /dev/null and b/Apps/XinDianTu/Images/7fe39fca2c5d8c62c24855be5a1e6362_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_1.jpg b/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_1.jpg
new file mode 100644
index 0000000..3cf4703
Binary files /dev/null and b/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_2.jpg b/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_2.jpg
new file mode 100644
index 0000000..91d8a43
Binary files /dev/null and b/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_3.jpg b/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_3.jpg
new file mode 100644
index 0000000..2b2d4a0
Binary files /dev/null and b/Apps/XinDianTu/Images/7fe9b2c6cbbfae5f660869832d0ed0ad_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_1.jpg b/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_1.jpg
new file mode 100644
index 0000000..4b43149
Binary files /dev/null and b/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_2.jpg b/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_2.jpg
new file mode 100644
index 0000000..b9ea3ba
Binary files /dev/null and b/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_3.jpg b/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_3.jpg
new file mode 100644
index 0000000..bc8aa83
Binary files /dev/null and b/Apps/XinDianTu/Images/7ff0db75917ce7f8348db483fe1d0185_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_1.jpg b/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_1.jpg
new file mode 100644
index 0000000..fe12430
Binary files /dev/null and b/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_2.jpg b/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_2.jpg
new file mode 100644
index 0000000..7ae57d4
Binary files /dev/null and b/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_3.jpg b/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_3.jpg
new file mode 100644
index 0000000..4a3a30f
Binary files /dev/null and b/Apps/XinDianTu/Images/801a38062c0c37af9f7535eb8693790e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7.jpg b/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7.jpg
new file mode 100644
index 0000000..1c79688
Binary files /dev/null and b/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7.jpg differ
diff --git a/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7_flag.jpg b/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7_flag.jpg
new file mode 100644
index 0000000..40db3f6
Binary files /dev/null and b/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7_vl.jpg b/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7_vl.jpg
new file mode 100644
index 0000000..d987965
Binary files /dev/null and b/Apps/XinDianTu/Images/80534097-a3e7-44c4-832f-4704fd03d9b7_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_1.jpg b/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_1.jpg
new file mode 100644
index 0000000..f70040d
Binary files /dev/null and b/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_2.jpg b/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_2.jpg
new file mode 100644
index 0000000..cd434b2
Binary files /dev/null and b/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_3.jpg b/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_3.jpg
new file mode 100644
index 0000000..f586917
Binary files /dev/null and b/Apps/XinDianTu/Images/805464597f1969e831004f048af0baa4_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d.jpg b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d.jpg
new file mode 100644
index 0000000..01b42cb
Binary files /dev/null and b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d.jpg differ
diff --git a/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d.json b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d.json
new file mode 100644
index 0000000..8369207
--- /dev/null
+++ b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d.json
@@ -0,0 +1,20 @@
+{
+ "image": "80578a3d-a44c-4a91-b499-bb15c486363d.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 226,
+ 720,
+ 428
+ ],
+ "click_point": [
+ 124,
+ 266
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d_flag.jpg b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d_flag.jpg
new file mode 100644
index 0000000..41dc80e
Binary files /dev/null and b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d_vl.jpg b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d_vl.jpg
new file mode 100644
index 0000000..a78afc2
Binary files /dev/null and b/Apps/XinDianTu/Images/80578a3d-a44c-4a91-b499-bb15c486363d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/80c4f5bb-3a25-4b04-aec8-400741d614cb.jpg b/Apps/XinDianTu/Images/80c4f5bb-3a25-4b04-aec8-400741d614cb.jpg
new file mode 100644
index 0000000..14fc4ce
Binary files /dev/null and b/Apps/XinDianTu/Images/80c4f5bb-3a25-4b04-aec8-400741d614cb.jpg differ
diff --git a/Apps/XinDianTu/Images/80d0333e-4a22-49a1-8445-436f98895336.jpg b/Apps/XinDianTu/Images/80d0333e-4a22-49a1-8445-436f98895336.jpg
new file mode 100644
index 0000000..8d4c0c7
Binary files /dev/null and b/Apps/XinDianTu/Images/80d0333e-4a22-49a1-8445-436f98895336.jpg differ
diff --git a/Apps/XinDianTu/Images/80ebfc6d-3137-47ac-8b25-5ba531ad45ec.jpg b/Apps/XinDianTu/Images/80ebfc6d-3137-47ac-8b25-5ba531ad45ec.jpg
new file mode 100644
index 0000000..c7aa16b
Binary files /dev/null and b/Apps/XinDianTu/Images/80ebfc6d-3137-47ac-8b25-5ba531ad45ec.jpg differ
diff --git a/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525.jpg b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525.jpg
new file mode 100644
index 0000000..873115b
Binary files /dev/null and b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525.jpg differ
diff --git a/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525.json b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525.json
new file mode 100644
index 0000000..3afecab
--- /dev/null
+++ b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525.json
@@ -0,0 +1,46 @@
+{
+ "image": "816bb6a0-c46b-4233-bd93-e336776fe525.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 694
+ ],
+ "click_point": [
+ 121,
+ 462
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 708,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 766
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525_flag.jpg b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525_flag.jpg
new file mode 100644
index 0000000..12ec43b
Binary files /dev/null and b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525_vl.jpg b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525_vl.jpg
new file mode 100644
index 0000000..ada3c85
Binary files /dev/null and b/Apps/XinDianTu/Images/816bb6a0-c46b-4233-bd93-e336776fe525_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/816f7370-a8b7-43d5-8474-774c126ce4e1.jpg b/Apps/XinDianTu/Images/816f7370-a8b7-43d5-8474-774c126ce4e1.jpg
new file mode 100644
index 0000000..de98391
Binary files /dev/null and b/Apps/XinDianTu/Images/816f7370-a8b7-43d5-8474-774c126ce4e1.jpg differ
diff --git a/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d.jpg b/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d.jpg
new file mode 100644
index 0000000..50c53ef
Binary files /dev/null and b/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d.jpg differ
diff --git a/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d_flag.jpg b/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d_flag.jpg
new file mode 100644
index 0000000..30d23f3
Binary files /dev/null and b/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d_vl.jpg b/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d_vl.jpg
new file mode 100644
index 0000000..8f62fea
Binary files /dev/null and b/Apps/XinDianTu/Images/819863b8-1dd9-45ca-8be9-7c236088b42d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a.jpg b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a.jpg
new file mode 100644
index 0000000..3a01c1c
Binary files /dev/null and b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a.jpg differ
diff --git a/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a.json b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a.json
new file mode 100644
index 0000000..16e14b1
--- /dev/null
+++ b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a.json
@@ -0,0 +1,46 @@
+{
+ "image": "81e777dd-c980-4cbb-825d-3bdf453b3b9a.jpg",
+ "width": 720,
+ "height": 302,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 553,
+ 700,
+ 799
+ ],
+ "click_point": [
+ 121,
+ 602
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 812,
+ 700,
+ 1060
+ ],
+ "click_point": [
+ 121,
+ 861
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1072,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1132
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a_flag.jpg b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a_flag.jpg
new file mode 100644
index 0000000..d83a08e
Binary files /dev/null and b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a_vl.jpg b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a_vl.jpg
new file mode 100644
index 0000000..88a9dce
Binary files /dev/null and b/Apps/XinDianTu/Images/81e777dd-c980-4cbb-825d-3bdf453b3b9a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c.jpg b/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c.jpg
new file mode 100644
index 0000000..28dfc5a
Binary files /dev/null and b/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c.jpg differ
diff --git a/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c_flag.jpg b/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c_flag.jpg
new file mode 100644
index 0000000..03fca08
Binary files /dev/null and b/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c_vl.jpg b/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c_vl.jpg
new file mode 100644
index 0000000..97226ae
Binary files /dev/null and b/Apps/XinDianTu/Images/81fc10a2-544d-4776-9550-877360e0ae9c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_1.jpg b/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_1.jpg
new file mode 100644
index 0000000..41220de
Binary files /dev/null and b/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_2.jpg b/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_2.jpg
new file mode 100644
index 0000000..8ea0486
Binary files /dev/null and b/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_3.jpg b/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_3.jpg
new file mode 100644
index 0000000..5eb9dbe
Binary files /dev/null and b/Apps/XinDianTu/Images/827c42bc8db0bd783df2d2b64fe4371b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_1.jpg b/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_1.jpg
new file mode 100644
index 0000000..b0a9d07
Binary files /dev/null and b/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_2.jpg b/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_2.jpg
new file mode 100644
index 0000000..0024ef3
Binary files /dev/null and b/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_3.jpg b/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_3.jpg
new file mode 100644
index 0000000..6cd440a
Binary files /dev/null and b/Apps/XinDianTu/Images/829f8d1502626f64aed99f2151c7ea27_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/82d67faa-1611-4c51-ac56-7f457a2a6cca.jpg b/Apps/XinDianTu/Images/82d67faa-1611-4c51-ac56-7f457a2a6cca.jpg
new file mode 100644
index 0000000..8c0462e
Binary files /dev/null and b/Apps/XinDianTu/Images/82d67faa-1611-4c51-ac56-7f457a2a6cca.jpg differ
diff --git a/Apps/XinDianTu/Images/82ddd85b-b648-455c-814c-732fdb3cf400.jpg b/Apps/XinDianTu/Images/82ddd85b-b648-455c-814c-732fdb3cf400.jpg
new file mode 100644
index 0000000..9077ba7
Binary files /dev/null and b/Apps/XinDianTu/Images/82ddd85b-b648-455c-814c-732fdb3cf400.jpg differ
diff --git a/Apps/XinDianTu/Images/82ef8a80-1d18-4925-b711-ce3a1032b301.jpg b/Apps/XinDianTu/Images/82ef8a80-1d18-4925-b711-ce3a1032b301.jpg
new file mode 100644
index 0000000..084bd15
Binary files /dev/null and b/Apps/XinDianTu/Images/82ef8a80-1d18-4925-b711-ce3a1032b301.jpg differ
diff --git a/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399.jpg b/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399.jpg
new file mode 100644
index 0000000..250ecc8
Binary files /dev/null and b/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399.jpg differ
diff --git a/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399_flag.jpg b/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399_flag.jpg
new file mode 100644
index 0000000..f6e701c
Binary files /dev/null and b/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399_vl.jpg b/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399_vl.jpg
new file mode 100644
index 0000000..4ecb841
Binary files /dev/null and b/Apps/XinDianTu/Images/831b5fe5-ca20-49f4-a8ab-c1f4ab010399_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/841f29a1-2537-413e-9c8d-68203b95c0e3.jpg b/Apps/XinDianTu/Images/841f29a1-2537-413e-9c8d-68203b95c0e3.jpg
new file mode 100644
index 0000000..6e69377
Binary files /dev/null and b/Apps/XinDianTu/Images/841f29a1-2537-413e-9c8d-68203b95c0e3.jpg differ
diff --git a/Apps/XinDianTu/Images/8431f691-4f79-46e5-85b8-ef21a775d213.jpg b/Apps/XinDianTu/Images/8431f691-4f79-46e5-85b8-ef21a775d213.jpg
new file mode 100644
index 0000000..8de799c
Binary files /dev/null and b/Apps/XinDianTu/Images/8431f691-4f79-46e5-85b8-ef21a775d213.jpg differ
diff --git a/Apps/XinDianTu/Images/84583e90-34b0-4664-a9f7-84b2f8f43adf.jpg b/Apps/XinDianTu/Images/84583e90-34b0-4664-a9f7-84b2f8f43adf.jpg
new file mode 100644
index 0000000..7411536
Binary files /dev/null and b/Apps/XinDianTu/Images/84583e90-34b0-4664-a9f7-84b2f8f43adf.jpg differ
diff --git a/Apps/XinDianTu/Images/847d6658-e927-4283-94ad-3b26690364ca.jpg b/Apps/XinDianTu/Images/847d6658-e927-4283-94ad-3b26690364ca.jpg
new file mode 100644
index 0000000..10f8498
Binary files /dev/null and b/Apps/XinDianTu/Images/847d6658-e927-4283-94ad-3b26690364ca.jpg differ
diff --git a/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8.jpg b/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8.jpg
new file mode 100644
index 0000000..bbb250e
Binary files /dev/null and b/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8.jpg differ
diff --git a/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8_flag.jpg b/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8_flag.jpg
new file mode 100644
index 0000000..e97b7b1
Binary files /dev/null and b/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8_vl.jpg b/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8_vl.jpg
new file mode 100644
index 0000000..e831ad6
Binary files /dev/null and b/Apps/XinDianTu/Images/84b99e5c-09ad-4782-9c95-19dec0689be8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_1.jpg b/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_1.jpg
new file mode 100644
index 0000000..db8d939
Binary files /dev/null and b/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_2.jpg b/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_2.jpg
new file mode 100644
index 0000000..9b0f282
Binary files /dev/null and b/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_3.jpg b/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_3.jpg
new file mode 100644
index 0000000..0f89e13
Binary files /dev/null and b/Apps/XinDianTu/Images/85086207f8c9f32ed2c3e935e98c204a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8582c058-b47c-4817-9c1c-b909a6934750.jpg b/Apps/XinDianTu/Images/8582c058-b47c-4817-9c1c-b909a6934750.jpg
new file mode 100644
index 0000000..ba07528
Binary files /dev/null and b/Apps/XinDianTu/Images/8582c058-b47c-4817-9c1c-b909a6934750.jpg differ
diff --git a/Apps/XinDianTu/Images/85b76bd5-20e8-42c1-9a82-4464bfcf9781.jpg b/Apps/XinDianTu/Images/85b76bd5-20e8-42c1-9a82-4464bfcf9781.jpg
new file mode 100644
index 0000000..17a5006
Binary files /dev/null and b/Apps/XinDianTu/Images/85b76bd5-20e8-42c1-9a82-4464bfcf9781.jpg differ
diff --git a/Apps/XinDianTu/Images/85c1cf17-8bbc-451c-88e3-166d790441e1.jpg b/Apps/XinDianTu/Images/85c1cf17-8bbc-451c-88e3-166d790441e1.jpg
new file mode 100644
index 0000000..6510951
Binary files /dev/null and b/Apps/XinDianTu/Images/85c1cf17-8bbc-451c-88e3-166d790441e1.jpg differ
diff --git a/Apps/XinDianTu/Images/85f73cd3-ec40-414e-8f73-71798aff917d.jpg b/Apps/XinDianTu/Images/85f73cd3-ec40-414e-8f73-71798aff917d.jpg
new file mode 100644
index 0000000..76bb3a4
Binary files /dev/null and b/Apps/XinDianTu/Images/85f73cd3-ec40-414e-8f73-71798aff917d.jpg differ
diff --git a/Apps/XinDianTu/Images/861b0359-fd73-4bd1-9bf8-766dcb0e2401.jpg b/Apps/XinDianTu/Images/861b0359-fd73-4bd1-9bf8-766dcb0e2401.jpg
new file mode 100644
index 0000000..d599ab8
Binary files /dev/null and b/Apps/XinDianTu/Images/861b0359-fd73-4bd1-9bf8-766dcb0e2401.jpg differ
diff --git a/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778.jpg b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778.jpg
new file mode 100644
index 0000000..39acdef
Binary files /dev/null and b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778.jpg differ
diff --git a/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778.json b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778.json
new file mode 100644
index 0000000..d2b3f24
--- /dev/null
+++ b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778.json
@@ -0,0 +1,46 @@
+{
+ "image": "86231538-39be-40c6-bf13-af7e5b29b778.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778_flag.jpg b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778_flag.jpg
new file mode 100644
index 0000000..4c70321
Binary files /dev/null and b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778_vl.jpg b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778_vl.jpg
new file mode 100644
index 0000000..21b58da
Binary files /dev/null and b/Apps/XinDianTu/Images/86231538-39be-40c6-bf13-af7e5b29b778_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8657e7ce-e4c3-4a75-b9a9-cc4c17293c18.jpg b/Apps/XinDianTu/Images/8657e7ce-e4c3-4a75-b9a9-cc4c17293c18.jpg
new file mode 100644
index 0000000..53fe6a5
Binary files /dev/null and b/Apps/XinDianTu/Images/8657e7ce-e4c3-4a75-b9a9-cc4c17293c18.jpg differ
diff --git a/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_1.jpg b/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_1.jpg
new file mode 100644
index 0000000..4294ec6
Binary files /dev/null and b/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_2.jpg b/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_2.jpg
new file mode 100644
index 0000000..59a149e
Binary files /dev/null and b/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_3.jpg b/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_3.jpg
new file mode 100644
index 0000000..2424109
Binary files /dev/null and b/Apps/XinDianTu/Images/867d112ad11fdf816deb5cc8520d8292_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8697e993-677c-4e21-81b1-65a943312343.jpg b/Apps/XinDianTu/Images/8697e993-677c-4e21-81b1-65a943312343.jpg
new file mode 100644
index 0000000..319e0e3
Binary files /dev/null and b/Apps/XinDianTu/Images/8697e993-677c-4e21-81b1-65a943312343.jpg differ
diff --git a/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_1.jpg b/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_1.jpg
new file mode 100644
index 0000000..28d042f
Binary files /dev/null and b/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_2.jpg b/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_2.jpg
new file mode 100644
index 0000000..640aef4
Binary files /dev/null and b/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_3.jpg b/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_3.jpg
new file mode 100644
index 0000000..a74ce1a
Binary files /dev/null and b/Apps/XinDianTu/Images/86c437e5fdb1d25150a9ce9cd060356c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/86d20716-ce50-4472-8c63-5a206aa7a50f.jpg b/Apps/XinDianTu/Images/86d20716-ce50-4472-8c63-5a206aa7a50f.jpg
new file mode 100644
index 0000000..b83796a
Binary files /dev/null and b/Apps/XinDianTu/Images/86d20716-ce50-4472-8c63-5a206aa7a50f.jpg differ
diff --git a/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696.jpg b/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696.jpg
new file mode 100644
index 0000000..be2c092
Binary files /dev/null and b/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696.jpg differ
diff --git a/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696_flag.jpg b/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696_flag.jpg
new file mode 100644
index 0000000..91ca7c5
Binary files /dev/null and b/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696_vl.jpg b/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696_vl.jpg
new file mode 100644
index 0000000..5d190a1
Binary files /dev/null and b/Apps/XinDianTu/Images/87409094-1143-478c-9007-a732c3a8b696_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/87c93f15-56c0-4115-9df8-f5e82820a4ca.jpg b/Apps/XinDianTu/Images/87c93f15-56c0-4115-9df8-f5e82820a4ca.jpg
new file mode 100644
index 0000000..76d9cf5
Binary files /dev/null and b/Apps/XinDianTu/Images/87c93f15-56c0-4115-9df8-f5e82820a4ca.jpg differ
diff --git a/Apps/XinDianTu/Images/87f4b392-548a-4eb4-af3e-ad5c03dda024.jpg b/Apps/XinDianTu/Images/87f4b392-548a-4eb4-af3e-ad5c03dda024.jpg
new file mode 100644
index 0000000..7e88257
Binary files /dev/null and b/Apps/XinDianTu/Images/87f4b392-548a-4eb4-af3e-ad5c03dda024.jpg differ
diff --git a/Apps/XinDianTu/Images/88007cd2-982b-4fc1-81a3-9c50fd3f9e61.jpg b/Apps/XinDianTu/Images/88007cd2-982b-4fc1-81a3-9c50fd3f9e61.jpg
new file mode 100644
index 0000000..e08ec2c
Binary files /dev/null and b/Apps/XinDianTu/Images/88007cd2-982b-4fc1-81a3-9c50fd3f9e61.jpg differ
diff --git a/Apps/XinDianTu/Images/881304e7-d8fc-4d09-b362-46a9e71be346.jpg b/Apps/XinDianTu/Images/881304e7-d8fc-4d09-b362-46a9e71be346.jpg
new file mode 100644
index 0000000..3ab3991
Binary files /dev/null and b/Apps/XinDianTu/Images/881304e7-d8fc-4d09-b362-46a9e71be346.jpg differ
diff --git a/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed.jpg b/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed.jpg
new file mode 100644
index 0000000..9490897
Binary files /dev/null and b/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed.jpg differ
diff --git a/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed_flag.jpg b/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed_flag.jpg
new file mode 100644
index 0000000..8d28113
Binary files /dev/null and b/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed_vl.jpg b/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed_vl.jpg
new file mode 100644
index 0000000..e147849
Binary files /dev/null and b/Apps/XinDianTu/Images/881e5d8c-65e4-4232-b423-c5c1d0ad87ed_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/88883d8d-b9d4-4edf-91d2-98bec14945eb.jpg b/Apps/XinDianTu/Images/88883d8d-b9d4-4edf-91d2-98bec14945eb.jpg
new file mode 100644
index 0000000..d130908
Binary files /dev/null and b/Apps/XinDianTu/Images/88883d8d-b9d4-4edf-91d2-98bec14945eb.jpg differ
diff --git a/Apps/XinDianTu/Images/8902c986-b410-4d8b-b9c8-590d3f1fecc4.jpg b/Apps/XinDianTu/Images/8902c986-b410-4d8b-b9c8-590d3f1fecc4.jpg
new file mode 100644
index 0000000..d8d0b75
Binary files /dev/null and b/Apps/XinDianTu/Images/8902c986-b410-4d8b-b9c8-590d3f1fecc4.jpg differ
diff --git a/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_1.jpg b/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_1.jpg
new file mode 100644
index 0000000..259f1ed
Binary files /dev/null and b/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_2.jpg b/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_2.jpg
new file mode 100644
index 0000000..0de2ccc
Binary files /dev/null and b/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_3.jpg b/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_3.jpg
new file mode 100644
index 0000000..77029d9
Binary files /dev/null and b/Apps/XinDianTu/Images/890302bd4ae84ec34e62eb5ba36b68cf_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_1.jpg b/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_1.jpg
new file mode 100644
index 0000000..dd2485c
Binary files /dev/null and b/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_2.jpg b/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_2.jpg
new file mode 100644
index 0000000..4a76cb7
Binary files /dev/null and b/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_3.jpg b/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_3.jpg
new file mode 100644
index 0000000..eabd150
Binary files /dev/null and b/Apps/XinDianTu/Images/895883554db4f5c306593dc63495238c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471.jpg b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471.jpg
new file mode 100644
index 0000000..e579579
Binary files /dev/null and b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471.jpg differ
diff --git a/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471.json b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471.json
new file mode 100644
index 0000000..7d9cba7
--- /dev/null
+++ b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471.json
@@ -0,0 +1,46 @@
+{
+ "image": "89cef571-a5d2-42e4-87d9-08e8ea3a9471.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471_flag.jpg b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471_flag.jpg
new file mode 100644
index 0000000..dfd1a87
Binary files /dev/null and b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471_vl.jpg b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471_vl.jpg
new file mode 100644
index 0000000..fb6c186
Binary files /dev/null and b/Apps/XinDianTu/Images/89cef571-a5d2-42e4-87d9-08e8ea3a9471_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/89df1830-e7c2-4684-9c6b-f51bf74c5b6f.jpg b/Apps/XinDianTu/Images/89df1830-e7c2-4684-9c6b-f51bf74c5b6f.jpg
new file mode 100644
index 0000000..90b1db2
Binary files /dev/null and b/Apps/XinDianTu/Images/89df1830-e7c2-4684-9c6b-f51bf74c5b6f.jpg differ
diff --git a/Apps/XinDianTu/Images/89e5c779-80e3-43ae-8a7a-b3ca1de490b5.jpg b/Apps/XinDianTu/Images/89e5c779-80e3-43ae-8a7a-b3ca1de490b5.jpg
new file mode 100644
index 0000000..6707a11
Binary files /dev/null and b/Apps/XinDianTu/Images/89e5c779-80e3-43ae-8a7a-b3ca1de490b5.jpg differ
diff --git a/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_1.jpg b/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_1.jpg
new file mode 100644
index 0000000..46cf416
Binary files /dev/null and b/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_2.jpg b/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_2.jpg
new file mode 100644
index 0000000..6e357c0
Binary files /dev/null and b/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_3.jpg b/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_3.jpg
new file mode 100644
index 0000000..b0233c1
Binary files /dev/null and b/Apps/XinDianTu/Images/89f11dd56c508db3f8b4390fb10b7367_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5.jpg b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5.jpg
new file mode 100644
index 0000000..16044f3
Binary files /dev/null and b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5.jpg differ
diff --git a/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5.json b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5.json
new file mode 100644
index 0000000..c72168b
--- /dev/null
+++ b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5.json
@@ -0,0 +1,59 @@
+{
+ "image": "8a069c6c-7a38-490a-aac5-252927ee9fe5.jpg",
+ "width": 720,
+ "height": 194,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 419,
+ 700,
+ 620
+ ],
+ "click_point": [
+ 121,
+ 459
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 632,
+ 700,
+ 908
+ ],
+ "click_point": [
+ 121,
+ 687
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 921,
+ 700,
+ 1167
+ ],
+ "click_point": [
+ 121,
+ 970
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1180,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1218
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5_flag.jpg b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5_flag.jpg
new file mode 100644
index 0000000..e2b7a8f
Binary files /dev/null and b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5_vl.jpg b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5_vl.jpg
new file mode 100644
index 0000000..7ba86cb
Binary files /dev/null and b/Apps/XinDianTu/Images/8a069c6c-7a38-490a-aac5-252927ee9fe5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8a2856c2-096b-4b75-a926-0d729bf4241c.jpg b/Apps/XinDianTu/Images/8a2856c2-096b-4b75-a926-0d729bf4241c.jpg
new file mode 100644
index 0000000..1c9378a
Binary files /dev/null and b/Apps/XinDianTu/Images/8a2856c2-096b-4b75-a926-0d729bf4241c.jpg differ
diff --git a/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814.jpg b/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814.jpg
new file mode 100644
index 0000000..148fe59
Binary files /dev/null and b/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814.jpg differ
diff --git a/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814_flag.jpg b/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814_flag.jpg
new file mode 100644
index 0000000..fc09bcd
Binary files /dev/null and b/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814_vl.jpg b/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814_vl.jpg
new file mode 100644
index 0000000..c25f5ce
Binary files /dev/null and b/Apps/XinDianTu/Images/8a9a38ab-8135-41d1-9966-8aefae4c8814_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9.jpg b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9.jpg
new file mode 100644
index 0000000..39cc169
Binary files /dev/null and b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9.jpg differ
diff --git a/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9.json b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9.json
new file mode 100644
index 0000000..11a1e53
--- /dev/null
+++ b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9.json
@@ -0,0 +1,46 @@
+{
+ "image": "8b176b89-9d24-47bb-9b44-f3e94fef9ea9.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 529,
+ 700,
+ 780
+ ],
+ "click_point": [
+ 121,
+ 579
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 794,
+ 700,
+ 1040
+ ],
+ "click_point": [
+ 121,
+ 843
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1049,
+ 700,
+ 1300
+ ],
+ "click_point": [
+ 121,
+ 1099
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9_flag.jpg b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9_flag.jpg
new file mode 100644
index 0000000..8eb62c7
Binary files /dev/null and b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9_vl.jpg b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9_vl.jpg
new file mode 100644
index 0000000..0019a0c
Binary files /dev/null and b/Apps/XinDianTu/Images/8b176b89-9d24-47bb-9b44-f3e94fef9ea9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_1.jpg b/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_1.jpg
new file mode 100644
index 0000000..b6b14f7
Binary files /dev/null and b/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_2.jpg b/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_2.jpg
new file mode 100644
index 0000000..55e4475
Binary files /dev/null and b/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_3.jpg b/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_3.jpg
new file mode 100644
index 0000000..c623eec
Binary files /dev/null and b/Apps/XinDianTu/Images/8b1cc1d4ce8140cb20ad24949a219058_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_1.jpg b/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_1.jpg
new file mode 100644
index 0000000..01dddc7
Binary files /dev/null and b/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_2.jpg b/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_2.jpg
new file mode 100644
index 0000000..a3f9b09
Binary files /dev/null and b/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_3.jpg b/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_3.jpg
new file mode 100644
index 0000000..78cef5a
Binary files /dev/null and b/Apps/XinDianTu/Images/8b9318b4e77f38656afb9e3237468e04_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_1.jpg b/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_1.jpg
new file mode 100644
index 0000000..2f38bf0
Binary files /dev/null and b/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_2.jpg b/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_2.jpg
new file mode 100644
index 0000000..2f38bf0
Binary files /dev/null and b/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_3.jpg b/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_3.jpg
new file mode 100644
index 0000000..2f38bf0
Binary files /dev/null and b/Apps/XinDianTu/Images/8baca337c81957566398de360f592dff_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8bea9a25-9725-47ad-96a5-db2d6ad8b06e.jpg b/Apps/XinDianTu/Images/8bea9a25-9725-47ad-96a5-db2d6ad8b06e.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/8bea9a25-9725-47ad-96a5-db2d6ad8b06e.jpg differ
diff --git a/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_1.jpg b/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_1.jpg
new file mode 100644
index 0000000..9f28075
Binary files /dev/null and b/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_2.jpg b/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_2.jpg
new file mode 100644
index 0000000..1c093ff
Binary files /dev/null and b/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_3.jpg b/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_3.jpg
new file mode 100644
index 0000000..c746530
Binary files /dev/null and b/Apps/XinDianTu/Images/8c1e9db7d39089074b37cabeea2990af_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8c544257-e37e-43bf-aa11-2415e4335413.jpg b/Apps/XinDianTu/Images/8c544257-e37e-43bf-aa11-2415e4335413.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/8c544257-e37e-43bf-aa11-2415e4335413.jpg differ
diff --git a/Apps/XinDianTu/Images/8c7dba01-7a29-4411-b1ee-43ba79efd390.jpg b/Apps/XinDianTu/Images/8c7dba01-7a29-4411-b1ee-43ba79efd390.jpg
new file mode 100644
index 0000000..df0a5c0
Binary files /dev/null and b/Apps/XinDianTu/Images/8c7dba01-7a29-4411-b1ee-43ba79efd390.jpg differ
diff --git a/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3.jpg b/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3.jpg
new file mode 100644
index 0000000..3cafcaa
Binary files /dev/null and b/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3.jpg differ
diff --git a/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3_flag.jpg b/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3_flag.jpg
new file mode 100644
index 0000000..93db36e
Binary files /dev/null and b/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3_vl.jpg b/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3_vl.jpg
new file mode 100644
index 0000000..0428e67
Binary files /dev/null and b/Apps/XinDianTu/Images/8c8fa2b3-369b-4b87-b655-e0282f0a17a3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_1.jpg b/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_1.jpg
new file mode 100644
index 0000000..88c235a
Binary files /dev/null and b/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_2.jpg b/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_2.jpg
new file mode 100644
index 0000000..9fbdc8f
Binary files /dev/null and b/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_3.jpg b/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_3.jpg
new file mode 100644
index 0000000..fe0fe1b
Binary files /dev/null and b/Apps/XinDianTu/Images/8cc5d4b64840a58c0518e2fe325e5627_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f.jpg b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f.jpg
new file mode 100644
index 0000000..b83ac82
Binary files /dev/null and b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f.jpg differ
diff --git a/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f.json b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f.json
new file mode 100644
index 0000000..787522e
--- /dev/null
+++ b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f.json
@@ -0,0 +1,46 @@
+{
+ "image": "8cd6c644-345b-4d95-8c35-021337b5773f.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 403,
+ 700,
+ 671
+ ],
+ "click_point": [
+ 121,
+ 456
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 680,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 743
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f_flag.jpg b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f_flag.jpg
new file mode 100644
index 0000000..3d9e261
Binary files /dev/null and b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f_vl.jpg b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f_vl.jpg
new file mode 100644
index 0000000..0c23e0a
Binary files /dev/null and b/Apps/XinDianTu/Images/8cd6c644-345b-4d95-8c35-021337b5773f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_1.jpg b/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_1.jpg
new file mode 100644
index 0000000..f88d3a6
Binary files /dev/null and b/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_2.jpg b/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_2.jpg
new file mode 100644
index 0000000..2b4e97d
Binary files /dev/null and b/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_3.jpg b/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_3.jpg
new file mode 100644
index 0000000..99ddb0e
Binary files /dev/null and b/Apps/XinDianTu/Images/8d7a17bf6db93b856bc2c187e2ce8913_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_1.jpg b/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_1.jpg
new file mode 100644
index 0000000..44074de
Binary files /dev/null and b/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_2.jpg b/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_2.jpg
new file mode 100644
index 0000000..6ad5590
Binary files /dev/null and b/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_3.jpg b/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_3.jpg
new file mode 100644
index 0000000..1881e95
Binary files /dev/null and b/Apps/XinDianTu/Images/8de33eb7c14ef4c0f604e80b882f15d7_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_1.jpg b/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_1.jpg
new file mode 100644
index 0000000..67471cc
Binary files /dev/null and b/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_2.jpg b/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_2.jpg
new file mode 100644
index 0000000..25a2ad1
Binary files /dev/null and b/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_3.jpg b/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_3.jpg
new file mode 100644
index 0000000..1691ec9
Binary files /dev/null and b/Apps/XinDianTu/Images/8def77e3a2ac958d9288aefc7b7c5f67_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8dfdd958-d887-4a0b-9c41-f9e87ca0a1ec.jpg b/Apps/XinDianTu/Images/8dfdd958-d887-4a0b-9c41-f9e87ca0a1ec.jpg
new file mode 100644
index 0000000..c197f4b
Binary files /dev/null and b/Apps/XinDianTu/Images/8dfdd958-d887-4a0b-9c41-f9e87ca0a1ec.jpg differ
diff --git a/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6.jpg b/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6.jpg
new file mode 100644
index 0000000..e646d3d
Binary files /dev/null and b/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6.jpg differ
diff --git a/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6_flag.jpg b/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6_flag.jpg
new file mode 100644
index 0000000..39e6232
Binary files /dev/null and b/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6_vl.jpg b/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6_vl.jpg
new file mode 100644
index 0000000..5e3a220
Binary files /dev/null and b/Apps/XinDianTu/Images/8e122232-bf18-4782-90e8-f8b927db39c6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8edc2897-8342-4537-bb2e-e1ea6204f57d.jpg b/Apps/XinDianTu/Images/8edc2897-8342-4537-bb2e-e1ea6204f57d.jpg
new file mode 100644
index 0000000..aefb74b
Binary files /dev/null and b/Apps/XinDianTu/Images/8edc2897-8342-4537-bb2e-e1ea6204f57d.jpg differ
diff --git a/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979.jpg b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979.jpg
new file mode 100644
index 0000000..2adf606
Binary files /dev/null and b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979.jpg differ
diff --git a/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979.json b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979.json
new file mode 100644
index 0000000..efe0a6a
--- /dev/null
+++ b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979.json
@@ -0,0 +1,46 @@
+{
+ "image": "8f0e5d9f-c64f-4971-9b16-f198af242979.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 539,
+ 700,
+ 788
+ ],
+ "click_point": [
+ 121,
+ 588
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 794,
+ 700,
+ 1076
+ ],
+ "click_point": [
+ 121,
+ 850
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1084,
+ 700,
+ 1333
+ ],
+ "click_point": [
+ 121,
+ 1133
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979_flag.jpg b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979_flag.jpg
new file mode 100644
index 0000000..4bba381
Binary files /dev/null and b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979_vl.jpg b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979_vl.jpg
new file mode 100644
index 0000000..43954c0
Binary files /dev/null and b/Apps/XinDianTu/Images/8f0e5d9f-c64f-4971-9b16-f198af242979_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_1.jpg b/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_1.jpg
new file mode 100644
index 0000000..d2ab8d6
Binary files /dev/null and b/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_2.jpg b/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_2.jpg
new file mode 100644
index 0000000..507f5fe
Binary files /dev/null and b/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_3.jpg b/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_3.jpg
new file mode 100644
index 0000000..b354468
Binary files /dev/null and b/Apps/XinDianTu/Images/8f5bc62e4dae5a4b22150aac2237dfe9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/8f64d77b-d8d1-4561-b873-3e2befd99b57.jpg b/Apps/XinDianTu/Images/8f64d77b-d8d1-4561-b873-3e2befd99b57.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/8f64d77b-d8d1-4561-b873-3e2befd99b57.jpg differ
diff --git a/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990.jpg b/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990.jpg
new file mode 100644
index 0000000..3b5da4c
Binary files /dev/null and b/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990.jpg differ
diff --git a/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990_flag.jpg b/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990_flag.jpg
new file mode 100644
index 0000000..247a458
Binary files /dev/null and b/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990_vl.jpg b/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990_vl.jpg
new file mode 100644
index 0000000..0995ace
Binary files /dev/null and b/Apps/XinDianTu/Images/8fcfd87f-6c8b-4330-8d24-08cc87303990_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/8fd0e4e6-a94a-40ec-a4c0-4fc8a7e8b389.jpg b/Apps/XinDianTu/Images/8fd0e4e6-a94a-40ec-a4c0-4fc8a7e8b389.jpg
new file mode 100644
index 0000000..61982cf
Binary files /dev/null and b/Apps/XinDianTu/Images/8fd0e4e6-a94a-40ec-a4c0-4fc8a7e8b389.jpg differ
diff --git a/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_1.jpg b/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_1.jpg
new file mode 100644
index 0000000..81c591b
Binary files /dev/null and b/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_2.jpg b/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_2.jpg
new file mode 100644
index 0000000..79af538
Binary files /dev/null and b/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_3.jpg b/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_3.jpg
new file mode 100644
index 0000000..37e49a0
Binary files /dev/null and b/Apps/XinDianTu/Images/8fdd6f4e4df3892287ce4f07fad1b2c4_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/9050f265-95a6-4513-83b5-3501c8393d5d.jpg b/Apps/XinDianTu/Images/9050f265-95a6-4513-83b5-3501c8393d5d.jpg
new file mode 100644
index 0000000..8de8a77
Binary files /dev/null and b/Apps/XinDianTu/Images/9050f265-95a6-4513-83b5-3501c8393d5d.jpg differ
diff --git a/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_1.jpg b/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_1.jpg
new file mode 100644
index 0000000..f60b978
Binary files /dev/null and b/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_2.jpg b/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_2.jpg
new file mode 100644
index 0000000..10d3b64
Binary files /dev/null and b/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_3.jpg b/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_3.jpg
new file mode 100644
index 0000000..356978a
Binary files /dev/null and b/Apps/XinDianTu/Images/906669611cbd026260524bf8840d6781_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/908b75e6-314a-42f1-8241-f2e0313e3d47.jpg b/Apps/XinDianTu/Images/908b75e6-314a-42f1-8241-f2e0313e3d47.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/908b75e6-314a-42f1-8241-f2e0313e3d47.jpg differ
diff --git a/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_1.jpg b/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_1.jpg
new file mode 100644
index 0000000..4b0da7a
Binary files /dev/null and b/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_2.jpg b/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_2.jpg
new file mode 100644
index 0000000..f7f9548
Binary files /dev/null and b/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_3.jpg b/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_3.jpg
new file mode 100644
index 0000000..e6a4c3a
Binary files /dev/null and b/Apps/XinDianTu/Images/9106b0d50f9363c9923bf08afd246158_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/911ab50f-60aa-4a9a-86fd-1aa144890abb.jpg b/Apps/XinDianTu/Images/911ab50f-60aa-4a9a-86fd-1aa144890abb.jpg
new file mode 100644
index 0000000..48b480b
Binary files /dev/null and b/Apps/XinDianTu/Images/911ab50f-60aa-4a9a-86fd-1aa144890abb.jpg differ
diff --git a/Apps/XinDianTu/Images/91825f68-0308-4b4e-86ab-a7ec687611fa.jpg b/Apps/XinDianTu/Images/91825f68-0308-4b4e-86ab-a7ec687611fa.jpg
new file mode 100644
index 0000000..99f7633
Binary files /dev/null and b/Apps/XinDianTu/Images/91825f68-0308-4b4e-86ab-a7ec687611fa.jpg differ
diff --git a/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_1.jpg b/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_1.jpg
new file mode 100644
index 0000000..8921ec4
Binary files /dev/null and b/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_2.jpg b/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_2.jpg
new file mode 100644
index 0000000..4d01c4c
Binary files /dev/null and b/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_3.jpg b/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_3.jpg
new file mode 100644
index 0000000..8eb2be9
Binary files /dev/null and b/Apps/XinDianTu/Images/91b28a27d9629b5d27de2c8fe3ba56b9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e.jpg b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e.jpg
new file mode 100644
index 0000000..4734fe5
Binary files /dev/null and b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e.jpg differ
diff --git a/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e.json b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e.json
new file mode 100644
index 0000000..e9c4d89
--- /dev/null
+++ b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e.json
@@ -0,0 +1,46 @@
+{
+ "image": "91cf25a2-2612-4ca6-8576-a10675f5838e.jpg",
+ "width": 720,
+ "height": 138,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 508,
+ 700,
+ 759
+ ],
+ "click_point": [
+ 121,
+ 558
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 768,
+ 700,
+ 1014
+ ],
+ "click_point": [
+ 121,
+ 817
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1028,
+ 700,
+ 1222
+ ],
+ "click_point": [
+ 121,
+ 1066
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e_flag.jpg b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e_flag.jpg
new file mode 100644
index 0000000..ca8e1e5
Binary files /dev/null and b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e_vl.jpg b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e_vl.jpg
new file mode 100644
index 0000000..9c1ad18
Binary files /dev/null and b/Apps/XinDianTu/Images/91cf25a2-2612-4ca6-8576-a10675f5838e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/91e3fdcc-180d-48c3-8cb2-c3295bd5e9fc.jpg b/Apps/XinDianTu/Images/91e3fdcc-180d-48c3-8cb2-c3295bd5e9fc.jpg
new file mode 100644
index 0000000..25d97a9
Binary files /dev/null and b/Apps/XinDianTu/Images/91e3fdcc-180d-48c3-8cb2-c3295bd5e9fc.jpg differ
diff --git a/Apps/XinDianTu/Images/928b173f-8f07-4e31-9f1d-3b35b0b94745.jpg b/Apps/XinDianTu/Images/928b173f-8f07-4e31-9f1d-3b35b0b94745.jpg
new file mode 100644
index 0000000..7d21b8a
Binary files /dev/null and b/Apps/XinDianTu/Images/928b173f-8f07-4e31-9f1d-3b35b0b94745.jpg differ
diff --git a/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_1.jpg b/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_1.jpg
new file mode 100644
index 0000000..472030f
Binary files /dev/null and b/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_2.jpg b/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_2.jpg
new file mode 100644
index 0000000..e884536
Binary files /dev/null and b/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_3.jpg b/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_3.jpg
new file mode 100644
index 0000000..5c31f68
Binary files /dev/null and b/Apps/XinDianTu/Images/928dfb8d67d945adcdc548d7220df3b6_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/92e9ce2f-6422-4894-9566-93070dbeb320.jpg b/Apps/XinDianTu/Images/92e9ce2f-6422-4894-9566-93070dbeb320.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/92e9ce2f-6422-4894-9566-93070dbeb320.jpg differ
diff --git a/Apps/XinDianTu/Images/92f2f226-41a0-4312-980f-1fd3124e90a6.jpg b/Apps/XinDianTu/Images/92f2f226-41a0-4312-980f-1fd3124e90a6.jpg
new file mode 100644
index 0000000..66d2d32
Binary files /dev/null and b/Apps/XinDianTu/Images/92f2f226-41a0-4312-980f-1fd3124e90a6.jpg differ
diff --git a/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_1.jpg b/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_1.jpg
new file mode 100644
index 0000000..b77bc14
Binary files /dev/null and b/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_2.jpg b/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_2.jpg
new file mode 100644
index 0000000..740f397
Binary files /dev/null and b/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_3.jpg b/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_3.jpg
new file mode 100644
index 0000000..a6c8351
Binary files /dev/null and b/Apps/XinDianTu/Images/92fb7aa47d3dc314ca00b6e9c8bfeac1_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0.jpg b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0.jpg
new file mode 100644
index 0000000..ea12c95
Binary files /dev/null and b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0.jpg differ
diff --git a/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0.json b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0.json
new file mode 100644
index 0000000..8c8dc60
--- /dev/null
+++ b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0.json
@@ -0,0 +1,59 @@
+{
+ "image": "931512c0-9c76-499f-a5ef-778017738fb0.jpg",
+ "width": 720,
+ "height": 166,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 606
+ ],
+ "click_point": [
+ 121,
+ 444
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 620,
+ 700,
+ 934
+ ],
+ "click_point": [
+ 121,
+ 682
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 948,
+ 700,
+ 1199
+ ],
+ "click_point": [
+ 121,
+ 998
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1208,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1241
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0_flag.jpg b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0_flag.jpg
new file mode 100644
index 0000000..02f3f13
Binary files /dev/null and b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0_vl.jpg b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0_vl.jpg
new file mode 100644
index 0000000..ecfa990
Binary files /dev/null and b/Apps/XinDianTu/Images/931512c0-9c76-499f-a5ef-778017738fb0_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/93392454-8876-4ba9-bf13-70a7c3658698.jpg b/Apps/XinDianTu/Images/93392454-8876-4ba9-bf13-70a7c3658698.jpg
new file mode 100644
index 0000000..cefbfb0
Binary files /dev/null and b/Apps/XinDianTu/Images/93392454-8876-4ba9-bf13-70a7c3658698.jpg differ
diff --git a/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9.jpg b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9.jpg
new file mode 100644
index 0000000..ed3c15e
Binary files /dev/null and b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9.jpg differ
diff --git a/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9.json b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9.json
new file mode 100644
index 0000000..2330b0d
--- /dev/null
+++ b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9.json
@@ -0,0 +1,59 @@
+{
+ "image": "9340c5d5-160d-47e2-b64c-5701158866d9.jpg",
+ "width": 720,
+ "height": 226,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 615
+ ],
+ "click_point": [
+ 121,
+ 446
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 628,
+ 700,
+ 876
+ ],
+ "click_point": [
+ 121,
+ 677
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 889,
+ 700,
+ 1135
+ ],
+ "click_point": [
+ 121,
+ 938
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1148,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1193
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9_flag.jpg b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9_flag.jpg
new file mode 100644
index 0000000..1dcafec
Binary files /dev/null and b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9_vl.jpg b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9_vl.jpg
new file mode 100644
index 0000000..2b7b7d3
Binary files /dev/null and b/Apps/XinDianTu/Images/9340c5d5-160d-47e2-b64c-5701158866d9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/93718680-a5d7-4bcc-a9f1-d030b1d2c5f4.jpg b/Apps/XinDianTu/Images/93718680-a5d7-4bcc-a9f1-d030b1d2c5f4.jpg
new file mode 100644
index 0000000..e2b98a9
Binary files /dev/null and b/Apps/XinDianTu/Images/93718680-a5d7-4bcc-a9f1-d030b1d2c5f4.jpg differ
diff --git a/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5.jpg b/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5.jpg
new file mode 100644
index 0000000..26c1f2e
Binary files /dev/null and b/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5.jpg differ
diff --git a/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5_flag.jpg b/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5_flag.jpg
new file mode 100644
index 0000000..e2f1c7a
Binary files /dev/null and b/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5_vl.jpg b/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5_vl.jpg
new file mode 100644
index 0000000..ec82224
Binary files /dev/null and b/Apps/XinDianTu/Images/939b9502-9a13-4b66-a7a8-4f05db32c3d5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5.jpg b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5.jpg
new file mode 100644
index 0000000..a184328
Binary files /dev/null and b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5.jpg differ
diff --git a/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5.json b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5.json
new file mode 100644
index 0000000..9db3574
--- /dev/null
+++ b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5.json
@@ -0,0 +1,46 @@
+{
+ "image": "939f25f7-95f2-4d15-9db8-050dddb445a5.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 568,
+ 700,
+ 814
+ ],
+ "click_point": [
+ 121,
+ 617
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 828,
+ 700,
+ 1079
+ ],
+ "click_point": [
+ 121,
+ 878
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1088,
+ 700,
+ 1334
+ ],
+ "click_point": [
+ 121,
+ 1137
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5_flag.jpg b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5_flag.jpg
new file mode 100644
index 0000000..678fd08
Binary files /dev/null and b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5_vl.jpg b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5_vl.jpg
new file mode 100644
index 0000000..194a821
Binary files /dev/null and b/Apps/XinDianTu/Images/939f25f7-95f2-4d15-9db8-050dddb445a5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_1.jpg b/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_1.jpg
new file mode 100644
index 0000000..a1b1c47
Binary files /dev/null and b/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_2.jpg b/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_2.jpg
new file mode 100644
index 0000000..3951d89
Binary files /dev/null and b/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_3.jpg b/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_3.jpg
new file mode 100644
index 0000000..04bc608
Binary files /dev/null and b/Apps/XinDianTu/Images/93dbdfd8e2dcc380418dc917c52e06c1_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/9411e8f9-9276-4010-af1c-6b5a4b911168.jpg b/Apps/XinDianTu/Images/9411e8f9-9276-4010-af1c-6b5a4b911168.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/9411e8f9-9276-4010-af1c-6b5a4b911168.jpg differ
diff --git a/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba.jpg b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba.jpg
new file mode 100644
index 0000000..73c3556
Binary files /dev/null and b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba.jpg differ
diff --git a/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba.json b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba.json
new file mode 100644
index 0000000..668ac5f
--- /dev/null
+++ b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba.json
@@ -0,0 +1,46 @@
+{
+ "image": "94872c1c-d9d9-4ddc-a93a-9d53284193ba.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 547,
+ 700,
+ 796
+ ],
+ "click_point": [
+ 121,
+ 596
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 804,
+ 700,
+ 1053
+ ],
+ "click_point": [
+ 121,
+ 853
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1067,
+ 700,
+ 1316
+ ],
+ "click_point": [
+ 121,
+ 1116
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba_flag.jpg b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba_flag.jpg
new file mode 100644
index 0000000..6225b8f
Binary files /dev/null and b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba_vl.jpg b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba_vl.jpg
new file mode 100644
index 0000000..2f8ba1c
Binary files /dev/null and b/Apps/XinDianTu/Images/94872c1c-d9d9-4ddc-a93a-9d53284193ba_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/94c5a49b-57e8-4dcf-b256-8ab10d58a3bc.jpg b/Apps/XinDianTu/Images/94c5a49b-57e8-4dcf-b256-8ab10d58a3bc.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/94c5a49b-57e8-4dcf-b256-8ab10d58a3bc.jpg differ
diff --git a/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_1.jpg b/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_1.jpg
new file mode 100644
index 0000000..b7ffe9c
Binary files /dev/null and b/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_2.jpg b/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_2.jpg
new file mode 100644
index 0000000..9805e73
Binary files /dev/null and b/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_3.jpg b/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_3.jpg
new file mode 100644
index 0000000..37a6cd4
Binary files /dev/null and b/Apps/XinDianTu/Images/94c9d5a3da27789d5d2c64550c541290_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc.jpg b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc.jpg
new file mode 100644
index 0000000..ad246e3
Binary files /dev/null and b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc.jpg differ
diff --git a/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc.json b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc.json
new file mode 100644
index 0000000..549808d
--- /dev/null
+++ b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc.json
@@ -0,0 +1,59 @@
+{
+ "image": "94dd820b-d4f7-4435-a516-30cb233f98dc.jpg",
+ "width": 720,
+ "height": 194,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 646
+ ],
+ "click_point": [
+ 121,
+ 452
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 660,
+ 700,
+ 911
+ ],
+ "click_point": [
+ 121,
+ 710
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 920,
+ 700,
+ 1166
+ ],
+ "click_point": [
+ 121,
+ 969
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1180,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1218
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc_flag.jpg b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc_flag.jpg
new file mode 100644
index 0000000..64906cb
Binary files /dev/null and b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc_vl.jpg b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc_vl.jpg
new file mode 100644
index 0000000..101888f
Binary files /dev/null and b/Apps/XinDianTu/Images/94dd820b-d4f7-4435-a516-30cb233f98dc_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/94edf965-4719-46ff-b0d6-412d6a47f22c.jpg b/Apps/XinDianTu/Images/94edf965-4719-46ff-b0d6-412d6a47f22c.jpg
new file mode 100644
index 0000000..251d3d3
Binary files /dev/null and b/Apps/XinDianTu/Images/94edf965-4719-46ff-b0d6-412d6a47f22c.jpg differ
diff --git a/Apps/XinDianTu/Images/94ee67f3-2752-4452-97d5-7f5126b04b29.jpg b/Apps/XinDianTu/Images/94ee67f3-2752-4452-97d5-7f5126b04b29.jpg
new file mode 100644
index 0000000..3277dcf
Binary files /dev/null and b/Apps/XinDianTu/Images/94ee67f3-2752-4452-97d5-7f5126b04b29.jpg differ
diff --git a/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_1.jpg b/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_1.jpg
new file mode 100644
index 0000000..4df60b0
Binary files /dev/null and b/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_2.jpg b/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_2.jpg
new file mode 100644
index 0000000..b1c950b
Binary files /dev/null and b/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_3.jpg b/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_3.jpg
new file mode 100644
index 0000000..3368f1c
Binary files /dev/null and b/Apps/XinDianTu/Images/9565d51b3d38dba4b2afee1d4be78a6f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690.jpg b/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690.jpg
new file mode 100644
index 0000000..c4a8efb
Binary files /dev/null and b/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690.jpg differ
diff --git a/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690_flag.jpg b/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690_flag.jpg
new file mode 100644
index 0000000..997fb37
Binary files /dev/null and b/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690_vl.jpg b/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690_vl.jpg
new file mode 100644
index 0000000..887708a
Binary files /dev/null and b/Apps/XinDianTu/Images/95d2f82f-863b-482f-a594-e79238370690_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/962b0c89-553a-48aa-b25d-1e58bff14070.jpg b/Apps/XinDianTu/Images/962b0c89-553a-48aa-b25d-1e58bff14070.jpg
new file mode 100644
index 0000000..2d8feba
Binary files /dev/null and b/Apps/XinDianTu/Images/962b0c89-553a-48aa-b25d-1e58bff14070.jpg differ
diff --git a/Apps/XinDianTu/Images/96a04570-a98b-4159-88cf-599939bf55f2.jpg b/Apps/XinDianTu/Images/96a04570-a98b-4159-88cf-599939bf55f2.jpg
new file mode 100644
index 0000000..09a7abb
Binary files /dev/null and b/Apps/XinDianTu/Images/96a04570-a98b-4159-88cf-599939bf55f2.jpg differ
diff --git a/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_1.jpg b/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_1.jpg
new file mode 100644
index 0000000..45363c8
Binary files /dev/null and b/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_2.jpg b/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_2.jpg
new file mode 100644
index 0000000..d31ec34
Binary files /dev/null and b/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_3.jpg b/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_3.jpg
new file mode 100644
index 0000000..c03fb0b
Binary files /dev/null and b/Apps/XinDianTu/Images/96a9c1a9d35a550988bde12b2b4a27a9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/96dfe232-5e3c-4e1d-b02e-a309d7d2fbda.jpg b/Apps/XinDianTu/Images/96dfe232-5e3c-4e1d-b02e-a309d7d2fbda.jpg
new file mode 100644
index 0000000..87c4ee5
Binary files /dev/null and b/Apps/XinDianTu/Images/96dfe232-5e3c-4e1d-b02e-a309d7d2fbda.jpg differ
diff --git a/Apps/XinDianTu/Images/972fdeaf-04b8-4909-b4af-dcbd1d8d45e5.jpg b/Apps/XinDianTu/Images/972fdeaf-04b8-4909-b4af-dcbd1d8d45e5.jpg
new file mode 100644
index 0000000..93478b3
Binary files /dev/null and b/Apps/XinDianTu/Images/972fdeaf-04b8-4909-b4af-dcbd1d8d45e5.jpg differ
diff --git a/Apps/XinDianTu/Images/9779c4ac-2339-4b6c-ac69-299f2ebf46f7.jpg b/Apps/XinDianTu/Images/9779c4ac-2339-4b6c-ac69-299f2ebf46f7.jpg
new file mode 100644
index 0000000..84ddb30
Binary files /dev/null and b/Apps/XinDianTu/Images/9779c4ac-2339-4b6c-ac69-299f2ebf46f7.jpg differ
diff --git a/Apps/XinDianTu/Images/9780109b-3f2e-4b04-922e-27775c3d25a7.jpg b/Apps/XinDianTu/Images/9780109b-3f2e-4b04-922e-27775c3d25a7.jpg
new file mode 100644
index 0000000..96cda42
Binary files /dev/null and b/Apps/XinDianTu/Images/9780109b-3f2e-4b04-922e-27775c3d25a7.jpg differ
diff --git a/Apps/XinDianTu/Images/97b92e46-c8e7-4734-bc5e-e733c02915c4.jpg b/Apps/XinDianTu/Images/97b92e46-c8e7-4734-bc5e-e733c02915c4.jpg
new file mode 100644
index 0000000..ef554ae
Binary files /dev/null and b/Apps/XinDianTu/Images/97b92e46-c8e7-4734-bc5e-e733c02915c4.jpg differ
diff --git a/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_1.jpg b/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_1.jpg
new file mode 100644
index 0000000..0d68a20
Binary files /dev/null and b/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_2.jpg b/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_2.jpg
new file mode 100644
index 0000000..9ec2e64
Binary files /dev/null and b/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_3.jpg b/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_3.jpg
new file mode 100644
index 0000000..32694d9
Binary files /dev/null and b/Apps/XinDianTu/Images/97e92ffceb7f410f217b7856f59955d3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/98128a83-f8f3-44f7-a618-cb068a7ad657.jpg b/Apps/XinDianTu/Images/98128a83-f8f3-44f7-a618-cb068a7ad657.jpg
new file mode 100644
index 0000000..c6b501a
Binary files /dev/null and b/Apps/XinDianTu/Images/98128a83-f8f3-44f7-a618-cb068a7ad657.jpg differ
diff --git a/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3.jpg b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3.jpg
new file mode 100644
index 0000000..f869a63
Binary files /dev/null and b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3.jpg differ
diff --git a/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3.json b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3.json
new file mode 100644
index 0000000..616ac41
--- /dev/null
+++ b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3.json
@@ -0,0 +1,59 @@
+{
+ "image": "988e7283-0846-45ea-9705-bd9466f631a3.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 596
+ ],
+ "click_point": [
+ 121,
+ 442
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 608,
+ 700,
+ 884
+ ],
+ "click_point": [
+ 121,
+ 663
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 896,
+ 700,
+ 1159
+ ],
+ "click_point": [
+ 121,
+ 948
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1172,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1212
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3_flag.jpg b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3_flag.jpg
new file mode 100644
index 0000000..e8d81cb
Binary files /dev/null and b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3_vl.jpg b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3_vl.jpg
new file mode 100644
index 0000000..0d0a376
Binary files /dev/null and b/Apps/XinDianTu/Images/988e7283-0846-45ea-9705-bd9466f631a3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be.jpg b/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be.jpg
new file mode 100644
index 0000000..6d66019
Binary files /dev/null and b/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be.jpg differ
diff --git a/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be_flag.jpg b/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be_flag.jpg
new file mode 100644
index 0000000..47d9bcd
Binary files /dev/null and b/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be_vl.jpg b/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be_vl.jpg
new file mode 100644
index 0000000..dc091ff
Binary files /dev/null and b/Apps/XinDianTu/Images/98a292d4-e681-4301-9d7e-3a838fab81be_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/98dca635-9189-4981-b58d-324b75cb681c.jpg b/Apps/XinDianTu/Images/98dca635-9189-4981-b58d-324b75cb681c.jpg
new file mode 100644
index 0000000..3e0ab25
Binary files /dev/null and b/Apps/XinDianTu/Images/98dca635-9189-4981-b58d-324b75cb681c.jpg differ
diff --git a/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986.jpg b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986.jpg
new file mode 100644
index 0000000..3af9418
Binary files /dev/null and b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986.jpg differ
diff --git a/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986.json b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986.json
new file mode 100644
index 0000000..76c71b0
--- /dev/null
+++ b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986.json
@@ -0,0 +1,46 @@
+{
+ "image": "98e42f81-42ed-4279-8b0e-768dbda89986.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986_flag.jpg b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986_flag.jpg
new file mode 100644
index 0000000..8d73c18
Binary files /dev/null and b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986_vl.jpg b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986_vl.jpg
new file mode 100644
index 0000000..825d840
Binary files /dev/null and b/Apps/XinDianTu/Images/98e42f81-42ed-4279-8b0e-768dbda89986_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_1.jpg b/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_1.jpg
new file mode 100644
index 0000000..29f1359
Binary files /dev/null and b/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_2.jpg b/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_2.jpg
new file mode 100644
index 0000000..478d4df
Binary files /dev/null and b/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_3.jpg b/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_3.jpg
new file mode 100644
index 0000000..09b3ef2
Binary files /dev/null and b/Apps/XinDianTu/Images/992b908a492124447a6bff65bdd90bde_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc.jpg b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc.jpg
new file mode 100644
index 0000000..08290b3
Binary files /dev/null and b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc.jpg differ
diff --git a/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc.json b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc.json
new file mode 100644
index 0000000..2c0c1b4
--- /dev/null
+++ b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc.json
@@ -0,0 +1,59 @@
+{
+ "image": "99c3b5fb-68e4-40a0-b239-e9aa77acfafc.jpg",
+ "width": 720,
+ "height": 258,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 588
+ ],
+ "click_point": [
+ 121,
+ 440
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 596,
+ 700,
+ 845
+ ],
+ "click_point": [
+ 121,
+ 645
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 859,
+ 700,
+ 1108
+ ],
+ "click_point": [
+ 121,
+ 908
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1116,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1167
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc_flag.jpg b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc_flag.jpg
new file mode 100644
index 0000000..67bd7bc
Binary files /dev/null and b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc_vl.jpg b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc_vl.jpg
new file mode 100644
index 0000000..89f673d
Binary files /dev/null and b/Apps/XinDianTu/Images/99c3b5fb-68e4-40a0-b239-e9aa77acfafc_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/99e51a2e-3fb8-478b-acc8-e903346b1831.jpg b/Apps/XinDianTu/Images/99e51a2e-3fb8-478b-acc8-e903346b1831.jpg
new file mode 100644
index 0000000..951e321
Binary files /dev/null and b/Apps/XinDianTu/Images/99e51a2e-3fb8-478b-acc8-e903346b1831.jpg differ
diff --git a/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8.jpg b/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8.jpg
new file mode 100644
index 0000000..5609fb1
Binary files /dev/null and b/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8.jpg differ
diff --git a/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8_flag.jpg b/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8_flag.jpg
new file mode 100644
index 0000000..e813965
Binary files /dev/null and b/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8_vl.jpg b/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8_vl.jpg
new file mode 100644
index 0000000..f70c200
Binary files /dev/null and b/Apps/XinDianTu/Images/99e58b78-97a6-4230-95ce-3efe3865e9d8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a.jpg b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a.jpg
new file mode 100644
index 0000000..2762f7c
Binary files /dev/null and b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a.jpg differ
diff --git a/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a.json b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a.json
new file mode 100644
index 0000000..b71272c
--- /dev/null
+++ b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a.json
@@ -0,0 +1,46 @@
+{
+ "image": "99ead0f0-ee2c-49e1-87e7-e9204d57054a.jpg",
+ "width": 720,
+ "height": 277,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 577,
+ 700,
+ 828
+ ],
+ "click_point": [
+ 121,
+ 627
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 842,
+ 700,
+ 1088
+ ],
+ "click_point": [
+ 121,
+ 891
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1097,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1152
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a_flag.jpg b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a_flag.jpg
new file mode 100644
index 0000000..5f8d528
Binary files /dev/null and b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a_vl.jpg b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a_vl.jpg
new file mode 100644
index 0000000..e353f02
Binary files /dev/null and b/Apps/XinDianTu/Images/99ead0f0-ee2c-49e1-87e7-e9204d57054a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9a07edff-a9d4-4922-b8be-46bb2fc2328f.jpg b/Apps/XinDianTu/Images/9a07edff-a9d4-4922-b8be-46bb2fc2328f.jpg
new file mode 100644
index 0000000..4511f3d
Binary files /dev/null and b/Apps/XinDianTu/Images/9a07edff-a9d4-4922-b8be-46bb2fc2328f.jpg differ
diff --git a/Apps/XinDianTu/Images/9a191b79-8099-4b9a-a85d-67a789f01099.jpg b/Apps/XinDianTu/Images/9a191b79-8099-4b9a-a85d-67a789f01099.jpg
new file mode 100644
index 0000000..0226fac
Binary files /dev/null and b/Apps/XinDianTu/Images/9a191b79-8099-4b9a-a85d-67a789f01099.jpg differ
diff --git a/Apps/XinDianTu/Images/9a29826a-44fa-472b-a10f-f4b99d7bc7c1.jpg b/Apps/XinDianTu/Images/9a29826a-44fa-472b-a10f-f4b99d7bc7c1.jpg
new file mode 100644
index 0000000..92d00e2
Binary files /dev/null and b/Apps/XinDianTu/Images/9a29826a-44fa-472b-a10f-f4b99d7bc7c1.jpg differ
diff --git a/Apps/XinDianTu/Images/9a45c2cb-448f-4c8c-bbb6-04064122971f.jpg b/Apps/XinDianTu/Images/9a45c2cb-448f-4c8c-bbb6-04064122971f.jpg
new file mode 100644
index 0000000..88d4411
Binary files /dev/null and b/Apps/XinDianTu/Images/9a45c2cb-448f-4c8c-bbb6-04064122971f.jpg differ
diff --git a/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_1.jpg b/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_1.jpg
new file mode 100644
index 0000000..08856ab
Binary files /dev/null and b/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_2.jpg b/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_2.jpg
new file mode 100644
index 0000000..04efef0
Binary files /dev/null and b/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_3.jpg b/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_3.jpg
new file mode 100644
index 0000000..d3e6c4b
Binary files /dev/null and b/Apps/XinDianTu/Images/9a7d42c501e4d3e685a4f092f0df3b36_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac.jpg b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac.jpg
new file mode 100644
index 0000000..8803add
Binary files /dev/null and b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac.jpg differ
diff --git a/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac.json b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac.json
new file mode 100644
index 0000000..d50bfac
--- /dev/null
+++ b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac.json
@@ -0,0 +1,59 @@
+{
+ "image": "9ba9dc32-786a-4868-bc22-cbaeea0f4aac.jpg",
+ "width": 720,
+ "height": 228,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 584
+ ],
+ "click_point": [
+ 121,
+ 440
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 593,
+ 700,
+ 844
+ ],
+ "click_point": [
+ 121,
+ 643
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 858,
+ 700,
+ 1132
+ ],
+ "click_point": [
+ 121,
+ 912
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1146,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1191
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac_flag.jpg b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac_flag.jpg
new file mode 100644
index 0000000..2169cc2
Binary files /dev/null and b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac_vl.jpg b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac_vl.jpg
new file mode 100644
index 0000000..c01b757
Binary files /dev/null and b/Apps/XinDianTu/Images/9ba9dc32-786a-4868-bc22-cbaeea0f4aac_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9bdab192-470a-40f8-b901-74a39e30dae5.jpg b/Apps/XinDianTu/Images/9bdab192-470a-40f8-b901-74a39e30dae5.jpg
new file mode 100644
index 0000000..e58ccfe
Binary files /dev/null and b/Apps/XinDianTu/Images/9bdab192-470a-40f8-b901-74a39e30dae5.jpg differ
diff --git a/Apps/XinDianTu/Images/9c182cb6-a0ab-4d07-aee7-95e4675ca339.jpg b/Apps/XinDianTu/Images/9c182cb6-a0ab-4d07-aee7-95e4675ca339.jpg
new file mode 100644
index 0000000..9430f55
Binary files /dev/null and b/Apps/XinDianTu/Images/9c182cb6-a0ab-4d07-aee7-95e4675ca339.jpg differ
diff --git a/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d.jpg b/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d.jpg
new file mode 100644
index 0000000..3e52d00
Binary files /dev/null and b/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d.jpg differ
diff --git a/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d_flag.jpg b/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d_flag.jpg
new file mode 100644
index 0000000..a78932c
Binary files /dev/null and b/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d_vl.jpg b/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d_vl.jpg
new file mode 100644
index 0000000..039aac2
Binary files /dev/null and b/Apps/XinDianTu/Images/9d5a9229-25e6-4e94-998e-dabe2968854d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434.jpg b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434.jpg
new file mode 100644
index 0000000..cfc5be6
Binary files /dev/null and b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434.jpg differ
diff --git a/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434.json b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434.json
new file mode 100644
index 0000000..529e893
--- /dev/null
+++ b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434.json
@@ -0,0 +1,59 @@
+{
+ "image": "9dbe75e9-1f30-4dde-943b-e57a29013434.jpg",
+ "width": 720,
+ "height": 268,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 580
+ ],
+ "click_point": [
+ 121,
+ 439
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 588,
+ 700,
+ 837
+ ],
+ "click_point": [
+ 121,
+ 637
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 851,
+ 700,
+ 1100
+ ],
+ "click_point": [
+ 121,
+ 900
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1106,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1159
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434_flag.jpg b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434_flag.jpg
new file mode 100644
index 0000000..f2fdd14
Binary files /dev/null and b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434_vl.jpg b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434_vl.jpg
new file mode 100644
index 0000000..1067499
Binary files /dev/null and b/Apps/XinDianTu/Images/9dbe75e9-1f30-4dde-943b-e57a29013434_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b.jpg b/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b.jpg
new file mode 100644
index 0000000..df47476
Binary files /dev/null and b/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b.jpg differ
diff --git a/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b_flag.jpg b/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b_flag.jpg
new file mode 100644
index 0000000..2f7326c
Binary files /dev/null and b/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b_vl.jpg b/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b_vl.jpg
new file mode 100644
index 0000000..bd855c0
Binary files /dev/null and b/Apps/XinDianTu/Images/9dc1696d-7eea-46b4-abf8-2a116218634b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9ddeac6e-270b-4c45-853d-f0b2c6ba3deb.jpg b/Apps/XinDianTu/Images/9ddeac6e-270b-4c45-853d-f0b2c6ba3deb.jpg
new file mode 100644
index 0000000..4b090c7
Binary files /dev/null and b/Apps/XinDianTu/Images/9ddeac6e-270b-4c45-853d-f0b2c6ba3deb.jpg differ
diff --git a/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f.jpg b/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f.jpg
new file mode 100644
index 0000000..07ae90a
Binary files /dev/null and b/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f.jpg differ
diff --git a/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f_flag.jpg b/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f_flag.jpg
new file mode 100644
index 0000000..b0d9235
Binary files /dev/null and b/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f_vl.jpg b/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f_vl.jpg
new file mode 100644
index 0000000..955d2c9
Binary files /dev/null and b/Apps/XinDianTu/Images/9e6fbed5-cbb5-4655-9938-a85d55c4fb3f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.jpg b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.jpg
new file mode 100644
index 0000000..7fdbcaa
Binary files /dev/null and b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.jpg differ
diff --git a/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.json b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.json
new file mode 100644
index 0000000..5e9e26b
--- /dev/null
+++ b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.json
@@ -0,0 +1,33 @@
+{
+ "image": "9e70cc0a-2ae1-47bd-b04b-d2b844e7d331.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331_flag.jpg b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331_flag.jpg
new file mode 100644
index 0000000..42a1ab0
Binary files /dev/null and b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331_vl.jpg b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331_vl.jpg
new file mode 100644
index 0000000..578d4d1
Binary files /dev/null and b/Apps/XinDianTu/Images/9e70cc0a-2ae1-47bd-b04b-d2b844e7d331_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_1.jpg b/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_1.jpg
new file mode 100644
index 0000000..91f94ab
Binary files /dev/null and b/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_2.jpg b/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_2.jpg
new file mode 100644
index 0000000..c1b13a3
Binary files /dev/null and b/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_3.jpg b/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_3.jpg
new file mode 100644
index 0000000..498efcb
Binary files /dev/null and b/Apps/XinDianTu/Images/9f520b066149b641e55890059e9b057d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.jpg b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.jpg
new file mode 100644
index 0000000..f9a376d
Binary files /dev/null and b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.jpg differ
diff --git a/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.json b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.json
new file mode 100644
index 0000000..0a09db0
--- /dev/null
+++ b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.json
@@ -0,0 +1,46 @@
+{
+ "image": "9f6f4d2c-cd57-4280-a354-e858cfa3e3b6.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 568,
+ 700,
+ 814
+ ],
+ "click_point": [
+ 121,
+ 617
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 828,
+ 700,
+ 1079
+ ],
+ "click_point": [
+ 121,
+ 878
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1088,
+ 700,
+ 1334
+ ],
+ "click_point": [
+ 121,
+ 1137
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6_flag.jpg b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6_flag.jpg
new file mode 100644
index 0000000..0945c96
Binary files /dev/null and b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6_vl.jpg b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6_vl.jpg
new file mode 100644
index 0000000..bf93b32
Binary files /dev/null and b/Apps/XinDianTu/Images/9f6f4d2c-cd57-4280-a354-e858cfa3e3b6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_1.jpg b/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_1.jpg
new file mode 100644
index 0000000..80b8e5e
Binary files /dev/null and b/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_2.jpg b/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_2.jpg
new file mode 100644
index 0000000..e811a2a
Binary files /dev/null and b/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_3.jpg b/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_3.jpg
new file mode 100644
index 0000000..9288ea3
Binary files /dev/null and b/Apps/XinDianTu/Images/9f7029d2860c3d24b67a66875b1be9a6_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/9f9cddcf-5e40-4459-8a8e-c9f1fc3d665e.jpg b/Apps/XinDianTu/Images/9f9cddcf-5e40-4459-8a8e-c9f1fc3d665e.jpg
new file mode 100644
index 0000000..7321329
Binary files /dev/null and b/Apps/XinDianTu/Images/9f9cddcf-5e40-4459-8a8e-c9f1fc3d665e.jpg differ
diff --git a/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_1.jpg b/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_1.jpg
new file mode 100644
index 0000000..db9b7d1
Binary files /dev/null and b/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_2.jpg b/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_2.jpg
new file mode 100644
index 0000000..e769f46
Binary files /dev/null and b/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_3.jpg b/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_3.jpg
new file mode 100644
index 0000000..e769f46
Binary files /dev/null and b/Apps/XinDianTu/Images/9fd85591618843f13b72561f17b6930f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/9ff45161-5b66-451d-9acb-f813771cc176.jpg b/Apps/XinDianTu/Images/9ff45161-5b66-451d-9acb-f813771cc176.jpg
new file mode 100644
index 0000000..f07851a
Binary files /dev/null and b/Apps/XinDianTu/Images/9ff45161-5b66-451d-9acb-f813771cc176.jpg differ
diff --git a/Apps/XinDianTu/Images/H7_flag_expand.jpg b/Apps/XinDianTu/Images/H7_flag_expand.jpg
new file mode 100644
index 0000000..6871208
Binary files /dev/null and b/Apps/XinDianTu/Images/H7_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/J02H_flag_expand.jpg b/Apps/XinDianTu/Images/J02H_flag_expand.jpg
new file mode 100644
index 0000000..f598a9f
Binary files /dev/null and b/Apps/XinDianTu/Images/J02H_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/Pro会员专享_flag_expand.jpg b/Apps/XinDianTu/Images/Pro会员专享_flag_expand.jpg
new file mode 100644
index 0000000..cd428bc
Binary files /dev/null and b/Apps/XinDianTu/Images/Pro会员专享_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/T+_flag_expand.jpg b/Apps/XinDianTu/Images/T+_flag_expand.jpg
new file mode 100644
index 0000000..614685c
Binary files /dev/null and b/Apps/XinDianTu/Images/T+_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/_1_flag_expand.jpg b/Apps/XinDianTu/Images/_1_flag_expand.jpg
new file mode 100644
index 0000000..0623621
Binary files /dev/null and b/Apps/XinDianTu/Images/_1_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/a043bca3-97e8-4144-8d27-c355ad594c95.jpg b/Apps/XinDianTu/Images/a043bca3-97e8-4144-8d27-c355ad594c95.jpg
new file mode 100644
index 0000000..09f841f
Binary files /dev/null and b/Apps/XinDianTu/Images/a043bca3-97e8-4144-8d27-c355ad594c95.jpg differ
diff --git a/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_1.jpg b/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_1.jpg
new file mode 100644
index 0000000..240a7f3
Binary files /dev/null and b/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_2.jpg b/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_2.jpg
new file mode 100644
index 0000000..ae56dd3
Binary files /dev/null and b/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_3.jpg b/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_3.jpg
new file mode 100644
index 0000000..a9f891e
Binary files /dev/null and b/Apps/XinDianTu/Images/a093c5bce01850d34342bec86c00441e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a0f47f18-1f42-4a33-99c4-6783f3c84d49.jpg b/Apps/XinDianTu/Images/a0f47f18-1f42-4a33-99c4-6783f3c84d49.jpg
new file mode 100644
index 0000000..02ee705
Binary files /dev/null and b/Apps/XinDianTu/Images/a0f47f18-1f42-4a33-99c4-6783f3c84d49.jpg differ
diff --git a/Apps/XinDianTu/Images/a114825a-5165-4039-9ebf-2b585ecb7110.jpg b/Apps/XinDianTu/Images/a114825a-5165-4039-9ebf-2b585ecb7110.jpg
new file mode 100644
index 0000000..42603f9
Binary files /dev/null and b/Apps/XinDianTu/Images/a114825a-5165-4039-9ebf-2b585ecb7110.jpg differ
diff --git a/Apps/XinDianTu/Images/a11a62bb-2da8-45ec-a2f2-dfdc3c36b570.jpg b/Apps/XinDianTu/Images/a11a62bb-2da8-45ec-a2f2-dfdc3c36b570.jpg
new file mode 100644
index 0000000..25d8736
Binary files /dev/null and b/Apps/XinDianTu/Images/a11a62bb-2da8-45ec-a2f2-dfdc3c36b570.jpg differ
diff --git a/Apps/XinDianTu/Images/a131b686-e0e1-4f60-8baf-71cf8339fbe4.jpg b/Apps/XinDianTu/Images/a131b686-e0e1-4f60-8baf-71cf8339fbe4.jpg
new file mode 100644
index 0000000..df02ced
Binary files /dev/null and b/Apps/XinDianTu/Images/a131b686-e0e1-4f60-8baf-71cf8339fbe4.jpg differ
diff --git a/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a.jpg b/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a.jpg
new file mode 100644
index 0000000..7826b89
Binary files /dev/null and b/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a.jpg differ
diff --git a/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a_flag.jpg b/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a_flag.jpg
new file mode 100644
index 0000000..9f79920
Binary files /dev/null and b/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a_vl.jpg b/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a_vl.jpg
new file mode 100644
index 0000000..97a22d0
Binary files /dev/null and b/Apps/XinDianTu/Images/a1595b6f-84d8-46fc-a4ca-2fcebcfbd28a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_1.jpg b/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_1.jpg
new file mode 100644
index 0000000..f774b82
Binary files /dev/null and b/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_2.jpg b/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_2.jpg
new file mode 100644
index 0000000..e30c8ad
Binary files /dev/null and b/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_3.jpg b/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_3.jpg
new file mode 100644
index 0000000..c6f21ed
Binary files /dev/null and b/Apps/XinDianTu/Images/a16001e0773698cda13468c98f0cbbf5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a188cc84-6cb8-4a7a-8f9d-75acf53679fb.jpg b/Apps/XinDianTu/Images/a188cc84-6cb8-4a7a-8f9d-75acf53679fb.jpg
new file mode 100644
index 0000000..8487377
Binary files /dev/null and b/Apps/XinDianTu/Images/a188cc84-6cb8-4a7a-8f9d-75acf53679fb.jpg differ
diff --git a/Apps/XinDianTu/Images/a1c9b249-f53a-4159-a0fd-14e70916a5c5.jpg b/Apps/XinDianTu/Images/a1c9b249-f53a-4159-a0fd-14e70916a5c5.jpg
new file mode 100644
index 0000000..71aeb43
Binary files /dev/null and b/Apps/XinDianTu/Images/a1c9b249-f53a-4159-a0fd-14e70916a5c5.jpg differ
diff --git a/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2.jpg b/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2.jpg
new file mode 100644
index 0000000..f30ca3a
Binary files /dev/null and b/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2.jpg differ
diff --git a/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2_flag.jpg b/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2_flag.jpg
new file mode 100644
index 0000000..5c699d0
Binary files /dev/null and b/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2_vl.jpg b/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2_vl.jpg
new file mode 100644
index 0000000..197b7b0
Binary files /dev/null and b/Apps/XinDianTu/Images/a1f4e1b6-b600-4bc5-b4d3-7cd5d984aac2_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_1.jpg b/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_1.jpg
new file mode 100644
index 0000000..3db9054
Binary files /dev/null and b/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_2.jpg b/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_2.jpg
new file mode 100644
index 0000000..fba5d09
Binary files /dev/null and b/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_3.jpg b/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_3.jpg
new file mode 100644
index 0000000..3581333
Binary files /dev/null and b/Apps/XinDianTu/Images/a2135722600d434f4e0c5e14c9f42e28_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_1.jpg b/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_1.jpg
new file mode 100644
index 0000000..4375629
Binary files /dev/null and b/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_2.jpg b/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_2.jpg
new file mode 100644
index 0000000..9051bb9
Binary files /dev/null and b/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_3.jpg b/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_3.jpg
new file mode 100644
index 0000000..51b3b16
Binary files /dev/null and b/Apps/XinDianTu/Images/a253bca2e021e7281a45d519cde858bd_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a28d2c07-60af-4ff8-baf5-046e987ed0f0.jpg b/Apps/XinDianTu/Images/a28d2c07-60af-4ff8-baf5-046e987ed0f0.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/a28d2c07-60af-4ff8-baf5-046e987ed0f0.jpg differ
diff --git a/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_1.jpg b/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_1.jpg
new file mode 100644
index 0000000..fd25974
Binary files /dev/null and b/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_2.jpg b/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_2.jpg
new file mode 100644
index 0000000..0a8f158
Binary files /dev/null and b/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_3.jpg b/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_3.jpg
new file mode 100644
index 0000000..4269baa
Binary files /dev/null and b/Apps/XinDianTu/Images/a2a133f00f3ac98da5e60bfb1ffc20d3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a2a44e1c-6079-408e-9b5e-8c3103875347.jpg b/Apps/XinDianTu/Images/a2a44e1c-6079-408e-9b5e-8c3103875347.jpg
new file mode 100644
index 0000000..e562523
Binary files /dev/null and b/Apps/XinDianTu/Images/a2a44e1c-6079-408e-9b5e-8c3103875347.jpg differ
diff --git a/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_1.jpg b/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_1.jpg
new file mode 100644
index 0000000..11019cb
Binary files /dev/null and b/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_2.jpg b/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_2.jpg
new file mode 100644
index 0000000..5ced786
Binary files /dev/null and b/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_3.jpg b/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_3.jpg
new file mode 100644
index 0000000..053a009
Binary files /dev/null and b/Apps/XinDianTu/Images/a3af9423aa2db9c1beeff31367cef05b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a3ba57ef-462d-4acd-80df-f2e8949793e2.jpg b/Apps/XinDianTu/Images/a3ba57ef-462d-4acd-80df-f2e8949793e2.jpg
new file mode 100644
index 0000000..cf88647
Binary files /dev/null and b/Apps/XinDianTu/Images/a3ba57ef-462d-4acd-80df-f2e8949793e2.jpg differ
diff --git a/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.jpg b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.jpg
new file mode 100644
index 0000000..58f85de
Binary files /dev/null and b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.jpg differ
diff --git a/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.json b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.json
new file mode 100644
index 0000000..173b03d
--- /dev/null
+++ b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.json
@@ -0,0 +1,46 @@
+{
+ "image": "a3cc277e-d9fc-4888-80ec-254ef0fdfb2c.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 516,
+ 700,
+ 765
+ ],
+ "click_point": [
+ 121,
+ 565
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 779,
+ 700,
+ 1028
+ ],
+ "click_point": [
+ 121,
+ 828
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1036,
+ 700,
+ 1285
+ ],
+ "click_point": [
+ 121,
+ 1085
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c_flag.jpg b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c_flag.jpg
new file mode 100644
index 0000000..212db68
Binary files /dev/null and b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c_vl.jpg b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c_vl.jpg
new file mode 100644
index 0000000..46ed21f
Binary files /dev/null and b/Apps/XinDianTu/Images/a3cc277e-d9fc-4888-80ec-254ef0fdfb2c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_1.jpg b/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_1.jpg
new file mode 100644
index 0000000..919ca67
Binary files /dev/null and b/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_2.jpg b/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_2.jpg
new file mode 100644
index 0000000..80ccc32
Binary files /dev/null and b/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_3.jpg b/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_3.jpg
new file mode 100644
index 0000000..f6e408f
Binary files /dev/null and b/Apps/XinDianTu/Images/a443c504f6a759af1e04b55f0649968f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68.jpg b/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68.jpg
new file mode 100644
index 0000000..edc5f52
Binary files /dev/null and b/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68.jpg differ
diff --git a/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68_flag.jpg b/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68_flag.jpg
new file mode 100644
index 0000000..8b23aa3
Binary files /dev/null and b/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68_vl.jpg b/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68_vl.jpg
new file mode 100644
index 0000000..12e4eb0
Binary files /dev/null and b/Apps/XinDianTu/Images/a45e0987-7548-4bcc-9997-633996dbfa68_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_1.jpg b/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_1.jpg
new file mode 100644
index 0000000..eafdcc3
Binary files /dev/null and b/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_2.jpg b/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_2.jpg
new file mode 100644
index 0000000..c7f0ee4
Binary files /dev/null and b/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_3.jpg b/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_3.jpg
new file mode 100644
index 0000000..bbd0402
Binary files /dev/null and b/Apps/XinDianTu/Images/a479e4fb658f8c6a10f5022d5ef29da2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a5a06a57-d00d-4e50-956a-0a8ec892bcd5.jpg b/Apps/XinDianTu/Images/a5a06a57-d00d-4e50-956a-0a8ec892bcd5.jpg
new file mode 100644
index 0000000..3277dcf
Binary files /dev/null and b/Apps/XinDianTu/Images/a5a06a57-d00d-4e50-956a-0a8ec892bcd5.jpg differ
diff --git a/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72.jpg b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72.jpg
new file mode 100644
index 0000000..43cc659
Binary files /dev/null and b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72.jpg differ
diff --git a/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72.json b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72.json
new file mode 100644
index 0000000..ca63400
--- /dev/null
+++ b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72.json
@@ -0,0 +1,46 @@
+{
+ "image": "a5e55508-7115-493b-b90a-2f07e96adb72.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 460,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 514
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72_flag.jpg b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72_flag.jpg
new file mode 100644
index 0000000..7ec9d9b
Binary files /dev/null and b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72_vl.jpg b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72_vl.jpg
new file mode 100644
index 0000000..0f1e9fd
Binary files /dev/null and b/Apps/XinDianTu/Images/a5e55508-7115-493b-b90a-2f07e96adb72_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a65418f8-77de-4a91-b743-f5a3015b59f0.jpg b/Apps/XinDianTu/Images/a65418f8-77de-4a91-b743-f5a3015b59f0.jpg
new file mode 100644
index 0000000..17c6901
Binary files /dev/null and b/Apps/XinDianTu/Images/a65418f8-77de-4a91-b743-f5a3015b59f0.jpg differ
diff --git a/Apps/XinDianTu/Images/a66ead16-6174-460a-aaf2-78e818545427.jpg b/Apps/XinDianTu/Images/a66ead16-6174-460a-aaf2-78e818545427.jpg
new file mode 100644
index 0000000..cc4e959
Binary files /dev/null and b/Apps/XinDianTu/Images/a66ead16-6174-460a-aaf2-78e818545427.jpg differ
diff --git a/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_1.jpg b/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_1.jpg
new file mode 100644
index 0000000..d51f160
Binary files /dev/null and b/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_2.jpg b/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_2.jpg
new file mode 100644
index 0000000..90d858e
Binary files /dev/null and b/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_3.jpg b/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_3.jpg
new file mode 100644
index 0000000..ec5d08b
Binary files /dev/null and b/Apps/XinDianTu/Images/a6c2c6e3a498d747581ddc124d49e1aa_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/a707191b-13e3-4424-93d3-eadb4255a1fc.jpg b/Apps/XinDianTu/Images/a707191b-13e3-4424-93d3-eadb4255a1fc.jpg
new file mode 100644
index 0000000..a93a82a
Binary files /dev/null and b/Apps/XinDianTu/Images/a707191b-13e3-4424-93d3-eadb4255a1fc.jpg differ
diff --git a/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.jpg b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.jpg
new file mode 100644
index 0000000..d596766
Binary files /dev/null and b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.jpg differ
diff --git a/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.json b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.json
new file mode 100644
index 0000000..6ecec66
--- /dev/null
+++ b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.json
@@ -0,0 +1,59 @@
+{
+ "image": "a73ba6c9-f45f-4e49-8f07-ece126c0dd9a.jpg",
+ "width": 720,
+ "height": 205,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 588
+ ],
+ "click_point": [
+ 121,
+ 440
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 602,
+ 700,
+ 848
+ ],
+ "click_point": [
+ 121,
+ 651
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 857,
+ 700,
+ 1056
+ ],
+ "click_point": [
+ 121,
+ 896
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1065,
+ 700,
+ 1270
+ ],
+ "click_point": [
+ 121,
+ 1106
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a_flag.jpg b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a_flag.jpg
new file mode 100644
index 0000000..8d9036f
Binary files /dev/null and b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a_vl.jpg b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a_vl.jpg
new file mode 100644
index 0000000..65de61a
Binary files /dev/null and b/Apps/XinDianTu/Images/a73ba6c9-f45f-4e49-8f07-ece126c0dd9a_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e.jpg b/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e.jpg
new file mode 100644
index 0000000..8fd6c54
Binary files /dev/null and b/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e.jpg differ
diff --git a/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e_flag.jpg b/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e_flag.jpg
new file mode 100644
index 0000000..5117f5f
Binary files /dev/null and b/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e_vl.jpg b/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e_vl.jpg
new file mode 100644
index 0000000..9ee7fd4
Binary files /dev/null and b/Apps/XinDianTu/Images/a7f8cf3f-f3a6-497d-b436-3830ac98d40e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5.jpg b/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5.jpg
new file mode 100644
index 0000000..264a79a
Binary files /dev/null and b/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5.jpg differ
diff --git a/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5_flag.jpg b/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5_flag.jpg
new file mode 100644
index 0000000..9f983d9
Binary files /dev/null and b/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5_vl.jpg b/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5_vl.jpg
new file mode 100644
index 0000000..1d9c21b
Binary files /dev/null and b/Apps/XinDianTu/Images/a855a0d3-6ebc-4f72-af55-eff957431aa5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a8b38308-812f-4b2c-8691-37d2a5b126ac.jpg b/Apps/XinDianTu/Images/a8b38308-812f-4b2c-8691-37d2a5b126ac.jpg
new file mode 100644
index 0000000..a0e15b8
Binary files /dev/null and b/Apps/XinDianTu/Images/a8b38308-812f-4b2c-8691-37d2a5b126ac.jpg differ
diff --git a/Apps/XinDianTu/Images/a8dc9d29-722c-46cd-9c52-40621a4adcbc.jpg b/Apps/XinDianTu/Images/a8dc9d29-722c-46cd-9c52-40621a4adcbc.jpg
new file mode 100644
index 0000000..fd5db6e
Binary files /dev/null and b/Apps/XinDianTu/Images/a8dc9d29-722c-46cd-9c52-40621a4adcbc.jpg differ
diff --git a/Apps/XinDianTu/Images/a8fbf49d-ec26-402b-9a49-b038ef57d2ad.jpg b/Apps/XinDianTu/Images/a8fbf49d-ec26-402b-9a49-b038ef57d2ad.jpg
new file mode 100644
index 0000000..a2d5c6d
Binary files /dev/null and b/Apps/XinDianTu/Images/a8fbf49d-ec26-402b-9a49-b038ef57d2ad.jpg differ
diff --git a/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839.jpg b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839.jpg
new file mode 100644
index 0000000..4a6d67a
Binary files /dev/null and b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839.jpg differ
diff --git a/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839.json b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839.json
new file mode 100644
index 0000000..2649336
--- /dev/null
+++ b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839.json
@@ -0,0 +1,59 @@
+{
+ "image": "a9983081-9a5c-4b5a-83b2-deb16a344839.jpg",
+ "width": 720,
+ "height": 220,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 620
+ ],
+ "click_point": [
+ 121,
+ 447
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 634,
+ 700,
+ 880
+ ],
+ "click_point": [
+ 121,
+ 683
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 889,
+ 700,
+ 1140
+ ],
+ "click_point": [
+ 121,
+ 939
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1154,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1198
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839_flag.jpg b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839_flag.jpg
new file mode 100644
index 0000000..c362e56
Binary files /dev/null and b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839_vl.jpg b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839_vl.jpg
new file mode 100644
index 0000000..128dd17
Binary files /dev/null and b/Apps/XinDianTu/Images/a9983081-9a5c-4b5a-83b2-deb16a344839_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8.jpg b/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8.jpg
new file mode 100644
index 0000000..b63328e
Binary files /dev/null and b/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8.jpg differ
diff --git a/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8_flag.jpg b/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8_flag.jpg
new file mode 100644
index 0000000..1a7042e
Binary files /dev/null and b/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8_vl.jpg b/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8_vl.jpg
new file mode 100644
index 0000000..15ca8ab
Binary files /dev/null and b/Apps/XinDianTu/Images/a9b7debc-8b49-4983-bf4f-a0ebd2f1e7d8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/a9e03343-c12a-4876-90d0-d11b7dcf6ea5.jpg b/Apps/XinDianTu/Images/a9e03343-c12a-4876-90d0-d11b7dcf6ea5.jpg
new file mode 100644
index 0000000..65284ad
Binary files /dev/null and b/Apps/XinDianTu/Images/a9e03343-c12a-4876-90d0-d11b7dcf6ea5.jpg differ
diff --git a/Apps/XinDianTu/Images/aa215968-07ad-487c-93b8-28f170f80528.jpg b/Apps/XinDianTu/Images/aa215968-07ad-487c-93b8-28f170f80528.jpg
new file mode 100644
index 0000000..99f8616
Binary files /dev/null and b/Apps/XinDianTu/Images/aa215968-07ad-487c-93b8-28f170f80528.jpg differ
diff --git a/Apps/XinDianTu/Images/aa2234e3-dc56-4147-bf50-48def919b042.jpg b/Apps/XinDianTu/Images/aa2234e3-dc56-4147-bf50-48def919b042.jpg
new file mode 100644
index 0000000..8b16f9b
Binary files /dev/null and b/Apps/XinDianTu/Images/aa2234e3-dc56-4147-bf50-48def919b042.jpg differ
diff --git a/Apps/XinDianTu/Images/aa620f04-3de0-43cd-a6ba-7764dcce3e3a.jpg b/Apps/XinDianTu/Images/aa620f04-3de0-43cd-a6ba-7764dcce3e3a.jpg
new file mode 100644
index 0000000..b66ec10
Binary files /dev/null and b/Apps/XinDianTu/Images/aa620f04-3de0-43cd-a6ba-7764dcce3e3a.jpg differ
diff --git a/Apps/XinDianTu/Images/aa64edcc-2aae-4c6f-b475-9a6e4d89f0ce.jpg b/Apps/XinDianTu/Images/aa64edcc-2aae-4c6f-b475-9a6e4d89f0ce.jpg
new file mode 100644
index 0000000..72913b2
Binary files /dev/null and b/Apps/XinDianTu/Images/aa64edcc-2aae-4c6f-b475-9a6e4d89f0ce.jpg differ
diff --git a/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b.jpg b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b.jpg
new file mode 100644
index 0000000..3c1dd30
Binary files /dev/null and b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b.jpg differ
diff --git a/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b.json b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b.json
new file mode 100644
index 0000000..f652d41
--- /dev/null
+++ b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b.json
@@ -0,0 +1,46 @@
+{
+ "image": "aad52585-b98a-4d7f-bbd6-a1eec6bed14b.jpg",
+ "width": 720,
+ "height": 248,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 452,
+ 700,
+ 727
+ ],
+ "click_point": [
+ 121,
+ 507
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 740,
+ 700,
+ 1015
+ ],
+ "click_point": [
+ 121,
+ 795
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1028,
+ 700,
+ 1276
+ ],
+ "click_point": [
+ 121,
+ 1077
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b_flag.jpg b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b_flag.jpg
new file mode 100644
index 0000000..593ef0a
Binary files /dev/null and b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b_vl.jpg b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b_vl.jpg
new file mode 100644
index 0000000..105b408
Binary files /dev/null and b/Apps/XinDianTu/Images/aad52585-b98a-4d7f-bbd6-a1eec6bed14b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_1.jpg b/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_1.jpg
new file mode 100644
index 0000000..ae9dd29
Binary files /dev/null and b/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_2.jpg b/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_2.jpg
new file mode 100644
index 0000000..6b00d37
Binary files /dev/null and b/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_3.jpg b/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_3.jpg
new file mode 100644
index 0000000..c69c44b
Binary files /dev/null and b/Apps/XinDianTu/Images/ab216bc51149e58080c592193cf52820_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ab23f7ce-9715-4e45-a294-17bd12a2efc7.jpg b/Apps/XinDianTu/Images/ab23f7ce-9715-4e45-a294-17bd12a2efc7.jpg
new file mode 100644
index 0000000..2a5cc9c
Binary files /dev/null and b/Apps/XinDianTu/Images/ab23f7ce-9715-4e45-a294-17bd12a2efc7.jpg differ
diff --git a/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554.jpg b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554.jpg
new file mode 100644
index 0000000..2655892
Binary files /dev/null and b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554.jpg differ
diff --git a/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554.json b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554.json
new file mode 100644
index 0000000..d53539c
--- /dev/null
+++ b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554.json
@@ -0,0 +1,46 @@
+{
+ "image": "ab38f2a1-53a8-451d-bdec-a922d4238554.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 568,
+ 700,
+ 814
+ ],
+ "click_point": [
+ 121,
+ 617
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 828,
+ 700,
+ 1079
+ ],
+ "click_point": [
+ 121,
+ 878
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1088,
+ 700,
+ 1334
+ ],
+ "click_point": [
+ 121,
+ 1137
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554_flag.jpg b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554_flag.jpg
new file mode 100644
index 0000000..7e1e9b7
Binary files /dev/null and b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554_vl.jpg b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554_vl.jpg
new file mode 100644
index 0000000..b145471
Binary files /dev/null and b/Apps/XinDianTu/Images/ab38f2a1-53a8-451d-bdec-a922d4238554_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3.jpg b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3.jpg
new file mode 100644
index 0000000..4511efd
Binary files /dev/null and b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3.jpg differ
diff --git a/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3.json b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3.json
new file mode 100644
index 0000000..21e0248
--- /dev/null
+++ b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3.json
@@ -0,0 +1,46 @@
+{
+ "image": "ab5f592f-82d0-4716-8494-2f91b74b91d3.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 539,
+ 700,
+ 788
+ ],
+ "click_point": [
+ 121,
+ 588
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 796,
+ 700,
+ 1045
+ ],
+ "click_point": [
+ 121,
+ 845
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1059,
+ 700,
+ 1308
+ ],
+ "click_point": [
+ 121,
+ 1108
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3_flag.jpg b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3_flag.jpg
new file mode 100644
index 0000000..478a31e
Binary files /dev/null and b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3_vl.jpg b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3_vl.jpg
new file mode 100644
index 0000000..7da1cf5
Binary files /dev/null and b/Apps/XinDianTu/Images/ab5f592f-82d0-4716-8494-2f91b74b91d3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_1.jpg b/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_1.jpg
new file mode 100644
index 0000000..1b7fce7
Binary files /dev/null and b/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_2.jpg b/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_2.jpg
new file mode 100644
index 0000000..4645ebd
Binary files /dev/null and b/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_3.jpg b/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_3.jpg
new file mode 100644
index 0000000..b43a524
Binary files /dev/null and b/Apps/XinDianTu/Images/ab87f667c4276b0868d74aafc1eadbfa_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_1.jpg b/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_1.jpg
new file mode 100644
index 0000000..b220568
Binary files /dev/null and b/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_2.jpg b/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_2.jpg
new file mode 100644
index 0000000..49319a5
Binary files /dev/null and b/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_3.jpg b/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_3.jpg
new file mode 100644
index 0000000..b59aaa3
Binary files /dev/null and b/Apps/XinDianTu/Images/ac1a9c249da269c6875214bb4a6cc80e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ac48e62b-5c6d-48e0-9467-88ff80b76766.jpg b/Apps/XinDianTu/Images/ac48e62b-5c6d-48e0-9467-88ff80b76766.jpg
new file mode 100644
index 0000000..62686c9
Binary files /dev/null and b/Apps/XinDianTu/Images/ac48e62b-5c6d-48e0-9467-88ff80b76766.jpg differ
diff --git a/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326.jpg b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326.jpg
new file mode 100644
index 0000000..492f004
Binary files /dev/null and b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326.jpg differ
diff --git a/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326.json b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326.json
new file mode 100644
index 0000000..d41df4a
--- /dev/null
+++ b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326.json
@@ -0,0 +1,46 @@
+{
+ "image": "ac4c6dae-d912-4b57-8fd5-687ee6359326.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326_flag.jpg b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326_flag.jpg
new file mode 100644
index 0000000..fcf5c68
Binary files /dev/null and b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326_vl.jpg b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326_vl.jpg
new file mode 100644
index 0000000..f7a373f
Binary files /dev/null and b/Apps/XinDianTu/Images/ac4c6dae-d912-4b57-8fd5-687ee6359326_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_1.jpg b/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_1.jpg
new file mode 100644
index 0000000..3c0eb8d
Binary files /dev/null and b/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_2.jpg b/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_2.jpg
new file mode 100644
index 0000000..d98ee18
Binary files /dev/null and b/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_3.jpg b/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_3.jpg
new file mode 100644
index 0000000..72b6a4d
Binary files /dev/null and b/Apps/XinDianTu/Images/ac5df1cf5addfee423aecc4f9acf8456_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ac857cca-73c1-45c5-894c-73786773dc96.jpg b/Apps/XinDianTu/Images/ac857cca-73c1-45c5-894c-73786773dc96.jpg
new file mode 100644
index 0000000..447dab3
Binary files /dev/null and b/Apps/XinDianTu/Images/ac857cca-73c1-45c5-894c-73786773dc96.jpg differ
diff --git a/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457.jpg b/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457.jpg
new file mode 100644
index 0000000..c61ef3d
Binary files /dev/null and b/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457.jpg differ
diff --git a/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457_flag.jpg b/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457_flag.jpg
new file mode 100644
index 0000000..c3fd457
Binary files /dev/null and b/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457_vl.jpg b/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457_vl.jpg
new file mode 100644
index 0000000..ef6fd88
Binary files /dev/null and b/Apps/XinDianTu/Images/ad2a62b7-2cd0-4d85-8090-d5513cc6a457_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_1.jpg b/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_1.jpg
new file mode 100644
index 0000000..18a0ba7
Binary files /dev/null and b/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_2.jpg b/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_2.jpg
new file mode 100644
index 0000000..6e5b533
Binary files /dev/null and b/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_3.jpg b/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_3.jpg
new file mode 100644
index 0000000..35c2e7e
Binary files /dev/null and b/Apps/XinDianTu/Images/ad3d62cd58d24ab9a993e7ca74cb9ee8_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ad61fdad-fcd2-4e3f-882c-549b1c99ff11.jpg b/Apps/XinDianTu/Images/ad61fdad-fcd2-4e3f-882c-549b1c99ff11.jpg
new file mode 100644
index 0000000..19f7a91
Binary files /dev/null and b/Apps/XinDianTu/Images/ad61fdad-fcd2-4e3f-882c-549b1c99ff11.jpg differ
diff --git a/Apps/XinDianTu/Images/ad7ebfdb-057f-4e13-a005-1b44d62e5cc5.jpg b/Apps/XinDianTu/Images/ad7ebfdb-057f-4e13-a005-1b44d62e5cc5.jpg
new file mode 100644
index 0000000..0a3635a
Binary files /dev/null and b/Apps/XinDianTu/Images/ad7ebfdb-057f-4e13-a005-1b44d62e5cc5.jpg differ
diff --git a/Apps/XinDianTu/Images/adc47c16-b2f9-4859-921e-a66004254747.jpg b/Apps/XinDianTu/Images/adc47c16-b2f9-4859-921e-a66004254747.jpg
new file mode 100644
index 0000000..2875324
Binary files /dev/null and b/Apps/XinDianTu/Images/adc47c16-b2f9-4859-921e-a66004254747.jpg differ
diff --git a/Apps/XinDianTu/Images/adffe512-328e-474b-91cc-7dd8f9c8b1de.jpg b/Apps/XinDianTu/Images/adffe512-328e-474b-91cc-7dd8f9c8b1de.jpg
new file mode 100644
index 0000000..1d74d9f
Binary files /dev/null and b/Apps/XinDianTu/Images/adffe512-328e-474b-91cc-7dd8f9c8b1de.jpg differ
diff --git a/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b.jpg b/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b.jpg
new file mode 100644
index 0000000..6f75b4a
Binary files /dev/null and b/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b.jpg differ
diff --git a/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b_flag.jpg b/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b_flag.jpg
new file mode 100644
index 0000000..b6bf819
Binary files /dev/null and b/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b_vl.jpg b/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b_vl.jpg
new file mode 100644
index 0000000..1ca6b93
Binary files /dev/null and b/Apps/XinDianTu/Images/ae179fbd-32e0-4c94-b710-c8c7abe3346b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ae35570e-773d-461e-9f1b-f5c1f3726bb8.jpg b/Apps/XinDianTu/Images/ae35570e-773d-461e-9f1b-f5c1f3726bb8.jpg
new file mode 100644
index 0000000..681110f
Binary files /dev/null and b/Apps/XinDianTu/Images/ae35570e-773d-461e-9f1b-f5c1f3726bb8.jpg differ
diff --git a/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_1.jpg b/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_1.jpg
new file mode 100644
index 0000000..b3a296e
Binary files /dev/null and b/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_2.jpg b/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_2.jpg
new file mode 100644
index 0000000..c7266ea
Binary files /dev/null and b/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_3.jpg b/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_3.jpg
new file mode 100644
index 0000000..9bc7e4f
Binary files /dev/null and b/Apps/XinDianTu/Images/ae7e56ff20885bd9ea16c13580749915_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ae897482-edd2-448c-b8bb-f81323b8028b.jpg b/Apps/XinDianTu/Images/ae897482-edd2-448c-b8bb-f81323b8028b.jpg
new file mode 100644
index 0000000..c4c872e
Binary files /dev/null and b/Apps/XinDianTu/Images/ae897482-edd2-448c-b8bb-f81323b8028b.jpg differ
diff --git a/Apps/XinDianTu/Images/ae8a2f8b-a6ba-4f76-89c1-59ca99e9d4a7.jpg b/Apps/XinDianTu/Images/ae8a2f8b-a6ba-4f76-89c1-59ca99e9d4a7.jpg
new file mode 100644
index 0000000..485905f
Binary files /dev/null and b/Apps/XinDianTu/Images/ae8a2f8b-a6ba-4f76-89c1-59ca99e9d4a7.jpg differ
diff --git a/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e.jpg b/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e.jpg
new file mode 100644
index 0000000..1fbbb49
Binary files /dev/null and b/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e.jpg differ
diff --git a/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e_flag.jpg b/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e_flag.jpg
new file mode 100644
index 0000000..c896d57
Binary files /dev/null and b/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e_vl.jpg b/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e_vl.jpg
new file mode 100644
index 0000000..0caf840
Binary files /dev/null and b/Apps/XinDianTu/Images/aee993dc-02e4-4362-bcb5-c5885e0ccc0e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627.jpg b/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627.jpg
new file mode 100644
index 0000000..f976446
Binary files /dev/null and b/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627.jpg differ
diff --git a/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627_flag.jpg b/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627_flag.jpg
new file mode 100644
index 0000000..c59ed27
Binary files /dev/null and b/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627_vl.jpg b/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627_vl.jpg
new file mode 100644
index 0000000..3c06019
Binary files /dev/null and b/Apps/XinDianTu/Images/af61e69a-6ae1-4343-b59f-9b1485503627_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_1.jpg b/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_1.jpg
new file mode 100644
index 0000000..d117014
Binary files /dev/null and b/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_2.jpg b/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_2.jpg
new file mode 100644
index 0000000..ef85193
Binary files /dev/null and b/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_3.jpg b/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_3.jpg
new file mode 100644
index 0000000..17900c3
Binary files /dev/null and b/Apps/XinDianTu/Images/af98b2183d7013831a2bf7c43a58f81c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/aff4ec41-8c1a-4f09-8441-e8ebc9db0538.jpg b/Apps/XinDianTu/Images/aff4ec41-8c1a-4f09-8441-e8ebc9db0538.jpg
new file mode 100644
index 0000000..49543c6
Binary files /dev/null and b/Apps/XinDianTu/Images/aff4ec41-8c1a-4f09-8441-e8ebc9db0538.jpg differ
diff --git a/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_1.jpg b/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_1.jpg
new file mode 100644
index 0000000..fa20280
Binary files /dev/null and b/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_2.jpg b/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_2.jpg
new file mode 100644
index 0000000..97f0011
Binary files /dev/null and b/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_3.jpg b/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_3.jpg
new file mode 100644
index 0000000..b3fd9bd
Binary files /dev/null and b/Apps/XinDianTu/Images/affcbde056dc088427de753217a4b939_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_1.jpg b/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_1.jpg
new file mode 100644
index 0000000..1c966ae
Binary files /dev/null and b/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_2.jpg b/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_2.jpg
new file mode 100644
index 0000000..19f7f54
Binary files /dev/null and b/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_3.jpg b/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_3.jpg
new file mode 100644
index 0000000..29bfe40
Binary files /dev/null and b/Apps/XinDianTu/Images/b02ee2c9a92e610ab274907c53ba45a3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b039d3d1-59fe-4c2f-8e8c-302f373395b8.jpg b/Apps/XinDianTu/Images/b039d3d1-59fe-4c2f-8e8c-302f373395b8.jpg
new file mode 100644
index 0000000..c8e92e8
Binary files /dev/null and b/Apps/XinDianTu/Images/b039d3d1-59fe-4c2f-8e8c-302f373395b8.jpg differ
diff --git a/Apps/XinDianTu/Images/b04ebbb5-d2f8-4354-aa3d-ca461ffd4151.jpg b/Apps/XinDianTu/Images/b04ebbb5-d2f8-4354-aa3d-ca461ffd4151.jpg
new file mode 100644
index 0000000..06bf6cb
Binary files /dev/null and b/Apps/XinDianTu/Images/b04ebbb5-d2f8-4354-aa3d-ca461ffd4151.jpg differ
diff --git a/Apps/XinDianTu/Images/b064db0e-47f0-438c-b232-30a805e3ed42.jpg b/Apps/XinDianTu/Images/b064db0e-47f0-438c-b232-30a805e3ed42.jpg
new file mode 100644
index 0000000..a3e0029
Binary files /dev/null and b/Apps/XinDianTu/Images/b064db0e-47f0-438c-b232-30a805e3ed42.jpg differ
diff --git a/Apps/XinDianTu/Images/b0d6aa86-88f6-4643-a2b7-ab0aaf9e11fb.jpg b/Apps/XinDianTu/Images/b0d6aa86-88f6-4643-a2b7-ab0aaf9e11fb.jpg
new file mode 100644
index 0000000..7dcbac7
Binary files /dev/null and b/Apps/XinDianTu/Images/b0d6aa86-88f6-4643-a2b7-ab0aaf9e11fb.jpg differ
diff --git a/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.jpg b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.jpg
new file mode 100644
index 0000000..59704fe
Binary files /dev/null and b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.jpg differ
diff --git a/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.json b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.json
new file mode 100644
index 0000000..2d389e8
--- /dev/null
+++ b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.json
@@ -0,0 +1,46 @@
+{
+ "image": "b0e1bbf5-341b-4cd6-916e-e8bb70cba90f.jpg",
+ "width": 720,
+ "height": 248,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 532,
+ 700,
+ 780
+ ],
+ "click_point": [
+ 121,
+ 581
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 793,
+ 700,
+ 1039
+ ],
+ "click_point": [
+ 121,
+ 842
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1052,
+ 700,
+ 1300
+ ],
+ "click_point": [
+ 121,
+ 1101
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f_flag.jpg b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f_flag.jpg
new file mode 100644
index 0000000..2dbc3d8
Binary files /dev/null and b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f_vl.jpg b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f_vl.jpg
new file mode 100644
index 0000000..89fc9e2
Binary files /dev/null and b/Apps/XinDianTu/Images/b0e1bbf5-341b-4cd6-916e-e8bb70cba90f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b13e8bdb-ea36-479d-b2dc-8ab29d547ceb.jpg b/Apps/XinDianTu/Images/b13e8bdb-ea36-479d-b2dc-8ab29d547ceb.jpg
new file mode 100644
index 0000000..f15ea16
Binary files /dev/null and b/Apps/XinDianTu/Images/b13e8bdb-ea36-479d-b2dc-8ab29d547ceb.jpg differ
diff --git a/Apps/XinDianTu/Images/b1521de3-617b-4329-ba69-8b1e5fe8fc2b.jpg b/Apps/XinDianTu/Images/b1521de3-617b-4329-ba69-8b1e5fe8fc2b.jpg
new file mode 100644
index 0000000..11d0abd
Binary files /dev/null and b/Apps/XinDianTu/Images/b1521de3-617b-4329-ba69-8b1e5fe8fc2b.jpg differ
diff --git a/Apps/XinDianTu/Images/b1526ba7-6b22-4fcc-8265-3c2d04bed972.jpg b/Apps/XinDianTu/Images/b1526ba7-6b22-4fcc-8265-3c2d04bed972.jpg
new file mode 100644
index 0000000..66f6f18
Binary files /dev/null and b/Apps/XinDianTu/Images/b1526ba7-6b22-4fcc-8265-3c2d04bed972.jpg differ
diff --git a/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_1.jpg b/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_1.jpg
new file mode 100644
index 0000000..7b144ab
Binary files /dev/null and b/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_2.jpg b/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_2.jpg
new file mode 100644
index 0000000..8211664
Binary files /dev/null and b/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_3.jpg b/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_3.jpg
new file mode 100644
index 0000000..468e092
Binary files /dev/null and b/Apps/XinDianTu/Images/b1d4e8f0f24f01621510fad09598291a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b265d2a0-1e59-4fde-a984-5fc1b2a990cc.jpg b/Apps/XinDianTu/Images/b265d2a0-1e59-4fde-a984-5fc1b2a990cc.jpg
new file mode 100644
index 0000000..61e0314
Binary files /dev/null and b/Apps/XinDianTu/Images/b265d2a0-1e59-4fde-a984-5fc1b2a990cc.jpg differ
diff --git a/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_1.jpg b/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_1.jpg
new file mode 100644
index 0000000..e598d1b
Binary files /dev/null and b/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_2.jpg b/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_2.jpg
new file mode 100644
index 0000000..e8495d1
Binary files /dev/null and b/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_3.jpg b/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_3.jpg
new file mode 100644
index 0000000..df62f81
Binary files /dev/null and b/Apps/XinDianTu/Images/b273f3debb477b721e4b545ff6353948_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b2b03a7b-6440-4906-b1d8-1737fc3aea68.jpg b/Apps/XinDianTu/Images/b2b03a7b-6440-4906-b1d8-1737fc3aea68.jpg
new file mode 100644
index 0000000..45f56bb
Binary files /dev/null and b/Apps/XinDianTu/Images/b2b03a7b-6440-4906-b1d8-1737fc3aea68.jpg differ
diff --git a/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d.jpg b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d.jpg
new file mode 100644
index 0000000..251de8f
Binary files /dev/null and b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d.jpg differ
diff --git a/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d.json b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d.json
new file mode 100644
index 0000000..f295380
--- /dev/null
+++ b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d.json
@@ -0,0 +1,46 @@
+{
+ "image": "b2c3b785-3fc5-40bd-8713-18041f61777d.jpg",
+ "width": 720,
+ "height": 248,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 564,
+ 700,
+ 812
+ ],
+ "click_point": [
+ 121,
+ 613
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 825,
+ 700,
+ 1071
+ ],
+ "click_point": [
+ 121,
+ 874
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1084,
+ 700,
+ 1332
+ ],
+ "click_point": [
+ 121,
+ 1133
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d_flag.jpg b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d_flag.jpg
new file mode 100644
index 0000000..8bf945d
Binary files /dev/null and b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d_vl.jpg b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d_vl.jpg
new file mode 100644
index 0000000..7bab22c
Binary files /dev/null and b/Apps/XinDianTu/Images/b2c3b785-3fc5-40bd-8713-18041f61777d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b2dc3cf9-0dc6-4ffc-aab9-993f006a8fca.jpg b/Apps/XinDianTu/Images/b2dc3cf9-0dc6-4ffc-aab9-993f006a8fca.jpg
new file mode 100644
index 0000000..c1726e4
Binary files /dev/null and b/Apps/XinDianTu/Images/b2dc3cf9-0dc6-4ffc-aab9-993f006a8fca.jpg differ
diff --git a/Apps/XinDianTu/Images/b3b2dcb9-25a0-4d59-846b-e24817c48f02.jpg b/Apps/XinDianTu/Images/b3b2dcb9-25a0-4d59-846b-e24817c48f02.jpg
new file mode 100644
index 0000000..79e716d
Binary files /dev/null and b/Apps/XinDianTu/Images/b3b2dcb9-25a0-4d59-846b-e24817c48f02.jpg differ
diff --git a/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_1.jpg b/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_1.jpg
new file mode 100644
index 0000000..2d7be89
Binary files /dev/null and b/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_2.jpg b/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_2.jpg
new file mode 100644
index 0000000..95da31c
Binary files /dev/null and b/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_3.jpg b/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_3.jpg
new file mode 100644
index 0000000..d505b6f
Binary files /dev/null and b/Apps/XinDianTu/Images/b4570eed39e3fdad5cbc19a10c94781d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_1.jpg b/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_1.jpg
new file mode 100644
index 0000000..2886e5e
Binary files /dev/null and b/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_2.jpg b/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_2.jpg
new file mode 100644
index 0000000..5748980
Binary files /dev/null and b/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_3.jpg b/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_3.jpg
new file mode 100644
index 0000000..d0b91c4
Binary files /dev/null and b/Apps/XinDianTu/Images/b4985bbe2e2ea49640fa870f8ea0eaf0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_1.jpg b/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_1.jpg
new file mode 100644
index 0000000..a4988ca
Binary files /dev/null and b/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_2.jpg b/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_2.jpg
new file mode 100644
index 0000000..5227dda
Binary files /dev/null and b/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_3.jpg b/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_3.jpg
new file mode 100644
index 0000000..df478e1
Binary files /dev/null and b/Apps/XinDianTu/Images/b4b1cf02ff61155dea815b66628225f9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_1.jpg b/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_1.jpg
new file mode 100644
index 0000000..e005cfe
Binary files /dev/null and b/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_2.jpg b/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_2.jpg
new file mode 100644
index 0000000..feafde4
Binary files /dev/null and b/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_3.jpg b/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_3.jpg
new file mode 100644
index 0000000..c2b0789
Binary files /dev/null and b/Apps/XinDianTu/Images/b4de78b2efb76c65b28c0af1e2b3efad_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b547486a-6387-4687-aa81-16bbeb9981bb.jpg b/Apps/XinDianTu/Images/b547486a-6387-4687-aa81-16bbeb9981bb.jpg
new file mode 100644
index 0000000..f3dd455
Binary files /dev/null and b/Apps/XinDianTu/Images/b547486a-6387-4687-aa81-16bbeb9981bb.jpg differ
diff --git a/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf.jpg b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf.jpg
new file mode 100644
index 0000000..a90f1b6
Binary files /dev/null and b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf.jpg differ
diff --git a/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf.json b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf.json
new file mode 100644
index 0000000..9f13f87
--- /dev/null
+++ b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf.json
@@ -0,0 +1,46 @@
+{
+ "image": "b5845c38-c29d-4b53-b47c-394b39d82fdf.jpg",
+ "width": 720,
+ "height": 243,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 580,
+ 700,
+ 829
+ ],
+ "click_point": [
+ 121,
+ 629
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 842,
+ 700,
+ 1117
+ ],
+ "click_point": [
+ 121,
+ 897
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1131,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1179
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf_flag.jpg b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf_flag.jpg
new file mode 100644
index 0000000..ec9aaa6
Binary files /dev/null and b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf_vl.jpg b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf_vl.jpg
new file mode 100644
index 0000000..53f77a8
Binary files /dev/null and b/Apps/XinDianTu/Images/b5845c38-c29d-4b53-b47c-394b39d82fdf_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b5ae95c5-5f7c-4dd3-8ea4-20fb6633703c.jpg b/Apps/XinDianTu/Images/b5ae95c5-5f7c-4dd3-8ea4-20fb6633703c.jpg
new file mode 100644
index 0000000..251d3d3
Binary files /dev/null and b/Apps/XinDianTu/Images/b5ae95c5-5f7c-4dd3-8ea4-20fb6633703c.jpg differ
diff --git a/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf.jpg b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf.jpg
new file mode 100644
index 0000000..d277ee7
Binary files /dev/null and b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf.jpg differ
diff --git a/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf.json b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf.json
new file mode 100644
index 0000000..7e3d600
--- /dev/null
+++ b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf.json
@@ -0,0 +1,46 @@
+{
+ "image": "b5df7b1d-a1c0-49df-ad6c-39af03e150cf.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf_flag.jpg b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf_flag.jpg
new file mode 100644
index 0000000..516f7b3
Binary files /dev/null and b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf_vl.jpg b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf_vl.jpg
new file mode 100644
index 0000000..d16d06c
Binary files /dev/null and b/Apps/XinDianTu/Images/b5df7b1d-a1c0-49df-ad6c-39af03e150cf_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_1.jpg b/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_1.jpg
new file mode 100644
index 0000000..424c0b2
Binary files /dev/null and b/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_2.jpg b/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_2.jpg
new file mode 100644
index 0000000..695580d
Binary files /dev/null and b/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_3.jpg b/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_3.jpg
new file mode 100644
index 0000000..08a9a7e
Binary files /dev/null and b/Apps/XinDianTu/Images/b6423ee046fa1aa1b6c186972d08d126_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b6982f98-1a20-4b98-a322-f5be8f737145.jpg b/Apps/XinDianTu/Images/b6982f98-1a20-4b98-a322-f5be8f737145.jpg
new file mode 100644
index 0000000..a4fd87c
Binary files /dev/null and b/Apps/XinDianTu/Images/b6982f98-1a20-4b98-a322-f5be8f737145.jpg differ
diff --git a/Apps/XinDianTu/Images/b6bd34ce-183a-46c7-81c4-10e0857cea88.jpg b/Apps/XinDianTu/Images/b6bd34ce-183a-46c7-81c4-10e0857cea88.jpg
new file mode 100644
index 0000000..f9e1797
Binary files /dev/null and b/Apps/XinDianTu/Images/b6bd34ce-183a-46c7-81c4-10e0857cea88.jpg differ
diff --git a/Apps/XinDianTu/Images/b6e5eb97-4cd1-4c29-8e06-95b6bf982582.jpg b/Apps/XinDianTu/Images/b6e5eb97-4cd1-4c29-8e06-95b6bf982582.jpg
new file mode 100644
index 0000000..2b129f4
Binary files /dev/null and b/Apps/XinDianTu/Images/b6e5eb97-4cd1-4c29-8e06-95b6bf982582.jpg differ
diff --git a/Apps/XinDianTu/Images/b6ea7259-143c-40c2-8329-77872eb20e11.jpg b/Apps/XinDianTu/Images/b6ea7259-143c-40c2-8329-77872eb20e11.jpg
new file mode 100644
index 0000000..9e16d29
Binary files /dev/null and b/Apps/XinDianTu/Images/b6ea7259-143c-40c2-8329-77872eb20e11.jpg differ
diff --git a/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb.jpg b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb.jpg
new file mode 100644
index 0000000..f44dca8
Binary files /dev/null and b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb.jpg differ
diff --git a/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb.json b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb.json
new file mode 100644
index 0000000..ce50d84
--- /dev/null
+++ b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb.json
@@ -0,0 +1,59 @@
+{
+ "image": "b6ef8444-28bb-4499-9d1a-2f51d81a71cb.jpg",
+ "width": 720,
+ "height": 162,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 484,
+ 700,
+ 735
+ ],
+ "click_point": [
+ 121,
+ 534
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 744,
+ 700,
+ 990
+ ],
+ "click_point": [
+ 121,
+ 793
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1004,
+ 700,
+ 1198
+ ],
+ "click_point": [
+ 121,
+ 1042
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1212,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1244
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb_flag.jpg b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb_flag.jpg
new file mode 100644
index 0000000..c4d9196
Binary files /dev/null and b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb_vl.jpg b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb_vl.jpg
new file mode 100644
index 0000000..30e8d2b
Binary files /dev/null and b/Apps/XinDianTu/Images/b6ef8444-28bb-4499-9d1a-2f51d81a71cb_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b71a50fa-7223-4fa9-86b2-b5268a7d07fb.jpg b/Apps/XinDianTu/Images/b71a50fa-7223-4fa9-86b2-b5268a7d07fb.jpg
new file mode 100644
index 0000000..b73c309
Binary files /dev/null and b/Apps/XinDianTu/Images/b71a50fa-7223-4fa9-86b2-b5268a7d07fb.jpg differ
diff --git a/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_1.jpg b/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_1.jpg
new file mode 100644
index 0000000..9c7007e
Binary files /dev/null and b/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_2.jpg b/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_2.jpg
new file mode 100644
index 0000000..ace758b
Binary files /dev/null and b/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_3.jpg b/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_3.jpg
new file mode 100644
index 0000000..856353a
Binary files /dev/null and b/Apps/XinDianTu/Images/b7460e0009578fe82a26e65568bcd356_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b7789616-d38d-4584-a1ad-0b7983b6708c.jpg b/Apps/XinDianTu/Images/b7789616-d38d-4584-a1ad-0b7983b6708c.jpg
new file mode 100644
index 0000000..cb04324
Binary files /dev/null and b/Apps/XinDianTu/Images/b7789616-d38d-4584-a1ad-0b7983b6708c.jpg differ
diff --git a/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_1.jpg b/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_1.jpg
new file mode 100644
index 0000000..bcd63cb
Binary files /dev/null and b/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_2.jpg b/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_2.jpg
new file mode 100644
index 0000000..73c3b50
Binary files /dev/null and b/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_3.jpg b/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_3.jpg
new file mode 100644
index 0000000..2e73f82
Binary files /dev/null and b/Apps/XinDianTu/Images/b77ad30e37c7a7dcf0511f8dbc6fc3ab_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_1.jpg b/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_1.jpg
new file mode 100644
index 0000000..453467b
Binary files /dev/null and b/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_2.jpg b/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_2.jpg
new file mode 100644
index 0000000..6288cf1
Binary files /dev/null and b/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_3.jpg b/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_3.jpg
new file mode 100644
index 0000000..4a9ba2a
Binary files /dev/null and b/Apps/XinDianTu/Images/b7895c189658aebc6f65e02f8ff8491e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/b7d1aaa6-9681-4f9e-95ff-2ab67a46de1b.jpg b/Apps/XinDianTu/Images/b7d1aaa6-9681-4f9e-95ff-2ab67a46de1b.jpg
new file mode 100644
index 0000000..4411bfa
Binary files /dev/null and b/Apps/XinDianTu/Images/b7d1aaa6-9681-4f9e-95ff-2ab67a46de1b.jpg differ
diff --git a/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd.jpg b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd.jpg
new file mode 100644
index 0000000..ffaf5c6
Binary files /dev/null and b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd.jpg differ
diff --git a/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd.json b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd.json
new file mode 100644
index 0000000..41f72d8
--- /dev/null
+++ b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd.json
@@ -0,0 +1,46 @@
+{
+ "image": "b7de3301-6c6a-4e84-8f2c-6ed782838ebd.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 499,
+ 700,
+ 748
+ ],
+ "click_point": [
+ 121,
+ 548
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 756,
+ 700,
+ 1005
+ ],
+ "click_point": [
+ 121,
+ 805
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1019,
+ 700,
+ 1268
+ ],
+ "click_point": [
+ 121,
+ 1068
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd_flag.jpg b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd_flag.jpg
new file mode 100644
index 0000000..b8a78c6
Binary files /dev/null and b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd_vl.jpg b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd_vl.jpg
new file mode 100644
index 0000000..0b5032a
Binary files /dev/null and b/Apps/XinDianTu/Images/b7de3301-6c6a-4e84-8f2c-6ed782838ebd_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715.jpg b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715.jpg
new file mode 100644
index 0000000..3e09943
Binary files /dev/null and b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715.jpg differ
diff --git a/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715.json b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715.json
new file mode 100644
index 0000000..00cbafb
--- /dev/null
+++ b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715.json
@@ -0,0 +1,46 @@
+{
+ "image": "b850b328-8c7b-45ab-bf88-7246a7a55715.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715_flag.jpg b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715_flag.jpg
new file mode 100644
index 0000000..2539c90
Binary files /dev/null and b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715_vl.jpg b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715_vl.jpg
new file mode 100644
index 0000000..02c2906
Binary files /dev/null and b/Apps/XinDianTu/Images/b850b328-8c7b-45ab-bf88-7246a7a55715_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36.jpg b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36.jpg
new file mode 100644
index 0000000..46b83d1
Binary files /dev/null and b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36.jpg differ
diff --git a/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36.json b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36.json
new file mode 100644
index 0000000..0100662
--- /dev/null
+++ b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36.json
@@ -0,0 +1,46 @@
+{
+ "image": "b8d6821a-8850-4c29-8a07-6c2d13dcec36.jpg",
+ "width": 720,
+ "height": 306,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 548,
+ 700,
+ 796
+ ],
+ "click_point": [
+ 121,
+ 597
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 809,
+ 700,
+ 1055
+ ],
+ "click_point": [
+ 121,
+ 858
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1068,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1129
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36_flag.jpg b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36_flag.jpg
new file mode 100644
index 0000000..eeaa729
Binary files /dev/null and b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36_vl.jpg b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36_vl.jpg
new file mode 100644
index 0000000..4ce614d
Binary files /dev/null and b/Apps/XinDianTu/Images/b8d6821a-8850-4c29-8a07-6c2d13dcec36_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae.jpg b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae.jpg
new file mode 100644
index 0000000..18efd07
Binary files /dev/null and b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae.jpg differ
diff --git a/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae.json b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae.json
new file mode 100644
index 0000000..9ff02e7
--- /dev/null
+++ b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae.json
@@ -0,0 +1,59 @@
+{
+ "image": "b98656a5-6084-49b0-b06a-e71bfb9793ae.jpg",
+ "width": 720,
+ "height": 186,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 655
+ ],
+ "click_point": [
+ 121,
+ 454
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 668,
+ 700,
+ 916
+ ],
+ "click_point": [
+ 121,
+ 717
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 929,
+ 700,
+ 1175
+ ],
+ "click_point": [
+ 121,
+ 978
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1188,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1225
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae_flag.jpg b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae_flag.jpg
new file mode 100644
index 0000000..1a16e35
Binary files /dev/null and b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae_vl.jpg b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae_vl.jpg
new file mode 100644
index 0000000..d845830
Binary files /dev/null and b/Apps/XinDianTu/Images/b98656a5-6084-49b0-b06a-e71bfb9793ae_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/b99ccaad-5f1e-4c1d-8011-2e67b958132b.jpg b/Apps/XinDianTu/Images/b99ccaad-5f1e-4c1d-8011-2e67b958132b.jpg
new file mode 100644
index 0000000..d54b584
Binary files /dev/null and b/Apps/XinDianTu/Images/b99ccaad-5f1e-4c1d-8011-2e67b958132b.jpg differ
diff --git a/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924.jpg b/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924.jpg
new file mode 100644
index 0000000..19391c5
Binary files /dev/null and b/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924.jpg differ
diff --git a/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924_flag.jpg b/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924_flag.jpg
new file mode 100644
index 0000000..eca39c3
Binary files /dev/null and b/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924_vl.jpg b/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924_vl.jpg
new file mode 100644
index 0000000..8c4df91
Binary files /dev/null and b/Apps/XinDianTu/Images/ba0f671c-cca7-4161-a644-2c7b3b5dd924_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ba0fcd42-bc00-40b8-a0b3-3c01ca4d3f00.jpg b/Apps/XinDianTu/Images/ba0fcd42-bc00-40b8-a0b3-3c01ca4d3f00.jpg
new file mode 100644
index 0000000..7fcd31c
Binary files /dev/null and b/Apps/XinDianTu/Images/ba0fcd42-bc00-40b8-a0b3-3c01ca4d3f00.jpg differ
diff --git a/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d.jpg b/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d.jpg
new file mode 100644
index 0000000..5de9894
Binary files /dev/null and b/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d.jpg differ
diff --git a/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d_flag.jpg b/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d_flag.jpg
new file mode 100644
index 0000000..5b3a0fe
Binary files /dev/null and b/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d_vl.jpg b/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d_vl.jpg
new file mode 100644
index 0000000..c99b3ba
Binary files /dev/null and b/Apps/XinDianTu/Images/ba28e656-9b5f-47e3-aa74-bc45edd8cb9d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_1.jpg b/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_1.jpg
new file mode 100644
index 0000000..757d89a
Binary files /dev/null and b/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_2.jpg b/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_2.jpg
new file mode 100644
index 0000000..757d89a
Binary files /dev/null and b/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_3.jpg b/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_3.jpg
new file mode 100644
index 0000000..757d89a
Binary files /dev/null and b/Apps/XinDianTu/Images/ba37005bda2d903eef7779b1a05acb8a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.jpg b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.jpg
new file mode 100644
index 0000000..0a64cfe
Binary files /dev/null and b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.jpg differ
diff --git a/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.json b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.json
new file mode 100644
index 0000000..33ba7b0
--- /dev/null
+++ b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.json
@@ -0,0 +1,46 @@
+{
+ "image": "ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2.jpg",
+ "width": 720,
+ "height": 173,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 403,
+ 700,
+ 672
+ ],
+ "click_point": [
+ 121,
+ 456
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 681,
+ 700,
+ 932
+ ],
+ "click_point": [
+ 121,
+ 731
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 946,
+ 700,
+ 1192
+ ],
+ "click_point": [
+ 121,
+ 995
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2_flag.jpg b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2_flag.jpg
new file mode 100644
index 0000000..04a5633
Binary files /dev/null and b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2_vl.jpg b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2_vl.jpg
new file mode 100644
index 0000000..cf90a31
Binary files /dev/null and b/Apps/XinDianTu/Images/ba3d8677-ba05-4cf6-b1c0-f7d92b7d10a2_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1.jpg b/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1.jpg
new file mode 100644
index 0000000..2a4b029
Binary files /dev/null and b/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1.jpg differ
diff --git a/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1_flag.jpg b/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1_flag.jpg
new file mode 100644
index 0000000..0efaac0
Binary files /dev/null and b/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1_vl.jpg b/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1_vl.jpg
new file mode 100644
index 0000000..fcce2e5
Binary files /dev/null and b/Apps/XinDianTu/Images/ba9fe233-8db8-4a1a-9c73-ba5cdb417ca1_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/baaad533-d5c0-4477-a38f-402048044ff9.jpg b/Apps/XinDianTu/Images/baaad533-d5c0-4477-a38f-402048044ff9.jpg
new file mode 100644
index 0000000..9323b50
Binary files /dev/null and b/Apps/XinDianTu/Images/baaad533-d5c0-4477-a38f-402048044ff9.jpg differ
diff --git a/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_1.jpg b/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_1.jpg
new file mode 100644
index 0000000..fd0d577
Binary files /dev/null and b/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_2.jpg b/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_2.jpg
new file mode 100644
index 0000000..4217b5a
Binary files /dev/null and b/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_3.jpg b/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_3.jpg
new file mode 100644
index 0000000..04103e1
Binary files /dev/null and b/Apps/XinDianTu/Images/bac4312e4e5fa3427d0c743e28c1c7a5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3.jpg b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3.jpg
new file mode 100644
index 0000000..4f216d3
Binary files /dev/null and b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3.jpg differ
diff --git a/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3.json b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3.json
new file mode 100644
index 0000000..555b2dd
--- /dev/null
+++ b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3.json
@@ -0,0 +1,59 @@
+{
+ "image": "bb125533-fb52-4405-be53-5495d84623d3.jpg",
+ "width": 720,
+ "height": 228,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 612
+ ],
+ "click_point": [
+ 121,
+ 445
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 626,
+ 700,
+ 872
+ ],
+ "click_point": [
+ 121,
+ 675
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 881,
+ 700,
+ 1132
+ ],
+ "click_point": [
+ 121,
+ 931
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1146,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1191
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3_flag.jpg b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3_flag.jpg
new file mode 100644
index 0000000..5548c0a
Binary files /dev/null and b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3_vl.jpg b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3_vl.jpg
new file mode 100644
index 0000000..7d84e4c
Binary files /dev/null and b/Apps/XinDianTu/Images/bb125533-fb52-4405-be53-5495d84623d3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5.jpg b/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5.jpg
new file mode 100644
index 0000000..8df2783
Binary files /dev/null and b/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5.jpg differ
diff --git a/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5_flag.jpg b/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5_flag.jpg
new file mode 100644
index 0000000..3037fa3
Binary files /dev/null and b/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5_vl.jpg b/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5_vl.jpg
new file mode 100644
index 0000000..6e58bae
Binary files /dev/null and b/Apps/XinDianTu/Images/bb16db3d-5bfe-4dc4-9f6c-a607be3d85d5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/bb3be482-659c-4bff-8161-34097fee8482.jpg b/Apps/XinDianTu/Images/bb3be482-659c-4bff-8161-34097fee8482.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/bb3be482-659c-4bff-8161-34097fee8482.jpg differ
diff --git a/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b.jpg b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b.jpg
new file mode 100644
index 0000000..dc95745
Binary files /dev/null and b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b.jpg differ
diff --git a/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b.json b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b.json
new file mode 100644
index 0000000..43985d5
--- /dev/null
+++ b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b.json
@@ -0,0 +1,59 @@
+{
+ "image": "bb477ecb-12c2-4662-9349-f9e2b7db797b.jpg",
+ "width": 720,
+ "height": 238,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 607
+ ],
+ "click_point": [
+ 121,
+ 444
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 616,
+ 700,
+ 862
+ ],
+ "click_point": [
+ 121,
+ 665
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 876,
+ 700,
+ 1127
+ ],
+ "click_point": [
+ 121,
+ 926
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1136,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1183
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b_flag.jpg b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b_flag.jpg
new file mode 100644
index 0000000..393e41a
Binary files /dev/null and b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b_vl.jpg b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b_vl.jpg
new file mode 100644
index 0000000..1937585
Binary files /dev/null and b/Apps/XinDianTu/Images/bb477ecb-12c2-4662-9349-f9e2b7db797b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_1.jpg b/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_1.jpg
new file mode 100644
index 0000000..c7651ae
Binary files /dev/null and b/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_2.jpg b/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_2.jpg
new file mode 100644
index 0000000..2211bc4
Binary files /dev/null and b/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_3.jpg b/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_3.jpg
new file mode 100644
index 0000000..6db733e
Binary files /dev/null and b/Apps/XinDianTu/Images/bb722e2160d92bb57caba466b4318aa5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143.jpg b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143.jpg
new file mode 100644
index 0000000..7b7511e
Binary files /dev/null and b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143.jpg differ
diff --git a/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143.json b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143.json
new file mode 100644
index 0000000..9ae9abf
--- /dev/null
+++ b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143.json
@@ -0,0 +1,46 @@
+{
+ "image": "bbb98230-c2df-4af1-bb8b-c1c020840143.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 531,
+ 700,
+ 780
+ ],
+ "click_point": [
+ 121,
+ 580
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 788,
+ 700,
+ 1037
+ ],
+ "click_point": [
+ 121,
+ 837
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1051,
+ 700,
+ 1300
+ ],
+ "click_point": [
+ 121,
+ 1100
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143_flag.jpg b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143_flag.jpg
new file mode 100644
index 0000000..a5fe9c1
Binary files /dev/null and b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143_vl.jpg b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143_vl.jpg
new file mode 100644
index 0000000..73893a7
Binary files /dev/null and b/Apps/XinDianTu/Images/bbb98230-c2df-4af1-bb8b-c1c020840143_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/bbf92dda-f3f8-4301-bc8d-07528d9f96dc.jpg b/Apps/XinDianTu/Images/bbf92dda-f3f8-4301-bc8d-07528d9f96dc.jpg
new file mode 100644
index 0000000..d74f4a4
Binary files /dev/null and b/Apps/XinDianTu/Images/bbf92dda-f3f8-4301-bc8d-07528d9f96dc.jpg differ
diff --git a/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d.jpg b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d.jpg
new file mode 100644
index 0000000..14cc90f
Binary files /dev/null and b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d.jpg differ
diff --git a/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d.json b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d.json
new file mode 100644
index 0000000..04ce80a
--- /dev/null
+++ b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d.json
@@ -0,0 +1,46 @@
+{
+ "image": "bc667ea1-2e42-400e-b00d-fb38f993e74d.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 484,
+ 700,
+ 732
+ ],
+ "click_point": [
+ 121,
+ 533
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 744,
+ 700,
+ 1020
+ ],
+ "click_point": [
+ 121,
+ 799
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1033,
+ 700,
+ 1279
+ ],
+ "click_point": [
+ 121,
+ 1082
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d_flag.jpg b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d_flag.jpg
new file mode 100644
index 0000000..93d9fa9
Binary files /dev/null and b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d_vl.jpg b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d_vl.jpg
new file mode 100644
index 0000000..c49de88
Binary files /dev/null and b/Apps/XinDianTu/Images/bc667ea1-2e42-400e-b00d-fb38f993e74d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/bc8d384c-2415-4bbd-aa42-e28ecd60e8f5.jpg b/Apps/XinDianTu/Images/bc8d384c-2415-4bbd-aa42-e28ecd60e8f5.jpg
new file mode 100644
index 0000000..9f9f3ca
Binary files /dev/null and b/Apps/XinDianTu/Images/bc8d384c-2415-4bbd-aa42-e28ecd60e8f5.jpg differ
diff --git a/Apps/XinDianTu/Images/bd63b559-29d6-4853-b267-a3bfc39c384c.jpg b/Apps/XinDianTu/Images/bd63b559-29d6-4853-b267-a3bfc39c384c.jpg
new file mode 100644
index 0000000..3de2338
Binary files /dev/null and b/Apps/XinDianTu/Images/bd63b559-29d6-4853-b267-a3bfc39c384c.jpg differ
diff --git a/Apps/XinDianTu/Images/bd8360de-380d-4e8b-a603-07cde8a07394.jpg b/Apps/XinDianTu/Images/bd8360de-380d-4e8b-a603-07cde8a07394.jpg
new file mode 100644
index 0000000..13096fa
Binary files /dev/null and b/Apps/XinDianTu/Images/bd8360de-380d-4e8b-a603-07cde8a07394.jpg differ
diff --git a/Apps/XinDianTu/Images/bddfc871-5b6b-4c8d-a436-37d80add743d.jpg b/Apps/XinDianTu/Images/bddfc871-5b6b-4c8d-a436-37d80add743d.jpg
new file mode 100644
index 0000000..22643e0
Binary files /dev/null and b/Apps/XinDianTu/Images/bddfc871-5b6b-4c8d-a436-37d80add743d.jpg differ
diff --git a/Apps/XinDianTu/Images/bdeac9b4-47a8-4a4f-b5d1-9a0d217910ca.jpg b/Apps/XinDianTu/Images/bdeac9b4-47a8-4a4f-b5d1-9a0d217910ca.jpg
new file mode 100644
index 0000000..8564cd3
Binary files /dev/null and b/Apps/XinDianTu/Images/bdeac9b4-47a8-4a4f-b5d1-9a0d217910ca.jpg differ
diff --git a/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789.jpg b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789.jpg
new file mode 100644
index 0000000..06e55ce
Binary files /dev/null and b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789.jpg differ
diff --git a/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789.json b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789.json
new file mode 100644
index 0000000..6e2d617
--- /dev/null
+++ b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789.json
@@ -0,0 +1,46 @@
+{
+ "image": "bdfb88e1-1c80-477e-8c15-70e87a1d0789.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 539,
+ 700,
+ 788
+ ],
+ "click_point": [
+ 121,
+ 588
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 796,
+ 700,
+ 1045
+ ],
+ "click_point": [
+ 121,
+ 845
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1059,
+ 700,
+ 1308
+ ],
+ "click_point": [
+ 121,
+ 1108
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789_flag.jpg b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789_flag.jpg
new file mode 100644
index 0000000..22904a3
Binary files /dev/null and b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789_vl.jpg b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789_vl.jpg
new file mode 100644
index 0000000..0b707bd
Binary files /dev/null and b/Apps/XinDianTu/Images/bdfb88e1-1c80-477e-8c15-70e87a1d0789_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/be3483d9-913d-455c-b2d0-743942a80773.jpg b/Apps/XinDianTu/Images/be3483d9-913d-455c-b2d0-743942a80773.jpg
new file mode 100644
index 0000000..9bc438c
Binary files /dev/null and b/Apps/XinDianTu/Images/be3483d9-913d-455c-b2d0-743942a80773.jpg differ
diff --git a/Apps/XinDianTu/Images/be67d604-6e82-4441-9ca7-e50d88f9cb2c.jpg b/Apps/XinDianTu/Images/be67d604-6e82-4441-9ca7-e50d88f9cb2c.jpg
new file mode 100644
index 0000000..320114c
Binary files /dev/null and b/Apps/XinDianTu/Images/be67d604-6e82-4441-9ca7-e50d88f9cb2c.jpg differ
diff --git a/Apps/XinDianTu/Images/be6c1440-17d8-491d-9760-19138b10b4ec.jpg b/Apps/XinDianTu/Images/be6c1440-17d8-491d-9760-19138b10b4ec.jpg
new file mode 100644
index 0000000..bc359c2
Binary files /dev/null and b/Apps/XinDianTu/Images/be6c1440-17d8-491d-9760-19138b10b4ec.jpg differ
diff --git a/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4.jpg b/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4.jpg
new file mode 100644
index 0000000..3f071db
Binary files /dev/null and b/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4.jpg differ
diff --git a/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4_flag.jpg b/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4_flag.jpg
new file mode 100644
index 0000000..38ae2a5
Binary files /dev/null and b/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4_vl.jpg b/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4_vl.jpg
new file mode 100644
index 0000000..7f0d937
Binary files /dev/null and b/Apps/XinDianTu/Images/bf366a26-e199-470f-8bd8-f5d1e80468a4_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/bf7b3a22-b2db-488f-b905-cf423265a334.jpg b/Apps/XinDianTu/Images/bf7b3a22-b2db-488f-b905-cf423265a334.jpg
new file mode 100644
index 0000000..dcba0f2
Binary files /dev/null and b/Apps/XinDianTu/Images/bf7b3a22-b2db-488f-b905-cf423265a334.jpg differ
diff --git a/Apps/XinDianTu/Images/c025ada9-4688-4839-a75d-be753d099f1a.jpg b/Apps/XinDianTu/Images/c025ada9-4688-4839-a75d-be753d099f1a.jpg
new file mode 100644
index 0000000..3277dcf
Binary files /dev/null and b/Apps/XinDianTu/Images/c025ada9-4688-4839-a75d-be753d099f1a.jpg differ
diff --git a/Apps/XinDianTu/Images/c0c7cdac-1f30-42aa-a5e8-231f3d7c301a.jpg b/Apps/XinDianTu/Images/c0c7cdac-1f30-42aa-a5e8-231f3d7c301a.jpg
new file mode 100644
index 0000000..5dca63d
Binary files /dev/null and b/Apps/XinDianTu/Images/c0c7cdac-1f30-42aa-a5e8-231f3d7c301a.jpg differ
diff --git a/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967.jpg b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967.jpg
new file mode 100644
index 0000000..7ff6771
Binary files /dev/null and b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967.jpg differ
diff --git a/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967.json b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967.json
new file mode 100644
index 0000000..4997613
--- /dev/null
+++ b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967.json
@@ -0,0 +1,20 @@
+{
+ "image": "c119d3cd-876d-42af-a16b-eb8f4752c967.jpg",
+ "width": 720,
+ "height": 202,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 226,
+ 720,
+ 428
+ ],
+ "click_point": [
+ 124,
+ 266
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967_flag.jpg b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967_flag.jpg
new file mode 100644
index 0000000..c06bdfc
Binary files /dev/null and b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967_vl.jpg b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967_vl.jpg
new file mode 100644
index 0000000..87b794a
Binary files /dev/null and b/Apps/XinDianTu/Images/c119d3cd-876d-42af-a16b-eb8f4752c967_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_1.jpg b/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_1.jpg
new file mode 100644
index 0000000..fe98b29
Binary files /dev/null and b/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_2.jpg b/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_2.jpg
new file mode 100644
index 0000000..27b7879
Binary files /dev/null and b/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_3.jpg b/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_3.jpg
new file mode 100644
index 0000000..5cab847
Binary files /dev/null and b/Apps/XinDianTu/Images/c13238e9b9a646d6dcb6cd285a156ade_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_1.jpg b/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_1.jpg
new file mode 100644
index 0000000..cf008e9
Binary files /dev/null and b/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_2.jpg b/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_2.jpg
new file mode 100644
index 0000000..9dddbd1
Binary files /dev/null and b/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_3.jpg b/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_3.jpg
new file mode 100644
index 0000000..f3a623e
Binary files /dev/null and b/Apps/XinDianTu/Images/c19f79d7671dbce5032e435e87d9b806_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_1.jpg b/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_1.jpg
new file mode 100644
index 0000000..c1dd84a
Binary files /dev/null and b/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_2.jpg b/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_2.jpg
new file mode 100644
index 0000000..b626e04
Binary files /dev/null and b/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_3.jpg b/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_3.jpg
new file mode 100644
index 0000000..d1c88ad
Binary files /dev/null and b/Apps/XinDianTu/Images/c1d4a9a0c06b2b2ec49e8ad198dda698_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c1d7a94a-367d-4185-a904-0b462e69fc65.jpg b/Apps/XinDianTu/Images/c1d7a94a-367d-4185-a904-0b462e69fc65.jpg
new file mode 100644
index 0000000..fa9c314
Binary files /dev/null and b/Apps/XinDianTu/Images/c1d7a94a-367d-4185-a904-0b462e69fc65.jpg differ
diff --git a/Apps/XinDianTu/Images/c232e0c4-2cf0-430b-8c15-048950912cf6.jpg b/Apps/XinDianTu/Images/c232e0c4-2cf0-430b-8c15-048950912cf6.jpg
new file mode 100644
index 0000000..03ac593
Binary files /dev/null and b/Apps/XinDianTu/Images/c232e0c4-2cf0-430b-8c15-048950912cf6.jpg differ
diff --git a/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_1.jpg b/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_1.jpg
new file mode 100644
index 0000000..75eed2f
Binary files /dev/null and b/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_2.jpg b/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_2.jpg
new file mode 100644
index 0000000..e8613ec
Binary files /dev/null and b/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_3.jpg b/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_3.jpg
new file mode 100644
index 0000000..119701a
Binary files /dev/null and b/Apps/XinDianTu/Images/c24faf175f4a58a63a7abf4785839e4b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1.jpg b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1.jpg
new file mode 100644
index 0000000..aa742f4
Binary files /dev/null and b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1.jpg differ
diff --git a/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1.json b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1.json
new file mode 100644
index 0000000..dc8760c
--- /dev/null
+++ b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1.json
@@ -0,0 +1,46 @@
+{
+ "image": "c29b444e-2260-4567-8bea-db4fc823b8c1.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 569,
+ 700,
+ 815
+ ],
+ "click_point": [
+ 121,
+ 618
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 828,
+ 700,
+ 1076
+ ],
+ "click_point": [
+ 121,
+ 877
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1089,
+ 700,
+ 1335
+ ],
+ "click_point": [
+ 121,
+ 1138
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1_flag.jpg b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1_flag.jpg
new file mode 100644
index 0000000..4b145be
Binary files /dev/null and b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1_vl.jpg b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1_vl.jpg
new file mode 100644
index 0000000..9eec362
Binary files /dev/null and b/Apps/XinDianTu/Images/c29b444e-2260-4567-8bea-db4fc823b8c1_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c2a7ea2a-6cf0-4ed6-ae96-226558ec2af2.jpg b/Apps/XinDianTu/Images/c2a7ea2a-6cf0-4ed6-ae96-226558ec2af2.jpg
new file mode 100644
index 0000000..ee12f32
Binary files /dev/null and b/Apps/XinDianTu/Images/c2a7ea2a-6cf0-4ed6-ae96-226558ec2af2.jpg differ
diff --git a/Apps/XinDianTu/Images/c38ba5d3-1173-4c53-9a59-52461bef2def.jpg b/Apps/XinDianTu/Images/c38ba5d3-1173-4c53-9a59-52461bef2def.jpg
new file mode 100644
index 0000000..104153d
Binary files /dev/null and b/Apps/XinDianTu/Images/c38ba5d3-1173-4c53-9a59-52461bef2def.jpg differ
diff --git a/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87.jpg b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87.jpg
new file mode 100644
index 0000000..bef9609
Binary files /dev/null and b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87.jpg differ
diff --git a/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87.json b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87.json
new file mode 100644
index 0000000..3abb3eb
--- /dev/null
+++ b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87.json
@@ -0,0 +1,59 @@
+{
+ "image": "c3f424a6-1a52-4a2f-8626-ace09fbacd87.jpg",
+ "width": 720,
+ "height": 260,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 580
+ ],
+ "click_point": [
+ 121,
+ 439
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 594,
+ 700,
+ 840
+ ],
+ "click_point": [
+ 121,
+ 643
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 849,
+ 700,
+ 1100
+ ],
+ "click_point": [
+ 121,
+ 899
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1114,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1166
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87_flag.jpg b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87_flag.jpg
new file mode 100644
index 0000000..9e8bb02
Binary files /dev/null and b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87_vl.jpg b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87_vl.jpg
new file mode 100644
index 0000000..2b026b0
Binary files /dev/null and b/Apps/XinDianTu/Images/c3f424a6-1a52-4a2f-8626-ace09fbacd87_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c3f73c8e-d5d2-425a-9329-99d768d7c227.jpg b/Apps/XinDianTu/Images/c3f73c8e-d5d2-425a-9329-99d768d7c227.jpg
new file mode 100644
index 0000000..9ef961a
Binary files /dev/null and b/Apps/XinDianTu/Images/c3f73c8e-d5d2-425a-9329-99d768d7c227.jpg differ
diff --git a/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_1.jpg b/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_1.jpg
new file mode 100644
index 0000000..e651f34
Binary files /dev/null and b/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_2.jpg b/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_2.jpg
new file mode 100644
index 0000000..cbf25c3
Binary files /dev/null and b/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_3.jpg b/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_3.jpg
new file mode 100644
index 0000000..3e67f58
Binary files /dev/null and b/Apps/XinDianTu/Images/c44c27f4570b7cdab48b304b5223d54e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c45df9fd-5fc9-447a-a8e8-8cd8f8135da0.jpg b/Apps/XinDianTu/Images/c45df9fd-5fc9-447a-a8e8-8cd8f8135da0.jpg
new file mode 100644
index 0000000..6a398e7
Binary files /dev/null and b/Apps/XinDianTu/Images/c45df9fd-5fc9-447a-a8e8-8cd8f8135da0.jpg differ
diff --git a/Apps/XinDianTu/Images/c50c37ee-71f7-443a-8447-bfcd8035d18b.jpg b/Apps/XinDianTu/Images/c50c37ee-71f7-443a-8447-bfcd8035d18b.jpg
new file mode 100644
index 0000000..400c901
Binary files /dev/null and b/Apps/XinDianTu/Images/c50c37ee-71f7-443a-8447-bfcd8035d18b.jpg differ
diff --git a/Apps/XinDianTu/Images/c51e7db5-6af6-476c-a027-a76360abde46.jpg b/Apps/XinDianTu/Images/c51e7db5-6af6-476c-a027-a76360abde46.jpg
new file mode 100644
index 0000000..274e86f
Binary files /dev/null and b/Apps/XinDianTu/Images/c51e7db5-6af6-476c-a027-a76360abde46.jpg differ
diff --git a/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18.jpg b/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18.jpg
new file mode 100644
index 0000000..d4c8576
Binary files /dev/null and b/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18.jpg differ
diff --git a/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18_flag.jpg b/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18_flag.jpg
new file mode 100644
index 0000000..ec2c7d2
Binary files /dev/null and b/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18_vl.jpg b/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18_vl.jpg
new file mode 100644
index 0000000..b554ce9
Binary files /dev/null and b/Apps/XinDianTu/Images/c5313e9d-dd87-4990-8120-b79c4d685b18_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c56c4758-7f36-4f51-b85f-cd6c41bdb75b.jpg b/Apps/XinDianTu/Images/c56c4758-7f36-4f51-b85f-cd6c41bdb75b.jpg
new file mode 100644
index 0000000..12a850a
Binary files /dev/null and b/Apps/XinDianTu/Images/c56c4758-7f36-4f51-b85f-cd6c41bdb75b.jpg differ
diff --git a/Apps/XinDianTu/Images/c56f4fd7-5572-49fe-81c4-d41d5d1277ac.jpg b/Apps/XinDianTu/Images/c56f4fd7-5572-49fe-81c4-d41d5d1277ac.jpg
new file mode 100644
index 0000000..d6182f1
Binary files /dev/null and b/Apps/XinDianTu/Images/c56f4fd7-5572-49fe-81c4-d41d5d1277ac.jpg differ
diff --git a/Apps/XinDianTu/Images/c58e7f0b-68cc-4ad3-950a-42caff6bbe12.jpg b/Apps/XinDianTu/Images/c58e7f0b-68cc-4ad3-950a-42caff6bbe12.jpg
new file mode 100644
index 0000000..b0e41ea
Binary files /dev/null and b/Apps/XinDianTu/Images/c58e7f0b-68cc-4ad3-950a-42caff6bbe12.jpg differ
diff --git a/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398.jpg b/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398.jpg
new file mode 100644
index 0000000..4b77743
Binary files /dev/null and b/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398.jpg differ
diff --git a/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398_flag.jpg b/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398_flag.jpg
new file mode 100644
index 0000000..22648a8
Binary files /dev/null and b/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398_vl.jpg b/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398_vl.jpg
new file mode 100644
index 0000000..6ee94fb
Binary files /dev/null and b/Apps/XinDianTu/Images/c5b332c9-0430-4810-b52e-8c9e79367398_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c5e0716c-4920-40f6-af9f-ccb260f6ffeb.jpg b/Apps/XinDianTu/Images/c5e0716c-4920-40f6-af9f-ccb260f6ffeb.jpg
new file mode 100644
index 0000000..197c0a1
Binary files /dev/null and b/Apps/XinDianTu/Images/c5e0716c-4920-40f6-af9f-ccb260f6ffeb.jpg differ
diff --git a/Apps/XinDianTu/Images/c6899887-e61e-4e8d-8714-cdd7a8b4bb75.jpg b/Apps/XinDianTu/Images/c6899887-e61e-4e8d-8714-cdd7a8b4bb75.jpg
new file mode 100644
index 0000000..7276ce9
Binary files /dev/null and b/Apps/XinDianTu/Images/c6899887-e61e-4e8d-8714-cdd7a8b4bb75.jpg differ
diff --git a/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_1.jpg b/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_1.jpg
new file mode 100644
index 0000000..9a0c747
Binary files /dev/null and b/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_2.jpg b/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_2.jpg
new file mode 100644
index 0000000..5bd4dd9
Binary files /dev/null and b/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_3.jpg b/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_3.jpg
new file mode 100644
index 0000000..087f470
Binary files /dev/null and b/Apps/XinDianTu/Images/c6ad433d3b9489ba2d10b133e98986dc_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c6b5bf25-6072-406d-acd9-73b87aa06897.jpg b/Apps/XinDianTu/Images/c6b5bf25-6072-406d-acd9-73b87aa06897.jpg
new file mode 100644
index 0000000..553fa22
Binary files /dev/null and b/Apps/XinDianTu/Images/c6b5bf25-6072-406d-acd9-73b87aa06897.jpg differ
diff --git a/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.jpg b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.jpg
new file mode 100644
index 0000000..7ba05d6
Binary files /dev/null and b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.jpg differ
diff --git a/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.json b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.json
new file mode 100644
index 0000000..c34a5d5
--- /dev/null
+++ b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.json
@@ -0,0 +1,59 @@
+{
+ "image": "c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1.jpg",
+ "width": 720,
+ "height": 204,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 644
+ ],
+ "click_point": [
+ 121,
+ 452
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 652,
+ 700,
+ 901
+ ],
+ "click_point": [
+ 121,
+ 701
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 915,
+ 700,
+ 1164
+ ],
+ "click_point": [
+ 121,
+ 964
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1170,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1210
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1_flag.jpg b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1_flag.jpg
new file mode 100644
index 0000000..c03a517
Binary files /dev/null and b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1_vl.jpg b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1_vl.jpg
new file mode 100644
index 0000000..84befd5
Binary files /dev/null and b/Apps/XinDianTu/Images/c6bc7f65-ad9a-4f52-bab9-04e53cdd11c1_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c6d64c99-e0ef-4d65-b72d-12626ebab31a.jpg b/Apps/XinDianTu/Images/c6d64c99-e0ef-4d65-b72d-12626ebab31a.jpg
new file mode 100644
index 0000000..6abc003
Binary files /dev/null and b/Apps/XinDianTu/Images/c6d64c99-e0ef-4d65-b72d-12626ebab31a.jpg differ
diff --git a/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_1.jpg b/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_1.jpg
new file mode 100644
index 0000000..b4df081
Binary files /dev/null and b/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_2.jpg b/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_2.jpg
new file mode 100644
index 0000000..456fd66
Binary files /dev/null and b/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_3.jpg b/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_3.jpg
new file mode 100644
index 0000000..ce3ad0d
Binary files /dev/null and b/Apps/XinDianTu/Images/c6dbd0395e39f6eb931fea6bd4f08a1d_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846.jpg b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846.jpg
new file mode 100644
index 0000000..2d5dc3e
Binary files /dev/null and b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846.jpg differ
diff --git a/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846.json b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846.json
new file mode 100644
index 0000000..82fe1d7
--- /dev/null
+++ b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846.json
@@ -0,0 +1,46 @@
+{
+ "image": "c6e03c96-1809-475e-8f42-17678ed45846.jpg",
+ "width": 720,
+ "height": 278,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 536,
+ 700,
+ 782
+ ],
+ "click_point": [
+ 121,
+ 585
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 796,
+ 700,
+ 1087
+ ],
+ "click_point": [
+ 121,
+ 854
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1096,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1151
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846_flag.jpg b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846_flag.jpg
new file mode 100644
index 0000000..424b1ca
Binary files /dev/null and b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846_vl.jpg b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846_vl.jpg
new file mode 100644
index 0000000..4bd22b2
Binary files /dev/null and b/Apps/XinDianTu/Images/c6e03c96-1809-475e-8f42-17678ed45846_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_1.jpg b/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_1.jpg
new file mode 100644
index 0000000..46f73de
Binary files /dev/null and b/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_2.jpg b/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_2.jpg
new file mode 100644
index 0000000..8a368d6
Binary files /dev/null and b/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_3.jpg b/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_3.jpg
new file mode 100644
index 0000000..601ec2d
Binary files /dev/null and b/Apps/XinDianTu/Images/c70d32f42563cccb4b98e3a2f5b3acdd_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c72f58ef-f84a-49c7-8e07-ec451dcdc004.jpg b/Apps/XinDianTu/Images/c72f58ef-f84a-49c7-8e07-ec451dcdc004.jpg
new file mode 100644
index 0000000..743be8f
Binary files /dev/null and b/Apps/XinDianTu/Images/c72f58ef-f84a-49c7-8e07-ec451dcdc004.jpg differ
diff --git a/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_1.jpg b/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_1.jpg
new file mode 100644
index 0000000..4b1475f
Binary files /dev/null and b/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_2.jpg b/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_2.jpg
new file mode 100644
index 0000000..20d61d7
Binary files /dev/null and b/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_3.jpg b/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_3.jpg
new file mode 100644
index 0000000..d5b612f
Binary files /dev/null and b/Apps/XinDianTu/Images/c75aa3c48a559d6ab09e74a96c15b29f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_1.jpg b/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_1.jpg
new file mode 100644
index 0000000..650e155
Binary files /dev/null and b/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_2.jpg b/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_2.jpg
new file mode 100644
index 0000000..21ee26a
Binary files /dev/null and b/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_3.jpg b/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_3.jpg
new file mode 100644
index 0000000..aab840b
Binary files /dev/null and b/Apps/XinDianTu/Images/c78bea866b7152b78d4ecec5323af6f2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c798a2f7-e0cb-44a3-bf9d-f7e9cf9b99cc.jpg b/Apps/XinDianTu/Images/c798a2f7-e0cb-44a3-bf9d-f7e9cf9b99cc.jpg
new file mode 100644
index 0000000..c431074
Binary files /dev/null and b/Apps/XinDianTu/Images/c798a2f7-e0cb-44a3-bf9d-f7e9cf9b99cc.jpg differ
diff --git a/Apps/XinDianTu/Images/c7bb32df-f888-481c-a944-c03d0bf937b7.jpg b/Apps/XinDianTu/Images/c7bb32df-f888-481c-a944-c03d0bf937b7.jpg
new file mode 100644
index 0000000..cb4e257
Binary files /dev/null and b/Apps/XinDianTu/Images/c7bb32df-f888-481c-a944-c03d0bf937b7.jpg differ
diff --git a/Apps/XinDianTu/Images/c7d1c073-4142-4eb1-92b2-1197a9fb7c9b.jpg b/Apps/XinDianTu/Images/c7d1c073-4142-4eb1-92b2-1197a9fb7c9b.jpg
new file mode 100644
index 0000000..8456823
Binary files /dev/null and b/Apps/XinDianTu/Images/c7d1c073-4142-4eb1-92b2-1197a9fb7c9b.jpg differ
diff --git a/Apps/XinDianTu/Images/c7ff5e6a-8725-4b92-882b-10d9ab0bbf2d.jpg b/Apps/XinDianTu/Images/c7ff5e6a-8725-4b92-882b-10d9ab0bbf2d.jpg
new file mode 100644
index 0000000..b83f49d
Binary files /dev/null and b/Apps/XinDianTu/Images/c7ff5e6a-8725-4b92-882b-10d9ab0bbf2d.jpg differ
diff --git a/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9.jpg b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9.jpg
new file mode 100644
index 0000000..1280f34
Binary files /dev/null and b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9.jpg differ
diff --git a/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9.json b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9.json
new file mode 100644
index 0000000..a374c71
--- /dev/null
+++ b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9.json
@@ -0,0 +1,46 @@
+{
+ "image": "c82bb548-fb32-4c83-986a-4b6886441ca9.jpg",
+ "width": 720,
+ "height": 247,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 572,
+ 700,
+ 820
+ ],
+ "click_point": [
+ 121,
+ 621
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 833,
+ 700,
+ 1079
+ ],
+ "click_point": [
+ 121,
+ 882
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1092,
+ 700,
+ 1339
+ ],
+ "click_point": [
+ 121,
+ 1141
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9_flag.jpg b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9_flag.jpg
new file mode 100644
index 0000000..3e5e5f2
Binary files /dev/null and b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9_vl.jpg b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9_vl.jpg
new file mode 100644
index 0000000..be6f1c5
Binary files /dev/null and b/Apps/XinDianTu/Images/c82bb548-fb32-4c83-986a-4b6886441ca9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_1.jpg b/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_1.jpg
new file mode 100644
index 0000000..5222f71
Binary files /dev/null and b/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_2.jpg b/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_2.jpg
new file mode 100644
index 0000000..583b3a6
Binary files /dev/null and b/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_3.jpg b/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_3.jpg
new file mode 100644
index 0000000..94bd13f
Binary files /dev/null and b/Apps/XinDianTu/Images/c8319427ebf6fadac08f14d536a2e438_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_1.jpg b/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_1.jpg
new file mode 100644
index 0000000..abc17f8
Binary files /dev/null and b/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_2.jpg b/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_2.jpg
new file mode 100644
index 0000000..7e3d99a
Binary files /dev/null and b/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_3.jpg b/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_3.jpg
new file mode 100644
index 0000000..86e9812
Binary files /dev/null and b/Apps/XinDianTu/Images/c867aec7e218e60a8150b4aa7b40c144_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/c8d99038-aa13-4452-81c6-627c665e442c.jpg b/Apps/XinDianTu/Images/c8d99038-aa13-4452-81c6-627c665e442c.jpg
new file mode 100644
index 0000000..51a4411
Binary files /dev/null and b/Apps/XinDianTu/Images/c8d99038-aa13-4452-81c6-627c665e442c.jpg differ
diff --git a/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6.jpg b/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6.jpg
new file mode 100644
index 0000000..d20ff91
Binary files /dev/null and b/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6.jpg differ
diff --git a/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6_flag.jpg b/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6_flag.jpg
new file mode 100644
index 0000000..544261b
Binary files /dev/null and b/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6_vl.jpg b/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6_vl.jpg
new file mode 100644
index 0000000..40e1ab7
Binary files /dev/null and b/Apps/XinDianTu/Images/c8eac1a7-3624-48f5-a101-4ccb16a7f2a6_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433.jpg b/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433.jpg
new file mode 100644
index 0000000..54c8555
Binary files /dev/null and b/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433.jpg differ
diff --git a/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433_flag.jpg b/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433_flag.jpg
new file mode 100644
index 0000000..2b3687d
Binary files /dev/null and b/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433_vl.jpg b/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433_vl.jpg
new file mode 100644
index 0000000..2cb2c6d
Binary files /dev/null and b/Apps/XinDianTu/Images/c8ee9595-5ff0-40bb-9fdf-e4558cbd8433_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/c8fa5555-ea36-4aa5-aece-ab3ab9cab252.jpg b/Apps/XinDianTu/Images/c8fa5555-ea36-4aa5-aece-ab3ab9cab252.jpg
new file mode 100644
index 0000000..02363b6
Binary files /dev/null and b/Apps/XinDianTu/Images/c8fa5555-ea36-4aa5-aece-ab3ab9cab252.jpg differ
diff --git a/Apps/XinDianTu/Images/ca1805d9-0182-4bda-a7aa-713e5b5aaafd.jpg b/Apps/XinDianTu/Images/ca1805d9-0182-4bda-a7aa-713e5b5aaafd.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/ca1805d9-0182-4bda-a7aa-713e5b5aaafd.jpg differ
diff --git a/Apps/XinDianTu/Images/ca939a7b-1f9f-48ec-9a09-ba25f3998a81.jpg b/Apps/XinDianTu/Images/ca939a7b-1f9f-48ec-9a09-ba25f3998a81.jpg
new file mode 100644
index 0000000..1302785
Binary files /dev/null and b/Apps/XinDianTu/Images/ca939a7b-1f9f-48ec-9a09-ba25f3998a81.jpg differ
diff --git a/Apps/XinDianTu/Images/caad9514-f8b3-4a8f-bbc9-73e19667141b.jpg b/Apps/XinDianTu/Images/caad9514-f8b3-4a8f-bbc9-73e19667141b.jpg
new file mode 100644
index 0000000..80ed5ff
Binary files /dev/null and b/Apps/XinDianTu/Images/caad9514-f8b3-4a8f-bbc9-73e19667141b.jpg differ
diff --git a/Apps/XinDianTu/Images/cab8ca5f-4520-47a2-a8c3-a83c2a550b62.jpg b/Apps/XinDianTu/Images/cab8ca5f-4520-47a2-a8c3-a83c2a550b62.jpg
new file mode 100644
index 0000000..f20fa5d
Binary files /dev/null and b/Apps/XinDianTu/Images/cab8ca5f-4520-47a2-a8c3-a83c2a550b62.jpg differ
diff --git a/Apps/XinDianTu/Images/cb22edb0-fe92-48fc-aaf6-c1a07d9ed88f.jpg b/Apps/XinDianTu/Images/cb22edb0-fe92-48fc-aaf6-c1a07d9ed88f.jpg
new file mode 100644
index 0000000..4c83710
Binary files /dev/null and b/Apps/XinDianTu/Images/cb22edb0-fe92-48fc-aaf6-c1a07d9ed88f.jpg differ
diff --git a/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_1.jpg b/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_1.jpg
new file mode 100644
index 0000000..d4b5e4c
Binary files /dev/null and b/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_2.jpg b/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_2.jpg
new file mode 100644
index 0000000..eec10c7
Binary files /dev/null and b/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_3.jpg b/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_3.jpg
new file mode 100644
index 0000000..7df5dc9
Binary files /dev/null and b/Apps/XinDianTu/Images/cb9de77cd7942e04b6ed779ae2a3bee3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/cc2fab3e-9fcf-46d9-90cd-47bed88d093c.jpg b/Apps/XinDianTu/Images/cc2fab3e-9fcf-46d9-90cd-47bed88d093c.jpg
new file mode 100644
index 0000000..fdfc544
Binary files /dev/null and b/Apps/XinDianTu/Images/cc2fab3e-9fcf-46d9-90cd-47bed88d093c.jpg differ
diff --git a/Apps/XinDianTu/Images/cc6ebcdc-6690-4ab1-bb9c-5221be0567ae.jpg b/Apps/XinDianTu/Images/cc6ebcdc-6690-4ab1-bb9c-5221be0567ae.jpg
new file mode 100644
index 0000000..b865bff
Binary files /dev/null and b/Apps/XinDianTu/Images/cc6ebcdc-6690-4ab1-bb9c-5221be0567ae.jpg differ
diff --git a/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_1.jpg b/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_1.jpg
new file mode 100644
index 0000000..4fd43d2
Binary files /dev/null and b/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_2.jpg b/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_2.jpg
new file mode 100644
index 0000000..ac8c1e8
Binary files /dev/null and b/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_3.jpg b/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_3.jpg
new file mode 100644
index 0000000..00727b1
Binary files /dev/null and b/Apps/XinDianTu/Images/cca333cc671ffabad4900a3ed6753905_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_1.jpg b/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_1.jpg
new file mode 100644
index 0000000..f5d8c86
Binary files /dev/null and b/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_2.jpg b/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_2.jpg
new file mode 100644
index 0000000..5c77be4
Binary files /dev/null and b/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_3.jpg b/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_3.jpg
new file mode 100644
index 0000000..4a37f23
Binary files /dev/null and b/Apps/XinDianTu/Images/ccae25eec2da7c5576c6abac2b1d7880_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/cce0bb2f-d32b-424e-8ce6-6786be359b29.jpg b/Apps/XinDianTu/Images/cce0bb2f-d32b-424e-8ce6-6786be359b29.jpg
new file mode 100644
index 0000000..2a5cc9c
Binary files /dev/null and b/Apps/XinDianTu/Images/cce0bb2f-d32b-424e-8ce6-6786be359b29.jpg differ
diff --git a/Apps/XinDianTu/Images/ccfc8ad3-9484-4bdb-8d82-c88a7327eac0.jpg b/Apps/XinDianTu/Images/ccfc8ad3-9484-4bdb-8d82-c88a7327eac0.jpg
new file mode 100644
index 0000000..60bfdf4
Binary files /dev/null and b/Apps/XinDianTu/Images/ccfc8ad3-9484-4bdb-8d82-c88a7327eac0.jpg differ
diff --git a/Apps/XinDianTu/Images/ccfe74a9-b296-454f-8016-2efc2d4a0bc8.jpg b/Apps/XinDianTu/Images/ccfe74a9-b296-454f-8016-2efc2d4a0bc8.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/ccfe74a9-b296-454f-8016-2efc2d4a0bc8.jpg differ
diff --git a/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673.jpg b/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673.jpg
new file mode 100644
index 0000000..2e5fb62
Binary files /dev/null and b/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673.jpg differ
diff --git a/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673_flag.jpg b/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673_flag.jpg
new file mode 100644
index 0000000..d549fea
Binary files /dev/null and b/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673_vl.jpg b/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673_vl.jpg
new file mode 100644
index 0000000..798d6dc
Binary files /dev/null and b/Apps/XinDianTu/Images/cd28d45e-e036-43a4-be6b-8f2ce1c00673_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/cd4ff7f9-78e8-4ee4-b911-a27876b70ae3.jpg b/Apps/XinDianTu/Images/cd4ff7f9-78e8-4ee4-b911-a27876b70ae3.jpg
new file mode 100644
index 0000000..8b492c6
Binary files /dev/null and b/Apps/XinDianTu/Images/cd4ff7f9-78e8-4ee4-b911-a27876b70ae3.jpg differ
diff --git a/Apps/XinDianTu/Images/cd79e69a-1752-40d1-b5a1-ee89ea4d65b8.jpg b/Apps/XinDianTu/Images/cd79e69a-1752-40d1-b5a1-ee89ea4d65b8.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/cd79e69a-1752-40d1-b5a1-ee89ea4d65b8.jpg differ
diff --git a/Apps/XinDianTu/Images/cd7e9c78-e341-47a9-93c0-0daf8171ede7.jpg b/Apps/XinDianTu/Images/cd7e9c78-e341-47a9-93c0-0daf8171ede7.jpg
new file mode 100644
index 0000000..c59d6fc
Binary files /dev/null and b/Apps/XinDianTu/Images/cd7e9c78-e341-47a9-93c0-0daf8171ede7.jpg differ
diff --git a/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_1.jpg b/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_1.jpg
new file mode 100644
index 0000000..6c2b7c9
Binary files /dev/null and b/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_2.jpg b/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_2.jpg
new file mode 100644
index 0000000..4952d6d
Binary files /dev/null and b/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_3.jpg b/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_3.jpg
new file mode 100644
index 0000000..4f54268
Binary files /dev/null and b/Apps/XinDianTu/Images/cdf4b50c337239661f0a1390ae9a9ac1_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_1.jpg b/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_1.jpg
new file mode 100644
index 0000000..503df6d
Binary files /dev/null and b/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_2.jpg b/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_2.jpg
new file mode 100644
index 0000000..dc41446
Binary files /dev/null and b/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_3.jpg b/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_3.jpg
new file mode 100644
index 0000000..de6cbc3
Binary files /dev/null and b/Apps/XinDianTu/Images/ce0dd557feeff9bab4ecdf78e2226036_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ce320da3-6187-46bf-966d-35fd23de882c.jpg b/Apps/XinDianTu/Images/ce320da3-6187-46bf-966d-35fd23de882c.jpg
new file mode 100644
index 0000000..2bd5796
Binary files /dev/null and b/Apps/XinDianTu/Images/ce320da3-6187-46bf-966d-35fd23de882c.jpg differ
diff --git a/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_1.jpg b/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_1.jpg
new file mode 100644
index 0000000..a42a642
Binary files /dev/null and b/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_2.jpg b/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_2.jpg
new file mode 100644
index 0000000..8cbb40e
Binary files /dev/null and b/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_3.jpg b/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_3.jpg
new file mode 100644
index 0000000..c9a949f
Binary files /dev/null and b/Apps/XinDianTu/Images/cea1ea0d8a4667c5473711e73d6295f5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ceae3286-da5e-493b-bc23-7aae6e4c06b0.jpg b/Apps/XinDianTu/Images/ceae3286-da5e-493b-bc23-7aae6e4c06b0.jpg
new file mode 100644
index 0000000..59bb762
Binary files /dev/null and b/Apps/XinDianTu/Images/ceae3286-da5e-493b-bc23-7aae6e4c06b0.jpg differ
diff --git a/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_1.jpg b/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_1.jpg
new file mode 100644
index 0000000..1bce3d5
Binary files /dev/null and b/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_2.jpg b/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_2.jpg
new file mode 100644
index 0000000..2cdddcc
Binary files /dev/null and b/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_3.jpg b/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_3.jpg
new file mode 100644
index 0000000..a71a313
Binary files /dev/null and b/Apps/XinDianTu/Images/cedb14796351685af2a813d03b1a1e78_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_1.jpg b/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_1.jpg
new file mode 100644
index 0000000..0580c9d
Binary files /dev/null and b/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_2.jpg b/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_2.jpg
new file mode 100644
index 0000000..3ec1534
Binary files /dev/null and b/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_3.jpg b/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_3.jpg
new file mode 100644
index 0000000..e45a766
Binary files /dev/null and b/Apps/XinDianTu/Images/cf0a47a9cd8076ca226d3f851c74d930_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_1.jpg b/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_1.jpg
new file mode 100644
index 0000000..5ed37c7
Binary files /dev/null and b/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_2.jpg b/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_2.jpg
new file mode 100644
index 0000000..23fc261
Binary files /dev/null and b/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_3.jpg b/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_3.jpg
new file mode 100644
index 0000000..6bee86e
Binary files /dev/null and b/Apps/XinDianTu/Images/cf6c438f0db2b7b36cf51234ecd604e6_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_1.jpg b/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_1.jpg
new file mode 100644
index 0000000..4d58c50
Binary files /dev/null and b/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_2.jpg b/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_2.jpg
new file mode 100644
index 0000000..ee26a3a
Binary files /dev/null and b/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_3.jpg b/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_3.jpg
new file mode 100644
index 0000000..8931dc1
Binary files /dev/null and b/Apps/XinDianTu/Images/cf7ab4a4de321637d2c98fcd166198d3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.jpg b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.jpg
new file mode 100644
index 0000000..a207e54
Binary files /dev/null and b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.jpg differ
diff --git a/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.json b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.json
new file mode 100644
index 0000000..f24af8d
--- /dev/null
+++ b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.json
@@ -0,0 +1,59 @@
+{
+ "image": "cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 596
+ ],
+ "click_point": [
+ 121,
+ 442
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 610,
+ 700,
+ 804
+ ],
+ "click_point": [
+ 121,
+ 648
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 818,
+ 700,
+ 1064
+ ],
+ "click_point": [
+ 121,
+ 867
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1073,
+ 700,
+ 1324
+ ],
+ "click_point": [
+ 121,
+ 1123
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e_flag.jpg b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e_flag.jpg
new file mode 100644
index 0000000..dd2a7a1
Binary files /dev/null and b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e_vl.jpg b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e_vl.jpg
new file mode 100644
index 0000000..0f858f4
Binary files /dev/null and b/Apps/XinDianTu/Images/cf8a1e1e-d85d-40e3-b1b3-4b1c91482f1e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/cf9e46c8-021a-457c-9819-02be5eb40002.jpg b/Apps/XinDianTu/Images/cf9e46c8-021a-457c-9819-02be5eb40002.jpg
new file mode 100644
index 0000000..1f479b6
Binary files /dev/null and b/Apps/XinDianTu/Images/cf9e46c8-021a-457c-9819-02be5eb40002.jpg differ
diff --git a/Apps/XinDianTu/Images/cfd4cf6a-fe59-4dde-b7c6-f1ddcac3e3de.jpg b/Apps/XinDianTu/Images/cfd4cf6a-fe59-4dde-b7c6-f1ddcac3e3de.jpg
new file mode 100644
index 0000000..91422f7
Binary files /dev/null and b/Apps/XinDianTu/Images/cfd4cf6a-fe59-4dde-b7c6-f1ddcac3e3de.jpg differ
diff --git a/Apps/XinDianTu/Images/cfd750c0-90b6-41ec-8cae-88a6df5ea011.jpg b/Apps/XinDianTu/Images/cfd750c0-90b6-41ec-8cae-88a6df5ea011.jpg
new file mode 100644
index 0000000..2a03983
Binary files /dev/null and b/Apps/XinDianTu/Images/cfd750c0-90b6-41ec-8cae-88a6df5ea011.jpg differ
diff --git a/Apps/XinDianTu/Images/current_20260111_122219.jpg b/Apps/XinDianTu/Images/current_20260111_122219.jpg
new file mode 100644
index 0000000..1bb9a87
Binary files /dev/null and b/Apps/XinDianTu/Images/current_20260111_122219.jpg differ
diff --git a/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_1.jpg b/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_1.jpg
new file mode 100644
index 0000000..46cf416
Binary files /dev/null and b/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_2.jpg b/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_2.jpg
new file mode 100644
index 0000000..fba01fa
Binary files /dev/null and b/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_3.jpg b/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_3.jpg
new file mode 100644
index 0000000..d9f5fa1
Binary files /dev/null and b/Apps/XinDianTu/Images/d00f81e3b7a7dbabb27946a889ee9a3a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d04ec4d4-39bb-4777-bc69-8a55ccac2a47.jpg b/Apps/XinDianTu/Images/d04ec4d4-39bb-4777-bc69-8a55ccac2a47.jpg
new file mode 100644
index 0000000..af40254
Binary files /dev/null and b/Apps/XinDianTu/Images/d04ec4d4-39bb-4777-bc69-8a55ccac2a47.jpg differ
diff --git a/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_1.jpg b/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_1.jpg
new file mode 100644
index 0000000..0eeb475
Binary files /dev/null and b/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_2.jpg b/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_2.jpg
new file mode 100644
index 0000000..d613b79
Binary files /dev/null and b/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_3.jpg b/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_3.jpg
new file mode 100644
index 0000000..afd287b
Binary files /dev/null and b/Apps/XinDianTu/Images/d074a4d8b03ab5f61464ddd52fd61d44_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d09c53e0-42bf-40b5-a8a2-2a7f37e74554.jpg b/Apps/XinDianTu/Images/d09c53e0-42bf-40b5-a8a2-2a7f37e74554.jpg
new file mode 100644
index 0000000..0574acd
Binary files /dev/null and b/Apps/XinDianTu/Images/d09c53e0-42bf-40b5-a8a2-2a7f37e74554.jpg differ
diff --git a/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_1.jpg b/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_1.jpg
new file mode 100644
index 0000000..115344f
Binary files /dev/null and b/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_2.jpg b/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_2.jpg
new file mode 100644
index 0000000..9ebde72
Binary files /dev/null and b/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_3.jpg b/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_3.jpg
new file mode 100644
index 0000000..140d587
Binary files /dev/null and b/Apps/XinDianTu/Images/d0dc158bf9c878a973ce9d82acf953c9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d1342d92-2838-491e-a089-1d325328d840.jpg b/Apps/XinDianTu/Images/d1342d92-2838-491e-a089-1d325328d840.jpg
new file mode 100644
index 0000000..3329524
Binary files /dev/null and b/Apps/XinDianTu/Images/d1342d92-2838-491e-a089-1d325328d840.jpg differ
diff --git a/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee.jpg b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee.jpg
new file mode 100644
index 0000000..ee66caa
Binary files /dev/null and b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee.jpg differ
diff --git a/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee.json b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee.json
new file mode 100644
index 0000000..e39f93d
--- /dev/null
+++ b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee.json
@@ -0,0 +1,46 @@
+{
+ "image": "d14afead-ed4a-44bd-9bce-43e4eb53b6ee.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 489,
+ 700,
+ 740
+ ],
+ "click_point": [
+ 121,
+ 539
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 754,
+ 700,
+ 1000
+ ],
+ "click_point": [
+ 121,
+ 803
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1009,
+ 700,
+ 1260
+ ],
+ "click_point": [
+ 121,
+ 1059
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee_flag.jpg b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee_flag.jpg
new file mode 100644
index 0000000..9472299
Binary files /dev/null and b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee_vl.jpg b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee_vl.jpg
new file mode 100644
index 0000000..b1a2dda
Binary files /dev/null and b/Apps/XinDianTu/Images/d14afead-ed4a-44bd-9bce-43e4eb53b6ee_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d17df208-e646-407b-bb83-541bd52395a8.jpg b/Apps/XinDianTu/Images/d17df208-e646-407b-bb83-541bd52395a8.jpg
new file mode 100644
index 0000000..b038890
Binary files /dev/null and b/Apps/XinDianTu/Images/d17df208-e646-407b-bb83-541bd52395a8.jpg differ
diff --git a/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_1.jpg b/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_1.jpg
new file mode 100644
index 0000000..5f4a254
Binary files /dev/null and b/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_2.jpg b/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_2.jpg
new file mode 100644
index 0000000..690b831
Binary files /dev/null and b/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_3.jpg b/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_3.jpg
new file mode 100644
index 0000000..1fc2c1d
Binary files /dev/null and b/Apps/XinDianTu/Images/d1af907dc8072b3a5ce22671a0bb30d2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_1.jpg b/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_1.jpg
new file mode 100644
index 0000000..0eba99a
Binary files /dev/null and b/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_2.jpg b/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_2.jpg
new file mode 100644
index 0000000..cdc1495
Binary files /dev/null and b/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_3.jpg b/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_3.jpg
new file mode 100644
index 0000000..48449ca
Binary files /dev/null and b/Apps/XinDianTu/Images/d1c0b4ac554687f65b66755b63755dce_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014.jpg b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014.jpg
new file mode 100644
index 0000000..f277268
Binary files /dev/null and b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014.jpg differ
diff --git a/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014.json b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014.json
new file mode 100644
index 0000000..ee23e96
--- /dev/null
+++ b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014.json
@@ -0,0 +1,46 @@
+{
+ "image": "d20dd016-df5d-48fa-86bd-0d3e1ad77014.jpg",
+ "width": 720,
+ "height": 146,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 631
+ ],
+ "click_point": [
+ 121,
+ 449
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 640,
+ 700,
+ 919
+ ],
+ "click_point": [
+ 121,
+ 695
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 928,
+ 700,
+ 1214
+ ],
+ "click_point": [
+ 121,
+ 985
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014_flag.jpg b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014_flag.jpg
new file mode 100644
index 0000000..0f27039
Binary files /dev/null and b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014_vl.jpg b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014_vl.jpg
new file mode 100644
index 0000000..9389f39
Binary files /dev/null and b/Apps/XinDianTu/Images/d20dd016-df5d-48fa-86bd-0d3e1ad77014_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_1.jpg b/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_1.jpg
new file mode 100644
index 0000000..18c4fd7
Binary files /dev/null and b/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_2.jpg b/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_2.jpg
new file mode 100644
index 0000000..3940c1c
Binary files /dev/null and b/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_3.jpg b/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_3.jpg
new file mode 100644
index 0000000..a13ebfa
Binary files /dev/null and b/Apps/XinDianTu/Images/d26d72d7f03f961e845bc7c1b6d2cfd2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d2d25d7b-b48b-410c-8390-00297b011dcc.jpg b/Apps/XinDianTu/Images/d2d25d7b-b48b-410c-8390-00297b011dcc.jpg
new file mode 100644
index 0000000..1a16090
Binary files /dev/null and b/Apps/XinDianTu/Images/d2d25d7b-b48b-410c-8390-00297b011dcc.jpg differ
diff --git a/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_1.jpg b/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_1.jpg
new file mode 100644
index 0000000..8ec869e
Binary files /dev/null and b/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_2.jpg b/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_2.jpg
new file mode 100644
index 0000000..5515f40
Binary files /dev/null and b/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_3.jpg b/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_3.jpg
new file mode 100644
index 0000000..eb567fa
Binary files /dev/null and b/Apps/XinDianTu/Images/d2f62ad48ef0fabd6357f2932b7f6e11_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96.jpg b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96.jpg
new file mode 100644
index 0000000..6a81252
Binary files /dev/null and b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96.jpg differ
diff --git a/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96.json b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96.json
new file mode 100644
index 0000000..c91156d
--- /dev/null
+++ b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96.json
@@ -0,0 +1,59 @@
+{
+ "image": "d37fa962-3f29-4654-8304-dd83f59bdd96.jpg",
+ "width": 720,
+ "height": 210,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 631
+ ],
+ "click_point": [
+ 121,
+ 449
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 644,
+ 700,
+ 892
+ ],
+ "click_point": [
+ 121,
+ 693
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 905,
+ 700,
+ 1151
+ ],
+ "click_point": [
+ 121,
+ 954
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1164,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1206
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96_flag.jpg b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96_flag.jpg
new file mode 100644
index 0000000..8d2e31a
Binary files /dev/null and b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96_vl.jpg b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96_vl.jpg
new file mode 100644
index 0000000..ff2f480
Binary files /dev/null and b/Apps/XinDianTu/Images/d37fa962-3f29-4654-8304-dd83f59bdd96_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d460c673-dfa7-473f-89c6-4c73a23bed41.jpg b/Apps/XinDianTu/Images/d460c673-dfa7-473f-89c6-4c73a23bed41.jpg
new file mode 100644
index 0000000..fcf887a
Binary files /dev/null and b/Apps/XinDianTu/Images/d460c673-dfa7-473f-89c6-4c73a23bed41.jpg differ
diff --git a/Apps/XinDianTu/Images/d4a3ba45-ba8d-4f3b-b7bb-d8b020b38e3c.jpg b/Apps/XinDianTu/Images/d4a3ba45-ba8d-4f3b-b7bb-d8b020b38e3c.jpg
new file mode 100644
index 0000000..c7403bf
Binary files /dev/null and b/Apps/XinDianTu/Images/d4a3ba45-ba8d-4f3b-b7bb-d8b020b38e3c.jpg differ
diff --git a/Apps/XinDianTu/Images/d52f68a3-8953-4b35-873b-c673803c5e16.jpg b/Apps/XinDianTu/Images/d52f68a3-8953-4b35-873b-c673803c5e16.jpg
new file mode 100644
index 0000000..6a1d18c
Binary files /dev/null and b/Apps/XinDianTu/Images/d52f68a3-8953-4b35-873b-c673803c5e16.jpg differ
diff --git a/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041.jpg b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041.jpg
new file mode 100644
index 0000000..e917862
Binary files /dev/null and b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041.jpg differ
diff --git a/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041.json b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041.json
new file mode 100644
index 0000000..a13215c
--- /dev/null
+++ b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041.json
@@ -0,0 +1,46 @@
+{
+ "image": "d540d1de-2c33-4e31-bf38-a300ef486041.jpg",
+ "width": 720,
+ "height": 162,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 433,
+ 700,
+ 679
+ ],
+ "click_point": [
+ 121,
+ 482
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 692,
+ 700,
+ 940
+ ],
+ "click_point": [
+ 121,
+ 741
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 953,
+ 700,
+ 1199
+ ],
+ "click_point": [
+ 121,
+ 1002
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041_flag.jpg b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041_flag.jpg
new file mode 100644
index 0000000..cf64fc6
Binary files /dev/null and b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041_vl.jpg b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041_vl.jpg
new file mode 100644
index 0000000..ce039d9
Binary files /dev/null and b/Apps/XinDianTu/Images/d540d1de-2c33-4e31-bf38-a300ef486041_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d55e26c9-7223-4fd3-9170-72fab1b4571b.jpg b/Apps/XinDianTu/Images/d55e26c9-7223-4fd3-9170-72fab1b4571b.jpg
new file mode 100644
index 0000000..f9cb820
Binary files /dev/null and b/Apps/XinDianTu/Images/d55e26c9-7223-4fd3-9170-72fab1b4571b.jpg differ
diff --git a/Apps/XinDianTu/Images/d59f1cc8-4e57-4051-825a-a78b633ff403.jpg b/Apps/XinDianTu/Images/d59f1cc8-4e57-4051-825a-a78b633ff403.jpg
new file mode 100644
index 0000000..2f2321b
Binary files /dev/null and b/Apps/XinDianTu/Images/d59f1cc8-4e57-4051-825a-a78b633ff403.jpg differ
diff --git a/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_1.jpg b/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_1.jpg
new file mode 100644
index 0000000..6cae280
Binary files /dev/null and b/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_2.jpg b/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_2.jpg
new file mode 100644
index 0000000..5e6b535
Binary files /dev/null and b/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_3.jpg b/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_3.jpg
new file mode 100644
index 0000000..e79cc6d
Binary files /dev/null and b/Apps/XinDianTu/Images/d5fc6e3573d71189602fa537a98e6f0e_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d6072b60-b2d5-45f2-b52c-eb58c00c07fb.jpg b/Apps/XinDianTu/Images/d6072b60-b2d5-45f2-b52c-eb58c00c07fb.jpg
new file mode 100644
index 0000000..e851225
Binary files /dev/null and b/Apps/XinDianTu/Images/d6072b60-b2d5-45f2-b52c-eb58c00c07fb.jpg differ
diff --git a/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_1.jpg b/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_1.jpg
new file mode 100644
index 0000000..b515674
Binary files /dev/null and b/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_2.jpg b/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_2.jpg
new file mode 100644
index 0000000..489c28f
Binary files /dev/null and b/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_3.jpg b/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_3.jpg
new file mode 100644
index 0000000..dd745ce
Binary files /dev/null and b/Apps/XinDianTu/Images/d64d47e289b855d0f4b2f1c5b996228a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164.jpg b/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164.jpg
new file mode 100644
index 0000000..2835c81
Binary files /dev/null and b/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164.jpg differ
diff --git a/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164_flag.jpg b/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164_flag.jpg
new file mode 100644
index 0000000..86e3a39
Binary files /dev/null and b/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164_vl.jpg b/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164_vl.jpg
new file mode 100644
index 0000000..b25420c
Binary files /dev/null and b/Apps/XinDianTu/Images/d6586ef3-853e-491f-9af3-42e6021de164_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c.jpg b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c.jpg
new file mode 100644
index 0000000..c9747d5
Binary files /dev/null and b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c.jpg differ
diff --git a/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c.json b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c.json
new file mode 100644
index 0000000..8f9677f
--- /dev/null
+++ b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c.json
@@ -0,0 +1,46 @@
+{
+ "image": "d693f09e-750e-404a-a37e-925c2d42f91c.jpg",
+ "width": 720,
+ "height": 258,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 568,
+ 700,
+ 814
+ ],
+ "click_point": [
+ 121,
+ 617
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 828,
+ 700,
+ 1102
+ ],
+ "click_point": [
+ 121,
+ 882
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1116,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1167
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c_flag.jpg b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c_flag.jpg
new file mode 100644
index 0000000..67849ac
Binary files /dev/null and b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c_vl.jpg b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c_vl.jpg
new file mode 100644
index 0000000..334c3f4
Binary files /dev/null and b/Apps/XinDianTu/Images/d693f09e-750e-404a-a37e-925c2d42f91c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d706aa78-89a7-4f95-b996-30a06db8e7c7.jpg b/Apps/XinDianTu/Images/d706aa78-89a7-4f95-b996-30a06db8e7c7.jpg
new file mode 100644
index 0000000..07c7611
Binary files /dev/null and b/Apps/XinDianTu/Images/d706aa78-89a7-4f95-b996-30a06db8e7c7.jpg differ
diff --git a/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203.jpg b/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203.jpg
new file mode 100644
index 0000000..e35cc06
Binary files /dev/null and b/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203.jpg differ
diff --git a/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203_flag.jpg b/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203_flag.jpg
new file mode 100644
index 0000000..456991c
Binary files /dev/null and b/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203_vl.jpg b/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203_vl.jpg
new file mode 100644
index 0000000..5fd796d
Binary files /dev/null and b/Apps/XinDianTu/Images/d72cc30c-4d7a-459e-8743-7fc264cc1203_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/d79784fa-81f9-4f0c-8070-a949035dbb23.jpg b/Apps/XinDianTu/Images/d79784fa-81f9-4f0c-8070-a949035dbb23.jpg
new file mode 100644
index 0000000..e4b58d4
Binary files /dev/null and b/Apps/XinDianTu/Images/d79784fa-81f9-4f0c-8070-a949035dbb23.jpg differ
diff --git a/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_1.jpg b/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_1.jpg
new file mode 100644
index 0000000..48f9a4a
Binary files /dev/null and b/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_2.jpg b/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_2.jpg
new file mode 100644
index 0000000..98b940d
Binary files /dev/null and b/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_3.jpg b/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_3.jpg
new file mode 100644
index 0000000..89ac68b
Binary files /dev/null and b/Apps/XinDianTu/Images/d83e12d7c96bb27394a71ba4293c1a48_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_1.jpg b/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_1.jpg
new file mode 100644
index 0000000..41926bd
Binary files /dev/null and b/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_2.jpg b/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_2.jpg
new file mode 100644
index 0000000..9a64f98
Binary files /dev/null and b/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_3.jpg b/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_3.jpg
new file mode 100644
index 0000000..d004295
Binary files /dev/null and b/Apps/XinDianTu/Images/d86901f0e7af4673b08b47182549c032_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/d872102c-38cd-43da-8c1d-a4bfbf9d1d85.jpg b/Apps/XinDianTu/Images/d872102c-38cd-43da-8c1d-a4bfbf9d1d85.jpg
new file mode 100644
index 0000000..412d877
Binary files /dev/null and b/Apps/XinDianTu/Images/d872102c-38cd-43da-8c1d-a4bfbf9d1d85.jpg differ
diff --git a/Apps/XinDianTu/Images/d88e3c6f-3b0b-4a9a-bc17-35b6360f184e.jpg b/Apps/XinDianTu/Images/d88e3c6f-3b0b-4a9a-bc17-35b6360f184e.jpg
new file mode 100644
index 0000000..2784a3b
Binary files /dev/null and b/Apps/XinDianTu/Images/d88e3c6f-3b0b-4a9a-bc17-35b6360f184e.jpg differ
diff --git a/Apps/XinDianTu/Images/d91aa524-0e30-4c88-a527-34524433e5f3.jpg b/Apps/XinDianTu/Images/d91aa524-0e30-4c88-a527-34524433e5f3.jpg
new file mode 100644
index 0000000..c7b0451
Binary files /dev/null and b/Apps/XinDianTu/Images/d91aa524-0e30-4c88-a527-34524433e5f3.jpg differ
diff --git a/Apps/XinDianTu/Images/d9923de2-2f7a-4fc0-89bc-e023b3a3b986.jpg b/Apps/XinDianTu/Images/d9923de2-2f7a-4fc0-89bc-e023b3a3b986.jpg
new file mode 100644
index 0000000..324f16c
Binary files /dev/null and b/Apps/XinDianTu/Images/d9923de2-2f7a-4fc0-89bc-e023b3a3b986.jpg differ
diff --git a/Apps/XinDianTu/Images/d9964fec-115e-48cb-b670-a369ef7f8b6f.jpg b/Apps/XinDianTu/Images/d9964fec-115e-48cb-b670-a369ef7f8b6f.jpg
new file mode 100644
index 0000000..607b6c7
Binary files /dev/null and b/Apps/XinDianTu/Images/d9964fec-115e-48cb-b670-a369ef7f8b6f.jpg differ
diff --git a/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_1.jpg b/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_1.jpg
new file mode 100644
index 0000000..61a9f8e
Binary files /dev/null and b/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_2.jpg b/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_2.jpg
new file mode 100644
index 0000000..d04c6ce
Binary files /dev/null and b/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_3.jpg b/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_3.jpg
new file mode 100644
index 0000000..397c86d
Binary files /dev/null and b/Apps/XinDianTu/Images/db9fdde596d304303cd0005682cbcc2a_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_1.jpg b/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_1.jpg
new file mode 100644
index 0000000..5819ee7
Binary files /dev/null and b/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_2.jpg b/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_2.jpg
new file mode 100644
index 0000000..d072d11
Binary files /dev/null and b/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_3.jpg b/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_3.jpg
new file mode 100644
index 0000000..e001b0f
Binary files /dev/null and b/Apps/XinDianTu/Images/dbbe84ad0c56b7fbeae03ab2c303c8c9_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/dbbf1d17-926f-4715-8750-c2d8dc415c4f.jpg b/Apps/XinDianTu/Images/dbbf1d17-926f-4715-8750-c2d8dc415c4f.jpg
new file mode 100644
index 0000000..948d068
Binary files /dev/null and b/Apps/XinDianTu/Images/dbbf1d17-926f-4715-8750-c2d8dc415c4f.jpg differ
diff --git a/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_1.jpg b/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_1.jpg
new file mode 100644
index 0000000..79224af
Binary files /dev/null and b/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_2.jpg b/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_2.jpg
new file mode 100644
index 0000000..6b0ca2e
Binary files /dev/null and b/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_3.jpg b/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_3.jpg
new file mode 100644
index 0000000..acec321
Binary files /dev/null and b/Apps/XinDianTu/Images/dbd0535973a6742c0c21a511a923b933_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_1.jpg b/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_1.jpg
new file mode 100644
index 0000000..d0df64f
Binary files /dev/null and b/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_2.jpg b/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_2.jpg
new file mode 100644
index 0000000..3c91c0d
Binary files /dev/null and b/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_3.jpg b/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_3.jpg
new file mode 100644
index 0000000..d4e7523
Binary files /dev/null and b/Apps/XinDianTu/Images/dbda0bb04fb6bd9c9bbaca3fefcbc63c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/dc6ae7f3-2813-4823-94ee-7157021a1bb2.jpg b/Apps/XinDianTu/Images/dc6ae7f3-2813-4823-94ee-7157021a1bb2.jpg
new file mode 100644
index 0000000..9f58fe8
Binary files /dev/null and b/Apps/XinDianTu/Images/dc6ae7f3-2813-4823-94ee-7157021a1bb2.jpg differ
diff --git a/Apps/XinDianTu/Images/dc987ff4-7d72-4673-94de-9fa5db4e4819.jpg b/Apps/XinDianTu/Images/dc987ff4-7d72-4673-94de-9fa5db4e4819.jpg
new file mode 100644
index 0000000..f04e3a6
Binary files /dev/null and b/Apps/XinDianTu/Images/dc987ff4-7d72-4673-94de-9fa5db4e4819.jpg differ
diff --git a/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_1.jpg b/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_1.jpg
new file mode 100644
index 0000000..7aaac20
Binary files /dev/null and b/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_2.jpg b/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_2.jpg
new file mode 100644
index 0000000..5c1b7d6
Binary files /dev/null and b/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_3.jpg b/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_3.jpg
new file mode 100644
index 0000000..17cee82
Binary files /dev/null and b/Apps/XinDianTu/Images/dc9e0da2b16e9651b289e0c4ef64da67_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/dca4c477-4c4b-4940-ab9d-4d8054cdae89.jpg b/Apps/XinDianTu/Images/dca4c477-4c4b-4940-ab9d-4d8054cdae89.jpg
new file mode 100644
index 0000000..7cddbc8
Binary files /dev/null and b/Apps/XinDianTu/Images/dca4c477-4c4b-4940-ab9d-4d8054cdae89.jpg differ
diff --git a/Apps/XinDianTu/Images/dcce6608-4928-4cdc-819a-50551da06d17.jpg b/Apps/XinDianTu/Images/dcce6608-4928-4cdc-819a-50551da06d17.jpg
new file mode 100644
index 0000000..81f8cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/dcce6608-4928-4cdc-819a-50551da06d17.jpg differ
diff --git a/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5.jpg b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5.jpg
new file mode 100644
index 0000000..ac1509e
Binary files /dev/null and b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5.jpg differ
diff --git a/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5.json b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5.json
new file mode 100644
index 0000000..afbbebe
--- /dev/null
+++ b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5.json
@@ -0,0 +1,46 @@
+{
+ "image": "dcf04202-9c02-4a76-95ce-8aa3af1d78d5.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 545,
+ 700,
+ 791
+ ],
+ "click_point": [
+ 121,
+ 594
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 804,
+ 700,
+ 1052
+ ],
+ "click_point": [
+ 121,
+ 853
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1065,
+ 700,
+ 1311
+ ],
+ "click_point": [
+ 121,
+ 1114
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5_flag.jpg b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5_flag.jpg
new file mode 100644
index 0000000..2171c05
Binary files /dev/null and b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5_vl.jpg b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5_vl.jpg
new file mode 100644
index 0000000..fb7103c
Binary files /dev/null and b/Apps/XinDianTu/Images/dcf04202-9c02-4a76-95ce-8aa3af1d78d5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/dd10f8c9-61e2-4ee6-ab1b-19507b08bbb0.jpg b/Apps/XinDianTu/Images/dd10f8c9-61e2-4ee6-ab1b-19507b08bbb0.jpg
new file mode 100644
index 0000000..7d08472
Binary files /dev/null and b/Apps/XinDianTu/Images/dd10f8c9-61e2-4ee6-ab1b-19507b08bbb0.jpg differ
diff --git a/Apps/XinDianTu/Images/dd68ee19-fdd7-457b-8e92-b08b7e66a6dd.jpg b/Apps/XinDianTu/Images/dd68ee19-fdd7-457b-8e92-b08b7e66a6dd.jpg
new file mode 100644
index 0000000..d451155
Binary files /dev/null and b/Apps/XinDianTu/Images/dd68ee19-fdd7-457b-8e92-b08b7e66a6dd.jpg differ
diff --git a/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23.jpg b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23.jpg
new file mode 100644
index 0000000..a7a9b46
Binary files /dev/null and b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23.jpg differ
diff --git a/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23.json b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23.json
new file mode 100644
index 0000000..3419059
--- /dev/null
+++ b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23.json
@@ -0,0 +1,33 @@
+{
+ "image": "dde5a58e-fe9b-4e70-979b-f9abd455be23.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23_flag.jpg b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23_flag.jpg
new file mode 100644
index 0000000..7d31ee1
Binary files /dev/null and b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23_vl.jpg b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23_vl.jpg
new file mode 100644
index 0000000..6ce1cec
Binary files /dev/null and b/Apps/XinDianTu/Images/dde5a58e-fe9b-4e70-979b-f9abd455be23_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/de011599-eb5f-4a87-b2d8-75843c4730e6.jpg b/Apps/XinDianTu/Images/de011599-eb5f-4a87-b2d8-75843c4730e6.jpg
new file mode 100644
index 0000000..c8e32fc
Binary files /dev/null and b/Apps/XinDianTu/Images/de011599-eb5f-4a87-b2d8-75843c4730e6.jpg differ
diff --git a/Apps/XinDianTu/Images/de36782f-f305-47b0-9167-aeff92914aab.jpg b/Apps/XinDianTu/Images/de36782f-f305-47b0-9167-aeff92914aab.jpg
new file mode 100644
index 0000000..35a57e2
Binary files /dev/null and b/Apps/XinDianTu/Images/de36782f-f305-47b0-9167-aeff92914aab.jpg differ
diff --git a/Apps/XinDianTu/Images/de5593ea-5a0b-45f0-b17e-e35de4f1d7bb.jpg b/Apps/XinDianTu/Images/de5593ea-5a0b-45f0-b17e-e35de4f1d7bb.jpg
new file mode 100644
index 0000000..d59ef39
Binary files /dev/null and b/Apps/XinDianTu/Images/de5593ea-5a0b-45f0-b17e-e35de4f1d7bb.jpg differ
diff --git a/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.jpg b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.jpg
new file mode 100644
index 0000000..2c9bbbe
Binary files /dev/null and b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.jpg differ
diff --git a/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.json b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.json
new file mode 100644
index 0000000..eea12e3
--- /dev/null
+++ b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.json
@@ -0,0 +1,46 @@
+{
+ "image": "de7dadd5-95ba-4fb5-a5c5-7f2b6add334c.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 536,
+ 700,
+ 782
+ ],
+ "click_point": [
+ 121,
+ 585
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 796,
+ 700,
+ 1047
+ ],
+ "click_point": [
+ 121,
+ 846
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1056,
+ 700,
+ 1302
+ ],
+ "click_point": [
+ 121,
+ 1105
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c_flag.jpg b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c_flag.jpg
new file mode 100644
index 0000000..40b45cb
Binary files /dev/null and b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c_vl.jpg b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c_vl.jpg
new file mode 100644
index 0000000..a854249
Binary files /dev/null and b/Apps/XinDianTu/Images/de7dadd5-95ba-4fb5-a5c5-7f2b6add334c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/debug_ad_close_fail.jpg b/Apps/XinDianTu/Images/debug_ad_close_fail.jpg
new file mode 100644
index 0000000..310cad1
Binary files /dev/null and b/Apps/XinDianTu/Images/debug_ad_close_fail.jpg differ
diff --git a/Apps/XinDianTu/Images/debug_bottom_circle.jpg b/Apps/XinDianTu/Images/debug_bottom_circle.jpg
new file mode 100644
index 0000000..febc363
Binary files /dev/null and b/Apps/XinDianTu/Images/debug_bottom_circle.jpg differ
diff --git a/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286.jpg b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286.jpg
new file mode 100644
index 0000000..7da0f25
Binary files /dev/null and b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286.jpg differ
diff --git a/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286.json b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286.json
new file mode 100644
index 0000000..1c13728
--- /dev/null
+++ b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286.json
@@ -0,0 +1,46 @@
+{
+ "image": "dedce7bd-1537-4e9a-bab0-8febd6002286.jpg",
+ "width": 720,
+ "height": 310,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 544,
+ 700,
+ 790
+ ],
+ "click_point": [
+ 121,
+ 593
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 804,
+ 700,
+ 1055
+ ],
+ "click_point": [
+ 121,
+ 854
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1064,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1126
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286_flag.jpg b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286_flag.jpg
new file mode 100644
index 0000000..3fb5c8a
Binary files /dev/null and b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286_vl.jpg b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286_vl.jpg
new file mode 100644
index 0000000..221160c
Binary files /dev/null and b/Apps/XinDianTu/Images/dedce7bd-1537-4e9a-bab0-8febd6002286_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.jpg b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.jpg
new file mode 100644
index 0000000..729f373
Binary files /dev/null and b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.jpg differ
diff --git a/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.json b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.json
new file mode 100644
index 0000000..5951fb2
--- /dev/null
+++ b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.json
@@ -0,0 +1,46 @@
+{
+ "image": "dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 466,
+ 700,
+ 740
+ ],
+ "click_point": [
+ 121,
+ 520
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 754,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 803
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3_flag.jpg b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3_flag.jpg
new file mode 100644
index 0000000..92ebf1a
Binary files /dev/null and b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3_vl.jpg b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3_vl.jpg
new file mode 100644
index 0000000..aa963f7
Binary files /dev/null and b/Apps/XinDianTu/Images/dfc0a9c9-00a3-40a4-a43c-7bfc33d81ce3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e021cb95-385d-47d5-b92b-40c4f3c86d46.jpg b/Apps/XinDianTu/Images/e021cb95-385d-47d5-b92b-40c4f3c86d46.jpg
new file mode 100644
index 0000000..b9ebcdf
Binary files /dev/null and b/Apps/XinDianTu/Images/e021cb95-385d-47d5-b92b-40c4f3c86d46.jpg differ
diff --git a/Apps/XinDianTu/Images/e02a2330-be2a-4be7-9fd7-0dfaaa2edeb5.jpg b/Apps/XinDianTu/Images/e02a2330-be2a-4be7-9fd7-0dfaaa2edeb5.jpg
new file mode 100644
index 0000000..9cd4b22
Binary files /dev/null and b/Apps/XinDianTu/Images/e02a2330-be2a-4be7-9fd7-0dfaaa2edeb5.jpg differ
diff --git a/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb.jpg b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb.jpg
new file mode 100644
index 0000000..5b271fc
Binary files /dev/null and b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb.jpg differ
diff --git a/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb.json b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb.json
new file mode 100644
index 0000000..037a2ca
--- /dev/null
+++ b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb.json
@@ -0,0 +1,59 @@
+{
+ "image": "e08a2f88-b311-4afb-a939-8ba72d6bf9bb.jpg",
+ "width": 720,
+ "height": 197,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 620
+ ],
+ "click_point": [
+ 121,
+ 447
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 634,
+ 700,
+ 880
+ ],
+ "click_point": [
+ 121,
+ 683
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 894,
+ 700,
+ 1168
+ ],
+ "click_point": [
+ 121,
+ 948
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1177,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1216
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb_flag.jpg b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb_flag.jpg
new file mode 100644
index 0000000..1bf1b7a
Binary files /dev/null and b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb_vl.jpg b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb_vl.jpg
new file mode 100644
index 0000000..fb6b98c
Binary files /dev/null and b/Apps/XinDianTu/Images/e08a2f88-b311-4afb-a939-8ba72d6bf9bb_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e15523cd-51c7-44b5-bb28-60f63238e477.jpg b/Apps/XinDianTu/Images/e15523cd-51c7-44b5-bb28-60f63238e477.jpg
new file mode 100644
index 0000000..f8cb7ea
Binary files /dev/null and b/Apps/XinDianTu/Images/e15523cd-51c7-44b5-bb28-60f63238e477.jpg differ
diff --git a/Apps/XinDianTu/Images/e1a6af19-177a-48b1-b6dd-662d264a55ab.jpg b/Apps/XinDianTu/Images/e1a6af19-177a-48b1-b6dd-662d264a55ab.jpg
new file mode 100644
index 0000000..6a2ae1d
Binary files /dev/null and b/Apps/XinDianTu/Images/e1a6af19-177a-48b1-b6dd-662d264a55ab.jpg differ
diff --git a/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2.jpg b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2.jpg
new file mode 100644
index 0000000..2f135b5
Binary files /dev/null and b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2.jpg differ
diff --git a/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2.json b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2.json
new file mode 100644
index 0000000..35927fa
--- /dev/null
+++ b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2.json
@@ -0,0 +1,46 @@
+{
+ "image": "e1dddd3a-ff48-4663-b67b-a964244e07c2.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2_flag.jpg b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2_flag.jpg
new file mode 100644
index 0000000..ee0a26e
Binary files /dev/null and b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2_vl.jpg b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2_vl.jpg
new file mode 100644
index 0000000..899047b
Binary files /dev/null and b/Apps/XinDianTu/Images/e1dddd3a-ff48-4663-b67b-a964244e07c2_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e1e9e6ea-280c-4376-bd8a-5591f551381a.jpg b/Apps/XinDianTu/Images/e1e9e6ea-280c-4376-bd8a-5591f551381a.jpg
new file mode 100644
index 0000000..be83722
Binary files /dev/null and b/Apps/XinDianTu/Images/e1e9e6ea-280c-4376-bd8a-5591f551381a.jpg differ
diff --git a/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_1.jpg b/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_1.jpg
new file mode 100644
index 0000000..4581d47
Binary files /dev/null and b/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_2.jpg b/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_2.jpg
new file mode 100644
index 0000000..a682481
Binary files /dev/null and b/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_3.jpg b/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_3.jpg
new file mode 100644
index 0000000..f38d6ce
Binary files /dev/null and b/Apps/XinDianTu/Images/e1f42d63c334e3911ab50a2aff73be09_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e2a22243-df70-4a1d-aff9-abe64deff355.jpg b/Apps/XinDianTu/Images/e2a22243-df70-4a1d-aff9-abe64deff355.jpg
new file mode 100644
index 0000000..552ff36
Binary files /dev/null and b/Apps/XinDianTu/Images/e2a22243-df70-4a1d-aff9-abe64deff355.jpg differ
diff --git a/Apps/XinDianTu/Images/e2cd0210-ce28-458e-a774-efb24314fef7.jpg b/Apps/XinDianTu/Images/e2cd0210-ce28-458e-a774-efb24314fef7.jpg
new file mode 100644
index 0000000..3305939
Binary files /dev/null and b/Apps/XinDianTu/Images/e2cd0210-ce28-458e-a774-efb24314fef7.jpg differ
diff --git a/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_1.jpg b/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_1.jpg
new file mode 100644
index 0000000..adaa3e4
Binary files /dev/null and b/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_2.jpg b/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_2.jpg
new file mode 100644
index 0000000..9ac3438
Binary files /dev/null and b/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_3.jpg b/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_3.jpg
new file mode 100644
index 0000000..a91ac18
Binary files /dev/null and b/Apps/XinDianTu/Images/e2cf8fce89982d2ef6ead8977495a4fc_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b.jpg b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b.jpg
new file mode 100644
index 0000000..eb6ca9a
Binary files /dev/null and b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b.jpg differ
diff --git a/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b.json b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b.json
new file mode 100644
index 0000000..bd726c7
--- /dev/null
+++ b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b.json
@@ -0,0 +1,46 @@
+{
+ "image": "e2dab8e3-10eb-4687-9f16-740efaf2ab3b.jpg",
+ "width": 720,
+ "height": 241,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 484,
+ 700,
+ 733
+ ],
+ "click_point": [
+ 121,
+ 533
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 746,
+ 700,
+ 1021
+ ],
+ "click_point": [
+ 121,
+ 801
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1035,
+ 700,
+ 1276
+ ],
+ "click_point": [
+ 121,
+ 1083
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b_flag.jpg b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b_flag.jpg
new file mode 100644
index 0000000..1944cb7
Binary files /dev/null and b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b_vl.jpg b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b_vl.jpg
new file mode 100644
index 0000000..1b0fe54
Binary files /dev/null and b/Apps/XinDianTu/Images/e2dab8e3-10eb-4687-9f16-740efaf2ab3b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_1.jpg b/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_1.jpg
new file mode 100644
index 0000000..b56831e
Binary files /dev/null and b/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_2.jpg b/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_2.jpg
new file mode 100644
index 0000000..c15b125
Binary files /dev/null and b/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_3.jpg b/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_3.jpg
new file mode 100644
index 0000000..a7c77f9
Binary files /dev/null and b/Apps/XinDianTu/Images/e3014eb52c386854a589c29c0efa27fd_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7.jpg b/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7.jpg
new file mode 100644
index 0000000..cf80b5b
Binary files /dev/null and b/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7.jpg differ
diff --git a/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7_flag.jpg b/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7_flag.jpg
new file mode 100644
index 0000000..9167497
Binary files /dev/null and b/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7_vl.jpg b/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7_vl.jpg
new file mode 100644
index 0000000..559f5c3
Binary files /dev/null and b/Apps/XinDianTu/Images/e329d4b5-4e49-4a45-ab69-5a94668760b7_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_1.jpg b/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_1.jpg
new file mode 100644
index 0000000..ad3440e
Binary files /dev/null and b/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_2.jpg b/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_2.jpg
new file mode 100644
index 0000000..2c83f86
Binary files /dev/null and b/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_3.jpg b/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_3.jpg
new file mode 100644
index 0000000..ba9e84d
Binary files /dev/null and b/Apps/XinDianTu/Images/e32a91c39ad77177ff933c2a27369dfb_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_1.jpg b/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_1.jpg
new file mode 100644
index 0000000..16a52c3
Binary files /dev/null and b/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_2.jpg b/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_2.jpg
new file mode 100644
index 0000000..4bd4295
Binary files /dev/null and b/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_3.jpg b/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_3.jpg
new file mode 100644
index 0000000..9e025a5
Binary files /dev/null and b/Apps/XinDianTu/Images/e36173530fd3ae0e84fedde3ad8a3d0b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.jpg b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.jpg
new file mode 100644
index 0000000..ced2ba7
Binary files /dev/null and b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.jpg differ
diff --git a/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.json b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.json
new file mode 100644
index 0000000..91a23cf
--- /dev/null
+++ b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.json
@@ -0,0 +1,46 @@
+{
+ "image": "e390bc0d-f734-4cf3-9135-3f86ad8fdb7e.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 561,
+ 700,
+ 812
+ ],
+ "click_point": [
+ 121,
+ 611
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 826,
+ 700,
+ 1072
+ ],
+ "click_point": [
+ 121,
+ 875
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1081,
+ 700,
+ 1332
+ ],
+ "click_point": [
+ 121,
+ 1131
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e_flag.jpg b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e_flag.jpg
new file mode 100644
index 0000000..83705f9
Binary files /dev/null and b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e_vl.jpg b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e_vl.jpg
new file mode 100644
index 0000000..5920e85
Binary files /dev/null and b/Apps/XinDianTu/Images/e390bc0d-f734-4cf3-9135-3f86ad8fdb7e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b.jpg b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b.jpg
new file mode 100644
index 0000000..8957121
Binary files /dev/null and b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b.jpg differ
diff --git a/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b.json b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b.json
new file mode 100644
index 0000000..b363f46
--- /dev/null
+++ b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b.json
@@ -0,0 +1,59 @@
+{
+ "image": "e39e55f9-c5e8-4107-b6cd-3670d96f930b.jpg",
+ "width": 720,
+ "height": 173,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 639
+ ],
+ "click_point": [
+ 121,
+ 451
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 652,
+ 700,
+ 900
+ ],
+ "click_point": [
+ 121,
+ 701
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 912,
+ 700,
+ 1188
+ ],
+ "click_point": [
+ 121,
+ 967
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1201,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1235
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b_flag.jpg b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b_flag.jpg
new file mode 100644
index 0000000..c8f5a1a
Binary files /dev/null and b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b_vl.jpg b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b_vl.jpg
new file mode 100644
index 0000000..790725a
Binary files /dev/null and b/Apps/XinDianTu/Images/e39e55f9-c5e8-4107-b6cd-3670d96f930b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e3a5bbe7-6464-49d4-939e-d12e06cc10a8.jpg b/Apps/XinDianTu/Images/e3a5bbe7-6464-49d4-939e-d12e06cc10a8.jpg
new file mode 100644
index 0000000..b5bfd2e
Binary files /dev/null and b/Apps/XinDianTu/Images/e3a5bbe7-6464-49d4-939e-d12e06cc10a8.jpg differ
diff --git a/Apps/XinDianTu/Images/e3a72f79-3153-40f8-8ea0-1078a0d1f80f.jpg b/Apps/XinDianTu/Images/e3a72f79-3153-40f8-8ea0-1078a0d1f80f.jpg
new file mode 100644
index 0000000..0f9b1c1
Binary files /dev/null and b/Apps/XinDianTu/Images/e3a72f79-3153-40f8-8ea0-1078a0d1f80f.jpg differ
diff --git a/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_1.jpg b/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_1.jpg
new file mode 100644
index 0000000..3479e37
Binary files /dev/null and b/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_2.jpg b/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_2.jpg
new file mode 100644
index 0000000..5a0b67b
Binary files /dev/null and b/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_3.jpg b/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_3.jpg
new file mode 100644
index 0000000..f40ec9c
Binary files /dev/null and b/Apps/XinDianTu/Images/e3aaeff5e3ac71e02d2f1a7db8627be4_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e3df530d-d808-4e72-906f-40520a6565af.jpg b/Apps/XinDianTu/Images/e3df530d-d808-4e72-906f-40520a6565af.jpg
new file mode 100644
index 0000000..36656ba
Binary files /dev/null and b/Apps/XinDianTu/Images/e3df530d-d808-4e72-906f-40520a6565af.jpg differ
diff --git a/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_1.jpg b/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_1.jpg
new file mode 100644
index 0000000..a49153c
Binary files /dev/null and b/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_2.jpg b/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_2.jpg
new file mode 100644
index 0000000..3ea54df
Binary files /dev/null and b/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_3.jpg b/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_3.jpg
new file mode 100644
index 0000000..8a72f3a
Binary files /dev/null and b/Apps/XinDianTu/Images/e3e7d7f15682b2987b9f680fd9446e5c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_1.jpg b/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_1.jpg
new file mode 100644
index 0000000..4cb21a2
Binary files /dev/null and b/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_2.jpg b/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_2.jpg
new file mode 100644
index 0000000..a076266
Binary files /dev/null and b/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_3.jpg b/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_3.jpg
new file mode 100644
index 0000000..5a221ad
Binary files /dev/null and b/Apps/XinDianTu/Images/e3fae49281fd326f1fc94efd28778fb0_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894.jpg b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894.jpg
new file mode 100644
index 0000000..577b19b
Binary files /dev/null and b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894.jpg differ
diff --git a/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894.json b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894.json
new file mode 100644
index 0000000..7693a76
--- /dev/null
+++ b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894.json
@@ -0,0 +1,46 @@
+{
+ "image": "e4149114-b10a-4e68-966b-a75e207d2894.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 544,
+ 700,
+ 790
+ ],
+ "click_point": [
+ 121,
+ 593
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 804,
+ 700,
+ 1055
+ ],
+ "click_point": [
+ 121,
+ 854
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1064,
+ 700,
+ 1310
+ ],
+ "click_point": [
+ 121,
+ 1113
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894_flag.jpg b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894_flag.jpg
new file mode 100644
index 0000000..efba671
Binary files /dev/null and b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894_vl.jpg b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894_vl.jpg
new file mode 100644
index 0000000..0912c6c
Binary files /dev/null and b/Apps/XinDianTu/Images/e4149114-b10a-4e68-966b-a75e207d2894_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e44bcc93-8a32-4578-b048-938267854a20.jpg b/Apps/XinDianTu/Images/e44bcc93-8a32-4578-b048-938267854a20.jpg
new file mode 100644
index 0000000..5d95a1f
Binary files /dev/null and b/Apps/XinDianTu/Images/e44bcc93-8a32-4578-b048-938267854a20.jpg differ
diff --git a/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3.jpg b/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3.jpg
new file mode 100644
index 0000000..f5df0a6
Binary files /dev/null and b/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3.jpg differ
diff --git a/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3_flag.jpg b/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3_flag.jpg
new file mode 100644
index 0000000..9766f97
Binary files /dev/null and b/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3_vl.jpg b/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3_vl.jpg
new file mode 100644
index 0000000..63e2524
Binary files /dev/null and b/Apps/XinDianTu/Images/e44be2b2-a27f-4720-9370-52633c9658d3_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad.jpg b/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad.jpg
new file mode 100644
index 0000000..106b531
Binary files /dev/null and b/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad.jpg differ
diff --git a/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad_flag.jpg b/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad_flag.jpg
new file mode 100644
index 0000000..502a08d
Binary files /dev/null and b/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad_vl.jpg b/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad_vl.jpg
new file mode 100644
index 0000000..42c573c
Binary files /dev/null and b/Apps/XinDianTu/Images/e4882578-6b24-42fa-aa55-7a9954ad91ad_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e4f614aa-91d6-4c34-9825-5c8f2ce742b4.jpg b/Apps/XinDianTu/Images/e4f614aa-91d6-4c34-9825-5c8f2ce742b4.jpg
new file mode 100644
index 0000000..d53eef9
Binary files /dev/null and b/Apps/XinDianTu/Images/e4f614aa-91d6-4c34-9825-5c8f2ce742b4.jpg differ
diff --git a/Apps/XinDianTu/Images/e5144bba-1a55-4088-a19f-0b3e09d40b12.jpg b/Apps/XinDianTu/Images/e5144bba-1a55-4088-a19f-0b3e09d40b12.jpg
new file mode 100644
index 0000000..ff79500
Binary files /dev/null and b/Apps/XinDianTu/Images/e5144bba-1a55-4088-a19f-0b3e09d40b12.jpg differ
diff --git a/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf.jpg b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf.jpg
new file mode 100644
index 0000000..6b2f3a9
Binary files /dev/null and b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf.jpg differ
diff --git a/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf.json b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf.json
new file mode 100644
index 0000000..1492220
--- /dev/null
+++ b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf.json
@@ -0,0 +1,59 @@
+{
+ "image": "e55d4dba-2546-49fa-9ab9-e1595beb97cf.jpg",
+ "width": 720,
+ "height": 226,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 615
+ ],
+ "click_point": [
+ 121,
+ 446
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 628,
+ 700,
+ 876
+ ],
+ "click_point": [
+ 121,
+ 677
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 889,
+ 700,
+ 1135
+ ],
+ "click_point": [
+ 121,
+ 938
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1148,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1193
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf_flag.jpg b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf_flag.jpg
new file mode 100644
index 0000000..2684006
Binary files /dev/null and b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf_vl.jpg b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf_vl.jpg
new file mode 100644
index 0000000..0f4c448
Binary files /dev/null and b/Apps/XinDianTu/Images/e55d4dba-2546-49fa-9ab9-e1595beb97cf_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e574489e-449b-4776-8ec0-ff332b3c30f4.jpg b/Apps/XinDianTu/Images/e574489e-449b-4776-8ec0-ff332b3c30f4.jpg
new file mode 100644
index 0000000..d63039c
Binary files /dev/null and b/Apps/XinDianTu/Images/e574489e-449b-4776-8ec0-ff332b3c30f4.jpg differ
diff --git a/Apps/XinDianTu/Images/e5e2c965-8522-4487-8a04-929b024ea0fb.jpg b/Apps/XinDianTu/Images/e5e2c965-8522-4487-8a04-929b024ea0fb.jpg
new file mode 100644
index 0000000..da02b49
Binary files /dev/null and b/Apps/XinDianTu/Images/e5e2c965-8522-4487-8a04-929b024ea0fb.jpg differ
diff --git a/Apps/XinDianTu/Images/e644db93-40cb-4ede-a3da-33b917c78bd9.jpg b/Apps/XinDianTu/Images/e644db93-40cb-4ede-a3da-33b917c78bd9.jpg
new file mode 100644
index 0000000..52ce207
Binary files /dev/null and b/Apps/XinDianTu/Images/e644db93-40cb-4ede-a3da-33b917c78bd9.jpg differ
diff --git a/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_1.jpg b/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_1.jpg
new file mode 100644
index 0000000..a96ac36
Binary files /dev/null and b/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_2.jpg b/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_2.jpg
new file mode 100644
index 0000000..fa2e035
Binary files /dev/null and b/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_3.jpg b/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_3.jpg
new file mode 100644
index 0000000..23f76e7
Binary files /dev/null and b/Apps/XinDianTu/Images/e65cbad15906eb9255aca0c7dbebb3e1_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c.jpg b/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c.jpg
new file mode 100644
index 0000000..6529775
Binary files /dev/null and b/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c.jpg differ
diff --git a/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c_flag.jpg b/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c_flag.jpg
new file mode 100644
index 0000000..9c45768
Binary files /dev/null and b/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c_vl.jpg b/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c_vl.jpg
new file mode 100644
index 0000000..b7d2ab0
Binary files /dev/null and b/Apps/XinDianTu/Images/e66959b1-5545-419a-a802-23c9fd107a7c_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_1.jpg b/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_1.jpg
new file mode 100644
index 0000000..0327b67
Binary files /dev/null and b/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_2.jpg b/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_2.jpg
new file mode 100644
index 0000000..e1920a6
Binary files /dev/null and b/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_3.jpg b/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_3.jpg
new file mode 100644
index 0000000..3006f91
Binary files /dev/null and b/Apps/XinDianTu/Images/e6eda919f32bc01fec752303bbcfba6b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8.jpg b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8.jpg
new file mode 100644
index 0000000..d5acea7
Binary files /dev/null and b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8.jpg differ
diff --git a/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8.json b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8.json
new file mode 100644
index 0000000..2896aa0
--- /dev/null
+++ b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8.json
@@ -0,0 +1,59 @@
+{
+ "image": "e74f2d7d-84d0-42ef-8799-e8476a979cb8.jpg",
+ "width": 720,
+ "height": 212,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 600
+ ],
+ "click_point": [
+ 121,
+ 443
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 609,
+ 700,
+ 860
+ ],
+ "click_point": [
+ 121,
+ 659
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 874,
+ 700,
+ 1148
+ ],
+ "click_point": [
+ 121,
+ 928
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1162,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1204
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8_flag.jpg b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8_flag.jpg
new file mode 100644
index 0000000..8cc0674
Binary files /dev/null and b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8_vl.jpg b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8_vl.jpg
new file mode 100644
index 0000000..7c001fb
Binary files /dev/null and b/Apps/XinDianTu/Images/e74f2d7d-84d0-42ef-8799-e8476a979cb8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e7b16ac5-3a1c-4999-bf96-5dc9a1b4d06a.jpg b/Apps/XinDianTu/Images/e7b16ac5-3a1c-4999-bf96-5dc9a1b4d06a.jpg
new file mode 100644
index 0000000..9b499d6
Binary files /dev/null and b/Apps/XinDianTu/Images/e7b16ac5-3a1c-4999-bf96-5dc9a1b4d06a.jpg differ
diff --git a/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_1.jpg b/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_1.jpg
new file mode 100644
index 0000000..41ad517
Binary files /dev/null and b/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_2.jpg b/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_2.jpg
new file mode 100644
index 0000000..fdc3f10
Binary files /dev/null and b/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_3.jpg b/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_3.jpg
new file mode 100644
index 0000000..53e757c
Binary files /dev/null and b/Apps/XinDianTu/Images/e7e8c47c85fb70c67c4092db55701144_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf.jpg b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf.jpg
new file mode 100644
index 0000000..25ddecc
Binary files /dev/null and b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf.jpg differ
diff --git a/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf.json b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf.json
new file mode 100644
index 0000000..7a96bed
--- /dev/null
+++ b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf.json
@@ -0,0 +1,46 @@
+{
+ "image": "e7f96a35-98e2-4e98-8854-50a11f3d7daf.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 450,
+ 700,
+ 732
+ ],
+ "click_point": [
+ 121,
+ 506
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 738,
+ 700,
+ 1020
+ ],
+ "click_point": [
+ 121,
+ 794
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1028,
+ 700,
+ 1277
+ ],
+ "click_point": [
+ 121,
+ 1077
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf_flag.jpg b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf_flag.jpg
new file mode 100644
index 0000000..03e3992
Binary files /dev/null and b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf_vl.jpg b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf_vl.jpg
new file mode 100644
index 0000000..ce13827
Binary files /dev/null and b/Apps/XinDianTu/Images/e7f96a35-98e2-4e98-8854-50a11f3d7daf_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8.jpg b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8.jpg
new file mode 100644
index 0000000..7f14986
Binary files /dev/null and b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8.jpg differ
diff --git a/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8.json b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8.json
new file mode 100644
index 0000000..ca902c4
--- /dev/null
+++ b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8.json
@@ -0,0 +1,46 @@
+{
+ "image": "e81a3242-24ff-46af-bf05-2a7e227847a8.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 420,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 482
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8_flag.jpg b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8_flag.jpg
new file mode 100644
index 0000000..38102b1
Binary files /dev/null and b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8_vl.jpg b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8_vl.jpg
new file mode 100644
index 0000000..0583450
Binary files /dev/null and b/Apps/XinDianTu/Images/e81a3242-24ff-46af-bf05-2a7e227847a8_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e837384f-2d88-40da-938c-2cde478153b5.jpg b/Apps/XinDianTu/Images/e837384f-2d88-40da-938c-2cde478153b5.jpg
new file mode 100644
index 0000000..3de2338
Binary files /dev/null and b/Apps/XinDianTu/Images/e837384f-2d88-40da-938c-2cde478153b5.jpg differ
diff --git a/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1.jpg b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1.jpg
new file mode 100644
index 0000000..a2fe9dc
Binary files /dev/null and b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1.jpg differ
diff --git a/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1.json b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1.json
new file mode 100644
index 0000000..e9f71ea
--- /dev/null
+++ b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1.json
@@ -0,0 +1,46 @@
+{
+ "image": "e84ed53f-c471-48e7-8ce1-bd2d53683ab1.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 488,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 537
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1_flag.jpg b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1_flag.jpg
new file mode 100644
index 0000000..ef00d1e
Binary files /dev/null and b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1_vl.jpg b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1_vl.jpg
new file mode 100644
index 0000000..aa2b24e
Binary files /dev/null and b/Apps/XinDianTu/Images/e84ed53f-c471-48e7-8ce1-bd2d53683ab1_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_1.jpg b/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_1.jpg
new file mode 100644
index 0000000..d2e7f06
Binary files /dev/null and b/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_2.jpg b/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_2.jpg
new file mode 100644
index 0000000..ef58bf6
Binary files /dev/null and b/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_3.jpg b/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_3.jpg
new file mode 100644
index 0000000..01a5916
Binary files /dev/null and b/Apps/XinDianTu/Images/e86b4041d68970c1145f7257868f027f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e8ca8971-fb02-41e7-b539-06ee15ce8b6a.jpg b/Apps/XinDianTu/Images/e8ca8971-fb02-41e7-b539-06ee15ce8b6a.jpg
new file mode 100644
index 0000000..e9b83bd
Binary files /dev/null and b/Apps/XinDianTu/Images/e8ca8971-fb02-41e7-b539-06ee15ce8b6a.jpg differ
diff --git a/Apps/XinDianTu/Images/e8eb0587-0f7f-47c4-9d27-dd448a773504.jpg b/Apps/XinDianTu/Images/e8eb0587-0f7f-47c4-9d27-dd448a773504.jpg
new file mode 100644
index 0000000..bb470e8
Binary files /dev/null and b/Apps/XinDianTu/Images/e8eb0587-0f7f-47c4-9d27-dd448a773504.jpg differ
diff --git a/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_1.jpg b/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_1.jpg
new file mode 100644
index 0000000..74480ba
Binary files /dev/null and b/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_2.jpg b/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_2.jpg
new file mode 100644
index 0000000..9ca025f
Binary files /dev/null and b/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_3.jpg b/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_3.jpg
new file mode 100644
index 0000000..de6e100
Binary files /dev/null and b/Apps/XinDianTu/Images/e8f22f3915e230b3366b362dc3c7477f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696.jpg b/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696.jpg
new file mode 100644
index 0000000..aa21743
Binary files /dev/null and b/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696.jpg differ
diff --git a/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696_flag.jpg b/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696_flag.jpg
new file mode 100644
index 0000000..0e786b4
Binary files /dev/null and b/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696_vl.jpg b/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696_vl.jpg
new file mode 100644
index 0000000..025d661
Binary files /dev/null and b/Apps/XinDianTu/Images/e92b22a7-36d9-45a6-93fa-3ed2bae39696_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_1.jpg b/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_1.jpg
new file mode 100644
index 0000000..0387183
Binary files /dev/null and b/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_2.jpg b/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_2.jpg
new file mode 100644
index 0000000..bf8c0f8
Binary files /dev/null and b/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_3.jpg b/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_3.jpg
new file mode 100644
index 0000000..871e1c8
Binary files /dev/null and b/Apps/XinDianTu/Images/e956d339ff245f6a5a9277e666510cf3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/e9939577-0312-4854-80b6-427029d50552.jpg b/Apps/XinDianTu/Images/e9939577-0312-4854-80b6-427029d50552.jpg
new file mode 100644
index 0000000..be4fe13
Binary files /dev/null and b/Apps/XinDianTu/Images/e9939577-0312-4854-80b6-427029d50552.jpg differ
diff --git a/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e.jpg b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e.jpg
new file mode 100644
index 0000000..ece8b4f
Binary files /dev/null and b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e.jpg differ
diff --git a/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e.json b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e.json
new file mode 100644
index 0000000..3b80208
--- /dev/null
+++ b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e.json
@@ -0,0 +1,46 @@
+{
+ "image": "ea0be5ef-27e8-41ff-a011-be66796a2c6e.jpg",
+ "width": 720,
+ "height": 277,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 577,
+ 700,
+ 823
+ ],
+ "click_point": [
+ 121,
+ 626
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 836,
+ 700,
+ 1084
+ ],
+ "click_point": [
+ 121,
+ 885
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1097,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1152
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e_flag.jpg b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e_flag.jpg
new file mode 100644
index 0000000..9f341b7
Binary files /dev/null and b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e_vl.jpg b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e_vl.jpg
new file mode 100644
index 0000000..b1bf10c
Binary files /dev/null and b/Apps/XinDianTu/Images/ea0be5ef-27e8-41ff-a011-be66796a2c6e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad.jpg b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad.jpg
new file mode 100644
index 0000000..64c9b8b
Binary files /dev/null and b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad.jpg differ
diff --git a/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad.json b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad.json
new file mode 100644
index 0000000..b1d0f02
--- /dev/null
+++ b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad.json
@@ -0,0 +1,46 @@
+{
+ "image": "ea3792ec-963c-4959-837e-7abe0e0c96ad.jpg",
+ "width": 720,
+ "height": 125,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 468,
+ 700,
+ 716
+ ],
+ "click_point": [
+ 121,
+ 517
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 729,
+ 700,
+ 975
+ ],
+ "click_point": [
+ 121,
+ 778
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 988,
+ 700,
+ 1236
+ ],
+ "click_point": [
+ 121,
+ 1037
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad_flag.jpg b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad_flag.jpg
new file mode 100644
index 0000000..74be10e
Binary files /dev/null and b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad_vl.jpg b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad_vl.jpg
new file mode 100644
index 0000000..989238f
Binary files /dev/null and b/Apps/XinDianTu/Images/ea3792ec-963c-4959-837e-7abe0e0c96ad_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_1.jpg b/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_1.jpg
new file mode 100644
index 0000000..3c0eb8d
Binary files /dev/null and b/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_2.jpg b/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_2.jpg
new file mode 100644
index 0000000..ce1de1f
Binary files /dev/null and b/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_3.jpg b/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_3.jpg
new file mode 100644
index 0000000..72b6a4d
Binary files /dev/null and b/Apps/XinDianTu/Images/ea5c62d114104de397759261e2909b97_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34.jpg b/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34.jpg
new file mode 100644
index 0000000..c69ca95
Binary files /dev/null and b/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34.jpg differ
diff --git a/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34_flag.jpg b/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34_flag.jpg
new file mode 100644
index 0000000..e0e1d7a
Binary files /dev/null and b/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34_vl.jpg b/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34_vl.jpg
new file mode 100644
index 0000000..f259a46
Binary files /dev/null and b/Apps/XinDianTu/Images/eac68fff-c1c2-44cf-91f1-3a6898445d34_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/eaf77cff-e88a-4d83-91d0-07ae20432daa.jpg b/Apps/XinDianTu/Images/eaf77cff-e88a-4d83-91d0-07ae20432daa.jpg
new file mode 100644
index 0000000..a911940
Binary files /dev/null and b/Apps/XinDianTu/Images/eaf77cff-e88a-4d83-91d0-07ae20432daa.jpg differ
diff --git a/Apps/XinDianTu/Images/eb4ab9cf-f810-44be-b63f-896127d90aeb.jpg b/Apps/XinDianTu/Images/eb4ab9cf-f810-44be-b63f-896127d90aeb.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/eb4ab9cf-f810-44be-b63f-896127d90aeb.jpg differ
diff --git a/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20.jpg b/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20.jpg
new file mode 100644
index 0000000..f58c72d
Binary files /dev/null and b/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20.jpg differ
diff --git a/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20_flag.jpg b/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20_flag.jpg
new file mode 100644
index 0000000..bfbdd9f
Binary files /dev/null and b/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20_vl.jpg b/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20_vl.jpg
new file mode 100644
index 0000000..cbc0d00
Binary files /dev/null and b/Apps/XinDianTu/Images/eb527c57-0678-4b38-8971-abc56346bf20_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/eb9fa0aa-7834-4e17-bbf0-b15b108b6a42.jpg b/Apps/XinDianTu/Images/eb9fa0aa-7834-4e17-bbf0-b15b108b6a42.jpg
new file mode 100644
index 0000000..1d18739
Binary files /dev/null and b/Apps/XinDianTu/Images/eb9fa0aa-7834-4e17-bbf0-b15b108b6a42.jpg differ
diff --git a/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755.jpg b/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755.jpg
new file mode 100644
index 0000000..03cf996
Binary files /dev/null and b/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755.jpg differ
diff --git a/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755_flag.jpg b/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755_flag.jpg
new file mode 100644
index 0000000..28b5f17
Binary files /dev/null and b/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755_vl.jpg b/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755_vl.jpg
new file mode 100644
index 0000000..73bb2f6
Binary files /dev/null and b/Apps/XinDianTu/Images/ec2ec565-ddf7-478f-956f-bced7769c755_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ec2ef908-4a19-4670-844f-5dfa8697ff90.jpg b/Apps/XinDianTu/Images/ec2ef908-4a19-4670-844f-5dfa8697ff90.jpg
new file mode 100644
index 0000000..067353d
Binary files /dev/null and b/Apps/XinDianTu/Images/ec2ef908-4a19-4670-844f-5dfa8697ff90.jpg differ
diff --git a/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae.jpg b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae.jpg
new file mode 100644
index 0000000..16e01b0
Binary files /dev/null and b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae.jpg differ
diff --git a/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae.json b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae.json
new file mode 100644
index 0000000..4f56da5
--- /dev/null
+++ b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae.json
@@ -0,0 +1,59 @@
+{
+ "image": "ec43cedd-19bf-4ff0-b364-fbc9d68652ae.jpg",
+ "width": 720,
+ "height": 234,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 606
+ ],
+ "click_point": [
+ 121,
+ 444
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 620,
+ 700,
+ 871
+ ],
+ "click_point": [
+ 121,
+ 670
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 880,
+ 700,
+ 1126
+ ],
+ "click_point": [
+ 121,
+ 929
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1140,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1186
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae_flag.jpg b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae_flag.jpg
new file mode 100644
index 0000000..77875ac
Binary files /dev/null and b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae_vl.jpg b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae_vl.jpg
new file mode 100644
index 0000000..97e4d19
Binary files /dev/null and b/Apps/XinDianTu/Images/ec43cedd-19bf-4ff0-b364-fbc9d68652ae_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_1.jpg b/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_1.jpg
new file mode 100644
index 0000000..33ab618
Binary files /dev/null and b/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_2.jpg b/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_2.jpg
new file mode 100644
index 0000000..c8b69d9
Binary files /dev/null and b/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_3.jpg b/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_3.jpg
new file mode 100644
index 0000000..ad164ad
Binary files /dev/null and b/Apps/XinDianTu/Images/ec49ca6bf638b8bfb64232175e5681a8_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ec53a59f-5817-44d5-9705-9bc8cf0fd161.jpg b/Apps/XinDianTu/Images/ec53a59f-5817-44d5-9705-9bc8cf0fd161.jpg
new file mode 100644
index 0000000..e2ba2e9
Binary files /dev/null and b/Apps/XinDianTu/Images/ec53a59f-5817-44d5-9705-9bc8cf0fd161.jpg differ
diff --git a/Apps/XinDianTu/Images/ecc4a4d3-2bf6-4184-b980-050bb61df27c.jpg b/Apps/XinDianTu/Images/ecc4a4d3-2bf6-4184-b980-050bb61df27c.jpg
new file mode 100644
index 0000000..ec73204
Binary files /dev/null and b/Apps/XinDianTu/Images/ecc4a4d3-2bf6-4184-b980-050bb61df27c.jpg differ
diff --git a/Apps/XinDianTu/Images/ed012394-715f-463e-841c-813cf439c42b.jpg b/Apps/XinDianTu/Images/ed012394-715f-463e-841c-813cf439c42b.jpg
new file mode 100644
index 0000000..74e4902
Binary files /dev/null and b/Apps/XinDianTu/Images/ed012394-715f-463e-841c-813cf439c42b.jpg differ
diff --git a/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.jpg b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.jpg
new file mode 100644
index 0000000..25eb312
Binary files /dev/null and b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.jpg differ
diff --git a/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.json b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.json
new file mode 100644
index 0000000..3f44c81
--- /dev/null
+++ b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.json
@@ -0,0 +1,59 @@
+{
+ "image": "ed0175ac-7bd1-43ea-acaf-3ccef9579c2f.jpg",
+ "width": 720,
+ "height": 210,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 636
+ ],
+ "click_point": [
+ 121,
+ 450
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 644,
+ 700,
+ 893
+ ],
+ "click_point": [
+ 121,
+ 693
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 907,
+ 700,
+ 1156
+ ],
+ "click_point": [
+ 121,
+ 956
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1164,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1206
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f_flag.jpg b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f_flag.jpg
new file mode 100644
index 0000000..33dfd35
Binary files /dev/null and b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f_vl.jpg b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f_vl.jpg
new file mode 100644
index 0000000..38a2206
Binary files /dev/null and b/Apps/XinDianTu/Images/ed0175ac-7bd1-43ea-acaf-3ccef9579c2f_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ed194aa9-f0a8-453e-bdf7-d5400b6800c9.jpg b/Apps/XinDianTu/Images/ed194aa9-f0a8-453e-bdf7-d5400b6800c9.jpg
new file mode 100644
index 0000000..af3771e
Binary files /dev/null and b/Apps/XinDianTu/Images/ed194aa9-f0a8-453e-bdf7-d5400b6800c9.jpg differ
diff --git a/Apps/XinDianTu/Images/ed37927f-726d-484e-8bc3-a105702aca1b.jpg b/Apps/XinDianTu/Images/ed37927f-726d-484e-8bc3-a105702aca1b.jpg
new file mode 100644
index 0000000..2b3994f
Binary files /dev/null and b/Apps/XinDianTu/Images/ed37927f-726d-484e-8bc3-a105702aca1b.jpg differ
diff --git a/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507.jpg b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507.jpg
new file mode 100644
index 0000000..2d9238b
Binary files /dev/null and b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507.jpg differ
diff --git a/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507.json b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507.json
new file mode 100644
index 0000000..c886dab
--- /dev/null
+++ b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507.json
@@ -0,0 +1,46 @@
+{
+ "image": "ed414807-de0a-49b6-8126-de6afe923507.jpg",
+ "width": 720,
+ "height": 107,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 418,
+ 700,
+ 733
+ ],
+ "click_point": [
+ 121,
+ 481
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 747,
+ 700,
+ 996
+ ],
+ "click_point": [
+ 121,
+ 796
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1004,
+ 700,
+ 1253
+ ],
+ "click_point": [
+ 121,
+ 1053
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507_flag.jpg b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507_flag.jpg
new file mode 100644
index 0000000..d011755
Binary files /dev/null and b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507_vl.jpg b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507_vl.jpg
new file mode 100644
index 0000000..00e3f83
Binary files /dev/null and b/Apps/XinDianTu/Images/ed414807-de0a-49b6-8126-de6afe923507_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ed416060-2fd5-4430-bccf-7839f54b8ae8.jpg b/Apps/XinDianTu/Images/ed416060-2fd5-4430-bccf-7839f54b8ae8.jpg
new file mode 100644
index 0000000..3f632a4
Binary files /dev/null and b/Apps/XinDianTu/Images/ed416060-2fd5-4430-bccf-7839f54b8ae8.jpg differ
diff --git a/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_1.jpg b/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_1.jpg
new file mode 100644
index 0000000..6d28958
Binary files /dev/null and b/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_2.jpg b/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_2.jpg
new file mode 100644
index 0000000..1761e68
Binary files /dev/null and b/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_3.jpg b/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_3.jpg
new file mode 100644
index 0000000..a2db7a4
Binary files /dev/null and b/Apps/XinDianTu/Images/ee6d4c3c17ec6d667a68058c02a4cc90_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_1.jpg b/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_1.jpg
new file mode 100644
index 0000000..b32b9dd
Binary files /dev/null and b/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_2.jpg b/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_2.jpg
new file mode 100644
index 0000000..e2fcd14
Binary files /dev/null and b/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_3.jpg b/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_3.jpg
new file mode 100644
index 0000000..68d5332
Binary files /dev/null and b/Apps/XinDianTu/Images/eecdbe36b630faa39fc2b96eed7312fb_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/ef088097-19da-4bd3-982e-81beb89b7d61.jpg b/Apps/XinDianTu/Images/ef088097-19da-4bd3-982e-81beb89b7d61.jpg
new file mode 100644
index 0000000..c6abbb0
Binary files /dev/null and b/Apps/XinDianTu/Images/ef088097-19da-4bd3-982e-81beb89b7d61.jpg differ
diff --git a/Apps/XinDianTu/Images/efcbc4c4-5a2d-4861-9ef7-39562cbfbb98.jpg b/Apps/XinDianTu/Images/efcbc4c4-5a2d-4861-9ef7-39562cbfbb98.jpg
new file mode 100644
index 0000000..2c0477f
Binary files /dev/null and b/Apps/XinDianTu/Images/efcbc4c4-5a2d-4861-9ef7-39562cbfbb98.jpg differ
diff --git a/Apps/XinDianTu/Images/efe67b36-214d-4b89-992b-d17045c4e655.jpg b/Apps/XinDianTu/Images/efe67b36-214d-4b89-992b-d17045c4e655.jpg
new file mode 100644
index 0000000..7cf9962
Binary files /dev/null and b/Apps/XinDianTu/Images/efe67b36-214d-4b89-992b-d17045c4e655.jpg differ
diff --git a/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece.jpg b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece.jpg
new file mode 100644
index 0000000..527dce8
Binary files /dev/null and b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece.jpg differ
diff --git a/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece.json b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece.json
new file mode 100644
index 0000000..d197a71
--- /dev/null
+++ b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece.json
@@ -0,0 +1,46 @@
+{
+ "image": "f019de1b-682f-436c-9f83-881a8218aece.jpg",
+ "width": 720,
+ "height": 170,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 425,
+ 700,
+ 671
+ ],
+ "click_point": [
+ 121,
+ 474
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 684,
+ 700,
+ 932
+ ],
+ "click_point": [
+ 121,
+ 733
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 945,
+ 700,
+ 1191
+ ],
+ "click_point": [
+ 121,
+ 994
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece_flag.jpg b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece_flag.jpg
new file mode 100644
index 0000000..ca11758
Binary files /dev/null and b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece_vl.jpg b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece_vl.jpg
new file mode 100644
index 0000000..77a9944
Binary files /dev/null and b/Apps/XinDianTu/Images/f019de1b-682f-436c-9f83-881a8218aece_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_1.jpg b/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_1.jpg
new file mode 100644
index 0000000..97229e5
Binary files /dev/null and b/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_2.jpg b/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_2.jpg
new file mode 100644
index 0000000..478bb82
Binary files /dev/null and b/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_3.jpg b/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_3.jpg
new file mode 100644
index 0000000..c91b15e
Binary files /dev/null and b/Apps/XinDianTu/Images/f0d7abce940ff1be278c9236acab19c3_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f0fc5c50-6f7b-4d11-a5d0-6c85bb8e7f1c.jpg b/Apps/XinDianTu/Images/f0fc5c50-6f7b-4d11-a5d0-6c85bb8e7f1c.jpg
new file mode 100644
index 0000000..1e20774
Binary files /dev/null and b/Apps/XinDianTu/Images/f0fc5c50-6f7b-4d11-a5d0-6c85bb8e7f1c.jpg differ
diff --git a/Apps/XinDianTu/Images/f12a6756-6ad1-47bf-bf59-39183f8dac60.jpg b/Apps/XinDianTu/Images/f12a6756-6ad1-47bf-bf59-39183f8dac60.jpg
new file mode 100644
index 0000000..832041e
Binary files /dev/null and b/Apps/XinDianTu/Images/f12a6756-6ad1-47bf-bf59-39183f8dac60.jpg differ
diff --git a/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_1.jpg b/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_1.jpg
new file mode 100644
index 0000000..aafecf4
Binary files /dev/null and b/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_2.jpg b/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_2.jpg
new file mode 100644
index 0000000..0906371
Binary files /dev/null and b/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_3.jpg b/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_3.jpg
new file mode 100644
index 0000000..9657ea0
Binary files /dev/null and b/Apps/XinDianTu/Images/f144ea59c42513e9d0bd958333e83f93_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_1.jpg b/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_1.jpg
new file mode 100644
index 0000000..92055eb
Binary files /dev/null and b/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_2.jpg b/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_2.jpg
new file mode 100644
index 0000000..51c14ab
Binary files /dev/null and b/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_3.jpg b/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_3.jpg
new file mode 100644
index 0000000..65bca81
Binary files /dev/null and b/Apps/XinDianTu/Images/f15bcd6716048e4a3f54fcf81928d2ef_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e.jpg b/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e.jpg
new file mode 100644
index 0000000..b957832
Binary files /dev/null and b/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e.jpg differ
diff --git a/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e_flag.jpg b/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e_flag.jpg
new file mode 100644
index 0000000..35b76dc
Binary files /dev/null and b/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e_vl.jpg b/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e_vl.jpg
new file mode 100644
index 0000000..ad9506b
Binary files /dev/null and b/Apps/XinDianTu/Images/f1a19a85-430d-4580-ad7d-93acbafcd82e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f1c48a2c-c94f-49f4-b4bd-a3e3f5ef4e92.jpg b/Apps/XinDianTu/Images/f1c48a2c-c94f-49f4-b4bd-a3e3f5ef4e92.jpg
new file mode 100644
index 0000000..f1d80c3
Binary files /dev/null and b/Apps/XinDianTu/Images/f1c48a2c-c94f-49f4-b4bd-a3e3f5ef4e92.jpg differ
diff --git a/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0.jpg b/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0.jpg
new file mode 100644
index 0000000..2859063
Binary files /dev/null and b/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0.jpg differ
diff --git a/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0_flag.jpg b/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0_flag.jpg
new file mode 100644
index 0000000..5ea51ce
Binary files /dev/null and b/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0_vl.jpg b/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0_vl.jpg
new file mode 100644
index 0000000..340994e
Binary files /dev/null and b/Apps/XinDianTu/Images/f239160b-8b04-4d3f-a798-db09a5bb62b0_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_1.jpg b/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_1.jpg
new file mode 100644
index 0000000..6c50261
Binary files /dev/null and b/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_2.jpg b/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_2.jpg
new file mode 100644
index 0000000..70ef028
Binary files /dev/null and b/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_3.jpg b/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_3.jpg
new file mode 100644
index 0000000..29b0873
Binary files /dev/null and b/Apps/XinDianTu/Images/f29489105879b81273d8b63f726cb968_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f294effa-7011-49c8-ad5d-8d38a401005a.jpg b/Apps/XinDianTu/Images/f294effa-7011-49c8-ad5d-8d38a401005a.jpg
new file mode 100644
index 0000000..3d4ed06
Binary files /dev/null and b/Apps/XinDianTu/Images/f294effa-7011-49c8-ad5d-8d38a401005a.jpg differ
diff --git a/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e.jpg b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e.jpg
new file mode 100644
index 0000000..f5a8fb5
Binary files /dev/null and b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e.jpg differ
diff --git a/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e.json b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e.json
new file mode 100644
index 0000000..cfec46a
--- /dev/null
+++ b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e.json
@@ -0,0 +1,46 @@
+{
+ "image": "f29afa9a-bc48-400a-86fc-6975a9384b2e.jpg",
+ "width": 720,
+ "height": 246,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 514,
+ 700,
+ 760
+ ],
+ "click_point": [
+ 121,
+ 563
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 769,
+ 700,
+ 1020
+ ],
+ "click_point": [
+ 121,
+ 819
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1034,
+ 700,
+ 1280
+ ],
+ "click_point": [
+ 121,
+ 1083
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e_flag.jpg b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e_flag.jpg
new file mode 100644
index 0000000..b631839
Binary files /dev/null and b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e_vl.jpg b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e_vl.jpg
new file mode 100644
index 0000000..a1ec600
Binary files /dev/null and b/Apps/XinDianTu/Images/f29afa9a-bc48-400a-86fc-6975a9384b2e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_1.jpg b/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_1.jpg
new file mode 100644
index 0000000..119399b
Binary files /dev/null and b/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_2.jpg b/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_2.jpg
new file mode 100644
index 0000000..de4aa0c
Binary files /dev/null and b/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_3.jpg b/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_3.jpg
new file mode 100644
index 0000000..be0541e
Binary files /dev/null and b/Apps/XinDianTu/Images/f29ce8f15c2602373402b5c86f5f38d2_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_1.jpg b/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_1.jpg
new file mode 100644
index 0000000..7c170ec
Binary files /dev/null and b/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_2.jpg b/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_2.jpg
new file mode 100644
index 0000000..c9553a4
Binary files /dev/null and b/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_3.jpg b/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_3.jpg
new file mode 100644
index 0000000..fdfd02b
Binary files /dev/null and b/Apps/XinDianTu/Images/f2a2a2c5115e54a4999f688a484d8df5_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860.jpg b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860.jpg
new file mode 100644
index 0000000..ac67502
Binary files /dev/null and b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860.jpg differ
diff --git a/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860.json b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860.json
new file mode 100644
index 0000000..2ccf470
--- /dev/null
+++ b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860.json
@@ -0,0 +1,46 @@
+{
+ "image": "f2d38b10-bec8-40fb-9cdc-f161dff05860.jpg",
+ "width": 720,
+ "height": 106,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 420,
+ 700,
+ 734
+ ],
+ "click_point": [
+ 121,
+ 482
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 748,
+ 700,
+ 999
+ ],
+ "click_point": [
+ 121,
+ 798
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1008,
+ 700,
+ 1254
+ ],
+ "click_point": [
+ 121,
+ 1057
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860_flag.jpg b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860_flag.jpg
new file mode 100644
index 0000000..436897f
Binary files /dev/null and b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860_vl.jpg b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860_vl.jpg
new file mode 100644
index 0000000..50babea
Binary files /dev/null and b/Apps/XinDianTu/Images/f2d38b10-bec8-40fb-9cdc-f161dff05860_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f2e60b4b-eb10-41b3-b777-ff2e46d69ae9.jpg b/Apps/XinDianTu/Images/f2e60b4b-eb10-41b3-b777-ff2e46d69ae9.jpg
new file mode 100644
index 0000000..fe098a0
Binary files /dev/null and b/Apps/XinDianTu/Images/f2e60b4b-eb10-41b3-b777-ff2e46d69ae9.jpg differ
diff --git a/Apps/XinDianTu/Images/f2f288fa-fd67-45d3-9a31-f3a8cd07b06c.jpg b/Apps/XinDianTu/Images/f2f288fa-fd67-45d3-9a31-f3a8cd07b06c.jpg
new file mode 100644
index 0000000..e9b28a8
Binary files /dev/null and b/Apps/XinDianTu/Images/f2f288fa-fd67-45d3-9a31-f3a8cd07b06c.jpg differ
diff --git a/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_1.jpg b/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_1.jpg
new file mode 100644
index 0000000..6818c7b
Binary files /dev/null and b/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_2.jpg b/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_2.jpg
new file mode 100644
index 0000000..4d5959a
Binary files /dev/null and b/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_3.jpg b/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_3.jpg
new file mode 100644
index 0000000..e86f98a
Binary files /dev/null and b/Apps/XinDianTu/Images/f32f08de3f891f29242a30a73b29857f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f35a2898-081a-48ce-b6b2-a3eabff71540.jpg b/Apps/XinDianTu/Images/f35a2898-081a-48ce-b6b2-a3eabff71540.jpg
new file mode 100644
index 0000000..c9fb58a
Binary files /dev/null and b/Apps/XinDianTu/Images/f35a2898-081a-48ce-b6b2-a3eabff71540.jpg differ
diff --git a/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5.jpg b/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5.jpg
new file mode 100644
index 0000000..dea2e75
Binary files /dev/null and b/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5.jpg differ
diff --git a/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5_flag.jpg b/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5_flag.jpg
new file mode 100644
index 0000000..e620dcb
Binary files /dev/null and b/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5_vl.jpg b/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5_vl.jpg
new file mode 100644
index 0000000..322a091
Binary files /dev/null and b/Apps/XinDianTu/Images/f37bba88-ea60-4997-9042-ce37291a93d5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_1.jpg b/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_1.jpg
new file mode 100644
index 0000000..f7abb8d
Binary files /dev/null and b/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_2.jpg b/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_2.jpg
new file mode 100644
index 0000000..d353d06
Binary files /dev/null and b/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_3.jpg b/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_3.jpg
new file mode 100644
index 0000000..af076c5
Binary files /dev/null and b/Apps/XinDianTu/Images/f3c2647ac7cf615f92c8b4172f29818f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_1.jpg b/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_1.jpg
new file mode 100644
index 0000000..0760055
Binary files /dev/null and b/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_2.jpg b/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_2.jpg
new file mode 100644
index 0000000..ea79ce3
Binary files /dev/null and b/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_3.jpg b/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_3.jpg
new file mode 100644
index 0000000..488252a
Binary files /dev/null and b/Apps/XinDianTu/Images/f430fb330c7a6bb92855b26a0485d9d8_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f4816884-6719-4e10-8938-d436e4d5b14f.jpg b/Apps/XinDianTu/Images/f4816884-6719-4e10-8938-d436e4d5b14f.jpg
new file mode 100644
index 0000000..3cb0246
Binary files /dev/null and b/Apps/XinDianTu/Images/f4816884-6719-4e10-8938-d436e4d5b14f.jpg differ
diff --git a/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440.jpg b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440.jpg
new file mode 100644
index 0000000..a18faa8
Binary files /dev/null and b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440.jpg differ
diff --git a/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440.json b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440.json
new file mode 100644
index 0000000..0449de1
--- /dev/null
+++ b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440.json
@@ -0,0 +1,46 @@
+{
+ "image": "f4937ae5-2d37-4aa8-a864-62a85c427440.jpg",
+ "width": 720,
+ "height": 162,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 435,
+ 700,
+ 684
+ ],
+ "click_point": [
+ 121,
+ 484
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 692,
+ 700,
+ 941
+ ],
+ "click_point": [
+ 121,
+ 741
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 955,
+ 700,
+ 1204
+ ],
+ "click_point": [
+ 121,
+ 1004
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440_flag.jpg b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440_flag.jpg
new file mode 100644
index 0000000..b7155a3
Binary files /dev/null and b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440_vl.jpg b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440_vl.jpg
new file mode 100644
index 0000000..44f3925
Binary files /dev/null and b/Apps/XinDianTu/Images/f4937ae5-2d37-4aa8-a864-62a85c427440_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f567453e-839d-4077-988b-d305621383d8.jpg b/Apps/XinDianTu/Images/f567453e-839d-4077-988b-d305621383d8.jpg
new file mode 100644
index 0000000..aec5300
Binary files /dev/null and b/Apps/XinDianTu/Images/f567453e-839d-4077-988b-d305621383d8.jpg differ
diff --git a/Apps/XinDianTu/Images/f5afd757-e5c1-4d60-8fdc-22630afcce03.jpg b/Apps/XinDianTu/Images/f5afd757-e5c1-4d60-8fdc-22630afcce03.jpg
new file mode 100644
index 0000000..e897cb2
Binary files /dev/null and b/Apps/XinDianTu/Images/f5afd757-e5c1-4d60-8fdc-22630afcce03.jpg differ
diff --git a/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_1.jpg b/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_1.jpg
new file mode 100644
index 0000000..1b1eeda
Binary files /dev/null and b/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_2.jpg b/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_2.jpg
new file mode 100644
index 0000000..5dba9dc
Binary files /dev/null and b/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_3.jpg b/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_3.jpg
new file mode 100644
index 0000000..ad633fa
Binary files /dev/null and b/Apps/XinDianTu/Images/f5ebd49025b35e20299bb8c23a36696f_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_1.jpg b/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_1.jpg
new file mode 100644
index 0000000..4e64045
Binary files /dev/null and b/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_2.jpg b/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_2.jpg
new file mode 100644
index 0000000..4e64045
Binary files /dev/null and b/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_3.jpg b/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_3.jpg
new file mode 100644
index 0000000..4e64045
Binary files /dev/null and b/Apps/XinDianTu/Images/f5fb9ec52a911ad70dec129a2a49ec4b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f617a895-fdfc-440b-a6f1-3e1d241e359e.jpg b/Apps/XinDianTu/Images/f617a895-fdfc-440b-a6f1-3e1d241e359e.jpg
new file mode 100644
index 0000000..2feb0bb
Binary files /dev/null and b/Apps/XinDianTu/Images/f617a895-fdfc-440b-a6f1-3e1d241e359e.jpg differ
diff --git a/Apps/XinDianTu/Images/f63243fc-030a-4865-bf54-bfdbbc922bda.jpg b/Apps/XinDianTu/Images/f63243fc-030a-4865-bf54-bfdbbc922bda.jpg
new file mode 100644
index 0000000..ef554ae
Binary files /dev/null and b/Apps/XinDianTu/Images/f63243fc-030a-4865-bf54-bfdbbc922bda.jpg differ
diff --git a/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d.jpg b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d.jpg
new file mode 100644
index 0000000..e216ba6
Binary files /dev/null and b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d.jpg differ
diff --git a/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d.json b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d.json
new file mode 100644
index 0000000..c59164b
--- /dev/null
+++ b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d.json
@@ -0,0 +1,46 @@
+{
+ "image": "f6335685-286b-4d35-af45-f1821747698d.jpg",
+ "width": 720,
+ "height": 251,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 448,
+ 700,
+ 694
+ ],
+ "click_point": [
+ 121,
+ 497
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 708,
+ 700,
+ 1022
+ ],
+ "click_point": [
+ 121,
+ 770
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1036,
+ 700,
+ 1287
+ ],
+ "click_point": [
+ 121,
+ 1086
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d_flag.jpg b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d_flag.jpg
new file mode 100644
index 0000000..bef4e39
Binary files /dev/null and b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d_vl.jpg b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d_vl.jpg
new file mode 100644
index 0000000..db21238
Binary files /dev/null and b/Apps/XinDianTu/Images/f6335685-286b-4d35-af45-f1821747698d_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_1.jpg b/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_1.jpg
new file mode 100644
index 0000000..c8b31ff
Binary files /dev/null and b/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_2.jpg b/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_2.jpg
new file mode 100644
index 0000000..c8b31ff
Binary files /dev/null and b/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_3.jpg b/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_3.jpg
new file mode 100644
index 0000000..c8b31ff
Binary files /dev/null and b/Apps/XinDianTu/Images/f635b936d51a14de71f832b57a1e4631_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b.jpg b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b.jpg
new file mode 100644
index 0000000..ad763f5
Binary files /dev/null and b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b.jpg differ
diff --git a/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b.json b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b.json
new file mode 100644
index 0000000..55c160d
--- /dev/null
+++ b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b.json
@@ -0,0 +1,46 @@
+{
+ "image": "f6491ab8-4457-409e-a552-d8bb4f33895b.jpg",
+ "width": 720,
+ "height": 213,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 584,
+ 700,
+ 860
+ ],
+ "click_point": [
+ 121,
+ 639
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 872,
+ 700,
+ 1148
+ ],
+ "click_point": [
+ 121,
+ 927
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1161,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1203
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b_flag.jpg b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b_flag.jpg
new file mode 100644
index 0000000..87147a5
Binary files /dev/null and b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b_vl.jpg b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b_vl.jpg
new file mode 100644
index 0000000..cf3fec9
Binary files /dev/null and b/Apps/XinDianTu/Images/f6491ab8-4457-409e-a552-d8bb4f33895b_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef.jpg b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef.jpg
new file mode 100644
index 0000000..09a09a0
Binary files /dev/null and b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef.jpg differ
diff --git a/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef.json b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef.json
new file mode 100644
index 0000000..b8ab94c
--- /dev/null
+++ b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef.json
@@ -0,0 +1,46 @@
+{
+ "image": "f6529016-ccf1-4a71-8a61-cb45ebfb8cef.jpg",
+ "width": 720,
+ "height": 248,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 529,
+ 700,
+ 775
+ ],
+ "click_point": [
+ 121,
+ 578
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 788,
+ 700,
+ 1063
+ ],
+ "click_point": [
+ 121,
+ 843
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1076,
+ 700,
+ 1324
+ ],
+ "click_point": [
+ 121,
+ 1125
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef_flag.jpg b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef_flag.jpg
new file mode 100644
index 0000000..488a216
Binary files /dev/null and b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef_vl.jpg b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef_vl.jpg
new file mode 100644
index 0000000..f616e02
Binary files /dev/null and b/Apps/XinDianTu/Images/f6529016-ccf1-4a71-8a61-cb45ebfb8cef_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846.jpg b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846.jpg
new file mode 100644
index 0000000..16a0e6d
Binary files /dev/null and b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846.jpg differ
diff --git a/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846.json b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846.json
new file mode 100644
index 0000000..7dcba2c
--- /dev/null
+++ b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846.json
@@ -0,0 +1,46 @@
+{
+ "image": "f666c44d-5f4e-46f7-9350-498901d8b846.jpg",
+ "width": 720,
+ "height": 114,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 452,
+ 700,
+ 703
+ ],
+ "click_point": [
+ 121,
+ 502
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 712,
+ 700,
+ 991
+ ],
+ "click_point": [
+ 121,
+ 767
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 1000,
+ 700,
+ 1246
+ ],
+ "click_point": [
+ 121,
+ 1049
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846_flag.jpg b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846_flag.jpg
new file mode 100644
index 0000000..a8e4110
Binary files /dev/null and b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846_vl.jpg b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846_vl.jpg
new file mode 100644
index 0000000..10a98b8
Binary files /dev/null and b/Apps/XinDianTu/Images/f666c44d-5f4e-46f7-9350-498901d8b846_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f69f73fa-6c88-4a70-9b81-068d1fa8ac74.jpg b/Apps/XinDianTu/Images/f69f73fa-6c88-4a70-9b81-068d1fa8ac74.jpg
new file mode 100644
index 0000000..e7b671e
Binary files /dev/null and b/Apps/XinDianTu/Images/f69f73fa-6c88-4a70-9b81-068d1fa8ac74.jpg differ
diff --git a/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e.jpg b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e.jpg
new file mode 100644
index 0000000..f9c9677
Binary files /dev/null and b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e.jpg differ
diff --git a/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e.json b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e.json
new file mode 100644
index 0000000..458f9b7
--- /dev/null
+++ b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e.json
@@ -0,0 +1,33 @@
+{
+ "image": "f6a8607a-8182-4832-952c-4faa1ce3bc0e.jpg",
+ "width": 720,
+ "height": 249,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 772,
+ 712,
+ 1021
+ ],
+ "click_point": [
+ 122,
+ 821
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 1035,
+ 712,
+ 1284
+ ],
+ "click_point": [
+ 122,
+ 1084
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e_flag.jpg b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e_flag.jpg
new file mode 100644
index 0000000..a5ca51a
Binary files /dev/null and b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e_vl.jpg b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e_vl.jpg
new file mode 100644
index 0000000..62a8151
Binary files /dev/null and b/Apps/XinDianTu/Images/f6a8607a-8182-4832-952c-4faa1ce3bc0e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f6cb0718-2c19-42e1-8ce2-f941e767b748.jpg b/Apps/XinDianTu/Images/f6cb0718-2c19-42e1-8ce2-f941e767b748.jpg
new file mode 100644
index 0000000..873ee5a
Binary files /dev/null and b/Apps/XinDianTu/Images/f6cb0718-2c19-42e1-8ce2-f941e767b748.jpg differ
diff --git a/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.jpg b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.jpg
new file mode 100644
index 0000000..0a72ebd
Binary files /dev/null and b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.jpg differ
diff --git a/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.json b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.json
new file mode 100644
index 0000000..f7abf6e
--- /dev/null
+++ b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.json
@@ -0,0 +1,59 @@
+{
+ "image": "f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5.jpg",
+ "width": 720,
+ "height": 214,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 598
+ ],
+ "click_point": [
+ 121,
+ 442
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 612,
+ 700,
+ 863
+ ],
+ "click_point": [
+ 121,
+ 662
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 872,
+ 700,
+ 1151
+ ],
+ "click_point": [
+ 121,
+ 927
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1160,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1202
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5_flag.jpg b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5_flag.jpg
new file mode 100644
index 0000000..c8b07e1
Binary files /dev/null and b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5_vl.jpg b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5_vl.jpg
new file mode 100644
index 0000000..5d72921
Binary files /dev/null and b/Apps/XinDianTu/Images/f6de15f4-749b-43d3-9b3d-2ae2fbe3a9a5_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f6ece151-331e-4846-931e-614893087d5c.jpg b/Apps/XinDianTu/Images/f6ece151-331e-4846-931e-614893087d5c.jpg
new file mode 100644
index 0000000..b09c613
Binary files /dev/null and b/Apps/XinDianTu/Images/f6ece151-331e-4846-931e-614893087d5c.jpg differ
diff --git a/Apps/XinDianTu/Images/f79617fb-4c08-409a-a286-4fcb91150cc9.jpg b/Apps/XinDianTu/Images/f79617fb-4c08-409a-a286-4fcb91150cc9.jpg
new file mode 100644
index 0000000..b3a922f
Binary files /dev/null and b/Apps/XinDianTu/Images/f79617fb-4c08-409a-a286-4fcb91150cc9.jpg differ
diff --git a/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969.jpg b/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969.jpg
new file mode 100644
index 0000000..2953a95
Binary files /dev/null and b/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969.jpg differ
diff --git a/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969_flag.jpg b/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969_flag.jpg
new file mode 100644
index 0000000..8ada3ec
Binary files /dev/null and b/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969_vl.jpg b/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969_vl.jpg
new file mode 100644
index 0000000..270d03b
Binary files /dev/null and b/Apps/XinDianTu/Images/f835b82f-80ae-426b-9d13-bca58300e969_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f9840545-58ee-47c9-adca-d94c27d6fdec.jpg b/Apps/XinDianTu/Images/f9840545-58ee-47c9-adca-d94c27d6fdec.jpg
new file mode 100644
index 0000000..4ae43c4
Binary files /dev/null and b/Apps/XinDianTu/Images/f9840545-58ee-47c9-adca-d94c27d6fdec.jpg differ
diff --git a/Apps/XinDianTu/Images/f987e183-1c00-4566-9a93-7fa1819791f0.jpg b/Apps/XinDianTu/Images/f987e183-1c00-4566-9a93-7fa1819791f0.jpg
new file mode 100644
index 0000000..2ad26f4
Binary files /dev/null and b/Apps/XinDianTu/Images/f987e183-1c00-4566-9a93-7fa1819791f0.jpg differ
diff --git a/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e.jpg b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e.jpg
new file mode 100644
index 0000000..82a16c7
Binary files /dev/null and b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e.jpg differ
diff --git a/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e.json b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e.json
new file mode 100644
index 0000000..71275e7
--- /dev/null
+++ b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e.json
@@ -0,0 +1,59 @@
+{
+ "image": "f9aff2b7-013b-4282-a584-61726750509e.jpg",
+ "width": 720,
+ "height": 170,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 574
+ ],
+ "click_point": [
+ 121,
+ 438
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 588,
+ 700,
+ 902
+ ],
+ "click_point": [
+ 121,
+ 650
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 916,
+ 700,
+ 1190
+ ],
+ "click_point": [
+ 121,
+ 970
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1204,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1238
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e_flag.jpg b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e_flag.jpg
new file mode 100644
index 0000000..452ed6a
Binary files /dev/null and b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e_vl.jpg b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e_vl.jpg
new file mode 100644
index 0000000..e026c68
Binary files /dev/null and b/Apps/XinDianTu/Images/f9aff2b7-013b-4282-a584-61726750509e_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/f9d6a09c-4d21-425b-b21d-417104a4d29a.jpg b/Apps/XinDianTu/Images/f9d6a09c-4d21-425b-b21d-417104a4d29a.jpg
new file mode 100644
index 0000000..fc89083
Binary files /dev/null and b/Apps/XinDianTu/Images/f9d6a09c-4d21-425b-b21d-417104a4d29a.jpg differ
diff --git a/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_1.jpg b/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_1.jpg
new file mode 100644
index 0000000..bfed928
Binary files /dev/null and b/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_2.jpg b/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_2.jpg
new file mode 100644
index 0000000..6b0c1b0
Binary files /dev/null and b/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_3.jpg b/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_3.jpg
new file mode 100644
index 0000000..1119b49
Binary files /dev/null and b/Apps/XinDianTu/Images/fa68982416daf9add49d0a8e7025a536_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/fae6eab2-e36d-4061-a4a7-19fae682d06e.jpg b/Apps/XinDianTu/Images/fae6eab2-e36d-4061-a4a7-19fae682d06e.jpg
new file mode 100644
index 0000000..9e8e56c
Binary files /dev/null and b/Apps/XinDianTu/Images/fae6eab2-e36d-4061-a4a7-19fae682d06e.jpg differ
diff --git a/Apps/XinDianTu/Images/faea88f1-1b32-4948-a5ca-52a386818763.jpg b/Apps/XinDianTu/Images/faea88f1-1b32-4948-a5ca-52a386818763.jpg
new file mode 100644
index 0000000..aac98b9
Binary files /dev/null and b/Apps/XinDianTu/Images/faea88f1-1b32-4948-a5ca-52a386818763.jpg differ
diff --git a/Apps/XinDianTu/Images/fb1f39bc-b5ce-4c5e-beb1-98a594fa6e91.jpg b/Apps/XinDianTu/Images/fb1f39bc-b5ce-4c5e-beb1-98a594fa6e91.jpg
new file mode 100644
index 0000000..6cdb88e
Binary files /dev/null and b/Apps/XinDianTu/Images/fb1f39bc-b5ce-4c5e-beb1-98a594fa6e91.jpg differ
diff --git a/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd.jpg b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd.jpg
new file mode 100644
index 0000000..7e998a8
Binary files /dev/null and b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd.jpg differ
diff --git a/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd.json b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd.json
new file mode 100644
index 0000000..52ce312
--- /dev/null
+++ b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd.json
@@ -0,0 +1,59 @@
+{
+ "image": "fb8665d1-5c1d-4918-9630-426e36acadcd.jpg",
+ "width": 720,
+ "height": 272,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 614
+ ],
+ "click_point": [
+ 121,
+ 446
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 628,
+ 700,
+ 879
+ ],
+ "click_point": [
+ 121,
+ 678
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 888,
+ 700,
+ 1088
+ ],
+ "click_point": [
+ 121,
+ 928
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1102,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1156
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd_flag.jpg b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd_flag.jpg
new file mode 100644
index 0000000..fcb0451
Binary files /dev/null and b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd_vl.jpg b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd_vl.jpg
new file mode 100644
index 0000000..9684bc6
Binary files /dev/null and b/Apps/XinDianTu/Images/fb8665d1-5c1d-4918-9630-426e36acadcd_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2.jpg b/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2.jpg
new file mode 100644
index 0000000..fe485b6
Binary files /dev/null and b/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2.jpg differ
diff --git a/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2_flag.jpg b/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2_flag.jpg
new file mode 100644
index 0000000..e6ffba8
Binary files /dev/null and b/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2_vl.jpg b/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2_vl.jpg
new file mode 100644
index 0000000..d7a62d3
Binary files /dev/null and b/Apps/XinDianTu/Images/fb9cf8d5-c47a-4db4-8157-dca9c37bccf2_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/fc0b1697-111f-43e8-b600-c55b49baff04.jpg b/Apps/XinDianTu/Images/fc0b1697-111f-43e8-b600-c55b49baff04.jpg
new file mode 100644
index 0000000..3344490
Binary files /dev/null and b/Apps/XinDianTu/Images/fc0b1697-111f-43e8-b600-c55b49baff04.jpg differ
diff --git a/Apps/XinDianTu/Images/fc23c33b-bb03-4f5b-abd7-86b1b649fc84.jpg b/Apps/XinDianTu/Images/fc23c33b-bb03-4f5b-abd7-86b1b649fc84.jpg
new file mode 100644
index 0000000..46a5b56
Binary files /dev/null and b/Apps/XinDianTu/Images/fc23c33b-bb03-4f5b-abd7-86b1b649fc84.jpg differ
diff --git a/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_1.jpg b/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_1.jpg
new file mode 100644
index 0000000..c262bf0
Binary files /dev/null and b/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_2.jpg b/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_2.jpg
new file mode 100644
index 0000000..f5b28a5
Binary files /dev/null and b/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_3.jpg b/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_3.jpg
new file mode 100644
index 0000000..ce1fe37
Binary files /dev/null and b/Apps/XinDianTu/Images/fc3763fa8686046b557c5b2af03e6d0b_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_1.jpg b/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_1.jpg
new file mode 100644
index 0000000..cab74f7
Binary files /dev/null and b/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_2.jpg b/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_2.jpg
new file mode 100644
index 0000000..6820015
Binary files /dev/null and b/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_3.jpg b/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_3.jpg
new file mode 100644
index 0000000..8939437
Binary files /dev/null and b/Apps/XinDianTu/Images/fc9839f2be583a32277f3f0429ece384_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_1.jpg b/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_1.jpg
new file mode 100644
index 0000000..50195c3
Binary files /dev/null and b/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_2.jpg b/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_2.jpg
new file mode 100644
index 0000000..0d1ec64
Binary files /dev/null and b/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_3.jpg b/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_3.jpg
new file mode 100644
index 0000000..8715468
Binary files /dev/null and b/Apps/XinDianTu/Images/fcca48b6fdf167f3fd980f8a325a6c29_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/fcf288f9-2a55-4e2b-b501-e8b4d90b7541.jpg b/Apps/XinDianTu/Images/fcf288f9-2a55-4e2b-b501-e8b4d90b7541.jpg
new file mode 100644
index 0000000..1e1847d
Binary files /dev/null and b/Apps/XinDianTu/Images/fcf288f9-2a55-4e2b-b501-e8b4d90b7541.jpg differ
diff --git a/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_1.jpg b/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_1.jpg
new file mode 100644
index 0000000..17b1cd9
Binary files /dev/null and b/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_2.jpg b/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_2.jpg
new file mode 100644
index 0000000..17b1cd9
Binary files /dev/null and b/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_3.jpg b/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_3.jpg
new file mode 100644
index 0000000..17b1cd9
Binary files /dev/null and b/Apps/XinDianTu/Images/fd51955eb6762f3c5e94e832daf1909c_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/fd811a1e-170e-4e4e-94c6-dd64d4c82236.jpg b/Apps/XinDianTu/Images/fd811a1e-170e-4e4e-94c6-dd64d4c82236.jpg
new file mode 100644
index 0000000..980e6a2
Binary files /dev/null and b/Apps/XinDianTu/Images/fd811a1e-170e-4e4e-94c6-dd64d4c82236.jpg differ
diff --git a/Apps/XinDianTu/Images/fd91f38c-b013-4fb3-b80c-ef7b5aad1856.jpg b/Apps/XinDianTu/Images/fd91f38c-b013-4fb3-b80c-ef7b5aad1856.jpg
new file mode 100644
index 0000000..fddb1bf
Binary files /dev/null and b/Apps/XinDianTu/Images/fd91f38c-b013-4fb3-b80c-ef7b5aad1856.jpg differ
diff --git a/Apps/XinDianTu/Images/fd94851a-a5a4-455f-b243-614045fab92a.jpg b/Apps/XinDianTu/Images/fd94851a-a5a4-455f-b243-614045fab92a.jpg
new file mode 100644
index 0000000..6bb255c
Binary files /dev/null and b/Apps/XinDianTu/Images/fd94851a-a5a4-455f-b243-614045fab92a.jpg differ
diff --git a/Apps/XinDianTu/Images/fe34ab6a-4551-450d-9e13-b9399ddbb750.jpg b/Apps/XinDianTu/Images/fe34ab6a-4551-450d-9e13-b9399ddbb750.jpg
new file mode 100644
index 0000000..7bc54c1
Binary files /dev/null and b/Apps/XinDianTu/Images/fe34ab6a-4551-450d-9e13-b9399ddbb750.jpg differ
diff --git a/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_1.jpg b/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_1.jpg
new file mode 100644
index 0000000..86e6b6f
Binary files /dev/null and b/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_1.jpg differ
diff --git a/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_2.jpg b/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_2.jpg
new file mode 100644
index 0000000..1ad635e
Binary files /dev/null and b/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_2.jpg differ
diff --git a/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_3.jpg b/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_3.jpg
new file mode 100644
index 0000000..91b84e6
Binary files /dev/null and b/Apps/XinDianTu/Images/fe3ef7db8de1a0ea1906c21a17b97007_price_3.jpg differ
diff --git a/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9.jpg b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9.jpg
new file mode 100644
index 0000000..de31833
Binary files /dev/null and b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9.jpg differ
diff --git a/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9.json b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9.json
new file mode 100644
index 0000000..fd7c8f4
--- /dev/null
+++ b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9.json
@@ -0,0 +1,46 @@
+{
+ "image": "fe6d36ac-1903-4598-8eb7-ea94185527b9.jpg",
+ "width": 720,
+ "height": 122,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 472,
+ 700,
+ 718
+ ],
+ "click_point": [
+ 121,
+ 521
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 732,
+ 700,
+ 983
+ ],
+ "click_point": [
+ 121,
+ 782
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 992,
+ 700,
+ 1238
+ ],
+ "click_point": [
+ 121,
+ 1041
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9_flag.jpg b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9_flag.jpg
new file mode 100644
index 0000000..b439d3d
Binary files /dev/null and b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9_vl.jpg b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9_vl.jpg
new file mode 100644
index 0000000..1f0ec47
Binary files /dev/null and b/Apps/XinDianTu/Images/fe6d36ac-1903-4598-8eb7-ea94185527b9_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/fed22e5b-2782-4d1e-88a2-a8c47f83652d.jpg b/Apps/XinDianTu/Images/fed22e5b-2782-4d1e-88a2-a8c47f83652d.jpg
new file mode 100644
index 0000000..43d2b0d
Binary files /dev/null and b/Apps/XinDianTu/Images/fed22e5b-2782-4d1e-88a2-a8c47f83652d.jpg differ
diff --git a/Apps/XinDianTu/Images/ff1ffe10-1a61-43c6-b46a-725b0ddfc144.jpg b/Apps/XinDianTu/Images/ff1ffe10-1a61-43c6-b46a-725b0ddfc144.jpg
new file mode 100644
index 0000000..ceb355a
Binary files /dev/null and b/Apps/XinDianTu/Images/ff1ffe10-1a61-43c6-b46a-725b0ddfc144.jpg differ
diff --git a/Apps/XinDianTu/Images/ff9a619c-d449-49c4-b8a3-1b3cc6f27cec.jpg b/Apps/XinDianTu/Images/ff9a619c-d449-49c4-b8a3-1b3cc6f27cec.jpg
new file mode 100644
index 0000000..e05bc7a
Binary files /dev/null and b/Apps/XinDianTu/Images/ff9a619c-d449-49c4-b8a3-1b3cc6f27cec.jpg differ
diff --git a/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa.jpg b/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa.jpg
new file mode 100644
index 0000000..6f4b19b
Binary files /dev/null and b/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa.jpg differ
diff --git a/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa_flag.jpg b/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa_flag.jpg
new file mode 100644
index 0000000..b34f094
Binary files /dev/null and b/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa_vl.jpg b/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa_vl.jpg
new file mode 100644
index 0000000..222a7f8
Binary files /dev/null and b/Apps/XinDianTu/Images/ffa52b35-93f5-42b7-96cf-0cc3f03bcbfa_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994.jpg b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994.jpg
new file mode 100644
index 0000000..78b4c00
Binary files /dev/null and b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994.jpg differ
diff --git a/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994.json b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994.json
new file mode 100644
index 0000000..28ac877
--- /dev/null
+++ b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994.json
@@ -0,0 +1,59 @@
+{
+ "image": "ffadc14a-3f81-4ded-9d59-3bcea8398994.jpg",
+ "width": 720,
+ "height": 258,
+ "cards": [
+ {
+ "id": 1,
+ "rect": [
+ 19,
+ 404,
+ 700,
+ 588
+ ],
+ "click_point": [
+ 121,
+ 440
+ ]
+ },
+ {
+ "id": 2,
+ "rect": [
+ 19,
+ 596,
+ 700,
+ 845
+ ],
+ "click_point": [
+ 121,
+ 645
+ ]
+ },
+ {
+ "id": 3,
+ "rect": [
+ 19,
+ 859,
+ 700,
+ 1108
+ ],
+ "click_point": [
+ 121,
+ 908
+ ]
+ },
+ {
+ "id": 4,
+ "rect": [
+ 19,
+ 1116,
+ 700,
+ 1374
+ ],
+ "click_point": [
+ 121,
+ 1167
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994_flag.jpg b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994_flag.jpg
new file mode 100644
index 0000000..f0e58f9
Binary files /dev/null and b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994_flag.jpg differ
diff --git a/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994_vl.jpg b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994_vl.jpg
new file mode 100644
index 0000000..6110669
Binary files /dev/null and b/Apps/XinDianTu/Images/ffadc14a-3f81-4ded-9d59-3bcea8398994_vl.jpg differ
diff --git a/Apps/XinDianTu/Images/ffeb98ae-0b46-4c5c-99c4-dc2332d74b56.jpg b/Apps/XinDianTu/Images/ffeb98ae-0b46-4c5c-99c4-dc2332d74b56.jpg
new file mode 100644
index 0000000..58080d0
Binary files /dev/null and b/Apps/XinDianTu/Images/ffeb98ae-0b46-4c5c-99c4-dc2332d74b56.jpg differ
diff --git a/Apps/XinDianTu/Images/不限车长_flag_expand.jpg b/Apps/XinDianTu/Images/不限车长_flag_expand.jpg
new file mode 100644
index 0000000..91b57e5
Binary files /dev/null and b/Apps/XinDianTu/Images/不限车长_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/世盛-幸会新能源东岭南街站_flag_expand.jpg b/Apps/XinDianTu/Images/世盛-幸会新能源东岭南街站_flag_expand.jpg
new file mode 100644
index 0000000..01a4b9f
Binary files /dev/null and b/Apps/XinDianTu/Images/世盛-幸会新能源东岭南街站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/世纪花园小区慢充站_flag_expand.jpg b/Apps/XinDianTu/Images/世纪花园小区慢充站_flag_expand.jpg
new file mode 100644
index 0000000..e998d1b
Binary files /dev/null and b/Apps/XinDianTu/Images/世纪花园小区慢充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/中国石化中石化雁鸣湖充电站_flag_expand.jpg b/Apps/XinDianTu/Images/中国石化中石化雁鸣湖充电站_flag_expand.jpg
new file mode 100644
index 0000000..2ffa421
Binary files /dev/null and b/Apps/XinDianTu/Images/中国石化中石化雁鸣湖充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/中润石油宏达充电站_flag_expand.jpg b/Apps/XinDianTu/Images/中润石油宏达充电站_flag_expand.jpg
new file mode 100644
index 0000000..8ca7ea9
Binary files /dev/null and b/Apps/XinDianTu/Images/中润石油宏达充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/中硕能源北四环充电站_flag_expand.jpg b/Apps/XinDianTu/Images/中硕能源北四环充电站_flag_expand.jpg
new file mode 100644
index 0000000..64667d5
Binary files /dev/null and b/Apps/XinDianTu/Images/中硕能源北四环充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/优益客充电服务站_flag_expand.jpg b/Apps/XinDianTu/Images/优益客充电服务站_flag_expand.jpg
new file mode 100644
index 0000000..fd40950
Binary files /dev/null and b/Apps/XinDianTu/Images/优益客充电服务站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/会员价_flag_expand.jpg b/Apps/XinDianTu/Images/会员价_flag_expand.jpg
new file mode 100644
index 0000000..2c2a588
Binary files /dev/null and b/Apps/XinDianTu/Images/会员价_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/便利电凯旋二期充电站_flag_expand.jpg b/Apps/XinDianTu/Images/便利电凯旋二期充电站_flag_expand.jpg
new file mode 100644
index 0000000..8563673
Binary files /dev/null and b/Apps/XinDianTu/Images/便利电凯旋二期充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/凯旋物流慢充站_flag_expand.jpg b/Apps/XinDianTu/Images/凯旋物流慢充站_flag_expand.jpg
new file mode 100644
index 0000000..1bd3d04
Binary files /dev/null and b/Apps/XinDianTu/Images/凯旋物流慢充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/北湖便民充电站_flag_expand.jpg b/Apps/XinDianTu/Images/北湖便民充电站_flag_expand.jpg
new file mode 100644
index 0000000..647b2a2
Binary files /dev/null and b/Apps/XinDianTu/Images/北湖便民充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/华润燃气充电站_flag_expand.jpg b/Apps/XinDianTu/Images/华润燃气充电站_flag_expand.jpg
new file mode 100644
index 0000000..1b1cf36
Binary files /dev/null and b/Apps/XinDianTu/Images/华润燃气充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/华润燃气充电站(和利源汽修站)_flag_expand.jpg b/Apps/XinDianTu/Images/华润燃气充电站(和利源汽修站)_flag_expand.jpg
new file mode 100644
index 0000000..85eb875
Binary files /dev/null and b/Apps/XinDianTu/Images/华润燃气充电站(和利源汽修站)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/华润燃气超充站_flag_expand.jpg b/Apps/XinDianTu/Images/华润燃气超充站_flag_expand.jpg
new file mode 100644
index 0000000..d2320b7
Binary files /dev/null and b/Apps/XinDianTu/Images/华润燃气超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/华润燃气超充站(兴和路站)_flag_expand.jpg b/Apps/XinDianTu/Images/华润燃气超充站(兴和路站)_flag_expand.jpg
new file mode 100644
index 0000000..315b958
Binary files /dev/null and b/Apps/XinDianTu/Images/华润燃气超充站(兴和路站)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/变工新能源自兵馆站_flag_expand.jpg b/Apps/XinDianTu/Images/变工新能源自兵馆站_flag_expand.jpg
new file mode 100644
index 0000000..f155258
Binary files /dev/null and b/Apps/XinDianTu/Images/变工新能源自兵馆站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/台北阳光一期_flag_expand.jpg b/Apps/XinDianTu/Images/台北阳光一期_flag_expand.jpg
new file mode 100644
index 0000000..99d616d
Binary files /dev/null and b/Apps/XinDianTu/Images/台北阳光一期_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/喜洋洋快充站_flag_expand.jpg b/Apps/XinDianTu/Images/喜洋洋快充站_flag_expand.jpg
new file mode 100644
index 0000000..df24e4e
Binary files /dev/null and b/Apps/XinDianTu/Images/喜洋洋快充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/嘉琪酒店电动汽车充电站_flag_expand.jpg b/Apps/XinDianTu/Images/嘉琪酒店电动汽车充电站_flag_expand.jpg
new file mode 100644
index 0000000..c3ef15d
Binary files /dev/null and b/Apps/XinDianTu/Images/嘉琪酒店电动汽车充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/场站名称_flag_expand.jpg b/Apps/XinDianTu/Images/场站名称_flag_expand.jpg
new file mode 100644
index 0000000..f8b6eac
Binary files /dev/null and b/Apps/XinDianTu/Images/场站名称_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/场站名称未明确显示_flag_expand.jpg b/Apps/XinDianTu/Images/场站名称未明确显示_flag_expand.jpg
new file mode 100644
index 0000000..95265bd
Binary files /dev/null and b/Apps/XinDianTu/Images/场站名称未明确显示_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/富丰柳影路充电站_flag_expand.jpg b/Apps/XinDianTu/Images/富丰柳影路充电站_flag_expand.jpg
new file mode 100644
index 0000000..939ace1
Binary files /dev/null and b/Apps/XinDianTu/Images/富丰柳影路充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春东升汽车服务…_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春东升汽车服务…_flag_expand.jpg
new file mode 100644
index 0000000..e81d7b7
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春东升汽车服务…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春印刷技术研究..._flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春印刷技术研究..._flag_expand.jpg
new file mode 100644
index 0000000..4b0f831
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春印刷技术研究..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春印刷技术研究…_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春印刷技术研究…_flag_expand.jpg
new file mode 100644
index 0000000..cd9ca83
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春印刷技术研究…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春新区龙翔站_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春新区龙翔站_flag_expand.jpg
new file mode 100644
index 0000000..0f7ee71
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春新区龙翔站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春曙光路站_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春曙光路站_flag_expand.jpg
new file mode 100644
index 0000000..d17db83
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春曙光路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春爱琴湾站_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春爱琴湾站_flag_expand.jpg
new file mode 100644
index 0000000..862e60f
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春爱琴湾站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春解放大路亚朵..._flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春解放大路亚朵..._flag_expand.jpg
new file mode 100644
index 0000000..c9843b5
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春解放大路亚朵..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春解放大路亚朵…_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春解放大路亚朵…_flag_expand.jpg
new file mode 100644
index 0000000..9d05bb7
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春解放大路亚朵…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充 长春驿来特天伦中..._flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充 长春驿来特天伦中..._flag_expand.jpg
new file mode 100644
index 0000000..3f0a28f
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充 长春驿来特天伦中..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春印刷技术研究·_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春印刷技术研究·_flag_expand.jpg
new file mode 100644
index 0000000..ae17cb6
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春印刷技术研究·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春印刷技术研究··_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春印刷技术研究··_flag_expand.jpg
new file mode 100644
index 0000000..3541e58
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春印刷技术研究··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春新区龙翔站_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春新区龙翔站_flag_expand.jpg
new file mode 100644
index 0000000..f782217
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春新区龙翔站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春曙光路站_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春曙光路站_flag_expand.jpg
new file mode 100644
index 0000000..7000e5b
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春曙光路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春解放大路亚朵_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春解放大路亚朵_flag_expand.jpg
new file mode 100644
index 0000000..45247e5
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春解放大路亚朵_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春解放大路亚朵··_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春解放大路亚朵··_flag_expand.jpg
new file mode 100644
index 0000000..33e998c
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春解放大路亚朵··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S4超快充长春驿来特天伦中_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S4超快充长春驿来特天伦中_flag_expand.jpg
new file mode 100644
index 0000000..747e5e3
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S4超快充长春驿来特天伦中_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/小鹏S5超快充 长春湛江路站_flag_expand.jpg b/Apps/XinDianTu/Images/小鹏S5超快充 长春湛江路站_flag_expand.jpg
new file mode 100644
index 0000000..891d831
Binary files /dev/null and b/Apps/XinDianTu/Images/小鹏S5超快充 长春湛江路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(一汽集团汽车检测中...)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(一汽集团汽车检测中...)_flag_expand.jpg
new file mode 100644
index 0000000..895cb76
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(一汽集团汽车检测中...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(一汽集团汽车检测中...)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(一汽集团汽车检测中...)_flag_expand.jpg
new file mode 100644
index 0000000..80861d3
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(一汽集团汽车检测中...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(一汽集团长春国际招…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(一汽集团长春国际招…_flag_expand.jpg
new file mode 100644
index 0000000..7b45b3b
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(一汽集团长春国际招…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市二道区力旺东..._flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市二道区力旺东..._flag_expand.jpg
new file mode 100644
index 0000000..defc339
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市二道区力旺东..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心...)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心...)_flag_expand.jpg
new file mode 100644
index 0000000..6e8aad3
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心…)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心…)_flag_expand.jpg
new file mode 100644
index 0000000..78d1a26
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心…)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心…_flag_expand.jpg
new file mode 100644
index 0000000..13c17c8
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国…_flag_expand.jpg
new file mode 100644
index 0000000..bf46b7b
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宏汇国际广场…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宏汇国际广场…_flag_expand.jpg
new file mode 100644
index 0000000..59873f4
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宏汇国际广场…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港...)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港...)_flag_expand.jpg
new file mode 100644
index 0000000..5b682cd
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港..._flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港..._flag_expand.jpg
new file mode 100644
index 0000000..d0e333e
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港…_flag_expand.jpg
new file mode 100644
index 0000000..c287110
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区欧亚广..._flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区欧亚广..._flag_expand.jpg
new file mode 100644
index 0000000..a865fa0
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区欧亚广..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾..._flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾..._flag_expand.jpg
new file mode 100644
index 0000000..a8feffe
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾…_flag_expand.jpg
new file mode 100644
index 0000000..18076bb
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区力旺广…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区力旺广…_flag_expand.jpg
new file mode 100644
index 0000000..f110e1d
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区力旺广…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸..._flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸..._flag_expand.jpg
new file mode 100644
index 0000000..e391d2b
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸…_flag_expand.jpg
new file mode 100644
index 0000000..fc30ed1
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心...)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心...)_flag_expand.jpg
new file mode 100644
index 0000000..baa4011
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心…)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心…)_flag_expand.jpg
new file mode 100644
index 0000000..e57e4f9
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心…)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心…_flag_expand.jpg
new file mode 100644
index 0000000..2202129
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市环球购物中心…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国…_flag_expand.jpg
new file mode 100644
index 0000000..de39aa1
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区欧亚世..._flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区欧亚世..._flag_expand.jpg
new file mode 100644
index 0000000..b4cd45d
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区欧亚世..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区欧亚世...)_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区欧亚世...)_flag_expand.jpg
new file mode 100644
index 0000000..2d110cb
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区欧亚世...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(仅对金安饭店开放…_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(仅对金安饭店开放…_flag_expand.jpg
new file mode 100644
index 0000000..a971e92
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(仅对金安饭店开放…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市二道区力旺东·_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市二道区力旺东·_flag_expand.jpg
new file mode 100644
index 0000000..1089f44
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市二道区力旺东·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心·_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心·_flag_expand.jpg
new file mode 100644
index 0000000..1b4d82e
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市卓展购物中心·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国·_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国·_flag_expand.jpg
new file mode 100644
index 0000000..888011b
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国···_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国···_flag_expand.jpg
new file mode 100644
index 0000000..01e4fd8
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市南关区恒兴国···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宏汇国际广场·_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宏汇国际广场·_flag_expand.jpg
new file mode 100644
index 0000000..db0b2fd
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宏汇国际广场·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港·_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港·_flag_expand.jpg
new file mode 100644
index 0000000..8fbf599
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港··_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港··_flag_expand.jpg
new file mode 100644
index 0000000..a96d8c6
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区中东港··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区欧亚广··_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区欧亚广··_flag_expand.jpg
new file mode 100644
index 0000000..8a5bbdd
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市宽城区欧亚广··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾··_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾··_flag_expand.jpg
new file mode 100644
index 0000000..d647cb0
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾···_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾···_flag_expand.jpg
new file mode 100644
index 0000000..4be3d94
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市开迈斯北湖吾···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸··_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸··_flag_expand.jpg
new file mode 100644
index 0000000..38f99f2
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸···_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸···_flag_expand.jpg
new file mode 100644
index 0000000..a3c18c2
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市朝阳区国际贸···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国·_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国·_flag_expand.jpg
new file mode 100644
index 0000000..3456e05
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国···_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国···_flag_expand.jpg
new file mode 100644
index 0000000..92ca788
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站(长春市经开区中意国···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/开迈斯充电站((仅对金安饭店开放_flag_expand.jpg b/Apps/XinDianTu/Images/开迈斯充电站((仅对金安饭店开放_flag_expand.jpg
new file mode 100644
index 0000000..9d19359
Binary files /dev/null and b/Apps/XinDianTu/Images/开迈斯充电站((仅对金安饭店开放_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/快来电东盛充电站_flag_expand.jpg b/Apps/XinDianTu/Images/快来电东盛充电站_flag_expand.jpg
new file mode 100644
index 0000000..0a099a1
Binary files /dev/null and b/Apps/XinDianTu/Images/快来电东盛充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/新电途推荐_flag_expand.jpg b/Apps/XinDianTu/Images/新电途推荐_flag_expand.jpg
new file mode 100644
index 0000000..2f8e4e2
Binary files /dev/null and b/Apps/XinDianTu/Images/新电途推荐_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/明启凯旋物流充电站_flag_expand.jpg b/Apps/XinDianTu/Images/明启凯旋物流充电站_flag_expand.jpg
new file mode 100644
index 0000000..e666e12
Binary files /dev/null and b/Apps/XinDianTu/Images/明启凯旋物流充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/星星充电-长春朝至充电站有限公司_flag_expand.jpg b/Apps/XinDianTu/Images/星星充电-长春朝至充电站有限公司_flag_expand.jpg
new file mode 100644
index 0000000..cb71a28
Binary files /dev/null and b/Apps/XinDianTu/Images/星星充电-长春朝至充电站有限公司_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/星星充电-长春西堡充电站有限公司_flag_expand.jpg b/Apps/XinDianTu/Images/星星充电-长春西堡充电站有限公司_flag_expand.jpg
new file mode 100644
index 0000000..a0c999d
Binary files /dev/null and b/Apps/XinDianTu/Images/星星充电-长春西堡充电站有限公司_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/星火路充电站_flag_expand.jpg b/Apps/XinDianTu/Images/星火路充电站_flag_expand.jpg
new file mode 100644
index 0000000..306cea4
Binary files /dev/null and b/Apps/XinDianTu/Images/星火路充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/晟鑫快速充电站2_flag_expand.jpg b/Apps/XinDianTu/Images/晟鑫快速充电站2_flag_expand.jpg
new file mode 100644
index 0000000..bf52f36
Binary files /dev/null and b/Apps/XinDianTu/Images/晟鑫快速充电站2_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/晟鑫快速充电站_flag_expand.jpg b/Apps/XinDianTu/Images/晟鑫快速充电站_flag_expand.jpg
new file mode 100644
index 0000000..5aa791c
Binary files /dev/null and b/Apps/XinDianTu/Images/晟鑫快速充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/暂停使用_flag_expand.jpg b/Apps/XinDianTu/Images/暂停使用_flag_expand.jpg
new file mode 100644
index 0000000..61d24e7
Binary files /dev/null and b/Apps/XinDianTu/Images/暂停使用_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/未知场站_flag_expand.jpg b/Apps/XinDianTu/Images/未知场站_flag_expand.jpg
new file mode 100644
index 0000000..92214d8
Binary files /dev/null and b/Apps/XinDianTu/Images/未知场站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/梦响家超级快充站_flag_expand.jpg b/Apps/XinDianTu/Images/梦响家超级快充站_flag_expand.jpg
new file mode 100644
index 0000000..6d4f650
Binary files /dev/null and b/Apps/XinDianTu/Images/梦响家超级快充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/煦电-吉林长春市泰来街小区充电站_flag_expand.jpg b/Apps/XinDianTu/Images/煦电-吉林长春市泰来街小区充电站_flag_expand.jpg
new file mode 100644
index 0000000..f88784a
Binary files /dev/null and b/Apps/XinDianTu/Images/煦电-吉林长春市泰来街小区充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/爱上新能源同德路站_flag_expand.jpg b/Apps/XinDianTu/Images/爱上新能源同德路站_flag_expand.jpg
new file mode 100644
index 0000000..7c9c6bd
Binary files /dev/null and b/Apps/XinDianTu/Images/爱上新能源同德路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电千锤物流充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电千锤物流充电站_flag_expand.jpg
new file mode 100644
index 0000000..e6c22ff
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电千锤物流充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电同鑫水产充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电同鑫水产充电站_flag_expand.jpg
new file mode 100644
index 0000000..6c3dabf
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电同鑫水产充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电干锤物流充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电干锤物流充电站_flag_expand.jpg
new file mode 100644
index 0000000..d6c2e54
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电干锤物流充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电特来电世纪广场充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电特来电世纪广场充电站_flag_expand.jpg
new file mode 100644
index 0000000..a4e4f3a
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电特来电世纪广场充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电特来电东方广场充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电特来电东方广场充电站_flag_expand.jpg
new file mode 100644
index 0000000..157fbe3
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电特来电东方广场充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电特来电创业大街大润发充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电特来电创业大街大润发充电站_flag_expand.jpg
new file mode 100644
index 0000000..a5aaf49
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电特来电创业大街大润发充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电特来电华圣文化产业园充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电特来电华圣文化产业园充电站_flag_expand.jpg
new file mode 100644
index 0000000..df811a2
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电特来电华圣文化产业园充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电荣光路室内充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电荣光路室内充电站_flag_expand.jpg
new file mode 100644
index 0000000..a44d741
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电荣光路室内充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电金色佳圆充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电金色佳圆充电站_flag_expand.jpg
new file mode 100644
index 0000000..f562d8d
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电金色佳圆充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电金色家园充电站项目二期_flag_expand.jpg b/Apps/XinDianTu/Images/特来电金色家园充电站项目二期_flag_expand.jpg
new file mode 100644
index 0000000..4364962
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电金色家园充电站项目二期_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站_flag_expand.jpg b/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站_flag_expand.jpg
new file mode 100644
index 0000000..894d2a7
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站···_flag_expand.jpg b/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站···_flag_expand.jpg
new file mode 100644
index 0000000..c75ed4e
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站…_flag_expand.jpg b/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站…_flag_expand.jpg
new file mode 100644
index 0000000..fea9fc4
Binary files /dev/null and b/Apps/XinDianTu/Images/特来电长春达祥宽城新能源充电站…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春中东新天地购..._flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春中东新天地购..._flag_expand.jpg
new file mode 100644
index 0000000..413ab8d
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春中东新天地购..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春南关区西点药业_flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春南关区西点药业_flag_expand.jpg
new file mode 100644
index 0000000..23aa23d
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春南关区西点药业_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春大学西校区 (..._flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春大学西校区 (..._flag_expand.jpg
new file mode 100644
index 0000000..266f206
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春大学西校区 (..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春大学西校区(…_flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春大学西校区(…_flag_expand.jpg
new file mode 100644
index 0000000..6d2e70d
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春大学西校区(…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春居然之家(赛..._flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春居然之家(赛..._flag_expand.jpg
new file mode 100644
index 0000000..713c262
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春居然之家(赛..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春居然之家(赛…_flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春居然之家(赛…_flag_expand.jpg
new file mode 100644
index 0000000..5ad6d84
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春居然之家(赛…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春绿园区平安街..._flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春绿园区平安街..._flag_expand.jpg
new file mode 100644
index 0000000..0a4be70
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春绿园区平安街..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站 长春绿园区平安街…_flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站 长春绿园区平安街…_flag_expand.jpg
new file mode 100644
index 0000000..1aa3451
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站 长春绿园区平安街…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站长春中东新天地购·_flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站长春中东新天地购·_flag_expand.jpg
new file mode 100644
index 0000000..646b1b0
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站长春中东新天地购·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想5C超充站长春中东新天地购···_flag_expand.jpg b/Apps/XinDianTu/Images/理想5C超充站长春中东新天地购···_flag_expand.jpg
new file mode 100644
index 0000000..42b8654
Binary files /dev/null and b/Apps/XinDianTu/Images/理想5C超充站长春中东新天地购···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想超充站 长春君安驾校中东分校_flag_expand.jpg b/Apps/XinDianTu/Images/理想超充站 长春君安驾校中东分校_flag_expand.jpg
new file mode 100644
index 0000000..69e29db
Binary files /dev/null and b/Apps/XinDianTu/Images/理想超充站 长春君安驾校中东分校_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想超充站 长春富力万达文华酒店_flag_expand.jpg b/Apps/XinDianTu/Images/理想超充站 长春富力万达文华酒店_flag_expand.jpg
new file mode 100644
index 0000000..6533f17
Binary files /dev/null and b/Apps/XinDianTu/Images/理想超充站 长春富力万达文华酒店_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想超充站 长春欧亚卖场(北侧停…_flag_expand.jpg b/Apps/XinDianTu/Images/理想超充站 长春欧亚卖场(北侧停…_flag_expand.jpg
new file mode 100644
index 0000000..38a5748
Binary files /dev/null and b/Apps/XinDianTu/Images/理想超充站 长春欧亚卖场(北侧停…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/理想超充站长春君安驾校中东分校_flag_expand.jpg b/Apps/XinDianTu/Images/理想超充站长春君安驾校中东分校_flag_expand.jpg
new file mode 100644
index 0000000..da0a160
Binary files /dev/null and b/Apps/XinDianTu/Images/理想超充站长春君安驾校中东分校_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/瑞禧超级充电站华阳大酒店项目_flag_expand.jpg b/Apps/XinDianTu/Images/瑞禧超级充电站华阳大酒店项目_flag_expand.jpg
new file mode 100644
index 0000000..0054d50
Binary files /dev/null and b/Apps/XinDianTu/Images/瑞禧超级充电站华阳大酒店项目_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/瑞禧超级充电站正阳广场项目_flag_expand.jpg b/Apps/XinDianTu/Images/瑞禧超级充电站正阳广场项目_flag_expand.jpg
new file mode 100644
index 0000000..1577b2a
Binary files /dev/null and b/Apps/XinDianTu/Images/瑞禧超级充电站正阳广场项目_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/瑞禧超级充电站震宇街项目_flag_expand.jpg b/Apps/XinDianTu/Images/瑞禧超级充电站震宇街项目_flag_expand.jpg
new file mode 100644
index 0000000..80b3d17
Binary files /dev/null and b/Apps/XinDianTu/Images/瑞禧超级充电站震宇街项目_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/红旗街_flag_expand.jpg b/Apps/XinDianTu/Images/红旗街_flag_expand.jpg
new file mode 100644
index 0000000..ba7a5a4
Binary files /dev/null and b/Apps/XinDianTu/Images/红旗街_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/综合排序_flag_expand.jpg b/Apps/XinDianTu/Images/综合排序_flag_expand.jpg
new file mode 100644
index 0000000..93a63bb
Binary files /dev/null and b/Apps/XinDianTu/Images/综合排序_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/绿牌家-平泉路站_flag_expand.jpg b/Apps/XinDianTu/Images/绿牌家-平泉路站_flag_expand.jpg
new file mode 100644
index 0000000..480b8a5
Binary files /dev/null and b/Apps/XinDianTu/Images/绿牌家-平泉路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/绿赢充电站-吉林省肿瘤医院(湖光…_flag_expand.jpg b/Apps/XinDianTu/Images/绿赢充电站-吉林省肿瘤医院(湖光…_flag_expand.jpg
new file mode 100644
index 0000000..9c56439
Binary files /dev/null and b/Apps/XinDianTu/Images/绿赢充电站-吉林省肿瘤医院(湖光…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/绿赢充电站-红旗花园(南门)_flag_expand.jpg b/Apps/XinDianTu/Images/绿赢充电站-红旗花园(南门)_flag_expand.jpg
new file mode 100644
index 0000000..05eec94
Binary files /dev/null and b/Apps/XinDianTu/Images/绿赢充电站-红旗花园(南门)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/绿驰新能源充电站_flag_expand.jpg b/Apps/XinDianTu/Images/绿驰新能源充电站_flag_expand.jpg
new file mode 100644
index 0000000..1f48537
Binary files /dev/null and b/Apps/XinDianTu/Images/绿驰新能源充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能南关区中医院站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能南关区中医院站_flag_expand.jpg
new file mode 100644
index 0000000..1c3d405
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能南关区中医院站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能厚德堂充电站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能厚德堂充电站_flag_expand.jpg
new file mode 100644
index 0000000..375956e
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能厚德堂充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能平阳街1号楼充电站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能平阳街1号楼充电站_flag_expand.jpg
new file mode 100644
index 0000000..38b38c2
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能平阳街1号楼充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能春城大街站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能春城大街站_flag_expand.jpg
new file mode 100644
index 0000000..97dfd17
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能春城大街站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能郊区宿舍充电站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能郊区宿舍充电站_flag_expand.jpg
new file mode 100644
index 0000000..c0da5d4
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能郊区宿舍充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能银行胡同充电站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能银行胡同充电站_flag_expand.jpg
new file mode 100644
index 0000000..016434b
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能银行胡同充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能长影天地步行街站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能长影天地步行街站_flag_expand.jpg
new file mode 100644
index 0000000..33bf3e9
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能长影天地步行街站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能长白公路充电站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能长白公路充电站_flag_expand.jpg
new file mode 100644
index 0000000..af7649a
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能长白公路充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/脉冲绿能长石公路一号站_flag_expand.jpg b/Apps/XinDianTu/Images/脉冲绿能长石公路一号站_flag_expand.jpg
new file mode 100644
index 0000000..0b2ca2d
Binary files /dev/null and b/Apps/XinDianTu/Images/脉冲绿能长石公路一号站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/艾路国际酒店充电站_flag_expand.jpg b/Apps/XinDianTu/Images/艾路国际酒店充电站_flag_expand.jpg
new file mode 100644
index 0000000..0b0f2e6
Binary files /dev/null and b/Apps/XinDianTu/Images/艾路国际酒店充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源五十四街区站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源五十四街区站_flag_expand.jpg
new file mode 100644
index 0000000..8a66f9e
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源五十四街区站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源凯辰大厦站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源凯辰大厦站_flag_expand.jpg
new file mode 100644
index 0000000..559c9a3
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源凯辰大厦站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源凯麒大厦站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源凯麒大厦站_flag_expand.jpg
new file mode 100644
index 0000000..7ebd701
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源凯麒大厦站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源同德路站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源同德路站_flag_expand.jpg
new file mode 100644
index 0000000..4b6d943
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源同德路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源吴中国际站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源吴中国际站_flag_expand.jpg
new file mode 100644
index 0000000..7d3cab9
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源吴中国际站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源新月市场站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源新月市场站_flag_expand.jpg
new file mode 100644
index 0000000..a45417d
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源新月市场站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源汇文路站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源汇文路站_flag_expand.jpg
new file mode 100644
index 0000000..01b0131
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源汇文路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源汇文路站慢充_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源汇文路站慢充_flag_expand.jpg
new file mode 100644
index 0000000..beb8f03
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源汇文路站慢充_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源省宾馆站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源省宾馆站_flag_expand.jpg
new file mode 100644
index 0000000..85d561e
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源省宾馆站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源经纬路慢充站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源经纬路慢充站_flag_expand.jpg
new file mode 100644
index 0000000..856d371
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源经纬路慢充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源经纬路站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源经纬路站_flag_expand.jpg
new file mode 100644
index 0000000..74fe2fc
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源经纬路站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源西安桥慢充站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源西安桥慢充站_flag_expand.jpg
new file mode 100644
index 0000000..fea6f04
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源西安桥慢充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源西安桥站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源西安桥站_flag_expand.jpg
new file mode 100644
index 0000000..6d149db
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源西安桥站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/菱工新能源这有山站_flag_expand.jpg b/Apps/XinDianTu/Images/菱工新能源这有山站_flag_expand.jpg
new file mode 100644
index 0000000..91ae86d
Binary files /dev/null and b/Apps/XinDianTu/Images/菱工新能源这有山站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/蜜蜜充电站_flag_expand.jpg b/Apps/XinDianTu/Images/蜜蜜充电站_flag_expand.jpg
new file mode 100644
index 0000000..a55ab57
Binary files /dev/null and b/Apps/XinDianTu/Images/蜜蜜充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/超翔快充站 长春宽城区二手车市场_flag_expand.jpg b/Apps/XinDianTu/Images/超翔快充站 长春宽城区二手车市场_flag_expand.jpg
new file mode 100644
index 0000000..2f05f44
Binary files /dev/null and b/Apps/XinDianTu/Images/超翔快充站 长春宽城区二手车市场_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/超翔快充站 长春香江家居_flag_expand.jpg b/Apps/XinDianTu/Images/超翔快充站 长春香江家居_flag_expand.jpg
new file mode 100644
index 0000000..a947f18
Binary files /dev/null and b/Apps/XinDianTu/Images/超翔快充站 长春香江家居_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/超翔快充站长春宽城区二手车市场_flag_expand.jpg b/Apps/XinDianTu/Images/超翔快充站长春宽城区二手车市场_flag_expand.jpg
new file mode 100644
index 0000000..98b5394
Binary files /dev/null and b/Apps/XinDianTu/Images/超翔快充站长春宽城区二手车市场_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/超翔快充站长春香江家居_flag_expand.jpg b/Apps/XinDianTu/Images/超翔快充站长春香江家居_flag_expand.jpg
new file mode 100644
index 0000000..bdf478f
Binary files /dev/null and b/Apps/XinDianTu/Images/超翔快充站长春香江家居_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/金康路充电站_flag_expand.jpg b/Apps/XinDianTu/Images/金康路充电站_flag_expand.jpg
new file mode 100644
index 0000000..a92b035
Binary files /dev/null and b/Apps/XinDianTu/Images/金康路充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/金质融城慢充站_flag_expand.jpg b/Apps/XinDianTu/Images/金质融城慢充站_flag_expand.jpg
new file mode 100644
index 0000000..0bbe87b
Binary files /dev/null and b/Apps/XinDianTu/Images/金质融城慢充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/鑫博林快充站_flag_expand.jpg b/Apps/XinDianTu/Images/鑫博林快充站_flag_expand.jpg
new file mode 100644
index 0000000..4f7e37c
Binary files /dev/null and b/Apps/XinDianTu/Images/鑫博林快充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/鑫博林快充站(青年路-北环城路...)_flag_expand.jpg b/Apps/XinDianTu/Images/鑫博林快充站(青年路-北环城路...)_flag_expand.jpg
new file mode 100644
index 0000000..1179bad
Binary files /dev/null and b/Apps/XinDianTu/Images/鑫博林快充站(青年路-北环城路...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/鑫博林快充站(青年路-北环城路…_flag_expand.jpg b/Apps/XinDianTu/Images/鑫博林快充站(青年路-北环城路…_flag_expand.jpg
new file mode 100644
index 0000000..ad74ebd
Binary files /dev/null and b/Apps/XinDianTu/Images/鑫博林快充站(青年路-北环城路…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/鑫瑶充电(绿地站)_flag_expand.jpg b/Apps/XinDianTu/Images/鑫瑶充电(绿地站)_flag_expand.jpg
new file mode 100644
index 0000000..74f09be
Binary files /dev/null and b/Apps/XinDianTu/Images/鑫瑶充电(绿地站)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/鑫瑶充电(花园酒店站)_flag_expand.jpg b/Apps/XinDianTu/Images/鑫瑶充电(花园酒店站)_flag_expand.jpg
new file mode 100644
index 0000000..4f87e12
Binary files /dev/null and b/Apps/XinDianTu/Images/鑫瑶充电(花园酒店站)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/锐嘉新能源五星小区丙栋最东侧_flag_expand.jpg b/Apps/XinDianTu/Images/锐嘉新能源五星小区丙栋最东侧_flag_expand.jpg
new file mode 100644
index 0000000..cf180c2
Binary files /dev/null and b/Apps/XinDianTu/Images/锐嘉新能源五星小区丙栋最东侧_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/锐嘉新能源长安世家站_flag_expand.jpg b/Apps/XinDianTu/Images/锐嘉新能源长安世家站_flag_expand.jpg
new file mode 100644
index 0000000..4c42e58
Binary files /dev/null and b/Apps/XinDianTu/Images/锐嘉新能源长安世家站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长友长春大街超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长友长春大街超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..ccbac2b
Binary files /dev/null and b/Apps/XinDianTu/Images/长友长春大街超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发安乐路液冷超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发安乐路液冷超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..d449bd3
Binary files /dev/null and b/Apps/XinDianTu/Images/长发安乐路液冷超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发客车厂超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发客车厂超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..ede99c4
Binary files /dev/null and b/Apps/XinDianTu/Images/长发客车厂超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发工农大路超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发工农大路超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..0a5eb7a
Binary files /dev/null and b/Apps/XinDianTu/Images/长发工农大路超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发新民大街超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发新民大街超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..6e259e5
Binary files /dev/null and b/Apps/XinDianTu/Images/长发新民大街超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发水产市场液冷超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发水产市场液冷超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..d96d9d3
Binary files /dev/null and b/Apps/XinDianTu/Images/长发水产市场液冷超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发航展中心液冷超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发航展中心液冷超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..3322011
Binary files /dev/null and b/Apps/XinDianTu/Images/长发航展中心液冷超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发西四胡同超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发西四胡同超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..baf3498
Binary files /dev/null and b/Apps/XinDianTu/Images/长发西四胡同超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发长春大街超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发长春大街超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..bfc7a68
Binary files /dev/null and b/Apps/XinDianTu/Images/长发长春大街超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长发青冈立交桥液冷超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长发青冈立交桥液冷超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..c3a6807
Binary files /dev/null and b/Apps/XinDianTu/Images/长发青冈立交桥液冷超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长吉北线光磊特来电充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长吉北线光磊特来电充电站_flag_expand.jpg
new file mode 100644
index 0000000..9ebdc6f
Binary files /dev/null and b/Apps/XinDianTu/Images/长吉北线光磊特来电充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春万达广场(红旗街店)超充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春万达广场(红旗街店)超充站_flag_expand.jpg
new file mode 100644
index 0000000..4597389
Binary files /dev/null and b/Apps/XinDianTu/Images/长春万达广场(红旗街店)超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春净月假日酒店 蔚来充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春净月假日酒店 蔚来充电站_flag_expand.jpg
new file mode 100644
index 0000000..73d8c7f
Binary files /dev/null and b/Apps/XinDianTu/Images/长春净月假日酒店 蔚来充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春力旺广场 蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春力旺广场 蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..95aea35
Binary files /dev/null and b/Apps/XinDianTu/Images/长春力旺广场 蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春君安驾校极充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春君安驾校极充站_flag_expand.jpg
new file mode 100644
index 0000000..a4646d1
Binary files /dev/null and b/Apps/XinDianTu/Images/长春君安驾校极充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春大街充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春大街充电站_flag_expand.jpg
new file mode 100644
index 0000000..6e4004d
Binary files /dev/null and b/Apps/XinDianTu/Images/长春大街充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..76e7841
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站·_flag_expand.jpg
new file mode 100644
index 0000000..31e5dcc
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站…_flag_expand.jpg
new file mode 100644
index 0000000..f047edd
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区中意之尊公共充电站…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区望龙桥公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区望龙桥公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..ccfe6db
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区望龙桥公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区江山石材市场公共充..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区江山石材市场公共充..._flag_expand.jpg
new file mode 100644
index 0000000..4c42e58
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区江山石材市场公共充..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区江山石材市场公共充··_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区江山石材市场公共充··_flag_expand.jpg
new file mode 100644
index 0000000..2abe385
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区江山石材市场公共充··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区英俊西街公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区英俊西街公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..eed59e2
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区英俊西街公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电..._flag_expand.jpg
new file mode 100644
index 0000000..6416ac8
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电·_flag_expand.jpg
new file mode 100644
index 0000000..527c5e9
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电··_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电··_flag_expand.jpg
new file mode 100644
index 0000000..527c5e9
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电…_flag_expand.jpg
new file mode 100644
index 0000000..81f1976
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区金色橄榄城公共充电…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电..._flag_expand.jpg
new file mode 100644
index 0000000..9383ea0
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电_flag_expand.jpg
new file mode 100644
index 0000000..52995cd
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电·_flag_expand.jpg
new file mode 100644
index 0000000..940595b
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电··_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电··_flag_expand.jpg
new file mode 100644
index 0000000..ca23db3
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..36c1b5c
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市二道区长江物流园公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市南关区北海公园公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市南关区北海公园公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..2e0c44c
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市南关区北海公园公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市天佑新能源充电站项_flag_expand.jpg b/Apps/XinDianTu/Images/长春市天佑新能源充电站项_flag_expand.jpg
new file mode 100644
index 0000000..43ce043
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市天佑新能源充电站项_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电..._flag_expand.jpg
new file mode 100644
index 0000000..26de872
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电_flag_expand.jpg
new file mode 100644
index 0000000..c0c0d34
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电·_flag_expand.jpg
new file mode 100644
index 0000000..62643ce
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电··_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电··_flag_expand.jpg
new file mode 100644
index 0000000..9c80553
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..26de872
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区万龙第十城公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区九台南路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区九台南路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..7c0d433
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区九台南路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区刀龙第干城公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区刀龙第干城公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..601c630
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区刀龙第干城公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电..._flag_expand.jpg
new file mode 100644
index 0000000..0a52469
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电_flag_expand.jpg
new file mode 100644
index 0000000..d4393cc
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电·_flag_expand.jpg
new file mode 100644
index 0000000..06df7be
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电··_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电··_flag_expand.jpg
new file mode 100644
index 0000000..472d03b
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电…_flag_expand.jpg
new file mode 100644
index 0000000..5f3d66d
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北亚泰大街公共充电…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站..._flag_expand.jpg
new file mode 100644
index 0000000..11a9107
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..b0f97c7
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站·_flag_expand.jpg
new file mode 100644
index 0000000..e0d46eb
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站··_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站··_flag_expand.jpg
new file mode 100644
index 0000000..9e95a3a
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站··_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站···_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站···_flag_expand.jpg
new file mode 100644
index 0000000..e0d46eb
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站···_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站…_flag_expand.jpg
new file mode 100644
index 0000000..f750378
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北四环路公共充电站…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区北环城路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区北环城路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..1e10be9
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区北环城路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区方龙第十城公共充电_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区方龙第十城公共充电_flag_expand.jpg
new file mode 100644
index 0000000..9c80553
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区方龙第十城公共充电_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市宽城区盛德大街公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市宽城区盛德大街公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..f20350d
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市宽城区盛德大街公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站 (...)_flag_expand.jpg b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站 (...)_flag_expand.jpg
new file mode 100644
index 0000000..6c9e87d
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站 (...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..ef1fd82
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(...)_flag_expand.jpg b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(...)_flag_expand.jpg
new file mode 100644
index 0000000..ce1cd11
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(...)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(…)_flag_expand.jpg b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(…)_flag_expand.jpg
new file mode 100644
index 0000000..5e50e88
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(…)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(…_flag_expand.jpg
new file mode 100644
index 0000000..e0cc197
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市朝阳区蔚山路公共充电站(…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市朝阳区蔚山路绿能公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市朝阳区蔚山路绿能公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..959d245
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市朝阳区蔚山路绿能公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市正通新能源运营管理有限公司..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市正通新能源运营管理有限公司..._flag_expand.jpg
new file mode 100644
index 0000000..a3a4972
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市正通新能源运营管理有限公司..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市正通新能源运营管理有限公司_flag_expand.jpg b/Apps/XinDianTu/Images/长春市正通新能源运营管理有限公司_flag_expand.jpg
new file mode 100644
index 0000000..dd7284a
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市正通新能源运营管理有限公司_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市经开区昆山路超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市经开区昆山路超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..b8894ab
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市经开区昆山路超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市经开发区昆山路超级充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市经开发区昆山路超级充电站_flag_expand.jpg
new file mode 100644
index 0000000..8da8f86
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市经开发区昆山路超级充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区中机物流园公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区中机物流园公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..10a297b
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区中机物流园公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共_flag_expand.jpg
new file mode 100644
index 0000000..27e3e34
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共·_flag_expand.jpg
new file mode 100644
index 0000000..58df109
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共…_flag_expand.jpg
new file mode 100644
index 0000000..7a0679e
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区中车长客园中园公共…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区南阳路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区南阳路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..2ae518d
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区南阳路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区南阳路公共充电站(…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区南阳路公共充电站(…_flag_expand.jpg
new file mode 100644
index 0000000..c6c4d19
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区南阳路公共充电站(…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站..._flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站..._flag_expand.jpg
new file mode 100644
index 0000000..98bf49f
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站..._flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..fe18fc5
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站·_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站·_flag_expand.jpg
new file mode 100644
index 0000000..1f9f8c9
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站·_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站…_flag_expand.jpg
new file mode 100644
index 0000000..873cdcb
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区西环城路公共充电站…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区锦江花园公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区锦江花园公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..2301e1a
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区锦江花园公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..9688602
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站(…)_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站(…)_flag_expand.jpg
new file mode 100644
index 0000000..dbd750a
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站(…)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站(…_flag_expand.jpg b/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站(…_flag_expand.jpg
new file mode 100644
index 0000000..aafc5e1
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市绿园区雁鸣湖公共充电站(…_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春市见城区北四环路公共充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春市见城区北四环路公共充电站_flag_expand.jpg
new file mode 100644
index 0000000..0401585
Binary files /dev/null and b/Apps/XinDianTu/Images/长春市见城区北四环路公共充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春开元名都大酒店超充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春开元名都大酒店超充站_flag_expand.jpg
new file mode 100644
index 0000000..7eb5a97
Binary files /dev/null and b/Apps/XinDianTu/Images/长春开元名都大酒店超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春欧亚三环 蔚来充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长春欧亚三环 蔚来充电站_flag_expand.jpg
new file mode 100644
index 0000000..56d8350
Binary files /dev/null and b/Apps/XinDianTu/Images/长春欧亚三环 蔚来充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春环球贸易中心极充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春环球贸易中心极充站_flag_expand.jpg
new file mode 100644
index 0000000..bd67a5c
Binary files /dev/null and b/Apps/XinDianTu/Images/长春环球贸易中心极充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春绿园名车广场 蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春绿园名车广场 蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..4bf291a
Binary files /dev/null and b/Apps/XinDianTu/Images/长春绿园名车广场 蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春香格里拉大酒店 蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春香格里拉大酒店 蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..b877d9e
Binary files /dev/null and b/Apps/XinDianTu/Images/长春香格里拉大酒店 蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长春香格里拉大酒店蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/长春香格里拉大酒店蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..1e90eda
Binary files /dev/null and b/Apps/XinDianTu/Images/长春香格里拉大酒店蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/长谷入倒充电站_flag_expand.jpg b/Apps/XinDianTu/Images/长谷入倒充电站_flag_expand.jpg
new file mode 100644
index 0000000..bbcfca2
Binary files /dev/null and b/Apps/XinDianTu/Images/长谷入倒充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/隆化南路充电站_flag_expand.jpg b/Apps/XinDianTu/Images/隆化南路充电站_flag_expand.jpg
new file mode 100644
index 0000000..2e25be6
Binary files /dev/null and b/Apps/XinDianTu/Images/隆化南路充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/零度以下充电站_flag_expand.jpg b/Apps/XinDianTu/Images/零度以下充电站_flag_expand.jpg
new file mode 100644
index 0000000..ea82be9
Binary files /dev/null and b/Apps/XinDianTu/Images/零度以下充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/零度以下充电站(欧亚商都站)_flag_expand.jpg b/Apps/XinDianTu/Images/零度以下充电站(欧亚商都站)_flag_expand.jpg
new file mode 100644
index 0000000..285f575
Binary files /dev/null and b/Apps/XinDianTu/Images/零度以下充电站(欧亚商都站)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/零度以下充电站(百脑汇站)_flag_expand.jpg b/Apps/XinDianTu/Images/零度以下充电站(百脑汇站)_flag_expand.jpg
new file mode 100644
index 0000000..beba60e
Binary files /dev/null and b/Apps/XinDianTu/Images/零度以下充电站(百脑汇站)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特充电站(兰家大金仓玉米收储)_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特充电站(兰家大金仓玉米收储)_flag_expand.jpg
new file mode 100644
index 0000000..48199c2
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特充电站(兰家大金仓玉米收储)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特充电站(兰家大金仓玉米收储)_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特充电站(兰家大金仓玉米收储)_flag_expand.jpg
new file mode 100644
index 0000000..bc57290
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特充电站(兰家大金仓玉米收储)_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特长春北海路CBD 蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特长春北海路CBD 蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..005b05d
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特长春北海路CBD 蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特长春宽城中东港 蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特长春宽城中东港 蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..dbd9a70
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特长春宽城中东港 蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特长春宽城中东港_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特长春宽城中东港_flag_expand.jpg
new file mode 100644
index 0000000..d1e8e95
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特长春宽城中东港_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特长春宽城中东港蔚来超充站_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特长春宽城中东港蔚来超充站_flag_expand.jpg
new file mode 100644
index 0000000..881ce1d
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特长春宽城中东港蔚来超充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/驿来特长春红旗街这有山 蔚来充电站_flag_expand.jpg b/Apps/XinDianTu/Images/驿来特长春红旗街这有山 蔚来充电站_flag_expand.jpg
new file mode 100644
index 0000000..f527151
Binary files /dev/null and b/Apps/XinDianTu/Images/驿来特长春红旗街这有山 蔚来充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/鹅充充充电站_flag_expand.jpg b/Apps/XinDianTu/Images/鹅充充充电站_flag_expand.jpg
new file mode 100644
index 0000000..8a7a233
Binary files /dev/null and b/Apps/XinDianTu/Images/鹅充充充电站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/麦上新能源首宾馆站_flag_expand.jpg b/Apps/XinDianTu/Images/麦上新能源首宾馆站_flag_expand.jpg
new file mode 100644
index 0000000..057f888
Binary files /dev/null and b/Apps/XinDianTu/Images/麦上新能源首宾馆站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/麦工新能源这有山站_flag_expand.jpg b/Apps/XinDianTu/Images/麦工新能源这有山站_flag_expand.jpg
new file mode 100644
index 0000000..f4e5e6a
Binary files /dev/null and b/Apps/XinDianTu/Images/麦工新能源这有山站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Images/龙雨超级快充站_flag_expand.jpg b/Apps/XinDianTu/Images/龙雨超级快充站_flag_expand.jpg
new file mode 100644
index 0000000..9762dce
Binary files /dev/null and b/Apps/XinDianTu/Images/龙雨超级快充站_flag_expand.jpg differ
diff --git a/Apps/XinDianTu/Opener.py b/Apps/XinDianTu/Opener.py
new file mode 100644
index 0000000..05ee8d7
--- /dev/null
+++ b/Apps/XinDianTu/Opener.py
@@ -0,0 +1,189 @@
+# coding=utf-8
+import asyncio
+import logging
+import time
+import uuid
+import os
+import uiautomator2 as u2
+from Util.Kit import take_screenshot, detect_black_agree_button, click_image_template, detect_ad_close_x, detect_any_ad_close, detect_bottom_close_circle
+from Util.ObsUtil import ObsUploader
+from Util.XinDianTuReadImageKit import XinDianTuReadImageKit
+from Config.Config import OBS_TMP_PREFIX, CDN_DOMAIN
+
+# pip install adbutils
+# 配置日志输出,方便调试和监控
+logging.basicConfig(
+ level=logging.INFO,
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
+)
+logger = logging.getLogger("OpenXinDianTu")
+
+async def check_and_close_ad(d):
+ """
+ 检测并关闭广告弹窗(优先使用计算机图形学方案,节省成本和时间)
+ """
+ logger.info("开始检测广告弹窗...")
+
+ # 1. 拍摄截图
+ t1 = time.time()
+ image_uuid = str(uuid.uuid4())
+ # 使用相对路径: 基于当前脚本目录下的 Images 文件夹
+ base_dir = os.path.dirname(os.path.abspath(__file__))
+ save_dir = os.path.join(base_dir, "./Images")
+ screenshot_path = take_screenshot(d, image_uuid, save_dir=save_dir)
+ logger.info(f"Step [广告检测截图] 耗时: {time.time() - t1:.4f}s")
+
+ # 2. 图形学检测方案 (Local CV)
+ t_cv = time.time()
+
+ # 方案 A: 检测黑色的"同意"按钮 (隐私协议)
+ # 这一步不需要模板,直接通过颜色和形状特征检测
+ agree_pos = detect_black_agree_button(screenshot_path, debug_dir=save_dir)
+ if agree_pos:
+ x, y = agree_pos
+ logger.info(f"通过图形学算法检测到隐私协议'同意'按钮: ({x}, {y})")
+ d.click(x, y)
+ logger.info(f"Step [图形学检测-同意按钮] 耗时: {time.time() - t_cv:.4f}s")
+ # 清理截图
+ if os.path.exists(screenshot_path):
+ os.remove(screenshot_path)
+ return True
+
+ # 方案 B: 多模板匹配检测 "关闭(X)" 按钮 (支持多种广告样式)
+ template_dir = os.path.join(base_dir, "Templates")
+
+ if os.path.exists(template_dir):
+ logger.info(f"正在尝试多模板匹配关闭按钮: {template_dir}")
+ close_pos = detect_any_ad_close(screenshot_path, template_dir, debug_dir=save_dir)
+
+ if close_pos:
+ x, y = close_pos
+ logger.info(f"通过多模板匹配检测到广告关闭按钮: ({x}, {y})")
+ d.click(x, y)
+ logger.info(f"Step [图形学检测-关闭按钮] 耗时: {time.time() - t_cv:.4f}s")
+ if os.path.exists(screenshot_path):
+ os.remove(screenshot_path)
+ return True
+
+ # 方案 C: 底部圆形关闭按钮检测 (无模板,基于几何特征)
+ # 针对插屏广告底部中间的圆形关闭按钮
+ circle_pos = detect_bottom_close_circle(screenshot_path, debug_dir=save_dir)
+ if circle_pos:
+ x, y = circle_pos
+ logger.info(f"通过几何特征检测到底部圆形关闭按钮: ({x}, {y})")
+ d.click(x, y)
+ logger.info(f"Step [图形学检测-底部圆形按钮] 耗时: {time.time() - t_cv:.4f}s")
+ if os.path.exists(screenshot_path):
+ os.remove(screenshot_path)
+ return True
+
+ logger.info(f"本地图形学检测完成,未发现已知广告。耗时: {time.time() - t_cv:.4f}s")
+
+ # [优化] 用户指示:回退到大模型检查不靠谱且浪费。
+ # 如果本地图形学方案(黑按钮、X关闭)都未命中,则直接认为无广告或已进入正常页面。
+
+ # 清理本地截图
+ if os.path.exists(screenshot_path):
+ os.remove(screenshot_path)
+
+ return False
+
+
+async def open_mini_program():
+ """
+ 异步形式的进入微信小程序
+ """
+ # 连接设备
+ d = u2.connect()
+
+ logger.info("执行进入小程序.")
+
+ # 启动微信 (强制停止后再启动,确保回到主页)
+ logger.info("启动微信...")
+ d.app_start("com.tencent.mm", stop=True)
+ await asyncio.sleep(5) # 给微信充足的启动时间
+
+ # 0. 确保在“微信”消息列表标签页
+ tab_chat = d(text="微信", resourceId="com.tencent.mm:id/f2s") # 常见底部标签 ID
+ if not tab_chat.exists:
+ tab_chat = d(text="微信")
+
+ if tab_chat.exists:
+ # 如果没选中(通常选中的文本颜色不同或有其他特征,这里直接点一下确保切换)
+ logger.info("点击底部‘微信’标签,确保在消息列表页.")
+ tab_chat.click()
+ await asyncio.sleep(1)
+
+ # 1. 点击搜索按钮(放大镜图标)
+ # 仅保留坐标点击逻辑
+ window_size = d.window_size()
+ w, h = window_size[0], window_size[1]
+
+ # 精确相对坐标:x=84%, y=8% (基于截图推算)
+ click_x = int(w * 0.84)
+ click_y = int(h * 0.08)
+ logger.info(f"使用精确坐标点击搜索按钮: ({click_x}, {click_y})")
+ d.click(click_x, click_y)
+
+ # 点击后给予一定的加载时间
+ await asyncio.sleep(2)
+
+ # 2. 直接尝试输入内容 (既然已经看到了搜索界面,我们不再进行严格的特征校验)
+ logger.info("准备输入搜索内容: 新电途")
+
+ # 启用 u2 快速输入法 (使用更新的方法名)
+ d.set_input_ime(True)
+
+ # 尝试点击搜索框位置以确保获取焦点 (通常在顶部居中偏左)
+ search_bar_x, search_bar_y = int(w * 0.4), int(h * 0.08)
+ d.click(search_bar_x, search_bar_y)
+ await asyncio.sleep(1.5) # 稍微多等一会儿让输入法准备好
+
+ # 直接发送按键
+ try:
+ # 尝试先不使用 clear=True,因为它在某些设备上会导致 ADB_KEYBOARD_CLEAR_TEXT 错误
+ # 如果需要清除文本,可以尝试全选+删除,或者假设搜索框是空的
+ logger.info("尝试输入文字: 新电途")
+ d.send_keys("新电途")
+ logger.info("文字输入指令已发送.")
+ except Exception as e:
+ logger.warning(f"直接 send_keys 失败: {e}")
+
+ try:
+ # 备选方案:尝试获取焦点元素并设置文本
+ logger.info("尝试使用 set_text 设置文本...")
+ d(focused=True).set_text("新电途")
+ logger.info("set_text 指令已发送.")
+ except Exception as e2:
+ logger.error(f"文字输入彻底失败: {e2}")
+ # 最后的尝试:切换回默认输入法(有时 FastInputIME 会卡住)
+ # d.set_fastinput_ime(False)
+ # d.send_keys("新电途")
+
+ await asyncio.sleep(3)
+
+ # 兜底点击:点击搜索结果的第一项位置 (x=50%, y=18%)
+ res_x, res_y = int(w * 0.5), int(h * 0.18)
+ logger.info(f"尝试坐标点击第一项: ({res_x}, {res_y})")
+ d.click(res_x, res_y)
+ await asyncio.sleep(10)
+ # 进入小程序后,检查并处理广告
+ await check_and_close_ad(d)
+ return True
+
+
+async def main():
+ success = await open_mini_program()
+ if success:
+ logger.info("任务执行成功.")
+ else:
+ logger.error("任务执行失败.")
+
+
+if __name__ == "__main__":
+ try:
+ asyncio.run(main())
+ except KeyboardInterrupt:
+ logger.info("程序被用户中断.")
+ except Exception as e:
+ logger.exception(f"运行过程中出现异常: {e}")
diff --git a/Apps/XinDianTu/Report/Export.py b/Apps/XinDianTu/Report/Export.py
new file mode 100644
index 0000000..0f69ce0
--- /dev/null
+++ b/Apps/XinDianTu/Report/Export.py
@@ -0,0 +1,505 @@
+import asyncio
+import json
+import logging
+import os
+import re
+import sys
+from datetime import datetime
+from decimal import Decimal
+from typing import Any, Dict, List, Optional, Set
+
+logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
+logger = logging.getLogger(__name__)
+
+project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+from Util import Win32Patch
+
+Win32Patch.patch()
+
+from Config.Config import DB_URL
+from DbKit.Db import Db
+
+try:
+ from openpyxl import Workbook
+ from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
+ from openpyxl.utils import get_column_letter
+except Exception as e:
+ raise RuntimeError("缺少 openpyxl 依赖,请先安装:pip install openpyxl") from e
+
+
+# --- 样式定义 ---
+# 颜色
+HEADER_FILL_COLOR = "4472C4" # 专业蓝 (表头背景)
+HEADER_FONT_COLOR = "FFFFFF" # 白色 (表头文字)
+LABEL_FILL_COLOR = "D9E1F2" # 浅蓝 (Key标签背景,更柔和)
+SECTION_FILL_COLOR = "DDEBF7" # 极浅蓝 (小节标题背景)
+BORDER_COLOR = "BFBFBF" # 边框颜色
+OUTER_BORDER_COLOR = "4472C4" # 外边框颜色
+
+# 字体
+FONT_NAME = "微软雅黑"
+TITLE_FONT = Font(name=FONT_NAME, size=20, bold=True, color="4472C4") # 主标题加大
+SUBTITLE_FONT = Font(name=FONT_NAME, size=12, bold=True, color="203764") # 小节标题加深色
+HEADER_FONT = Font(name=FONT_NAME, size=11, bold=True, color=HEADER_FONT_COLOR)
+LABEL_FONT = Font(name=FONT_NAME, size=10, bold=True, color="333333") # 标签文字深灰
+DATA_FONT = Font(name=FONT_NAME, size=10)
+
+# 边框
+THIN_SIDE = Side(style="thin", color=BORDER_COLOR)
+MEDIUM_SIDE = Side(style="medium", color=OUTER_BORDER_COLOR)
+BORDER_ALL_THIN = Border(left=THIN_SIDE, right=THIN_SIDE, top=THIN_SIDE, bottom=THIN_SIDE)
+
+# 填充
+HEADER_FILL = PatternFill("solid", fgColor=HEADER_FILL_COLOR)
+LABEL_FILL = PatternFill("solid", fgColor=LABEL_FILL_COLOR)
+SECTION_FILL = PatternFill("solid", fgColor=SECTION_FILL_COLOR)
+
+INVALID_SHEET_CHARS_RE = re.compile(r"[:\\/?*\[\]]")
+
+
+def _safe_excel_sheet_title(raw_title: str, existing_titles: Set[str]) -> str:
+ title = (raw_title or "").strip()
+ if not title:
+ title = "未命名场站"
+
+ title = INVALID_SHEET_CHARS_RE.sub("_", title)
+ title = title.replace("\n", " ").replace("\r", " ").strip()
+ if len(title) > 31:
+ title = title[:31].rstrip()
+ if not title:
+ title = "未命名场站"
+
+ if title not in existing_titles:
+ existing_titles.add(title)
+ return title
+
+ base = title[:28].rstrip() if len(title) > 28 else title
+ idx = 2
+ while True:
+ candidate = f"{base}_{idx}"
+ if len(candidate) > 31:
+ candidate = candidate[:31]
+ if candidate not in existing_titles:
+ existing_titles.add(candidate)
+ return candidate
+ idx += 1
+
+
+def _to_float(value):
+ if value is None:
+ return None
+ if isinstance(value, Decimal):
+ return float(value)
+ return value
+
+
+def _parse_schedule(schedule_json: Any) -> List[Dict[str, Any]]:
+ if not schedule_json:
+ return []
+ if isinstance(schedule_json, (dict, list)):
+ return schedule_json if isinstance(schedule_json, list) else [schedule_json]
+ if isinstance(schedule_json, (bytes, bytearray)):
+ try:
+ schedule_json = schedule_json.decode("utf-8", errors="ignore")
+ except Exception:
+ schedule_json = str(schedule_json)
+ if not isinstance(schedule_json, str):
+ return []
+ try:
+ data = json.loads(schedule_json)
+ if isinstance(data, list):
+ return data
+ if isinstance(data, dict):
+ return [data]
+ return []
+ except Exception:
+ return []
+
+
+def _apply_table_header_style(ws, row_idx: int, col_start: int, col_end: int):
+ alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
+ # Header row with top/bottom medium border
+ border = Border(left=THIN_SIDE, right=THIN_SIDE, top=MEDIUM_SIDE, bottom=MEDIUM_SIDE)
+
+ for col in range(col_start, col_end + 1):
+ cell = ws.cell(row=row_idx, column=col)
+ cell.fill = HEADER_FILL
+ cell.font = HEADER_FONT
+ cell.alignment = alignment
+ cell.border = border
+
+ ws.row_dimensions[row_idx].height = 28 # Increased header height
+
+
+def _apply_table_cell_style(ws, row_idx: int, col_start: int, col_end: int, center_cols: List[int] = None):
+ for col in range(col_start, col_end + 1):
+ cell = ws.cell(row=row_idx, column=col)
+ cell.font = DATA_FONT
+
+ is_center = center_cols and col in center_cols
+ cell.alignment = Alignment(horizontal="center" if is_center else "left", vertical="center", wrap_text=True)
+ cell.border = BORDER_ALL_THIN
+
+ ws.row_dimensions[row_idx].height = 22 # Comfortable row height
+
+
+def _style_info_key_value(ws, row, col_key, col_val, merge_val_cols=0):
+ # Key Style
+ c_key = ws.cell(row=row, column=col_key)
+ c_key.font = LABEL_FONT
+ c_key.alignment = Alignment(horizontal="right", vertical="center")
+ c_key.fill = LABEL_FILL
+ c_key.border = BORDER_ALL_THIN
+
+ # Value Style
+ c_val = ws.cell(row=row, column=col_val)
+ c_val.font = DATA_FONT
+ c_val.alignment = Alignment(horizontal="left", vertical="center", wrap_text=True)
+ c_val.border = BORDER_ALL_THIN
+
+ if merge_val_cols > 0:
+ ws.merge_cells(start_row=row, start_column=col_val, end_row=row, end_column=col_val + merge_val_cols)
+ # Apply border to merged cells (required for openpyxl)
+ for c_offset in range(1, merge_val_cols + 1):
+ c_merged = ws.cell(row=row, column=col_val + c_offset)
+ c_merged.border = BORDER_ALL_THIN
+
+
+def _set_column_widths(ws, widths: dict[int, float]):
+ for col_idx, width in widths.items():
+ ws.column_dimensions[get_column_letter(col_idx)].width = width
+
+
+class DorisExcelExporter:
+ def __init__(self, db_url: str):
+ self.db = Db(db_url=db_url)
+
+ async def init(self):
+ await self.db.init_db()
+
+ async def close(self):
+ try:
+ await self.db.close()
+ finally:
+ if getattr(self.db, "engine", None):
+ await self.db.engine.dispose()
+
+ async def fetch_current_station_rows(self) -> List[Dict[str, Any]]:
+ sql = """
+ SELECT
+ p.station_hash,
+ p.station_name,
+ p.address,
+ p.coord_x,
+ p.coord_y,
+ s.total_piles AS total_guns,
+ s.free_piles AS free_guns,
+ s.piles_detail_json,
+ s.current_price,
+ s.pro_price,
+ s.parking_info,
+ s.distance,
+ s.valid_start_time AS status_update_time,
+ pr.schedule_json,
+ pr.valid_start_time AS schedule_update_time
+ FROM t_station_profile_scd p
+ LEFT JOIN t_station_status_scd s
+ ON p.station_hash = s.station_hash AND s.is_current = 1
+ LEFT JOIN t_station_price_schedule_scd pr
+ ON p.station_hash = pr.station_hash AND pr.is_current = 1
+ WHERE p.is_current = 1
+ ORDER BY p.station_name
+ """
+ return await self.db.find(sql)
+
+
+def _build_station_sheet(ws, row: Dict[str, Any]):
+ station_name = row.get("station_name") or ""
+ address = row.get("address") or ""
+ coord_x = row.get("coord_x")
+ coord_y = row.get("coord_y")
+ total_guns = row.get("total_guns")
+ free_guns = row.get("free_guns")
+ current_price = _to_float(row.get("current_price"))
+ pro_price = _to_float(row.get("pro_price"))
+ parking_info = row.get("parking_info")
+ distance = row.get("distance")
+ status_update_time = row.get("status_update_time")
+ schedule_update_time = row.get("schedule_update_time")
+ schedule_items = _parse_schedule(row.get("schedule_json"))
+ piles_detail = _parse_schedule(row.get("piles_detail_json")) # Reuse the same parser
+
+ for i in range(1, len(schedule_items)):
+ curr = schedule_items[i]
+ prev = schedule_items[i - 1]
+ if not isinstance(curr, dict) or not isinstance(prev, dict):
+ continue
+
+ for k in ("price_kwh", "electric_fee_kwh", "service_fee_kwh", "price", "electric_fee", "service_fee"):
+ if curr.get(k) is None and prev.get(k) is not None:
+ curr[k] = prev[k]
+
+ ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=6)
+ ws.row_dimensions[1].height = 40 # Increased title height
+
+ title_cell = ws.cell(row=1, column=1, value=station_name or "场站")
+ title_cell.font = TITLE_FONT
+ title_cell.alignment = Alignment(horizontal="center", vertical="center")
+ # Title border (Optional: bottom medium)
+ for c in range(1, 7):
+ ws.cell(row=1, column=c).border = Border(bottom=MEDIUM_SIDE)
+
+ ws.sheet_properties.tabColor = "4472C4" # Tab color matches theme
+
+ # Layout using _style_info_key_value
+ # Row 3: 位置 | Address
+ _style_info_key_value(ws, 3, 1, 2, merge_val_cols=4)
+ ws.cell(row=3, column=1, value="位置")
+ ws.cell(row=3, column=2, value=address)
+
+ # Row 4: 经纬度 | Coords | 距离 | Distance
+ coord_text = f"{coord_x}, {coord_y}" if coord_x is not None else ""
+ _style_info_key_value(ws, 4, 1, 2, merge_val_cols=1) # 经纬度 occupies col 2-3
+ ws.cell(row=4, column=1, value="经纬度")
+ ws.cell(row=4, column=2, value=coord_text)
+
+ _style_info_key_value(ws, 4, 4, 5, merge_val_cols=1) # 距离 occupies col 5-6
+ ws.cell(row=4, column=4, value="距离")
+ ws.cell(row=4, column=5, value=distance)
+
+ # Row 5: 空闲 | val | 总枪 | val | 停车 | val (Parking info needs more space, let's adjust)
+ # Original: Free(1,2), Total(3,4), Parking(5,6) - Parking info is long usually.
+ # New Layout: Free(1,2), Total(3,4), Parking(5,6) is fine if col 6 is wide.
+ _style_info_key_value(ws, 5, 1, 2)
+ ws.cell(row=5, column=1, value="空闲枪数")
+ ws.cell(row=5, column=2, value=free_guns)
+
+ _style_info_key_value(ws, 5, 3, 4)
+ ws.cell(row=5, column=3, value="总枪数")
+ ws.cell(row=5, column=4, value=total_guns)
+
+ _style_info_key_value(ws, 5, 5, 6)
+ ws.cell(row=5, column=5, value="停车信息")
+ ws.cell(row=5, column=6, value=parking_info)
+
+ # Row 6: Price | val | Pro Price | val | Update Time | val
+ _style_info_key_value(ws, 6, 1, 2)
+ ws.cell(row=6, column=1, value="当前价格")
+ ws.cell(row=6, column=2, value=current_price)
+
+ _style_info_key_value(ws, 6, 3, 4)
+ ws.cell(row=6, column=3, value="PRO会员价")
+ ws.cell(row=6, column=4, value=pro_price)
+
+ _style_info_key_value(ws, 6, 5, 6)
+ ws.cell(row=6, column=5, value="更新时间")
+ ws.cell(row=6, column=6, value=status_update_time)
+
+ # Adjust row heights for info section
+ for r in range(3, 7):
+ ws.row_dimensions[r].height = 24
+
+ # 价格表部分
+ schedule_start_row = 8
+
+ # Section Title with style
+ sect_cell = ws.cell(row=schedule_start_row, column=1, value="价格时段表")
+ sect_cell.font = SUBTITLE_FONT
+ sect_cell.fill = SECTION_FILL
+ sect_cell.border = Border(bottom=THIN_SIDE)
+ ws.merge_cells(start_row=schedule_start_row, start_column=1, end_row=schedule_start_row, end_column=6)
+ # Apply fill to merged cells
+ for c in range(2, 7):
+ ws.cell(row=schedule_start_row, column=c).fill = SECTION_FILL
+ ws.cell(row=schedule_start_row, column=c).border = Border(bottom=THIN_SIDE)
+
+ header_row = schedule_start_row + 1
+ headers = ["开始", "结束", "电价(元/kWh)", "电费(元/kWh)", "服务费(元/kWh)", "备注"]
+ for i, h in enumerate(headers, start=1):
+ ws.cell(row=header_row, column=i, value=h)
+ _apply_table_header_style(ws, header_row, 1, len(headers))
+
+ row_idx = header_row + 1
+
+ # Track last valid values for forward filling
+ last_valid_price = None
+ last_valid_electric = None
+ last_valid_service = None
+
+ for item in schedule_items:
+ if not isinstance(item, dict):
+ continue
+
+ start = item.get("start") or item.get("begin") or item.get("start_time") or ""
+ end = item.get("end") or item.get("finish") or item.get("end_time") or ""
+
+ price = _to_float(item.get("price_kwh") if "price_kwh" in item else item.get("price"))
+ electric_fee = _to_float(item.get("electric_fee_kwh") if "electric_fee_kwh" in item else item.get("electric_fee"))
+ service_fee = _to_float(item.get("service_fee_kwh") if "service_fee_kwh" in item else item.get("service_fee"))
+
+ # Forward fill if None
+ if price is None and last_valid_price is not None:
+ price = last_valid_price
+ if electric_fee is None and last_valid_electric is not None:
+ electric_fee = last_valid_electric
+ if service_fee is None and last_valid_service is not None:
+ service_fee = last_valid_service
+
+ # Update last valid values if current is not None
+ if price is not None:
+ last_valid_price = price
+ if electric_fee is not None:
+ last_valid_electric = electric_fee
+ if service_fee is not None:
+ last_valid_service = service_fee
+
+ remark = item.get("type") or item.get("tag") or item.get("period") or ""
+
+ ws.cell(row=row_idx, column=1, value=start)
+ ws.cell(row=row_idx, column=2, value=end)
+ ws.cell(row=row_idx, column=3, value=price)
+ ws.cell(row=row_idx, column=4, value=electric_fee)
+ ws.cell(row=row_idx, column=5, value=service_fee)
+ ws.cell(row=row_idx, column=6, value=remark)
+ _apply_table_cell_style(ws, row_idx, 1, len(headers), center_cols=[1, 2, 3, 4, 5])
+ row_idx += 1
+
+ # 充电桩详情部分
+ piles_start_row = row_idx + 2
+
+ # Section Title with style
+ sect_cell = ws.cell(row=piles_start_row, column=1, value="充电桩详情")
+ sect_cell.font = SUBTITLE_FONT
+ sect_cell.fill = SECTION_FILL
+ sect_cell.border = Border(bottom=THIN_SIDE)
+ ws.merge_cells(start_row=piles_start_row, start_column=1, end_row=piles_start_row, end_column=6)
+ # Apply fill to merged cells
+ for c in range(2, 7):
+ ws.cell(row=piles_start_row, column=c).fill = SECTION_FILL
+ ws.cell(row=piles_start_row, column=c).border = Border(bottom=THIN_SIDE)
+
+ pile_header_row = piles_start_row + 1
+ pile_headers = ["编号", "功率", "类型", "状态", "价格(元/kWh)", "备注"]
+ for i, h in enumerate(pile_headers, start=1):
+ ws.cell(row=pile_header_row, column=i, value=h)
+ _apply_table_header_style(ws, pile_header_row, 1, len(pile_headers))
+
+ row_idx = pile_header_row + 1
+ if piles_detail:
+ for pile in piles_detail:
+ if not isinstance(pile, dict): continue
+ ws.cell(row=row_idx, column=1, value=pile.get("pile_no") or pile.get("id") or "")
+ ws.cell(row=row_idx, column=2, value=pile.get("power") or "")
+ ws.cell(row=row_idx, column=3, value=pile.get("type") or "")
+ ws.cell(row=row_idx, column=4, value=pile.get("status_text") or pile.get("status") or "")
+ ws.cell(row=row_idx, column=5, value=_to_float(pile.get("price")))
+ ws.cell(row=row_idx, column=6, value=pile.get("remark") or "")
+ _apply_table_cell_style(ws, row_idx, 1, len(pile_headers), center_cols=[1, 2, 3, 4, 5])
+ row_idx += 1
+ else:
+ ws.cell(row=row_idx, column=1, value="暂无详情数据")
+ ws.merge_cells(start_row=row_idx, start_column=1, end_row=row_idx, end_column=6)
+ _apply_table_cell_style(ws, row_idx, 1, len(pile_headers))
+ row_idx += 1
+
+ ws.freeze_panes = ws["A9"]
+ _set_column_widths(ws, {1: 20, 2: 20, 3: 16, 4: 16, 5: 16, 6: 25})
+
+
+def _build_summary_sheet(ws, rows: List[Dict[str, Any]]):
+ ws.title = "场站总览"
+ ws.sheet_properties.tabColor = "4472C4" # Tab color matches theme
+
+ # Row 1: Main Title
+ title_cell = ws.cell(row=1, column=1, value="新电途充电场站数据总览")
+ title_cell.font = TITLE_FONT
+ title_cell.alignment = Alignment(horizontal="center", vertical="center")
+ ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=10)
+ ws.row_dimensions[1].height = 40
+
+ # Row 2: Headers
+ headers = ["场站名称", "地址", "距离", "经度", "纬度", "总枪数", "空闲枪数", "停车信息", "当前价格(元/kWh)", "状态更新时间"]
+ for i, h in enumerate(headers, start=1):
+ ws.cell(row=2, column=i, value=h)
+ _apply_table_header_style(ws, 2, 1, len(headers))
+
+ # Enable AutoFilter
+ ws.auto_filter.ref = f"A2:{get_column_letter(len(headers))}{len(rows) + 2}"
+
+ row_idx = 3
+ for row in rows:
+ ws.cell(row=row_idx, column=1, value=row.get("station_name"))
+ ws.cell(row=row_idx, column=2, value=row.get("address"))
+ ws.cell(row=row_idx, column=3, value=row.get("distance"))
+ ws.cell(row=row_idx, column=4, value=row.get("coord_x"))
+ ws.cell(row=row_idx, column=5, value=row.get("coord_y"))
+ ws.cell(row=row_idx, column=6, value=row.get("total_guns"))
+ ws.cell(row=row_idx, column=7, value=row.get("free_guns"))
+ ws.cell(row=row_idx, column=8, value=row.get("parking_info"))
+ ws.cell(row=row_idx, column=9, value=_to_float(row.get("current_price")))
+ ws.cell(row=row_idx, column=10, value=row.get("status_update_time"))
+ _apply_table_cell_style(ws, row_idx, 1, len(headers), center_cols=[3, 4, 5, 6, 7, 9, 10])
+ row_idx += 1
+
+ _set_column_widths(ws, {1: 35, 2: 45, 3: 12, 4: 14, 5: 14, 6: 12, 7: 12, 8: 35, 9: 20, 10: 22})
+ ws.freeze_panes = ws["A3"]
+
+
+async def export_excel(output_path: str, *, limit: Optional[int] = None) -> str:
+ exporter = DorisExcelExporter(db_url=DB_URL)
+ await exporter.init()
+ try:
+ rows = await exporter.fetch_current_station_rows()
+ finally:
+ await exporter.close()
+
+ if limit is not None:
+ rows = rows[: max(0, int(limit))]
+
+ wb = Workbook()
+
+ if not rows:
+ ws = wb.active
+ ws.title = "无数据"
+ ws.cell(row=1, column=1, value="未查询到任何场站数据")
+ wb.save(output_path)
+ return output_path
+
+ # 1. 创建总览页
+ summary_ws = wb.active
+ _build_summary_sheet(summary_ws, rows)
+
+ # 2. 为每个场站创建独立页
+ existing_titles: Set[str] = {"场站总览"}
+ for row in rows:
+ sheet_title = _safe_excel_sheet_title(str(row.get("station_name") or ""), existing_titles)
+ ws = wb.create_sheet(title=sheet_title)
+ _build_station_sheet(ws, row)
+
+ wb.save(output_path)
+ return output_path
+
+
+async def main():
+ # 配置:默认导出所有数据,如果需要测试少量数据,可以将 None 改为数字,如 10
+ limit = None
+
+ # 构建默认输出路径
+ ts = datetime.now().strftime("%Y%m%d_%H%M%S")
+ output_filename = f"./Excel/station_export_{ts}.xlsx"
+ output_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), output_filename)
+
+ logger.info(f"开始导出 Excel...")
+ logger.info(f"目标文件: {output_path}")
+ if limit is not None:
+ logger.info(f"限制导出记录数: {limit}")
+
+ final_path = await export_excel(output_path, limit=limit)
+ logger.info(f"Excel 导出完成: {final_path}")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
diff --git a/Apps/XinDianTu/Run.py b/Apps/XinDianTu/Run.py
new file mode 100644
index 0000000..ecb1e89
--- /dev/null
+++ b/Apps/XinDianTu/Run.py
@@ -0,0 +1,104 @@
+# coding=utf-8
+import asyncio
+import logging
+import os
+import sys
+
+# 将项目根目录添加到 sys.path
+project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+from Apps.XinDianTu.Service import XinDianTuService
+from Apps.XinDianTu import Opener
+from Apps.XinDianTu import Crawler
+from Apps.XinDianTu import Coord as Y4_Coord
+from Apps.XinDianTu import GetCookie as T2_GetAmapCookie
+
+# 配置日志
+logging.basicConfig(
+ level=logging.INFO,
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
+)
+logger = logging.getLogger("FullProcess")
+
+async def main():
+ logger.info("=== 开始全流程任务: 打开小程序 -> 爬取数据 ===")
+
+ # 步骤 0: 初始化基础服务 (DB等)
+ # 用户要求:程序启动时就完成初始化
+ logger.info(">>> 步骤 0: 初始化基础服务 (数据库连接)...")
+ service = XinDianTuService()
+ await service.init_db()
+
+ try:
+ # 步骤 1: 打开新电途小程序
+ logger.info(">>> 步骤 1: 启动新电途小程序...")
+ try:
+ # 调用 Y2 的 open_mini_program 函数
+ success = await Opener.open_mini_program()
+ if not success:
+ logger.error("❌ 无法成功打开新电途小程序,任务终止。")
+ return
+ except Exception as e:
+ logger.error(f"❌ 步骤 1 执行异常: {e}")
+ return
+
+ logger.info("✅ 小程序启动成功,等待 5 秒确保界面稳定...")
+ await asyncio.sleep(5)
+
+ # 步骤 2: 执行爬取任务
+ logger.info(">>> 步骤 2: 开始执行场站爬取任务...")
+ try:
+ # 调用 Y3 的 main 函数,传入已初始化的 service
+ # 传入 do_cleanup=False,因为已在步骤 0 完成清理
+ success = await Crawler.main(service=service, do_cleanup=False)
+ if not success:
+ logger.error("❌ 步骤 2 爬取任务失败,终止后续步骤。")
+ return
+ except Exception as e:
+ logger.error(f"❌ 步骤 2 执行异常: {e}")
+ return
+
+ # 步骤 3: 补全坐标 (调用 Y4_Coord)
+ logger.info(">>> 步骤 3: 启动高德地图坐标回填任务...")
+ try:
+ # 首次尝试,开启 Cookie 检查
+ await Y4_Coord.main(check_cookie_first=True)
+ except Y4_Coord.CookieInvalidError:
+ logger.warning("⚠️ 检测到高德地图 Cookie 失效或缺失。")
+ logger.info(">>> 正在启动 Cookie 获取工具 (T2)...")
+ logger.info("请在弹出的浏览器窗口中完成登录,然后在控制台按回车确认。")
+
+ # 调用同步的 T2 工具
+ # 由于 T2 包含 input() 阻塞,且这是客户端脚本,直接调用即可
+ try:
+ # 传入 force=True 跳过“文件已存在”的询问,因为我们确定它无效
+ # run_in_executor 用于避免完全阻塞事件循环(虽然在这里影响不大)
+ loop = asyncio.get_event_loop()
+ success = await loop.run_in_executor(None, T2_GetAmapCookie.run_login_tool, True)
+
+ if success:
+ logger.info("✅ Cookie 更新成功,正在重新启动坐标回填任务...")
+ # 再次尝试执行,这次可以跳过检查(刚获取完)或者继续检查
+ await Y4_Coord.main(check_cookie_first=False)
+ else:
+ logger.error("❌ Cookie 获取失败或用户取消,跳过坐标回填步骤。")
+ except Exception as e:
+ logger.error(f"❌ 调用 T2 工具失败: {e}")
+ except Exception as e:
+ logger.error(f"❌ 步骤 3 执行异常: {e}")
+
+ finally:
+ # 确保数据库连接关闭
+ if service:
+ await service.close_db()
+ logger.info("=== 全流程任务结束 ===")
+
+if __name__ == "__main__":
+ try:
+ asyncio.run(main())
+ except KeyboardInterrupt:
+ logger.info("程序被用户中断.")
+ except Exception as e:
+ logger.exception(f"主程序崩溃: {e}")
diff --git a/Apps/XinDianTu/Service.py b/Apps/XinDianTu/Service.py
new file mode 100644
index 0000000..d5b0505
--- /dev/null
+++ b/Apps/XinDianTu/Service.py
@@ -0,0 +1,518 @@
+import hashlib
+import os
+import sys
+import uuid
+import logging
+import json
+import re
+from datetime import datetime, timedelta
+
+# Ensure sys path includes root for imports if not already
+project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+from sqlalchemy import text
+from Util.XinDianTuReadImageKit import XinDianTuReadImageKit
+from DbKit.Db import Db
+from Config.Config import DB_URL
+from Model.StationProfile import StationProfile
+from Model.StationStatus import StationStatus
+from Model.StationPriceSchedule import StationPriceSchedule
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+class XinDianTuService:
+ def __init__(self):
+ self.db = Db(db_url=DB_URL)
+ self.station_profile_model = StationProfile()
+ self.station_status_model = StationStatus()
+ self.station_price_schedule_model = StationPriceSchedule()
+ self.operator = "新电途"
+
+ def generate_id(self):
+ return str(uuid.uuid4())
+
+ def get_hash(self, s: str) -> str:
+ return hashlib.md5(s.encode('utf-8')).hexdigest()
+
+ async def init_db(self):
+ await self.db.init_db()
+
+ async def close_db(self):
+ await self.db.close()
+
+ async def process_station_list_vl(self, vl_image_url, json_metadata, device_info=None) -> list:
+ """
+ 基于 VL 模式处理场站列表
+ """
+ station_list = await XinDianTuReadImageKit.parse_vl_image(vl_image_url, json_metadata, device_info=device_info)
+ if not station_list:
+ return []
+
+ processed_stations = []
+ async with await self.db.get_session() as session:
+ for station in station_list:
+ name = station.get("station_name")
+ if not name:
+ continue
+
+ # 过滤逻辑 (复用)
+ # if any(keyword in name for keyword in STATION_NAME_IGNORE_KEYWORDS):
+ # continue
+
+ station_hash = self.get_hash(name)
+ now = datetime.now()
+ station["station_hash"] = station_hash
+
+ # 1. 保存 Profile
+ profile_id = self.generate_id()
+ await self.station_profile_model.save(
+ session=session,
+ id=profile_id,
+ station_hash=station_hash,
+ operator=self.operator,
+ station_name=name,
+ valid_start_time=now
+ )
+ station["profile_id"] = profile_id
+ station["valid_start_time"] = now.isoformat()
+
+ # 2. 保存 Status (解析价格和电桩)
+ status_id = self.generate_id()
+
+ # 处理 piles 字段
+ piles_data = station.get("piles")
+ total, free = 0, 0
+ standardized_piles = []
+
+ if isinstance(piles_data, list):
+ # 如果是列表,计算总数并标准化结构
+ for idx, p in enumerate(piles_data):
+ try:
+ t = int(p.get("total", 0))
+ f = int(p.get("free", 0))
+ total += t
+ free += f
+
+ # 构造符合 ExportExcel 期望的结构
+ standardized_piles.append({
+ "pile_no": f"G{idx+1}",
+ "type": p.get("type", "未知"),
+ "power": "", # 暂无功率信息
+ "status_text": f"空闲{f}/总{t}",
+ "remark": "AI聚合数据"
+ })
+ except:
+ pass
+ else:
+ # Fallback: 如果不是列表(可能是字符串)
+ piles_str = str(piles_data) if piles_data else "0/0"
+
+ nums = re.findall(r"\d+", piles_str)
+ if len(nums) >= 2:
+ v1 = int(nums[-2])
+ v2 = int(nums[-1])
+ if v2 >= v1:
+ free = v1
+ total = v2
+ else:
+ free = v2
+ total = v1
+
+ # 构造一条记录用于 Excel 展示
+ standardized_piles.append({
+ "pile_no": "-",
+ "type": "未知",
+ "status_text": piles_str,
+ "remark": "原始识别文本"
+ })
+
+ price_str = station.get("price", "")
+ current_price = None
+ try:
+ price_match = re.search(r"\d+\.\d+", str(price_str))
+ if price_match:
+ current_price = float(price_match.group())
+ except: pass
+
+ await self.station_status_model.save(
+ session=session,
+ id=status_id,
+ station_hash=station_hash,
+ total_piles=total,
+ free_piles=free,
+ piles_detail_json=standardized_piles,
+ current_price=current_price,
+ pro_price=station.get("pro_price"),
+ parking_info=station.get("parking"),
+ distance=station.get("distance"),
+ valid_start_time=now
+ )
+ station["status_id"] = status_id
+ station["total_piles"] = total
+ station["free_piles"] = free
+ station["current_price"] = current_price
+
+ processed_stations.append(station)
+
+ await session.commit()
+ return processed_stations
+
+ async def process_station_list_hybrid(self, local_image_path: str, uploader, cdn_domain) -> list:
+ """
+ 混合模式处理场站列表 (图形学切片 + OCR)
+ """
+ station_list = await XinDianTuReadImageKit.parse_hybrid_image(local_image_path, uploader, cdn_domain)
+ if not station_list:
+ return []
+
+ processed_stations = []
+ async with await self.db.get_session() as session:
+ for station in station_list:
+ name = station.get("station_name")
+ if not name:
+ continue
+
+ station_hash = self.get_hash(name)
+ now = datetime.now()
+ station["station_hash"] = station_hash
+
+ # 1. 保存 Profile
+ profile_id = self.generate_id()
+ await self.station_profile_model.save(
+ session=session,
+ id=profile_id,
+ station_hash=station_hash,
+ operator=self.operator,
+ station_name=name,
+ valid_start_time=now
+ )
+ station["profile_id"] = profile_id
+ station["valid_start_time"] = now.isoformat()
+
+ # 2. 保存 Status (解析价格和电桩)
+ status_id = self.generate_id()
+ piles_str = station.get("piles", "0/0")
+ total, free = 0, 0
+ standardized_piles = []
+
+ if "/" in piles_str:
+ try:
+ parts = piles_str.split("/")
+ free = int(parts[0])
+ total = int(parts[1])
+ standardized_piles.append({
+ "pile_no": "G1",
+ "type": "未知",
+ "power": "",
+ "status_text": f"空闲{free}/总{total}",
+ "remark": "混合模式解析"
+ })
+ except: pass
+
+ price_str = station.get("price", "")
+ current_price = None
+ try:
+ price_match = re.search(r"\d+\.\d+", str(price_str))
+ if price_match:
+ current_price = float(price_match.group())
+ except: pass
+
+ await self.station_status_model.save(
+ session=session,
+ id=status_id,
+ station_hash=station_hash,
+ total_piles=total,
+ free_piles=free,
+ piles_detail_json=standardized_piles if standardized_piles else None,
+ current_price=current_price,
+ parking_info=station.get("parking"),
+ valid_start_time=now
+ )
+ station["status_id"] = status_id
+ station["total_piles"] = total
+ station["free_piles"] = free
+ station["current_price"] = current_price
+
+ processed_stations.append(station)
+
+ await session.commit()
+ return processed_stations
+
+ async def process_station_list(self, list_url: str, device_info: dict = None) -> list:
+ station_list = await XinDianTuReadImageKit.parse_first_level_image_url(list_url, device_info=device_info)
+ if not station_list:
+ return []
+
+ processed_stations = []
+ async with await self.db.get_session() as session:
+ for station in station_list:
+ name = station.get("station_name")
+ if not name:
+ continue
+
+
+ station_hash = self.get_hash(name)
+ now = datetime.now()
+ station["station_hash"] = station_hash
+ address = station.get("address")
+
+ profile_id = self.generate_id()
+ await self.station_profile_model.save(
+ session=session,
+ id=profile_id,
+ station_hash=station_hash,
+ operator=self.operator,
+ station_name=name,
+ address=address,
+ valid_start_time=now
+ )
+ station["profile_id"] = profile_id
+ station["valid_start_time"] = now.isoformat()
+
+ status_id = self.generate_id()
+ piles_info = station.get("piles", [])
+
+ total = 0
+ free = 0
+ if isinstance(piles_info, list):
+ for p in piles_info:
+ if isinstance(p, dict):
+ try:
+ total += int(p.get("total", 0))
+ free += int(p.get("free", 0))
+ except (ValueError, TypeError):
+ pass
+ elif isinstance(piles_info, dict):
+ try:
+ total = int(piles_info.get("total", 0))
+ free = int(piles_info.get("free", 0))
+ except (ValueError, TypeError):
+ total = 0
+ free = 0
+
+ # 过滤掉总枪数为 0 的错误数据
+ if total <= 0:
+ logger.warning(f"跳过场站 {name}: 总枪数为 0 (疑似识别错误或数据无效)")
+ continue
+
+ price = station.get("price")
+ current_price = None
+ if price is not None and price != "":
+ try:
+ current_price = float(price)
+ except (ValueError, TypeError):
+ current_price = None
+
+ pro_price_val = station.get("pro_price")
+ pro_price = None
+ if pro_price_val is not None and pro_price_val != "":
+ try:
+ pro_price = float(pro_price_val)
+ except (ValueError, TypeError):
+ pro_price = None
+
+ await self.station_status_model.save(
+ session=session,
+ id=status_id,
+ station_hash=station_hash,
+ total_piles=total,
+ free_piles=free,
+ piles_detail_json=piles_info,
+ current_price=current_price,
+ pro_price=pro_price,
+ valid_start_time=now
+ )
+ station["status_id"] = status_id
+ station["total_piles"] = total
+ station["free_piles"] = free
+ station["current_price"] = current_price
+
+ processed_stations.append(station)
+
+ await session.commit()
+
+ return processed_stations
+
+ async def process_station_address(self, station_name: str, detail_url: str, device_info: dict = None) -> dict:
+ logger.info(f"\n[Service] Processing Address for '{station_name}' from: {detail_url}")
+
+ address_data = await XinDianTuReadImageKit.parse_address(station_name, detail_url, device_info=device_info)
+ address = address_data.get("address")
+ if address:
+ address = address.strip()
+
+ # 尝试获取完整场站名称
+ full_name = address_data.get("full_station_name")
+ final_name = station_name
+ if full_name:
+ full_name = full_name.strip()
+ # 只有当完整名称存在且与原名称不同时才使用
+ if full_name and full_name != station_name:
+ logger.info(f" - Found Full Name: {full_name} (Original: {station_name})")
+ final_name = full_name
+
+ if address:
+ logger.info(f" - Found Address: {address}")
+ station_hash = self.get_hash(station_name) # Hash 必须基于原名称(列表名称)保持一致,以便索引
+
+ async with await self.db.get_session() as session:
+ updated = await self.station_profile_model.backfill_address_if_missing(
+ session=session,
+ station_hash=station_hash,
+ station_name=final_name, # 更新为完整名称
+ address=address
+ )
+ if updated > 0:
+ logger.info(f" - Backfilled address and full name into {updated} profile record(s).")
+ else:
+ now = datetime.now()
+ profile_id = self.generate_id()
+ await self.station_profile_model.save(
+ session=session,
+ id=profile_id,
+ station_hash=station_hash,
+ operator=self.operator,
+ station_name=final_name, # 使用完整名称
+ address=address,
+ coord_x=None,
+ coord_y=None,
+ valid_start_time=now
+ )
+ logger.info(" - Inserted/Updated profile record with full name.")
+ await session.commit()
+ else:
+ logger.warning(f" - Address is empty (likely incomplete screenshot). Skipping profile update. Data: {address_data}")
+
+ return address_data
+
+ async def record_station_status(self, station_info: dict):
+ """
+ 记录场站状态信息(从列表页抓取到的电桩、价格等)
+ """
+ name = station_info.get("station_name")
+ if not name:
+ return
+
+ station_hash = self.get_hash(name)
+ now = datetime.now()
+
+ # 1. 保存/更新 Profile (基础信息)
+ async with await self.db.get_session() as session:
+ profile_id = self.generate_id()
+ await self.station_profile_model.save(
+ session=session,
+ id=profile_id,
+ station_hash=station_hash,
+ operator=self.operator,
+ station_name=name,
+ valid_start_time=now
+ )
+
+ # 2. 保存 Status
+ status_id = self.generate_id()
+
+ # 解析电桩数量 (支持多组,如 "快:2/10 慢:1/5")
+ piles_str = station_info.get("piles", "")
+ total, free = 0, 0
+ standardized_piles = []
+
+ # 尝试匹配 "快:2/10" 或 "2/10" 这种格式
+ # 模式 1: 有类型,如 "快:2/10"
+ matches_with_type = re.findall(r"(\w+):(\d+)/(\d+)", piles_str)
+ if matches_with_type:
+ for idx, (p_type, f, t) in enumerate(matches_with_type):
+ f_int, t_int = int(f), int(t)
+ free += f_int
+ total += t_int
+ standardized_piles.append({
+ "pile_no": f"G{idx+1}",
+ "type": p_type,
+ "power": "",
+ "status_text": f"空闲{f_int}/总{t_int}",
+ "remark": "列表页OCR"
+ })
+ else:
+ # 模式 2: 无类型,仅 "2/10"
+ matches_simple = re.findall(r"(\d+)/(\d+)", piles_str)
+ for idx, (f, t) in enumerate(matches_simple):
+ f_int, t_int = int(f), int(t)
+ free += f_int
+ total += t_int
+ standardized_piles.append({
+ "pile_no": f"G{idx+1}",
+ "type": "未知",
+ "power": "",
+ "status_text": f"空闲{f_int}/总{t_int}",
+ "remark": "列表页OCR"
+ })
+
+ if not standardized_piles:
+ # 兜底匹配所有数字
+ nums = re.findall(r"(\d+)", piles_str)
+ if len(nums) >= 2:
+ free = int(nums[0])
+ total = int(nums[1])
+ standardized_piles.append({
+ "pile_no": "G1",
+ "type": "未知",
+ "power": "",
+ "status_text": f"空闲{free}/总{total}",
+ "remark": "列表页OCR兜底"
+ })
+
+ # 解析价格
+ price_val = station_info.get("price")
+ current_price = None
+ if price_val:
+ try:
+ # 提取数字部分
+ price_match = re.search(r"(\d+(\.\d+)?)", str(price_val))
+ if price_match:
+ current_price = float(price_match.group(1))
+ except:
+ pass
+
+ await self.station_status_model.save(
+ session=session,
+ id=status_id,
+ station_hash=station_hash,
+ total_piles=total,
+ free_piles=free,
+ piles_detail_json=standardized_piles,
+ current_price=current_price,
+ pro_price=None, # 列表页暂不解析 PRO 价
+ parking_info=station_info.get("parking_info"),
+ distance=station_info.get("distance"),
+ valid_start_time=now
+ )
+ await session.commit()
+ logger.info(f" - Station status recorded for: {name} (Piles: {free}/{total}, Price: {current_price})")
+
+ async def process_price_schedule(self, station_name: str, schedule_urls: list, device_info: dict = None):
+ logger.info(f"\n[Service] Processing Price Schedule for '{station_name}'")
+
+ rows = await XinDianTuReadImageKit.parse_price_schedule_multi(station_name, schedule_urls, device_info=device_info)
+ hourly_schedule = XinDianTuReadImageKit.hourly_full_day(rows)
+
+ if hourly_schedule:
+ logger.info(f" - Got {len(hourly_schedule)} hourly records.")
+ station_hash = self.get_hash(station_name)
+ now = datetime.now()
+ schedule_id = self.generate_id()
+
+ async with await self.db.get_session() as session:
+ await self.station_price_schedule_model.save(
+ session=session,
+ id=schedule_id,
+ station_hash=station_hash,
+ schedule_json=hourly_schedule,
+ valid_start_time=now
+ )
+ await session.commit()
+ logger.info(" - Schedule record saved.")
+ else:
+ logger.info(" - Failed to parse schedule.")
diff --git a/Apps/XinDianTu/Templates/ad_close_x.jpg b/Apps/XinDianTu/Templates/ad_close_x.jpg
new file mode 100644
index 0000000..eac5b0d
Binary files /dev/null and b/Apps/XinDianTu/Templates/ad_close_x.jpg differ
diff --git a/Apps/XinDianTu/__pycache__/Coord.cpython-310.pyc b/Apps/XinDianTu/__pycache__/Coord.cpython-310.pyc
new file mode 100644
index 0000000..f4407aa
Binary files /dev/null and b/Apps/XinDianTu/__pycache__/Coord.cpython-310.pyc differ
diff --git a/Apps/XinDianTu/__pycache__/Crawler.cpython-310.pyc b/Apps/XinDianTu/__pycache__/Crawler.cpython-310.pyc
new file mode 100644
index 0000000..f042670
Binary files /dev/null and b/Apps/XinDianTu/__pycache__/Crawler.cpython-310.pyc differ
diff --git a/Apps/XinDianTu/__pycache__/GetCookie.cpython-310.pyc b/Apps/XinDianTu/__pycache__/GetCookie.cpython-310.pyc
new file mode 100644
index 0000000..777471d
Binary files /dev/null and b/Apps/XinDianTu/__pycache__/GetCookie.cpython-310.pyc differ
diff --git a/Apps/XinDianTu/__pycache__/Opener.cpython-310.pyc b/Apps/XinDianTu/__pycache__/Opener.cpython-310.pyc
new file mode 100644
index 0000000..66a0299
Binary files /dev/null and b/Apps/XinDianTu/__pycache__/Opener.cpython-310.pyc differ
diff --git a/Apps/XinDianTu/__pycache__/Run.cpython-310.pyc b/Apps/XinDianTu/__pycache__/Run.cpython-310.pyc
new file mode 100644
index 0000000..c5e0116
Binary files /dev/null and b/Apps/XinDianTu/__pycache__/Run.cpython-310.pyc differ
diff --git a/Apps/XinDianTu/__pycache__/Service.cpython-310.pyc b/Apps/XinDianTu/__pycache__/Service.cpython-310.pyc
new file mode 100644
index 0000000..78238e7
Binary files /dev/null and b/Apps/XinDianTu/__pycache__/Service.cpython-310.pyc differ
diff --git a/Config/Config.py b/Config/Config.py
new file mode 100644
index 0000000..46974e0
--- /dev/null
+++ b/Config/Config.py
@@ -0,0 +1,84 @@
+# 开发环境不同,配置信息不同
+# Doris V4
+# DORIS_HOST = "10.10.14.204"
+# DORIS_PORT = 9030
+# DORIS_FENODES = "10.10.14.204:8030"
+# REDIS_HOST = '10.10.14.14'
+# REDIS_PASSWORD = None # 如果没有密码则设为 None
+DORIS_HOST = "www.hzkjai.com"
+DORIS_PORT = 27025
+DORIS_FENODES = "www.hzkjai.com:27024"
+REDIS_HOST = '127.0.0.1'
+REDIS_PASSWORD = "DsideaL147258369"
+
+# 采集配置
+# 滑动距离比例 (0.1 ~ 0.9),数值越大滑动幅度越大,建议 0.3-0.5 以避免错过中间内容
+SCROLL_DISTANCE_RATIO = 0.3
+# 最大滑动/翻页次数,达到此次数后停止采集
+MAX_SCROLLS = 100
+# 默认抓取半径(公里),当检测到场站距离超过此值时停止采集
+MAX_CRAWL_DISTANCE = 50
+# 场站去重过期时间(秒),在此时间内重复出现的场站不会再次点击进入详情页
+REDIS_STATION_EXPIRE = 120
+
+# 数据库数据保留时长(天),超过此时长的历史数据(is_current=0)将被删除
+DATA_RETENTION_DAYS = 365
+
+# 等待时间配置 (秒)
+# 点击进入详情页后等待加载的时间
+WAIT_DETAIL_PAGE_LOAD = 2.5
+# 从详情页返回列表页后等待页面刷新的时间
+WAIT_BACK_TO_LIST = 1.5
+# 执行滑动操作后等待页面内容加载和稳定的时间
+WAIT_AFTER_SCROLL = 3.0
+
+# 坐标计算与安全防护
+# 屏幕顶部安全排除比例 (0.0~1.0),此比例区域内不进行点击(避开状态栏、筛选栏等)
+SAFE_EXCLUDE_RATIO = 0.20
+# 屏幕底部安全排除比例 (0.0~1.0),此比例区域内不进行点击(避开底部导航栏、功能按钮等)
+BOTTOM_SAFE_EXCLUDE_RATIO = 0.1
+# 默认回退屏幕宽度,当无法自动获取设备信息时使用
+FALLBACK_WIDTH = 1080
+# 默认回退屏幕高度,当无法自动获取设备信息时使用
+FALLBACK_HEIGHT = 2400
+
+# 视觉模型配置
+VL_MODEL_NAME = "qwen3-vl-flash"
+VL_MODEL_NAME_AD = "qwen-vl-max"
+
+
+# 华为云配置
+OBS_AK = "WAFBGJACKDOQZDH1MKZ1"
+OBS_SK = "dlWTUbqgCICaYJG3n0Rot4jXaen2HnfFtMVxiPEo"
+OBS_SERVER = "obs.cn-north-1.myhuaweicloud.com"
+OBS_BUCKET = "dsideal"
+OBS_CLOUD_PREFIX = "dsAi/cloudFiles"
+OBS_TMP_PREFIX = "dsAi/tmpFiles"
+CDN_DOMAIN = "video.edusoa.com"
+
+# 阿里云API信息【YLT】
+ALY_LLM_API_KEY = "sk-f6da0c787eff4b0389e4ad03a35a911f"
+ALY_LLM_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
+ALY_LLM_MODEL_NAME = "deepseek-v3.2"
+
+
+# Doris其它配置信息
+DORIS_USER = "root"
+DORIS_PWD = "DsideaL147258369"
+DORIS_DATABASE = "yltcharge"
+DB_URL = f"mysql+aiomysql://{DORIS_USER}:{DORIS_PWD}@{DORIS_HOST}:{DORIS_PORT}/{DORIS_DATABASE}?charset=utf8mb4"
+doris = {
+ "url": f"jdbc:mysql://{DORIS_HOST}:{DORIS_PORT}/{DORIS_DATABASE}?rewriteBatchedStatements=true&batchsize=1000&serverTimezone=Asia/Shanghai",
+ "user": DORIS_USER,
+ "pwd": DORIS_PWD,
+ "fenodes": DORIS_FENODES,
+ "database": DORIS_DATABASE
+}
+
+
+# REDIS 配置
+REDIS_DB = 2
+REDIS_DECODE_RESPONSES = True
+REDIS_PORT = 18890
+REDIS_MAX_CONNECTIONS = 200
+
diff --git a/Config/__pycache__/Config.cpython-310.pyc b/Config/__pycache__/Config.cpython-310.pyc
new file mode 100644
index 0000000..322a907
Binary files /dev/null and b/Config/__pycache__/Config.cpython-310.pyc differ
diff --git a/Config/__pycache__/Config.cpython-313.pyc b/Config/__pycache__/Config.cpython-313.pyc
new file mode 100644
index 0000000..8431dab
Binary files /dev/null and b/Config/__pycache__/Config.cpython-313.pyc differ
diff --git a/Core/BaseCrawler.py b/Core/BaseCrawler.py
new file mode 100644
index 0000000..4ba68a9
--- /dev/null
+++ b/Core/BaseCrawler.py
@@ -0,0 +1,41 @@
+# coding=utf-8
+import abc
+import logging
+
+class BaseCrawler(abc.ABC):
+ """
+ 所有小程序爬虫的基类。
+ 定义了标准的生命周期方法。
+ """
+
+ def __init__(self, service=None):
+ self.logger = logging.getLogger(self.__class__.__name__)
+ self.service = service
+
+ @abc.abstractmethod
+ async def start(self):
+ """
+ 启动爬虫的主入口。
+ """
+ pass
+
+ @abc.abstractmethod
+ async def open_app(self):
+ """
+ 打开目标小程序。
+ """
+ pass
+
+ @abc.abstractmethod
+ async def crawl_list(self):
+ """
+ 爬取列表页。
+ """
+ pass
+
+ @abc.abstractmethod
+ async def crawl_detail(self, station_info):
+ """
+ 爬取详情页。
+ """
+ pass
diff --git a/Core/__pycache__/BaseCrawler.cpython-310.pyc b/Core/__pycache__/BaseCrawler.cpython-310.pyc
new file mode 100644
index 0000000..53b9ad9
Binary files /dev/null and b/Core/__pycache__/BaseCrawler.cpython-310.pyc differ
diff --git a/DbKit/Db.py b/DbKit/Db.py
new file mode 100644
index 0000000..a4ffd37
--- /dev/null
+++ b/DbKit/Db.py
@@ -0,0 +1,1205 @@
+import os
+import logging
+import re
+from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy.sql import text
+
+import Config
+from DbKit.SqlTemplateLoader import SqlTemplateLoader
+from DbKit.TransactionContext import TransactionContext
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+
+class Db:
+ """通用数据库操作封装类,提供数据库连接和操作功能"""
+ # 单例实例
+ _instance = None
+
+ def __new__(cls, db_url=None, sql_dir=None):
+ """确保Db类只有一个实例(异步版本)"""
+ if cls._instance is None:
+ cls._instance = super(Db, cls).__new__(cls)
+ # 初始化数据库连接
+ cls._instance.engine = None
+ cls._instance.AsyncSessionLocal = None
+ cls._instance.db_url = db_url
+ cls._instance.sql_dir = sql_dir or os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Sql')
+
+ # 初始化SQL模板加载器
+ cls._instance.sql_loader = SqlTemplateLoader(cls._instance.sql_dir, auto_load=False)
+ # 添加标志表示SQL模板尚未加载
+ cls._instance._templates_loaded = False
+ return cls._instance
+
+ def __init__(self, db_url=None, sql_dir=None):
+ """初始化数据库操作类
+
+ Args:
+ db_url: 数据库连接URL,不提供时将使用默认配置
+ sql_dir: SQL模板文件目录,不提供时将使用默认目录
+ """
+ # 单例模式下,初始化只会在第一次创建实例时执行
+ # 这里可以为空,因为实际初始化在__new__中完成
+ self.sql_dir = sql_dir
+ self.db_url = db_url
+
+ async def init_db(self, db_url=None):
+ """
+ 初始化数据库连接(异步版本)
+
+ Args:
+ db_url: 数据库连接URL,优先级高于初始化时提供的URL
+ """
+ # 确定使用的数据库连接URL
+ final_url = db_url or self.db_url
+ if not final_url:
+ # 如果没有提供URL,使用配置文件中的参数构建连接URL
+ from Config import POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE
+ # 转换为异步连接URL
+ final_url = f"postgresql+asyncpg://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DATABASE}"
+ else:
+ # 如果是同步URL,转换为异步URL
+ if final_url.startswith("postgresql://"):
+ final_url = final_url.replace("postgresql://", "postgresql+asyncpg://")
+
+ # 创建异步数据库引擎
+ self.engine = create_async_engine(final_url)
+
+ # 创建异步会话工厂
+ self.AsyncSessionLocal = sessionmaker(
+ class_=AsyncSession,
+ autocommit=False,
+ autoflush=False,
+ bind=self.engine
+ )
+
+ # 检查Redis中是否已经加载了SQL模板
+ templates_loaded_in_redis = await self.sql_loader._check_templates_loaded_from_redis()
+
+ # 如果Redis中有加载的模板,直接从Redis加载
+ if templates_loaded_in_redis:
+ try:
+ await self.sql_loader._load_from_redis()
+ self._templates_loaded = True
+ logger.info(f"从Redis加载SQL模板完成,共{len(self.sql_loader._loaded_files)}个文件,{len(self.sql_loader._template_map)}个模板")
+ except Exception as e:
+ logger.error(f"从Redis加载SQL模板失败: {str(e)}")
+ # 不抛出异常,允许继续执行
+ pass
+ # 如果Redis中没有,且内存中也没有加载过,执行正常加载流程
+ elif not getattr(self, '_templates_loaded', False):
+ try:
+ await self.load_all_templates()
+ self._templates_loaded = True
+
+ # 获取并记录SQL模板统计信息
+ loaded_files = len(self.sql_loader._loaded_files)
+ template_count = 0
+ for namespace, templates in self.sql_loader.templates.items():
+ template_count += len(templates)
+ logger.info(f"SQL模板加载完成,共加载{loaded_files}个文件,{template_count}个模板")
+ except Exception as e:
+ logger.error(f"加载SQL模板失败: {str(e)}")
+ # 不抛出异常,允许数据库操作继续进行
+ pass
+
+ async def get_session(self):
+ """获取数据库会话(异步版本)
+
+ Returns:
+ AsyncSession: 异步数据库会话对象
+ """
+ if self.AsyncSessionLocal is None:
+ await self.init_db()
+ return self.AsyncSessionLocal()
+
+ async def close(self):
+ if hasattr(self, "engine") and self.engine is not None:
+ try:
+ await self.engine.dispose()
+ finally:
+ self.engine = None
+ self.AsyncSessionLocal = None
+
+ async def load_all_templates(self):
+ """异步加载所有SQL模板
+
+ Returns:
+ self: 支持链式调用
+ """
+ await self.sql_loader.load_all_templates()
+ return self
+
+ def _is_sql_template(self, sql_input):
+ """
+ 判断输入的带点字符串是SQL模板还是SQL语句
+
+ Args:
+ sql_input: 输入的字符串,可能是SQL模板名称或SQL语句
+
+ Returns:
+ bool: 如果是SQL模板返回True,如果是SQL语句返回False
+ """
+ # 如果输入不是字符串或者不包含点号,直接判定为SQL语句
+ if not isinstance(sql_input, str) or '.' not in sql_input:
+ return False
+
+ # 检查sql_loader是否存在且已初始化
+ if not hasattr(self, 'sql_loader') or not self.sql_loader:
+ return False
+
+ # 检查模板映射是否存在
+ if not hasattr(self.sql_loader, '_template_map') or not self.sql_loader._template_map:
+ return False
+
+ # 在模板映射中查找,如果找到就是SQL模板,否则是SQL语句
+ is_template = sql_input in self.sql_loader._template_map
+ logger.debug(f"输入 '{sql_input}' 在模板映射中查找结果: {is_template}")
+
+ return is_template
+
+ async def get_sql(self, sql_identifier, params=None):
+ """获取指定名称的SQL模板,并处理参数替换
+
+ Args:
+ sql_identifier: 格式为'namespace.template_name'的SQL标识符
+ params: 可选的参数字典,用于替换模板中的参数
+
+ Returns:
+ str: 处理后的SQL语句
+ """
+ # logger.info(f"尝试获取SQL模板: {sql_identifier}")
+ sql_template = await self.sql_loader.get_sql(sql_identifier)
+
+ # 处理模板,即使没有提供参数也进行处理(清理条件块等)
+ processed_sql = self._process_sql_template(sql_template, params)
+ logger.debug(f"处理后的SQL语句: {processed_sql}")
+ return processed_sql
+
+ def _process_sql_template(self, sql_template, params=None):
+ """
+ 处理SQL模板中的条件判断和参数替换
+
+ Args:
+ sql_template: SQL模板字符串
+ params: 参数字典
+
+ Returns:
+ str: 处理后的SQL语句
+ """
+ if params is None:
+ params = {}
+
+ # 检查是否包含#if条件块
+ if_matches = re.findall(r'#if\([^)]+\)', sql_template)
+ logger.debug(f"发现 {len(if_matches)} 个#if条件块")
+ for i, match in enumerate(if_matches, 1):
+ logger.debug(f" {i}. {match}")
+
+ # 检查是否包含ORDER BY子句
+ if 'ORDER BY' in sql_template:
+ logger.debug("SQL模板包含ORDER BY子句")
+
+ processed_sql = sql_template
+
+ # 处理#if条件判断
+ # 修复正则表达式,确保正确匹配条件块
+ if_pattern = r'#if\((\w+)\)([\s\S]*?)#end'
+
+ # 使用finditer来获取匹配的位置信息
+ matches = list(re.finditer(if_pattern, processed_sql))
+
+ # 从后向前替换,避免位置偏移问题
+ for match in reversed(matches):
+ param_name = match.group(1)
+ sql_block = match.group(2)
+
+ # 检查参数是否存在且不为None
+ if param_name in params and params[param_name] is not None:
+ # 如果条件为真,保留SQL块
+ # 移除多余的空白行和缩进
+ lines = sql_block.strip().split('\n')
+ cleaned_lines = [line.strip() for line in lines if line.strip()]
+ cleaned_block = '\n'.join(cleaned_lines)
+
+ # 替换原始匹配的内容
+ processed_sql = processed_sql[:match.start()] + cleaned_block + processed_sql[match.end():]
+
+ logger.debug(f"保留条件块 #if({param_name}),内容: {cleaned_block}")
+ else:
+ # 如果条件为假,移除整个条件块
+ processed_sql = processed_sql[:match.start()] + "" + processed_sql[match.end():]
+ logger.debug(f"移除条件块 #if({param_name})")
+
+ # 创建参数字典的副本,用于存储处理后的参数
+ if params is not None:
+ processed_params = params.copy()
+ else:
+ processed_params = {}
+
+ # 处理参数替换 - 支持直接的变量名格式
+ # 首先找出所有可能的参数占位符(#para格式和直接变量名格式)
+ # 处理#para格式的参数
+ para_pattern = r'#para\((\w+)\)'
+ all_para_placeholders = re.findall(para_pattern, processed_sql)
+
+ # 替换#para格式的参数
+ for param_name in all_para_placeholders:
+ placeholder = f"#para({param_name})"
+ if placeholder in processed_sql and param_name in params and params[param_name] is not None:
+ # 检查参数是否为列表类型且用于IN操作
+ if isinstance(params[param_name], (list, tuple)) and "in" in processed_sql.lower():
+ logger.debug(f"检测到列表参数 {param_name} 用于IN操作,进行特殊处理")
+ # 为列表中的每个元素创建单独的参数
+ list_values = params[param_name]
+ if list_values: # 确保列表不为空
+ # 生成多个占位符,如 :idList_1, :idList_2, :idList_3
+ placeholders = ', '.join([f":{param_name}_{i}" for i in range(len(list_values))])
+ processed_sql = processed_sql.replace(placeholder, placeholders)
+ # 更新参数字典,添加每个列表元素的参数
+ for i, value in enumerate(list_values):
+ processed_params[f"{param_name}_{i}"] = value
+ logger.debug(f"为列表参数 {param_name} 创建子参数 {param_name}_{i} = {value}")
+ else:
+ # 空列表情况,将整个条件移除(因为IN () 是无效的SQL)
+ logger.warning(f"列表参数 {param_name} 为空,将移除包含该参数的条件表达式")
+ # 查找包含该占位符的整个条件表达式行
+ lines = processed_sql.split('\n')
+ new_lines = []
+ for line in lines:
+ if placeholder in line:
+ line_stripped = line.strip().upper()
+ if line_stripped.startswith('AND ') or line_stripped.startswith('OR '):
+ continue
+ new_lines.append(line)
+ processed_sql = '\n'.join(new_lines)
+ else:
+ # 普通参数处理
+ processed_sql = processed_sql.replace(placeholder, f":{param_name}")
+ logger.debug(f"已将参数 {placeholder} 转换为 :{param_name}")
+ elif placeholder in processed_sql:
+ # 参数缺失或为None,移除包含该参数的条件表达式
+ logger.warning(f"参数 {param_name} 缺失或为None,将移除包含该参数的条件表达式")
+ lines = processed_sql.split('\n')
+ new_lines = []
+ for line in lines:
+ if placeholder in line:
+ line_stripped = line.strip().upper()
+ if line_stripped.startswith('AND ') or line_stripped.startswith('OR '):
+ continue
+ new_lines.append(line)
+ processed_sql = '\n'.join(new_lines)
+
+ # 处理直接的变量名格式(如 $person_id 或 #{person_id})
+ # 尝试匹配各种常见的变量名格式
+ variable_patterns = [
+ r'\$([a-zA-Z_][a-zA-Z0-9_]*)', # $variable 格式
+ r'#\{([a-zA-Z_][a-zA-Z0-9_]*)\}', # #{variable} 格式
+ r'\{([a-zA-Z_][a-zA-Z0-9_]*)\}' # {variable} 格式
+ ]
+
+ for pattern in variable_patterns:
+ matches = re.finditer(pattern, processed_sql)
+ # 收集所有匹配并从后向前替换,避免位置偏移
+ variable_matches = list(matches)
+ for match in reversed(variable_matches):
+ placeholder = match.group(0)
+ param_name = match.group(1)
+
+ # 检查参数是否存在且不为None
+ if param_name in params and params[param_name] is not None:
+ # 替换为SQLAlchemy参数格式
+ replacement = f":{param_name}"
+ processed_sql = processed_sql[:match.start()] + replacement + processed_sql[match.end():]
+ logger.debug(f"已将变量 {placeholder} 转换为 {replacement}")
+ else:
+ # 变量不存在或为None,记录警告
+ logger.warning(f"变量 {param_name} 缺失或为None,保留原样")
+
+ # 更新params,使其包含处理后的参数(包括扩展的列表参数)
+ if params is not None:
+ for key, value in processed_params.items():
+ params[key] = value
+
+ # 清理多余的空白行和空格
+ lines = processed_sql.split('\n')
+ processed_lines = [line.strip() for line in lines if line.strip()]
+ processed_sql = '\n'.join(processed_lines)
+
+ # 额外的清理:处理可能产生的孤立逻辑运算符
+ # 例如,如果我们移除了一行,可能会留下单独的AND/OR
+ processed_sql = re.sub(r'(^|\n)\s*(AND|OR)\s*($|\n)', '\1\3', processed_sql)
+
+ # 最终清理
+ lines = processed_sql.split('\n')
+ processed_lines = [line.strip() for line in lines if line.strip()]
+ processed_sql = '\n'.join(processed_lines)
+
+ return processed_sql
+
+ async def find(self, sql, params=None, session=None):
+ """
+ 执行SQL查询并返回结果(异步版本)
+
+ Args:
+ sql: SQL查询语句或SQL模板名称(支持namespace.sql_name格式)
+ params: 查询参数,字典形式
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ list: 查询结果的字典列表
+ """
+ # 使用当前实例
+ instance = self
+
+ # 如果没有提供params,创建一个空字典
+ if params is None:
+ params = {}
+
+ # 确保数据库连接已初始化
+ if instance.AsyncSessionLocal is None:
+ await instance.init_db()
+
+ # 检查是否需要加载SQL模板
+ # 首先检查Redis中是否有加载的模板
+ if not getattr(instance, '_templates_loaded', False):
+ templates_loaded_in_redis = await instance.sql_loader._check_templates_loaded_from_redis()
+ if templates_loaded_in_redis:
+ try:
+ await instance.sql_loader._load_from_redis()
+ instance._templates_loaded = True
+ logger.info("从Redis自动加载SQL模板完成")
+ except Exception as e:
+ logger.error(f"从Redis自动加载SQL模板失败: {str(e)}")
+ else:
+ # Redis中没有,尝试正常加载
+ try:
+ await instance.load_all_templates()
+ instance._templates_loaded = True
+ logger.info("SQL模板自动加载完成")
+ except Exception as e:
+ logger.error(f"自动加载SQL模板失败: {str(e)}")
+ # 不抛出异常,允许数据库操作继续进行
+ pass
+
+ # 检查是否为SQL模板名称并处理
+ if self._is_sql_template(sql):
+ try:
+ logger.debug(f"确认为SQL模板: {sql}")
+
+ # 尝试获取SQL模板
+ sql_content = await instance.get_sql(sql, params)
+ # 如果成功获取到内容且不等于原始名称,说明是模板
+ if sql_content and sql_content != sql:
+ sql = sql_content
+ logger.debug(f"成功获取SQL模板,处理后的SQL: {sql}")
+ # 对于模板SQL,参数已经被get_sql处理过了,不需要再处理
+ # params = None
+ else:
+ logger.debug(f"获取到的内容与输入相同,可能不是模板: {sql_content}")
+ except Exception as e:
+ logger.error(f"获取SQL模板失败: {str(e)},将作为普通SQL执行")
+ # 继续执行,将其作为普通SQL处理
+
+ # 只有当SQL不是从模板获取时,才处理普通SQL中的#para()格式参数
+ # 因为模板已经通过get_sql方法处理了参数替换
+ if params and isinstance(params, dict) and isinstance(sql, str):
+ # 检查SQL是否还包含#para()格式(如果是模板,应该已经被处理过了)
+ if '#para(' in sql:
+ logger.debug("检测到SQL中仍包含#para()格式,进行参数替换")
+ # 替换SQL中的#para(param_name)为:param_name
+ for param_name, param_value in list(params.items()): # 使用list()创建副本,避免在遍历时修改
+ para_pattern = f'#para\\({param_name}\\)' # 转义括号
+ if re.search(para_pattern, sql):
+ # 检查参数是否为列表类型且用于IN操作
+ if isinstance(param_value, (list, tuple)) and "in" in sql.lower():
+ logger.debug(f"检测到普通SQL中的列表参数 {param_name} 用于IN操作,进行特殊处理")
+ # 为列表中的每个元素创建单独的参数
+ list_values = param_value
+ if list_values: # 确保列表不为空
+ # 生成多个占位符,如 :idList_1, :idList_2, :idList_3
+ placeholders = ', '.join([f":{param_name}_{i}" for i in range(len(list_values))])
+ sql = re.sub(para_pattern, placeholders, sql)
+ # 更新参数字典,添加每个列表元素的参数
+ for i, value in enumerate(list_values):
+ params[f"{param_name}_{i}"] = value
+ logger.debug(f"为列表参数 {param_name} 创建子参数 {param_name}_{i} = {value}")
+ else:
+ # 空列表情况,将整个条件移除(因为IN () 是无效的SQL)
+ logger.warning(f"列表参数 {param_name} 为空,将移除包含该参数的条件表达式")
+ # 查找包含该占位符的整个条件表达式行
+ lines = sql.split('\n')
+ new_lines = []
+ for line in lines:
+ if f"#para({param_name})" in line:
+ line_stripped = line.strip().upper()
+ if line_stripped.startswith('AND ') or line_stripped.startswith('OR '):
+ continue
+ new_lines.append(line)
+ sql = '\n'.join(new_lines)
+ else:
+ # 普通参数处理
+ sql = re.sub(para_pattern, f':{param_name}', sql)
+ logger.debug(f"已替换参数占位符: #para({param_name}) -> :{param_name}")
+ else:
+ logger.debug("SQL模板已处理过参数,跳过重复处理")
+
+ is_own_session = False
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await instance.get_session()
+ is_own_session = True
+
+ # 执行查询
+ # logger.info(f"执行查询: {sql},参数: {params}")
+ result = await session.execute(text(sql), params or {})
+
+ # 将结果转换为字典列表
+ return [dict(row._mapping) for row in result]
+ except Exception as e:
+ logger.error(f"查询执行失败: {str(e)}")
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ async def findFirst(self, sql, params=None, session=None):
+ """
+ 执行查询并返回结果的第一条记录(异步版本)
+
+ Args:
+ sql: SQL查询语句或SQL模板名称(支持namespace.sql_name格式)
+ params: 查询参数,字典形式
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ dict: 第一条记录的字典,如果没有结果则返回None
+ """
+ # 直接调用异步的find方法,它已经使用_is_sql_template进行了模板检查
+ rows = await self.find(sql, params, session)
+ return rows[0] if rows else None
+
+ async def findById(self, table_name, primary_key_value, primary_key='id', session=None):
+ """
+ 根据主键查询指定表中的记录(异步版本)
+
+ Args:
+ table_name: 表名
+ primary_key_value: 主键值
+ primary_key: 主键字段名,默认为'id'
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ dict: 查询到的记录字典,如果没有找到则返回None
+ """
+ if not table_name:
+ raise ValueError("表名不能为空")
+
+ # 构建查询SQL
+ sql = f"SELECT * FROM {table_name} WHERE {primary_key} = :primary_key_value"
+
+ # 准备参数
+ params = {"primary_key_value": primary_key_value}
+
+ logger.debug(f"生成的查询SQL: {sql}")
+ logger.debug(f"查询参数: {params}")
+
+ # 异步使用findFirst方法执行查询
+ return await self.findFirst(sql, params, session)
+
+ async def paginate(self, sql, page_number=1, page_size=10, params=None, session=None):
+ """
+ 执行SQL查询并返回分页结果(异步版本)
+
+ Args:
+ sql: SQL查询语句或SQL模板名称(支持namespace.sql_name格式)
+ page_number: 页码,从1开始
+ page_size: 每页记录数
+ params: 查询参数,字典形式
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ dict: 包含分页信息的字典,格式如下:
+ {
+ 'list': 当前页的数据列表,
+ 'pageNumber': 当前页码,
+ 'pageSize': 每页记录数,
+ 'totalRow': 总记录数,
+ 'totalPage': 总页数
+ }
+ """
+ # 确保数据库已初始化
+ if self.AsyncSessionLocal is None:
+ await self.init_db()
+
+ # 初始化诊断日志
+ logger.debug("======= 开始分页查询 =======")
+
+ # 如果没有提供params,创建一个空字典
+ if params is None:
+ params = {}
+ logger.debug(f"传入的参数: {params}")
+
+ # 确保页码和每页大小为正整数
+ try:
+ page_number = int(page_number)
+ page_size = int(page_size)
+ except (ValueError, TypeError):
+ logger.error(f"页码或每页大小类型错误,重置为默认值")
+ page_number = 1
+ page_size = 10
+
+ if page_number < 1:
+ page_number = 1
+ if page_size < 1:
+ page_size = 10
+
+ logger.debug(f"处理后的页码: {page_number}, 每页大小: {page_size}")
+
+ # 使用_is_sql_template方法检查并获取SQL模板
+ if self._is_sql_template(sql):
+ try:
+ logger.debug(f"确认为SQL模板: {sql}")
+
+ # 尝试获取SQL模板
+ sql_content = await self.get_sql(sql, params)
+ # 如果成功获取到内容且不等于原始名称,说明是模板
+ if sql_content and sql_content != sql:
+ sql = sql_content
+ logger.debug(f"成功获取SQL模板,处理后的SQL: {sql}")
+ else:
+ logger.debug(f"获取到的内容与输入相同,可能不是模板: {sql_content}")
+ except Exception as e:
+ logger.error(f"获取SQL模板失败: {str(e)},将作为普通SQL执行")
+ # 继续执行,将其作为普通SQL处理
+
+ # 只有当SQL不是从模板获取时,才处理普通SQL中的#para()格式参数
+ # 因为模板已经通过get_sql方法处理了参数替换
+ if params and isinstance(params, dict) and isinstance(sql, str):
+ # 检查SQL是否还包含#para()格式(如果是模板,应该已经被处理过了)
+ if '#para(' in sql:
+ logger.debug("检测到SQL中仍包含#para()格式,进行参数替换")
+ # 替换SQL中的#para(param_name)为:param_name
+ for param_name, param_value in list(params.items()): # 使用list()创建副本,避免在遍历时修改
+ para_pattern = f'#para\\({param_name}\\)' # 转义括号
+ if re.search(para_pattern, sql):
+ # 检查参数是否为列表类型且用于IN操作
+ if isinstance(param_value, (list, tuple)) and "in" in sql.lower():
+ logger.debug(f"检测到分页查询中的列表参数 {param_name} 用于IN操作,进行特殊处理")
+ # 为列表中的每个元素创建单独的参数
+ list_values = param_value
+ if list_values: # 确保列表不为空
+ # 生成多个占位符,如 :idList_1, :idList_2, :idList_3
+ placeholders = ', '.join([f":{param_name}_{i}" for i in range(len(list_values))])
+ sql = re.sub(para_pattern, placeholders, sql)
+ # 更新参数字典,添加每个列表元素的参数
+ for i, value in enumerate(list_values):
+ params[f"{param_name}_{i}"] = value
+ logger.debug(f"为列表参数 {param_name} 创建子参数 {param_name}_{i} = {value}")
+ else:
+ # 空列表情况,将整个条件移除(因为IN () 是无效的SQL)
+ logger.warning(f"列表参数 {param_name} 为空,将移除包含该参数的条件表达式")
+ # 查找包含该占位符的整个条件表达式行
+ lines = sql.split('\n')
+ new_lines = []
+ for line in lines:
+ if f"#para({param_name})" in line:
+ line_stripped = line.strip().upper()
+ if line_stripped.startswith('AND ') or line_stripped.startswith('OR '):
+ continue
+ new_lines.append(line)
+ sql = '\n'.join(new_lines)
+ else:
+ # 普通参数处理
+ sql = re.sub(para_pattern, f':{param_name}', sql)
+ logger.debug(f"已替换参数占位符: #para({param_name}) -> :{param_name}")
+ else:
+ logger.debug("SQL模板已处理过参数,跳过重复处理")
+
+ is_own_session = False
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await self.get_session()
+ is_own_session = True
+
+ # 计算总记录数
+ count_sql = self._build_count_sql(sql)
+ logger.debug(f"构建的COUNT SQL: {count_sql}")
+
+ try:
+ count_result = await session.execute(text(count_sql), params or {})
+ count_value = count_result.scalar()
+
+ # 确保total_row是正确的整数值
+ try:
+ total_row = int(count_value) if count_value is not None else 0
+ except (ValueError, TypeError):
+ total_row = 0
+ except Exception as e:
+ logger.error(f"COUNT查询失败: {str(e)}")
+ total_row = 0
+ # 如果是自己创建的会话,当COUNT查询失败时,回滚事务并重新创建会话
+ if is_own_session:
+ logger.debug("COUNT查询失败,回滚并重新创建会话")
+ await session.rollback()
+ await session.close()
+ session = await self.get_session()
+
+ # 添加详细日志记录总记录数和每页大小
+ logger.debug(f"总记录数: {total_row}, 每页大小: {page_size}")
+
+ # 确保total_row是整数
+ total_row = int(total_row) if total_row is not None else 0
+
+ # 计算总页数(使用更清晰的计算方式)
+ if page_size > 0:
+ total_page = (total_row + page_size - 1) // page_size
+ else:
+ total_page = 0
+
+ logger.debug(f"计算的总页数: {total_page}")
+
+ # 计算偏移量
+ offset = (page_number - 1) * page_size
+
+ # 构建分页SQL(PostgreSQL语法)
+ # 首先检查SQL是否已经包含LIMIT或OFFSET子句
+ has_limit = re.search(r'(?i)\bLIMIT\b', sql)
+ has_offset = re.search(r'(?i)\bOFFSET\b', sql)
+
+ # 如果已经包含LIMIT或OFFSET,直接使用原始SQL
+ if has_limit or has_offset:
+ paginated_sql = sql
+ else:
+ # 否则,在SQL末尾添加LIMIT和OFFSET
+ # 不需要复杂的ORDER BY处理,PostgreSQL会自动处理顺序
+ paginated_sql = f"{sql} LIMIT :limit OFFSET :offset"
+
+ logger.debug(f"构建的分页SQL: {paginated_sql}")
+
+ # 添加分页参数
+ paginated_params = params.copy() if params else {}
+ paginated_params['limit'] = page_size
+ paginated_params['offset'] = offset
+ logger.debug(f"分页查询参数: {paginated_params}")
+
+ # 执行分页查询
+ result = await session.execute(text(paginated_sql), paginated_params)
+
+ # 将结果转换为字典列表
+ list_data = [dict(row._mapping) for row in result]
+
+ # 确保total_row是整数
+ try:
+ total_row_int = int(total_row)
+ except Exception as e:
+ total_row_int = 0
+
+ # 计算总页数
+ if page_size > 0:
+ remainder = total_row_int % page_size
+ quotient = total_row_int // page_size
+ calculated_pages = quotient + 1 if remainder > 0 else quotient
+ else:
+ calculated_pages = 0
+
+ # 构建返回结果,使用正确的页数
+ pagination_result = {
+ 'list': list_data if list_data is not None else [],
+ 'page': page_number,
+ 'page_size': page_size,
+ 'total': total_row,
+ 'total_pages': calculated_pages # 使用正确的页数
+ }
+
+ return pagination_result
+ except Exception as e:
+ logger.error(f"分页查询失败: {str(e)}")
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ def _build_count_sql(self, sql):
+ """
+ 根据原始SQL构建用于计算总记录数的SQL
+
+ Args:
+ sql: 原始SQL查询语句
+
+ Returns:
+ str: 计算总记录数的SQL
+ """
+ import re
+
+ # 清理SQL,移除前后空白
+ sql = sql.strip()
+
+ # 策略1: 使用正则表达式查找FROM关键字(更灵活)
+ match = re.search(r'(?i)\bFROM\b', sql)
+ if match:
+ from_pos = match.start()
+ # 提取FROM后面的内容(包括FROM关键字)
+ from_part = sql[from_pos:]
+
+ # 检查是否包含ORDER BY子句,如果有,移除
+ order_by_match = re.search(r'(?i)\bORDER\s+BY\b', from_part)
+ if order_by_match:
+ order_by_pos = order_by_match.start()
+ from_part = from_part[:order_by_pos]
+
+ # 检查是否包含GROUP BY子句
+ if re.search(r'(?i)\bGROUP\s+BY\b', from_part):
+ # 对于复杂查询,使用子查询来计算总数
+ subquery_sql = sql[:order_by_pos] if order_by_match else sql
+ return f"SELECT COUNT(*) FROM ({subquery_sql}) AS subquery"
+ else:
+ # 简单查询,直接替换SELECT部分
+ return f"SELECT COUNT(*) {from_part}"
+
+ # 策略2: 使用多种空格格式查找FROM关键字
+ from_variants = [' FROM ', ' FROM', 'FROM ', 'FROM']
+ sql_upper = sql.upper()
+ for variant in from_variants:
+ if variant.upper() in sql_upper:
+ from_pos = sql_upper.find(variant.upper())
+ from_part = sql[from_pos:]
+
+ # 移除ORDER BY
+ if ' ORDER BY ' in from_part.upper():
+ order_by_pos = from_part.upper().rfind(' ORDER BY ')
+ from_part = from_part[:order_by_pos]
+
+ return f"SELECT COUNT(*) {from_part}"
+
+ # 如果所有策略都失败,返回默认查询
+ return "SELECT COUNT(*)"
+
+ async def execute_update(self, sql, params=None, session=None):
+ """执行SQL更新操作(插入、更新、删除)(异步版本)
+
+ Args:
+ sql: SQL更新语句或SQL模板名称(支持namespace.sql_name格式)
+ params: 更新参数,字典形式
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ int: 受影响的行数
+ """
+ # 确保数据库已初始化
+ if self.AsyncSessionLocal is None:
+ await self.init_db()
+
+ # 如果没有提供params,创建一个空字典
+ if params is None:
+ params = {}
+
+ # 检查是否为SQL模板名称并处理
+ if self._is_sql_template(sql):
+ try:
+ logger.debug(f"确认为SQL模板: {sql}")
+
+ # 尝试获取SQL模板
+ sql_content = await self.get_sql(sql, params)
+ # 如果成功获取到内容且不等于原始名称,说明是模板
+ if sql_content and sql_content != sql:
+ sql = sql_content
+ logger.debug(f"成功获取SQL模板,处理后的SQL: {sql}")
+ # 对于模板SQL,参数已经被get_sql处理过了,不需要再处理
+ params = None
+ else:
+ logger.debug(f"获取到的内容与输入相同,可能不是模板: {sql_content}")
+ except Exception as e:
+ logger.error(f"获取SQL模板失败: {str(e)},将作为普通SQL执行")
+ # 继续执行,将其作为普通SQL处理
+
+ # 只有当SQL不是从模板获取时,才处理普通SQL中的#para()格式参数
+ # 因为模板已经通过get_sql方法处理了参数替换
+ if params and isinstance(params, dict):
+ # 检查SQL是否还包含#para()格式(如果是模板,应该已经被处理过了)
+ if '#para(' in sql:
+ logger.debug("检测到SQL中仍包含#para()格式,进行参数替换")
+ # 替换SQL中的#para(param_name)为:param_name
+ for param_name, param_value in list(params.items()): # 使用list()创建副本,避免在遍历时修改
+ para_pattern = f'#para\\({param_name}\\)' # 转义括号
+ if re.search(para_pattern, sql):
+ # 检查参数是否为列表类型且用于IN操作
+ if isinstance(param_value, (list, tuple)) and "in" in sql.lower():
+ logger.debug(f"检测到更新SQL中的列表参数 {param_name} 用于IN操作,进行特殊处理")
+ # 为列表中的每个元素创建单独的参数
+ list_values = param_value
+ if list_values: # 确保列表不为空
+ # 生成多个占位符,如 :idList_1, :idList_2, :idList_3
+ placeholders = ', '.join([f":{param_name}_{i}" for i in range(len(list_values))])
+ sql = re.sub(para_pattern, placeholders, sql)
+ # 更新参数字典,添加每个列表元素的参数
+ for i, value in enumerate(list_values):
+ params[f"{param_name}_{i}"] = value
+ logger.debug(f"为列表参数 {param_name} 创建子参数 {param_name}_{i} = {value}")
+ else:
+ # 空列表情况,将整个条件移除(因为IN () 是无效的SQL)
+ logger.warning(f"列表参数 {param_name} 为空,将移除包含该参数的条件表达式")
+ # 查找包含该占位符的整个条件表达式行
+ lines = sql.split('\n')
+ new_lines = []
+ for line in lines:
+ if f"#para({param_name})" in line:
+ line_stripped = line.strip().upper()
+ if line_stripped.startswith('AND ') or line_stripped.startswith('OR '):
+ continue
+ new_lines.append(line)
+ sql = '\n'.join(new_lines)
+ else:
+ # 普通参数处理
+ sql = re.sub(para_pattern, f':{param_name}', sql)
+ logger.debug(f"已替换参数占位符: #para({param_name}) -> :{param_name}")
+ else:
+ logger.debug("SQL模板已处理过参数,跳过重复处理")
+
+ is_own_session = False
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await self.get_session()
+ is_own_session = True
+
+ # 执行更新
+ # logger.info(f"执行更新: {sql},参数: {params}")
+ result = await session.execute(text(sql), params or {})
+
+ # 提交事务
+ await session.commit()
+
+ # 返回受影响的行数(如果有)
+ return result.rowcount if hasattr(result, 'rowcount') else 0
+ except Exception as e:
+ logger.error(f"更新操作失败: {str(e)}")
+ if session:
+ await session.rollback()
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ async def save(self, table_name, data, primary_key, session=None):
+ """插入数据到指定表,并返回插入后的主键值(异步版本)
+
+ Args:
+ table_name: 表名
+ data: 要插入的数据字典
+ primary_key: 主键字段名
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ 插入后的主键值
+
+ Raises:
+ ValueError: 当参数验证失败时
+ Exception: 当插入操作失败时
+ """
+ if not table_name or not data:
+ raise ValueError("表名和数据不能为空")
+
+ # 主键可能由数据库自动生成,不传递也可以
+ # 无需额外检查,直接构建SQL语句
+ # 如果data中不包含primary_key,SQL会自动处理
+
+ # logger.info(f"准备插入数据到表 {table_name},主键字段: {primary_key}")
+
+ # 构建插入SQL
+ columns = ', '.join(data.keys())
+ placeholders = ', '.join([f":{key}" for key in data.keys()])
+ sql = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders}) RETURNING {primary_key}"
+
+ logger.debug(f"生成的插入SQL: {sql}")
+ logger.debug(f"插入参数: {data}")
+
+ is_own_session = False
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await self.get_session()
+ is_own_session = True
+
+ # 执行插入并获取主键
+ result = await session.execute(text(sql), data)
+ await session.commit()
+
+ # 获取插入的主键值
+ primary_key_value = result.scalar()
+ # logger.info(f"数据插入成功,主键值: {primary_key_value}")
+ return primary_key_value
+ except Exception as e:
+ logger.error(f"数据插入失败: {str(e)}")
+ if session:
+ await session.rollback()
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ async def update(self, table_name, data, primary_key, session=None):
+ """根据主键更新指定表中的数据(异步版本)
+
+ Args:
+ table_name: 表名
+ data: 要更新的数据字典,必须包含主键字段和值
+ primary_key: 主键字段名
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ int: 受影响的行数
+
+ Raises:
+ ValueError: 当参数验证失败时
+ Exception: 当更新操作失败时
+ """
+ if not table_name or not data:
+ raise ValueError("表名和数据不能为空")
+
+ if primary_key not in data:
+ raise ValueError(f"数据字典中必须包含主键字段 '{primary_key}'")
+
+ # 获取主键值
+ primary_key_value = data[primary_key]
+
+ # logger.info(f"准备更新表 {table_name} 中的数据,主键: {primary_key}={primary_key_value}")
+
+ # 构建更新字段部分,排除主键
+ update_fields = [f"{key} = :{key}" for key in data.keys() if key != primary_key]
+ if not update_fields:
+ logger.warning("没有需要更新的字段")
+ return 0
+
+ update_sql_part = ', '.join(update_fields)
+
+ # 构建完整的更新SQL
+ sql = f"UPDATE {table_name} SET {update_sql_part} WHERE {primary_key} = :{primary_key}"
+
+ logger.debug(f"生成的更新SQL: {sql}")
+ logger.debug(f"更新参数: {data}")
+
+ is_own_session = False
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await self.get_session()
+ is_own_session = True
+
+ # 执行更新
+ result = await session.execute(text(sql), data)
+ await session.commit()
+
+ affected_rows = result.rowcount if hasattr(result, 'rowcount') else 0
+ # logger.info(f"数据更新成功,受影响行数: {affected_rows}")
+ return affected_rows
+ except Exception as e:
+ logger.error(f"数据更新失败: {str(e)}")
+ if session:
+ await session.rollback()
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ async def batch_insert(self, table_name, data_list, primary_key=None, session=None):
+ """
+ 批量插入数据到指定表(异步版本)
+
+ Args:
+ table_name: 表名
+ data_list: 要插入的数据字典列表
+ primary_key: 主键字段名,如果提供,将返回插入后的主键值列表
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ list: 插入后的主键值列表,如果不提供primary_key则返回None
+
+ Raises:
+ ValueError: 当参数验证失败时
+ Exception: 当插入操作失败时
+ """
+ if not table_name or not data_list:
+ raise ValueError("表名和数据列表不能为空")
+
+ if not isinstance(data_list, list) or not data_list:
+ raise ValueError("数据列表必须是非空的列表")
+
+ # 获取第一个数据字典的键作为列名
+ columns = data_list[0].keys()
+ columns_str = ', '.join(columns)
+
+ # 构建占位符部分
+ placeholders_list = []
+ all_params = {}
+
+ # 为每一行数据生成占位符和参数
+ for i, data in enumerate(data_list):
+ # 确保每一行数据都有相同的键
+ if data.keys() != columns:
+ raise ValueError(f"第{i+1}行数据的字段不匹配")
+
+ # 生成该行的占位符,如 (:name_1, :age_1)
+ row_placeholders = [f":{key}_{i}" for key in columns]
+ placeholders_list.append(f"({', '.join(row_placeholders)})")
+
+ # 更新参数
+ for key, value in data.items():
+ all_params[f"{key}_{i}"] = value
+
+ # 构建完整的批量插入SQL
+ values_clause = ', '.join(placeholders_list)
+ if primary_key:
+ sql = f"INSERT INTO {table_name} ({columns_str}) VALUES {values_clause} RETURNING {primary_key}"
+ else:
+ sql = f"INSERT INTO {table_name} ({columns_str}) VALUES {values_clause}"
+
+ logger.debug(f"生成的批量插入SQL: {sql}")
+
+ is_own_session = False
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await self.get_session()
+ is_own_session = True
+
+ # 执行批量插入
+ result = await session.execute(text(sql), all_params)
+ await session.commit()
+
+ # 如果指定了主键,返回插入的主键值列表
+ if primary_key:
+ return [row[0] for row in result]
+ return None
+ except Exception as e:
+ logger.error(f"批量插入失败: {str(e)}")
+ if session:
+ await session.rollback()
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ async def batch_update(self, table_name, data_list, primary_key, session=None):
+ """
+ 批量更新指定表中的数据(异步版本)
+
+ Args:
+ table_name: 表名
+ data_list: 要更新的数据字典列表,每个字典必须包含主键字段和值
+ primary_key: 主键字段名
+ session: 可选的数据库会话对象,不提供时将自动创建
+
+ Returns:
+ int: 受影响的总行数
+
+ Raises:
+ ValueError: 当参数验证失败时
+ Exception: 当更新操作失败时
+ """
+ if not table_name or not data_list or not primary_key:
+ raise ValueError("表名、数据列表和主键不能为空")
+
+ if not isinstance(data_list, list) or not data_list:
+ raise ValueError("数据列表必须是非空的列表")
+
+ is_own_session = False
+ total_affected = 0
+
+ try:
+ # 如果没有提供会话,创建新会话
+ if session is None:
+ session = await self.get_session()
+ is_own_session = True
+
+ # 逐个更新数据(PostgreSQL不支持标准的批量更新语法)
+ for data in data_list:
+ if primary_key not in data:
+ raise ValueError(f"数据字典中必须包含主键字段 '{primary_key}'")
+
+ # 构建更新字段部分,排除主键
+ update_fields = [f"{key} = :{key}" for key in data.keys() if key != primary_key]
+ if not update_fields:
+ continue # 没有需要更新的字段
+
+ update_sql_part = ', '.join(update_fields)
+
+ # 构建完整的更新SQL
+ sql = f"UPDATE {table_name} SET {update_sql_part} WHERE {primary_key} = :{primary_key}"
+
+ # 执行更新
+ result = await session.execute(text(sql), data)
+ total_affected += result.rowcount if hasattr(result, 'rowcount') else 0
+
+ # 提交事务
+ await session.commit()
+ return total_affected
+ except Exception as e:
+ logger.error(f"批量更新失败: {str(e)}")
+ if session:
+ await session.rollback()
+ raise
+ finally:
+ # 如果是自己创建的会话,负责关闭
+ if is_own_session and session:
+ await session.close()
+
+ async def begin_transaction(self, session=None):
+ """
+ 开始一个新的事务(异步版本)
+
+ Args:
+ session: 可选的数据库会话对象,不提供时将创建新会话
+
+ Returns:
+ Session: 数据库会话对象
+ """
+ if session is None:
+ session = await self.get_session()
+ return session
+
+ async def commit_transaction(self, session):
+ """
+ 提交当前事务(异步版本)
+
+ Args:
+ session: 数据库会话对象
+ """
+ if session:
+ await session.commit()
+
+ async def rollback_transaction(self, session):
+ """
+ 回滚当前事务(异步版本)
+
+ Args:
+ session: 数据库会话对象
+ """
+ if session:
+ await session.rollback()
+
+ async def transaction(self):
+ """
+ 异步事务上下文管理器,用于简化异步事务管理
+
+ 使用示例:
+ async with await db.transaction() as session:
+ await db.execute_update("INSERT INTO users (name) VALUES (:name)", {"name": "张三"}, session)
+ await db.execute_update("UPDATE statistics SET count = count + 1", {}, session)
+ """
+ return TransactionContext(self)
+
+
+# Db类结束
diff --git a/DbKit/SqlTemplateLoader.py b/DbKit/SqlTemplateLoader.py
new file mode 100644
index 0000000..240bba4
--- /dev/null
+++ b/DbKit/SqlTemplateLoader.py
@@ -0,0 +1,529 @@
+
+import logging
+import os
+import re
+import asyncio
+import aiofiles
+import json
+
+# 导入RedisKit
+from Util.RedisKit import redisKit
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+# Redis键名常量
+REDIS_SQL_TEMPLATES_KEY = "sql_templates:all_templates"
+REDIS_SQL_LOADED_FILES_KEY = "sql_templates:loaded_files"
+REDIS_SQL_TEMPLATE_MAP_KEY = "sql_templates:template_map"
+REDIS_SQL_TEMPLATES_LOADED_KEY = "sql_templates:templates_loaded"
+
+
+class SqlTemplateLoader:
+ """SQL模板加载器,负责加载和解析SQL模板文件(异步版本)"""
+
+ def __init__(self, sql_dir=None, auto_load=True):
+ """初始化SQL模板加载器
+
+ Args:
+ sql_dir: SQL模板文件所在目录
+ auto_load: 是否自动加载目录下所有SQL模板文件
+ """
+ self.sql_dir = sql_dir
+ self.templates = {} # 使用嵌套字典存储命名空间下的SQL模板
+ self._loaded_files = set() # 用于记录已加载的文件,避免重复加载
+ self._template_map = {} # 使用平面字典存储完整的模板名称映射,用于快速查找
+
+ # 注意:异步版本不会在__init__中自动加载,需要单独调用异步方法
+
+ async def load_all_templates(self):
+ """自动加载SQL目录下所有的SQL模板文件(异步版本)
+
+ Returns:
+ int: 成功加载的模板文件数量
+ """
+ logger.info(f"开始加载SQL模板目录: {self.sql_dir}")
+
+ if not os.path.exists(self.sql_dir):
+ logger.warning(f"SQL模板目录不存在: {self.sql_dir}")
+ return 0
+
+ # 检查是否已经从Redis加载过
+ templates_loaded = await self._check_templates_loaded_from_redis()
+ if templates_loaded:
+ await self._load_from_redis()
+ logger.info(f"从Redis加载SQL模板完成,共{len(self._loaded_files)}个文件,{len(self._template_map)}个模板")
+ return len(self._loaded_files)
+
+ loaded_count = 0
+ sql_files = []
+
+ try:
+ # 遍历目录下所有.sql文件
+ for filename in os.listdir(self.sql_dir):
+ if filename.lower().endswith('.sql'):
+ file_path = os.path.join(self.sql_dir, filename)
+ file_abs_path = os.path.abspath(file_path)
+ sql_files.append(file_abs_path)
+
+ # 使用异步方式加载所有模板,不立即构建映射以提高性能
+ for file_abs_path in sql_files:
+ # 跳过已经加载过的文件
+ if file_abs_path in self._loaded_files:
+ logger.debug(f"SQL文件已加载,跳过: {file_abs_path}")
+ continue
+
+ try:
+ filename = os.path.basename(file_abs_path)
+ if await self.load_template(file_abs_path, build_map=False):
+ loaded_count += 1
+ except Exception as e:
+ logger.error(f"加载SQL模板文件 {filename} 失败: {str(e)}")
+
+ # 所有模板加载完成后,统一构建映射
+ if loaded_count > 0:
+ self._build_template_map()
+ logger.info(f"成功加载 {loaded_count} 个SQL模板文件,已构建模板映射")
+
+ # 加载完成后保存到Redis
+ await self._save_to_redis()
+ return loaded_count
+ except Exception as e:
+ logger.error(f"遍历SQL模板目录时出错: {str(e)}")
+ return 0
+
+ async def load_template(self, template_path, build_map=True):
+ """加载指定的SQL模板文件(异步版本)
+
+ Args:
+ template_path: SQL模板文件的路径,可以是绝对路径或相对于sql_dir的相对路径
+ build_map: 是否立即构建模板映射,默认为True。在批量加载时可设为False以提高性能
+
+ Returns:
+ bool: 加载是否成功
+
+ Raises:
+ FileNotFoundError: 当模板文件不存在时
+ Exception: 当加载过程发生其他错误时
+ """
+ # 确定模板文件的完整路径
+ if self.sql_dir and not os.path.isabs(template_path):
+ file_path = os.path.join(self.sql_dir, template_path)
+ else:
+ file_path = template_path
+
+ # 检查文件是否已加载,避免重复加载
+ file_abs_path = os.path.abspath(file_path)
+ if file_abs_path in self._loaded_files:
+ logger.debug(f"SQL模板文件已加载,跳过: {file_abs_path}")
+ return True
+
+ try:
+ # 异步读取文件内容
+ async with aiofiles.open(file_path, 'r', encoding='utf-8') as f:
+ content = await f.read()
+
+ # 使用栈结构解析整个内容
+ templates = self._parse_with_stack(content)
+
+ # 处理命名空间
+ if 'namespace' in templates and templates['namespace']:
+ namespace = templates['namespace']
+ sql_templates = {k: v for k, v in templates.items() if k != 'namespace'}
+ else:
+ # 没有命名空间的情况
+ namespace = 'default'
+ sql_templates = templates
+
+ # 将解析出的SQL模板添加到templates字典中
+ if namespace not in self.templates:
+ self.templates[namespace] = {}
+
+ self.templates[namespace].update(sql_templates)
+
+ # 重新构建模板映射,确保新加载的模板可以被快速查找
+ if build_map:
+ self._build_template_map()
+
+ # 记录已加载的文件
+ self._loaded_files.add(file_abs_path)
+
+ return True
+ except FileNotFoundError:
+ logger.error(f"SQL模板文件不存在: {file_path}")
+ raise FileNotFoundError(f"SQL模板文件不存在: {file_path}")
+ except Exception as e:
+ logger.error(f"加载SQL模板失败: {str(e)}", exc_info=True)
+ raise
+
+ def _parse_with_stack(self, content):
+ """使用栈结构解析SQL模板,支持嵌套的标签匹配
+ 支持--单行注释和/* */多行注释
+
+ Args:
+ content: 要解析的SQL模板内容
+
+ Returns:
+ 解析后的SQL模板字典,键为模板名称,值为模板内容
+ """
+ templates = {}
+ stack = [] # 用于存储标签信息的栈
+ current_content = [] # 当前正在收集的内容
+ in_multiline_comment = False # 多行注释标记
+
+ try:
+ # 按行处理内容
+ lines = content.split('\n')
+ for line_num, line in enumerate(lines):
+ # 处理多行注释
+ if in_multiline_comment:
+ # 检查是否是多行注释结束
+ if '*/' in line:
+ in_multiline_comment = False
+ # 截取注释结束后的内容
+ line = line.split('*/', 1)[1]
+ else:
+ # 完全在多行注释内,跳过此行
+ continue
+
+ # 处理单行注释和检查多行注释开始
+ if not line.strip().startswith('#') and stack and stack[-1][0] == 'sql':
+ # 检查是否有--注释
+ if '--' in line:
+ # 保留--前面的内容
+ line = line.split('--', 1)[0]
+
+ # 检查是否有/*多行注释开始
+ if '/*' in line:
+ parts = line.split('/*', 1)
+ # 如果/*和*/在同一行
+ if '*/' in parts[1]:
+ # 只保留/*前面和*/后面的内容
+ comment_part = parts[1].split('*/', 1)
+ line = parts[0] + comment_part[1]
+ else:
+ # 多行注释开始,只保留/*前面的内容
+ line = parts[0]
+ in_multiline_comment = True
+
+ stripped_line = line.strip()
+
+ # 检查是否是标签行
+ if stripped_line.startswith('#'):
+ # 检查是否是命名空间标签
+ if stripped_line.startswith('#namespace(') and (
+ stripped_line.find('"') > 0 or stripped_line.find("'") > 0):
+ # 提取命名空间名称
+ quote_pattern = re.search(r'#namespace\((["\'])([^"\']+)\1\)', stripped_line)
+ if quote_pattern:
+ namespace = quote_pattern.group(2)
+ templates['namespace'] = namespace
+ # 将命名空间标签入栈
+ stack.append(('namespace', namespace, line_num))
+
+ # 检查是否是SQL模板开始标签
+ elif stripped_line.startswith('#sql(') and (
+ stripped_line.find('"') > 0 or stripped_line.find("'") > 0):
+ # 提取SQL模板名称
+ quote_pattern = re.search(r'#sql\((["\'])([^"\']+)\1\)', stripped_line)
+ if quote_pattern:
+ sql_name = quote_pattern.group(2)
+ # 将SQL模板开始标签入栈
+ stack.append(('sql', sql_name, line_num))
+ current_content = [] # 重置内容收集器
+
+ # 检查是否是#if条件开始标签
+ elif stripped_line.startswith('#if(') and ')' in stripped_line:
+ # 提取条件表达式
+ condition_pattern = re.search(r'#if\(([^)]+)\)', stripped_line)
+ if condition_pattern:
+ condition = condition_pattern.group(1)
+ stack.append(('if', condition, line_num))
+ # 保留#if行到内容中 - 只要有SQL标签在栈中就保留
+ if any(tag[0] == 'sql' for tag in stack):
+ current_content.append(line.rstrip())
+
+ # 检查是否是结束标签
+ elif stripped_line == '#end' and stack:
+ # 获取栈顶元素
+ tag_type, tag_name, start_line = stack[-1]
+
+ # 只有当标签不是SQL结束标签时,才保留#end行到内容中
+ if any(tag[0] == 'sql' for tag in stack) and tag_type != 'sql':
+ current_content.append(line.rstrip())
+
+ # 弹出当前标签
+ stack.pop()
+
+ # 如果是SQL模板结束标签,保存内容
+ if tag_type == 'sql':
+ sql_content = '\n'.join(current_content).strip()
+ if sql_content:
+ templates[tag_name] = sql_content
+ # 重置内容收集器,准备下一个模板
+ current_content = []
+
+ # 收集内容(不是标签行且当前有活动的SQL模板)
+ else:
+ # 只要栈中有SQL标签,就收集内容(不管是在条件块内还是外)
+ if any(tag[0] == 'sql' for tag in stack) and line.strip():
+ # 保留原始缩进
+ current_content.append(line.rstrip())
+
+ # 检查是否所有标签都正确闭合
+ if stack:
+ unclosed_tags = [f"{tag_type}('{tag_name}')" for tag_type, tag_name, _ in stack]
+ logger.warning(f"存在未闭合的标签: {', '.join(unclosed_tags)}")
+ else:
+ logger.debug("所有标签都已正确闭合")
+
+ except Exception as e:
+ logger.error(f"使用栈结构解析SQL模板时出错: {str(e)}", exc_info=True)
+
+ return templates
+
+ async def get_all_template_names(self):
+ """
+获取所有已加载的SQL模板的完整名称列表(异步版本)
+
+ Returns:
+ list: 包含所有模板名称的列表,格式为 "命名空间.模板名称"
+ """
+ template_names = []
+
+ # 遍历所有命名空间
+ for namespace, templates in self.templates.items():
+ # 遍历当前命名空间下的所有模板
+ for template_name in templates.keys():
+ # 构建完整的模板名称(命名空间.模板名称)
+ full_name = f"{namespace}.{template_name}"
+ template_names.append(full_name)
+
+ return template_names
+
+ def _has_template(self, full_template_name):
+ """
+ 内部方法:快速检查指定的完整模板名称是否存在
+ 使用MAP机制实现O(1)时间复杂度的查找
+
+ Args:
+ full_template_name: 完整的模板名称,格式为 "命名空间.模板名称"
+
+ Returns:
+ bool: 如果模板存在返回True,否则返回False
+ """
+ logger.debug(f"检查模板是否存在: {full_template_name}")
+
+ # 如果_map为空,先构建映射
+ if not self._template_map and self.templates:
+ logger.debug("模板映射为空,正在构建映射...")
+ self._build_template_map()
+ logger.debug(f"映射构建完成,包含 {len(self._template_map)} 个模板")
+
+ # 直接在映射中查找
+ exists = full_template_name in self._template_map
+ logger.debug(f"模板 '{full_template_name}' 存在性检查结果: {exists}")
+
+ if not exists and self._template_map:
+ logger.debug(f"当前映射中的模板: {list(self._template_map.keys())}")
+
+ return exists
+
+ def _build_template_map(self):
+ """
+ 内部方法:构建完整模板名称到SQL内容的映射
+ 用于支持快速查找功能
+ """
+ logger.debug("开始构建模板映射...")
+ self._template_map.clear()
+
+ # 遍历所有命名空间和模板,构建映射
+ for namespace, templates in self.templates.items():
+ logger.debug(f"处理命名空间: {namespace},包含 {len(templates)} 个模板")
+ for template_name, sql_content in templates.items():
+ full_name = f"{namespace}.{template_name}"
+ self._template_map[full_name] = sql_content
+ logger.debug(f"添加映射: {full_name} -> {len(sql_content)} 字符的SQL")
+
+ logger.debug(f"模板映射构建完成,总共 {len(self._template_map)} 个模板")
+ logger.debug(f"映射中的模板列表: {list(self._template_map.keys())}")
+
+ async def get_sql(self, sql_name):
+ """
+获取指定名称的SQL语句,支持命名空间格式:namespace.sql_name(异步版本)
+
+ Args:
+ sql_name: SQL模板名称,可以包含命名空间前缀
+
+ Returns:
+ str: SQL语句
+
+ Raises:
+ KeyError: 当找不到指定名称的SQL模板时
+ """
+ try:
+ logger.debug(f"尝试获取SQL模板: {sql_name}")
+ logger.debug(f"当前模板映射状态: {len(self._template_map) if self._template_map else 0} 个模板")
+
+ # 快速检查模板是否存在
+ if self._has_template(sql_name):
+ logger.debug(f"在映射中找到模板: {sql_name}")
+ # 如果在映射中存在,直接返回
+ sql_content = self._template_map[sql_name]
+ logger.debug(f"模板内容长度: {len(sql_content)} 字符")
+ return sql_content
+
+ # 如果内存中没有,检查Redis中是否有加载的模板数据
+ templates_loaded = await self._check_templates_loaded_from_redis()
+ if templates_loaded:
+ await self._load_from_redis()
+ # 再次尝试从内存中获取
+ if self._has_template(sql_name):
+ sql_content = self._template_map[sql_name]
+ logger.debug(f"从Redis加载后找到模板: {sql_name}")
+ return sql_content
+
+ logger.debug(f"映射中未找到模板: {sql_name},尝试从原始模板中查找")
+
+ # 尝试解析命名空间和SQL名称
+ if '.' in sql_name:
+ namespace, name = sql_name.split('.', 1)
+ else:
+ # 默认命名空间
+ namespace = "default"
+ name = sql_name
+
+ logger.debug(f"解析结果 - 命名空间: {namespace}, 模板名: {name}")
+ logger.debug(f"可用命名空间: {list(self.templates.keys())}")
+
+ # 检查命名空间是否存在
+ if namespace and namespace not in self.templates:
+ logger.error(f"命名空间 '{namespace}' 不存在,可用命名空间: {list(self.templates.keys())}")
+ raise KeyError(f"找不到命名空间: {namespace}")
+
+ # 检查SQL名称是否存在
+ available_templates = list(self.templates[namespace].keys())
+ logger.debug(f"命名空间 '{namespace}' 下的可用模板: {available_templates}")
+
+ if name and name not in self.templates[namespace]:
+ logger.error(f"SQL模板 '{name}' 在命名空间 '{namespace}' 下不存在,可用模板: {available_templates}")
+ raise KeyError(f"在命名空间 '{namespace}' 下找不到SQL模板: {name}")
+
+ sql = self.templates[namespace][name]
+ logger.debug(f"成功获取SQL模板,内容长度: {len(sql)} 字符")
+ return sql
+
+ except KeyError:
+ raise
+ except Exception as e:
+ logger.error(f"获取SQL模板时出错: {str(e)}", exc_info=True)
+ raise
+
+ async def reload_template(self, template_path):
+ """重新加载指定的SQL模板文件(异步版本)
+
+ Args:
+ template_path: SQL模板文件的路径,可以是绝对路径或相对于sql_dir的相对路径
+
+ Returns:
+ bool: 重新加载是否成功
+ """
+ try:
+ # 确定模板文件的完整路径
+ if self.sql_dir and not os.path.isabs(template_path):
+ file_path = os.path.join(self.sql_dir, template_path)
+ else:
+ file_path = template_path
+
+ # 获取文件的绝对路径
+ file_abs_path = os.path.abspath(file_path)
+
+ # 如果文件已加载,则从已加载列表中移除
+ if file_abs_path in self._loaded_files:
+ self._loaded_files.remove(file_abs_path)
+ # 清除映射表,下次访问时会重新构建
+ self._template_map.clear()
+ # 清除Redis中的模板数据
+ await self._clear_redis_data()
+
+ # 重新加载模板,立即构建映射
+ success = await self.load_template(file_abs_path, build_map=True)
+ # 如果加载成功,更新Redis
+ if success:
+ await self._save_to_redis()
+ return success
+ except Exception as e:
+ logger.error(f"重新加载SQL模板失败: {str(e)}", exc_info=True)
+ return False
+
+ async def _check_templates_loaded_from_redis(self) -> bool:
+ """
+ 检查Redis中是否已经加载了SQL模板
+
+ Returns:
+ bool: 如果Redis中已加载返回True,否则返回False
+ """
+ try:
+ return await redisKit.exists(REDIS_SQL_TEMPLATES_LOADED_KEY)
+ except Exception as e:
+ logger.error(f"检查Redis中SQL模板状态失败: {str(e)}")
+ return False
+
+ async def _load_from_redis(self):
+ """
+ 从Redis加载SQL模板数据
+ """
+ try:
+ # 加载templates
+ templates_str = await redisKit.get_data(REDIS_SQL_TEMPLATES_KEY)
+ if templates_str:
+ self.templates = json.loads(templates_str)
+
+ # 加载loaded_files
+ loaded_files_str = await redisKit.get_data(REDIS_SQL_LOADED_FILES_KEY)
+ if loaded_files_str:
+ self._loaded_files = set(json.loads(loaded_files_str))
+
+ # 加载template_map
+ template_map_str = await redisKit.get_data(REDIS_SQL_TEMPLATE_MAP_KEY)
+ if template_map_str:
+ self._template_map = json.loads(template_map_str)
+
+ except Exception as e:
+ logger.error(f"从Redis加载SQL模板数据失败: {str(e)}")
+ # 出错时不抛出异常,使用内存中的默认值
+
+ async def _save_to_redis(self):
+ """
+ 将SQL模板数据保存到Redis
+ """
+ try:
+ # 保存templates
+ await redisKit.set_data(REDIS_SQL_TEMPLATES_KEY, json.dumps(self.templates))
+
+ # 保存loaded_files
+ await redisKit.set_data(REDIS_SQL_LOADED_FILES_KEY, json.dumps(list(self._loaded_files)))
+
+ # 保存template_map
+ await redisKit.set_data(REDIS_SQL_TEMPLATE_MAP_KEY, json.dumps(self._template_map))
+
+ # 设置标记表示已加载
+ await redisKit.set_data(REDIS_SQL_TEMPLATES_LOADED_KEY, "1")
+
+ except Exception as e:
+ logger.error(f"将SQL模板数据保存到Redis失败: {str(e)}")
+ # 出错时不抛出异常,继续执行
+
+ async def _clear_redis_data(self):
+ """
+ 清除Redis中的模板数据
+ """
+ try:
+ await redisKit.delete(REDIS_SQL_TEMPLATES_KEY)
+ await redisKit.delete(REDIS_SQL_LOADED_FILES_KEY)
+ await redisKit.delete(REDIS_SQL_TEMPLATE_MAP_KEY)
+ await redisKit.delete(REDIS_SQL_TEMPLATES_LOADED_KEY)
+ except Exception as e:
+ logger.error(f"清除Redis中SQL模板数据失败: {str(e)}")
+ # 出错时不抛出异常,继续执行
\ No newline at end of file
diff --git a/DbKit/Test/AppTest.py b/DbKit/Test/AppTest.py
new file mode 100644
index 0000000..329c7f6
--- /dev/null
+++ b/DbKit/Test/AppTest.py
@@ -0,0 +1,22 @@
+import asyncio
+import logging
+from DbKit.Db import Db
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+async def test_app_template():
+ """测试App.sql模板解析和加载"""
+ db = Db()
+
+ # 初始化数据库连接
+ await db.init_db()
+
+ list = await db.find("AppType.getAppType")
+ print( list)
+
+
+
+if __name__ == '__main__':
+ asyncio.run(test_app_template())
\ No newline at end of file
diff --git a/DbKit/Test/Test.py b/DbKit/Test/Test.py
new file mode 100644
index 0000000..0c0a0b7
--- /dev/null
+++ b/DbKit/Test/Test.py
@@ -0,0 +1,66 @@
+import asyncio
+import logging
+from DbKit.Db import Db
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+"""测试查询t_teacher_app表"""
+db = Db()
+
+async def test_find_teacher_app():
+ try:
+ # 执行查询
+ sql = "select * from t_teacher_app where app_name=:app_name"
+ params = {"app_name": "半角模型"}
+ logger.info(f"执行查询: {sql}")
+ result = await db.find(sql, params)
+
+ logger.info(f"查询结果数量: {len(result)}")
+ # 打印部分结果(前3条)
+ for i, row in enumerate(result[:3]):
+ logger.info(f"第{i + 1}条记录: {row}")
+
+ return result
+ except Exception as e:
+ logger.error(f"查询失败: {str(e)}", exc_info=True)
+ raise
+
+
+async def test_sql_template():
+ try:
+ # 初始化数据库连接
+ await db.init_db()
+
+ # 测试获取App.getAppList模板
+ logger.info("尝试获取App.getAppList模板...")
+ sql_content = await db.get_sql("App.getAppList")
+ logger.info(f"成功获取App.getAppList模板,内容长度: {len(sql_content)} 字符")
+ logger.info(f"模板内容前100字符: {sql_content[:100]}")
+
+ # 测试分页查询
+ logger.info("测试分页查询...")
+ result = await db.paginate("App.getAppList", page_number=1, page_size=5)
+ logger.info(f"分页查询结果: {len(result.get('list', []))} 条记录")
+
+ except Exception as e:
+ logger.error(f"SQL模板测试失败: {str(e)}", exc_info=True)
+ raise
+
+async def run_all_tests():
+ """运行所有测试"""
+ logger.info("开始运行所有测试...")
+
+ # 测试SQL模板自动加载
+ await test_sql_template()
+
+ # 测试查询功能
+ await test_find_teacher_app()
+
+ logger.info("所有测试完成!")
+
+
+if __name__ == '__main__':
+ # 运行异步测试
+ asyncio.run(run_all_tests())
diff --git a/DbKit/TransactionContext.py b/DbKit/TransactionContext.py
new file mode 100644
index 0000000..3cf952e
--- /dev/null
+++ b/DbKit/TransactionContext.py
@@ -0,0 +1,41 @@
+class TransactionContext:
+ """
+ 事务上下文管理器类(异步版本)
+ 支持异步事务管理,配合异步Db类使用
+ """
+
+ def __init__(self, db_instance):
+ """
+ 初始化事务上下文管理器
+
+ Args:
+ db_instance: 异步Db实例
+ """
+ self.db = db_instance
+ self.session = None
+
+ async def __aenter__(self):
+ """
+ 进入异步上下文时创建会话
+ """
+ self.session = await self.db.get_session()
+ return self.session
+
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
+ """
+ 退出异步上下文时提交或回滚事务
+ """
+ try:
+ if exc_type is None:
+ # 如果没有异常,提交事务
+ await self.session.commit()
+ else:
+ # 如果有异常,回滚事务
+ await self.session.rollback()
+ finally:
+ # 无论如何都关闭会话
+ if self.session:
+ await self.session.close()
+
+ # 返回False表示不抑制异常
+ return False
\ No newline at end of file
diff --git a/DbKit/__init__.py b/DbKit/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/DbKit/__pycache__/Db.cpython-310.pyc b/DbKit/__pycache__/Db.cpython-310.pyc
new file mode 100644
index 0000000..a6822a1
Binary files /dev/null and b/DbKit/__pycache__/Db.cpython-310.pyc differ
diff --git a/DbKit/__pycache__/Db.cpython-313.pyc b/DbKit/__pycache__/Db.cpython-313.pyc
new file mode 100644
index 0000000..90778e6
Binary files /dev/null and b/DbKit/__pycache__/Db.cpython-313.pyc differ
diff --git a/DbKit/__pycache__/SqlTemplateLoader.cpython-310.pyc b/DbKit/__pycache__/SqlTemplateLoader.cpython-310.pyc
new file mode 100644
index 0000000..6dc94ef
Binary files /dev/null and b/DbKit/__pycache__/SqlTemplateLoader.cpython-310.pyc differ
diff --git a/DbKit/__pycache__/SqlTemplateLoader.cpython-313.pyc b/DbKit/__pycache__/SqlTemplateLoader.cpython-313.pyc
new file mode 100644
index 0000000..ce53407
Binary files /dev/null and b/DbKit/__pycache__/SqlTemplateLoader.cpython-313.pyc differ
diff --git a/DbKit/__pycache__/TransactionContext.cpython-310.pyc b/DbKit/__pycache__/TransactionContext.cpython-310.pyc
new file mode 100644
index 0000000..c42af6a
Binary files /dev/null and b/DbKit/__pycache__/TransactionContext.cpython-310.pyc differ
diff --git a/DbKit/__pycache__/TransactionContext.cpython-313.pyc b/DbKit/__pycache__/TransactionContext.cpython-313.pyc
new file mode 100644
index 0000000..fa684fd
Binary files /dev/null and b/DbKit/__pycache__/TransactionContext.cpython-313.pyc differ
diff --git a/DbKit/__pycache__/__init__.cpython-310.pyc b/DbKit/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..de2b678
Binary files /dev/null and b/DbKit/__pycache__/__init__.cpython-310.pyc differ
diff --git a/DbKit/__pycache__/__init__.cpython-313.pyc b/DbKit/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000..00ae541
Binary files /dev/null and b/DbKit/__pycache__/__init__.cpython-313.pyc differ
diff --git a/Doc/1、ADB安装与配置.md b/Doc/1、ADB安装与配置.md
new file mode 100644
index 0000000..9ba29b3
--- /dev/null
+++ b/Doc/1、ADB安装与配置.md
@@ -0,0 +1,207 @@
+## ADB安装及使用详解
+
+### 一、文档
+
+[文档 ](https://blog.csdn.net/A1_3_9_7/article/details/147744713)
+
+### 二、下载与配置
+
+Windows版本
+
+```http
+https://dl.google.com/android/repository/platform-tools-latest-windows.zip
+```
+
+**配置环境变量**
+
+解压安装后,把解压路径放到系统变量里去(Path),
+
+环境变量如何配置,比如我的配置如下图:
+
+
+
+3、连接
+可以通过模拟器连接,也可以通过数据线连接。
+
+通过数据线连接时,手机进入“开发者选项”,打开“usb调试”。
+
+不同品牌安卓机型,首次打开“开发者选项”方式不一样,大多是双击手机版本号3~5次,会toast提醒“开发者模式已打开”,具体打开方式可根据手机品牌进行百度查询
+
+4、电脑打开cmd窗口
+输入 adb version :显示 adb 版本,说明安装成功
+
+
+
+### 三、ADB命令详解
+
+#### **1、基本命令**
+
+> **adb version :显示 adb 版本**
+
+
+
+**adb help:帮助信息,查看adb所支持的所有命令**
+
+
+
+**adb get-serialno:也可以查看设备号**
+
+
+
+#### **权限命令**
+
+> **adb root:获取Android管理员(root用户)的权限。**
+>
+> **注意**:一般测试机可使用root权限。
+>
+> Android版本9以上,不支持商用机使用root权限,但可以修改底层一些配置
+
+
+
+**adb shell:登录设备 shell,该命令将登录设备的shell(内核),登录shell后,可以使用 cd,ls,rm 等Linux命令**
+
+
+
+adb remount:获取System分区可写权限,需要root后才能有这个权限
+
+#### **3、建立连接**
+
+> **adb -d:如果同时连了usb,又开了模拟器,连接当前唯一通过usb连接的安卓设备**
+>
+> **adb -e shell:指定当前连接此电脑的唯一的一个模拟器**
+>
+> **adb -s <设备号> shell:当电脑插多台手机或模拟器时,指定一个设备号进行连接**
+
+
+
+**exit:退出**
+
+
+
+**adb kill-server:杀死当前adb服务,如果连不上设备时,杀掉重启。(没事不要用它)**
+
+
+
+**adb start-server:杀掉后重启**
+
+
+
+**5037:adb默认端口,如果该端口被占用,可以指定一个端口号,如下命令↓**
+
+**adb -p 6666 start-server:任意指定一个 adb shell 的端口**
+
+
+
+#### **4、apk 操作指令**
+
+> **adb shell pm list packages:列出当前设备/手机,所有的包名**
+
+
+
+**adb shell pm list packages -f:显示包和包相关联的文件(安装路径)**
+
+
+
+adb shell pm list packages -d:显示禁用的包名
+adb shell pm list packages -e:显示当前启用的包名
+adb shell pm list packages -s:显示系统应用包名
+adb shell pm list packages -3:显示已安装第三方的包名
+adb shell pm list packages xxxx:加需要过滤的包名,如:xxx = taobao
+adb install <文件路径\apk>:将本地的apk软件安装到设备(手机)上。如手机外部安装需要密码,记得手机输入密码。
+
+
+
+**adb install -r <文件路径\apk>:覆盖安装**
+
+
+
+adb install -d <文件路径\apk>:允许降级覆盖安装
+adb install -g <文件路径\apk>:授权/获取权限,安装软件时把所有权限都打开
+adb uninstall <包名>:卸载该软件/app。
+注意:安装时安装的是apk,卸载时是包名,可以通过 adb shell pm list packages 查看需要卸载的包名。
+
+
+
+**adb shell pm uninstall -k <包名>:虽然把此应用卸载,但仍保存此应用的数据和缓存
+adb shell am force-stop <包名>:强制退出该应用/app**
+
+
+
+#### 、文件操作指令
+
+> **adb push <本地路径\文件或文件夹> <手机端路径>:把本地(pc机)的文件或文件夹复制到设备(手机)**
+
+
+
+注意点1:pc机路径与Android机路径,分隔符是不同的。
+
+注意点2:复制失败,大概率是无权限。可先使用上面介绍过的两个命令:adb root;adb remount。在使用 adb push 命令
+
+**adb pull <手机端路径/文件或文件夹> :把设备(手机)的文件或文件夹复制到本地。**注意点同上
+
+
+
+#### 6、日志操作指令
+
+```
+adb shell logcat -c:清理现有日志
+adb shell logcat -v time :输出日志,信息输出在控制台
+adb shell logcat -v time > <存放路径\log.txt>:输出日志并保存在本地文件
+Ctrl+C:终止日志抓取
+adb shell logcat -v time *:E > <存放路径\log.txt>:打印级别为Error的信息
+日志的等级:
+-v:Verbse(明细)
+-d:Debug(调试)
+-i:Info(信息)
+-w:Warn(警告)
+-e:Error(错误)
+-f:Fatal(严重错误)
+抓取日志的步骤先输入命令启动日志,然后操作 App,复现 bug,再 ctrl+c 停止日志,分析本地保存的文件。
+:日志是记录手机系统在运行app时有什么异常的事件
+EXCEPTION
+也可以把更详细得Anr日志拉取出来:adb shell pull /data/anr/traces.txt <存放路径>
+
+```
+
+#### 7、系统操作指令
+
+```
+adb shell getprop ro.product.model:获取设备型号
+```
+
+
+
+**adb shell getprop ro.build.version.release:获取Android系统版本**
+
+
+
+**adb get-serialno:获取设备的序列号(设备号)**
+
+
+
+**adb shell wm size:获取设备屏幕分辨率**
+
+
+
+**adb shell screencap -p /sdcard/mms.png:屏幕截图
+adb shell screencap -p /sdcard/screenshot.png:屏幕截图**
+
+
+
+
+
+**adb shell dumpsys activity |find “mResumedActivity”:查看前台应用包名,必须先启动app,适用于Android 8.0以上**
+
+
+
+**adb shell cat /proc/meminfo:获取手机内存信息**
+
+
+
+**adb shell df:获取手机存储信息**
+
+
+
+**adb shell screenrecord <存放路径/xxx.mp4>:录屏,命名以.mp4结尾
+adb shell screenrecord --time-limit 10 <存放路径/xxx.mp4>:录屏时间为10秒**
+
diff --git a/Doc/2、Python + uiautomator2.md b/Doc/2、Python + uiautomator2.md
new file mode 100644
index 0000000..954c4d3
--- /dev/null
+++ b/Doc/2、Python + uiautomator2.md
@@ -0,0 +1,79 @@
+文档
+
+https://zhuanlan.zhihu.com/p/19790598010
+
+
+
+```cmd
+pip install -U uiautomator2
+pip install uiautodev
+pip install pillow
+```
+
+
+
+**启动**
+
+```
+uiauto.dev
+```
+
+
+
+**探秘工作原理,知其然更知其所以然**
+
+python - uiautomator2主要由两部分组成:Python客户端和移动设备。
+
+1. **Python端**:负责运行我们编写的脚本,然后向移动设备发送HTTP请求。
+2. **移动设备**:运行着封装了uiautomator2的HTTP服务,收到请求后,解析请求内容,并把它转化成uiautomator2的代码。
+
+整个工作流程如下:先在移动设备上安装atx - agent(它是个守护进程),安装好后atx - agent会启动uiautomator2服务(默认7912端口),开始监听。然后在PC上编写测试脚本并执行,这个过程就相当于向移动设备的server端发送HTTP请求。最后移动设备通过WIFI或USB接收到请求,执行相应的操作。
+
+
+
+```
+# 通过包名启动
+d.app_start("com.tencent.mm") # 启动微信
+```
+
+https://zhuanlan.zhihu.com/p/25181382631
+
+```
+# 等待元素出现(最多10秒,间隔1秒)
+d(text="登录").wait(timeout=10, interval=1.0)
+d(text="登录").click()
+
+# 等待元素消失
+d(text="加载中...").wait_gone(timeout=10)
+```
+
+
+
+https://uiauto.dev/
+
+```
+adb kill-server
+adb start-server
+```
+
+https://github.com/appium/appium-uiautomator2-server/releases
+
+
+
+关闭华为手机鸿蒙3的纯净模式
+
+```
+adb shell pm disable-user com.huawei.security.privacycenter
+adb shell pm disable-user com.huawei.appmarket
+```
+
+
+
+```
+adb install -r appium-uiautomator2-server-v9.9.1.apk
+adb shell am instrument -w -e debug false io.appium.uiautomator2.server/.ServerInstrument
+adb shell am broadcast -a uiautomator.dump
+adb pull /sdcard/window_dump.xml .
+```
+
+adb uiautomator dump /data/local/tmp/ui.xml
\ No newline at end of file
diff --git a/Doc/3、安装DorisV2.19+Docker版本.txt b/Doc/3、安装DorisV2.19+Docker版本.txt
new file mode 100644
index 0000000..e36cc74
--- /dev/null
+++ b/Doc/3、安装DorisV2.19+Docker版本.txt
@@ -0,0 +1,26 @@
+# 配置Docker
+
+# 下载脚本
+wget https://doris.apache.org/files/start-doris.sh
+
+# 运行以下命令,给其赋有相应的执行权限。
+chmod 755 start-doris.sh
+
+# 运行脚本,启动集群,默认使用2.1.9版本
+bash start-doris.sh
+
+# connect a alive FE node
+mysql -uroot -P9030 -h127.0.0.1
+
+# register BE node
+ALTER SYSTEM ADD BACKEND "10.10.14.204:9050";
+
+# 查看状态
+show backends;
+
+-- modify the password for current user
+SET PASSWORD = PASSWORD('DsideaL147258369');
+
+create database yltcharge;
+
+https://doris.apache.org/zh-CN/docs/dev/gettingStarted/quick-start
\ No newline at end of file
diff --git a/Doc/4、流程说明.md b/Doc/4、流程说明.md
new file mode 100644
index 0000000..b596098
--- /dev/null
+++ b/Doc/4、流程说明.md
@@ -0,0 +1,161 @@
+# 新电途微信小程序爬虫流程说明文档
+
+本文档详细记录了“新电途”微信小程序爬虫的工作流程、技术细节、避坑指南及维护策略,旨在帮助开发人员快速理解系统架构,应对 UI 变更及设备更换等场景。
+
+---
+
+## 1. 项目概述
+
+本项目是一个基于 **Python + uiautomator2 + 视觉大模型 (VL) + 计算机图形学 (CV)** 的自动化爬虫系统。
+其核心目标是模拟用户操作,遍历“新电途”小程序的场站列表,识别场站信息(名称、价格、空闲桩数),并进入详情页抓取地址和分时电价。
+
+### 核心技术栈
+* **控制端**: `uiautomator2` (Android 自动化控制)
+* **视觉识别 (VL)**: 阿里云 Qwen-VL / DeepSeek (负责复杂的文字和语义提取)
+* **计算机图形学 (CV)**: OpenCV (负责快速、低成本的广告检测、按钮定位、图像切片)
+* **数据存储**: Doris (MySQL 协议) + Redis (去重缓存) + Huawei OBS (图片存储)
+
+---
+
+## 2. 核心流程图解
+
+```mermaid
+graph TD
+ A[启动程序 (Y5_Full)] --> B[Step 0: 初始化服务 & 数据库]
+ B --> C[Step 1: 打开小程序 (Y2)]
+ C --> D{检测广告 (CV)}
+ D -- 有广告 --> E[点击关闭 (CV模板/几何)]
+ D -- 无广告 --> F[Step 2: 列表页爬取 (Y3)]
+ E --> F
+ F --> G[截图 & 切片 (CV)]
+ G --> H[上传图片至 OBS]
+ H --> I[调用 VL 模型解析场站列表]
+ I --> J{是否存在有效场站?}
+ J -- 是 --> K[遍历场站]
+ K --> L{是否已处理? (Redis)}
+ L -- 否 --> M[点击进入详情页]
+ M --> N[截图详情页 & 解析地址]
+ N --> O[抓取分时电价 (可选)]
+ O --> P[返回列表页]
+ P --> K
+ L -- 是 --> K
+ J -- 否 --> Q[下拉翻页]
+ Q --> F
+ Q -- 结束 --> R[Step 3: 坐标回填 (Y4)]
+ R --> S{Cookie 有效?}
+ S -- 是 --> T[高德 API 查询 & 更新 DB]
+ S -- 否 --> U[弹窗手动登录 (T2)]
+ U --> T
+```
+
+---
+
+## 3. 详细步骤与技术实现
+
+### 步骤 0: 初始化 (`Y5_Full.py`)
+* **动作**: 程序启动时,首先初始化 `XinDianTuService` 并连接数据库。
+* **目的**: 确保后续爬取过程中数据库连接立即可用,避免在写入数据时才初始化导致的延迟或错误。
+* **注意**: 数据库连接采用单例模式或长连接,程序结束时需显式关闭。
+
+### 步骤 1: 启动小程序 (`Y2_OpenXinDianTu.py`)
+* **动作**:
+ 1. 强制停止微信并重新启动,确保回到微信主页。
+ 2. 点击底部“微信”标签。
+ 3. 点击右上角“搜索”按钮(基于百分比坐标)。
+ 4. 输入“新电途”并点击搜索结果进入小程序。
+* **坑点**:
+ * **搜索入口坐标**: 搜索按钮的位置在不同分辨率手机上略有差异,目前使用 `w * 0.84`, `h * 0.08`。如果更换手机,需检查此坐标。
+ * **输入法干扰**: `uiautomator2` 的输入法有时会失效,代码中做了 `send_keys(clear=True)` 和直接输入的双重兜底。
+
+### 步骤 2: 列表页爬取 (`Y3_StationList.py`)
+这是最核心的循环步骤(如需广告检测会自动调用 CV 模块):
+1. **截图**: `d.screenshot()`。
+2. **图像切片 (CV)**: 调用 `Kit.crop_cards_from_image`。
+ * 利用**行扫描算法**,根据像素亮度和方差,识别出场站卡片之间的灰色分割线,将大图切割成一个个小卡片 (`_vl.jpg` 实际上是带绿框的整图,配合 JSON 元数据)。
+ * **优势**: 极大降低了 VL 模型的理解难度,模型只需识别框内内容,不用自己找位置。
+3. **VL 解析**: 将图片上传 OBS,调用 VL 模型(Qwen/DeepSeek)。
+ * **Prompt**: 要求模型提取“场站名称”、“价格”、“枪数”、“距离”等。
+4. **坐标映射与安全检查**:
+ * 模型返回的坐标会结合 `device_info` (设备真实宽高) 进行校验。
+ * **Config.py**: `SAFE_EXCLUDE_RATIO=0.20` (顶部20%不点),`BOTTOM_SAFE_EXCLUDE_RATIO=0.1` (底部10%不点)。**这解决了第一屏场站无法点击的问题。**
+
+### 步骤 3: 坐标回填 (`Y4_Coord.py`)
+* **动作**: 扫描数据库中 `address` 不为空但 `coord_x/y` 为空的记录,调用高德地图 API 补全经纬度。
+* **智能修复**:
+ * 任务开始前会自动探测 Cookie 有效性。
+ * 如果 Cookie 失效,自动调用 `T2_GetAmapCookie` 弹出浏览器窗口让用户手动登录。
+ * 登录完成后,程序自动保存新 Cookie 并继续执行回填任务,无需重启。
+
+
+---
+
+## 4. 技术选型指南:何时用 CV?何时用 VL?
+
+| 场景 | 推荐技术 | 理由 |
+| :--- | :--- | :--- |
+| **广告关闭按钮** | **CV (OpenCV)** | 图标固定、形状简单(圆/叉)、要求毫秒级响应、零成本。 |
+| **隐私协议按钮** | **CV (OpenCV)** | 颜色特征明显(黑色块)、位置固定。 |
+| **场站卡片切分** | **CV (行扫描)** | 列表页结构规律,分割线特征稳定,CV 切分极其精准且快。 |
+| **读取场站名称** | **VL (大模型)** | 字体多样、可能有干扰、OCR 传统方案容易错乱,VL 语义理解能力强。 |
+| **读取价格/枪数** | **VL (大模型)** | 格式复杂("快 闲4/4"),VL 能直接提取结构化 JSON。 |
+| **寻找"全部时段"** | **CV (几何特征)** | 按钮只有文字没有边框,但左右空白特征明显,用边缘检测更可靠。 |
+
+**总结**:
+* **结构固定、特征简单、追求速度** -> 用 CV。
+* **语义复杂、内容多变、容错率高** -> 用 VL。
+
+---
+
+## 5. 关键参数配置 (`Config/Config.py`)
+
+| 参数名 | 当前值 | 说明 | 调整场景 |
+| :--- | :--- | :--- | :--- |
+| `SAFE_EXCLUDE_RATIO` | **0.20** | **顶部**安全排除比例。在此比例内的坐标不点击。 | 如果发现第一屏顶部的场站无法点击,**调小**此值。 |
+| `BOTTOM_SAFE_EXCLUDE_RATIO` | **0.1** | **底部**安全排除比例。避开“扫码充电”等按钮。 | 如果频繁误触底部按钮,**调大**此值。 |
+| `SCROLL_DISTANCE_RATIO` | **0.3** | 翻页滑动幅度的比例。 | 如果翻页太快漏数据,**调小**;翻页太慢,**调大**。 |
+| `MAX_CRAWL_DISTANCE` | **50** | 最大爬取距离 (km)。 | 根据业务需求调整爬取范围。 |
+| `VL_MODEL_NAME` | `qwen3-vl-flash` | 使用的视觉模型版本。 | 如果识别准确率下降,可尝试升级模型。 |
+
+---
+
+## 6. 避坑指南与设备更换
+
+### Q1: 更换手机需要注意什么?
+1. **分辨率差异**:
+ * 代码大部分使用了**相对坐标 (百分比)**,理论上兼容不同分辨率。
+ * **重点检查**: `Y2_OpenXinDianTu.py` 中的搜索按钮点击坐标 (`0.84, 0.08`)。新手机可能刘海屏高度不同,导致 Y 轴偏移。
+2. **截图尺寸 vs 屏幕尺寸**:
+ * 某些手机截图分辨率与 `d.info` 获取的屏幕分辨率不一致(如 Retina 缩放)。
+ * **解决方案**: `Y3_StationList.py` 中已包含自动检测逻辑:`if img_w != w: device_info['width'] = img_w`。一般无需手动修改。
+
+### Q2: 小程序 UI 大改版怎么办?
+1. **列表样式变更**:
+ * 如果列表不再有明显的灰色分割线,`Kit.py` 的切片逻辑 (`get_card_segments`) 会失效。
+ * **应对**: 修改 `Kit.py`,改用 VL 模型直接进行全图目标检测 (Object Detection),或者调整 CV 分割线的颜色阈值。
+2. **广告样式变更**:
+ * 如果出现新广告,截图保存到 `Tools/Templates`,命名为 `ad_close_new.jpg` 即可,代码会自动加载。
+
+### Q3: 为什么有场站但没点进去?
+1. **被安全区拦截**: 检查日志 `safe exclude` 关键字。如果是误拦截,调整 `SAFE_EXCLUDE_RATIO`。
+2. **VL 识别失败**: 检查 `Images/` 目录下的 `_vl.jpg`,看绿框是否框住了场站。如果没有,说明 CV 切片参数 (`Kit.py`) 需要调整(如 `row_mean` 阈值)。
+
+---
+
+## 7. 调试与单元测试
+
+虽然本项目没有使用标准的 `unittest` 框架,但每个核心模块都设计了**独立运行入口 (`if __name__ == "__main__":`)**,方便单步调试。
+
+### 单元调试清单
+
+| 功能模块 | 对应文件 | 调试方法 | 作用 |
+| :--- | :--- | :--- | :--- |
+| **广告检测 (CV)** | `Util/Kit.py` | 无法直接运行,需编写临时脚本调用 `detect_ad_close_x`。建议在 `Tools/T3_CropCards.py` 中添加测试代码。 | 测试新广告模板是否生效。 |
+| **切片逻辑 (CV)** | `Tools/T3_CropCards.py` | 运行该脚本,会自动读取 `Samples` 目录下的图片进行切片测试。 | 调试列表分割线识别参数。 |
+| **进入小程序** | `Tools/Y2_OpenXinDianTu.py` | 直接运行该文件。 | 测试微信启动和搜索流程。 |
+| **列表爬取主循环** | `Tools/Y3_StationList.py` | 直接运行该文件 (需连接手机)。 | 独立测试爬取流程,不依赖外部调度。 |
+| **全流程** | `Tools/Y5_Full.py` | 直接运行该文件。 | 生产环境模拟(含坐标回填)。 |
+
+### 建议的开发习惯
+1. **遇到新 Bug**: 先看日志 (`Tools/Logs/`), 确定是哪一步卡住。
+2. **保留现场**: `KEEP_SCREENSHOTS = True` (在 `Y3_StationList.py`),开启后会保留所有截图,方便事后分析。
+3. **单步验证**: 如果是广告检测问题,把截图拿出来,写个几行的 Python 脚本单独调用 `Kit.detect_ad_close_x` 进行验证,不要每次都跑全流程。
diff --git a/Doc/5、统计表结构说明.md b/Doc/5、统计表结构说明.md
new file mode 100644
index 0000000..3410417
--- /dev/null
+++ b/Doc/5、统计表结构说明.md
@@ -0,0 +1,171 @@
+# 充电桩数据仓库设计说明文档
+
+本文档详细描述了充电桩爬虫项目的数据仓库设计思路、表结构定义、常见查询场景及应对策略。该设计基于 Doris 数据库,采用拉链表(SCD Type 2)思想,旨在完整保留历史数据变更轨迹,支持时间旅行查询(Time Travel Query)。
+
+## 1. 设计思路:为何选择 SCD Type 2 拉链表?
+
+在充电桩业务中,数据具有不同的更新频率和业务含义:
+
+1. **基础信息(Profile)**:如场站名称、地址。这些信息相对稳定,偶尔变化(如更名、迁址)。
+2. **实时状态(Status)**:如空闲桩数、总桩数。这些信息变化极快(分钟级),是分析热度的关键。
+3. **价格策略(Price)**:如分时电价。通常按天或月调整,但一旦调整需要保留历史价格以核对账单或分析价格趋势。
+
+如果仅保存“最新状态”,我们将丢失所有历史轨迹,无法回答“上个月该站点的平均空闲率是多少”或“价格调整前后的流量对比”等问题。
+
+因此,我们采用 **SCD Type 2(Slowly Changing Dimension Type 2)** 拉链表设计:
+* 每条记录都有 `valid_start_time`(生效时间)和 `valid_end_time`(失效时间)。
+* 当前有效的记录,`valid_end_time` 通常设为极大值(如 `9999-12-31`)。
+* 当数据发生变化时:
+ 1. 将旧记录的 `valid_end_time` 更新为当前时间(闭链)。
+ 2. 插入一条新记录,`valid_start_time` 为当前时间,`valid_end_time` 为极大值(开链)。
+
+## 2. 表结构定义
+
+### 2.1 充电站基础信息表 (`station_profile_scd`)
+* **用途**:存储场站名称、地址等相对稳定的属性。
+* **业务主键**:`station_hash` (名称的MD5,确保唯一性)。
+
+| 字段名 | 类型 | 说明 |
+| :--- | :--- | :--- |
+| `id` | VARCHAR(50) | 物理主键 (UUID),每条历史记录唯一 |
+| `station_hash` | VARCHAR(32) | **业务主键**,同一场站的所有历史记录此值相同 |
+| `station_name` | VARCHAR(255) | 场站名称 |
+| `address` | VARCHAR(500) | 详细地址 |
+| `valid_start_time` | DATETIME | 记录生效时间 |
+| `valid_end_time` | DATETIME | 记录失效时间 (默认 9999-12-31) |
+| `is_current` | TINYINT | 是否为当前最新记录 (1=是, 0=否) |
+
+### 2.2 充电站实时状态表 (`station_status_scd`)
+* **用途**:高频存储场站的桩数、空闲情况。
+* **特点**:数据量大,通过拉链表仅记录“状态发生变化”的时刻,节省空间。
+
+| 字段名 | 类型 | 说明 |
+| :--- | :--- | :--- |
+| `id` | VARCHAR(50) | 物理主键 (UUID) |
+| `station_hash` | VARCHAR(32) | 业务主键 |
+| `total_piles` | INT | 总桩数 |
+| `free_piles` | INT | 空闲桩数 |
+| `piles_detail_json` | TEXT | 桩详情JSON (如 `{"快": {"free": 2, "total": 10}, "慢": ...}`) |
+| `current_price` | DECIMAL | 抓取时的当前电价快照 |
+| `valid_start_time` | DATETIME | 生效时间 |
+| `valid_end_time` | DATETIME | 失效时间 |
+| `is_current` | TINYINT | 是否最新 |
+
+### 2.3 充电站价格时段表 (`station_price_schedule_scd`)
+* **用途**:存储全天的分时电价表。
+
+| 字段名 | 类型 | 说明 |
+| :--- | :--- | :--- |
+| `id` | VARCHAR(50) | 物理主键 (UUID) |
+| `station_hash` | VARCHAR(32) | 业务主键 |
+| `schedule_json` | TEXT | 价格时段JSON数组 |
+| `valid_start_time` | DATETIME | 生效时间 |
+| `valid_end_time` | DATETIME | 失效时间 |
+| `is_current` | TINYINT | 是否最新 |
+
+## 3. 常见查询场景及 SQL 写法
+
+### 场景一:查询所有场站的“当前”最新状态
+这是最常用的查询,用于实时展示。
+
+```sql
+SELECT
+ p.station_name,
+ p.address,
+ s.total_piles,
+ s.free_piles,
+ s.current_price
+FROM
+ station_profile_scd p
+JOIN
+ station_status_scd s ON p.station_hash = s.station_hash
+WHERE
+ p.is_current = 1
+ AND s.is_current = 1;
+```
+
+### 场景二:查询“指定时间点”的历史快照
+例如:查询 **2023-10-01 14:00:00** 这一刻,所有场站的状态。
+这是拉链表的杀手锏功能。
+
+```sql
+SET @query_time = '2023-10-01 14:00:00';
+
+SELECT
+ p.station_name,
+ s.free_piles,
+ s.current_price
+FROM
+ station_profile_scd p
+JOIN
+ station_status_scd s ON p.station_hash = s.station_hash
+WHERE
+ -- 核心逻辑:查询时间落在生效区间内
+ (@query_time >= p.valid_start_time AND @query_time < p.valid_end_time)
+ AND (@query_time >= s.valid_start_time AND @query_time < s.valid_end_time);
+```
+
+### 场景三:分析某场站过去24小时的空闲桩变化趋势
+我们需要按时间顺序拉出该场站的所有状态变更记录。
+
+```sql
+SELECT
+ valid_start_time AS change_time,
+ free_piles,
+ total_piles,
+ ROUND(free_piles / total_piles * 100, 2) AS free_rate_percent
+FROM
+ station_status_scd
+WHERE
+ station_hash = 'TARGET_STATION_MD5'
+ AND valid_start_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
+ORDER BY
+ valid_start_time ASC;
+```
+
+### 场景四:统计过去一个月,价格发生过变动的场站
+通过查找 `station_price_schedule_scd` 表中同一个 `station_hash` 有多条记录的情况。
+
+```sql
+SELECT
+ p.station_name,
+ COUNT(pr.id) AS price_change_count
+FROM
+ station_price_schedule_scd pr
+JOIN
+ station_profile_scd p ON pr.station_hash = p.station_hash AND p.is_current = 1
+WHERE
+ pr.valid_start_time >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
+GROUP BY
+ p.station_name
+HAVING
+ COUNT(pr.id) > 1
+ORDER BY
+ price_change_count DESC;
+```
+
+## 4. 数据写入与维护策略
+
+为了维护 SCD2 结构,写入程序(Crawler/ETL)需要遵循以下逻辑:
+
+1. **计算 Hash**:对抓取到的场站名称计算 MD5,作为 `station_hash`。
+2. **查询最新状态**:根据 `station_hash` 查询 `is_current=1` 的记录。
+3. **比对差异**:
+ * **Profile**: 比对名称、地址是否变化。
+ * **Status**: 比对总桩数、空闲数、价格是否变化。
+ * **Price**: 比对价格时段 JSON 是否变化。
+4. **无变化**:跳过,不进行任何数据库操作。
+5. **有变化**:
+ * **Step 1 (Close)**: 更新旧记录:`UPDATE table SET valid_end_time = NOW(), is_current = 0 WHERE id = 'old_uuid'`。
+ * **Step 2 (Insert)**: 插入新记录:`INSERT INTO table (..., valid_start_time=NOW(), is_current=1)`。
+ * *注意:Step 1 和 Step 2 最好在一个事务中完成,或者保证最终一致性。*
+
+## 5. 性能优化建议
+
+1. **分桶 (Bucketing)**:建表时使用了 `DISTRIBUTED BY HASH(station_hash) BUCKETS 10`。这保证了同一个场站的所有历史记录都落在同一个 Tablet 上,极大地优化了基于 `station_hash` 的 Join 和聚合查询性能。
+2. **分区 (Partitioning)**:当前未显式使用时间分区。如果数据量达到亿级,建议按 `valid_start_time` 进行 Range 分区(如按月),以便冷热数据分离和快速清理过期历史数据。
+3. **索引**: Doris 自动为前缀列创建索引。由于我们常按 `station_hash` 查询,它被放在表定义的列首(或紧跟 ID),查询效率很高。
+
+---
+**文档维护人**: AI Assistant
+**最后更新**: 2026-01-08
diff --git a/Model/StationPriceSchedule.py b/Model/StationPriceSchedule.py
new file mode 100644
index 0000000..238e713
--- /dev/null
+++ b/Model/StationPriceSchedule.py
@@ -0,0 +1,69 @@
+from sqlalchemy import text
+from datetime import datetime
+import json
+
+class StationPriceSchedule:
+ def __init__(self):
+ pass
+
+ async def save(self, session, id, station_hash, schedule_json, valid_start_time=None):
+ if valid_start_time is None:
+ valid_start_time = datetime.now()
+
+ # Ensure json is string with consistent formatting
+ schedule_json_str = None
+ if schedule_json is not None:
+ if isinstance(schedule_json, (dict, list)):
+ schedule_json_str = json.dumps(schedule_json, ensure_ascii=False, sort_keys=True)
+ else:
+ schedule_json_str = schedule_json
+
+ # 1. Check current record
+ select_sql = """
+ SELECT schedule_json
+ FROM t_station_price_schedule_scd
+ WHERE station_hash = :station_hash AND is_current = 1
+ """
+ result = await session.execute(text(select_sql), {"station_hash": station_hash})
+ current_row = result.fetchone()
+
+ if current_row:
+ row_json = current_row.schedule_json
+
+ # Normalize row_json for comparison
+ if row_json:
+ try:
+ if isinstance(row_json, str):
+ row_json_obj = json.loads(row_json)
+ row_json = json.dumps(row_json_obj, ensure_ascii=False, sort_keys=True)
+ except Exception:
+ pass
+
+ if row_json == schedule_json_str:
+ # No change, skip insert
+ return
+
+ # Expire old record
+ update_sql = """
+ UPDATE t_station_price_schedule_scd
+ SET is_current = 0, valid_end_time = :valid_start_time
+ WHERE station_hash = :station_hash AND is_current = 1
+ """
+ await session.execute(text(update_sql), {
+ "valid_start_time": valid_start_time,
+ "station_hash": station_hash
+ })
+
+ # 2. Insert new record
+ sql = """
+ INSERT INTO t_station_price_schedule_scd
+ (id, station_hash, schedule_json, valid_start_time, is_current)
+ VALUES
+ (:id, :station_hash, :schedule_json, :valid_start_time, 1)
+ """
+ await session.execute(text(sql), {
+ "id": id,
+ "station_hash": station_hash,
+ "schedule_json": schedule_json_str,
+ "valid_start_time": valid_start_time
+ })
diff --git a/Model/StationProfile.py b/Model/StationProfile.py
new file mode 100644
index 0000000..9f902f0
--- /dev/null
+++ b/Model/StationProfile.py
@@ -0,0 +1,107 @@
+from sqlalchemy import text
+from datetime import datetime
+
+class StationProfile:
+ def __init__(self):
+ pass
+
+ async def backfill_address_if_missing(self, session, station_hash, station_name, address):
+ sql = """
+ UPDATE t_station_profile_scd
+ SET address = :address,
+ station_name = :station_name
+ WHERE station_hash = :station_hash
+ AND (address IS NULL OR address = '')
+ """
+ result = await session.execute(text(sql), {
+ "station_hash": station_hash,
+ "station_name": station_name,
+ "address": address
+ })
+ try:
+ return int(result.rowcount or 0)
+ except Exception:
+ return 0
+
+ async def save(self, session, id, station_hash, operator, station_name, address=None, coord_x=None, coord_y=None, valid_start_time=None):
+ if valid_start_time is None:
+ valid_start_time = datetime.now()
+
+ # 1. Check current record
+ select_sql = """
+ SELECT operator, station_name, address, coord_x, coord_y
+ FROM t_station_profile_scd
+ WHERE station_hash = :station_hash AND is_current = 1
+ """
+ result = await session.execute(text(select_sql), {"station_hash": station_hash})
+ current_row = result.fetchone()
+
+ if current_row:
+ if address is not None and address != "" and (current_row.address is None or current_row.address == ""):
+ await self.backfill_address_if_missing(
+ session=session,
+ station_hash=station_hash,
+ station_name=station_name,
+ address=address
+ )
+ return
+
+ # Merge logic: if new value is None, use old value
+ # But we must respect if new value is explicitly provided (even empty string?)
+ # Usually for crawler:
+ # - station_name: always updated
+ # - address: if new is None, use old.
+ # - coord: if new is None, use old.
+
+ merged_address = address if address is not None else current_row.address
+ merged_coord_x = coord_x if coord_x is not None else current_row.coord_x
+ merged_coord_y = coord_y if coord_y is not None else current_row.coord_y
+
+ # Use merged values for comparison and insertion
+ address = merged_address
+ coord_x = merged_coord_x
+ coord_y = merged_coord_y
+
+ # Check if changed
+ # Need to handle potential float/decimal diffs for coords if needed,
+ # but usually they are float in DB and float in python.
+
+ is_same = (
+ current_row.operator == operator and
+ current_row.station_name == station_name and
+ current_row.address == address and
+ current_row.coord_x == coord_x and
+ current_row.coord_y == coord_y
+ )
+
+ if is_same:
+ return
+
+ # Expire old record
+ update_sql = """
+ UPDATE t_station_profile_scd
+ SET is_current = 0, valid_end_time = :valid_start_time
+ WHERE station_hash = :station_hash AND is_current = 1
+ """
+ await session.execute(text(update_sql), {
+ "valid_start_time": valid_start_time,
+ "station_hash": station_hash
+ })
+
+ # 2. Insert new record (with potentially merged values)
+ sql = """
+ INSERT INTO t_station_profile_scd
+ (id, station_hash, operator, station_name, address, coord_x, coord_y, valid_start_time, is_current)
+ VALUES
+ (:id, :station_hash, :operator, :station_name, :address, :coord_x, :coord_y, :valid_start_time, 1)
+ """
+ await session.execute(text(sql), {
+ "id": id,
+ "station_hash": station_hash,
+ "operator": operator,
+ "station_name": station_name,
+ "address": address,
+ "coord_x": coord_x,
+ "coord_y": coord_y,
+ "valid_start_time": valid_start_time
+ })
diff --git a/Model/StationStatus.py b/Model/StationStatus.py
new file mode 100644
index 0000000..c6aefda
--- /dev/null
+++ b/Model/StationStatus.py
@@ -0,0 +1,113 @@
+from sqlalchemy import text
+from datetime import datetime
+import json
+
+class StationStatus:
+ def __init__(self):
+ pass
+
+ async def save(self, session, id, station_hash, total_piles, free_piles, piles_detail_json, current_price, pro_price=None, parking_info=None, distance=None, valid_start_time=None):
+ if valid_start_time is None:
+ valid_start_time = datetime.now()
+
+ # Ensure json is string with consistent formatting
+ piles_json_str = None
+ if piles_detail_json is not None:
+ if isinstance(piles_detail_json, (dict, list)):
+ piles_json_str = json.dumps(piles_detail_json, ensure_ascii=False, sort_keys=True)
+ else:
+ piles_json_str = piles_detail_json
+
+ # 1. Check current record
+ select_sql = """
+ SELECT total_piles, free_piles, piles_detail_json, current_price, pro_price, parking_info, distance
+ FROM t_station_status_scd
+ WHERE station_hash = :station_hash AND is_current = 1
+ """
+ try:
+ result = await session.execute(text(select_sql), {"station_hash": station_hash})
+ current_row = result.fetchone()
+ except Exception as e:
+ # Check if it's a "column not found" error
+ if "Unknown column 'parking_info'" in str(e) or "no such column: parking_info" in str(e):
+ # Handle schema evolution if needed, or just proceed assuming None for parking_info comparison
+ current_row = None
+ # Or re-raise if we want to fail hard, but let's try to be robust
+ # For now, if column missing, we might fail on INSERT later anyway.
+ # So re-raising or logging might be better.
+ # But since I cannot easily alter table here, I will proceed with code update
+ # and assume user/I run the ALTER script.
+ raise e
+ raise e
+
+ if current_row:
+ # Check if changed
+ # Note: current_row values might be Decimal, need to convert for comparison
+ row_total = current_row.total_piles
+ row_free = current_row.free_piles
+ row_json = current_row.piles_detail_json
+ row_price = current_row.current_price
+ row_pro_price = current_row.pro_price
+ row_parking = getattr(current_row, 'parking_info', None) # Safely get if column exists
+ row_distance = getattr(current_row, 'distance', None)
+
+ # Normalize row_json for comparison (handle key order differences)
+ if row_json:
+ try:
+ if isinstance(row_json, str):
+ row_json_obj = json.loads(row_json)
+ row_json = json.dumps(row_json_obj, ensure_ascii=False, sort_keys=True)
+ except Exception:
+ pass # Keep original if parse fails
+
+ # Convert price to float if it is Decimal, for comparison
+ if row_price is not None:
+ row_price = float(row_price)
+ if row_pro_price is not None:
+ row_pro_price = float(row_pro_price)
+
+ # Simple comparison
+ is_same = (
+ row_total == total_piles and
+ row_free == free_piles and
+ row_price == current_price and
+ row_pro_price == pro_price and
+ row_json == piles_json_str and
+ row_parking == parking_info and
+ row_distance == distance
+ )
+
+ if is_same:
+ # No change, skip insert
+ return
+
+ # Expire old record
+ update_sql = """
+ UPDATE t_station_status_scd
+ SET is_current = 0, valid_end_time = :valid_start_time
+ WHERE station_hash = :station_hash AND is_current = 1
+ """
+ await session.execute(text(update_sql), {
+ "valid_start_time": valid_start_time,
+ "station_hash": station_hash
+ })
+
+ # 2. Insert new record
+ sql = """
+ INSERT INTO t_station_status_scd
+ (id, station_hash, total_piles, free_piles, piles_detail_json, current_price, pro_price, parking_info, distance, valid_start_time, is_current)
+ VALUES
+ (:id, :station_hash, :total_piles, :free_piles, :piles_detail_json, :current_price, :pro_price, :parking_info, :distance, :valid_start_time, 1)
+ """
+ await session.execute(text(sql), {
+ "id": id,
+ "station_hash": station_hash,
+ "total_piles": total_piles,
+ "free_piles": free_piles,
+ "piles_detail_json": piles_json_str,
+ "current_price": current_price,
+ "pro_price": pro_price,
+ "parking_info": parking_info,
+ "distance": distance,
+ "valid_start_time": valid_start_time
+ })
diff --git a/Model/__pycache__/StationPriceSchedule.cpython-310.pyc b/Model/__pycache__/StationPriceSchedule.cpython-310.pyc
new file mode 100644
index 0000000..287106a
Binary files /dev/null and b/Model/__pycache__/StationPriceSchedule.cpython-310.pyc differ
diff --git a/Model/__pycache__/StationProfile.cpython-310.pyc b/Model/__pycache__/StationProfile.cpython-310.pyc
new file mode 100644
index 0000000..0be6e3e
Binary files /dev/null and b/Model/__pycache__/StationProfile.cpython-310.pyc differ
diff --git a/Model/__pycache__/StationStatus.cpython-310.pyc b/Model/__pycache__/StationStatus.cpython-310.pyc
new file mode 100644
index 0000000..b682d52
Binary files /dev/null and b/Model/__pycache__/StationStatus.cpython-310.pyc differ
diff --git a/Sql/doris_ddl.py b/Sql/doris_ddl.py
new file mode 100644
index 0000000..6fcf6b3
--- /dev/null
+++ b/Sql/doris_ddl.py
@@ -0,0 +1,69 @@
+import asyncio
+import os
+import sys
+import logging
+
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+# 将项目根目录添加到系统路径,以便能够导入 DbKit 和 Config 等模块
+# DbKit/doris_ddl.py -> DbKit -> Root (2 levels up)
+project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+from Util import Win32Patch
+
+# 应用 Windows 平台的异步策略补丁
+Win32Patch.patch()
+
+from DbKit.Db import Db
+from Config.Config import DB_URL
+
+async def init_tables():
+ """
+ 初始化数据库表结构:读取 SQL 文件并逐条执行。
+ """
+ logger.info("正在初始化数据库连接...")
+ db = Db(db_url=DB_URL)
+ await db.init_db()
+
+ logger.info("正在读取 SQL 文件...")
+ # SQL 文件路径:相对于当前脚本所在目录 (DbKit/)
+ sql_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '', 'doris_ddl.sql')
+
+ logger.info(f"使用 SQL 文件: {sql_path}")
+
+ with open(sql_path, 'r', encoding='utf-8') as f:
+ sql_content = f.read()
+
+ # 使用分号分割 SQL 语句,并过滤掉空行和空白语句
+ statements = [s.strip() for s in sql_content.split(';') if s.strip()]
+
+ logger.info(f"共找到 {len(statements)} 条 SQL 语句。")
+
+ async with await db.get_session() as session:
+ for i, stmt in enumerate(statements):
+ logger.info(f"正在执行第 {i + 1} 条语句...")
+ # 使用 SQLAlchemy 的 text() 函数执行原生 SQL
+ from sqlalchemy import text
+ try:
+ await session.execute(text(stmt))
+ logger.info(f"第 {i + 1} 条语句执行成功。")
+ except Exception as e:
+ logger.error(f"执行第 {i + 1} 条语句时出错: {e}")
+
+ # 虽然大多数数据库的 DDL 语句是自动提交的,但显式提交是一个好习惯
+ await session.commit()
+
+ logger.info("数据库表初始化完成。")
+
+ # 优雅地关闭数据库引擎并释放连接
+ await db.engine.dispose()
+
+if __name__ == "__main__":
+ # 再次确保补丁已应用
+ Win32Patch.patch()
+ # 运行异步初始化函数
+ asyncio.run(init_tables())
diff --git a/Sql/doris_ddl.sql b/Sql/doris_ddl.sql
new file mode 100644
index 0000000..b870e2e
--- /dev/null
+++ b/Sql/doris_ddl.sql
@@ -0,0 +1,61 @@
+-- 充电站基础信息表 (SCD2)
+-- 保存场站的名称、地址等相对稳定的信息
+DROP TABLE IF EXISTS t_station_profile_scd;
+CREATE TABLE IF NOT EXISTS t_station_profile_scd (
+ `station_hash` VARCHAR(32) NOT NULL COMMENT '业务主键 (名称的MD5值)',
+ `valid_start_time` DATETIME NOT NULL COMMENT '记录生效开始时间',
+ `id` VARCHAR(50) NOT NULL COMMENT '唯一ID (UUID)',
+ `operator` VARCHAR(50) NOT NULL COMMENT '运营商名称',
+ `station_name` VARCHAR(255) NOT NULL COMMENT '场站名称',
+ `address` VARCHAR(500) COMMENT '详细地址',
+ `coord_x` DOUBLE COMMENT '经度 (高德坐标系)',
+ `coord_y` DOUBLE COMMENT '纬度 (高德坐标系)',
+ `valid_end_time` DATETIME NOT NULL DEFAULT '9999-12-31 23:59:59' COMMENT '记录生效结束时间',
+ `is_current` TINYINT NOT NULL DEFAULT 1 COMMENT '是否为当前最新记录 (1=是, 0=否)'
+)
+UNIQUE KEY(`station_hash`, `valid_start_time`, `id`)
+DISTRIBUTED BY HASH(`station_hash`) BUCKETS 10
+PROPERTIES (
+ "replication_num" = "1"
+);
+
+-- 充电站实时状态表 (SCD2 / Log)
+-- 保存场站的桩数、空闲数等动态信息
+-- 每次抓取如果状态变化则写入新记录
+DROP TABLE IF EXISTS t_station_status_scd;
+CREATE TABLE IF NOT EXISTS t_station_status_scd (
+ `station_hash` VARCHAR(32) NOT NULL COMMENT '业务主键 (名称的MD5值)',
+ `valid_start_time` DATETIME NOT NULL COMMENT '记录生效开始时间',
+ `id` VARCHAR(50) NOT NULL COMMENT '唯一ID (UUID)',
+ `total_piles` INT COMMENT '总桩数',
+ `free_piles` INT COMMENT '空闲桩数',
+ `piles_detail_json` TEXT COMMENT '详细桩信息 (JSON格式)',
+ `current_price` DECIMAL(10, 4) COMMENT '当前价格快照',
+ `pro_price` DECIMAL(10, 4) COMMENT 'PRO会员专享价快照',
+ `parking_info` VARCHAR(500) COMMENT '停车收费信息',
+ `distance` VARCHAR(50) COMMENT '距离信息 (例如 5.3km)',
+ `valid_end_time` DATETIME NOT NULL DEFAULT '9999-12-31 23:59:59' COMMENT '记录生效结束时间',
+ `is_current` TINYINT NOT NULL DEFAULT 1 COMMENT '是否为当前最新记录'
+)
+UNIQUE KEY(`station_hash`, `valid_start_time`, `id`)
+DISTRIBUTED BY HASH(`station_hash`) BUCKETS 10
+PROPERTIES (
+ "replication_num" = "1"
+);
+
+-- 充电站价格时段表 (SCD2)
+-- 保存场站的全天价格时段信息
+DROP TABLE IF EXISTS t_station_price_schedule_scd;
+CREATE TABLE IF NOT EXISTS t_station_price_schedule_scd (
+ `station_hash` VARCHAR(32) NOT NULL COMMENT '业务主键 (名称的MD5值)',
+ `valid_start_time` DATETIME NOT NULL COMMENT '记录生效开始时间',
+ `id` VARCHAR(50) NOT NULL COMMENT '唯一ID (UUID)',
+ `schedule_json` TEXT COMMENT '价格时段详情 (JSON格式)',
+ `valid_end_time` DATETIME NOT NULL DEFAULT '9999-12-31 23:59:59' COMMENT '记录生效结束时间',
+ `is_current` TINYINT NOT NULL DEFAULT 1 COMMENT '是否为当前最新记录'
+)
+UNIQUE KEY(`station_hash`, `valid_start_time`, `id`)
+DISTRIBUTED BY HASH(`station_hash`) BUCKETS 10
+PROPERTIES (
+ "replication_num" = "1"
+);
diff --git a/Temp/DevTools/current_20260111_170841.jpg b/Temp/DevTools/current_20260111_170841.jpg
new file mode 100644
index 0000000..cbf7c07
Binary files /dev/null and b/Temp/DevTools/current_20260111_170841.jpg differ
diff --git a/Temp/DevTools/current_20260111_171025.jpg b/Temp/DevTools/current_20260111_171025.jpg
new file mode 100644
index 0000000..1b8cfba
Binary files /dev/null and b/Temp/DevTools/current_20260111_171025.jpg differ
diff --git a/Test/1.jpg b/Test/1.jpg
new file mode 100644
index 0000000..b5b33da
Binary files /dev/null and b/Test/1.jpg differ
diff --git a/Test/1_bw.jpg b/Test/1_bw.jpg
new file mode 100644
index 0000000..6157cf3
Binary files /dev/null and b/Test/1_bw.jpg differ
diff --git a/Test/1_bw_bytes.jpg b/Test/1_bw_bytes.jpg
new file mode 100644
index 0000000..6157cf3
Binary files /dev/null and b/Test/1_bw_bytes.jpg differ
diff --git a/Test/2.jpg b/Test/2.jpg
new file mode 100644
index 0000000..b80d77b
Binary files /dev/null and b/Test/2.jpg differ
diff --git a/Test/TestConflict.py b/Test/TestConflict.py
new file mode 100644
index 0000000..f64cbca
--- /dev/null
+++ b/Test/TestConflict.py
@@ -0,0 +1,29 @@
+# coding=utf-8
+import os
+import sys
+import time
+import numpy as np
+
+# Add project root to sys.path
+current_dir = os.path.dirname(os.path.abspath(__file__))
+# project_root = os.path.dirname(current_dir)
+# if project_root not in sys.path:
+# sys.path.append(project_root)
+
+print("Importing PaddleOCR...")
+from paddleocr import PaddleOCR
+print("Importing LlmUtil...")
+# from Util.LlmUtil import get_llm_response
+print("Imports done.")
+
+def main():
+ image_path = os.path.join(current_dir, "2.jpg")
+ print(f"Initializing OCR...")
+ ocr = PaddleOCR(use_textline_orientation=True, lang="ch")
+ print("Running OCR...")
+ result = ocr.ocr(image_path)
+ print("OCR Done.")
+ print(result)
+
+if __name__ == "__main__":
+ main()
diff --git a/Test/TestOCR.py b/Test/TestOCR.py
new file mode 100644
index 0000000..2dfec1f
--- /dev/null
+++ b/Test/TestOCR.py
@@ -0,0 +1,119 @@
+# coding=utf-8
+import os
+import sys
+from paddleocr import PaddleOCR
+import numpy as np
+
+def test_ocr():
+ # 1. 初始化 PaddleOCR
+ print("正在初始化 PaddleOCR 模型...")
+ try:
+ ocr = PaddleOCR(use_textline_orientation=True, lang="ch")
+ except Exception as e:
+ print(f"初始化失败: {e}")
+ return
+
+ # 2. 准备测试图片
+ current_dir = os.path.dirname(os.path.abspath(__file__))
+ # 优先查找 2.jpg,如果不存在则查找 1.jpg
+ image_path = os.path.join(current_dir, "2.jpg")
+ if not os.path.exists(image_path):
+ image_path = os.path.join(current_dir, "1.jpg")
+
+ if not os.path.exists(image_path):
+ print(f"错误: 未找到测试图片: {image_path}")
+ print("请将测试图片命名为 2.jpg 或 1.jpg 并放置在 Test 目录下。")
+ return
+
+ print(f"正在识别图片: {image_path}")
+
+ # 3. 执行识别
+ try:
+ # result 是一个列表,通常包含一个 OCRResult 对象 (新版) 或列表 (旧版)
+ result = ocr.ocr(image_path)
+
+ except Exception as e:
+ print(f"识别过程发生异常: {e}")
+ return
+
+ # 4. 输出结果
+ print("\n" + "="*20 + " 识别结果 " + "="*20)
+ sys.stdout.flush()
+
+ # 同时输出到文件,方便查看
+ output_file = os.path.join(current_dir, "ocr_output.txt")
+ with open(output_file, "w", encoding="utf-8") as f_out:
+ if not result:
+ msg = "未识别到任何文字 (Result is empty)。"
+ print(msg)
+ f_out.write(msg + "\n")
+ else:
+ # 取出第一个结果(通常是单张图片的结果)
+ res = result[0]
+
+ # 检查是否为 None
+ if res is None:
+ msg = "未识别到任何文字 (Result[0] is None)。"
+ print(msg)
+ f_out.write(msg + "\n")
+
+ # 情况 A: 新版 PaddleX OCRResult 对象 (表现为字典或对象)
+ elif hasattr(res, 'get') and 'rec_texts' in res:
+ texts = res.get('rec_texts', [])
+ scores = res.get('rec_scores', [])
+
+ if not texts:
+ msg = "未识别到任何文字 (rec_texts is empty)。"
+ print(msg)
+ f_out.write(msg + "\n")
+ else:
+ for i, text in enumerate(texts):
+ score = scores[i] if i < len(scores) else 0.0
+ msg = f"行 {i+1}: {text} (置信度: {score:.4f})"
+ print(msg)
+ f_out.write(msg + "\n")
+
+ # 情况 B: 对象属性访问
+ elif hasattr(res, 'rec_texts'):
+ texts = res.rec_texts
+ scores = res.rec_scores
+
+ if not texts:
+ msg = "未识别到任何文字 (rec_texts is empty)。"
+ print(msg)
+ f_out.write(msg + "\n")
+ else:
+ for i, text in enumerate(texts):
+ score = scores[i] if i < len(scores) else 0.0
+ msg = f"行 {i+1}: {text} (置信度: {score:.4f})"
+ print(msg)
+ f_out.write(msg + "\n")
+
+ # 情况 C: 旧版 list of lists 结构
+ elif isinstance(res, list):
+ for idx, line in enumerate(res):
+ try:
+ if len(line) >= 2 and isinstance(line[1], (tuple, list)):
+ text, score = line[1]
+ msg = f"行 {idx+1}: {text} (置信度: {score:.4f})"
+ print(msg)
+ f_out.write(msg + "\n")
+ else:
+ msg = f"行 {idx+1}: {line} (格式未知)"
+ print(msg)
+ f_out.write(msg + "\n")
+ except Exception as e:
+ print(f"行 {idx+1} 解析失败: {e}")
+
+ else:
+ msg = f"无法解析结果结构: {type(res)}"
+ print(msg)
+ print(f"Result content: {res}")
+ f_out.write(msg + "\n")
+ f_out.write(f"Result content: {res}\n")
+
+ print("="*50)
+ sys.stdout.flush()
+
+if __name__ == "__main__":
+ test_ocr()
diff --git a/Test/TestOcrLlm.py b/Test/TestOcrLlm.py
new file mode 100644
index 0000000..1d5d4d3
--- /dev/null
+++ b/Test/TestOcrLlm.py
@@ -0,0 +1,173 @@
+# coding=utf-8
+import os
+import sys
+import time
+import asyncio
+import json
+
+# Add project root to sys.path
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(current_dir)
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+from paddleocr import PaddleOCR
+from Util.LlmUtil import get_llm_response
+from Util.OcrParser import OcrParser
+import re
+
+LOG_FILE = os.path.join(current_dir, "ocr_llm_debug.txt")
+
+def log(msg):
+ print(msg)
+ sys.stdout.flush()
+ with open(LOG_FILE, "a", encoding="utf-8") as f:
+ f.write(msg + "\n")
+
+# ... imports ...
+def run_ocr_sync():
+ image_path = os.path.join(current_dir, "2.jpg")
+ if not os.path.exists(image_path):
+ image_path = os.path.join(current_dir, "1.jpg")
+
+ log(f"Testing OCR + LLM Pipeline on: {image_path}")
+ log("-" * 50)
+
+ # --- Step 1: PaddleOCR ---
+ t_start = time.time()
+
+ log("Initializing PaddleOCR...")
+ t_init_start = time.time()
+ try:
+ # 尝试使用轻量级模型 (Mobile) 以提升速度
+ # ocr_version='PP-OCRv4' 通常默认是 mobile
+ ocr = PaddleOCR(use_textline_orientation=True, lang="ch", ocr_version='PP-OCRv4')
+ except Exception as e:
+ log(f"PaddleOCR Init Failed: {e}")
+ return None, None
+
+ t_init_end = time.time()
+ log(f"PaddleOCR Init Time: {t_init_end - t_init_start:.4f}s")
+
+ log("Running OCR Inference...")
+ t_ocr_start = time.time()
+ try:
+ result = ocr.ocr(image_path)
+ except Exception as e:
+ log(f"OCR Inference Failed: {e}")
+ return None, None
+ t_ocr_end = time.time()
+
+ ocr_text_lines = []
+
+ # Handle different result structures
+ if not result:
+ log("OCR returned empty result.")
+ else:
+ res = result[0]
+ if res is None:
+ log("OCR result[0] is None.")
+ elif hasattr(res, 'get') and 'rec_texts' in res:
+ ocr_text_lines = res.get('rec_texts', [])
+ elif hasattr(res, 'rec_texts'):
+ ocr_text_lines = res.rec_texts
+ elif isinstance(res, list):
+ for line in res:
+ if len(line) >= 2 and isinstance(line[1], (tuple, list)):
+ ocr_text_lines.append(line[1][0])
+
+ ocr_text_block = "\n".join(ocr_text_lines)
+ log(f"OCR Result ({t_ocr_end - t_ocr_start:.4f}s):")
+ log(ocr_text_block)
+ log("-" * 50)
+
+ return ocr_text_lines, ocr_text_block, (t_ocr_start, t_ocr_end)
+
+async def run_parsing_comparison(ocr_text_lines, ocr_text_block, timing_ocr):
+ t_ocr_start, t_ocr_end = timing_ocr
+ ocr_duration = t_ocr_end - t_ocr_start
+
+ # --- Mode 1: Regex Parsing ---
+ log("Running Regex Parsing...")
+ t_regex_start = time.time()
+ try:
+ regex_data = OcrParser.parse(ocr_text_lines)
+ log("\nParsed Data (Regex):")
+ log(json.dumps(regex_data, indent=2, ensure_ascii=False))
+ except Exception as e:
+ log(f"Regex Parsing Failed: {e}")
+ t_regex_end = time.time()
+ regex_duration = t_regex_end - t_regex_start
+ log(f"Regex Parsing Time: {regex_duration:.4f}s")
+ log("-" * 50)
+
+ # --- Mode 2: LLM Parsing ---
+ log("Running LLM Parsing...")
+
+ prompt = f"""
+ You are a data extraction assistant. Below is the OCR text recognized from a charging station list card.
+ Please extract the structured data and return it ONLY as a JSON object (no markdown, no extra text).
+
+ Fields to extract:
+ - station_name: (String) Name of the charging station.
+ - distance: (String) Distance info (e.g., "7.4km").
+ - price: (String) Price info (e.g., "0.7111/度").
+ - tags: (List[String]) Any tags like "快", "闲3/4", "组团", "2倍积分", "P", etc.
+ - parking_info: (String) Parking related info.
+
+ OCR Text:
+ {ocr_text_block}
+ """
+
+ t_llm_start = time.time()
+ response_text = ""
+ try:
+ log("Starting LLM request...")
+ async for chunk in get_llm_response(prompt, stream=True):
+ print(chunk, end='', flush=True)
+ response_text += chunk
+
+ print("\n")
+ log("LLM request finished.")
+
+ t_llm_end = time.time()
+
+ log(f"\nLLM Response ({t_llm_end - t_llm_start:.4f}s):")
+ log(response_text)
+
+ try:
+ clean_text = response_text.replace("```json", "").replace("```", "").strip()
+ data = json.loads(clean_text)
+ log("\nParsed JSON Data:")
+ log(json.dumps(data, indent=2, ensure_ascii=False))
+ except json.JSONDecodeError:
+ log("\nFailed to parse JSON directly.")
+
+ except Exception as e:
+ log(f"LLM Error: {e}")
+ t_llm_end = time.time()
+
+ log("-" * 50)
+ log(f"Summary:")
+ log(f"OCR Time: {ocr_duration:.4f}s")
+ log(f"Regex Parsing Time: {regex_duration:.4f}s")
+ log(f"LLM Parsing Time: {t_llm_end - t_llm_start:.4f}s")
+
+ total_regex = ocr_duration + regex_duration
+ total_llm = ocr_duration + (t_llm_end - t_llm_start)
+
+ log(f"Total Pipeline (OCR+Regex): {total_regex:.4f}s")
+ log(f"Total Pipeline (OCR+LLM): {total_llm:.4f}s")
+
+def main():
+ # Clear log file
+ with open(LOG_FILE, "w", encoding="utf-8") as f:
+ f.write("Starting TestOcrLlm...\n")
+
+ ocr_lines, ocr_text, timing = run_ocr_sync()
+ if ocr_lines:
+ asyncio.run(run_parsing_comparison(ocr_lines, ocr_text, timing))
+
+if __name__ == "__main__":
+ main()
+
diff --git a/Test/TestOcrRegex.py b/Test/TestOcrRegex.py
new file mode 100644
index 0000000..fc2bcca
--- /dev/null
+++ b/Test/TestOcrRegex.py
@@ -0,0 +1,107 @@
+# coding=utf-8
+import re
+import json
+
+def parse_ocr_lines(lines):
+ result = {
+ "station_name": "",
+ "distance": "",
+ "price": None,
+ "piles": [],
+ "parking": "",
+ "tags": []
+ }
+
+ # Pre-process lines: remove confidence scores for parsing
+ clean_lines = []
+ for line in lines:
+ # Remove prefix "行 X: "
+ text = re.sub(r"^行\s*\d+:\s*", "", line)
+ # Remove suffix "(置信度: ...)"
+ text = re.sub(r"\s*\(置信度:.*?\)\s*$", "", text)
+ clean_lines.append(text.strip())
+
+ # 1. Station Name
+ for line in clean_lines:
+ # Skip empty or short noise
+ if len(line) < 2: continue
+ # Skip if starts with special chars
+ if line.startswith("(") or line.startswith("("): continue
+ # Skip if contains typical attribute keywords
+ if "km" in line.lower() or "/度" in line or "¥" in line: continue
+ # Skip if strictly numeric (unlikely for name)
+ if re.match(r"^\d+$", line): continue
+
+ result["station_name"] = line
+ break
+
+ # 2. Distance
+ for line in clean_lines:
+ m = re.search(r"(\d+(\.\d+)?)\s*km", line, re.IGNORECASE)
+ if m:
+ result["distance"] = m.group(0)
+ break
+
+ # 3. Price (Standard)
+ # Look for "0.xxxx/度"
+ for line in clean_lines:
+ m = re.search(r"(\d+\.\d+)(?=/度)", line)
+ if m:
+ result["price"] = float(m.group(1))
+ break
+
+ # 4. Piles
+ current_type = "未知"
+ for line in clean_lines:
+ if "快" in line: current_type = "快"
+ elif "慢" in line: current_type = "慢"
+ elif "超" in line: current_type = "超"
+
+ # Match "闲3/4" or "3/4"
+ # Regex: optional "闲", int, /, int
+ m = re.search(r"(?:闲)?(\d+)/(\d+)", line)
+ if m:
+ # Check if it looks like a price (contains dot)
+ if "." in line: continue
+
+ free = int(m.group(1))
+ total = int(m.group(2))
+ result["piles"].append({
+ "type": current_type,
+ "free": free,
+ "total": total
+ })
+
+ # 5. Parking
+ for line in clean_lines:
+ if "停车" in line:
+ # Clean up leading punctuation
+ cleaned = re.sub(r"^[·\.\sP]+", "", line)
+ result["parking"] = cleaned
+ break
+
+ return result
+
+if __name__ == "__main__":
+ # User provided sample data
+ sample_input = [
+ "行 1: 长春市绿园区雁鸣湖公共充电站 (置信度: 0.9963)",
+ "行 2: (… (置信度: 0.6244)",
+ "行 3: 7.4km (置信度: 0.9975)",
+ "行 4: 0.7111/度 (置信度: 0.9450)",
+ "行 5: 快 (置信度: 0.9987)",
+ "行 6: 闲3/4 (置信度: 0.9941)",
+ "行 7: ¥ (置信度: 0.8734)",
+ "行 8: 组团 (置信度: 0.9995)",
+ "行 9: 2倍积分 (置信度: 0.9997)",
+ "行 10: P (置信度: 0.9929)",
+ "行 11: ·收费停车:以场地实际收费为准 (置信度: 0.9736)"
+ ]
+
+ print("--- Input Data ---")
+ for l in sample_input:
+ print(l)
+
+ parsed = parse_ocr_lines(sample_input)
+ print("\n--- Parsed Result (Regex) ---")
+ print(json.dumps(parsed, ensure_ascii=False, indent=2))
diff --git a/Test/TestPaddleOCRKit.py b/Test/TestPaddleOCRKit.py
new file mode 100644
index 0000000..a933f2b
--- /dev/null
+++ b/Test/TestPaddleOCRKit.py
@@ -0,0 +1,118 @@
+# coding=utf-8
+import os
+import sys
+import cv2
+import json
+import time
+
+# Add project root to sys.path
+current_dir = os.path.dirname(os.path.abspath(__file__))
+project_root = os.path.dirname(current_dir)
+if project_root not in sys.path:
+ sys.path.append(project_root)
+
+from Util import Kit
+from Util.PaddleOCRKit import get_ocr_kit
+
+def test_integration():
+ image_path = os.path.join(current_dir, "2.jpg")
+ if not os.path.exists(image_path):
+ print(f"Image not found: {image_path}")
+ return
+
+ print(f"Testing integration on: {image_path}")
+
+ # 1. Generate Metadata using Kit
+ print("Running Kit.crop_cards_from_image...")
+ Kit.crop_cards_from_image(image_path, output_dir=current_dir)
+
+ json_path = image_path.replace(".jpg", ".json")
+ json_metadata = {}
+
+ if os.path.exists(json_path):
+ with open(json_path, 'r', encoding='utf-8') as f:
+ json_metadata = json.load(f)
+
+ if not json_metadata.get("cards"):
+ print("Kit failed to find cards (expected for single card image). Mocking metadata.")
+ img = cv2.imread(image_path)
+ h, w = img.shape[:2]
+ json_metadata = {
+ "cards": [
+ {
+ "id": 1,
+ "rect": [0, 0, w, h],
+ "click_point": [w//2, h//2]
+ }
+ ]
+ }
+
+ print(f"Loaded metadata with {len(json_metadata.get('cards', []))} cards.")
+
+ # 2. Run OCR Logic (Simulating Crawler.py)
+ print("Running OCR Logic...")
+
+ ocr_kit = get_ocr_kit()
+
+ original_img = cv2.imread(image_path)
+ stations = []
+
+ t_start = time.time()
+
+ if "cards" in json_metadata and original_img is not None:
+ h_img, w_img = original_img.shape[:2]
+
+ for card in json_metadata["cards"]:
+ rect = card.get("rect")
+ if not rect: continue
+ x1, y1, x2, y2 = rect
+
+ # 边界检查
+ x1 = max(0, min(x1, w_img))
+ x2 = max(0, min(x2, w_img))
+ y1 = max(0, min(y1, h_img))
+ y2 = max(0, min(y2, h_img))
+
+ if x2 <= x1 or y2 <= y1: continue
+
+ # 裁剪卡片
+ cropped_card = original_img[y1:y2, x1:x2]
+
+ # 识别
+ parsed_data = ocr_kit.recognize(cropped_card)
+ print(f"Parsed Data: {json.dumps(parsed_data, indent=2, ensure_ascii=False)}")
+
+ if parsed_data and parsed_data.get("station_name"):
+ # 格式化数据
+ piles_list = parsed_data.get("piles", [])
+ piles_str_parts = []
+ for p in piles_list:
+ p_type = p.get("type", "")
+ p_free = p.get("free", 0)
+ p_total = p.get("total", 0)
+ piles_str_parts.append(f"{p_type}:{p_free}/{p_total}")
+
+ piles_str = " ".join(piles_str_parts)
+
+ station_info = {
+ "station_name": parsed_data.get("station_name"),
+ "price": str(parsed_data.get("price")) if parsed_data.get("price") is not None else "",
+ "piles": piles_str,
+ "distance": parsed_data.get("distance", ""),
+ "uia_center_x": card["click_point"][0],
+ "uia_center_y": card["click_point"][1],
+ "tags": parsed_data.get("tags", []),
+ "parking_info": parsed_data.get("parking", "")
+ }
+ stations.append(station_info)
+
+ t_end = time.time()
+
+ print("-" * 50)
+ print(f"Total Processing Time: {t_end - t_start:.4f}s")
+ print(f"Found {len(stations)} stations:")
+ for s in stations:
+ print(json.dumps(s, indent=2, ensure_ascii=False))
+
+if __name__ == "__main__":
+ test_integration()
diff --git a/Test/__init__.py b/Test/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Test/__pycache__/__init__.cpython-310.pyc b/Test/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..d573e7a
Binary files /dev/null and b/Test/__pycache__/__init__.cpython-310.pyc differ
diff --git a/Test/home.jpg b/Test/home.jpg
new file mode 100644
index 0000000..b0ab130
Binary files /dev/null and b/Test/home.jpg differ
diff --git a/Test/ocr_llm_debug.txt b/Test/ocr_llm_debug.txt
new file mode 100644
index 0000000..6ffccbe
--- /dev/null
+++ b/Test/ocr_llm_debug.txt
@@ -0,0 +1,78 @@
+Starting TestOcrLlm...
+Testing OCR + LLM Pipeline on: D:\dsWork\YltProject\dsCrawler\Test\2.jpg
+--------------------------------------------------
+Initializing PaddleOCR...
+PaddleOCR Init Time: 1.7990s
+Running OCR Inference...
+OCR Result (1.7636s):
+长春市绿园区雁鸣湖公共充电站
+..
+17.4km
+0.7111/度
+
+快
+闲3/4
+组团
+2倍积分
+P
+收费停车:以场地实际收费为准
+--------------------------------------------------
+Running Regex Parsing...
+
+Parsed Data (Regex):
+{
+ "station_name": "长春市绿园区雁鸣湖公共充电站",
+ "distance": "17.4km",
+ "price": 0.7111,
+ "piles": [
+ {
+ "type": "快",
+ "free": 3,
+ "total": 4
+ }
+ ],
+ "parking": "收费停车:以场地实际收费为准",
+ "tags": [
+ "组团",
+ "2倍积分",
+ "P"
+ ]
+}
+Regex Parsing Time: 0.0015s
+--------------------------------------------------
+Running LLM Parsing...
+Starting LLM request...
+LLM request finished.
+
+LLM Response (3.6250s):
+```json
+{
+ "station_name": "长春市绿园区雁鸣湖公共充电站",
+ "distance": "17.4km",
+ "price": "0.7111/度",
+ "tags": ["快", "闲3/4", "组团", "2倍积分", "P"],
+ "parking_info": "收费停车:以场地实际收费为准"
+}
+```
+
+Parsed JSON Data:
+{
+ "station_name": "长春市绿园区雁鸣湖公共充电站",
+ "distance": "17.4km",
+ "price": "0.7111/度",
+ "tags": [
+ "快",
+ "闲3/4",
+ "组团",
+ "2倍积分",
+ "P"
+ ],
+ "parking_info": "收费停车:以场地实际收费为准"
+}
+--------------------------------------------------
+Summary:
+OCR Time: 1.7636s
+Regex Parsing Time: 0.0015s
+LLM Parsing Time: 3.6250s
+Total Pipeline (OCR+Regex): 1.7652s
+Total Pipeline (OCR+LLM): 5.3886s
diff --git a/Test/ocr_llm_output.txt b/Test/ocr_llm_output.txt
new file mode 100644
index 0000000..6206456
Binary files /dev/null and b/Test/ocr_llm_output.txt differ
diff --git a/Test/ocr_llm_result.txt b/Test/ocr_llm_result.txt
new file mode 100644
index 0000000..dad011f
--- /dev/null
+++ b/Test/ocr_llm_result.txt
@@ -0,0 +1,27 @@
+OCR Result:
+长春市绿园区雁鸣湖公共充电站
+(…
+7.4km
+0.7111/度
+快
+闲3/4
+¥
+组团
+2倍积分
+P
+·收费停车:以场地实际收费为准
+
+LLM Response:
+{
+ "station_name": "长春市绿园区雁鸣湖公共充电站",
+ "distance": "7.4km",
+ "price": "0.7111/度",
+ "tags": ["快", "闲3/4", "组团", "2倍积分", "P"],
+ "parking_info": "收费停车:以场地实际收费为准"
+}
+
+--------------------------------------------------
+Summary:
+OCR Time: 15.7442s
+LLM Time: 3.1676s
+Total Pipeline Time (excluding init): 18.9118s
\ No newline at end of file
diff --git a/Test/ocr_output.txt b/Test/ocr_output.txt
new file mode 100644
index 0000000..b7c5740
--- /dev/null
+++ b/Test/ocr_output.txt
@@ -0,0 +1,11 @@
+行 1: 长春市绿园区雁鸣湖公共充电站 (置信度: 0.9963)
+行 2: (… (置信度: 0.6244)
+行 3: 7.4km (置信度: 0.9975)
+行 4: 0.7111/度 (置信度: 0.9450)
+行 5: 快 (置信度: 0.9987)
+行 6: 闲3/4 (置信度: 0.9941)
+行 7: ¥ (置信度: 0.8734)
+行 8: 组团 (置信度: 0.9995)
+行 9: 2倍积分 (置信度: 0.9997)
+行 10: P (置信度: 0.9929)
+行 11: ·收费停车:以场地实际收费为准 (置信度: 0.9736)
diff --git a/Test/qbsd_bw.jpg b/Test/qbsd_bw.jpg
new file mode 100644
index 0000000..0a0ecf7
Binary files /dev/null and b/Test/qbsd_bw.jpg differ
diff --git a/Test/test02.py b/Test/test02.py
new file mode 100644
index 0000000..9220fd5
--- /dev/null
+++ b/Test/test02.py
@@ -0,0 +1,9 @@
+import uiautomator2 as u2
+
+d = u2.connect()
+
+d.reset_uiautomator()
+d.sleep(3)
+xml = d.dump_hierarchy() # 导出当前UI结构(XML)
+with open("ui_hierarchy5_2.xml", "w", encoding="utf-8") as f:
+ f.write(xml)
\ No newline at end of file
diff --git a/Test/test03.py b/Test/test03.py
new file mode 100644
index 0000000..56ee179
--- /dev/null
+++ b/Test/test03.py
@@ -0,0 +1,14 @@
+from Util.ObsUtil import ObsUploader
+
+from Config.Config import OBS_TMP_PREFIX
+
+uploader = ObsUploader()
+
+object_key = OBS_TMP_PREFIX + "/1d3eb56c-942e-42d3-8993-f1ea8ad7d97b.jpg"
+success, result = uploader.upload_file(
+ object_key=object_key,
+ file_path="Screenshot/1d3eb56c-942e-42d3-8993-f1ea8ad7d97b.jpg"
+)
+
+print(success)
+print(result)
diff --git a/Test/test04.py b/Test/test04.py
new file mode 100644
index 0000000..dd4bd0d
--- /dev/null
+++ b/Test/test04.py
@@ -0,0 +1,12 @@
+import uiautomator2 as u2
+
+d = u2.connect()
+
+# 启动应用(以微信为例)
+d.app_start("com.tencent.mm")
+
+# 截微信图保存
+d.screenshot("home.jpg")
+
+# 关闭应用
+d.app_stop("com.tencent.mm")
\ No newline at end of file
diff --git a/Test/ui_hierarchy5_2.xml b/Test/ui_hierarchy5_2.xml
new file mode 100644
index 0000000..96a6655
--- /dev/null
+++ b/Test/ui_hierarchy5_2.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Util/DevTools/crop_test.py b/Util/DevTools/crop_test.py
new file mode 100644
index 0000000..7c57f6d
--- /dev/null
+++ b/Util/DevTools/crop_test.py
@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+"""
+基于行扫描和统计特征的卡片截取工具
+"""
+import sys
+import os
+
+# 添加项目根目录到系统路径
+project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+sys.path.append(project_root)
+from Util import Kit
+
+def clean_directory(dir_path):
+ """
+ 清理现场:删除目录下除纯数字.jpg以外的所有文件
+ """
+ print(f"Cleaning directory: {dir_path}")
+ if not os.path.exists(dir_path):
+ return
+
+ for filename in os.listdir(dir_path):
+ path = os.path.join(dir_path, filename)
+ if not os.path.isfile(path):
+ continue
+
+ name, ext = os.path.splitext(filename)
+ # 保留条件:后缀是 .jpg 且文件名是纯数字
+ # [修改] 同时保留 _flag.jpg, _vl.jpg 供查看
+ # [修改] 保留 .json 文件
+ if ext.lower() == ".json":
+ continue
+
+ if ext.lower() == ".jpg" and (name.isdigit() or name.endswith("_flag") or name.endswith("_vl")):
+ continue
+
+ # 清理旧的 _for_vl.jpg
+ if name.endswith("_for_vl"):
+ pass # Let it fall through to delete
+ else:
+ # 其他非生成的文件,可能需要保留吗?
+ # 这里的逻辑是清理 output 目录,假设该目录下只有生成的图片
+ # 如果是原始图片(比如 1.jpg),不能删!
+ pass
+
+ # 原始图片保护 (文件名比较短,通常是 1.jpg, 2.jpg 等)
+ if len(name) <= 2 and name.isdigit():
+ continue
+
+ try:
+ os.remove(path)
+ print(f" Deleted: {filename}")
+ except Exception as e:
+ print(f" Error deleting {filename}: {e}")
+
+def crop_cards(img_path):
+ Kit.crop_cards_from_image(img_path)
+
+if __name__ == "__main__":
+ test_files = [
+ r"d:\dsWork\dsProject\dsCrawler\Tools\Images\1.jpg",
+ r"d:\dsWork\dsProject\dsCrawler\Tools\Images\2.jpg",
+ r"d:\dsWork\dsProject\dsCrawler\Tools\Images\3.jpg",
+ r"d:\dsWork\dsProject\dsCrawler\Tools\Images\4.jpg"
+ ]
+
+ # 在测试前清理现场
+ if test_files:
+ # 假设所有图片都在同一个文件夹
+ target_dir = os.path.dirname(test_files[0])
+ clean_directory(target_dir)
+
+ for f in test_files:
+ crop_cards(f)
diff --git a/Util/DevTools/screenshot_test.py b/Util/DevTools/screenshot_test.py
new file mode 100644
index 0000000..3c26658
--- /dev/null
+++ b/Util/DevTools/screenshot_test.py
@@ -0,0 +1,58 @@
+# coding=utf-8
+import asyncio
+import logging
+import os
+from datetime import datetime
+import uiautomator2 as u2
+
+# 配置日志输出
+logging.basicConfig(
+ level=logging.INFO,
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
+)
+logger = logging.getLogger("ScreenshotTool")
+
+
+async def take_screenshot():
+ """
+ 打开微信主界面并拍照(截图)
+ """
+ # 连接设备
+ d = u2.connect()
+
+ # 执行截图
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+ filename = f"current_{timestamp}.jpg"
+
+ # 获取目标目录: 项目根目录下的 Temp/DevTools
+ project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+ target_dir = os.path.join(project_root, "Temp", "DevTools")
+ os.makedirs(target_dir, exist_ok=True)
+ filepath = os.path.join(target_dir, filename)
+
+ logger.info(f"正在拍照(截图)并保存至: {filepath}")
+ d.screenshot(filepath)
+
+ if os.path.exists(filepath):
+ logger.info("拍照成功!")
+ return filepath
+ else:
+ logger.error("拍照失败,未找到生成的文件。")
+ return None
+
+
+async def main():
+ filepath = await take_screenshot()
+ if filepath:
+ logger.info(f"任务执行完成,截图文件: {filepath}")
+ else:
+ logger.error("任务执行失败。")
+
+
+if __name__ == "__main__":
+ try:
+ asyncio.run(main())
+ except KeyboardInterrupt:
+ logger.info("程序被用户中断.")
+ except Exception as e:
+ logger.exception(f"运行过程中出现异常: {e}")
diff --git a/Util/Kit.py b/Util/Kit.py
new file mode 100644
index 0000000..c7017aa
--- /dev/null
+++ b/Util/Kit.py
@@ -0,0 +1,922 @@
+import logging
+import os
+import cv2
+import numpy as np
+import time
+from Config.Config import BOTTOM_SAFE_EXCLUDE_RATIO
+
+logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
+logger = logging.getLogger(__name__)
+
+def read_image(path):
+ """读取图片,支持中文路径"""
+ try:
+ return cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
+ except Exception as e:
+ logger.info(f"Error reading image {path}: {e}")
+ return None
+
+def save_image(path, img):
+ """保存图片,支持中文路径"""
+ try:
+ ext = os.path.splitext(path)[1]
+ if not ext:
+ ext = ".jpg"
+ cv2.imencode(ext, img)[1].tofile(path)
+ return True
+ except Exception as e:
+ logger.error(f"Error saving image {path}: {e}")
+ return False
+
+# 截图
+def take_screenshot(d, image_uuid, save_dir="Screenshot"):
+ path = f"{save_dir}/{image_uuid}.jpg"
+ os.makedirs(save_dir, exist_ok=True)
+ d.screenshot(path)
+ return path
+
+def click_image_template(d, template_path, timeout=5.0, threshold=0.8):
+ """
+ 使用 OpenCV 模板匹配查找并点击图片
+ :param d: uiautomator2 设备对象
+ :param template_path: 模板图片路径
+ :param timeout: 超时时间(秒)
+ :param threshold: 匹配阈值 (0.0 - 1.0)
+ :return: 是否点击成功
+ """
+ if not os.path.exists(template_path):
+ logger.info(f"Template file not found: {template_path}")
+ return False
+
+ template = read_image(template_path)
+ if template is None:
+ logger.info(f"Failed to load template: {template_path}")
+ return False
+
+ t_h, t_w = template.shape[:2]
+
+ start_time = time.time()
+ best_val_overall = 0.0
+
+ while time.time() - start_time < timeout:
+ # 临时截图
+ temp_uuid = "temp_click_check"
+ screenshot_path = take_screenshot(d, temp_uuid, save_dir="Temp")
+
+ target = read_image(screenshot_path)
+ if target is None:
+ time.sleep(0.5)
+ continue
+
+ # 多尺度匹配
+ found = None
+ # 缩放比例从 0.5 到 1.5,步长 0.1
+ for scale in np.linspace(0.5, 1.5, 11):
+ # 调整模板大小
+ resized_template = cv2.resize(template, (int(t_w * scale), int(t_h * scale)))
+ r_h, r_w = resized_template.shape[:2]
+
+ # 如果模板比目标还大,跳过
+ if r_h > target.shape[0] or r_w > target.shape[1]:
+ continue
+
+ result = cv2.matchTemplate(target, resized_template, cv2.TM_CCOEFF_NORMED)
+ min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
+
+ if max_val > best_val_overall:
+ best_val_overall = max_val
+
+ if max_val >= threshold:
+ found = (max_val, max_loc, r_w, r_h)
+ break # 找到满足阈值的即停止当前截图的搜索
+
+ # 清理临时文件
+ try:
+ os.remove(screenshot_path)
+ except:
+ pass
+
+ if found:
+ max_val, max_loc, r_w, r_h = found
+ # 计算中心点
+ top_left = max_loc
+ center_x = top_left[0] + r_w // 2
+ center_y = top_left[1] + r_h // 2
+
+ logger.info(f"Found image at ({center_x}, {center_y}) with confidence {max_val:.2f}")
+ d.click(center_x, center_y)
+ return True
+
+ time.sleep(1.0)
+
+ logger.info(f"Image not found after {timeout}s (Best confidence: {best_val_overall:.2f})")
+ return False
+
+def detect_black_agree_button(image_path, debug_dir=None):
+ """
+ 通过计算机图形学检测黑色的"同意"按钮 (Image 1 场景)
+ 特征:黑色圆角矩形,位于屏幕中下部,面积适中
+ :param image_path: 截图路径
+ :return: (x, y) 坐标中心点,如果未找到返回 None
+ """
+ if not os.path.exists(image_path):
+ return None
+
+ img = read_image(image_path)
+ if img is None:
+ return None
+
+ h, w = img.shape[:2]
+
+ # 转换为HSV颜色空间,因为黑色更容易过滤
+ hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
+
+ # 定义黑色的范围
+ # 黑色:V (Brightness) 很低
+ lower_black = np.array([0, 0, 0])
+ upper_black = np.array([180, 255, 40]) # V < 40 认为是黑色
+
+ mask = cv2.inRange(hsv, lower_black, upper_black)
+
+ # 限制搜索区域:通常在屏幕下半部分
+ roi_top = int(h * 0.4)
+ roi_bottom = int(h * 0.8)
+ roi_mask = np.zeros_like(mask)
+ roi_mask[roi_top:roi_bottom, :] = mask[roi_top:roi_bottom, :]
+
+ # 形态学操作:去除噪点,连接断开的区域
+ kernel = np.ones((5, 5), np.uint8)
+ roi_mask = cv2.morphologyEx(roi_mask, cv2.MORPH_CLOSE, kernel)
+ roi_mask = cv2.morphologyEx(roi_mask, cv2.MORPH_OPEN, kernel)
+
+ # 查找轮廓
+ contours, _ = cv2.findContours(roi_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
+
+ best_cnt = None
+ max_area = 0
+
+ for cnt in contours:
+ area = cv2.contourArea(cnt)
+ x, y, cw, ch = cv2.boundingRect(cnt)
+ aspect_ratio = float(cw) / ch
+
+ # 过滤条件
+ # 1. 面积要够大 (例如 > 屏幕面积的 1%)
+ if area < (w * h * 0.01):
+ continue
+
+ # 2. 宽高比:通常按钮是扁长条,例如 > 2.0
+ if aspect_ratio < 2.0 or aspect_ratio > 10.0:
+ continue
+
+ # 3. 宽度:通常占据屏幕宽度的 50% 以上
+ if cw < (w * 0.5):
+ continue
+
+ if area > max_area:
+ max_area = area
+ best_cnt = cnt
+
+ if best_cnt is not None:
+ x, y, cw, ch = cv2.boundingRect(best_cnt)
+ center_x = x + cw // 2
+ center_y = y + ch // 2
+ logger.info(f"Found Black Agree Button at ({center_x}, {center_y}), Size: {cw}x{ch}")
+
+ if debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = img.copy()
+ cv2.rectangle(debug_img, (x, y), (x+cw, y+ch), (0, 0, 255), 2)
+ cv2.circle(debug_img, (center_x, center_y), 5, (0, 255, 0), -1)
+ save_image(os.path.join(debug_dir, "debug_agree_btn.jpg"), debug_img)
+
+ return (center_x, center_y)
+
+ return None
+
+def detect_ad_close_x(image_path, template_path, debug_dir=None, threshold=0.7):
+ """
+ 通过模板匹配检测"关闭(X)"按钮 (Image 2 场景)
+ 支持多尺度匹配
+ :param image_path: 截图路径
+ :param template_path: 模板图片路径
+ :param debug_dir: 调试目录
+ :param threshold: 匹配阈值
+ :return: (x, y) 坐标中心点,如果未找到返回 None
+ """
+ if not os.path.exists(image_path):
+ return None
+
+ if not os.path.exists(template_path):
+ logger.warning(f"Template not found: {template_path}")
+ return None
+
+ target = read_image(image_path)
+ template = read_image(template_path)
+
+ if target is None or template is None:
+ return None
+
+ # 转换为灰度图进行匹配,减少颜色干扰
+ target_gray = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)
+ template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
+
+ t_h, t_w = template_gray.shape[:2]
+
+ best_match = None
+
+ # 多尺度匹配: 缩放模板
+ # 假设模板可能比实际大,也可能小。范围 0.5 - 1.5
+ scales = np.linspace(0.5, 1.5, 20)
+
+ for scale in scales:
+ # 计算缩放后的模板尺寸
+ new_w = int(t_w * scale)
+ new_h = int(t_h * scale)
+
+ # 确保缩放后的模板不大于目标图像
+ if new_w > target_gray.shape[1] or new_h > target_gray.shape[0]:
+ continue
+
+ resized_template = cv2.resize(template_gray, (new_w, new_h))
+
+ # 匹配
+ result = cv2.matchTemplate(target_gray, resized_template, cv2.TM_CCOEFF_NORMED)
+ min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
+
+ if best_match is None or max_val > best_match[0]:
+ best_match = (max_val, max_loc, scale, new_w, new_h)
+
+ if best_match is None:
+ return None
+
+ max_val, max_loc, best_scale, best_w, best_h = best_match
+
+ # 获取目标图像尺寸
+ target_h, target_w = target_gray.shape[:2]
+
+ top_left = max_loc
+ center_x = top_left[0] + best_w // 2
+ center_y = top_left[1] + best_h // 2
+
+ # --- 位置启发式过滤 ---
+ # 计算相对位置
+ rel_x = center_x / target_w
+ rel_y = center_y / target_h
+
+ logger.info(f"Ad Close Button Match: Confidence={max_val:.4f}, Scale={best_scale:.2f}, Pos=({center_x}, {center_y}), Rel=({rel_x:.2f}, {rel_y:.2f})")
+
+ is_valid_pos = True
+
+ # 规则1: 过滤掉屏幕正中央偏上的区域 (通常是广告标题、图标或内容)
+ # 范围: X在 [0.3, 0.7] 且 Y在 [0.15, 0.5]
+ if 0.3 < rel_x < 0.7 and 0.15 < rel_y < 0.5:
+ logger.warning(f"Ignored match at ({center_x}, {center_y}) - likely Ad Content/Title (Center-Top area).")
+ is_valid_pos = False
+
+ # 规则2: 如果置信度不是特别高 (>0.9), 强制要求在典型区域 (右上角 或 底部中间)
+ # 右上角: X > 0.7, Y < 0.5
+ # 底部中间: Y > 0.6
+ if is_valid_pos and max_val < 0.98: # 如果置信度非常高(0.98+),可能是极其标准的X,暂时放过(除非在禁区)
+ if not ((rel_x > 0.7 and rel_y < 0.5) or (rel_y > 0.6)):
+ logger.warning(f"Ignored match at ({center_x}, {center_y}) - not in typical Close Button regions (Top-Right or Bottom).")
+ is_valid_pos = False
+
+ if max_val >= threshold:
+ if is_valid_pos:
+ # [Safety Check] 底部安全区排除
+ # 如果检测到的关闭按钮位于屏幕底部 BOTTOM_SAFE_EXCLUDE_RATIO 区域内,认为是误判(如误触底部功能按钮)
+ if center_y > (target_h * (1 - BOTTOM_SAFE_EXCLUDE_RATIO)):
+ logger.warning(f"Ignored Ad Close Button at ({center_x}, {center_y}) - in Bottom Safety Zone ({int(BOTTOM_SAFE_EXCLUDE_RATIO*100)}%).")
+ # 也可以保存一下调试图
+ if debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = target.copy()
+ cv2.rectangle(debug_img, top_left, (top_left[0] + best_w, top_left[1] + best_h), (0, 0, 128), 2) # Dark Red for Safety Ignored
+ cv2.putText(debug_img, f"SAFETY IGNORED",
+ (top_left[0], top_left[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 128), 1)
+ save_image(os.path.join(debug_dir, "debug_ad_close_safety_ignored.jpg"), debug_img)
+ return None
+
+ logger.info(f"Found Ad Close Button at ({center_x}, {center_y})")
+
+ if debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = target.copy()
+ cv2.rectangle(debug_img, top_left, (top_left[0] + best_w, top_left[1] + best_h), (0, 0, 255), 2)
+ cv2.circle(debug_img, (center_x, center_y), 5, (0, 255, 0), -1)
+ cv2.putText(debug_img, f"Conf: {max_val:.2f}, Sc: {best_scale:.2f}",
+ (top_left[0], top_left[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
+ save_image(os.path.join(debug_dir, "debug_ad_close_x.jpg"), debug_img)
+
+ return (center_x, center_y)
+ else:
+ # 虽然置信度高,但是位置不对,保存为 False Positive 供调试
+ if debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = target.copy()
+ cv2.rectangle(debug_img, top_left, (top_left[0] + best_w, top_left[1] + best_h), (0, 165, 255), 2) # Orange for ignored
+ cv2.putText(debug_img, f"IGNORED Pos",
+ (top_left[0], top_left[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 165, 255), 1)
+ save_image(os.path.join(debug_dir, "debug_ad_close_ignored.jpg"), debug_img)
+
+ # 如果没找到,但有一定置信度,也保存一下调试图以便分析
+ if max_val > 0.4 and debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = target.copy()
+ top_left = max_loc
+ cv2.rectangle(debug_img, top_left, (top_left[0] + best_w, top_left[1] + best_h), (0, 255, 255), 2)
+ cv2.putText(debug_img, f"Failed Conf: {max_val:.2f}",
+ (top_left[0], top_left[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 1)
+ save_image(os.path.join(debug_dir, "debug_ad_close_fail.jpg"), debug_img)
+
+ return None
+
+def detect_any_ad_close(image_path, template_dir, debug_dir=None):
+ """
+ 遍历模板目录下的所有 ad_close*.jpg 进行匹配
+ """
+ if not os.path.exists(template_dir):
+ return None
+
+ for filename in os.listdir(template_dir):
+ if filename.startswith("ad_close") and filename.endswith(".jpg"):
+ template_path = os.path.join(template_dir, filename)
+ logger.info(f"Trying template: {filename}")
+ pos = detect_ad_close_x(image_path, template_path, debug_dir=debug_dir)
+ if pos:
+ return pos
+ return None
+
+def detect_bottom_close_circle(image_path, debug_dir=None):
+ """
+ 通过几何特征检测底部的圆形关闭按钮 (常见于插屏广告)
+ 特征:
+ 1. 位于屏幕底部区域 (Y > 60%)
+ 2. 水平居中 (X 靠近 W/2)
+ 3. 圆形或近似圆形
+ 4. 内部有高对比度边缘 (X号)
+ """
+ if not os.path.exists(image_path):
+ return None
+
+ img = read_image(image_path)
+ if img is None:
+ return None
+
+ h, w = img.shape[:2]
+
+ # 1. 提取感兴趣区域 (ROI): 屏幕底部 25% (缩小范围,避开列表内容区)
+ roi_top = int(h * 0.75)
+ roi_h = h - roi_top
+ roi = img[roi_top:h, :]
+
+ # 转灰度
+ gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
+ # 高斯模糊降噪
+ gray_blurred = cv2.GaussianBlur(gray, (9, 9), 2)
+
+ # 2. 霍夫圆变换检测圆形
+ # dp=1.2 (累加器分辨率), minDist=w/5 (圆心最小距离), param1=100 (Canny高阈值), param2=30 (圆心累加阈值), minR=w*0.04, maxR=w*0.1
+ # 缩小最大半径范围,防止识别到过大的按钮(如扫码充电按钮)
+ circles = cv2.HoughCircles(gray_blurred, cv2.HOUGH_GRADIENT, dp=1.2, minDist=w/5,
+ param1=100, param2=30, minRadius=int(w*0.04), maxRadius=int(w*0.09))
+
+ if circles is not None:
+ circles = np.round(circles[0, :]).astype("int")
+
+ best_circle = None
+ min_dist_to_center = float('inf')
+
+ for (cx, cy, r) in circles:
+ # 还原到全图坐标
+ global_cy = roi_top + cy
+ global_cx = cx
+
+ # 过滤1: 必须在水平中心附近 (容差 15%,收紧限制)
+ if abs(global_cx - w//2) > (w * 0.15):
+ continue
+
+ # 过滤2: 垂直方向限制 (必须在屏幕 80% - 95% 之间)
+ # 这样可以避开位于 60%-80% 区域的列表项卡片
+ rel_y = global_cy / h
+ if rel_y < 0.80 or rel_y > 0.95:
+ continue
+
+ dist = abs(global_cx - w//2)
+ if dist < min_dist_to_center:
+ min_dist_to_center = dist
+ best_circle = (global_cx, global_cy, r)
+
+ if best_circle:
+ cx, cy, r = best_circle
+ # 确保转换为标准的 Python int,否则 uiautomator2 click 可能会报错 (JSON serializable error)
+ cx, cy, r = int(cx), int(cy), int(r)
+
+ # [Safety Check] 底部安全区排除
+ # 如果检测到的圆形按钮位于屏幕底部 BOTTOM_SAFE_EXCLUDE_RATIO 区域内,认为是误判(如误触底部扫码充电等)
+ if cy > (h * (1 - BOTTOM_SAFE_EXCLUDE_RATIO)):
+ logger.warning(f"Ignored Bottom Circle at ({cx}, {cy}) - in Bottom Safety Zone ({int(BOTTOM_SAFE_EXCLUDE_RATIO*100)}%).")
+ return None
+
+ logger.info(f"Found Bottom Circle Button via Hough: ({cx}, {cy}), r={r}")
+
+ if debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = img.copy()
+ cv2.circle(debug_img, (cx, cy), r, (0, 255, 0), 2)
+ cv2.circle(debug_img, (cx, cy), 2, (0, 0, 255), 3)
+ save_image(os.path.join(debug_dir, "debug_bottom_circle.jpg"), debug_img)
+
+ return (cx, cy)
+
+ return None
+
+def find_expand_button_position(image_path, debug_dir=None, debug_filename_prefix=None):
+ """
+ 通过几何特征识别"全部时段"按钮的位置
+ 特征:该行左侧(30%)和右侧(30%)基本为空白,中间有内容
+ :param image_path: 截图路径
+ :param debug_dir: 调试图片保存目录,如果为None则不保存
+ :param debug_filename_prefix: 调试图片文件名前缀
+ :return: (x, y) 坐标中心点,如果未找到返回 None
+ """
+ if not os.path.exists(image_path):
+ return None
+
+ img = read_image(image_path)
+ if img is None:
+ return None
+
+ h, w = img.shape[:2]
+
+ # 转灰度
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+
+ # 边缘检测
+ edges = cv2.Canny(gray, 50, 150)
+
+ # 定义区域
+ left_w = int(w * 0.35)
+ right_w = int(w * 0.65)
+
+ # 提取各部分边缘
+ left_part = edges[:, :left_w]
+ right_part = edges[:, right_w:]
+ center_part = edges[:, left_w:right_w]
+
+ # 计算每一行的边缘点数量
+ row_sum_left = np.sum(left_part, axis=1) / 255.0
+ row_sum_right = np.sum(right_part, axis=1) / 255.0
+ row_sum_center = np.sum(center_part, axis=1) / 255.0
+
+ # 筛选条件:左右边缘点很少,中间边缘点较多
+ # 阈值可以根据实际情况调整
+ # 允许少量噪点,所以不是严格的0,而是小于某个较小值(例如宽度的1%)
+ noise_threshold = 2 # 允许2个像素的噪点
+ content_threshold = 5 # 中间至少有5个像素的边缘
+
+ candidates = (row_sum_left <= noise_threshold) & \
+ (row_sum_right <= noise_threshold) & \
+ (row_sum_center >= content_threshold)
+
+ # 找到连续的候选行
+ y_indices = np.where(candidates)[0]
+
+ if len(y_indices) == 0:
+ return None
+
+ # 将连续行分组
+ segments = []
+ if len(y_indices) > 0:
+ start = y_indices[0]
+ prev = y_indices[0]
+ for y in y_indices[1:]:
+ if y > prev + 5: # 允许5像素断裂
+ segments.append((start, prev))
+ start = y
+ prev = y
+ segments.append((start, prev))
+
+ # 筛选最合适的段
+ best_segment = None
+
+ # 我们期望按钮在屏幕中下部,且高度适中(例如 20-100px)
+ # 且通常是在价格表下方。假设价格表占据了屏幕上部。
+ # 我们可以简单地取符合条件的段中,Y值最大的那个(最靠下的),或者最符合"中间有字"特征的。
+ # 考虑到页面底部可能有其他干扰,取"中下部"的一个。
+
+ valid_segments = []
+ for start, end in segments:
+ height = end - start
+ mid_y = (start + end) // 2
+
+ # 过滤掉太高或太矮的区域
+ if height < 20 or height > 150:
+ continue
+
+ # 过滤掉顶部的区域(可能是标题栏误判)
+ if mid_y < h * 0.3:
+ continue
+
+ # 过滤掉底部的区域(可能是底部按钮)
+ if mid_y > h * 0.9:
+ continue
+
+ valid_segments.append((start, end))
+
+ if not valid_segments:
+ return None
+
+ # 如果有多个,通常"全部时段"是在价格表之后,紧接着的一个
+ # 这里我们取第一个(最靠上的)符合条件的段,因为它紧跟在价格表下方
+ # 或者取所有段中,中间内容最"紧凑"的?
+ # 让我们简单点,取第一个符合条件的段。
+ best_segment = valid_segments[0]
+
+ start, end = best_segment
+ center_y = (start + end) // 2
+ center_x = w // 2
+
+ if debug_dir:
+ os.makedirs(debug_dir, exist_ok=True)
+ debug_img = img.copy()
+ # 画出识别区域
+ cv2.rectangle(debug_img, (0, start), (w, end), (0, 255, 0), 2)
+ # 画出红点
+ cv2.circle(debug_img, (center_x, center_y), 10, (0, 0, 255), -1)
+
+ # 保存 flag 图片
+ if debug_filename_prefix:
+ # Sanitize filename: remove invalid chars
+ import re
+ safe_prefix = re.sub(r'[\\/*?:"<>|]', '_', str(debug_filename_prefix))
+ debug_name = f"{safe_prefix}_flag_expand.jpg"
+ else:
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
+ debug_name = f"{timestamp}_flag_expand.jpg"
+
+ debug_path = os.path.join(debug_dir, debug_name)
+ save_image(debug_path, debug_img)
+ logger.info(f"Saved debug image to {debug_path}")
+
+ return (int(center_x), int(center_y))
+
+
+def get_row_stats(gray):
+ """
+ 计算每一行的统计特征
+ """
+ h, w = gray.shape
+
+ # 中央区域 (用于检测内容)
+ center_x = w // 2
+ strip_w = 100
+ center_strip = gray[:, center_x - 50 : center_x + 50]
+
+ # 边缘区域 (用于检测背景/边距)
+ # 假设边距至少有 10px
+ edge_strip = gray[:, 0:20]
+
+ row_means = np.mean(center_strip, axis=1)
+ row_stds = np.std(center_strip, axis=1)
+ edge_means = np.mean(edge_strip, axis=1)
+
+ return row_means, row_stds, edge_means
+
+def crop_cards_from_image(img_path, output_dir=None, save_debug=True):
+ """
+ 从图片中裁剪场站卡片
+ :param img_path: 图片路径
+ :param output_dir: 输出目录,默认与 img_path 相同
+ :param save_debug: 是否保存调试图 (_flag.jpg)
+ :return: 裁剪出的卡片列表,每项包含 (out_path, (click_x, click_y))
+ """
+ logger.info(f"Processing: {img_path}")
+ if not os.path.exists(img_path):
+ logger.info(f"Error: File not found {img_path}")
+ return []
+
+ img = read_image(img_path)
+ if img is None:
+ logger.info(f"Error: Failed to load image {img_path}")
+ return []
+
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+ h, w = gray.shape
+
+ row_means, row_stds, edge_means = get_row_stats(gray)
+
+ # 参数定义
+ # 背景灰度值范围 (根据 Analyze2.py 的输出,背景约 242)
+ BG_GRAY_MIN = 230
+ BG_GRAY_MAX = 250
+
+ # 间隙判定:中央区域也是均匀的灰度
+ # 真正的背景灰度约 242。卡片内的伪背景(不够白)约 246-248。
+ # 所以降低 GAP_MEAN_MAX 以区分 Gap 和 Dirty White。
+ GAP_MEAN_MIN = 235
+ GAP_MEAN_MAX = 244
+ GAP_STD_MAX = 10.0
+
+ segments = []
+ is_in_card = False
+ start_y = 0
+
+ # 记录原始的行状态,用于后续可能的合并优化
+ row_is_card = []
+
+ for y in range(h):
+ rm = row_means[y]
+ rs = row_stds[y]
+ em = edge_means[y]
+
+ # 1. 判定当前行是否可能是卡片的一部分
+ # 条件A: 边缘是灰色的 (说明有边距,排除了全宽的Header/Footer)
+ has_gray_margin = (BG_GRAY_MIN <= em <= BG_GRAY_MAX)
+
+ # 条件B: 中央不是均匀的背景灰 (说明有内容,或者是白色底)
+ # 如果是 Gap,则 Mean 在 Gap范围 且 Std 很小
+ is_gap = (GAP_MEAN_MIN <= rm <= GAP_MEAN_MAX) and (rs < GAP_STD_MAX)
+
+ is_card_row = has_gray_margin and not is_gap
+ row_is_card.append(is_card_row)
+
+ # 简单的形态学闭运算:填补卡片内部的小裂缝
+ # 如果一个 False (Gap) 的上下都是 True (Card),且 Gap 长度很短,则将其视为 Card
+ # 允许的裂缝最大长度
+ # [优化] 减小填补阈值,避免把两个卡片中间的真 Gap 填补了导致粘连
+ # 之前是 10,现在改为 3。
+ MAX_GAP_FILL = 3
+
+ cleaned_row_is_card = row_is_card[:]
+
+ # 查找连续的 False 区域
+ i = 0
+ while i < h:
+ if not cleaned_row_is_card[i]:
+ # Found a gap start
+ gap_start = i
+ while i < h and not cleaned_row_is_card[i]:
+ i += 1
+ gap_end = i
+ gap_len = gap_end - gap_start
+
+ # Check context
+ prev_is_card = (gap_start > 0) and cleaned_row_is_card[gap_start - 1]
+ next_is_card = (gap_end < h) and cleaned_row_is_card[gap_end]
+
+ if prev_is_card and next_is_card and gap_len <= MAX_GAP_FILL:
+ # Fill the gap
+ for k in range(gap_start, gap_end):
+ cleaned_row_is_card[k] = True
+ else:
+ i += 1
+
+ # 根据 cleaned_row_is_card 生成 segments
+ is_in_card = False
+ start_y = 0
+ for y in range(h):
+ if cleaned_row_is_card[y]:
+ if not is_in_card:
+ is_in_card = True
+ start_y = y
+ else:
+ if is_in_card:
+ is_in_card = False
+ end_y = y
+ height = end_y - start_y
+
+ # 过滤太矮的区域
+ if height > 100: # 稍微放宽一点,150 -> 100
+ segments.append((start_y, end_y))
+
+ # 处理最后一个 segment
+ if is_in_card:
+ end_y = h
+ height = end_y - start_y
+ if height > 100:
+ segments.append((start_y, end_y))
+
+ # [新增] 触底过滤:过滤掉延伸到图片底部的 Segment
+ # 底部通常是导航栏或被截断的卡片
+ BOTTOM_MARGIN = 50 # 距离底部多少像素内算触底
+ valid_segments_scan = []
+ for y1, y2 in segments:
+ if y2 >= h - BOTTOM_MARGIN:
+ logger.info(f" Dropping segment Y={y1}-{y2} because it touches the bottom (H={h}).")
+ continue
+ valid_segments_scan.append((y1, y2))
+ segments = valid_segments_scan
+
+ logger.info(f" Found {len(segments)} potential segments based on vertical scan.")
+
+ # 1.5 Group Segments by Large Gaps (to separate Header / List / Footer)
+ # The filter bar usually creates a large gap (e.g. > 60px).
+ SECTION_GAP_MIN = 60
+ groups = []
+ if segments:
+ current_group = [segments[0]]
+ for i in range(1, len(segments)):
+ prev_end = segments[i-1][1]
+ curr_start = segments[i][0]
+ gap = curr_start - prev_end
+
+ if gap > SECTION_GAP_MIN:
+ groups.append(current_group)
+ current_group = []
+
+ current_group.append(segments[i])
+ groups.append(current_group)
+
+ logger.info(f" Found {len(groups)} segment groups.")
+
+ # Select the Target Group
+ # Strategy: Select the LAST group that has at least one 'substantial' segment (H > 150).
+ # This assumes the Station List is the main content and usually at the bottom (scrolling area).
+ target_group = []
+ for g in reversed(groups):
+ # Check if group has substantial content
+ has_content = False
+ for (y1, y2) in g:
+ if (y2 - y1) > 150:
+ has_content = True
+ break
+
+ if has_content:
+ target_group = g
+ break
+
+ if not target_group and segments:
+ # Fallback to all segments if no substantial group found
+ target_group = segments
+
+ logger.info(f" Selected group with {len(target_group)} segments.")
+
+ # 2. 确定每个卡片的左右边界 (Width Refinement)
+ # 收集所有 segment 的建议边界,然后统一
+
+ candidate_x1 = []
+ candidate_x2 = []
+
+ temp_valid_segments = []
+
+ for y1, y2 in target_group:
+ # 取中间一段行来分析
+ mid_y = (y1 + y2) // 2
+ sample_h = min(10, y2 - y1)
+ sample_rows = gray[mid_y - sample_h//2 : mid_y + sample_h//2, :]
+ col_means = np.mean(sample_rows, axis=0)
+
+ # 从左向右找第一个非灰像素
+ x1 = 0
+ for x in range(w // 2):
+ if not (BG_GRAY_MIN <= col_means[x] <= BG_GRAY_MAX):
+ x1 = x
+ break
+
+ # 从右向左找第一个非灰像素
+ x2 = w
+ for x in range(w - 1, w // 2, -1):
+ if not (BG_GRAY_MIN <= col_means[x] <= BG_GRAY_MAX):
+ x2 = x
+ break
+
+ if x1 >= x2 or (x2 - x1) < w * 0.5:
+ # 如果这个 segment 无法确定宽度,可能不是有效卡片,暂不参与宽度投票
+ # 但为了不漏掉,暂时先记录,用默认值填充
+ logger.warning(f" Warning: Segment {y1}-{y2} has weird width {x2-x1}.")
+ pass
+ else:
+ candidate_x1.append(x1)
+ candidate_x2.append(x2)
+
+ temp_valid_segments.append((y1, y2))
+
+ # 计算统一宽度
+ if not candidate_x1:
+ logger.info(" No valid width detected. Using default.")
+ final_x1 = 0
+ final_x2 = w
+ else:
+ # 使用中位数或众数来消除噪声
+ # 考虑到对齐,Min x1 和 Max x2 可能更合适?或者 Median。
+ # 通常卡片是对齐的,所以 x1 应该几乎一样。
+ final_x1 = int(np.median(candidate_x1))
+ final_x2 = int(np.median(candidate_x2))
+
+ # 稍微加点 Padding (但不要超过图片边界)
+ final_x1 = max(0, final_x1 - 5)
+ final_x2 = min(w, final_x2 + 5)
+
+ logger.info(f" Unified Width: X={final_x1}-{final_x2}, W={final_x2 - final_x1}")
+
+ # 3. 过滤高度异常的卡片 (Height Filtering)
+ # 计算所有潜在卡片的高度
+ final_cards = []
+ if not temp_valid_segments:
+ logger.info(" No segments found.")
+ else:
+ heights = [y2 - y1 for y1, y2 in temp_valid_segments]
+ if not heights:
+ logger.info(" No heights to calculate.")
+ else:
+ max_h = max(heights)
+ median_h = np.median(heights)
+
+ # 策略:如果高度差异较大,丢弃过小的卡片
+ # 阈值设定为 Median 的 75% (允许一定程度的偏差,如 220 vs 258 是允许的,但 150 vs 250 应被过滤)
+ # 使用 Median 比 Max 更稳健,避免被单个超高卡片(如广告)带偏
+ threshold_h = median_h * 0.70
+
+ for (y1, y2), h in zip(temp_valid_segments, heights):
+ if h < threshold_h:
+ logger.info(f" Filtering out segment Y={y1}-{y2} (H={h}) because it's too short (Threshold={threshold_h:.1f}).")
+ else:
+ final_cards.append((y1, y2, final_x1, final_x2))
+ logger.info(f" Card: Y={y1}-{y2}, X={final_x1}-{final_x2}, H={h}")
+
+ # 4. 保存结果
+ if output_dir is None:
+ output_dir = os.path.dirname(img_path)
+
+ base_name = os.path.basename(img_path)
+ stem, ext = os.path.splitext(base_name)
+
+ # 准备可视化标记图
+ debug_img = img.copy()
+
+ results = []
+
+ # 准备 JSON 数据结构
+ json_data = {
+ "image": base_name,
+ "width": w,
+ "height": h,
+ "cards": []
+ }
+
+ # 准备 _vl.jpg (只画框,不画红点)
+ vl_img = img.copy()
+
+ logger.info(f" Step [2.1/VL] 准备在 VL 图片上绘制 {len(final_cards)} 个场站的绿色方框...")
+
+ for idx, (y1, y2, x1, x2) in enumerate(final_cards):
+ # 计算点击点 (左上角,避免被底部按钮遮挡)
+ # 策略:X偏移 15%, Y偏移 20%
+ w_card = x2 - x1
+ h_card = y2 - y1
+ click_x = int(x1 + w_card * 0.15)
+ click_y = int(y1 + h_card * 0.20)
+
+ # [修改] 不再保存单张子图,只记录元数据
+ # card = img[y1:y2, x1:x2]
+ # 文件名添加坐标: _ClickX_ClickY
+ # out_name = f"{stem}_{idx + 1}_{click_x}_{click_y}{ext}"
+ # out_path = os.path.join(output_dir, out_name)
+ # cv2.imwrite(out_path, card)
+ # logger.info(f" Saved {out_path}")
+
+ # results.append((out_path, (click_x, click_y)))
+
+ # 在标记图上画红点 (实心圆, 半径10, 红色BGR)
+ cv2.circle(debug_img, (click_x, click_y), 10, (0, 0, 255), -1)
+ # [修改] 必须画绿框,因为后续视觉模型依赖这个框来识别范围
+ cv2.rectangle(debug_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
+
+ # 在 _vl 图上只画绿框
+ cv2.rectangle(vl_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
+
+ # 收集 JSON 数据
+ card_info = {
+ "id": idx + 1,
+ "rect": [x1, y1, x2, y2],
+ "click_point": [click_x, click_y]
+ }
+ json_data["cards"].append(card_info)
+
+ # 记录区域信息供调用者使用 (如果需要)
+ # 格式: (None, (click_x, click_y), (x1, y1, x2, y2))
+ results.append((None, (click_x, click_y), (x1, y1, x2, y2)))
+
+ # [删除] 之前生成的单张 _for_vl.jpg 逻辑已移除
+
+ # 保存标记图 (_flag.jpg)
+ if save_debug:
+ flag_out_path = os.path.join(output_dir, f"{stem}_flag{ext}")
+ save_image(flag_out_path, debug_img)
+ logger.info(f" Saved Debug Image: {flag_out_path}")
+
+ # 保存 _vl.jpg
+ vl_out_path = os.path.join(output_dir, f"{stem}_vl{ext}")
+ save_image(vl_out_path, vl_img)
+ logger.info(f" Step [2.2/VL] 已保存带有绿色方框的图片: {vl_out_path}")
+
+ # 保存 .json
+ import json
+ json_out_path = os.path.join(output_dir, f"{stem}.json")
+ with open(json_out_path, 'w', encoding='utf-8') as f:
+ json.dump(json_data, f, ensure_ascii=False, indent=4)
+ logger.info(f" Step [2.3/JSON] 已保存场站坐标元数据: {json_out_path}")
+
+ return results
diff --git a/Util/LlmUtil.py b/Util/LlmUtil.py
new file mode 100644
index 0000000..2d2f6df
--- /dev/null
+++ b/Util/LlmUtil.py
@@ -0,0 +1,77 @@
+import sys
+
+from openai import AsyncOpenAI
+
+from Config import *
+from Config.Config import ALY_LLM_API_KEY, ALY_LLM_BASE_URL, ALY_LLM_MODEL_NAME
+
+
+# 保留原同步函数,添加异步版本
+async def get_llm_response(query_text: str, stream: bool = True, system_prompt: str = 'You are a helpful assistant.', chat_history: list = None, temperature: float = None):
+ """
+ 异步获取大模型的响应
+ @param query_text: 查询文本
+ @param stream: 是否使用流式输出
+ @param system_prompt: 系统提示文本,默认为'You are a helpful assistant.'
+ @param chat_history: 聊天历史记录,格式为[{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}, ...]
+ @param temperature: 温度参数,控制输出的随机性,0-2之间,默认为None使用模型默认值
+ @return: 流式响应生成器或完整响应文本
+ """
+ client = AsyncOpenAI(
+ api_key=ALY_LLM_API_KEY,
+ base_url=ALY_LLM_BASE_URL,
+ )
+
+ try:
+ # 构建messages列表,包含系统提示和聊天历史
+ messages = [{'role': 'system', 'content': system_prompt}]
+
+ # 如果有聊天历史,添加到messages中
+ if chat_history and isinstance(chat_history, list):
+ messages.extend(chat_history)
+
+ # 添加当前用户查询
+ messages.append({'role': 'user', 'content': query_text})
+
+ # 构建请求参数
+ request_params = {
+ 'model': ALY_LLM_MODEL_NAME,
+ 'messages': messages,
+ 'stream': stream
+ }
+
+ # 如果指定了temperature参数,添加到请求中
+ if temperature is not None:
+ request_params['temperature'] = temperature
+
+ # 创建请求
+ completion = await client.chat.completions.create(**request_params)
+
+ if stream:
+ # 流式输出模式,返回生成器
+ async for chunk in completion:
+ # 确保 chunk.choices 存在且不为空
+ if chunk and chunk.choices and len(chunk.choices) > 0:
+ # 确保 delta 存在
+ delta = chunk.choices[0].delta
+ if delta:
+ # 确保 content 存在且不为 None 或空字符串
+ content = delta.content
+ if content is not None:
+ # if content is not None and content.strip():
+ print(content, end='', flush=True)
+ yield content
+ else:
+ # 非流式处理
+ if completion and completion.choices and len(completion.choices) > 0:
+ message = completion.choices[0].message
+ if message:
+ content = message.content
+ if content is not None:
+ # if content is not None and content.strip():
+ yield content
+ except Exception as e:
+ error_msg = f"大模型请求异常: {str(e)}"
+ print(error_msg, file=sys.stderr)
+ # 抛出异常而不是返回错误信息,让调用方处理
+ raise Exception(error_msg)
\ No newline at end of file
diff --git a/Util/ObsUtil.py b/Util/ObsUtil.py
new file mode 100644
index 0000000..aa8f300
--- /dev/null
+++ b/Util/ObsUtil.py
@@ -0,0 +1,158 @@
+# pip install esdk-obs-python --trusted-host pypi.org
+import traceback
+import logging
+import base64 # 添加base64模块导入
+from obs import ObsClient
+from obs import PutObjectHeader
+
+from Config.Config import OBS_AK, OBS_SK, OBS_SERVER, OBS_BUCKET
+
+# 配置日志
+logger = logging.getLogger(__name__)
+
+
+class ObsUploader:
+ def __init__(self, access_key_id=OBS_AK, secret_access_key=OBS_SK, server="https://" + OBS_SERVER):
+ """
+ 初始化OBS客户端
+ :param access_key_id: 访问密钥ID
+ :param secret_access_key: 秘密访问密钥
+ :param server: OBS服务器地址
+ """
+ self.obs_client = ObsClient(
+ access_key_id=access_key_id,
+ secret_access_key=secret_access_key,
+ server=server
+ )
+
+ def upload_file(self, object_key, file_path, bucket_name=OBS_BUCKET, metadata=None, headers=None):
+ """
+ 上传文件到OBS
+ :param bucket_name: 桶名称
+ :param object_key: 对象键(上传后的文件名)
+ :param file_path: 本地文件路径
+ :param metadata: 元数据
+ :param headers: 请求头
+ :return: 成功返回True和响应信息,失败返回False和错误信息
+ """
+ try:
+ # 初始化默认参数
+ if metadata is None:
+ metadata = {}
+ if headers is None:
+ headers = PutObjectHeader()
+ # headers.ContentDisposition = 'attachment;' # filename="{}"'.format(os.path.basename(file_path))
+ # headers.ContentType='application/octet-stream'
+
+ # 执行文件上传
+ resp = self.obs_client.putFile(
+ bucket_name,
+ object_key,
+ file_path,
+ metadata,
+ headers
+ )
+
+ # 检查响应状态
+ if resp.status < 300:
+ logger.info(f'文件上传成功: {file_path} -> {bucket_name}/{object_key}')
+ logger.info(f'requestId: {resp.requestId}')
+ logger.info(f'etag: {resp.body.etag}')
+ return True, {
+ 'requestId': resp.requestId,
+ 'etag': resp.body.etag,
+ 'versionId': resp.body.versionId,
+ 'storageClass': resp.body.storageClass
+ }
+ else:
+ error_msg = f'文件上传失败: {resp.errorCode} - {resp.errorMessage}'
+ logger.error(error_msg)
+ logger.error(f'requestId: {resp.requestId}')
+ return False, {
+ 'requestId': resp.requestId,
+ 'errorCode': resp.errorCode,
+ 'errorMessage': resp.errorMessage
+ }
+ except Exception as e:
+ error_msg = f'文件上传异常: {str(e)}'
+ logger.error(error_msg)
+ logger.error(traceback.format_exc())
+ return False, {'error': str(e), 'traceback': traceback.format_exc()}
+
+ def upload_base64_image(self, object_key, base64_data, bucket_name=OBS_BUCKET, metadata=None, headers=None):
+ """
+ 上传Base64编码的图片或原始二进制图片数据到OBS
+ :param bucket_name: 桶名称
+ :param object_key: 对象键(上传后的文件名)
+ :param base64_data: Base64编码的图片字符串、字节形式或原始二进制图片数据
+ :param metadata: 元数据
+ :param headers: 请求头
+ :return: 成功返回True和响应信息,失败返回False和错误信息
+ """
+ try:
+ # 初始化默认参数
+ if metadata is None:
+ metadata = {}
+ if headers is None:
+ headers = PutObjectHeader()
+ # headers.ContentDisposition = 'attachment;' # filename="{}"'.format(os.path.basename(file_path))
+ # headers.ContentType = 'application/octet-stream'
+
+ # 处理数据
+ if isinstance(base64_data, bytes):
+ try:
+ # 尝试解码为UTF-8字符串(假设是Base64编码的字符串的字节形式)
+ base64_string = base64_data.decode('utf-8')
+ # 移除Base64前缀(如果有)
+ if 'base64,' in base64_string:
+ base64_string = base64_string.split('base64,')[1]
+ # 解码Base64数据
+ image_data = base64.b64decode(base64_string)
+ except UnicodeDecodeError:
+ # 解码失败,假设是原始二进制图片数据
+ image_data = base64_data
+ else:
+ # 假设是字符串
+ base64_string = str(base64_data)
+ # 移除Base64前缀(如果有)
+ if 'base64,' in base64_string:
+ base64_string = base64_string.split('base64,')[1]
+ # 解码Base64数据
+ image_data = base64.b64decode(base64_string)
+
+ # 执行对象上传
+ resp = self.obs_client.putObject(
+ bucket_name,
+ object_key,
+ content=image_data,
+ metadata=metadata,
+ headers=headers
+ )
+
+ # 检查响应状态
+ if resp.status < 300:
+ logger.info(f'图片上传成功: -> {bucket_name}/{object_key}')
+ logger.info(f'requestId: {resp.requestId}')
+ logger.info(f'etag: {resp.body.etag}')
+ return True, {
+ 'requestId': resp.requestId,
+ 'etag': resp.body.etag,
+ 'versionId': resp.body.versionId,
+ 'storageClass': resp.body.storageClass
+ }
+ else:
+ error_msg = f'图片上传失败: {resp.errorCode} - {resp.errorMessage}'
+ logger.error(error_msg)
+ logger.error(f'requestId: {resp.requestId}')
+ return False, {
+ 'requestId': resp.requestId,
+ 'errorCode': resp.errorCode,
+ 'errorMessage': resp.errorMessage
+ }
+ except Exception as e:
+ error_msg = f'图片上传异常: {str(e)}'
+ logger.error(error_msg)
+ logger.error(traceback.format_exc())
+ return False, {'error': str(e), 'traceback': traceback.format_exc()}
+
+
diff --git a/Util/OcrParser.py b/Util/OcrParser.py
new file mode 100644
index 0000000..622d172
--- /dev/null
+++ b/Util/OcrParser.py
@@ -0,0 +1,126 @@
+# coding=utf-8
+import re
+
+class OcrParser:
+ @staticmethod
+ def parse(ocr_lines):
+ """
+ 解析 OCR 文本行,提取场站结构化数据。
+ 不依赖 LLM,使用规则和正则匹配。
+ """
+ result = {
+ "station_name": "",
+ "distance": "",
+ "price": None,
+ "piles": [],
+ "parking": "",
+ "tags": []
+ }
+
+ # 预处理:清洗无关字符
+ clean_lines = []
+ for line in ocr_lines:
+ # 去除 "行 X: " 前缀
+ text = re.sub(r"^行\s*\d+:\s*", "", line)
+ # 去除 "(置信度: ...)" 后缀
+ text = re.sub(r"\s*\(置信度:.*?\)\s*$", "", text)
+ text = text.strip()
+ if text:
+ clean_lines.append(text)
+
+ # 1. 场站名称 (Station Name)
+ # 策略:通常是第一行,且不包含特定关键词(如km, /度, ¥等)
+ for line in clean_lines:
+ if len(line) < 2: continue
+ if line.startswith("(") or line.startswith("(") or line == "…": continue
+
+ # 排除明显属性行
+ if any(k in line.lower() for k in ["km", "/度", "¥", "停车", "积分", "组团"]):
+ continue
+
+ # 排除纯数字
+ if re.match(r"^\d+$", line): continue
+
+ # 排除可能是充电枪信息的行 (例如 "闲2/4", "快", "慢")
+ if re.search(r"\d+/\d+", line): continue
+ if line in ["快", "慢", "超", "快充", "慢充", "超充"]: continue
+
+ result["station_name"] = line
+ break
+
+ # 2. 距离 (Distance)
+ for line in clean_lines:
+ # 匹配 "7.4km", "17.4km"
+ m = re.search(r"(\d+(\.\d+)?)\s*km", line, re.IGNORECASE)
+ if m:
+ result["distance"] = m.group(0)
+ break
+
+ # 3. 价格 (Price)
+ for line in clean_lines:
+ # 匹配 "0.7111/度", "1.2/度"
+ m = re.search(r"(\d+\.\d+)(?=/度)", line)
+ if m:
+ try:
+ result["price"] = float(m.group(1))
+ break
+ except: pass
+
+ # 4. 充电枪信息 (Piles)
+ # 规则:查找 "快", "慢", "超" 以及 "x/y" 格式
+ # 示例: "快", "闲3/4" (跨行) 或 "快充 3/4" (同行)
+ current_type = "未知"
+
+ # 辅助:先尝试在单行内同时匹配类型和数量
+ # 如果单行内有 "快" 和 "3/4",则直接提取
+ # 如果单行只有类型,更新 current_type
+ # 如果单行只有 "3/4",使用 current_type
+
+ for line in clean_lines:
+ # 更新当前类型上下文
+ if "快" in line: current_type = "快"
+ elif "慢" in line: current_type = "慢"
+ elif "超" in line: current_type = "超"
+
+ # 匹配 "3/4" 或 "闲3/4"
+ # 排除价格行 (包含小数点,如 0.7111/度 这里的 / 前后也可能是数字,需小心)
+ if "/度" in line: continue
+
+ # 匹配分数结构:整数/整数
+ # (?:闲)? 可选的前缀 "闲"
+ m = re.search(r"(?:闲)?(\d+)/(\d+)", line)
+ if m:
+ # 再次确认不是价格(有时候 OCR 会把 . 漏掉,变成 07111/度,但通常会有 /度)
+ # 简单校验:总数通常不会特别大,比如不会是 2024/12 (日期)
+ try:
+ free = int(m.group(1))
+ total = int(m.group(2))
+
+ # 过滤可能的日期或异常值
+ if total > 500: continue
+
+ result["piles"].append({
+ "type": current_type,
+ "free": free,
+ "total": total
+ })
+ except: pass
+
+ # 5. 停车信息 (Parking)
+ for line in clean_lines:
+ if "停车" in line:
+ # 清理前缀符号,如 "·收费停车" -> "收费停车"
+ clean_text = re.sub(r"^[·\.\sP]+", "", line)
+ result["parking"] = clean_text
+ break
+
+ # 6. 标签 (Tags)
+ # 收集除上述已解析字段外的简短关键词
+ known_keywords = ["快", "慢", "超", "P", "组团", "积分"]
+ for line in clean_lines:
+ # 简单匹配一些常见 Tag
+ if "积分" in line: result["tags"].append(line)
+ elif "组团" in line: result["tags"].append("组团")
+ elif line.strip() == "P": result["tags"].append("P")
+
+ return result
diff --git a/Util/PaChongGaoDeKit.py b/Util/PaChongGaoDeKit.py
new file mode 100644
index 0000000..bc49544
--- /dev/null
+++ b/Util/PaChongGaoDeKit.py
@@ -0,0 +1,267 @@
+"""
+高德地图高精度坐标获取工具类
+"""
+import json
+import os
+import random
+import re
+import time
+from selenium import webdriver
+from selenium.webdriver.chrome.options import Options
+from selenium.webdriver.chrome.service import Service
+from selenium.webdriver.common.by import By
+from selenium.webdriver.common.keys import Keys
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.support.ui import WebDriverWait
+
+class PaChongGaoDeKit:
+ def __init__(self, headless=True, cookie_file='amap_cookies.json'):
+ self.headless = headless
+ self.cookie_file = cookie_file
+ self.driver = None
+
+ # Ensure cookie file path is absolute if relative
+ if not os.path.isabs(self.cookie_file):
+ # Assuming relative to this file or current working directory
+ # For now, let's assume it's relative to the project root or current execution path
+ # Better to use absolute path if possible.
+ # If the file is in the same directory as this script:
+ current_dir = os.path.dirname(os.path.abspath(__file__))
+ potential_path = os.path.join(current_dir, self.cookie_file)
+ if os.path.exists(potential_path):
+ self.cookie_file = potential_path
+ else:
+ # Fallback to checking root/Config or similar if needed, or just leave as is
+ pass
+
+ def _init_driver(self):
+ if self.driver:
+ return
+
+ print(f"正在启动 Chrome 浏览器 (无头模式={self.headless})...")
+ chrome_options = Options()
+ if self.headless:
+ chrome_options.add_argument('--headless')
+
+ # 解决驱动与浏览器不匹配的常见配置
+ chrome_options.add_argument('--no-sandbox')
+ chrome_options.add_argument('--disable-dev-shm-usage')
+ chrome_options.add_argument('--window-size=1920,1080')
+ chrome_options.add_argument('--lang=zh-CN')
+ chrome_options.add_argument("--disable-blink-features=AutomationControlled")
+ chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
+ chrome_options.add_experimental_option('useAutomationExtension', False)
+
+ service = Service()
+ try:
+ from webdriver_manager.chrome import ChromeDriverManager
+ from webdriver_manager.core.os_manager import ChromeType
+ # 使用 ChromeDriverManager 自动下载匹配版本的 ChromeDriver
+ driver_path = ChromeDriverManager().install()
+ service = Service(driver_path)
+ print(f"已成功加载 ChromeDriver: {driver_path}")
+ except ImportError:
+ print("提示:未安装 webdriver_manager 库,建议安装以获得更好的驱动管理体验:pip install webdriver-manager")
+ except Exception as e:
+ print(f"提示:自动管理驱动失败,尝试使用系统默认驱动。错误原因: {e}")
+
+ try:
+ self.driver = webdriver.Chrome(service=service, options=chrome_options)
+
+ if not self.headless:
+ self.driver.maximize_window()
+
+ self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+ "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
+ })
+ except Exception as e:
+ print(f"致命错误:无法启动 Chrome 浏览器。请确保已安装 Chrome 且版本与驱动匹配。详情: {e}")
+ raise e
+
+ def _load_cookies(self):
+ if not self.driver:
+ return False
+
+ if not os.path.exists(self.cookie_file):
+ print(f"Cookie file not found: {self.cookie_file}")
+ return False
+
+ try:
+ # Visit domain first
+ self.driver.get('https://www.amap.com')
+ time.sleep(1)
+
+ with open(self.cookie_file, 'r', encoding='utf-8') as f:
+ cookies = json.load(f)
+
+ for cookie in cookies:
+ if 'expiry' in cookie:
+ cookie['expiry'] = int(cookie['expiry'])
+ if 'sameSite' in cookie and cookie['sameSite'] not in ['Strict', 'Lax', 'None']:
+ del cookie['sameSite']
+ try:
+ self.driver.add_cookie(cookie)
+ except:
+ pass
+ return True
+ except Exception as e:
+ print(f"Failed to load cookies: {e}")
+ return False
+
+ def ensure_logged_in(self):
+ self._init_driver()
+ if not self._load_cookies():
+ print("Warning: Failed to load cookies, coordinate query might fail.")
+
+ # Navigate to picker tool
+ self.driver.get('https://lbs.amap.com/tools/picker')
+ time.sleep(2)
+
+ def parse_coordinates_info(self, text):
+ if not text:
+ return None
+ try:
+ clean_text = re.sub(r'[\u3000\t\n\r ]+', ',', text)
+ clean_text = re.sub(r'[,,]+', ',', clean_text).strip(',')
+ pattern = r'([7-9]?[0-9]\.[0-9]{1,}|1[0-3][0-9]\.[0-9]{1,})[,,]\s*([1-8]?[0-9]\.[0-9]{1,}|90\.[0-9]{1,})'
+ matches = re.finditer(pattern, clean_text)
+
+ valid_coordinates = []
+ for match in matches:
+ lng = match.group(1).strip()
+ lat = match.group(2).strip()
+ try:
+ lng_float = float(lng)
+ lat_float = float(lat)
+ if 70 <= lng_float <= 140 and 0 <= lat_float <= 60:
+ valid_coordinates.append((lng_float, lat_float))
+ except ValueError:
+ continue
+
+ if valid_coordinates:
+ # Return the first valid one
+ return valid_coordinates[0]
+ return None
+ except Exception:
+ return None
+
+ def get_coordinate(self, address: str):
+ """
+ Query coordinate for a single address.
+ Returns: (lng, lat) tuple or (None, None)
+ """
+ if not address:
+ return None, None
+
+ if not self.driver:
+ self.ensure_logged_in()
+
+ try:
+ # Search input
+ search_input = WebDriverWait(self.driver, 10).until(
+ EC.presence_of_element_located((By.ID, 'txtSearch'))
+ )
+ search_input.clear()
+ search_input.send_keys(address)
+
+ # Click search
+ try:
+ search_button = WebDriverWait(self.driver, 5).until(
+ EC.presence_of_element_located((By.CLASS_NAME, 'btn-search'))
+ )
+ search_button.click()
+ except:
+ search_input.send_keys(Keys.ENTER)
+
+ time.sleep(2) # Wait for result
+
+ # Get coordinate
+ coordinate_text = None
+ try:
+ coord_elem = WebDriverWait(self.driver, 10).until(
+ EC.presence_of_element_located((By.ID, 'txtCoordinate'))
+ )
+ val = coord_elem.get_attribute('value')
+ if val and val.strip():
+ coordinate_text = val.strip()
+ else:
+ coordinate_text = coord_elem.text.strip()
+ except:
+ pass
+
+ if coordinate_text:
+ result = self.parse_coordinates_info(coordinate_text)
+ if result:
+ return result
+
+ return None, None
+
+ except Exception as e:
+ print(f"Error querying address '{address}': {e}")
+ # Try to recover session if needed, or just return None
+ return None, None
+
+ def close(self):
+ if self.driver:
+ try:
+ self.driver.quit()
+ except:
+ pass
+ self.driver = None
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.close()
+
+ def login_and_save_cookies(self):
+ """
+ 打开浏览器进行手动登录,并将 Cookie 保存到文件。
+ 该方法将阻塞,直到用户确认登录完成。
+ """
+ # 强制切换为非无头模式以便手动登录
+ if self.headless:
+ print("切换至可视化模式进行登录...")
+ self.close()
+ self.headless = False
+
+ self._init_driver()
+
+ print("正在跳转至高德地图登录页面...")
+ # 跳转至通常需要登录的页面
+ self.driver.get('https://lbs.amap.com/tools/picker')
+
+ print("\n" + "="*60)
+ print("操作指引:")
+ print("1. 浏览器窗口已打开,请在窗口中手动完成登录。")
+ print("2. 您可以选择扫码登录或账号密码登录。")
+ print("3. 登录成功并跳转到控制台页面后,请回到此窗口。")
+ print("4. 在下方按 [回车键(Enter)],程序将自动抓取并保存 Cookie。")
+ print("="*60 + "\n")
+
+ input("等待登录完成,确认后请按 [Enter] 继续...")
+
+ # 保存 Cookie
+ try:
+ cookies = self.driver.get_cookies()
+ with open(self.cookie_file, 'w', encoding='utf-8') as f:
+ json.dump(cookies, f, indent=4)
+ print(f"成功:Cookie 已保存至: {self.cookie_file}")
+ return True
+ except Exception as e:
+ print(f"错误:保存 Cookie 失败: {e}")
+ return False
+
+if __name__ == "__main__":
+ # Test code
+ # Ensure you have 'amap_cookies.json' in the same directory or provide full path
+ # If no cookies, it might fail to load the picker page correctly if login is required.
+
+ kit = PaChongGaoDeKit(headless=False)
+ try:
+ addr = "北京市天安门"
+ lng, lat = kit.get_coordinate(addr)
+ print(f"{addr}: {lng}, {lat}")
+ finally:
+ kit.close()
diff --git a/Util/PaddleOCRKit.py b/Util/PaddleOCRKit.py
new file mode 100644
index 0000000..9d4b24e
--- /dev/null
+++ b/Util/PaddleOCRKit.py
@@ -0,0 +1,113 @@
+# coding=utf-8
+import os
+import sys
+import logging
+import cv2
+import numpy as np
+from paddleocr import PaddleOCR
+from Util.OcrParser import OcrParser
+
+# Initialize logger
+logger = logging.getLogger("PaddleOCRKit")
+
+class PaddleOCRKit:
+ _instance = None
+ _ocr = None
+
+ def __new__(cls):
+ if cls._instance is None:
+ cls._instance = super(PaddleOCRKit, cls).__new__(cls)
+ cls._instance._initialize_model()
+ return cls._instance
+
+ def _initialize_model(self):
+ """
+ Initialize the PaddleOCR model once.
+ Using PP-OCRv4 mobile model for speed.
+ """
+ try:
+ logger.info("Initializing PaddleOCR (PP-OCRv4 Mobile)...")
+ # use_angle_cls is deprecated, using use_textline_orientation instead
+ # ocr_version='PP-OCRv4' defaults to mobile model
+ self._ocr = PaddleOCR(
+ use_textline_orientation=True,
+ lang="ch",
+ ocr_version='PP-OCRv4'
+ )
+ logger.info("PaddleOCR initialized successfully.")
+ except Exception as e:
+ logger.error(f"Failed to initialize PaddleOCR: {e}")
+ self._ocr = None
+
+ def recognize(self, image_input):
+ """
+ Recognize text from an image and parse it into structured data.
+
+ :param image_input: Image path (str) or OpenCV image object (numpy.ndarray)
+ :return: Parsed structured data (dict) or None if failed
+ """
+ if self._ocr is None:
+ logger.error("PaddleOCR model is not initialized.")
+ return None
+
+ try:
+ # PaddleOCR handles both path and ndarray
+ # predict() is recommended over ocr() in newer versions, but ocr() is the stable high-level API
+ # We use ocr() as in the test script which worked well.
+ # cls=True was causing issues in test, but use_textline_orientation=True in init handles it?
+ # actually in test script: ocr = PaddleOCR(use_textline_orientation=True, ...)
+ # result = ocr.ocr(image_path) -> this worked, but gave a warning about predict.
+ # Let's stick to ocr() for now as it returns the structure we expect.
+
+ result = self._ocr.ocr(image_input)
+
+ ocr_text_lines = []
+
+ # Handle result structure
+ if not result:
+ logger.warning("OCR returned empty result.")
+ else:
+ res = result[0]
+ if res is None:
+ logger.warning("OCR result[0] is None.")
+ elif isinstance(res, dict) and 'rec_texts' in res:
+ # New PaddleOCR / Paddlex format
+ ocr_text_lines = res['rec_texts']
+ elif isinstance(res, list):
+ # Legacy PaddleOCR format
+ for line in res:
+ # line structure: [[points], (text, confidence)]
+ if len(line) >= 2 and isinstance(line[1], (tuple, list)):
+ ocr_text_lines.append(line[1][0])
+
+ # --- 关键:打印原始识别内容 ---
+ if ocr_text_lines:
+ logger.info(f"🔍 OCR 原始识别文字 ({len(ocr_text_lines)} 行):")
+ for i, line in enumerate(ocr_text_lines):
+ logger.info(f" [{i+1}] {line}")
+ else:
+ logger.info("No text detected.")
+ return {}
+
+ # Parse with Regex Parser
+ parsed_data = OcrParser.parse(ocr_text_lines)
+
+ # --- 关键:打印解析后的结构化数据 ---
+ if parsed_data:
+ logger.info("📦 OCR 解析结果 (JSON):")
+ logger.info(f" {parsed_data}")
+
+ return parsed_data
+
+ except Exception as e:
+ logger.error(f"Error during OCR recognition: {e}")
+ return None
+
+# Global instance for easy access
+_kit_instance = None
+
+def get_ocr_kit():
+ global _kit_instance
+ if _kit_instance is None:
+ _kit_instance = PaddleOCRKit()
+ return _kit_instance
diff --git a/Util/RedisKit.py b/Util/RedisKit.py
new file mode 100644
index 0000000..4c59505
--- /dev/null
+++ b/Util/RedisKit.py
@@ -0,0 +1,843 @@
+import asyncio
+import logging
+import uuid
+import json
+
+import redis
+from Config.Config import (
+ REDIS_HOST, REDIS_PORT, REDIS_DB, REDIS_PASSWORD,
+ REDIS_DECODE_RESPONSES, REDIS_MAX_CONNECTIONS
+)
+# 创建logger实例
+logger = logging.getLogger(__name__)
+
+class RedisKit:
+ """
+ 异步Redis工具类,提供所有Redis操作的异步实现
+ 单例模式确保全局只有一个Redis连接池
+ """
+ _instance = None
+ _lock = asyncio.Lock()
+ _redis_pool = None
+
+ def __new__(cls):
+ if cls._instance is None:
+ cls._instance = super().__new__(cls)
+ return cls._instance
+
+ @classmethod
+ async def _ensure_pool(cls):
+ """
+ 确保Redis连接池已创建
+ """
+ if cls._redis_pool is None:
+ async with cls._lock:
+ if cls._redis_pool is None:
+ try:
+ # 创建同步Redis连接池
+ sync_pool = redis.ConnectionPool(
+ host=REDIS_HOST,
+ port=REDIS_PORT,
+ db=REDIS_DB,
+ password=REDIS_PASSWORD,
+ decode_responses=REDIS_DECODE_RESPONSES,
+ max_connections=REDIS_MAX_CONNECTIONS
+ )
+ # 创建Redis连接实例
+ cls._redis_pool = redis.Redis(
+ connection_pool=sync_pool,
+ encoding='utf-8',
+ decode_responses=REDIS_DECODE_RESPONSES
+ )
+ # 测试连接
+ await asyncio.to_thread(cls._redis_pool.ping)
+ logger.info("Redis连接池创建成功")
+ except Exception as e:
+ logger.error(f"Redis连接池创建失败: {e}")
+ raise
+
+ @classmethod
+ async def get_connection(cls):
+ """
+ 获取Redis连接实例
+
+ Returns:
+ redis.Redis: Redis连接实例
+ """
+ await cls._ensure_pool()
+ return cls._redis_pool
+
+ async def get_data(self, key):
+ """
+ 异步从Redis中获取数据
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ any: Redis中存储的值,如果键不存在则返回None
+ """
+ try:
+ await self._ensure_pool()
+ return await asyncio.to_thread(RedisKit._redis_pool.get, key)
+ except Exception as e:
+ logger.error(f"从Redis获取数据失败(key={key}): {e}")
+ return None
+
+ async def exists(self, key):
+ """
+ 异步检查Redis键是否存在
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ bool: 键存在返回True,不存在或失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.exists, key)
+ return bool(result)
+ except Exception as e:
+ logger.error(f"检查Redis键是否存在失败(key={key}): {e}")
+ return False
+
+ async def set_data(self, key, value, expire=None):
+ """
+ 异步向Redis中写入数据
+
+ Args:
+ key (str): Redis键名
+ value (str): 要存储的值
+ expire (int, optional): 过期时间(秒),默认不过期
+
+ Returns:
+ bool: 写入成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ if expire:
+ result = await asyncio.to_thread(RedisKit._redis_pool.setex, key, expire, value)
+ else:
+ result = await asyncio.to_thread(RedisKit._redis_pool.set, key, value)
+ return result
+ except Exception as e:
+ logger.error(f"向Redis写入数据失败(key={key}): {e}")
+ return False
+
+ async def delete_data(self, key):
+ """
+ 异步从Redis中删除数据
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ bool: 删除成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.delete, key)
+ return result > 0 # delete返回删除的键数量,大于0表示删除成功
+ except Exception as e:
+ logger.error(f"从Redis删除数据失败(key={key}): {e}")
+ return False
+
+ async def keys(self, pattern='*'):
+ """
+ 异步获取匹配模式的所有键
+
+ Args:
+ pattern (str): 匹配模式
+
+ Returns:
+ list: 匹配的键列表
+ """
+ try:
+ await self._ensure_pool()
+ return await asyncio.to_thread(RedisKit._redis_pool.keys, pattern)
+ except Exception as e:
+ logger.error(f"获取Redis键列表失败(pattern={pattern}): {e}")
+ return []
+
+ async def delete(self, *names):
+ """
+ 异步删除一个或多个键
+
+ Args:
+ *names: 要删除的键名
+
+ Returns:
+ int: 删除的键数量
+ """
+ try:
+ await self._ensure_pool()
+ if not names:
+ return 0
+ return await asyncio.to_thread(RedisKit._redis_pool.delete, *names)
+ except Exception as e:
+ logger.error(f"删除Redis键失败: {e}")
+ return 0
+
+ async def publish(self, channel, message):
+ """
+ 异步发布消息到Redis频道
+
+ Args:
+ channel (str): Redis频道名称
+ message (str): 要发布的消息
+
+ Returns:
+ int: 接收消息的订阅者数量
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.publish, channel, message)
+ return result
+ except Exception as e:
+ logger.error(f"Redis发布消息失败(channel={channel}): {e}")
+ return 0
+
+ async def subscribe(self, channel):
+ """
+ 异步订阅Redis频道
+
+ Args:
+ channel (str): Redis频道名称
+
+ Returns:
+ redis.client.PubSub: PubSub对象,用于接收消息
+ """
+ try:
+ await self._ensure_pool()
+ pubsub = RedisKit._redis_pool.pubsub()
+ await asyncio.to_thread(pubsub.subscribe, channel)
+ return pubsub
+ except Exception as e:
+ logger.error(f"Redis订阅频道失败(channel={channel}): {e}")
+ return None
+
+ async def save_user_token(self, person_id, platform, token, expire=86400):
+ """
+ 异步保存用户的token到Redis
+
+ Args:
+ person_id (str): 用户ID
+ platform (str): 平台
+ token (str): 生成的token
+ expire (int): 过期时间(秒),默认24小时
+
+ Returns:
+ bool: 保存成功返回True,失败返回False
+ """
+ try:
+ # 使用固定格式的key:user_token:{person_id}:{platform}
+ key = f"user_token:{person_id}:{platform}"
+ return await self.set_data(key, token, expire)
+ except Exception as e:
+ logger.error(f"保存用户token失败(person_id={person_id}, platform={platform}): {e}")
+ return False
+
+ async def get_user_token(self, person_id, platform):
+ """
+ 异步获取用户在Redis中存储的token
+
+ Args:
+ person_id (str): 用户ID
+ platform (str): 平台
+
+ Returns:
+ str: 用户的token,如果不存在或过期则返回None
+ """
+ try:
+ key = f"user_token:{person_id}:{platform}"
+ return await self.get_data(key)
+ except Exception as e:
+ logger.error(f"获取用户token失败(person_id={person_id}, platform={platform}): {e}")
+ return None
+
+ async def validate_user_token(self, person_id, platform, token):
+ """
+ 异步验证用户的token是否与Redis中存储的一致
+
+ Args:
+ person_id (str): 用户ID
+ platform (str): 平台、终端
+ token (str): 待验证的token
+
+ Returns:
+ bool: token有效返回True,无效返回False
+ """
+ try:
+ stored_token = await self.get_user_token(person_id, platform)
+ # 如果没有存储的token,或者存储的token与当前token不一致,则token无效
+ return stored_token is not None and stored_token == token
+ except Exception as e:
+ logger.error(f"验证用户token失败(person_id={person_id}, platform={platform}): {e}")
+ return False
+
+ async def delete_user_token(self, person_id, platform=None):
+ """
+ 异步删除用户在Redis中存储的token
+
+ Args:
+ person_id (str): 用户ID
+ platform (str, optional): 平台,如果为None则删除所有平台的token
+
+ Returns:
+ bool: 删除成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ if platform:
+ # 删除特定平台的token
+ key = f"user_token:{person_id}:{platform}"
+ return await self.delete_data(key)
+ else:
+ # 删除所有平台的token(使用模式匹配)
+ pattern = f"user_token:{person_id}:*"
+ cursor = b'0'
+ deleted_count = 0
+
+ # 使用scan命令查找所有匹配的键
+ while cursor:
+ cursor, keys = await asyncio.to_thread(
+ RedisKit._redis_pool.scan,
+ cursor=cursor,
+ match=pattern,
+ count=100
+ )
+ if keys:
+ deleted = await asyncio.to_thread(
+ RedisKit._redis_pool.delete, *keys
+ )
+ deleted_count += deleted
+
+ return deleted_count > 0
+ except Exception as e:
+ logger.error(f"删除用户token失败(person_id={person_id}): {e}")
+ return False
+
+ async def list_push(self, key, value, expire=None):
+ """
+ 异步向Redis List中推入数据(LPUSH)
+
+ Args:
+ key (str): Redis键名
+ value (str): 要推入的值
+ expire (int, optional): 过期时间(秒),如果设置则同时为key设置过期时间
+
+ Returns:
+ int: 推入后list的长度,失败返回-1
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.lpush, key, value)
+
+ # 如果设置了过期时间,为key设置TTL
+ if expire and result > 0:
+ await asyncio.to_thread(RedisKit._redis_pool.expire, key, expire)
+
+ return result
+ except Exception as e:
+ logger.error(f"向Redis List推入数据失败(key={key}): {e}")
+ return -1
+
+ async def list_pop(self, key):
+ """
+ 异步从Redis List中弹出数据(RPOP)
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ str: 弹出的值,如果list为空或失败返回None
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.rpop, key)
+ return result
+ except Exception as e:
+ logger.error(f"从Redis List弹出数据失败(key={key}): {e}")
+ return None
+
+ async def list_length(self, key):
+ """
+ 异步获取Redis List的长度
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ int: list的长度,如果失败返回-1
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.llen, key)
+ return result
+ except Exception as e:
+ logger.error(f"获取Redis List长度失败(key={key}): {e}")
+ return -1
+
+ async def list_get_all(self, key):
+ """
+ 异步获取Redis List中的所有数据(LRANGE 0 -1)
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ list: list中的所有数据,如果失败返回空列表
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.lrange, key, 0, -1)
+ return result if result else []
+ except Exception as e:
+ logger.error(f"获取Redis List所有数据失败(key={key}): {e}")
+ return []
+
+ async def list_clear(self, key):
+ """
+ 异步清空Redis List(删除key)
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ bool: 清空成功返回True,失败返回False
+ """
+ try:
+ return await self.delete_data(key)
+ except Exception as e:
+ logger.error(f"清空Redis List失败(key={key}): {e}")
+ return False
+
+ async def set_is_member(self, key, value):
+ """
+ 异步检查值是否在Redis集合中
+
+ Args:
+ key (str): Redis键名
+ value: 要检查的值
+
+ Returns:
+ bool: 值在集合中返回True,不在或失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.sismember, key, value)
+ return bool(result)
+ except Exception as e:
+ logger.error(f"检查值是否在Redis集合中失败(key={key}): {e}")
+ return False
+
+ async def set_add(self, key, value):
+ """
+ 异步向Redis集合中添加值
+
+ Args:
+ key (str): Redis键名
+ value: 要添加的值
+
+ Returns:
+ bool: 添加成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.sadd, key, value)
+ return result > 0 # sadd返回添加的元素数量,大于0表示添加成功
+ except Exception as e:
+ logger.error(f"向Redis集合添加值失败(key={key}): {e}")
+ return False
+
+ async def set_remove(self, key, value):
+ """
+ 异步从Redis集合中移除值
+
+ Args:
+ key (str): Redis键名
+ value: 要移除的值
+
+ Returns:
+ bool: 移除成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.srem, key, value)
+ return result > 0 # srem返回移除的元素数量,大于0表示移除成功
+ except Exception as e:
+ logger.error(f"从Redis集合移除值失败(key={key}): {e}")
+ return False
+
+ async def set_cardinality(self, key):
+ """
+ 异步获取Redis集合的成员数量
+
+ Args:
+ key (str): Redis键名
+
+ Returns:
+ int: 集合的成员数量,如果失败返回0
+ """
+ try:
+ await self._ensure_pool()
+ result = await asyncio.to_thread(RedisKit._redis_pool.scard, key)
+ return result
+ except Exception as e:
+ logger.error(f"获取Redis集合成员数量失败(key={key}): {e}")
+ return 0
+
+ # 分布式锁相关方法
+ async def acquire_lock(self, lock_name, timeout=300):
+ """
+ 获取分布式锁
+
+ Args:
+ lock_name (str): 锁的名称
+ timeout (int): 锁的超时时间(秒),默认300秒
+
+ Returns:
+ str: 锁ID,如果获取失败返回None
+ """
+ try:
+ await self._ensure_pool()
+ # 生成唯一锁ID
+ lock_id = str(uuid.uuid4())
+ key = f"lock:{lock_name}"
+
+ # 使用Redis原子操作设置锁
+ result = await asyncio.to_thread(
+ RedisKit._redis_pool.setnx, key, lock_id
+ )
+
+ if result:
+ # 设置锁的过期时间
+ await asyncio.to_thread(
+ RedisKit._redis_pool.expire, key, timeout
+ )
+ logger.info(f"获取分布式锁成功: {lock_name}, lock_id: {lock_id}")
+ return lock_id
+ else:
+ logger.info(f"获取分布式锁失败: {lock_name} (锁已存在)")
+ return None
+ except Exception as e:
+ logger.error(f"获取分布式锁失败: {lock_name}, 错误: {e}")
+ return None
+
+ async def release_lock(self, lock_name, lock_id):
+ """
+ 释放分布式锁
+
+ Args:
+ lock_name (str): 锁的名称
+ lock_id (str): 锁ID
+
+ Returns:
+ bool: 是否成功释放锁
+ """
+ try:
+ await self._ensure_pool()
+ key = f"lock:{lock_name}"
+
+ # 使用Lua脚本原子性检查并释放锁
+ lua_script = """
+ if redis.call('get', KEYS[1]) == ARGV[1] then
+ return redis.call('del', KEYS[1])
+ else
+ return 0
+ end
+ """
+
+ result = await asyncio.to_thread(
+ RedisKit._redis_pool.eval, lua_script, 1, key, lock_id
+ )
+
+ if result == 1:
+ logger.info(f"释放分布式锁成功: {lock_name}, lock_id: {lock_id}")
+ return True
+ else:
+ logger.info(f"释放分布式锁失败: {lock_name}, lock_id: {lock_id} (锁不存在或已被其他进程持有)")
+ return False
+ except Exception as e:
+ logger.error(f"释放分布式锁失败: {lock_name}, 错误: {e}")
+ return False
+
+ async def renew_lock(self, lock_name, lock_id, timeout=300):
+ """
+ 续约分布式锁
+
+ Args:
+ lock_name (str): 锁的名称
+ lock_id (str): 锁ID
+ timeout (int): 续约时间(秒),默认300秒
+
+ Returns:
+ bool: 是否成功续约
+ """
+ try:
+ await self._ensure_pool()
+ key = f"lock:{lock_name}"
+
+ # 使用Lua脚本原子性检查并续约锁
+ lua_script = """
+ if redis.call('get', KEYS[1]) == ARGV[1] then
+ return redis.call('expire', KEYS[1], ARGV[2])
+ else
+ return 0
+ end
+ """
+
+ result = await asyncio.to_thread(
+ RedisKit._redis_pool.eval, lua_script, 1, key, lock_id, timeout
+ )
+
+ if result == 1:
+ logger.info(f"续约分布式锁成功: {lock_name}, lock_id: {lock_id}")
+ return True
+ else:
+ logger.info(f"续约分布式锁失败: {lock_name}, lock_id: {lock_id} (锁不存在或已被其他进程持有)")
+ return False
+ except Exception as e:
+ logger.error(f"续约分布式锁失败: {lock_name}, 错误: {e}")
+ return False
+
+
+
+
+
+ # 任务进度监控相关方法
+ async def set_task_progress(self, task_id, progress, status="processing", message=""):
+ """
+ 设置任务进度
+
+ Args:
+ task_id (str): 任务ID
+ progress (int): 进度百分比(0-100)
+ status (str): 任务状态(waiting, processing, completed, failed)
+ message (str): 任务消息
+
+ Returns:
+ bool: 设置成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ key = f"task:progress:{task_id}"
+
+ # 构造进度数据
+ progress_data = {
+ "task_id": task_id,
+ "progress": min(100, max(0, progress)), # 确保进度在0-100之间
+ "status": status,
+ "message": message,
+ "update_time": asyncio.get_event_loop().time()
+ }
+
+ # 序列化进度数据
+ progress_json = json.dumps(progress_data, ensure_ascii=False)
+
+ # 保存到Redis
+ await asyncio.to_thread(
+ RedisKit._redis_pool.set, key, progress_json
+ )
+
+ # 设置过期时间为24小时
+ await asyncio.to_thread(
+ RedisKit._redis_pool.expire, key, 86400
+ )
+
+ logger.info(f"设置任务进度成功: {task_id}, 进度: {progress}%, 状态: {status}")
+ return True
+ except Exception as e:
+ logger.error(f"设置任务进度失败: {task_id}, 错误: {e}")
+ return False
+
+ async def get_task_progress(self, task_id):
+ """
+ 获取任务进度
+
+ Args:
+ task_id (str): 任务ID
+
+ Returns:
+ dict: 任务进度数据,如果不存在返回None
+ """
+ try:
+ await self._ensure_pool()
+ key = f"task:progress:{task_id}"
+
+ # 从Redis获取进度数据
+ progress_json = await asyncio.to_thread(
+ RedisKit._redis_pool.get, key
+ )
+
+ if progress_json:
+ return json.loads(progress_json)
+ else:
+ return None
+ except Exception as e:
+ logger.error(f"获取任务进度失败: {task_id}, 错误: {e}")
+ return None
+
+ async def complete_task(self, task_id, success=True, message=""):
+ """
+ 完成任务
+
+ Args:
+ task_id (str): 任务ID
+ success (bool): 任务是否成功完成
+ message (str): 完成消息
+
+ Returns:
+ bool: 设置成功返回True,失败返回False
+ """
+ status = "completed" if success else "failed"
+ progress = 100 if success else 0
+ return await self.set_task_progress(task_id, progress, status, message)
+
+ async def delete_task_progress(self, task_id):
+ """
+ 删除任务进度记录
+
+ Args:
+ task_id (str): 任务ID
+
+ Returns:
+ bool: 删除成功返回True,失败返回False
+ """
+ try:
+ await self._ensure_pool()
+ key = f"task:progress:{task_id}"
+
+ # 从Redis删除进度记录
+ result = await asyncio.to_thread(
+ RedisKit._redis_pool.delete, key
+ )
+
+ logger.info(f"删除任务进度记录成功: {task_id}")
+ return result > 0
+ except Exception as e:
+ logger.error(f"删除任务进度记录失败: {task_id}, 错误: {e}")
+ return False
+
+ @classmethod
+ async def close(cls):
+ """
+ 关闭Redis连接池
+ """
+ if cls._redis_pool:
+ # 同步Redis连接池不需要等待关闭
+ cls._redis_pool.connection_pool.disconnect()
+ cls._redis_pool = None
+ logger.info("Redis连接池已关闭")
+
+
+# 创建全局实例
+redisKit = RedisKit()
+
+
+async def main():
+ """
+ 测试异步Redis操作的main函数
+ """
+ print("开始测试异步Redis工具类...")
+
+ try:
+ # 测试基本数据操作
+ print("\n=== 测试基本数据操作 ===")
+
+ # 测试设置和获取数据
+ test_key = "test_key"
+ test_value = "test_value_123"
+
+ result = await redisKit.set_data(test_key, test_value, expire=60)
+ print(f"设置数据结果: {result}")
+
+ get_value = await redisKit.get_data(test_key)
+ print(f"获取数据结果: {get_value}")
+
+ # 测试用户token操作
+ print("\n=== 测试用户token操作 ===")
+
+ # 保存用户token
+ person_id = "user123"
+ platform = "web"
+ token = "jwt_token_xyz789"
+
+ save_result = await redisKit.save_user_token(person_id, platform, token, expire=120)
+ print(f"保存token结果: {save_result}")
+
+ # 获取用户token
+ stored_token = await redisKit.get_user_token(person_id, platform)
+ print(f"获取token结果: {stored_token}")
+
+ # 验证token
+ validate_result = await redisKit.validate_user_token(person_id, platform, token)
+ print(f"验证token结果: {validate_result}")
+
+ # 验证错误的token
+ wrong_token = "wrong_token"
+ wrong_validate_result = await redisKit.validate_user_token(person_id, platform, wrong_token)
+ print(f"验证错误token结果: {wrong_validate_result}")
+
+ # 测试删除操作
+ print("\n=== 测试删除操作 ===")
+
+ # 删除测试数据
+ delete_result = await redisKit.delete_data(test_key)
+ print(f"删除数据结果: {delete_result}")
+
+ # 删除用户token
+ delete_token_result = await redisKit.delete_user_token(person_id, platform)
+ print(f"删除token结果: {delete_token_result}")
+
+ # 测试批量token删除功能
+ print("\n=== 测试批量token删除功能 ===")
+
+ # 保存多个平台的token
+ platforms = ["android", "ios", "web"]
+ for i, platform in enumerate(platforms):
+ await redisKit.save_user_token(f"user{i + 1}", platform, f"token{i + 1}", expire=300)
+ print(f"保存用户{i+1}的{platform}平台token")
+
+ # 删除特定用户的所有token
+ user_to_delete = "user2"
+ batch_delete_result = await redisKit.delete_user_token(user_to_delete)
+ print(f"批量删除{user_to_delete}的所有token结果: {batch_delete_result}")
+
+ # 验证删除结果
+ for platform in platforms:
+ token_check = await redisKit.get_user_token(user_to_delete, platform)
+ print(f"删除后{user_to_delete}-{platform}平台的token状态: {'已删除' if token_check is None else '存在'}")
+
+ print("\n=== 所有测试完成 ===")
+
+ except Exception as e:
+ print(f"测试过程中发生错误: {e}")
+ import traceback
+ traceback.print_exc()
+
+ finally:
+ # 清理测试数据并关闭连接池
+ print("\n清理测试数据并关闭连接池...")
+
+ # 清理测试用的数据
+ test_keys_to_cleanup = ["test_key"]
+ for key in test_keys_to_cleanup:
+ await redisKit.delete_data(key)
+
+ # 清理测试用户token
+ cleanup_users = ["user123", "user1", "user2", "user3"]
+ for user in cleanup_users:
+ try:
+ await redisKit.delete_user_token(user)
+ except:
+ pass # 忽略清理过程中的错误
+
+ # 关闭Redis连接池
+ await redisKit.close()
+ print("Redis连接池已关闭")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
diff --git a/Util/Win32Patch.py b/Util/Win32Patch.py
new file mode 100644
index 0000000..a3c4403
--- /dev/null
+++ b/Util/Win32Patch.py
@@ -0,0 +1,30 @@
+import asyncio
+import logging
+import sys
+from DbKit.Db import Db
+# 配置日志
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+def patch():
+ # 在Windows上使用SelectorEventLoopPolicy可以减少SSL错误
+ if sys.platform == 'win32':
+ asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
+
+ # 为Db类添加临时的异步上下文管理器支持
+ def patch_db_context_manager():
+ # 为Db类添加异步上下文管理器支持
+ if not hasattr(Db, '__aenter__'):
+ async def __aenter__(self):
+ return self
+
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
+ # 简单的清理,不做实际操作,避免事件循环问题
+ return False
+
+ # 动态添加方法
+ Db.__aenter__ = __aenter__
+ Db.__aexit__ = __aexit__
+
+ # 应用补丁
+ patch_db_context_manager()
\ No newline at end of file
diff --git a/Util/XinDianTuReadImageKit.py b/Util/XinDianTuReadImageKit.py
new file mode 100644
index 0000000..edbfcee
--- /dev/null
+++ b/Util/XinDianTuReadImageKit.py
@@ -0,0 +1,1290 @@
+import numpy as np
+from PIL import Image
+import os
+import asyncio
+import hashlib
+import json
+import aiohttp
+import logging
+import base64
+from openai import OpenAI, BadRequestError
+from Config.Config import (
+ ALY_LLM_API_KEY, VL_MODEL_NAME, VL_MODEL_NAME_AD,
+ SAFE_EXCLUDE_RATIO, FALLBACK_WIDTH, FALLBACK_HEIGHT,
+ BOTTOM_SAFE_EXCLUDE_RATIO
+)
+
+logger = logging.getLogger(__name__)
+
+class XinDianTuReadImageKit:
+ _client = OpenAI(
+ api_key=ALY_LLM_API_KEY,
+ base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
+ )
+
+ # 通用回退设备信息,仅在无法动态获取设备信息时使用
+ _FALLBACK_DEVICE_INFO = {
+ "displayWidth": FALLBACK_WIDTH,
+ "displayHeight": FALLBACK_HEIGHT,
+ "productName": "generic"
+ }
+
+ _prompt = (
+ "仅输出JSON数组(不含任何说明文字),按从左到右、从上到下的顺序识别图片中的充电站区域。识别规则如下:\n"
+ "1. 必须是卡片形式的充电站信息区域。\n"
+ "2. 每一个卡片必须同时具备以下所有要素,否则严禁识别:\n"
+ " - 场站名称 (station_name);\n"
+ " - 距离信息 (distance, 例如 '5.3km'),位于卡片右上角;\n"
+ " - 金额/电费 (price,例如 '0.8490');\n"
+ " - 充电枪信息 (piles,包含'超'、'快'或'慢'的类型、总枪数和空闲枪数,例如 '快 闲4/4')。\n"
+ "3. 如果缺少上述任何一项要素(例如只有名称和距离,但没有电费或枪数信息),说明它不是真正的场站卡片(可能是广告或功能入口),请直接跳过。\n"
+ "\n"
+ "JSON对象字段要求:\n"
+ "1. b_use: 状态标识(1或0)。如果场站名称为灰色或带有“暂停使用”等标签,则为0,否则为1。\n"
+ "2. station_name: 场站名称;\n"
+ "3. price: 一度电的价格(数字);\n"
+ "4. pro_price: Pro会员价格(数字),无则为null;\n"
+ "5. piles: 充电枪列表 [{type: '快', free: 4, total: 4}];\n"
+ "6. parking: 停车费用描述(通常在'P'图标后,例如 '收费停车:以场站实际收费规则为准' 或 '限时免费停车...')。\n"
+ "7. distance: 距离信息字符串(例如 '5.3km')。\n"
+ "8. bounds: {x1,y1,x2,y2} 区域像素坐标(0-1000);\n"
+ "9. bounds_norm: {left,top,right,bottom} 归一化坐标(0-1);\n"
+ "10. station_name_bounds: 场站名称文字区域坐标 {x1,y1,x2,y2}(0-1000);\n"
+ "11. station_name_bounds_norm: 场站名称文字归一化坐标(0-1)。\n"
+ "\n"
+ "重要约束(违反者不予识别):\n"
+ "A. 严禁识别广告位和筛选标签。如“夜间免停”、“洗手间”、“不限车长”、“不限车高”、“组团”、“综合排序”等均不是场站。\n"
+ "B. 真正的场站卡片必须是一个横跨屏幕的大卡片,包含:场站名称(大号加粗)、金额(¥开头)、距离(km结尾)、充电枪状态(闲x/x)。\n"
+ "C. 严禁将屏幕中间的筛选标签误认为场站卡片。\n"
+ "\n"
+ "严格返回纯JSON格式。"
+ )
+
+ @staticmethod
+ def _extract_json(text: str) -> str:
+ if not text:
+ return "[]"
+
+ cleaned = text.strip()
+ if "```" in cleaned:
+ lines = []
+ for line in cleaned.splitlines():
+ if line.strip().startswith("```"):
+ continue
+ lines.append(line)
+ cleaned = "\n".join(lines).strip()
+
+ decoder = json.JSONDecoder()
+
+ pos = 0
+ while pos < len(cleaned):
+ idx_dict = cleaned.find("{", pos)
+ idx_list = cleaned.find("[", pos)
+
+ candidates = [i for i in (idx_dict, idx_list) if i != -1]
+ if not candidates:
+ break
+
+ start = min(candidates)
+ snippet = cleaned[start:]
+ try:
+ _, end = decoder.raw_decode(snippet)
+ return snippet[:end]
+ except json.JSONDecodeError:
+ pos = start + 1
+ continue
+
+ return "[]"
+
+ @staticmethod
+ def _add_center(obj, device_info):
+ return XinDianTuReadImageKit._add_click_point(obj, device_info, anchor="center")
+
+ @staticmethod
+ def _add_click_point(obj, device_info, anchor: str = "center"):
+ # 获取显示宽高,增加容错
+ display_width = float(device_info.get("displayWidth") or device_info.get("width") or 1080)
+ display_height = float(device_info.get("displayHeight") or device_info.get("height") or 2400)
+
+ bounds = obj.get("bounds")
+ bn = obj.get("bounds_norm")
+ text_bounds = obj.get("station_name_bounds")
+ text_bn = obj.get("station_name_bounds_norm")
+ uia_x = None
+ uia_y = None
+
+ def get_pixel_coords(b_data, d_w, d_h):
+ if not b_data:
+ return None
+
+ # Extract values based on dict or list
+ if isinstance(b_data, list) and len(b_data) == 4:
+ v1, v2, v3, v4 = b_data
+ elif isinstance(b_data, dict):
+ # 兼容多种可能的键名
+ v1 = b_data.get("left") if b_data.get("left") is not None else b_data.get("x1")
+ v2 = b_data.get("top") if b_data.get("top") is not None else b_data.get("y1")
+ v3 = b_data.get("right") if b_data.get("right") is not None else b_data.get("x2")
+ v4 = b_data.get("bottom") if b_data.get("bottom") is not None else b_data.get("y2")
+
+ if any(v is None for v in (v1, v2, v3, v4)):
+ return None
+ else:
+ return None
+
+ try:
+ v1, v2, v3, v4 = float(v1), float(v2), float(v3), float(v4)
+ except (ValueError, TypeError):
+ return None
+
+ max_v = max(v1, v2, v3, v4)
+
+ # 1. 0-1 归一化坐标
+ if max_v <= 1.05:
+ x1, y1, x2, y2 = v1 * d_w, v2 * d_h, v3 * d_w, v4 * d_h
+ # 2. 0-1000 归一化坐标 (Qwen-VL 常用)
+ elif max_v <= 1005:
+ x1, y1, x2, y2 = (v1 / 1000.0) * d_w, (v2 / 1000.0) * d_h, (v3 / 1000.0) * d_w, (v4 / 1000.0) * d_h
+ # 3. 绝对像素坐标
+ else:
+ x1, y1, x2, y2 = v1, v2, v3, v4
+
+ return min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)
+
+ # 优先使用场站名称区域进行点击 (最安全)
+ coords = get_pixel_coords(text_bn, display_width, display_height) or get_pixel_coords(text_bounds, display_width, display_height)
+ if coords:
+ x1, y1, x2, y2 = coords
+ uia_x = int(x1 + (x2 - x1) / 2)
+ uia_y = int(y1 + (y2 - y1) / 2)
+ logger.info(f"坐标计算: 使用文字区域 -> ({uia_x}, {uia_y}) | 区域: {coords} | 屏幕: {display_width}x{display_height}")
+
+ # 备选:使用整个卡片区域
+ if uia_x is None:
+ coords = get_pixel_coords(bn, display_width, display_height) or get_pixel_coords(bounds, display_width, display_height)
+ if coords:
+ x1, y1, x2, y2 = coords
+ w, h = x2 - x1, y2 - y1
+ if anchor == "top_left":
+ uia_x = int(x1 + max(5.0, w * 0.15))
+ uia_y = int(y1 + max(5.0, h * 0.20))
+ else:
+ # 默认中心点,但稍微偏上一点,避开底部可能的按钮
+ uia_x = int(x1 + w / 2)
+ uia_y = int(y1 + h * 0.4)
+ logger.info(f"坐标计算: 使用卡片区域 -> ({uia_x}, {uia_y}) | 区域: {coords} | 屏幕: {display_width}x{display_height}")
+
+ # --- 安全过滤:过滤掉屏幕顶部的点击坐标 (通常是广告或菜单) ---
+ if uia_y is not None:
+ # 如果点击点在屏幕顶部 SAFE_EXCLUDE_RATIO 范围内,极大概率是误触广告位,将其排除
+ if uia_y < (display_height * SAFE_EXCLUDE_RATIO):
+ logger.warning(f"安全排除: 坐标 ({uia_x}, {uia_y}) 位于屏幕顶部 {int(SAFE_EXCLUDE_RATIO*100)}% 区域,疑似广告或菜单,已忽略。")
+ return None
+
+ # 如果点击点在屏幕底部 BOTTOM_SAFE_EXCLUDE_RATIO 范围内,极大概率是误触底部功能区(如扫码充电),将其排除
+ if uia_y > (display_height * (1 - BOTTOM_SAFE_EXCLUDE_RATIO)):
+ logger.warning(f"安全排除: 坐标 ({uia_x}, {uia_y}) 位于屏幕底部 {int(BOTTOM_SAFE_EXCLUDE_RATIO*100)}% 区域,疑似底部功能区,已忽略。")
+ return None
+
+ if uia_x is not None and uia_y is not None:
+ obj["uia_center_x"] = uia_x
+ obj["uia_center_y"] = uia_y
+
+ # Clean up temporary fields
+ for k in ["bounds", "bounds_norm", "station_name_bounds", "station_name_bounds_norm"]:
+ if k in obj:
+ del obj[k]
+ return obj
+
+ @staticmethod
+ async def find_all_time_button_coordinate(image_url: str, device_info: dict = None) -> dict:
+ if device_info is None:
+ logger.warning("未提供动态设备信息,使用通用回退配置。")
+ device_info = XinDianTuReadImageKit._FALLBACK_DEVICE_INFO
+
+ prompt = (
+ "仅输出JSON对象(不含任何说明文字),请找到图片中带有“全部时段”字样的按钮区域(通常在价格表下方,是一个带有右箭头的文字按钮)。\n"
+ "返回格式示例:\n"
+ "{\n"
+ ' "bounds": {"x1": 100, "y1": 200, "x2": 300, "y2": 400}, \n'
+ ' "bounds_norm": {"left": 0.1, "top": 0.2, "right": 0.3, "bottom": 0.4}\n'
+ "}\n"
+ "注意:bounds应使用0-1000的归一化坐标空间。\n"
+ "如果未找到,返回空JSON {}。"
+ )
+
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": {
+ "url": image_url
+ },
+ },
+ {"type": "text", "text": json.dumps(device_info, ensure_ascii=False)},
+ {"type": "text", "text": prompt},
+ ],
+ },
+ ],
+ )
+ )
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ try:
+ data = json.loads(raw)
+ if isinstance(data, dict) and (data.get("bounds") or data.get("bounds_norm")):
+ data = XinDianTuReadImageKit._add_center(data, device_info)
+ # 只返回中心坐标
+ return {
+ "uia_center_x": data.get("uia_center_x"),
+ "uia_center_y": data.get("uia_center_y")
+ }
+ return {}
+ except Exception as e:
+ logger.error(f"Error parsing JSON: {e}")
+ logger.error(f"Raw content: {raw}")
+ return {}
+
+ @staticmethod
+ async def find_station_coordinate_first_page(image_url: str, station_name: str, device_info: dict = None) -> dict:
+ if device_info is None:
+ logger.warning("未提供动态设备信息,使用通用回退配置。")
+ device_info = XinDianTuReadImageKit._FALLBACK_DEVICE_INFO
+
+ prompt = (
+ "仅输出JSON对象(不含任何说明文字)。"
+ "请在图片中找到场站名称完全匹配“" + str(station_name) + "”的那一行/卡片,"
+ "返回该场站名称文字本身的区域坐标(优先返回归一化坐标)。"
+ "返回格式示例:"
+ "{\"station_name_bounds\": {\"x1\": 100, \"y1\": 200, \"x2\": 300, \"y2\": 240}, "
+ "\"station_name_bounds_norm\": {\"left\": 0.1, \"top\": 0.2, \"right\": 0.3, \"bottom\": 0.24}}"
+ "注意:bounds使用0-1000归一化坐标空间;如果找不到,返回空JSON {}。"
+ )
+
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {"type": "image_url", "image_url": {"url": image_url}},
+ {"type": "text", "text": json.dumps(device_info, ensure_ascii=False)},
+ {"type": "text", "text": prompt},
+ ],
+ },
+ ],
+ )
+ )
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ try:
+ data = json.loads(raw)
+ if isinstance(data, dict) and (data.get("station_name_bounds") or data.get("station_name_bounds_norm") or data.get("bounds") or data.get("bounds_norm")):
+ data = XinDianTuReadImageKit._add_click_point(data, device_info, anchor="station_text")
+ return {
+ "uia_center_x": data.get("uia_center_x"),
+ "uia_center_y": data.get("uia_center_y")
+ }
+ return {}
+ except Exception:
+ return {}
+
+ @staticmethod
+ async def parse_first_level_image_url(image_url: str, device_info: dict = None) -> list:
+ if device_info is None:
+ logger.warning("未提供动态设备信息,使用通用回退配置。")
+ device_info = XinDianTuReadImageKit._FALLBACK_DEVICE_INFO
+
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": {
+ "url": image_url
+ },
+ },
+ {"type": "text", "text": json.dumps(device_info, ensure_ascii=False)},
+ {"type": "text", "text": XinDianTuReadImageKit._prompt},
+ ],
+ },
+ ],
+ )
+ )
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ try:
+ data = json.loads(raw)
+ if isinstance(data, list):
+ # 过滤掉 None (即被 _add_click_point 排除掉的顶部项)
+ data = [XinDianTuReadImageKit._add_click_point(x, device_info, anchor="station_text") for x in data if x.get("b_use", 1) == 1]
+ data = [x for x in data if x is not None]
+ elif isinstance(data, dict):
+ if data.get("b_use", 1) == 1:
+ data = XinDianTuReadImageKit._add_click_point(data, device_info, anchor="station_text")
+ data = [data] if data is not None else []
+ else:
+ data = []
+
+ # Clean up temporary field b_use if it still exists
+ if isinstance(data, list):
+ for item in data:
+ if "b_use" in item:
+ del item["b_use"]
+ elif isinstance(data, dict) and "b_use" in data:
+ del data["b_use"]
+
+ # If dict result, wrap in list for consistency if needed, but keeping as is based on original logic logic implies list return
+ if isinstance(data, dict):
+ return [data] if data else []
+
+ if isinstance(data, list) and data:
+ # 移除旧的关键词过滤逻辑,完全信任视觉模型的识别结果
+ # 如果未来发现模型识别了太多广告,可以在 Prompt 中强化 "严禁识别广告" 的约束
+ filtered = []
+ for item in data:
+ if not isinstance(item, dict):
+ continue
+ name = item.get("station_name")
+ if not name:
+ continue
+ filtered.append(item)
+ data = filtered
+
+ if isinstance(data, list) and data:
+ tasks = []
+ idxs = []
+ for i, item in enumerate(data):
+ if not isinstance(item, dict):
+ continue
+ if item.get("uia_center_x") is None or item.get("uia_center_y") is None:
+ name = item.get("station_name")
+ if name:
+ idxs.append(i)
+ tasks.append(asyncio.create_task(
+ XinDianTuReadImageKit.find_station_coordinate_first_page(image_url, name, device_info)
+ ))
+ if tasks:
+ results = await asyncio.gather(*tasks, return_exceptions=True)
+ for i, r in zip(idxs, results):
+ if isinstance(r, dict) and r.get("uia_center_x") is not None and r.get("uia_center_y") is not None:
+ data[i]["uia_center_x"] = r.get("uia_center_x")
+ data[i]["uia_center_y"] = r.get("uia_center_y")
+
+ for item in data:
+ if isinstance(item, dict):
+ item["uia_center_x"] = 100
+ item.setdefault("uia_center_y", None)
+
+ return data
+ except Exception as e:
+ logger.error(f"Error parsing JSON: {e}")
+ logger.error(f"Raw content: {raw}")
+ return []
+
+ @staticmethod
+ async def parse_hybrid_image(image_path, uploader, cdn_domain):
+ """
+ 统一入口:混合识别模式
+ """
+ return await XinDianTuReadImageKit.get_stations_hybrid(image_path, uploader, cdn_domain)
+
+ @staticmethod
+ async def parse_vl_image(vl_image_url, json_metadata, device_info=None):
+ """
+ 基于 _vl.jpg (带绿框) 和 JSON 元数据进行识别
+ """
+ if not json_metadata or "cards" not in json_metadata:
+ return []
+
+ cards_meta = json_metadata["cards"]
+ # 按 id 或 Y 坐标排序,确保顺序一致 (Kit 生成时已经是 top-down)
+ cards_meta.sort(key=lambda x: x["rect"][1])
+
+ prompt = (
+ "图片中用绿色矩形框标记了若干个充电站卡片区域。\n"
+ "请按从上到下的顺序,依次识别每个绿色框内的场站信息,并返回一个JSON数组。\n"
+ "数组中元素的顺序必须与图片中绿色框从上到下的顺序严格一致。\n"
+ "如果某个框内不是有效的场站卡片(例如是广告),请返回null或空对象,不要跳过顺序。\n"
+ "\n"
+ "每个JSON对象包含以下字段:\n"
+ "1. station_name: 场站名称;\n"
+ "2. price: 价格(数字);\n"
+ "3. pro_price: Pro会员价(数字,无则null);\n"
+ "4. piles: 充电枪描述字符串(例如 '快 闲4/4');\n"
+ "5. tags: 标签列表(如 ['限时免费']);\n"
+ "6. parking: 停车费用描述(通常在'P'图标后,例如 '收费停车:以场站实际收费规则为准' 或 '限时免费停车...')。\n"
+ "7. distance: 距离信息字符串(例如 '5.3km')。\n"
+ "\n"
+ "严格返回纯JSON格式。"
+ )
+
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {"type": "image_url", "image_url": {"url": vl_image_url}},
+ {"type": "text", "text": prompt},
+ ],
+ },
+ ],
+ )
+ )
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ final_stations = []
+ try:
+ llm_data = json.loads(raw)
+ if isinstance(llm_data, list):
+ # 尝试与 cards_meta 对齐
+ count = min(len(llm_data), len(cards_meta))
+ for i in range(count):
+ item = llm_data[i]
+ meta = cards_meta[i]
+
+ if not item or not isinstance(item, dict):
+ continue
+
+ name = item.get("station_name")
+ if not name:
+ continue
+
+ # 注入元数据中的点击坐标
+ click_pt = meta.get("click_point", [0, 0])
+ cx, cy = click_pt
+
+ # 安全检查
+ img_h = 2400
+ if device_info:
+ img_h = float(device_info.get("displayHeight") or device_info.get("height") or 2400)
+ else:
+ img_h = json_metadata.get("height", 2400)
+
+ # 顶部安全排除
+ if cy < (img_h * SAFE_EXCLUDE_RATIO):
+ logger.warning(f"VL安全排除: 坐标 ({cx}, {cy}) 位于屏幕顶部 {int(SAFE_EXCLUDE_RATIO*100)}% 区域,已忽略。")
+ continue
+
+ # 底部安全排除
+ if cy > (img_h * (1 - BOTTOM_SAFE_EXCLUDE_RATIO)):
+ logger.warning(f"VL安全排除: 坐标 ({cx}, {cy}) 位于屏幕底部 {int(BOTTOM_SAFE_EXCLUDE_RATIO*100)}% 区域,疑似底部功能区,已忽略。")
+ continue
+
+ item["uia_center_x"] = cx
+ item["uia_center_y"] = cy
+ item["rect"] = meta.get("rect")
+
+ final_stations.append(item)
+ else:
+ logger.warning(f"LLM return format error: expected list, got {type(llm_data)}")
+
+ except Exception as e:
+ logger.error(f"Error parsing VL response: {e}")
+
+ return final_stations
+
+ @staticmethod
+ async def get_stations_hybrid(image_path, uploader, cdn_domain):
+ """
+ 混合识别模式:图形学切片 + 大模型小图 OCR
+ """
+ # 1. 图形学切片
+ segments = XinDianTuReadImageKit.get_card_segments(image_path)
+ if not segments:
+ return []
+
+ # 2. 对每个切片并行进行 OCR
+ tasks = []
+ for seg in segments:
+ # 上传切片
+ patch_path = seg["patch_path"]
+ remote_path = f"tmp/patches/{os.path.basename(patch_path)}"
+ uploader.upload_file(patch_path, remote_path)
+ patch_url = f"{cdn_domain}/{remote_path}"
+
+ # 记录上传后的 URL 供识别使用
+ seg["patch_url"] = patch_url
+ tasks.append(XinDianTuReadImageKit.recognize_card_text(patch_url))
+
+ # 等待所有 OCR 完成
+ results = await asyncio.gather(*tasks)
+
+ # 3. 组装结果
+ final_stations = []
+ for i, res in enumerate(results):
+ name = res.get("station_name")
+ if name and name != "未知":
+ seg = segments[i]
+ res["x"] = seg["center_x"]
+ res["y"] = seg["center_y"]
+ final_stations.append(res)
+
+ # 4. 后置过滤 (复用原有过滤逻辑)
+ if final_stations:
+ processed_excluded_titles = {str(x).replace(" ", "").strip() for x in STATION_EXCLUDED_TITLES}
+ filtered = []
+ for item in final_stations:
+ name = item.get("station_name")
+ normalized_name = str(name).replace(" ", "").strip()
+ if normalized_name in processed_excluded_titles:
+ continue
+ if any(kw in normalized_name for kw in STATION_BLACKLIST_KEYWORDS):
+ continue
+ filtered.append(item)
+ final_stations = filtered
+
+ return final_stations
+
+ @staticmethod
+ @staticmethod
+ def get_card_segments(image_path, output_dir="./Debug/Patches"):
+ """
+ 基于水平灰色分割带 (Divider Band) 切取场站卡片
+ 返回: list of dict {"patch_path": str, "center_x": int, "center_y": int, "y_range": tuple}
+ """
+ if not os.path.exists(output_dir):
+ os.makedirs(output_dir)
+
+ try:
+ img = Image.open(image_path).convert('RGB')
+ width, height = img.size
+ img_data = np.array(img)
+
+ logger.info(f"页面分析 - 分辨率: {width}x{height}")
+
+ # 1. 行特征分析:识别分割线 (Divider)
+ # 分割线特征:横贯全屏,亮度均匀,通常比纯白(255)稍暗,比文字内容亮
+ # 典型值:Mean=242-247, Std<10
+
+ row_types = [] # 0: Unknown/Content, 1: Divider, 2: White/Empty
+
+ # 采样点:左中右
+ l_x, m_x, r_x = int(width * 0.05), int(width * 0.5), int(width * 0.95)
+
+ debug_rows = []
+
+ for y in range(height):
+ # 避开顶部和底部导航栏 (15% - 85%) - 扩大排除范围以避免误识别 Header/Footer
+ if y < height * 0.15 or y > height * 0.85:
+ row_types.append(1) # 视为无关区域 (标记为 Divider 以防止形成 Segment)
+ continue
+
+ row = img_data[y]
+ row_mean = np.mean(row)
+ row_std = np.std(row)
+
+ # 判定逻辑:
+ # 1. 纯白行 (卡片底色) -> mean > 252 (允许微小噪点)
+ # 2. 分割线 (Divider) -> 230 < mean < 252 且 std < 15 (颜色均匀)
+ # 3. 内容行 (Content) -> mean <= 230 或 (mean > 230 且 std >= 15) (有文字/图片导致方差大)
+
+ if row_mean > 252:
+ r_type = 2 # White/Empty
+ elif 230 < row_mean <= 252 and row_std < 15:
+ r_type = 1 # Divider
+ else:
+ r_type = 0 # Content
+
+ row_types.append(r_type)
+
+ # Debug log sampling
+ if y % 50 == 0:
+ debug_rows.append(f"Row {y}: Mean={row_mean:.1f}, Std={row_std:.1f} -> Type={r_type}")
+
+ if debug_rows:
+ logger.info("行特征采样 (调试用):\n" + "\n".join(debug_rows))
+
+ # 2. 聚合连续的 Content 区域 (Type 0 or Type 2 sandwiched by Type 0)
+ # 实际上,卡片是由 Divider 分隔开的区域。
+ # 我们寻找两个 Divider 之间的区域,且该区域必须包含 Content (Type 0)。
+
+ segments = []
+
+ # 简化状态机:
+ # 寻找非 Divider 的连续段
+ in_segment = False
+ seg_start = -1
+ has_content = False
+
+ raw_blocks = []
+
+ for y, r_type in enumerate(row_types):
+ if r_type != 1: # Not Divider
+ if not in_segment:
+ in_segment = True
+ seg_start = y
+ has_content = False
+
+ if r_type == 0:
+ has_content = True
+ else: # Is Divider
+ if in_segment:
+ # 结束一段
+ if has_content: # 只有包含内容的段才算
+ raw_blocks.append((seg_start, y))
+ in_segment = False
+
+ # 处理最后一段
+ if in_segment and has_content:
+ raw_blocks.append((seg_start, len(row_types)))
+
+ # 3. 过滤和后处理
+ # 合并距离很近的块?或者过滤太小的块
+ base_name = os.path.splitext(os.path.basename(image_path))[0]
+
+ valid_segments = []
+ logger.info(f"Initial raw blocks count: {len(raw_blocks)}")
+
+ for i, (y1, y2) in enumerate(raw_blocks):
+ h = y2 - y1
+ # 过滤太小的块 (可能是杂噪或单纯的文字行)
+ if h < 50:
+ # logger.debug(f"Block {i} too small: {h}")
+ continue
+ # 过滤太大的块 (可能是全屏错误)
+ if h > 1000:
+ continue
+
+ # 再次确认内部是否有足够的“暗像素”(内容)
+ # 避免切出纯白的空隙
+ region = img_data[y1:y2]
+ region_mean = np.mean(region)
+ if region_mean > 254.5: # 整体太白 (放宽阈值,避免误杀大面积白色的卡片)
+ logger.info(f" [-] 忽略区域 {i}: Y({y1}-{y2}), H={h}, 整体太白 (Mean={region_mean:.1f} > 254.5)")
+ continue
+
+ # --- 优化:边缘背景检查与宽度裁剪 (Margin Check & Crop) ---
+ # 不再直接拒绝白边,而是尝试计算内容的有效宽度
+ # 假设:有效内容行的方差较高,或者亮度显著不同于背景
+
+ # 简单策略:保留全宽,但增加高度限制
+ if h < 60: # 稍微降低阈值以测试
+ logger.info(f" [-] 忽略区域 {i}: Y({y1}-{y2}), H={h}, 高度不足 (<60)")
+ continue
+
+ # 计算左右边距的平均亮度,辅助判断(仅记录日志,不强行过滤)
+ margin_w = max(5, int(width * 0.05))
+ l_margin = img_data[y1:y2, 0:margin_w]
+ r_margin = img_data[y1:y2, width-margin_w:width]
+ l_mean = np.mean(l_margin)
+ r_mean = np.mean(r_margin)
+
+ # 如果是全宽卡片,左右边缘可能是白色的。
+ # 之前的逻辑: if l_mean > 252 or r_mean > 252: continue (导致漏检)
+ # 现在移除该逻辑。
+
+ # --- 新增:自动裁剪水平宽度 (Auto Horizontal Crop) ---
+ # 尝试找到内容的左右边界 (基于列的方差或亮度差异)
+ x1, x2 = 0, width
+
+ # 从左向右扫描
+ for x in range(0, int(width * 0.4), 2):
+ col = img_data[y1:y2, x]
+ # 如果这一列不是纯色背景 (std > 5) 或者明显比背景暗 (mean < 245)
+ if np.std(col) > 5 or np.mean(col) < 245:
+ x1 = x
+ break
+
+ # 从右向左扫描
+ for x in range(width - 1, int(width * 0.6), -2):
+ col = img_data[y1:y2, x]
+ if np.std(col) > 5 or np.mean(col) < 245:
+ x2 = x + 1
+ break
+
+ # 增加一点 padding
+ x1 = max(0, x1 - 10)
+ x2 = min(width, x2 + 10)
+
+ # 如果裁剪后宽度太小,可能不是有效卡片
+ if (x2 - x1) < width * 0.5:
+ logger.info(f" [-] 忽略区域 {i}: 裁剪后宽度过小 ({x2-x1})")
+ continue
+
+ # 保存
+ patch = img.crop((x1, y1, x2, y2))
+ patch_name = f"{base_name}_p{i}_{y1}.jpg"
+ patch_path = os.path.join(output_dir, patch_name)
+ patch.save(patch_path)
+
+ center_y = (y1 + y2) // 2
+ valid_segments.append({
+ "patch_path": os.path.abspath(patch_path),
+ "center_x": (x1 + x2) // 2,
+ "center_y": center_y,
+ "y_range": (y1, y2)
+ })
+ logger.info(f" [+] 发现卡片 {i}: Y({y1}-{y2}), H={h}, Crop X({x1}-{x2}), 边缘(L={l_mean:.1f}, R={r_mean:.1f}), 已保存")
+
+ logger.info(f"分析完成:识别到 {len(valid_segments)} 个区域")
+ return valid_segments
+
+ except Exception as e:
+ logger.error(f"图形学切片失败: {e}", exc_info=True)
+ return []
+
+ @staticmethod
+ async def recognize_card_text(patch_url):
+ """
+ 对切片进行小图 OCR 识别,提取场站详细信息
+ """
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "text",
+ "text": "请识别图片中的充电站信息,并以 JSON 格式输出:{\"station_name\": \"...\", \"price\": \"...\", \"piles\": \"空闲数/总数\"}。只输出 JSON,不要有其他文字。"
+ },
+ {"type": "image_url", "image_url": {"url": patch_url}}
+ ]
+ }
+ ],
+ max_tokens=200
+ )
+ )
+ content = resp.choices[0].message.content.strip()
+ # 尝试解析 JSON
+ try:
+ import json
+ import re
+ json_match = re.search(r'\{.*\}', content, re.DOTALL)
+ if json_match:
+ return json.loads(json_match.group())
+ except Exception:
+ logger.warning(f"OCR 结果解析 JSON 失败: {content}")
+
+ return {"station_name": "未知"}
+
+ @staticmethod
+ async def detect_ad(image_url: str, device_info: dict = None) -> dict:
+ """
+ 检测图片中是否存在广告弹窗,并定位关闭按钮坐标
+
+ 参数:
+ image_url: 图片地址
+ device_info: 设备信息
+
+ 返回:
+ {
+ "has_ad": bool,
+ "uia_center_x": int|None,
+ "uia_center_y": int|None
+ }
+ """
+ if device_info is None:
+ logger.warning("未提供动态设备信息,使用通用回退配置。")
+ device_info = XinDianTuReadImageKit._FALLBACK_DEVICE_INFO
+
+ prompt = (
+ "分析图片中是否存在覆盖在主界面上的广告弹窗(Popup Ad)。"
+ "如果存在,请找到关闭该弹窗的按钮(通常是一个带有 'X' 的图标,可能在弹窗的右上角、右下角或正下方)。"
+ "仅输出JSON对象(不含任何说明文字),包含以下字段:"
+ "1. has_ad: 布尔值,是否存在广告弹窗;"
+ "2. close_button_bounds: 关闭按钮的像素坐标或归一化坐标(0-1000) {x1,y1,x2,y2}。如果不存在广告则为 null。"
+ "注意:只需识别最明显的那个关闭按钮。严格返回纯JSON。"
+ )
+
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME_AD, # 使用更强的视觉模型
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": {"url": image_url},
+ },
+ {"type": "text", "text": json.dumps(device_info, ensure_ascii=False)},
+ {"type": "text", "text": prompt},
+ ],
+ },
+ ],
+ )
+ )
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ try:
+ data = json.loads(raw)
+ has_ad = data.get("has_ad", False)
+ if has_ad and data.get("close_button_bounds"):
+ # 使用现有的辅助方法转换坐标
+ temp_obj = {"bounds": data.get("close_button_bounds")}
+ XinDianTuReadImageKit._add_click_point(temp_obj, device_info)
+ return {
+ "has_ad": True,
+ "uia_center_x": temp_obj.get("uia_center_x"),
+ "uia_center_y": temp_obj.get("uia_center_y")
+ }
+ return {"has_ad": False, "uia_center_x": None, "uia_center_y": None}
+ except Exception as e:
+ logger.error(f"Error parsing ad detection JSON: {e}")
+ return {"has_ad": False, "uia_center_x": None, "uia_center_y": None}
+
+ @staticmethod
+ async def _download_as_base64(url: str) -> str:
+ """Helper to download image and convert to base64 for VL model fallback"""
+ try:
+ async with aiohttp.ClientSession() as session:
+ async with session.get(url) as resp:
+ if resp.status != 200:
+ return None
+ content = await resp.read()
+ if not content:
+ return None
+ return base64.b64encode(content).decode('utf-8')
+ except Exception as e:
+ logger.error(f"Failed to download image for base64 conversion: {e}")
+ return None
+
+ @staticmethod
+ async def parse_price_schedule(station_name: str, image_url: str, device_info: dict = None) -> list:
+ """
+ 解析价格时段表(整图),提取每一行的时间区间与费用信息
+
+ 参数:
+ image_url: 图片地址(包含“当前时段电费/全部时段电费”弹窗或列表)
+ device_info: 设备信息,用于提升视觉理解一致性(可选)
+
+ 返回:
+ 列表,每个元素为:
+ {
+ "start": "HH:MM", 开始时间
+ "end": "HH:MM", 结束时间
+ "price_kwh": float|None, 总价或站点价(元/度)
+ "electric_fee_kwh": float|None, 电费(元/度)
+ "service_fee_kwh": float|None 服务费(元/度)
+ }
+ 说明:
+ - 使用 qwen3-vl-flash 进行视觉解析,提示词约束输出为纯 JSON 数组
+ - 若某项缺失则返回 None(保持结构统一)
+ """
+ if device_info is None:
+ logger.warning("未提供动态设备信息,使用通用回退配置。")
+ device_info = XinDianTuReadImageKit._FALLBACK_DEVICE_INFO
+
+ # 视觉解析提示词:约束输出字段与格式,避免模型输出说明文字
+ prompt = (
+ "仅输出JSON数组(不含任何说明文字)。识别图片中所有时段的价格信息,返回每一行:"
+ "1) start: 开始时间(HH:MM),2) end: 结束时间(HH:MM),"
+ "3) price_kwh: 价格(元/度,站点价或总价),"
+ "4) electric_fee_kwh: 电费(元/度),"
+ "5) service_fee_kwh: 服务费(元/度)。"
+ "所有数值以数字返回,例如 1.1800。若缺失某项则填 null。严格返回纯JSON数组。"
+ "注意:如果某行价格信息为空或表示同上,请尝试复用上一行的价格信息。"
+ )
+
+ loop = asyncio.get_event_loop()
+
+ def _do_request(url_val):
+ return XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": {"url": url_val},
+ },
+ {"type": "text", "text": json.dumps(device_info, ensure_ascii=False)},
+ {"type": "text", "text": prompt},
+ ],
+ },
+ ],
+ )
+
+ try:
+ # 在线程池中同步调用 OpenAI 兼容接口,避免阻塞事件循环
+ resp = await loop.run_in_executor(None, lambda: _do_request(image_url))
+ except BadRequestError as e:
+ # 尝试捕获 DataInspection 错误并进行 Base64 回退
+ err_code = getattr(e, 'code', '') or ''
+ if not err_code and hasattr(e, 'body') and isinstance(e.body, dict):
+ err_code = e.body.get('code', '')
+
+ # 如果是媒体格式或数据检查错误
+ if 'InvalidParameter.DataInspection' in str(err_code) or 'media format' in str(e).lower():
+ logger.warning(f"Image URL rejected ({err_code}). Attempting Base64 fallback: {image_url}")
+ base64_str = await XinDianTuReadImageKit._download_as_base64(image_url)
+ if base64_str:
+ # 简单推断格式,默认 jpeg
+ ext = "jpeg"
+ lower_url = image_url.lower()
+ if ".png" in lower_url:
+ ext = "png"
+ elif ".webp" in lower_url:
+ ext = "webp"
+ elif ".jpg" in lower_url or ".jpeg" in lower_url:
+ ext = "jpeg"
+
+ data_uri = f"data:image/{ext};base64,{base64_str}"
+ resp = await loop.run_in_executor(None, lambda: _do_request(data_uri))
+ else:
+ logger.error("Base64 download failed during fallback.")
+ return []
+ else:
+ logger.error(f"API BadRequestError: {e}")
+ return []
+ except Exception as e:
+ logger.error(f"API Unexpected Error: {e}")
+ return []
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ try:
+ # 反序列化模型返回的 JSON
+ rows = json.loads(raw)
+ if not isinstance(rows, list):
+ return []
+ norm = []
+ for r in rows:
+ if not isinstance(r, dict):
+ continue
+ # 兼容不同来源字段命名,统一为目标键
+ start = r.get("start")
+ end = r.get("end")
+ price = r.get("price_kwh")
+ elec = r.get("electric_fee_kwh")
+ serv = r.get("service_fee_kwh")
+ # station_name = station_name
+ # 将字符串数字安全转换为 float;缺失则为 None
+ norm.append({
+ "station_name": station_name,
+ "start": start,
+ "end": end,
+ "price_kwh": float(price) if isinstance(price, (int, float, str)) and str(price) else None,
+ "electric_fee_kwh": float(elec) if isinstance(elec, (int, float, str)) and str(elec) else None,
+ "service_fee_kwh": float(serv) if isinstance(serv, (int, float, str)) and str(serv) else None,
+ })
+
+ for i in range(1, len(norm)):
+ curr = norm[i]
+ prev = norm[i - 1]
+ for k in ("price_kwh", "electric_fee_kwh", "service_fee_kwh"):
+ if curr.get(k) is None and prev.get(k) is not None:
+ curr[k] = prev[k]
+
+ return norm
+ except Exception as e:
+ logger.error(f"Error parsing JSON: {e}")
+ logger.error(f"Raw content: {raw}")
+ return []
+
+ @staticmethod
+ def _to_minutes(t: str) -> int:
+ """
+ 将 "HH:MM" 转为分钟数(0-1440)
+ 说明:
+ - 特殊处理 "24:00" -> 1440,方便区间闭合处理
+ - 非法格式返回 0
+ """
+ if not t:
+ return 0
+ try:
+ h, m = t.split(":")
+ h = int(h)
+ m = int(m)
+ if h == 24 and m == 0:
+ return 24 * 60
+ return h * 60 + m
+ except Exception:
+ return 0
+
+ @staticmethod
+ def _fmt(t: int) -> str:
+ """
+ 将分钟数格式化为 "HH:MM"
+ """
+ h = t // 60
+ m = t % 60
+ return f"{h:02d}:{m:02d}"
+
+ @staticmethod
+ def expand_schedule_to_hourly(rows: list) -> list:
+ """
+ 将时段列表按小时边界拆分
+
+ 参数:
+ rows: parse_price_schedule 返回的时段列表
+
+ 返回:
+ 每小时一条数据的列表,区间为闭开 [start, end) 的连续小时段
+ 说明:
+ - 例如 05:00-08:00 -> 05:00-06:00, 06:00-07:00, 07:00-08:00
+ - 保留每小时的价格、电费、服务费不变
+ """
+ hourly = []
+ for r in rows:
+ # 起止时间转分钟
+ s = XinDianTuReadImageKit._to_minutes(r.get("start"))
+ e = XinDianTuReadImageKit._to_minutes(r.get("end"))
+ if e <= s:
+ continue
+ cur = s
+ while cur < e:
+ # 下一小时边界;不超过区间终点
+ nxt = min(e, ((cur // 60) + 1) * 60)
+ hourly.append({
+ "start": XinDianTuReadImageKit._fmt(cur),
+ "end": XinDianTuReadImageKit._fmt(nxt),
+ "price_kwh": r.get("price_kwh"),
+ "electric_fee_kwh": r.get("electric_fee_kwh"),
+ "service_fee_kwh": r.get("service_fee_kwh"),
+ })
+ cur = nxt
+ return hourly
+
+ @staticmethod
+ async def _fetch_md5(url: str) -> str:
+ """
+ 下载图片并计算 MD5(用于内容去重)
+
+ 返回:
+ 32位十六进制 MD5 字符串;失败返回空字符串
+ """
+ try:
+ async with aiohttp.ClientSession() as session:
+ async with session.get(url) as resp:
+ if resp.status != 200:
+ return ""
+ content = await resp.read()
+ return hashlib.md5(content).hexdigest()
+ except Exception:
+ return ""
+
+ @staticmethod
+ async def parse_address(station_name: str, image_url: str, device_info: dict = None) -> dict:
+ """
+ 解析图片中的充电站地址信息,同时识别“全部时段”按钮坐标
+
+ 参数:
+ station_name:场站名称
+ image_url: 图片地址
+ device_info: 设备信息(可选)
+
+ 返回:
+ 字典,包含 address 字段以及 uia_center_x/uia_center_y (如果找到按钮)
+ """
+ if device_info is None:
+ logger.warning("未提供动态设备信息,使用通用回退配置。")
+ device_info = XinDianTuReadImageKit._FALLBACK_DEVICE_INFO
+
+ # 启动寻找“全部时段”按钮的任务,为后续可能的点击做准备
+ button_task = asyncio.create_task(XinDianTuReadImageKit.find_all_time_button_coordinate(image_url, device_info))
+
+ prompt = (
+ "仅输出JSON对象(不含任何说明文字)。"
+ "任务1:识别图片中充电站的完整名称(full_station_name)。"
+ f"提示:列表中看到的名称可能是截断的(例如“{station_name}”),请在图片上方找到最匹配的完整名称。"
+ "任务2:识别充电站的详细地址(address)。"
+ "寻找规则:地址通常紧跟在场站名称下方,或者在‘距离’图标(定位小图表)附近,或者在带有‘导航’按钮的同一行。"
+ "返回包含 full_station_name 和 address 字段的JSON对象,例如 {\"full_station_name\": \"完整名称\", \"address\": \"详细地址\"}。"
+ "如果找不到,对应字段返回空字符串。"
+ "严格返回纯JSON格式。"
+ )
+
+ loop = asyncio.get_event_loop()
+ resp = await loop.run_in_executor(
+ None,
+ lambda: XinDianTuReadImageKit._client.chat.completions.create(
+ model=VL_MODEL_NAME,
+ messages=[
+ {
+ "role": "user",
+ "content": [
+ {
+ "type": "image_url",
+ "image_url": {"url": image_url},
+ },
+ {"type": "text", "text": json.dumps(device_info, ensure_ascii=False)},
+ {"type": "text", "text": prompt},
+ ],
+ },
+ ],
+ )
+ )
+
+ content = resp.choices[0].message.content or ""
+ raw = XinDianTuReadImageKit._extract_json(content)
+
+ result = {}
+ try:
+ data = json.loads(raw)
+ if isinstance(data, dict):
+ result = data
+ except Exception as e:
+ logger.error(f"Error parsing address JSON: {e}")
+
+ # 等待并合并按钮坐标结果
+ try:
+ button_result = await button_task
+ if button_result:
+ result.update(button_result)
+ except Exception as e:
+ logger.error(f"Error in button coordinate task: {e}")
+
+ return result
+
+ @staticmethod
+ async def parse_price_schedule_multi(station_name: str, image_urls: list, device_info: dict = None) -> list:
+ """
+ 多图解析(按图片内容 MD5 去重)并合并时段结果
+
+ 参数:
+ image_urls: 多张价格表图片的 URL 列表
+ device_info: 设备信息(可选)
+
+ 逻辑:
+ 1. 逐张下载并计算 MD5,去重得到唯一图片集合
+ 2. 对每张唯一图片解析价格时段
+ 3. 将所有图片的时段行合并为一个列表返回
+
+ 返回:
+ 合并后的时段列表(未按小时拆分)
+ """
+ if not image_urls:
+ return []
+ # MD5 -> URL 的映射,用于去重
+ md5_to_url = {}
+ for u in image_urls:
+ m = await XinDianTuReadImageKit._fetch_md5(u)
+ if m and m not in md5_to_url:
+ md5_to_url[m] = u
+ unique_urls = list(md5_to_url.values())
+ # 合并时段结果
+ combined = []
+ for u in unique_urls:
+ rows = await XinDianTuReadImageKit.parse_price_schedule(station_name, u, device_info=device_info)
+ if rows:
+ combined.extend(rows)
+ return combined
+
+ @staticmethod
+ def hourly_full_day(rows: list) -> list:
+ """
+ 将时段列表规整为全天24个整点小时段
+
+ 参数:
+ rows: 原始时段列表(可来自多图合并)
+
+ 返回:
+ 固定24条记录(00:00-01:00 到 23:00-24:00),
+ 若某小时未被任何时段覆盖,则费用为 None
+ 说明:
+ - 选择覆盖该小时段的时段(若多个,则选择重叠时间最长的一个)
+ - 保证返回结构完整,便于后续消费端显示或补全
+ """
+ # 预处理:转换为分钟区间
+ intervals = []
+ for r in rows:
+ s = XinDianTuReadImageKit._to_minutes(r.get("start"))
+ e = XinDianTuReadImageKit._to_minutes(r.get("end"))
+ if e <= s:
+ continue
+ s = max(0, s)
+ e = min(1440, e)
+ intervals.append({
+ "s": s, "e": e,
+ "price_kwh": r.get("price_kwh"),
+ "electric_fee_kwh": r.get("electric_fee_kwh"),
+ "service_fee_kwh": r.get("service_fee_kwh"),
+ })
+ intervals.sort(key=lambda x: (x["s"], x["e"]))
+
+ result = []
+ for h in range(24):
+ hs = h * 60
+ he = (h + 1) * 60
+ best = None
+ best_overlap = 0
+ for it in intervals:
+ overlap = max(0, min(he, it["e"]) - max(hs, it["s"]))
+ if overlap > best_overlap:
+ best_overlap = overlap
+ best = it
+ result.append({
+ "start": XinDianTuReadImageKit._fmt(hs),
+ "end": XinDianTuReadImageKit._fmt(he),
+ "price_kwh": best["price_kwh"] if best else None,
+ "electric_fee_kwh": best["electric_fee_kwh"] if best else None,
+ "service_fee_kwh": best["service_fee_kwh"] if best else None,
+ })
+ return result
+
+
+async def test1():
+ # 测试新电途第一层结构的读取
+ url = "https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/Temp/8fd79c68-fec6-4ca7-8d8e-fbff3c6862c8.jpg"
+ print(f"Testing First Level with URL: {url}")
+ result = await XinDianTuReadImageKit.parse_first_level_image_url(url)
+ print("First Level Result:")
+ print(json.dumps(result, ensure_ascii=False, indent=2))
+
+
+async def test2(station_name: str):
+ # 测试新电途第二层结构的读取
+ url = "https://dsideal.obs.myhuaweicloud.com/HuangHai/Temp/SecondPage.jpg"
+ print(f"Testing address extraction from: {url}")
+ result = await XinDianTuReadImageKit.parse_address(station_name, url)
+ result["station_name"] = station_name
+ print("Address result:")
+ print(json.dumps(result, ensure_ascii=False, indent=2))
+
+
+async def test3(station_name: str):
+ # 测试新电途价格表图片的解析
+ samples = [
+ "https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/Temp/XinDianTu/1.jpg",
+ "https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/Temp/XinDianTu/2.jpg",
+ ]
+ rows = await XinDianTuReadImageKit.parse_price_schedule_multi(station_name, samples)
+ hourly = XinDianTuReadImageKit.hourly_full_day(rows)
+ print(json.dumps(hourly, ensure_ascii=False, indent=2))
+
+
+if __name__ == "__main__":
+ #asyncio.run(test1())
+ station_name = '吉林省看守所充电站'
+ #asyncio.run(test2(station_name))
+ asyncio.run(test3(station_name))
diff --git a/Util/__init__.py b/Util/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Util/__pycache__/Kit.cpython-310.pyc b/Util/__pycache__/Kit.cpython-310.pyc
new file mode 100644
index 0000000..4cb929d
Binary files /dev/null and b/Util/__pycache__/Kit.cpython-310.pyc differ
diff --git a/Util/__pycache__/LlmUtil.cpython-310.pyc b/Util/__pycache__/LlmUtil.cpython-310.pyc
new file mode 100644
index 0000000..98f5caf
Binary files /dev/null and b/Util/__pycache__/LlmUtil.cpython-310.pyc differ
diff --git a/Util/__pycache__/ObsUtil.cpython-310.pyc b/Util/__pycache__/ObsUtil.cpython-310.pyc
new file mode 100644
index 0000000..470c178
Binary files /dev/null and b/Util/__pycache__/ObsUtil.cpython-310.pyc differ
diff --git a/Util/__pycache__/OcrParser.cpython-310.pyc b/Util/__pycache__/OcrParser.cpython-310.pyc
new file mode 100644
index 0000000..b36f8f5
Binary files /dev/null and b/Util/__pycache__/OcrParser.cpython-310.pyc differ
diff --git a/Util/__pycache__/PaChongGaoDeKit.cpython-310.pyc b/Util/__pycache__/PaChongGaoDeKit.cpython-310.pyc
new file mode 100644
index 0000000..9e444bf
Binary files /dev/null and b/Util/__pycache__/PaChongGaoDeKit.cpython-310.pyc differ
diff --git a/Util/__pycache__/PaddleOCRKit.cpython-310.pyc b/Util/__pycache__/PaddleOCRKit.cpython-310.pyc
new file mode 100644
index 0000000..665af33
Binary files /dev/null and b/Util/__pycache__/PaddleOCRKit.cpython-310.pyc differ
diff --git a/Util/__pycache__/RedisKit.cpython-310.pyc b/Util/__pycache__/RedisKit.cpython-310.pyc
new file mode 100644
index 0000000..fba8891
Binary files /dev/null and b/Util/__pycache__/RedisKit.cpython-310.pyc differ
diff --git a/Util/__pycache__/RedisKit.cpython-313.pyc b/Util/__pycache__/RedisKit.cpython-313.pyc
new file mode 100644
index 0000000..b9874b1
Binary files /dev/null and b/Util/__pycache__/RedisKit.cpython-313.pyc differ
diff --git a/Util/__pycache__/Win32Patch.cpython-310.pyc b/Util/__pycache__/Win32Patch.cpython-310.pyc
new file mode 100644
index 0000000..06616be
Binary files /dev/null and b/Util/__pycache__/Win32Patch.cpython-310.pyc differ
diff --git a/Util/__pycache__/XinDianTuReadImageKit.cpython-310.pyc b/Util/__pycache__/XinDianTuReadImageKit.cpython-310.pyc
new file mode 100644
index 0000000..fb57996
Binary files /dev/null and b/Util/__pycache__/XinDianTuReadImageKit.cpython-310.pyc differ
diff --git a/Util/__pycache__/XinDianTuReadImageKit.cpython-313.pyc b/Util/__pycache__/XinDianTuReadImageKit.cpython-313.pyc
new file mode 100644
index 0000000..feea2ea
Binary files /dev/null and b/Util/__pycache__/XinDianTuReadImageKit.cpython-313.pyc differ
diff --git a/Util/__pycache__/__init__.cpython-310.pyc b/Util/__pycache__/__init__.cpython-310.pyc
new file mode 100644
index 0000000..19e342c
Binary files /dev/null and b/Util/__pycache__/__init__.cpython-310.pyc differ
diff --git a/Util/__pycache__/__init__.cpython-313.pyc b/Util/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000..9b24b31
Binary files /dev/null and b/Util/__pycache__/__init__.cpython-313.pyc differ
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/run.py b/run.py
new file mode 100644
index 0000000..5ac40b4
--- /dev/null
+++ b/run.py
@@ -0,0 +1,53 @@
+# coding=utf-8
+import sys
+import os
+import argparse
+import asyncio
+
+# 添加当前目录到 sys.path
+sys.path.append(os.path.dirname(os.path.abspath(__file__)))
+
+def main():
+ parser = argparse.ArgumentParser(description="dsCrawler 统一启动入口")
+ # nargs='?' 表示参数可选,如果未提供,值为 None
+ parser.add_argument("app", nargs='?', help="要启动的小程序应用名称 (例如: XinDianTu)")
+ parser.add_argument("--action", default="run", help="要执行的操作 (run=全流程, crawl=仅爬取, coord=仅补全坐标)")
+
+ args = parser.parse_args()
+
+ if args.app is None:
+ print("您没有输入要爬取的供应商名称,系统将默认爬取新电途。")
+ app_name = "XinDianTu"
+ else:
+ app_name = args.app
+
+ action = args.action
+
+ print(f"🚀 正在启动应用: {app_name} (Action: {action})")
+
+ try:
+ if app_name == "XinDianTu":
+ from Apps.XinDianTu import Run
+ from Apps.XinDianTu import Crawler
+ from Apps.XinDianTu import Coord
+
+ if action == "run":
+ asyncio.run(Run.main())
+ elif action == "crawl":
+ # 仅运行爬虫部分(需要自己处理 service 初始化)
+ print("暂未实现单独运行 crawl,请使用 run")
+ elif action == "coord":
+ asyncio.run(Coord.main())
+ else:
+ print(f"未知操作: {action}")
+ else:
+ print(f"❌ 未找到应用: {app_name}")
+ print("可用应用: XinDianTu")
+
+ except ImportError as e:
+ print(f"❌ 导入错误: {e}")
+ except Exception as e:
+ print(f"❌ 运行错误: {e}")
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/一键更新.cmd b/一键更新.cmd
new file mode 100644
index 0000000..d8f5331
--- /dev/null
+++ b/一键更新.cmd
@@ -0,0 +1,21 @@
+git config --global user.name "HuangHai"
+git config --global user.email "10402852@qq.com"
+
+:: 删除旧凭据(注意保持协议一致)
+cmdkey /delete:git:http://www.yelite.cn:27825
+
+:: 添加正确格式的HTTP协议凭据(注意不要带路径)
+cmdkey /generic:git:http://www.yelite.cn:27825 /user:huanghai /pass:mdcija780522
+
+:: 设置凭据存储(保持原有配置)
+git config --global credential.helper manager
+
+git config --global core.autocrlf false
+git config --global http.sslVerify true
+
+git add -A .
+git commit -am 'commit'
+git pull --no-edit
+git push origin main
+
+