mirror of
				https://github.com/earthjasonlin/zzz-signal-search-export.git
				synced 2025-11-01 00:50:07 +08:00 
			
		
		
		
	feat: add dialog to manage data
This commit is contained in:
		| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "star-rail-warp-export", |   "name": "star-rail-warp-export", | ||||||
|   "version": "0.0.18", |   "version": "0.1.0", | ||||||
|   "main": "./dist/electron/main/main.js", |   "main": "./dist/electron/main/main.js", | ||||||
|   "author": "biuuu <https://github.com/biuuu>", |   "author": "biuuu <https://github.com/biuuu>", | ||||||
|   "license": "MIT", |   "license": "MIT", | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ | |||||||
|   "ui.setting.cnServer": "CN server", |   "ui.setting.cnServer": "CN server", | ||||||
|   "ui.setting.seaServer": "Global server", |   "ui.setting.seaServer": "Global server", | ||||||
|   "ui.setting.logTypeHint": "Choose which server generated logs to be used first when acquiring URL from game logs", |   "ui.setting.logTypeHint": "Choose which server generated logs to be used first when acquiring URL from game logs", | ||||||
|  |   "ui.setting.dataManagerHint": "Unnecessary data can be deleted", | ||||||
|   "ui.setting.autoUpdate": "Auto update", |   "ui.setting.autoUpdate": "Auto update", | ||||||
|   "ui.setting.hideNovice": "Hide Starter Warp", |   "ui.setting.hideNovice": "Hide Starter Warp", | ||||||
|   "ui.setting.proxyMode": "Proxy mode", |   "ui.setting.proxyMode": "Proxy mode", | ||||||
| @@ -57,6 +58,15 @@ | |||||||
|   "ui.urlDialog.placeholder": "Please enter the URL with authentication information", |   "ui.urlDialog.placeholder": "Please enter the URL with authentication information", | ||||||
|   "ui.common.cancel": "Cancel", |   "ui.common.cancel": "Cancel", | ||||||
|   "ui.common.ok": "OK", |   "ui.common.ok": "OK", | ||||||
|  |   "ui.common.data": "Data", | ||||||
|  |   "ui.common.dataManage": "Data Management", | ||||||
|  |   "ui.common.updateTime": "Update Date", | ||||||
|  |   "ui.common.status": "Status", | ||||||
|  |   "ui.common.action": "Operation", | ||||||
|  |   "ui.common.deleted": "Deleted", | ||||||
|  |   "ui.common.normal": "Normal", | ||||||
|  |   "ui.common.delete": "Delete", | ||||||
|  |   "ui.common.restore": "Restore", | ||||||
|   "log.save.failed": "Failed to save local data", |   "log.save.failed": "Failed to save local data", | ||||||
|   "log.file.notFound": "Unable to find game logs, please make sure you already opened warp history inside the game client", |   "log.file.notFound": "Unable to find game logs, please make sure you already opened warp history inside the game client", | ||||||
|   "log.url.notFound": "Unable to find URL", |   "log.url.notFound": "Unable to find URL", | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ | |||||||
|   "ui.setting.cnServer": "国服", |   "ui.setting.cnServer": "国服", | ||||||
|   "ui.setting.seaServer": "外服", |   "ui.setting.seaServer": "外服", | ||||||
|   "ui.setting.logTypeHint": "使用游戏日志获取URL时,优先选择哪种服务器生成的日志文件。", |   "ui.setting.logTypeHint": "使用游戏日志获取URL时,优先选择哪种服务器生成的日志文件。", | ||||||
|  |   "ui.setting.dataManagerHint": "可以删除不需要的数据。", | ||||||
|   "ui.setting.autoUpdate": "自动更新", |   "ui.setting.autoUpdate": "自动更新", | ||||||
|   "ui.setting.hideNovice": "隐藏新手跃迁", |   "ui.setting.hideNovice": "隐藏新手跃迁", | ||||||
|   "ui.setting.proxyMode": "代理模式", |   "ui.setting.proxyMode": "代理模式", | ||||||
| @@ -57,6 +58,15 @@ | |||||||
|   "ui.urlDialog.placeholder": "请输入带有身份认证信息的URL", |   "ui.urlDialog.placeholder": "请输入带有身份认证信息的URL", | ||||||
|   "ui.common.cancel": "取消", |   "ui.common.cancel": "取消", | ||||||
|   "ui.common.ok": "确定", |   "ui.common.ok": "确定", | ||||||
|  |   "ui.common.data": "数据", | ||||||
|  |   "ui.common.dataManage": "数据管理", | ||||||
|  |   "ui.common.updateTime": "更新日期", | ||||||
|  |   "ui.common.status": "状态", | ||||||
|  |   "ui.common.action": "操作", | ||||||
|  |   "ui.common.deleted": "已删除", | ||||||
|  |   "ui.common.normal": "正常", | ||||||
|  |   "ui.common.delete": "删除", | ||||||
|  |   "ui.common.restore": "恢复", | ||||||
|   "log.save.failed": "保存本地数据失败", |   "log.save.failed": "保存本地数据失败", | ||||||
|   "log.file.notFound": "未找到游戏日志,确认是否已打开游戏抽卡记录", |   "log.file.notFound": "未找到游戏日志,确认是否已打开游戏抽卡记录", | ||||||
|   "log.url.notFound": "未找到URL", |   "log.url.notFound": "未找到URL", | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| const { clipboard, ipcMain } = require('electron') | const { clipboard, ipcMain } = require('electron') | ||||||
| const { getUrl } = require('./getData') | const { getUrl, deleteData } = require('./getData') | ||||||
|  |  | ||||||
| ipcMain.handle('COPY_URL', async () => { | ipcMain.handle('COPY_URL', async () => { | ||||||
|   const url = await getUrl() |   const url = await getUrl() | ||||||
| @@ -8,4 +8,8 @@ ipcMain.handle('COPY_URL', async () => { | |||||||
|     return true |     return true | ||||||
|   } |   } | ||||||
|   return false |   return false | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | ipcMain.handle('DELETE_DATA', async (event, uid, action) => { | ||||||
|  |   await deleteData(uid, action) | ||||||
| }) | }) | ||||||
| @@ -72,6 +72,14 @@ const readData = async () => { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const deleteData = async (uid, action) => { | ||||||
|  |   const data = dataMap.get(uid) | ||||||
|  |   if (data) { | ||||||
|  |     data.deleted = action | ||||||
|  |     await saveData(data) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| const changeCurrent = async (uid) => { | const changeCurrent = async (uid) => { | ||||||
|   config.current = uid |   config.current = uid | ||||||
|   await config.save() |   await config.save() | ||||||
| @@ -513,3 +521,4 @@ exports.getData = () => { | |||||||
| } | } | ||||||
|  |  | ||||||
| exports.getUrl = getUrl | exports.getUrl = getUrl | ||||||
|  | exports.deleteData = deleteData | ||||||
|   | |||||||
| @@ -12,9 +12,9 @@ | |||||||
|         </el-tooltip> |         </el-tooltip> | ||||||
|       </div> |       </div> | ||||||
|       <div class="flex gap-2"> |       <div class="flex gap-2"> | ||||||
|         <el-select v-if="state.status !== 'loading' && state.dataMap && (state.dataMap.size > 1 || (state.dataMap.size === 1 && state.current === 0))" class="w-44"   @change="changeCurrent" v-model="uidSelectText"> |         <el-select v-if="state.status !== 'loading' && dataMap && (dataMap.size > 1 || (dataMap.size === 1 && state.current === 0))" class="w-44"   @change="changeCurrent" v-model="uidSelectText"> | ||||||
|           <el-option |           <el-option | ||||||
|             v-for="item of state.dataMap" |             v-for="item of dataMap" | ||||||
|             :key="item[0]" |             :key="item[0]" | ||||||
|             :label="maskUid(item[0])" |             :label="maskUid(item[0])" | ||||||
|             :value="item[0]"> |             :value="item[0]"> | ||||||
| @@ -43,7 +43,7 @@ | |||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|     <Setting v-show="state.showSetting" :i18n="state.i18n" @changeLang="getI18nData()" @close="showSetting(false)"></Setting> |     <Setting v-show="state.showSetting" :i18n="state.i18n" :gacha-data-info="dataInfo" @refreshData="readData()" @changeLang="getI18nData()" @close="showSetting(false)"></Setting> | ||||||
|  |  | ||||||
|     <el-dialog :title="ui.urlDialog.title" v-model="state.showUrlDlg" width="90%" custom-class="max-w-md"> |     <el-dialog :title="ui.urlDialog.title" v-model="state.showUrlDlg" width="90%" custom-class="max-w-md"> | ||||||
|       <p class="mb-4 text-gray-500">{{ui.urlDialog.hint}}</p> |       <p class="mb-4 text-gray-500">{{ui.urlDialog.hint}}</p> | ||||||
| @@ -68,7 +68,6 @@ | |||||||
|         </div> |         </div> | ||||||
|       </template> |       </template> | ||||||
|     </el-dialog> |     </el-dialog> | ||||||
|  |  | ||||||
|   </div> |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| @@ -98,6 +97,26 @@ const state = reactive({ | |||||||
|   config: {} |   config: {} | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | const dataMap = computed(() => { | ||||||
|  |   const result = new Map() | ||||||
|  |   for (let [uid, data] of state.dataMap) { | ||||||
|  |     if (!data.deleted) { | ||||||
|  |       result.set(uid, data) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   return result | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | const dataInfo = computed(() => { | ||||||
|  |   const result = [] | ||||||
|  |   for (let [uid, data] of state.dataMap) { | ||||||
|  |     result.push({ | ||||||
|  |       uid, time: data.time, deleted: data.deleted | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   return result | ||||||
|  | }) | ||||||
|  |  | ||||||
| const ui = computed(() => { | const ui = computed(() => { | ||||||
|   if (state.i18n) { |   if (state.i18n) { | ||||||
|     return state.i18n.ui |     return state.i18n.ui | ||||||
| @@ -154,7 +173,7 @@ const hint = computed(() => { | |||||||
| }) | }) | ||||||
|  |  | ||||||
| const detail = computed(() => { | const detail = computed(() => { | ||||||
|   const data = state.dataMap.get(state.current) |   const data = dataMap.value.get(state.current) | ||||||
|   if (data) { |   if (data) { | ||||||
|     return gachaDetail(data.result) |     return gachaDetail(data.result) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -19,6 +19,10 @@ | |||||||
|         </el-radio-group> |         </el-radio-group> | ||||||
|         <p class="text-gray-400 text-xs m-1.5">{{text.logTypeHint}}</p> |         <p class="text-gray-400 text-xs m-1.5">{{text.logTypeHint}}</p> | ||||||
|       </el-form-item> |       </el-form-item> | ||||||
|  |       <el-form-item :label="common.data"> | ||||||
|  |         <el-button type="primary" plain @click="state.showDataDialog = true">{{common.dataManage}}</el-button> | ||||||
|  |         <p class="text-gray-400 text-xs m-1.5">{{text.dataManagerHint}}</p> | ||||||
|  |       </el-form-item> | ||||||
|       <el-form-item :label="text.autoUpdate"> |       <el-form-item :label="text.autoUpdate"> | ||||||
|         <el-switch |         <el-switch | ||||||
|           @change="saveSetting" |           @change="saveSetting" | ||||||
| @@ -51,21 +55,49 @@ | |||||||
|     <h3 class="text-lg my-4">{{about.title}}</h3> |     <h3 class="text-lg my-4">{{about.title}}</h3> | ||||||
|     <p class="text-gray-600 text-xs mt-1">{{about.license}}</p> |     <p class="text-gray-600 text-xs mt-1">{{about.license}}</p> | ||||||
|     <p class="text-gray-600 text-xs mt-1 pb-6">Github: <a @click="openGithub" class="cursor-pointer text-blue-400">https://github.com/biuuu/star-rail-warp-export</a></p> |     <p class="text-gray-600 text-xs mt-1 pb-6">Github: <a @click="openGithub" class="cursor-pointer text-blue-400">https://github.com/biuuu/star-rail-warp-export</a></p> | ||||||
|  |     <el-dialog v-model="state.showDataDialog" :title="common.dataManage" width="90%"> | ||||||
|  |     <div class=""> | ||||||
|  |       <el-table :data="gachaDataInfo" border stripe> | ||||||
|  |         <el-table-column property="uid" label="UID" width="128" /> | ||||||
|  |         <el-table-column property="time" :label="common.updateTime"> | ||||||
|  |           <template #default="scope"> | ||||||
|  |             {{ new Date(scope.row.time).toLocaleString() }} | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |         <el-table-column property="deleted" :label="common.status" width="128"> | ||||||
|  |           <template #default="scope"> | ||||||
|  |             <el-tag type="info" size="small" v-if="scope.row.deleted">{{common.deleted}}</el-tag> | ||||||
|  |             <el-tag type="success" size="small" v-else>{{common.normal}}</el-tag> | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |         <el-table-column property="deleted" :label="common.action" width="128"> | ||||||
|  |           <template #default="scope"> | ||||||
|  |             <el-tooltip :content="scope.row.deleted ? common.restore : common.delete" placement="top"> | ||||||
|  |               <el-button :loading="state.dataActionLoading" size="small" icon="refresh" plain type="success" @click="deleteData(scope.row.uid, false)" v-if="scope.row.deleted"></el-button> | ||||||
|  |               <el-button :loading="state.dataActionLoading" size="small" icon="delete" plain type="danger" @click="deleteData(scope.row.uid, true)" v-else></el-button> | ||||||
|  |             </el-tooltip> | ||||||
|  |           </template> | ||||||
|  |         </el-table-column> | ||||||
|  |       </el-table> | ||||||
|  |     </div> | ||||||
|  |   </el-dialog> | ||||||
|   </div> |   </div> | ||||||
|  |  | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script setup> | <script setup> | ||||||
| const { ipcRenderer, shell } = require('electron') | const { ipcRenderer, shell } = require('electron') | ||||||
| import { reactive, onMounted, computed } from 'vue' | import { reactive, onMounted, computed } from 'vue' | ||||||
|  |  | ||||||
| const emit = defineEmits(['close', 'changeLang']) | const emit = defineEmits(['close', 'changeLang', 'refreshData']) | ||||||
|  |  | ||||||
| const props = defineProps({ | const props = defineProps({ | ||||||
|   i18n: Object |   i18n: Object, | ||||||
|  |   gachaDataInfo: Array | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const data = reactive({ | const data = reactive({ | ||||||
|   langMap: new Map() |   langMap: new Map(), | ||||||
| }) | }) | ||||||
|  |  | ||||||
| const settingForm = reactive({ | const settingForm = reactive({ | ||||||
| @@ -77,6 +109,12 @@ const settingForm = reactive({ | |||||||
|   hideNovice: true |   hideNovice: true | ||||||
| }) | }) | ||||||
|  |  | ||||||
|  | const state = reactive({ | ||||||
|  |   showDataDialog: false, | ||||||
|  |   dataActionLoading: false | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | const common = computed(() => props.i18n.ui.common) | ||||||
| const text = computed(() => props.i18n.ui.setting) | const text = computed(() => props.i18n.ui.setting) | ||||||
| const about = computed(() => props.i18n.ui.about) | const about = computed(() => props.i18n.ui.about) | ||||||
|  |  | ||||||
| @@ -105,6 +143,13 @@ const exportUIGFJSON = () => { | |||||||
|   ipcRenderer.invoke('EXPORT_UIGF_JSON') |   ipcRenderer.invoke('EXPORT_UIGF_JSON') | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const deleteData = async (uid, action) => { | ||||||
|  |   state.dataActionLoading = true | ||||||
|  |   await ipcRenderer.invoke('DELETE_DATA', uid, action) | ||||||
|  |   state.dataActionLoading = false | ||||||
|  |   emit('refreshData') | ||||||
|  | } | ||||||
|  |  | ||||||
| onMounted(async () => { | onMounted(async () => { | ||||||
|   data.langMap = await ipcRenderer.invoke('LANG_MAP') |   data.langMap = await ipcRenderer.invoke('LANG_MAP') | ||||||
|   const config = await ipcRenderer.invoke('GET_CONFIG') |   const config = await ipcRenderer.invoke('GET_CONFIG') | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user