diff --git a/client/pom.xml b/client/pom.xml
new file mode 100644
index 00000000..8c99599a
--- /dev/null
+++ b/client/pom.xml
@@ -0,0 +1,126 @@
+
+
+ 4.0.0
+
+ com.small
+ client
+ v1
+ jar
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.0.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 8
+ 8
+ 5.8.20
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.apache.commons
+ commons-text
+ 1.10.0
+
+
+ org.projectlombok
+ lombok
+
+
+ io.springfox
+ springfox-swagger2
+ 2.9.2
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+ 9.4.1.jre8
+
+
+ ch.qos.logback
+ logback-classic
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+
+
+
+
+
+ ali-maven
+ https://maven.aliyun.com/repository/central
+
+ true
+
+
+ true
+ always
+ fail
+
+
+
+ repo.maven.apache.org
+ https://repo.maven.apache.org/maven2
+
+ true
+
+
+ true
+ always
+ fail
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/client/readme.txt b/client/readme.txt
new file mode 100644
index 00000000..7bcd7ded
--- /dev/null
+++ b/client/readme.txt
@@ -0,0 +1,21 @@
+本系统主要安装在客户端
+主要有以下几个功能
+
+第一阶段
+1、通过http获取远程数据小发服务配置,基础数据包括主要包括数据库地址ip,数据库名称,数据库密码,以及同步定时时间
+
+2.采集本地数据库,通过多线程调用同步接口,同步商品,种类,会员
+
+第二阶段
+由于系统的数据同步存在性能瓶颈,需要使用文件传输的方式同步数据,
+文件采用分页形式同步数据,每一页使用一个文件,服务器解析文件采用多线程解析方式解析
+
+
+
+打包功能更,需要写一个shell脚本自动打包放到服务器供给下载和java的jkd安装包,这些下载放到后端的网页端,暴露下载地址
+
+todo
+1、通过http获取dataInfo没有写
+2、文件传输没有写
+3.商品同步没有写
+4.商品分类同步没有写
diff --git a/client/src/main/java/com/small/client/Cache/CommonCache.java b/client/src/main/java/com/small/client/Cache/CommonCache.java
new file mode 100644
index 00000000..d90da612
--- /dev/null
+++ b/client/src/main/java/com/small/client/Cache/CommonCache.java
@@ -0,0 +1,48 @@
+package com.small.client.Cache;
+
+import cn.hutool.cache.Cache;
+import cn.hutool.cache.impl.FIFOCache;
+import cn.hutool.core.date.DateUnit;
+import com.small.client.dto.BrandModel;
+import com.small.client.dto.SpecPriceDto;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 用于本地缓存
+ */
+@Component
+public class CommonCache {
+ public final static String CACHE_CATEGROY = "CACHE_CATEGROY";//分类缓存
+
+ private Cache cache =new FIFOCache<>(20000);
+
+ private Cache> spriceCache =new FIFOCache<>(20);
+
+ private Cache> brandCahce =new FIFOCache<>(20);
+
+ public void put(String key, String value) {
+ cache.put(key, value, DateUnit.MINUTE.getMillis()*20);
+ }
+
+ public String get(String key) {
+ return cache.get(key);
+ }
+
+ public void putSpecPrice(String key, List value) {
+ spriceCache.put(key, value, DateUnit.MINUTE.getMillis()*20);
+ }
+
+ public List getSpecPrice(String key) {
+ return spriceCache.get(key);
+ }
+
+ public List getBrandCahce(String key) {
+ return brandCahce.get(key);
+ }
+
+ public void setBrandCahce(String key, List value) {
+ brandCahce.put(key, value, DateUnit.MINUTE.getMillis()*20);
+ }
+}
diff --git a/client/src/main/java/com/small/client/ClientApplication.java b/client/src/main/java/com/small/client/ClientApplication.java
new file mode 100644
index 00000000..1a61fead
--- /dev/null
+++ b/client/src/main/java/com/small/client/ClientApplication.java
@@ -0,0 +1,27 @@
+package com.small.client;
+
+import com.small.client.Utils.JarPathUtil;
+import com.small.client.service.SxDataService;
+import com.small.client.service.WebClientService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+
+@SpringBootApplication
+@Slf4j
+public class ClientApplication{
+ public static void main(String[] args) {
+ SpringApplication.run(ClientApplication.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java
new file mode 100644
index 00000000..56d0c47c
--- /dev/null
+++ b/client/src/main/java/com/small/client/Schedule/DynamicTaskScheduler.java
@@ -0,0 +1,103 @@
+package com.small.client.Schedule;
+
+import com.small.client.dto.CommentModel;
+import com.small.client.dto.DataBaseInfo;
+import com.small.client.service.SxDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.time.Duration;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+
+@Service
+@Slf4j
+public class DynamicTaskScheduler {
+ private final TaskScheduler taskScheduler;
+ private final SxDataService sxDataService;
+ private final Map> scheduledTasks = new ConcurrentHashMap<>();
+
+ private boolean isRuning =false;
+
+ @Autowired
+ public DynamicTaskScheduler(TaskScheduler taskScheduler, SxDataService sxDataService) {
+ this.taskScheduler = taskScheduler;
+ this.sxDataService = sxDataService;
+ }
+
+ @PostConstruct
+ public void initTasks() {
+ refreshTasks();
+ // 每5分钟检查一次数据库更新
+ taskScheduler.scheduleAtFixedRate(this::refreshTasks, Duration.ofHours(1));
+ }
+
+ public void refreshTasks() {
+ if(!isRuning){
+ sxDataService.checkForUpdates();//检查app更新
+ }
+ CommentModel commentModel =sxDataService.getCommentModel();
+ DataBaseInfo enabledTask = sxDataService.getDataBaseInfo(commentModel);
+
+ List enabledTasks=new ArrayList<>();
+ enabledTasks.add(enabledTask);
+ // 移除已禁用或删除的任务
+ scheduledTasks.keySet().removeIf(taskKey ->
+ enabledTasks.stream().noneMatch(task -> task.getDataBaseName().equals(taskKey)));
+
+ // 新增或更新任务
+ enabledTasks.forEach(task -> {
+ if (!scheduledTasks.containsKey(task.getDataBaseName()) ||
+ isCronModified(task)) {
+ cancelExistingTask(task.getDataBaseName());
+ scheduleTask(task,commentModel);
+ }
+ });
+ }
+
+ private void scheduleTask(DataBaseInfo task, CommentModel commentModel) {
+ ScheduledFuture> future = taskScheduler.schedule(
+ () -> executeTask(task.getDataBaseName(),commentModel),
+ new CronTrigger(task.getCronExpression())
+ );
+ scheduledTasks.put(task.getDataBaseName(), future);
+ }
+
+ /**
+ * 业务逻辑执行
+ * @param taskKey
+ */
+ private void executeTask(String taskKey, CommentModel commentModel) {
+ isRuning=true;
+ log.info("execute task key:{}, commentModel:{}", taskKey, commentModel);
+ if(commentModel==null){
+ commentModel =sxDataService.getCommentModel();
+ }
+ if(StringUtils.isEmpty(commentModel.getSyncTime())){
+ commentModel =sxDataService.getCommentModel();
+ }
+ DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel);
+ sxDataService.SyncBranchList(dataBaseInfo,commentModel);
+ sxDataService.SyncCategory(dataBaseInfo,commentModel);
+ sxDataService.SyncGoods(dataBaseInfo,commentModel);//todo 暂时同步全部的商品如果后期修改,需要增加服务器的字段test
+ sxDataService.SyncVipList(dataBaseInfo,commentModel);
+ isRuning=false;
+ }
+
+ private void cancelExistingTask(String taskKey) {
+ Optional.ofNullable(scheduledTasks.remove(taskKey))
+ .ifPresent(future -> future.cancel(false));
+ }
+
+ private boolean isCronModified(DataBaseInfo newTask) {
+ DataBaseInfo dataBaseInfo= sxDataService.getDataBaseInfo(sxDataService.getCommentModel());
+ return scheduledTasks.containsKey(newTask.getDataBaseName()) &&
+ !dataBaseInfo.getCronExpression().equals(newTask.getCronExpression());
+ }
+}
diff --git a/client/src/main/java/com/small/client/Utils/CommonUtil.java b/client/src/main/java/com/small/client/Utils/CommonUtil.java
new file mode 100644
index 00000000..4f8db7e3
--- /dev/null
+++ b/client/src/main/java/com/small/client/Utils/CommonUtil.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
+ * Vestibulum commodo. Ut rhoncus gravida arcu.
+ */
+
+package com.small.client.Utils;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+
+public class CommonUtil {
+
+ private final static String apiUrl = "http://4ei8850868ux.vicp.fun";
+
+ public static JSONObject sendPostRequestToSiXun(String urlPath, JSONObject params) {
+ String resp = HttpUtil.post(apiUrl + urlPath, params.toString());
+ if (StrUtil.isBlank(resp)) {
+ return null;
+ }
+
+ JSONObject respObj = JSONUtil.parseObj(resp);
+
+ return respObj;
+ }
+
+ /**
+ * 根据总条数和分页大小,求页数
+ *
+ * @param total
+ * @param pageSize
+ * @return
+ */
+ public static Integer getPagesCount(Integer total, Integer pageSize) {
+ if (total == null || pageSize == null || pageSize <= 0 || total <= 0) {
+ return 0;
+ }
+
+ int pagesCount = 0;
+ pagesCount = total / pageSize;
+
+ if (total % pageSize > 0) {
+ // 有余数
+ pagesCount++;
+ } else {
+ if (pagesCount == 0) {
+ pagesCount = 1;
+ }
+ }
+
+ return pagesCount;
+ }
+
+ /**
+ * 接口是否成功执行返回
+ *
+ * @param jsonObject
+ * @return
+ */
+ public static Boolean isSuccess(JSONObject jsonObject) {
+ if (jsonObject == null) {
+ return false;
+ }
+
+ return jsonObject.get("code") != null && jsonObject.getStr("code").equals("0");
+ }
+
+ /**
+ * 接口是否成功执行返回
+ *
+ * @param jsonObject
+ * @return
+ */
+ public static Boolean hasSuccessData(JSONObject jsonObject) {
+ if (jsonObject == null) {
+ return false;
+ }
+
+ return jsonObject.get("code") != null && jsonObject.getStr("code").equals("0") && jsonObject.get("data") != null;
+ }
+
+ /**
+ * 通过json节点表达式,获取节点json字符串,注:驼峰命名改成下划线命名
+ *
+ * @param jsonObject
+ * @param expression json 节点表达式比如: data.list, msg, code
+ * @return
+ */
+ public static String toUnderlineJson(JSONObject jsonObject, String expression) {
+ return StrUtil.toUnderlineCase(jsonObject.getByPath(expression, String.class));
+ }
+
+
+}
diff --git a/client/src/main/java/com/small/client/Utils/CryptoUtils.java b/client/src/main/java/com/small/client/Utils/CryptoUtils.java
new file mode 100644
index 00000000..6c99f73d
--- /dev/null
+++ b/client/src/main/java/com/small/client/Utils/CryptoUtils.java
@@ -0,0 +1,110 @@
+package com.small.client.Utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+public class CryptoUtils {
+ private static final String ALGORITHM = "AES";
+ private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
+ private static final String SECRET_KEY = "9f823ea6ab22785caf040e4cc3930619"; // 必须16/24/32字符
+
+ private static final String HASH_ALGORITHM_KEY = "appKey=a&sign=b&storeId=c";
+
+ /**
+ * 打包并加密字段
+ */
+ public static String packAndEncrypt(String appKey, String sign, String storeId) throws Exception {
+ String combined = String.format("appKey=%s&sign=%s&storeId=%s", appKey, sign, storeId);
+ return encrypt(combined);
+ }
+
+ /**
+ * 32位字符串生成
+ * @param input
+ * @return
+ * @throws NoSuchAlgorithmException
+ */
+ public static String generate32CharMD5(String input) throws NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ byte[] hashBytes = md.digest(input.getBytes());
+
+ StringBuilder hexString = new StringBuilder();
+ for (byte b : hashBytes) {
+ String hex = Integer.toHexString(0xff & b);
+ if (hex.length() == 1) {
+ hexString.append('0');
+ }
+ hexString.append(hex);
+ }
+
+ return hexString.toString();
+ }
+
+ /**
+ * 解密并解包字段
+ */
+ public static Map decryptAndUnpack(String encryptedData) throws Exception {
+ String decrypted = decrypt(encryptedData);
+ Map result = new HashMap<>();
+ String[] pairs = decrypted.split("&");
+ for (String pair : pairs) {
+ String[] keyValue = pair.split("=");
+ if (keyValue.length == 2) {
+ result.put(keyValue[0], keyValue[1]);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 加密
+ * @param value
+ * @return
+ * @throws Exception
+ */
+ private static String encrypt(String value) throws Exception {
+ SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
+ Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+ cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+ byte[] encryptedBytes = cipher.doFinal(value.getBytes(StandardCharsets.UTF_8));
+ return Base64.getEncoder().encodeToString(encryptedBytes);
+ }
+
+ /**
+ * 解密
+ * @param encryptedValue
+ * @return
+ * @throws Exception
+ */
+ private static String decrypt(String encryptedValue) throws Exception {
+ SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
+ Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+ cipher.init(Cipher.DECRYPT_MODE, secretKey);
+ byte[] decodedBytes = Base64.getDecoder().decode(encryptedValue);
+ byte[] decryptedBytes = cipher.doFinal(decodedBytes);
+ return new String(decryptedBytes, StandardCharsets.UTF_8);
+ }
+
+
+ // 示例用法
+ public static void main(String[] args) throws Exception {
+
+ String appKey = "d68397c4fb671bc024e24e1964b067cc35388818";
+ String sign = "d68397c4fb671bc024e24e1964b067cc35388818";
+ String storeId = "1";
+
+ // 打包加密
+ String encrypted = packAndEncrypt(appKey, sign, storeId);
+ System.out.println("加密结果: " + encrypted);
+
+ // 解密解包
+ Map result = decryptAndUnpack(encrypted);
+ System.out.println("解密结果: " + result);
+ }
+}
diff --git a/client/src/main/java/com/small/client/Utils/FileUtils.java b/client/src/main/java/com/small/client/Utils/FileUtils.java
new file mode 100644
index 00000000..b865a8da
--- /dev/null
+++ b/client/src/main/java/com/small/client/Utils/FileUtils.java
@@ -0,0 +1,176 @@
+package com.small.client.Utils;
+
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Calendar;
+import java.util.Date;
+
+@Slf4j
+public class FileUtils {
+
+ public static final String pathSeparator = System.getProperty("file.separator");
+ public static final String FOLDER = System.getProperty("user.home") + pathSeparator+"uploaded"+pathSeparator;
+ public static final String GOODS = pathSeparator+"goods"+pathSeparator;//商品
+ public static final String CATEGORY= pathSeparator+ "category"+pathSeparator;//分类
+ public static final String BRAND = pathSeparator+"brand/"+pathSeparator;//品牌
+ public static final String MEMBER= pathSeparator+"member"+pathSeparator;//会员
+
+ public static final String CLIENTSTALLPATH = System.getProperty("user.home") + pathSeparator+"cientStorePath"+pathSeparator;
+
+ public static final String REFLESHDATE="refleshdate.txt";
+ public static final String PRIMARYKEY="primaryKey.txt";
+
+ public static final String GOODS_TYPE = "goods";//商品
+ public static final String CATEGORY_TYPE= "category";//分类
+ public static final String BRAND_TYPE = "brand";//品牌
+ public static final String MEMBER_TYPE= "member";//会员
+
+ public static final String okEnd = "ok";//后缀
+ public static final String txtEnd = "txt";//后缀
+
+ public static String fileFormat = "%s_%s.%s";//good_1
+
+ public static String getSyncTypeFlag(String syncType){
+ Calendar calendar=Calendar.getInstance();
+ int year=calendar.get(Calendar.YEAR);
+ int month=calendar.get(Calendar.MONTH)+1;
+ int date=calendar.get(Calendar.DAY_OF_MONTH);
+ String result =FOLDER;
+ switch (syncType){
+ case "1":
+ result=GOODS;
+ break;
+ case "2":
+ result=CATEGORY;
+ break;
+ case "3":
+ result=BRAND;
+ break;
+ case "4":
+ result=MEMBER;
+ break;
+ default:
+ break;
+ }
+ return result+year+pathSeparator+month+pathSeparator+date+pathSeparator;
+ }
+
+ /**
+ * 创建文件
+ * @param syncType
+ * @param page
+ * @return
+ */
+ public File createFile(String syncType,Integer page){
+ String path= getSyncTypeFlag(syncType+pathSeparator+page+pathSeparator);
+ File file=new File(path);
+ if(!file.exists()){
+ file.mkdirs();
+ }
+ return file;
+ }
+
+ /**
+ * 创建文件
+ * @param path
+ * @return
+ */
+ public File createFile(String path){
+ File file=new File(path);
+ if(!file.exists()){
+ file.mkdirs();
+ }
+ return file;
+ }
+
+ /**
+ * 文件写入
+ * @param filePath
+ */
+ public void writeFile(String filePath,String fileName,String content){
+ try {
+ FileWriter writer = new FileWriter(filePath+pathSeparator+fileName);
+ writer.write(content);
+ writer.close();
+ log.info("文件写入成功!");
+ } catch (IOException e) {
+ log.info("文件写入失败:{}", e.getMessage());
+ }
+ }
+
+ /**
+ * 根据类型获取文件名称
+ * @param syncType
+ * @param page
+ * @return
+ */
+ public String getFileName(String syncType ,Integer page,String endFix){
+ String result="";
+ switch (syncType){
+ case "1":
+ result=GOODS_TYPE;
+ break;
+ case "2":
+ result=CATEGORY_TYPE;
+ break;
+ case "3":
+ result=BRAND_TYPE;
+ break;
+ case "4":
+ result=MEMBER_TYPE;
+ break;
+ default:
+ break;
+ }
+ return String.format(fileFormat, result,page,endFix);
+ }
+
+ /**
+ * 创建文件
+ * @param folderPath
+ * @param filePath
+ */
+ public static void createFolderAndFileUsingFile(String folderPath, String filePath) {
+ File folder = new File(folderPath);
+ if (!folder.exists()) {
+ folder.mkdir();
+ }
+
+ File file = new File(filePath);
+ try {
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ public static void copyFile(String srcFile, String destFile) {
+ String path= JarPathUtil.getRuntimePath();
+ Path sourceFile = Paths.get(srcFile);
+ Path targetDir =Paths.get(destFile);
+ try {
+ Files.copy(sourceFile, targetDir.resolve(sourceFile.getFileName()),
+ StandardCopyOption.REPLACE_EXISTING);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ public static void main(String[] args) {
+ FileUtils fileUtils= new FileUtils();
+ File file=fileUtils.createFile("1",1);
+ System.out.printf("--"+file.getAbsoluteFile());
+ fileUtils.writeFile(file.getAbsolutePath(),fileUtils.getFileName("1",2,txtEnd),"456");
+ }
+
+}
diff --git a/client/src/main/java/com/small/client/Utils/HttpUtils.java b/client/src/main/java/com/small/client/Utils/HttpUtils.java
new file mode 100644
index 00000000..5bf17681
--- /dev/null
+++ b/client/src/main/java/com/small/client/Utils/HttpUtils.java
@@ -0,0 +1,107 @@
+package com.small.client.Utils;
+
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.small.client.dto.StoreDbConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Map;
+
+@Slf4j
+public class HttpUtils {
+
+ public static final String SUCCESSCODE="0";//上传文件
+
+ public static final String URL_UPLOUP="/shop/sync/third/uploudSxData";//上传文件
+
+
+ public static final String URL_SYNC_CATEGORY="/shop/sync/third/goods/category";//商品分类数据同步
+
+ public static final String URL_SYNC_BRAND="/shop/sync/third/goods/brand";//商品品牌数据同步
+
+ public static final String URL_SYNC_GOODS="/shop/sync/third/goods";//商品数据同步
+
+ public static final String URL_SYNC_MEMBER="/shop/sync/third/member";
+
+ public static final String URL_SYNC_GOODS_READ="/shop/sync/third/readSxData";//商品数据同步
+
+ public static final String URL_SYNC_GET_APPSIGN="/shop/sync/third/getAppSign";//获取密文
+
+ public static final String URL_SYNC_GET_DOWNCLIENTJAR="/shop/sync/app/downClientJar";//文件下载
+
+ public static final String URL_SYNC_GET_STOREdBCONFIG="/shop/sync/third/getStoreDbConfig";//文件下载
+
+ public static String postData(RestTemplate restTemplate, String url,Object modelObject){
+ // 创建表单参数
+// MultiValueMap map = new LinkedMultiValueMap<>();
+// map.add("key1", "value1");
+// map.add("key2", "value2");
+
+ // 设置Content-Type为application/x-www-form-urlencoded
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ log.info(modelObject.toString());
+ HttpEntity