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", | ||||
|   "version": "0.0.18", | ||||
|   "version": "0.1.0", | ||||
|   "main": "./dist/electron/main/main.js", | ||||
|   "author": "biuuu <https://github.com/biuuu>", | ||||
|   "license": "MIT", | ||||
|   | ||||
| @@ -42,6 +42,7 @@ | ||||
|   "ui.setting.cnServer": "CN 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.dataManagerHint": "Unnecessary data can be deleted", | ||||
|   "ui.setting.autoUpdate": "Auto update", | ||||
|   "ui.setting.hideNovice": "Hide Starter Warp", | ||||
|   "ui.setting.proxyMode": "Proxy mode", | ||||
| @@ -57,6 +58,15 @@ | ||||
|   "ui.urlDialog.placeholder": "Please enter the URL with authentication information", | ||||
|   "ui.common.cancel": "Cancel", | ||||
|   "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.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", | ||||
|   | ||||
| @@ -42,6 +42,7 @@ | ||||
|   "ui.setting.cnServer": "国服", | ||||
|   "ui.setting.seaServer": "外服", | ||||
|   "ui.setting.logTypeHint": "使用游戏日志获取URL时,优先选择哪种服务器生成的日志文件。", | ||||
|   "ui.setting.dataManagerHint": "可以删除不需要的数据。", | ||||
|   "ui.setting.autoUpdate": "自动更新", | ||||
|   "ui.setting.hideNovice": "隐藏新手跃迁", | ||||
|   "ui.setting.proxyMode": "代理模式", | ||||
| @@ -57,6 +58,15 @@ | ||||
|   "ui.urlDialog.placeholder": "请输入带有身份认证信息的URL", | ||||
|   "ui.common.cancel": "取消", | ||||
|   "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.file.notFound": "未找到游戏日志,确认是否已打开游戏抽卡记录", | ||||
|   "log.url.notFound": "未找到URL", | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| const { clipboard, ipcMain } = require('electron') | ||||
| const { getUrl } = require('./getData') | ||||
| const { getUrl, deleteData } = require('./getData') | ||||
|  | ||||
| ipcMain.handle('COPY_URL', async () => { | ||||
|   const url = await getUrl() | ||||
| @@ -8,4 +8,8 @@ ipcMain.handle('COPY_URL', async () => { | ||||
|     return true | ||||
|   } | ||||
|   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) => { | ||||
|   config.current = uid | ||||
|   await config.save() | ||||
| @@ -513,3 +521,4 @@ exports.getData = () => { | ||||
| } | ||||
|  | ||||
| exports.getUrl = getUrl | ||||
| exports.deleteData = deleteData | ||||
|   | ||||
| @@ -12,9 +12,9 @@ | ||||
|         </el-tooltip> | ||||
|       </div> | ||||
|       <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 | ||||
|             v-for="item of state.dataMap" | ||||
|             v-for="item of dataMap" | ||||
|             :key="item[0]" | ||||
|             :label="maskUid(item[0])" | ||||
|             :value="item[0]"> | ||||
| @@ -43,7 +43,7 @@ | ||||
|         </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"> | ||||
|       <p class="mb-4 text-gray-500">{{ui.urlDialog.hint}}</p> | ||||
| @@ -68,7 +68,6 @@ | ||||
|         </div> | ||||
|       </template> | ||||
|     </el-dialog> | ||||
|  | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| @@ -98,6 +97,26 @@ const state = reactive({ | ||||
|   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(() => { | ||||
|   if (state.i18n) { | ||||
|     return state.i18n.ui | ||||
| @@ -154,7 +173,7 @@ const hint = computed(() => { | ||||
| }) | ||||
|  | ||||
| const detail = computed(() => { | ||||
|   const data = state.dataMap.get(state.current) | ||||
|   const data = dataMap.value.get(state.current) | ||||
|   if (data) { | ||||
|     return gachaDetail(data.result) | ||||
|   } | ||||
|   | ||||
| @@ -19,6 +19,10 @@ | ||||
|         </el-radio-group> | ||||
|         <p class="text-gray-400 text-xs m-1.5">{{text.logTypeHint}}</p> | ||||
|       </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-switch | ||||
|           @change="saveSetting" | ||||
| @@ -51,21 +55,49 @@ | ||||
|     <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 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> | ||||
|  | ||||
| </template> | ||||
|  | ||||
| <script setup> | ||||
| const { ipcRenderer, shell } = require('electron') | ||||
| import { reactive, onMounted, computed } from 'vue' | ||||
|  | ||||
| const emit = defineEmits(['close', 'changeLang']) | ||||
| const emit = defineEmits(['close', 'changeLang', 'refreshData']) | ||||
|  | ||||
| const props = defineProps({ | ||||
|   i18n: Object | ||||
|   i18n: Object, | ||||
|   gachaDataInfo: Array | ||||
| }) | ||||
|  | ||||
| const data = reactive({ | ||||
|   langMap: new Map() | ||||
|   langMap: new Map(), | ||||
| }) | ||||
|  | ||||
| const settingForm = reactive({ | ||||
| @@ -77,6 +109,12 @@ const settingForm = reactive({ | ||||
|   hideNovice: true | ||||
| }) | ||||
|  | ||||
| const state = reactive({ | ||||
|   showDataDialog: false, | ||||
|   dataActionLoading: false | ||||
| }) | ||||
|  | ||||
| const common = computed(() => props.i18n.ui.common) | ||||
| const text = computed(() => props.i18n.ui.setting) | ||||
| const about = computed(() => props.i18n.ui.about) | ||||
|  | ||||
| @@ -105,6 +143,13 @@ const exportUIGFJSON = () => { | ||||
|   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 () => { | ||||
|   data.langMap = await ipcRenderer.invoke('LANG_MAP') | ||||
|   const config = await ipcRenderer.invoke('GET_CONFIG') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user