From 9ee93321887ea84cf3846ca37c48b122a89ea4ea Mon Sep 17 00:00:00 2001 From: chenglifeng Date: Thu, 27 Feb 2025 18:17:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=8A=A0=E5=AF=86=EF=BC=9B?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9D=90=E6=A0=87=E7=B3=BB=E7=BB=9F=E6=8F=92?= =?UTF-8?q?=E5=85=A5=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/CoordinateSystemViewModel.kt | 61 ++++++ .../survey/logic/viewmodel/LoginViewModel.kt | 50 +++-- .../survey/model/CoordinateSystemData.kt | 8 + .../java/com/project/survey/network/Api.kt | 25 ++- .../project/survey/network/RetrofitClient.kt | 67 +++++- .../survey/ui/home/InstrumentFragment.kt | 2 +- .../CoordinateSystemContainerFragment.java | 39 ++-- .../project/survey/ui/login/LoginActivity.kt | 3 +- .../java/com/project/survey/util/DESUtil.java | 192 ++++++++++++++++++ .../menu/menu_fragment_coordinate_system.xml | 22 ++ .../1.json | 70 +++++++ 11 files changed, 488 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/project/survey/logic/viewmodel/CoordinateSystemViewModel.kt create mode 100644 app/src/main/java/com/project/survey/model/CoordinateSystemData.kt create mode 100644 app/src/main/java/com/project/survey/util/DESUtil.java create mode 100644 app/src/main/res/menu/menu_fragment_coordinate_system.xml create mode 100644 app/src/main/schemas/com.project.survey.ui.instrument.setupstation.db.RecordsFixedDataBase/1.json diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/CoordinateSystemViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/CoordinateSystemViewModel.kt new file mode 100644 index 0000000..3d68e45 --- /dev/null +++ b/app/src/main/java/com/project/survey/logic/viewmodel/CoordinateSystemViewModel.kt @@ -0,0 +1,61 @@ +package com.project.survey.logic.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import blankj.utilcode.util.ActivityUtils +import com.bingce.data.base.user.UserConfig +import com.bingce.data.base.user.UserConfigConstants +import com.bingce.data.database.AppDataBase +import com.google.gson.Gson +import com.project.survey.constants.SPConstants +import com.project.survey.model.CoordinateSystemData +import com.project.survey.model.LoginBean +import com.project.survey.network.RetrofitClient +import com.project.survey.ui.login.LoginActivity +import com.project.survey.ui.project.ProjectListActivity +import com.project.survey.util.SPUtils + +class CoordinateSystemViewModel : BaseViewModel() { + + val api = RetrofitClient.createApiService() + + val uploadCoordinateSystemResponse: LiveData + get() = _uploadCoordinateSystemResponse + private val _uploadCoordinateSystemResponse = MutableLiveData() + + fun uploadCoordinateSystem(coordinateParameter: String) { + launch { + val res = api.uploadCoordinateSystem(coordinateParameter = coordinateParameter) + if (res.success) { + _uploadCoordinateSystemResponse.postValue(res.message) + } else { + errorResponse.postValue(res.message) + } + } + } + + val downloadCoordinateSystemResponse: LiveData + get() = _downloadCoordinateSystemResponse + private val _downloadCoordinateSystemResponse = MutableLiveData() + + fun downloadCoordinateSystem() { + launch { + val res = api.downloadCoordinateSystem() + if (res.success) { + if (res.data == null || res.data is String) { + errorResponse.postValue(res.message) + return@launch + } + try { + val gson = Gson() + val data = gson.fromJson(res.data.toString(), CoordinateSystemData::class.java) + _downloadCoordinateSystemResponse.postValue(data) + } catch (e: Exception) { + errorResponse.postValue(res.message) + } + } else { + errorResponse.postValue(res.message) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt b/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt index 99b4223..62a442b 100644 --- a/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt +++ b/app/src/main/java/com/project/survey/logic/viewmodel/LoginViewModel.kt @@ -7,6 +7,7 @@ import com.bingce.data.base.user.UserConfig import com.bingce.data.base.user.UserConfigConstants import com.bingce.data.database.AppDataBase import com.bingce.log.BCLog +import com.google.gson.Gson import com.project.survey.constants.EventConstants import com.project.survey.constants.SPConstants import com.project.survey.extend.toast @@ -59,31 +60,36 @@ class LoginViewModel : BaseViewModel() { api.internalPersonLogin(account, password, code) if (res.success) { // _externalPersonSMSCodeResponse.postValue(res.data) - - SPUtils.put(SPConstants.ACCOUNT, account) - SPUtils.put(SPConstants.TOKEN, res.data.token) - SPUtils.put(SPConstants.PERSON_ID, res.data.personId) - SPUtils.put(SPConstants.MOBILE_PHONE, res.data.mobilePhone) - SPUtils.put(SPConstants.PERSON_NAME, res.data.name) - - - var userConfig = AppDataBase.getInstance().userConfigDao().findByLeanCloudUserId(res.data.personId) - if (userConfig == null) { //创建第一个用户配置--使用默认数据目录 - userConfig = UserConfig.newItem( - res.data.personId, - UserConfigConstants.VALUE_DEFAULT_DB_FOLDER - ) - AppDataBase.getInstance().userConfigDao().save(userConfig) + if (res.data == null || res.data is String) { + errorResponse.postValue(res.message) + return@launch } + try { + val gson = Gson() + val loginBean = gson.fromJson(res.data.toString(), LoginBean::class.java) + SPUtils.put(SPConstants.ACCOUNT, account) + SPUtils.put(SPConstants.TOKEN, loginBean.token) + SPUtils.put(SPConstants.PERSON_ID, loginBean.personId) + SPUtils.put(SPConstants.MOBILE_PHONE, loginBean.mobilePhone) + SPUtils.put(SPConstants.PERSON_NAME, loginBean.name) - msgEvent.postValue(Message(EventConstants.LOGIN_STATUS)) -// MainActivity.start() - // 登录成功,进入工程列表页面 - ProjectListActivity.start() - - ActivityUtils.finishActivity(LoginActivity::class.java) - ActivityUtils.finishActivity(LoginInputCodeActivity::class.java) + var userConfig = AppDataBase.getInstance().userConfigDao() + .findByLeanCloudUserId(loginBean.personId) + if (userConfig == null) { //创建第一个用户配置--使用默认数据目录 + userConfig = UserConfig.newItem( + loginBean.personId, + UserConfigConstants.VALUE_DEFAULT_DB_FOLDER + ) + AppDataBase.getInstance().userConfigDao().save(userConfig) + } + // 登录成功,进入工程列表页面 + ProjectListActivity.start() + ActivityUtils.finishActivity(LoginActivity::class.java) + } catch (e: Exception) { + errorResponse.postValue(res.message) + return@launch + } } else { errorResponse.postValue(res.message) } diff --git a/app/src/main/java/com/project/survey/model/CoordinateSystemData.kt b/app/src/main/java/com/project/survey/model/CoordinateSystemData.kt new file mode 100644 index 0000000..0ae2b06 --- /dev/null +++ b/app/src/main/java/com/project/survey/model/CoordinateSystemData.kt @@ -0,0 +1,8 @@ +package com.project.survey.model + +import androidx.annotation.Keep + +@Keep +data class CoordinateSystemData( + val ZBZHCS_ZHCS: String +) diff --git a/app/src/main/java/com/project/survey/network/Api.kt b/app/src/main/java/com/project/survey/network/Api.kt index 23f0573..524ece6 100644 --- a/app/src/main/java/com/project/survey/network/Api.kt +++ b/app/src/main/java/com/project/survey/network/Api.kt @@ -48,7 +48,7 @@ interface Api { @Query("account") account: String, @Query("password") password: String, @Query("code") code: String - ): HttpResult + ): HttpResult /** @@ -68,7 +68,7 @@ interface Api { @Query("account") account: String, @Query("password") password: String, @Query("code") code: String - ): HttpResult + ): HttpResult /** * 获取用户可访问的所有项目的信息 @@ -260,4 +260,25 @@ interface Api { @Header("projectId") projectId: String = SPUtils.getString(SPConstants.PROJECT_ID), @Body requestBody: List ): HttpResult + + /** + * 插入坐标参数 + */ + @FormUrlEncoded + @POST("je/measureWork/insertCoordinateParameter") + suspend fun uploadCoordinateSystem( +// @Header("projectId") projectId: String = SPUtils.getString(SPConstants.PROJECT_ID), + @Field("projectId") projectId: String = SPUtils.getString(SPConstants.PROJECT_ID), + @Field("coordinateParameter") coordinateParameter: String + ): HttpResult + + /** + * 查询坐标参数 + */ + @FormUrlEncoded + @POST("je/measureWork/findCoordinateParameter") + suspend fun downloadCoordinateSystem( +// @Header("projectId") projectId: String = SPUtils.getString(SPConstants.PROJECT_ID) + @Field("projectId") projectId: String = SPUtils.getString(SPConstants.PROJECT_ID) + ): HttpResult } \ No newline at end of file diff --git a/app/src/main/java/com/project/survey/network/RetrofitClient.kt b/app/src/main/java/com/project/survey/network/RetrofitClient.kt index 4d4df19..022cfcb 100644 --- a/app/src/main/java/com/project/survey/network/RetrofitClient.kt +++ b/app/src/main/java/com/project/survey/network/RetrofitClient.kt @@ -1,10 +1,11 @@ package com.project.survey.network -import blankj.utilcode.util.LogUtils import com.bingce.http.HttpsTrustUtil import com.project.survey.BuildConfig import com.project.survey.constants.SPConstants +import com.project.survey.util.DESUtil import com.project.survey.util.SPUtils +import okhttp3.FormBody import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor @@ -69,16 +70,60 @@ object RetrofitClient { val newRequest = builder.url(newHttpUrl).build() return@addInterceptor chain.proceed(newRequest) } -// .addInterceptor { chain -> -// val token = SPUtils.getString(SPConstants.TOKEN) ?: "" -// val builder = chain.request().newBuilder().apply { -// removeHeader("Authorization") -// if (token.isNotBlank()) { -// addHeader("Authorization", token) -// } -// } -// return@addInterceptor chain.proceed(builder.build()) -// } + .addInterceptor { chain -> + val originalRequest = chain.request() + if (originalRequest.method == "GET") { + val originalUrl = originalRequest.url + // 创建一个新的 HttpUrl.Builder + val urlBuilder = originalUrl.newBuilder() + // 定义一个map用来存储参数 + val params = mutableMapOf() + // 遍历原始 URL 的参数 + for (name in originalUrl.queryParameterNames) { + val value = originalUrl.queryParameter(name) + // 放入map中 + params[name] = value ?: "" + // 移除原来的参数 + urlBuilder.removeAllQueryParameters(name) + // 加密参数名 + } + // 对参数名和参数值进行加密 + val encryptedMap = DESUtil.toParamsEncrypt(params) + encryptedMap.forEach { (key, value) -> + if (key != "params-keys") { + urlBuilder.setQueryParameter(key, value.toString()) + } + } + val newRequest = originalRequest.newBuilder() + .url(urlBuilder.build()) + .header("params-keys", encryptedMap["params-keys"].toString()) + .build() + return@addInterceptor chain.proceed(newRequest) + } + if (originalRequest.method == "POST" && originalRequest.body != null && originalRequest.body is FormBody) { + val formBody = originalRequest.body as FormBody + // 构建一个新的 FormBody.Builder + val formBodyBuilder = FormBody.Builder() + // 定义一个map用来存储参数 + val params = mutableMapOf() + for (i in 0 until formBody.size) { + params[formBody.name(i)] = formBody.value(i) + } + // 对参数名和参数值进行加密 + val encryptedMap = DESUtil.toParamsEncrypt(params) + encryptedMap.forEach { (key, value) -> + if (key != "params-keys") { + formBodyBuilder.add(key, value.toString()) + } + } + val newRequest = originalRequest.newBuilder() + .method(originalRequest.method, formBodyBuilder.build()) + .header("params-keys", encryptedMap["params-keys"].toString()) + .build() + return@addInterceptor chain.proceed(newRequest) + } + return@addInterceptor chain.proceed(originalRequest) + } .addInterceptor(HttpLoggingInterceptor().apply { level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY diff --git a/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt b/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt index 8747ae7..9dcfc5b 100644 --- a/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt +++ b/app/src/main/java/com/project/survey/ui/home/InstrumentFragment.kt @@ -12,7 +12,6 @@ import com.bingce.device.ui.ConnectRtkActivity import com.bingce.device.ui.ConnectTSActivity import com.bingce.rtk.command.RTK import com.bingce.rtk.config.GnssConfigManager -import com.bingce.ui.coordinatesystem.BingCeCoordinateSystemActivity import com.project.survey.R import com.project.survey.constants.EventConstants import com.project.survey.constants.SPConstants @@ -23,6 +22,7 @@ import com.project.survey.logic.viewmodel.MainViewModel import com.project.survey.model.ProjectBean import com.project.survey.ui.base.BaseBindingFragment import com.project.survey.ui.instrument.basestationtranslation.RtkBaseCorrectActivity +import com.project.survey.ui.instrument.coordinatesystem.BingCeCoordinateSystemActivity import com.project.survey.ui.instrument.mobilestationmode.GnssConfigSetActivity import com.project.survey.ui.instrument.mobilestationmode.base.RtkPointCorrectActivity import com.project.survey.ui.instrument.satellitosis.SatelliteStatusActivity diff --git a/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/fragment/CoordinateSystemContainerFragment.java b/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/fragment/CoordinateSystemContainerFragment.java index 530f949..c41faec 100644 --- a/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/fragment/CoordinateSystemContainerFragment.java +++ b/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/fragment/CoordinateSystemContainerFragment.java @@ -14,24 +14,21 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; import androidx.viewpager.widget.ViewPager; import com.afollestad.materialdialogs.MaterialDialog; import com.bingce.coordlib.model.CoordinateSystem; import com.bingce.coordlib.util.CoordinateSystemUtil; import com.bingce.data.base.user.UserConfig; -import com.bingce.data.base.user.UserConfigDao; import com.bingce.data.cache.AbstractCachedObserver; import com.bingce.data.database.AppDataBase; -import com.bingce.data.database.CoordinateSystemDb; import com.bingce.data.database.DBQueryConstant; import com.bingce.data.database.KeyValueDb; import com.bingce.data.database.ProjectDb; -import com.bingce.data.surveyor.designdata.coordinate.CoordinateSystemConstants; -import com.bingce.data.surveyor.designdata.coordinate.CoordinateSystemRecord; import com.bingce.data.surveyor.designdata.kv.KeyValueConstants; import com.bingce.data.surveyor.designdata.kv.KeyValueRecord; import com.bingce.data.surveyor.designdata.project.ProjectConstants; @@ -47,16 +44,14 @@ import com.bingce.device.ui.coordinatesystem.fragment.EllipsoidFragment; import com.bingce.device.ui.coordinatesystem.fragment.GridTransformFragment; import com.bingce.device.ui.coordinatesystem.fragment.ProjectionFragment; import com.bingce.device.ui.utils.CoordSysShareUtil; -import com.bingce.dialog.DialogUtils; import com.bingce.error.BingCeErrorCode; -import com.bingce.event.SingleMessageEvent; import com.bingce.surveyorBase.R; -import com.bingce.ui.coordinatesystem.PresetCoordinateSystemV2Activity; import com.bingce.utils.SoftKeyUtils; import com.bingce.utils.ThreadPoolUtil; import com.bingce.utils.ValidateUtil; import com.flyco.tablayout.SlidingTabLayout; import com.project.survey.constants.SPConstants; +import com.project.survey.logic.viewmodel.CoordinateSystemViewModel; import com.project.survey.ui.instrument.coordinatesystem.CachedCurrentCoordinateSystem; import com.project.survey.ui.instrument.mobilestationmode.base.RtkPointCorrectActivity; import com.project.survey.util.SPUtils; @@ -67,7 +62,6 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; -import java.util.Date; import java.util.List; import blankj.utilcode.util.StringUtils; @@ -84,6 +78,8 @@ public class CoordinateSystemContainerFragment extends AbstractCoordinateSystemC private final CoordSysShareUtil.Export export = new CoordSysShareUtil.Export(); private final CoordSysShareUtil.Import anImport = new CoordSysShareUtil.Import(); + private CoordinateSystemViewModel viewModel; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -155,6 +151,18 @@ public class CoordinateSystemContainerFragment extends AbstractCoordinateSystemC mSlidingTabLayout.setCurrentTab(1, true); } } + + viewModel = new ViewModelProvider(this).get(CoordinateSystemViewModel.class); + // 分享坐标系统(上传到服务器) + viewModel.getUploadCoordinateSystemResponse().observe(this, s -> { + ToastUtils.showShort(s); + }); + // 导入坐标系统 + viewModel.getDownloadCoordinateSystemResponse().observe(this, data -> { + CoordinateSystem system = CoordinateSystemUtil.importCoordSysString(data.getZBZHCS_ZHCS()); + onCoordinateSystemChanged(system); + ToastUtils.showShort("导入成功"); + }); } @Override @@ -251,7 +259,7 @@ public class CoordinateSystemContainerFragment extends AbstractCoordinateSystemC @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); - if (itemId == R.id.menu_fragment_coordinate_system_library) { + /*if (itemId == R.id.menu_fragment_coordinate_system_library) { FragmentActivity activity = getActivity(); if (activity != null) { PresetCoordinateSystemV2Activity.selectCoordinateSystem(activity, coordinateSystem -> { @@ -317,10 +325,13 @@ public class CoordinateSystemContainerFragment extends AbstractCoordinateSystemC mSlidingTabLayout.setCurrentTab(index, true); } }); - } else if (itemId == R.id.menu_fragment_coordinate_system_share) { - showShareParametersDialog(); - } else if (itemId == R.id.menu_fragment_coordinate_system_import) { - showImportParametersDialog(); + } else*/ if (itemId == R.id.menu_fragment_coordinate_system_share) { //分享坐标系统 +// showShareParametersDialog(); + String coordinateSystemString = CoordinateSystemUtil.exportCoordSysString(currentCoordinateSystem()); + viewModel.uploadCoordinateSystem(coordinateSystemString); + } else if (itemId == R.id.menu_fragment_coordinate_system_import) { //导入坐标系统 +// showImportParametersDialog(); + viewModel.downloadCoordinateSystem(); } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt b/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt index eb3872f..654f54f 100644 --- a/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/project/survey/ui/login/LoginActivity.kt @@ -66,7 +66,8 @@ class LoginActivity : BaseBindingActivity() { toast("账号或密码不能为空") return@setOnClickNoRepeatListener } - viewModel.fetchLoginSMSCode(isOutLogin, account, password) + viewModel.externalPersonLogin(isOutLogin, account, password, "123") +// viewModel.fetchLoginSMSCode(isOutLogin, account, password) } //忘记密码 diff --git a/app/src/main/java/com/project/survey/util/DESUtil.java b/app/src/main/java/com/project/survey/util/DESUtil.java new file mode 100644 index 0000000..7d0ac3a --- /dev/null +++ b/app/src/main/java/com/project/survey/util/DESUtil.java @@ -0,0 +1,192 @@ +package com.project.survey.util; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.util.*; + +import blankj.utilcode.util.LogUtils; + +public class DESUtil { + + // 模拟获取系统配置的方法,可根据实际情况修改 + private static String getSystemConfig(String key, String defaultValue) { + // 这里简单返回默认值,实际中可从配置文件等读取 + return defaultValue; + } + + // 模拟将字符串转换为布尔值的方法 + private static boolean toBoolean(String value) { + return Boolean.parseBoolean(value); + } + + // 模拟分割字符串的方法 + private static String[] split(String str, String delimiter) { + return str.split(delimiter); + } + + // 模拟判断对象是否为空的方法 + private static boolean isNotEmpty(Object obj) { + return obj != null && (!obj.toString().isEmpty()); + } + + // 模拟判断是否为类似 FormData 的对象,这里用 Map 模拟 + private static boolean isFormData(Object obj) { + return obj instanceof Map; + } + + // 模拟判断是否为数字的方法 + private static boolean isNumber(Object obj) { + return obj instanceof Number; + } + + // 模拟生成随机数的方法 + private static int random(int bound) { + Random random = new Random(); + return random.nextInt(bound); + } + + /** + * DES 加密方法 + * @param message 待加密的信息 + * @param key 加密密钥 + * @return 加密后的十六进制字符串 + * @throws Exception 加密过程中可能出现的异常 + */ + public static String encryptByDES(String message, String key) throws Exception { + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8)); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, new SecureRandom()); + byte[] encryptedBytes = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8)); + StringBuilder hexString = new StringBuilder(); + for (byte b : encryptedBytes) { + String hex = Integer.toHexString(0xFF & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + + public static String encryptByDES(String message) throws Exception { + return encryptByDES(message, "bQ85PtpQtEwJ7FkSmrGMFQ9S"); + } + + /** + * DES 解密方法 + * @param ciphertext 加密后的十六进制字符串 + * @param key 解密密钥 + * @return 解密后的原始字符串 + * @throws Exception 解密过程中可能出现的异常 + */ + public static String decryptByDES(String ciphertext, String key) throws Exception { + byte[] encryptedBytes = hexStringToByteArray(ciphertext); + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8)); + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = keyFactory.generateSecret(desKeySpec); + Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKey, new SecureRandom()); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes, StandardCharsets.UTF_8); + } + + // 将十六进制字符串转换为字节数组的辅助方法 + private static byte[] hexStringToByteArray(String s) { + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i + 1), 16)); + } + return data; + } + + /** + * 系统请求参数加密方法 + * @param params 待加密的参数,用 Map 表示 + * @return 包含随机参数键的 Map + */ + public static Map toParamsEncrypt(Map params) { + // 启用请求参数加密 + boolean encrypt = toBoolean(getSystemConfig("JE_SYS_ENCRYPT", "true")); + // 加密参数编码 + String[] fields = split(getSystemConfig("JE_SYS_ENCRYPT_FIELD", "funcCode,tableCode,j_query,password,account,code,device,objName,objCode,typeName,FUNCINFO_FUNCCODE,funcId,tableName,ddListCodes,excludes,strData,type,beanId,metaInfo,JE_WORKFLOW_PROCESSINFO_ID,metaInfoXml,FUNCINFO_WHERESQL,DICTIONARY_DDCODE,ableCode,queryColumns,menuId,SY_PRODUCT_ID,pkValue,JE_CORE_RESOURCETABLE_ID,RESOURCETABLE_TABLECODE,userId,deptId,templateCode,typeCode"), ","); + // 随机参数编码 + List fieldKeys = new ArrayList<>(); + // 加密秘钥 + String key = getSystemConfig("JE_SYS_ENCRYPT_KEY", "bQ85PtpQtEwJ7FkSmrGMFQ9S"); + // 启用加密 && 有加密参数 + if (encrypt && fields.length > 0 && isNotEmpty(params)) { + String[] reg = "abcdefghigklmnopqrstuvwxyz".split(""); + Map encryptedParams = new HashMap<>(params); + for (String field : fields) { + // 随机参数 + String fieldKey; + do { + fieldKey = reg[random(23)] + random(100); + } while (fieldKeys.contains(fieldKey)); + fieldKeys.add(fieldKey); + // 加密内容 + Object value = params.get(field); + if (isNotEmpty(value)) { + if (isNumber(value)) { + value = value.toString(); + } + try { + value = encryptByDES(value.toString(), key); + } catch (Exception e) { + e.printStackTrace(); + } + encryptedParams.remove(field); // 删除原始参数 + encryptedParams.put(fieldKey, value); // 增加随机参数,加密信息 + } + } + encryptedParams.put("params-keys", String.join(",", fieldKeys)); + return encryptedParams; + } + return params; + } + + + public static void main(String[] args) { + try { + //值加密 + String message = "zlh3"; + String message2 = "1qaz2wsx!123"; + String message3 = "123"; + String key = "bQ85PtpQtEwJ7FkSmrGMFQ9S"; // DES 密钥长度必须为 8 字节 + String encrypted = encryptByDES(message, key); + String encrypted2 = encryptByDES(message2, key); + String encrypted3 = encryptByDES(message3, key); + LogUtils.d("加密后的信息: " + encrypted); + LogUtils.d("加密后的信息2: " + encrypted2); + LogUtils.d("加密后的信息3: " + encrypted3); +// String decrypted = decryptByDES(encrypted, key); +// System.out.println("解密后的信息: " + decrypted); +// String decrypted2 = decryptByDES(encrypted2, key); +// System.out.println("解密后的信息2: " + decrypted2); + + //字段加密 + Map params = new HashMap<>(); +// Map params2 = new HashMap<>(); +// Map params3 = new HashMap<>(); + params.put("account", "zlh3"); + params.put("password", "1qaz2wsx!123"); + params.put("code", "123"); + Map result = toParamsEncrypt(params); + LogUtils.d("加密后的参数: " + result); +// Map result2 = toParamsEncrypt(params2); +// System.out.println("加密后的参数: " + result2); +// Map result3 = toParamsEncrypt(params3); +// System.out.println("加密后的参数: " + result3); + } catch (Exception e) { + e.printStackTrace(); + + } + } +} diff --git a/app/src/main/res/menu/menu_fragment_coordinate_system.xml b/app/src/main/res/menu/menu_fragment_coordinate_system.xml new file mode 100644 index 0000000..b61d166 --- /dev/null +++ b/app/src/main/res/menu/menu_fragment_coordinate_system.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/schemas/com.project.survey.ui.instrument.setupstation.db.RecordsFixedDataBase/1.json b/app/src/main/schemas/com.project.survey.ui.instrument.setupstation.db.RecordsFixedDataBase/1.json new file mode 100644 index 0000000..c210679 --- /dev/null +++ b/app/src/main/schemas/com.project.survey.ui.instrument.setupstation.db.RecordsFixedDataBase/1.json @@ -0,0 +1,70 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "ee5658c06dcecbae4ac140ea81c3be9d", + "entities": [ + { + "tableName": "LocalResultExportFormat", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `format_name` TEXT, `format_content` TEXT, `divided_symbols` TEXT, `file_suffix` INTEGER NOT NULL, `file_header` INTEGER NOT NULL, `angle_format` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "format_name", + "columnName": "format_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "format_content", + "columnName": "format_content", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "divided_symbols", + "columnName": "divided_symbols", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "file_suffix", + "columnName": "file_suffix", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "file_header", + "columnName": "file_header", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "angle_format", + "columnName": "angle_format", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ee5658c06dcecbae4ac140ea81c3be9d')" + ] + } +} \ No newline at end of file