@gkd-kit/inspect 0.0.1786441848080 → 0.0.1786456238136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/404.html +15 -15
- package/dist/assets/DevicePage-Be8ZSN0U.js +47 -0
- package/dist/assets/{DevicePage-DNVbj8tX.js.map → DevicePage-Be8ZSN0U.js.map} +1 -1
- package/dist/assets/{HomePage-D2aEruQQ.js → HomePage-CD3CjOSq.js} +2 -2
- package/dist/assets/{HomePage-D2aEruQQ.js.map → HomePage-CD3CjOSq.js.map} +1 -1
- package/dist/assets/LogPage-MFWJOsmV.js +537 -0
- package/dist/assets/LogPage-MFWJOsmV.js.map +1 -0
- package/dist/assets/{SelectorPage-Ce-8Ey4j.js → SelectorPage-DY7F7j7k.js} +2 -2
- package/dist/assets/{SelectorPage-Ce-8Ey4j.js.map → SelectorPage-DY7F7j7k.js.map} +1 -1
- package/dist/assets/{SnapshotPage-B3wbMZe9.js → SnapshotPage-CPpVZr0Y.js} +4 -4
- package/dist/assets/{SnapshotPage-B3wbMZe9.js.map → SnapshotPage-CPpVZr0Y.js.map} +1 -1
- package/dist/assets/{TrackGraph-BQKddBFa.js → TrackGraph-BpFP3UnY.js} +2 -2
- package/dist/assets/{TrackGraph-BQKddBFa.js.map → TrackGraph-BpFP3UnY.js.map} +1 -1
- package/dist/assets/chunk-Cj_4bPuj.js +1 -1
- package/dist/assets/{DataTable-Be3zQOAs.js → directives-DTQ7Inwm.js} +2 -2
- package/dist/assets/directives-DTQ7Inwm.js.map +1 -0
- package/dist/assets/{dist-DyplxSMR.js → dist-C9tJZXEA.js} +2 -2
- package/dist/assets/{dist-DyplxSMR.js.map → dist-C9tJZXEA.js.map} +1 -1
- package/dist/assets/{index-AOOj4TvX.css → index-4xuY-9Kk.css} +1 -1
- package/dist/assets/{index-DYFs5TsK.js → index-BuLNtrdE.js} +6 -6
- package/dist/assets/{index-DYFs5TsK.js.map → index-BuLNtrdE.js.map} +1 -1
- package/dist/assets/{selector-CCrKNqwU.js → selector-X1LgfmUe.js} +2 -2
- package/dist/assets/{selector-CCrKNqwU.js.map → selector-X1LgfmUe.js.map} +1 -1
- package/dist/assets/{sql-wasm-browser-BOtwpKqg.js → sql-wasm-browser-BKcMXFDD.js} +2 -2
- package/dist/assets/{sql-wasm-browser-BOtwpKqg.js.map → sql-wasm-browser-BKcMXFDD.js.map} +1 -1
- package/dist/assets/useBatchActions-CQICUx2y.js +6 -0
- package/dist/assets/useBatchActions-CQICUx2y.js.map +1 -0
- package/dist/assets/{worker-entry-sqlite.worker-bRrV1OFi.js → worker-entry-sqlite.worker-DHIt96J_.js} +2 -2
- package/dist/assets/worker-entry-sqlite.worker-DHIt96J_.js.map +1 -0
- package/dist/index.html +15 -15
- package/package.json +1 -1
- package/dist/assets/DataTable-Be3zQOAs.js.map +0 -1
- package/dist/assets/DevicePage-DNVbj8tX.js +0 -47
- package/dist/assets/LogPage-5NLtQrql.js +0 -537
- package/dist/assets/LogPage-5NLtQrql.js.map +0 -1
- package/dist/assets/useBatchActions-DG_zKCiS.js +0 -6
- package/dist/assets/useBatchActions-DG_zKCiS.js.map +0 -1
- package/dist/assets/worker-entry-sqlite.worker-bRrV1OFi.js.map +0 -1
package/dist/404.html
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="zh">
|
|
3
3
|
<head>
|
|
4
|
-
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
4
|
+
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/polyfills-DNsj-kdY.js"></script>
|
|
5
5
|
|
|
6
6
|
<meta charset="UTF-8" />
|
|
7
7
|
<link
|
|
@@ -12,20 +12,20 @@
|
|
|
12
12
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
13
13
|
<meta name="referrer" content="no-referrer" />
|
|
14
14
|
<title>GKD</title>
|
|
15
|
-
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
16
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
17
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
18
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
19
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
20
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
21
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
22
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
23
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
24
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
25
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
26
|
-
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
27
|
-
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
28
|
-
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.
|
|
15
|
+
<script type="module" crossorigin src="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/index-BuLNtrdE.js"></script>
|
|
16
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/preload-helper-BtVJa7tz.js">
|
|
17
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/runtime-core.esm-bundler-Bb-gaXwr.js">
|
|
18
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/discrete-BTrzVGvR.js">
|
|
19
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/buildMatchPatternFn-Bh60_8FV.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/chunk-62oNxeRG.js">
|
|
21
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/localforage-WIQUL5H9.js">
|
|
22
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/log_url-DAv5mPIF.js">
|
|
23
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/Checkbox-BMccKg-D.js">
|
|
24
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/vue-router-BAMbWm35.js">
|
|
25
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/storage-DzFZkTy8.js">
|
|
26
|
+
<link rel="modulepreload" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/check-ICe0_ZVN.js">
|
|
27
|
+
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/localforage-D6OXBwtH.css">
|
|
28
|
+
<link rel="stylesheet" crossorigin href="https://registry.npmmirror.com/@gkd-kit/inspect/0.0.1786456238136/files/dist/assets/index-4xuY-9Kk.css">
|
|
29
29
|
</head>
|
|
30
30
|
<body>
|
|
31
31
|
</body>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import{i as e}from"./chunk-62oNxeRG.js";import{C as t,_n as n,b as r,d as i,r as a}from"./discrete-BTrzVGvR.js";import{n as o}from"./Icon-DCNP04Bv.js";import{u as s}from"./Ellipsis-CIAsWxIX.js";import{$ as c,Dt as ee,F as l,J as u,K as d,M as f,at as p,dt as m,f as h,g,h as _,i as v,it as y,l as b,p as x,q as S,st as C,u as w,v as T,z as E}from"./runtime-core.esm-bundler-Bb-gaXwr.js";import{i as te,n as D}from"./directives-DTQ7Inwm.js";import{t as ne}from"./Input-BAZB1-O8.js";import{t as re}from"./Checkbox-BMccKg-D.js";import{d as O,f as k,m as ie,t as ae}from"./ActionCard-C3CVutCf.js";import{a as oe}from"./vue-router-BAMbWm35.js";import{h as se}from"./localforage-WIQUL5H9.js";import{t as ce}from"./check-ICe0_ZVN.js";import{r as A}from"./chunk-Cj_4bPuj.js";import{r as j,t as M}from"./dist-BPftzEoa.js";import{a as N,n as P,t as le}from"./p-limit-DoaQ2_S9.js";import{i as ue,n as de,t as fe}from"./useBatchActions-CQICUx2y.js";var pe=e=>{let t=C(e),n=C(),r=async(e,n,r)=>{var i;if(!t.value)throw Error(`origin must exist`);let o=await A(new URL(`/api/`+e,t.value),n,r).catch(t=>{throw a.error(`网络错误:`+e),t});if(!o.ok)throw a.error(`接口错误:`+e+`:`+o.status),o;if((i=o.headers.get(`Content-Type`))!=null&&i.includes(`application/json`)){let e=await o.clone().json();if(e.__error)throw a.error(e.message),o}return o},i=async(e,t={},n)=>r(e,{method:`post`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)},n),o=async(e,t={})=>i(e,t).then(e=>e.json()),s=async(e,t={})=>i(e,t,e=>(e.responseType=`arraybuffer`,e)).then(e=>e.arrayBuffer());return{origin:t,api:{getServerInfo:async()=>o(`getServerInfo`),getSnapshot:async e=>{var t;return((t=n.value)==null||(t=t.gkdAppInfo)==null?void 0:t.versionName)===`1.10.4`?r(`snapshot?id=`+e.id).then(e=>e.json()):o(`getSnapshot`,e)},getScreenshot:async e=>s(`getScreenshot`,e),captureSnapshot:async()=>o(`captureSnapshot`),getSnapshots:async()=>o(`getSnapshots`),updateSubscription:async e=>o(`updateSubscription`,{...e,id:-1,name:`内存订阅`,version:0}),execSelector:async e=>(e=structuredClone(e),e.action||=void 0,o(`execSelector`,e)),deleteSnapshot:async e=>o(`deleteSnapshot`,e)},serverInfo:n}},me=e(M(),1),he={flex:``,"gap-10px":``,"flex-items-center":``},ge={"page-size":``,flex:``,"flex-col":``,"p-10px":``,"gap-10px":``},F={flex:``,"items-center":``,"gap-24px":``},I={key:0,gkd_code:``,"pl-16px":``,"whitespace-nowrap":``,flex:``,"items-center":``},L=T({__name:`DevicePage`,setup(e){let T=oe(),{api:A,origin:M,serverInfo:L}=pe(),R=i(`device_link`,``),z=k(async()=>{R.value&&(M.value=j(()=>new URL(R.value.trim()),()=>`非法设备地址`).origin,R.value=M.value,L.value=await A.getServerInfo())}),B=b(()=>{if(!L.value)return`未连接设备`;let e=L.value.device,t=L.value.gkdAppInfo;return`${e.manufacturer} Android${e.release} - GKD${t.versionName}`});f(async()=>{await se(500),ce(R.value)&&z.invoke()});let V=C([]);S(async()=>{if(!L.value)return;document.title=B.value;let e=await A.getSnapshots();e.sort((e,t)=>t.id-e.id),V.value=e,Y.value=``});let H=k(async()=>{let e=await A.captureSnapshot(),t=await A.getScreenshot({id:e.id});await N.setItem(e.id,e),await P.setItem(e.id,t),a.success(`捕获并保存快照成功`);let n=await A.getSnapshots();n.sort((e,t)=>t.id-e.id),V.value=n}),U=k(async()=>{let e=(await A.getSnapshots()).map(e=>e.id),t=new Set((await P.keys()).map(e=>parseInt(e))),n=e.filter(e=>!t.has(e));if(n.length==0){a.success(`没有新记录可导入`);return}let r=0,i=le(3);await Promise.all(n.map(e=>i(async()=>{let[t,n]=await Promise.all([A.getSnapshot({id:e}),A.getScreenshot({id:e})]);t.nodes&&(await Promise.all([N.setItem(e,t),P.setItem(e,n)]),r++)}))),a.success(`导入${r}条新记录`)}),{activityIdCol:_e,appIdCol:ve,appNameCol:ye,ctimeCol:W,appVersionCodeCol:be,appVersionNameCol:xe,resetColWidth:Se}=ue(),Ce=e=>{e.columnKey==W.key&&(W.sortOrder=e.order)},G=O(async e=>{if(!await N.hasItem(e.id)){let t=await A.getSnapshot({id:e.id});await N.setItem(e.id,t)}if(!await P.hasItem(e.id)){let t=await A.getScreenshot({id:e.id});await P.setItem(e.id,t)}window.open(T.resolve({name:`snapshot`,params:{snapshotId:e.id}}).href)},e=>e.id),we=[{type:`selection`},W,ye,ve,be,xe,_e,{key:`actions`,title:`操作`,fixed:`right`,width:`160px`,render(e){return g(ae,{snapshot:e,showExport:!1,showShare:!1,deleteConfirmText:`是否确认删除? 此操作不可恢复!\n快照ID:${e.id}`,onPreview:()=>G.invoke(e),previewLoading:G.loading[e.id],onBeforeDelete:async()=>await A.deleteSnapshot({id:e.id}),onDelete:()=>{V.value=V.value.filter(t=>t.id!==e.id)}},null)}}],K=y([]),{batchDelete:Te}=fe(K,{beforeDeleteItem:async e=>await A.deleteSnapshot({id:e}),onAfterDelete:async()=>{let e=await A.getSnapshots();e.sort((e,t)=>t.id-e.id),V.value=e}}),q=p({page:1,pageSize:50,showSizePicker:!0,pageSizes:[50,100],onChange:e=>{q.page=e},onUpdatePageSize:e=>{q.pageSize=e,q.page=1}});d(q,Se);let J=C(!1),Y=C(``),X=k(async()=>{let e=j(()=>me.default.parse(Y.value.trim()));if(e){if(e.categories||e.globalGroups||e.apps)await A.updateSubscription(e);else if(typeof e.id==`string`)await A.updateSubscription({apps:[e]});else if(Array.isArray(e)&&typeof e[0].id==`string`)await A.updateSubscription({apps:e});else if(typeof e.key==`number`)await A.updateSubscription({globalGroups:[e]});else if(Array.isArray(e)&&typeof e[0].key==`number`)await A.updateSubscription({globalGroups:e});else{a.error(`无法识别的订阅文本`);return}a.success(`修改成功`)}}),Z=C(!1),Ee=[{label:`仅查询`,value:``},{value:`click`,label:`click`},{value:`clickNode`,label:`clickNode`},{value:`clickCenter`,label:`clickCenter`},{value:`back`,label:`back`},{value:`longClick`,label:`longClick`},{value:`longClickNode`,label:`longClickNode`},{value:`longClickCenter`,label:`longClickCenter`}],Q=p({selector:``,action:`click`,quickFind:!1}),$=k(async()=>{let e=await A.execSelector({...Q,fastQuery:Q.quickFind});if(e.message){a.success(`操作成功:`+e.message);return}e.action?a.success((e.result?`操作成功:`:`操作失败`)+e.action):!e.action&&e.result&&a.success(`查询成功`)});return(e,i)=>{let a=ne,d=r,f=re,p=ie,y=te,b=E(`SvgIcon`),S=t,C=E(`RouterLink`),T=o,O=s,k=D;return l(),x(v,null,[g(d,{show:m(J),"onUpdate:show":i[1]||=e=>c(J)?J.value=e:null,preset:`dialog`,style:{width:`800px`},title:`修改内存订阅`,positiveText:`确认`,positiveButtonProps:{loading:m(X).loading,onClick(){m(X).invoke()}}},{default:u(()=>[g(a,{value:m(Y),"onUpdate:value":i[0]||=e=>c(Y)?Y.value=e:null,disabled:m(X).loading,type:`textarea`,class:`gkd_code`,autosize:{minRows:20,maxRows:25},placeholder:m(`请输入订阅文本(JSON5语法):
|
|
2
|
+
示例1-更新单个应用的规则:
|
|
3
|
+
{
|
|
4
|
+
id: 'appId',
|
|
5
|
+
groups: []
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
示例2-更新多个应用的规则:
|
|
9
|
+
[
|
|
10
|
+
{
|
|
11
|
+
id: 'appId1',
|
|
12
|
+
groups: []
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
id: 'appId2',
|
|
16
|
+
groups: []
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
示例3-更新全局规则(1.7.0):
|
|
21
|
+
{
|
|
22
|
+
name: '全局规则-1',
|
|
23
|
+
key: 0,
|
|
24
|
+
rules: []
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
示例3-更新多个全局规则(1.7.0):
|
|
28
|
+
[
|
|
29
|
+
{
|
|
30
|
+
name: '全局规则-1',
|
|
31
|
+
key: 0,
|
|
32
|
+
rules: []
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: '全局规则-2',
|
|
36
|
+
key: 1,
|
|
37
|
+
rules: []
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
示例4-更新整个订阅(1.7.0):
|
|
42
|
+
{
|
|
43
|
+
apps: [],
|
|
44
|
+
globalGroups: [],
|
|
45
|
+
categories: [],
|
|
46
|
+
}`)},null,8,[`value`,`disabled`,`placeholder`])]),_:1},8,[`show`,`positiveButtonProps`]),g(d,{show:m(Z),"onUpdate:show":i[5]||=e=>c(Z)?Z.value=e:null,preset:`dialog`,style:{width:`800px`},title:`执行选择器`,positiveText:`确认`,positiveButtonProps:{loading:m($).loading,onClick(){m($).invoke()}}},{default:u(()=>[g(a,{value:m(Q).selector,"onUpdate:value":i[2]||=e=>m(Q).selector=e,disabled:m($).loading,type:`textarea`,class:`gkd_code`,autosize:{minRows:4,maxRows:10},placeholder:`请输入合法的选择器`},null,8,[`value`,`disabled`]),i[13]||=w(`div`,{"h-15px":``},null,-1),g(p,null,{default:u(()=>[g(f,{checked:m(Q).quickFind,"onUpdate:checked":i[3]||=e=>m(Q).quickFind=e},{default:u(()=>[...i[10]||=[_(` 快速查找 `,-1)]]),_:1},8,[`checked`]),i[11]||=w(`a`,{href:`https://gkd.li/api/interfaces/RawCommonProps.html#quickfind`,target:`_blank`,rel:`noopener noreferrer`},` 查找说明 `,-1)]),_:1}),i[14]||=w(`div`,{"h-10px":``},null,-1),w(`div`,he,[g(y,{value:m(Q).action,"onUpdate:value":i[4]||=e=>m(Q).action=e,options:Ee,class:`w-150px`},null,8,[`value`]),i[12]||=w(`a`,{href:`https://gkd.li/api/interfaces/RawRuleProps#action`,target:`_blank`,rel:`noopener noreferrer`},` 操作说明 `,-1)])]),_:1},8,[`show`,`positiveButtonProps`]),w(`div`,ge,[w(`div`,F,[g(C,{to:`/`,class:`flex ml-12px`,title:`首页`},{default:u(()=>[g(S,{text:``,style:{"--n-icon-size":`24px`}},{icon:u(()=>[g(b,{name:`home`})]),_:1})]),_:1}),g(O,null,{default:u(()=>[g(a,{value:m(R),"onUpdate:value":i[6]||=e=>c(R)?R.value=e:null,placeholder:`请输入设备地址`,class:`gkd_code`,style:{width:`240px`},onKeyup:n(m(z).invoke,[`enter`])},{suffix:u(()=>[g(T,null,{trigger:u(()=>[g(S,{text:``,style:{"--n-icon-size":`20px`},loading:m(z).loading,onClick:m(z).invoke},{icon:u(()=>[g(b,{name:`refresh`})]),_:1},8,[`loading`,`onClick`])]),default:u(()=>[i[15]||=_(` 刷新连接 `,-1)]),_:1})]),_:1},8,[`value`,`onKeyup`]),m(L)?(l(),x(`div`,I,ee(m(B)),1)):h(``,!0)]),_:1}),m(L)?(l(),x(v,{key:0},[g(de,{checkedCount:m(K).length,batchDelete:m(Te)},null,8,[`checkedCount`,`batchDelete`]),g(T,null,{trigger:u(()=>[g(S,{text:``,style:{"--n-icon-size":`24px`},loading:m(H).loading,onClick:m(H).invoke},{icon:u(()=>[g(b,{name:`Snapshot`})]),_:1},8,[`loading`,`onClick`])]),default:u(()=>[i[16]||=_(` 捕获快照 `,-1)]),_:1}),g(T,null,{trigger:u(()=>[g(S,{text:``,style:{"--n-icon-size":`24px`},loading:m(U).loading,onClick:m(U).invoke},{icon:u(()=>[g(b,{name:`Down-all`})]),_:1},8,[`loading`,`onClick`])]),default:u(()=>[i[17]||=_(` 下载所有快照 `,-1)]),_:1}),g(T,null,{trigger:u(()=>[g(S,{text:``,style:{"--n-icon-size":`24px`},onClick:i[7]||=e=>J.value=!0},{icon:u(()=>[g(b,{name:`CacheSub`})]),_:1})]),default:u(()=>[i[18]||=_(` 修改内存订阅 `,-1)]),_:1}),g(T,null,{trigger:u(()=>[g(S,{text:``,style:{"--n-icon-size":`24px`},onClick:i[8]||=e=>Z.value=!0},{icon:u(()=>[g(b,{name:`Exe-Sel`})]),_:1})]),default:u(()=>[i[19]||=_(` 执行选择器 `,-1)]),_:1})],64)):h(``,!0)]),g(k,{checkedRowKeys:m(K),"onUpdate:checkedRowKeys":i[9]||=e=>c(K)?K.value=e:null,striped:``,"flex-height":``,data:m(V),columns:we,pagination:m(q),rowKey:e=>e.id,size:`small`,class:`flex-1`,scrollX:1200,"onUpdate:sorter":Ce},null,8,[`checkedRowKeys`,`data`,`pagination`,`rowKey`])])],64)}}});export{L as default};
|
|
47
|
+
//# sourceMappingURL=DevicePage-Be8ZSN0U.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevicePage-DNVbj8tX.js","names":[],"sources":["../../src/utils/api.ts","../../src/views/DevicePage.vue","../../src/views/DevicePage.vue"],"sourcesContent":["import { message } from './discrete';\nimport { enhanceFetch } from './fetch';\nimport type { GmXhrOptions } from './gm';\n\ninterface Reqid {\n id: number;\n}\n\nexport const useDeviceApi = (initOrigin?: string) => {\n const origin = shallowRef(initOrigin);\n const serverInfo = shallowRef<ServerInfo>();\n const request = async (\n name: string,\n init?: RequestInit,\n xhrDetails?: (arg: GmXhrOptions) => GmXhrOptions,\n ) => {\n if (!origin.value) {\n throw new Error(`origin must exist`);\n }\n const u = new URL(`/api/` + name, origin.value);\n const response = await enhanceFetch(u, init, xhrDetails).catch((e) => {\n message.error(`网络错误:` + name);\n throw e;\n });\n if (!response.ok) {\n message.error(`接口错误:` + name + `:` + response.status);\n throw response;\n }\n if (response.headers.get(`Content-Type`)?.includes(`application/json`)) {\n const error = (await response.clone().json()) as RpcError;\n if (error.__error) {\n message.error(error.message);\n throw response;\n }\n }\n return response;\n };\n const baseRpc = async (\n name: string,\n data: object = {},\n xhrDetails?: (arg: GmXhrOptions) => GmXhrOptions,\n ) => {\n return request(\n name,\n {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n },\n xhrDetails,\n );\n };\n const jsonRpc = async <T>(name: string, data: object = {}): Promise<T> => {\n return baseRpc(name, data).then((r) => r.json());\n };\n const bfRpc = async (\n name: string,\n data: object = {},\n ): Promise<ArrayBuffer> => {\n return baseRpc(name, data, (v) => {\n // must set responseType to get binary data\n v.responseType = 'arraybuffer';\n return v;\n }).then((r) => r.arrayBuffer());\n };\n const api = {\n getServerInfo: async () => jsonRpc<ServerInfo>(`getServerInfo`),\n getSnapshot: async (data: Reqid): Promise<Snapshot> => {\n if (serverInfo.value?.gkdAppInfo?.versionName === '1.10.4') {\n // 兼容旧版本 BUG\n // https://github.com/gkd-kit/gkd/blob/v1.10.4/app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt#L198\n return request('snapshot?id=' + data.id).then((r) => r.json());\n }\n return jsonRpc(`getSnapshot`, data);\n },\n getScreenshot: async (data: Reqid) => {\n return bfRpc(`getScreenshot`, data);\n },\n captureSnapshot: async () => jsonRpc<Snapshot>(`captureSnapshot`),\n getSnapshots: async () => jsonRpc<Snapshot[]>(`getSnapshots`),\n updateSubscription: async (data: any) => {\n return jsonRpc(`updateSubscription`, {\n ...data,\n id: -1,\n name: '内存订阅',\n version: 0,\n });\n },\n execSelector: async (data: {\n selector: string;\n action?: string;\n fastQuery?: boolean;\n }) => {\n data = structuredClone(data);\n data.action ||= undefined;\n return jsonRpc<{ message: string; action: string; result: boolean }>(\n `execSelector`,\n data,\n );\n },\n deleteSnapshot: async (data: Reqid) => {\n return jsonRpc<{ message: string }>(`deleteSnapshot`, data);\n },\n };\n return { origin, api, serverInfo };\n};\n","<script setup lang=\"tsx\">\nimport { useDeviceApi } from '@/utils/api';\nimport { toValidURL } from '@/utils/check';\nimport { message } from '@/utils/discrete';\nimport { errorWrap } from '@/utils/error';\nimport { delay } from '@/utils/others';\nimport { screenshotStorage, snapshotStorage } from '@/utils/snapshot';\nimport { useSnapshotColumns } from '@/utils/table';\nimport { useBatchTask, useTask } from '@/utils/task';\nimport type { DataTableColumns, PaginationProps } from 'naive-ui';\nimport type { SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport JSON5 from 'json5';\nimport ActionCard from '@/components/ActionCard.vue';\nimport BatchActionsBar from '@/components/BatchActionsBar.vue';\nimport { useBatchActions } from '@/composables/useBatchActions';\n\nconst router = useRouter();\nconst { api, origin, serverInfo } = useDeviceApi();\nconst link = useStorage(`device_link`, ``);\nconst connect = useTask(async () => {\n if (!link.value) return;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n serverInfo.value = await api.getServerInfo();\n});\n\nconst serverTitle = computed(() => {\n if (!serverInfo.value) return '未连接设备';\n const d = serverInfo.value.device;\n const g = serverInfo.value.gkdAppInfo;\n return `${d.manufacturer} Android${d.release} - GKD${g.versionName}`;\n});\n\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nwatchEffect(async () => {\n if (!serverInfo.value) return;\n document.title = serverTitle.value;\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n subsText.value = '';\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.getScreenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`捕获并保存快照成功`);\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.getSnapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.getSnapshot({ id: snapshotId }),\n api.getScreenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n resetColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n const obj = await api.getSnapshot({ id: row.id });\n await snapshotStorage.setItem(row.id, obj);\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.getScreenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n {\n type: 'selection',\n },\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `160px`,\n render(row) {\n return (\n <ActionCard\n snapshot={row}\n showExport={false}\n showShare={false}\n deleteConfirmText={`是否确认删除? 此操作不可恢复!\\n快照ID:${row.id}`}\n onPreview={() => previewSnapshot.invoke(row)}\n previewLoading={previewSnapshot.loading[row.id]}\n onBeforeDelete={async () => await api.deleteSnapshot({ id: row.id })}\n onDelete={() => {\n snapshots.value = snapshots.value.filter((s) => s.id !== row.id);\n }}\n />\n );\n },\n },\n];\n\nconst checkedRowKeys = ref<number[]>([]);\nconst { batchDelete } = useBatchActions(checkedRowKeys, {\n beforeDeleteItem: async (id) => await api.deleteSnapshot({ id }),\n onAfterDelete: async () => {\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n },\n});\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n },\n});\nwatch(pagination, resetColWidth);\n\nconst showSubsModel = shallowRef(false);\nconst subsText = shallowRef(``);\nconst updateSubs = useTask(async () => {\n const data = errorWrap(() => JSON5.parse(subsText.value.trim()));\n if (!data) return;\n if (data.categories || data.globalGroups || data.apps) {\n await api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await api.updateSubscription({\n apps: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await api.updateSubscription({\n apps: data,\n });\n } else if (typeof data.key == 'number') {\n await api.updateSubscription({\n globalGroups: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await api.updateSubscription({\n globalGroups: data,\n });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions: {\n value?: string;\n label: string;\n}[] = [\n {\n label: '仅查询',\n value: ``,\n },\n {\n value: 'click',\n label: 'click',\n },\n {\n value: 'clickNode',\n label: 'clickNode',\n },\n {\n value: 'clickCenter',\n label: 'clickCenter',\n },\n {\n value: 'back',\n label: 'back',\n },\n {\n value: 'longClick',\n label: 'longClick',\n },\n {\n value: 'longClickNode',\n label: 'longClickNode',\n },\n {\n value: 'longClickCenter',\n label: 'longClickCenter',\n },\n];\nconst clickAction = shallowReactive({\n selector: ``,\n action: 'click',\n quickFind: false,\n});\nconst execSelector = useTask(async () => {\n const result = await api.execSelector({\n ...clickAction,\n fastQuery: clickAction.quickFind,\n });\n if (result.message) {\n message.success(`操作成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `操作成功:` : `操作失败`) + result.action);\n } else if (!result.action && result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst placeholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\n</script>\n<template>\n <NModal\n v-model:show=\"showSubsModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubs.loading,\n onClick() {\n updateSubs.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"subsText\"\n :disabled=\"updateSubs.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 20,\n maxRows: 25,\n }\"\n :placeholder=\"placeholder\"\n />\n </NModal>\n <NModal\n v-model:show=\"showSelectorModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: execSelector.loading,\n onClick() {\n execSelector.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"clickAction.selector\"\n :disabled=\"execSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 4,\n maxRows: 10,\n }\"\n placeholder=\"请输入合法的选择器\"\n />\n <div h-15px />\n <NSpace>\n <NCheckbox v-model:checked=\"clickAction.quickFind\"> 快速查找 </NCheckbox>\n <a\n href=\"https://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px />\n <div flex gap-10px flex-items-center>\n <NSelect\n v-model:value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n />\n <a\n href=\"https://gkd.li/api/interfaces/RawRuleProps#action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <div page-size flex flex-col p-10px gap-10px>\n <div flex items-center gap-24px>\n <RouterLink to=\"/\" class=\"flex ml-12px\" title=\"首页\">\n <NButton text style=\"--n-icon-size: 24px\">\n <template #icon>\n <SvgIcon name=\"home\" />\n </template>\n </NButton>\n </RouterLink>\n <NInputGroup>\n <NInput\n v-model:value=\"link\"\n placeholder=\"请输入设备地址\"\n class=\"gkd_code\"\n :style=\"{ width: `240px` }\"\n @keyup.enter=\"connect.invoke\"\n >\n <template #suffix>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 20px\"\n :loading=\"connect.loading\"\n @click=\"connect.invoke\"\n >\n <template #icon><SvgIcon name=\"refresh\" /></template>\n </NButton>\n </template>\n 刷新连接\n </NTooltip>\n </template>\n </NInput>\n\n <div\n v-if=\"serverInfo\"\n gkd_code\n pl-16px\n whitespace-nowrap\n flex\n items-center\n >\n {{ serverTitle }}\n </div>\n </NInputGroup>\n <template v-if=\"serverInfo\">\n <BatchActionsBar\n :checkedCount=\"checkedRowKeys.length\"\n :batchDelete=\"batchDelete\"\n />\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"captureSnapshot.loading\"\n @click=\"captureSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Snapshot\" /></template>\n </NButton>\n </template>\n 捕获快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"downloadAllSnapshot.loading\"\n @click=\"downloadAllSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Down-all\" /></template>\n </NButton>\n </template>\n 下载所有快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSubsModel = true\"\n >\n <template #icon><SvgIcon name=\"CacheSub\" /></template>\n </NButton>\n </template>\n 修改内存订阅\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSelectorModel = true\"\n >\n <template #icon><SvgIcon name=\"Exe-Sel\" /></template>\n </NButton>\n </template>\n 执行选择器\n </NTooltip>\n </template>\n </div>\n <NDataTable\n v-model:checkedRowKeys=\"checkedRowKeys\"\n striped\n flex-height\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n @update:sorter=\"handleSorterChange\"\n />\n </div>\n</template>\n","<script setup lang=\"tsx\">\nimport { useDeviceApi } from '@/utils/api';\nimport { toValidURL } from '@/utils/check';\nimport { message } from '@/utils/discrete';\nimport { errorWrap } from '@/utils/error';\nimport { delay } from '@/utils/others';\nimport { screenshotStorage, snapshotStorage } from '@/utils/snapshot';\nimport { useSnapshotColumns } from '@/utils/table';\nimport { useBatchTask, useTask } from '@/utils/task';\nimport type { DataTableColumns, PaginationProps } from 'naive-ui';\nimport type { SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport JSON5 from 'json5';\nimport ActionCard from '@/components/ActionCard.vue';\nimport BatchActionsBar from '@/components/BatchActionsBar.vue';\nimport { useBatchActions } from '@/composables/useBatchActions';\n\nconst router = useRouter();\nconst { api, origin, serverInfo } = useDeviceApi();\nconst link = useStorage(`device_link`, ``);\nconst connect = useTask(async () => {\n if (!link.value) return;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n serverInfo.value = await api.getServerInfo();\n});\n\nconst serverTitle = computed(() => {\n if (!serverInfo.value) return '未连接设备';\n const d = serverInfo.value.device;\n const g = serverInfo.value.gkdAppInfo;\n return `${d.manufacturer} Android${d.release} - GKD${g.versionName}`;\n});\n\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nwatchEffect(async () => {\n if (!serverInfo.value) return;\n document.title = serverTitle.value;\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n subsText.value = '';\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.getScreenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`捕获并保存快照成功`);\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.getSnapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.getSnapshot({ id: snapshotId }),\n api.getScreenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n resetColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n const obj = await api.getSnapshot({ id: row.id });\n await snapshotStorage.setItem(row.id, obj);\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.getScreenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n {\n type: 'selection',\n },\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `160px`,\n render(row) {\n return (\n <ActionCard\n snapshot={row}\n showExport={false}\n showShare={false}\n deleteConfirmText={`是否确认删除? 此操作不可恢复!\\n快照ID:${row.id}`}\n onPreview={() => previewSnapshot.invoke(row)}\n previewLoading={previewSnapshot.loading[row.id]}\n onBeforeDelete={async () => await api.deleteSnapshot({ id: row.id })}\n onDelete={() => {\n snapshots.value = snapshots.value.filter((s) => s.id !== row.id);\n }}\n />\n );\n },\n },\n];\n\nconst checkedRowKeys = ref<number[]>([]);\nconst { batchDelete } = useBatchActions(checkedRowKeys, {\n beforeDeleteItem: async (id) => await api.deleteSnapshot({ id }),\n onAfterDelete: async () => {\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n },\n});\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n },\n});\nwatch(pagination, resetColWidth);\n\nconst showSubsModel = shallowRef(false);\nconst subsText = shallowRef(``);\nconst updateSubs = useTask(async () => {\n const data = errorWrap(() => JSON5.parse(subsText.value.trim()));\n if (!data) return;\n if (data.categories || data.globalGroups || data.apps) {\n await api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await api.updateSubscription({\n apps: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await api.updateSubscription({\n apps: data,\n });\n } else if (typeof data.key == 'number') {\n await api.updateSubscription({\n globalGroups: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await api.updateSubscription({\n globalGroups: data,\n });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions: {\n value?: string;\n label: string;\n}[] = [\n {\n label: '仅查询',\n value: ``,\n },\n {\n value: 'click',\n label: 'click',\n },\n {\n value: 'clickNode',\n label: 'clickNode',\n },\n {\n value: 'clickCenter',\n label: 'clickCenter',\n },\n {\n value: 'back',\n label: 'back',\n },\n {\n value: 'longClick',\n label: 'longClick',\n },\n {\n value: 'longClickNode',\n label: 'longClickNode',\n },\n {\n value: 'longClickCenter',\n label: 'longClickCenter',\n },\n];\nconst clickAction = shallowReactive({\n selector: ``,\n action: 'click',\n quickFind: false,\n});\nconst execSelector = useTask(async () => {\n const result = await api.execSelector({\n ...clickAction,\n fastQuery: clickAction.quickFind,\n });\n if (result.message) {\n message.success(`操作成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `操作成功:` : `操作失败`) + result.action);\n } else if (!result.action && result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst placeholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\n</script>\n<template>\n <NModal\n v-model:show=\"showSubsModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubs.loading,\n onClick() {\n updateSubs.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"subsText\"\n :disabled=\"updateSubs.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 20,\n maxRows: 25,\n }\"\n :placeholder=\"placeholder\"\n />\n </NModal>\n <NModal\n v-model:show=\"showSelectorModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: execSelector.loading,\n onClick() {\n execSelector.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"clickAction.selector\"\n :disabled=\"execSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 4,\n maxRows: 10,\n }\"\n placeholder=\"请输入合法的选择器\"\n />\n <div h-15px />\n <NSpace>\n <NCheckbox v-model:checked=\"clickAction.quickFind\"> 快速查找 </NCheckbox>\n <a\n href=\"https://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px />\n <div flex gap-10px flex-items-center>\n <NSelect\n v-model:value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n />\n <a\n href=\"https://gkd.li/api/interfaces/RawRuleProps#action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <div page-size flex flex-col p-10px gap-10px>\n <div flex items-center gap-24px>\n <RouterLink to=\"/\" class=\"flex ml-12px\" title=\"首页\">\n <NButton text style=\"--n-icon-size: 24px\">\n <template #icon>\n <SvgIcon name=\"home\" />\n </template>\n </NButton>\n </RouterLink>\n <NInputGroup>\n <NInput\n v-model:value=\"link\"\n placeholder=\"请输入设备地址\"\n class=\"gkd_code\"\n :style=\"{ width: `240px` }\"\n @keyup.enter=\"connect.invoke\"\n >\n <template #suffix>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 20px\"\n :loading=\"connect.loading\"\n @click=\"connect.invoke\"\n >\n <template #icon><SvgIcon name=\"refresh\" /></template>\n </NButton>\n </template>\n 刷新连接\n </NTooltip>\n </template>\n </NInput>\n\n <div\n v-if=\"serverInfo\"\n gkd_code\n pl-16px\n whitespace-nowrap\n flex\n items-center\n >\n {{ serverTitle }}\n </div>\n </NInputGroup>\n <template v-if=\"serverInfo\">\n <BatchActionsBar\n :checkedCount=\"checkedRowKeys.length\"\n :batchDelete=\"batchDelete\"\n />\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"captureSnapshot.loading\"\n @click=\"captureSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Snapshot\" /></template>\n </NButton>\n </template>\n 捕获快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"downloadAllSnapshot.loading\"\n @click=\"downloadAllSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Down-all\" /></template>\n </NButton>\n </template>\n 下载所有快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSubsModel = true\"\n >\n <template #icon><SvgIcon name=\"CacheSub\" /></template>\n </NButton>\n </template>\n 修改内存订阅\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSelectorModel = true\"\n >\n <template #icon><SvgIcon name=\"Exe-Sel\" /></template>\n </NButton>\n </template>\n 执行选择器\n </NTooltip>\n </template>\n </div>\n <NDataTable\n v-model:checkedRowKeys=\"checkedRowKeys\"\n striped\n flex-height\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n @update:sorter=\"handleSorterChange\"\n />\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DevicePage-Be8ZSN0U.js","names":[],"sources":["../../src/utils/api.ts","../../src/views/DevicePage.vue","../../src/views/DevicePage.vue"],"sourcesContent":["import { message } from './discrete';\nimport { enhanceFetch } from './fetch';\nimport type { GmXhrOptions } from './gm';\n\ninterface Reqid {\n id: number;\n}\n\nexport const useDeviceApi = (initOrigin?: string) => {\n const origin = shallowRef(initOrigin);\n const serverInfo = shallowRef<ServerInfo>();\n const request = async (\n name: string,\n init?: RequestInit,\n xhrDetails?: (arg: GmXhrOptions) => GmXhrOptions,\n ) => {\n if (!origin.value) {\n throw new Error(`origin must exist`);\n }\n const u = new URL(`/api/` + name, origin.value);\n const response = await enhanceFetch(u, init, xhrDetails).catch((e) => {\n message.error(`网络错误:` + name);\n throw e;\n });\n if (!response.ok) {\n message.error(`接口错误:` + name + `:` + response.status);\n throw response;\n }\n if (response.headers.get(`Content-Type`)?.includes(`application/json`)) {\n const error = (await response.clone().json()) as RpcError;\n if (error.__error) {\n message.error(error.message);\n throw response;\n }\n }\n return response;\n };\n const baseRpc = async (\n name: string,\n data: object = {},\n xhrDetails?: (arg: GmXhrOptions) => GmXhrOptions,\n ) => {\n return request(\n name,\n {\n method: 'post',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(data),\n },\n xhrDetails,\n );\n };\n const jsonRpc = async <T>(name: string, data: object = {}): Promise<T> => {\n return baseRpc(name, data).then((r) => r.json());\n };\n const bfRpc = async (\n name: string,\n data: object = {},\n ): Promise<ArrayBuffer> => {\n return baseRpc(name, data, (v) => {\n // must set responseType to get binary data\n v.responseType = 'arraybuffer';\n return v;\n }).then((r) => r.arrayBuffer());\n };\n const api = {\n getServerInfo: async () => jsonRpc<ServerInfo>(`getServerInfo`),\n getSnapshot: async (data: Reqid): Promise<Snapshot> => {\n if (serverInfo.value?.gkdAppInfo?.versionName === '1.10.4') {\n // 兼容旧版本 BUG\n // https://github.com/gkd-kit/gkd/blob/v1.10.4/app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt#L198\n return request('snapshot?id=' + data.id).then((r) => r.json());\n }\n return jsonRpc(`getSnapshot`, data);\n },\n getScreenshot: async (data: Reqid) => {\n return bfRpc(`getScreenshot`, data);\n },\n captureSnapshot: async () => jsonRpc<Snapshot>(`captureSnapshot`),\n getSnapshots: async () => jsonRpc<Snapshot[]>(`getSnapshots`),\n updateSubscription: async (data: any) => {\n return jsonRpc(`updateSubscription`, {\n ...data,\n id: -1,\n name: '内存订阅',\n version: 0,\n });\n },\n execSelector: async (data: {\n selector: string;\n action?: string;\n fastQuery?: boolean;\n }) => {\n data = structuredClone(data);\n data.action ||= undefined;\n return jsonRpc<{ message: string; action: string; result: boolean }>(\n `execSelector`,\n data,\n );\n },\n deleteSnapshot: async (data: Reqid) => {\n return jsonRpc<{ message: string }>(`deleteSnapshot`, data);\n },\n };\n return { origin, api, serverInfo };\n};\n","<script setup lang=\"tsx\">\nimport { useDeviceApi } from '@/utils/api';\nimport { toValidURL } from '@/utils/check';\nimport { message } from '@/utils/discrete';\nimport { errorWrap } from '@/utils/error';\nimport { delay } from '@/utils/others';\nimport { screenshotStorage, snapshotStorage } from '@/utils/snapshot';\nimport { useSnapshotColumns } from '@/utils/table';\nimport { useBatchTask, useTask } from '@/utils/task';\nimport type { DataTableColumns, PaginationProps } from 'naive-ui';\nimport type { SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport JSON5 from 'json5';\nimport ActionCard from '@/components/ActionCard.vue';\nimport BatchActionsBar from '@/components/BatchActionsBar.vue';\nimport { useBatchActions } from '@/composables/useBatchActions';\n\nconst router = useRouter();\nconst { api, origin, serverInfo } = useDeviceApi();\nconst link = useStorage(`device_link`, ``);\nconst connect = useTask(async () => {\n if (!link.value) return;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n serverInfo.value = await api.getServerInfo();\n});\n\nconst serverTitle = computed(() => {\n if (!serverInfo.value) return '未连接设备';\n const d = serverInfo.value.device;\n const g = serverInfo.value.gkdAppInfo;\n return `${d.manufacturer} Android${d.release} - GKD${g.versionName}`;\n});\n\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nwatchEffect(async () => {\n if (!serverInfo.value) return;\n document.title = serverTitle.value;\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n subsText.value = '';\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.getScreenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`捕获并保存快照成功`);\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.getSnapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.getSnapshot({ id: snapshotId }),\n api.getScreenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n resetColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n const obj = await api.getSnapshot({ id: row.id });\n await snapshotStorage.setItem(row.id, obj);\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.getScreenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n {\n type: 'selection',\n },\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `160px`,\n render(row) {\n return (\n <ActionCard\n snapshot={row}\n showExport={false}\n showShare={false}\n deleteConfirmText={`是否确认删除? 此操作不可恢复!\\n快照ID:${row.id}`}\n onPreview={() => previewSnapshot.invoke(row)}\n previewLoading={previewSnapshot.loading[row.id]}\n onBeforeDelete={async () => await api.deleteSnapshot({ id: row.id })}\n onDelete={() => {\n snapshots.value = snapshots.value.filter((s) => s.id !== row.id);\n }}\n />\n );\n },\n },\n];\n\nconst checkedRowKeys = ref<number[]>([]);\nconst { batchDelete } = useBatchActions(checkedRowKeys, {\n beforeDeleteItem: async (id) => await api.deleteSnapshot({ id }),\n onAfterDelete: async () => {\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n },\n});\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n },\n});\nwatch(pagination, resetColWidth);\n\nconst showSubsModel = shallowRef(false);\nconst subsText = shallowRef(``);\nconst updateSubs = useTask(async () => {\n const data = errorWrap(() => JSON5.parse(subsText.value.trim()));\n if (!data) return;\n if (data.categories || data.globalGroups || data.apps) {\n await api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await api.updateSubscription({\n apps: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await api.updateSubscription({\n apps: data,\n });\n } else if (typeof data.key == 'number') {\n await api.updateSubscription({\n globalGroups: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await api.updateSubscription({\n globalGroups: data,\n });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions: {\n value?: string;\n label: string;\n}[] = [\n {\n label: '仅查询',\n value: ``,\n },\n {\n value: 'click',\n label: 'click',\n },\n {\n value: 'clickNode',\n label: 'clickNode',\n },\n {\n value: 'clickCenter',\n label: 'clickCenter',\n },\n {\n value: 'back',\n label: 'back',\n },\n {\n value: 'longClick',\n label: 'longClick',\n },\n {\n value: 'longClickNode',\n label: 'longClickNode',\n },\n {\n value: 'longClickCenter',\n label: 'longClickCenter',\n },\n];\nconst clickAction = shallowReactive({\n selector: ``,\n action: 'click',\n quickFind: false,\n});\nconst execSelector = useTask(async () => {\n const result = await api.execSelector({\n ...clickAction,\n fastQuery: clickAction.quickFind,\n });\n if (result.message) {\n message.success(`操作成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `操作成功:` : `操作失败`) + result.action);\n } else if (!result.action && result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst placeholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\n</script>\n<template>\n <NModal\n v-model:show=\"showSubsModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubs.loading,\n onClick() {\n updateSubs.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"subsText\"\n :disabled=\"updateSubs.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 20,\n maxRows: 25,\n }\"\n :placeholder=\"placeholder\"\n />\n </NModal>\n <NModal\n v-model:show=\"showSelectorModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: execSelector.loading,\n onClick() {\n execSelector.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"clickAction.selector\"\n :disabled=\"execSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 4,\n maxRows: 10,\n }\"\n placeholder=\"请输入合法的选择器\"\n />\n <div h-15px />\n <NSpace>\n <NCheckbox v-model:checked=\"clickAction.quickFind\"> 快速查找 </NCheckbox>\n <a\n href=\"https://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px />\n <div flex gap-10px flex-items-center>\n <NSelect\n v-model:value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n />\n <a\n href=\"https://gkd.li/api/interfaces/RawRuleProps#action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <div page-size flex flex-col p-10px gap-10px>\n <div flex items-center gap-24px>\n <RouterLink to=\"/\" class=\"flex ml-12px\" title=\"首页\">\n <NButton text style=\"--n-icon-size: 24px\">\n <template #icon>\n <SvgIcon name=\"home\" />\n </template>\n </NButton>\n </RouterLink>\n <NInputGroup>\n <NInput\n v-model:value=\"link\"\n placeholder=\"请输入设备地址\"\n class=\"gkd_code\"\n :style=\"{ width: `240px` }\"\n @keyup.enter=\"connect.invoke\"\n >\n <template #suffix>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 20px\"\n :loading=\"connect.loading\"\n @click=\"connect.invoke\"\n >\n <template #icon><SvgIcon name=\"refresh\" /></template>\n </NButton>\n </template>\n 刷新连接\n </NTooltip>\n </template>\n </NInput>\n\n <div\n v-if=\"serverInfo\"\n gkd_code\n pl-16px\n whitespace-nowrap\n flex\n items-center\n >\n {{ serverTitle }}\n </div>\n </NInputGroup>\n <template v-if=\"serverInfo\">\n <BatchActionsBar\n :checkedCount=\"checkedRowKeys.length\"\n :batchDelete=\"batchDelete\"\n />\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"captureSnapshot.loading\"\n @click=\"captureSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Snapshot\" /></template>\n </NButton>\n </template>\n 捕获快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"downloadAllSnapshot.loading\"\n @click=\"downloadAllSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Down-all\" /></template>\n </NButton>\n </template>\n 下载所有快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSubsModel = true\"\n >\n <template #icon><SvgIcon name=\"CacheSub\" /></template>\n </NButton>\n </template>\n 修改内存订阅\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSelectorModel = true\"\n >\n <template #icon><SvgIcon name=\"Exe-Sel\" /></template>\n </NButton>\n </template>\n 执行选择器\n </NTooltip>\n </template>\n </div>\n <NDataTable\n v-model:checkedRowKeys=\"checkedRowKeys\"\n striped\n flex-height\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n @update:sorter=\"handleSorterChange\"\n />\n </div>\n</template>\n","<script setup lang=\"tsx\">\nimport { useDeviceApi } from '@/utils/api';\nimport { toValidURL } from '@/utils/check';\nimport { message } from '@/utils/discrete';\nimport { errorWrap } from '@/utils/error';\nimport { delay } from '@/utils/others';\nimport { screenshotStorage, snapshotStorage } from '@/utils/snapshot';\nimport { useSnapshotColumns } from '@/utils/table';\nimport { useBatchTask, useTask } from '@/utils/task';\nimport type { DataTableColumns, PaginationProps } from 'naive-ui';\nimport type { SortState } from 'naive-ui/es/data-table/src/interface';\nimport pLimit from 'p-limit';\nimport JSON5 from 'json5';\nimport ActionCard from '@/components/ActionCard.vue';\nimport BatchActionsBar from '@/components/BatchActionsBar.vue';\nimport { useBatchActions } from '@/composables/useBatchActions';\n\nconst router = useRouter();\nconst { api, origin, serverInfo } = useDeviceApi();\nconst link = useStorage(`device_link`, ``);\nconst connect = useTask(async () => {\n if (!link.value) return;\n origin.value = errorWrap(\n () => new URL(link.value.trim()),\n () => `非法设备地址`,\n ).origin;\n link.value = origin.value;\n serverInfo.value = await api.getServerInfo();\n});\n\nconst serverTitle = computed(() => {\n if (!serverInfo.value) return '未连接设备';\n const d = serverInfo.value.device;\n const g = serverInfo.value.gkdAppInfo;\n return `${d.manufacturer} Android${d.release} - GKD${g.versionName}`;\n});\n\nonMounted(async () => {\n await delay(500);\n if (toValidURL(link.value)) {\n connect.invoke();\n }\n});\n\nconst snapshots = shallowRef<Snapshot[]>([]);\nwatchEffect(async () => {\n if (!serverInfo.value) return;\n document.title = serverTitle.value;\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n subsText.value = '';\n});\n\nconst captureSnapshot = useTask(async () => {\n const snapshot = await api.captureSnapshot();\n const screenshot = await api.getScreenshot({ id: snapshot.id });\n await snapshotStorage.setItem(snapshot.id, snapshot);\n await screenshotStorage.setItem(snapshot.id, screenshot);\n message.success(`捕获并保存快照成功`);\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n});\nconst downloadAllSnapshot = useTask(async () => {\n const snapshotIds = (await api.getSnapshots()).map((s) => s.id);\n const existSnapshotIds = new Set(\n (await screenshotStorage.keys()).map((s) => parseInt(s)),\n );\n const unimportSnapshotIds = snapshotIds.filter(\n (k) => !existSnapshotIds.has(k),\n );\n if (unimportSnapshotIds.length == 0) {\n message.success(`没有新记录可导入`);\n return;\n }\n let r = 0;\n const limit = pLimit(3);\n await Promise.all(\n unimportSnapshotIds.map((snapshotId) =>\n limit(async () => {\n const [newSnapshot, newScreenshot] = await Promise.all([\n api.getSnapshot({ id: snapshotId }),\n api.getScreenshot({ id: snapshotId }),\n ] as const);\n if (!newSnapshot.nodes) return;\n await Promise.all([\n snapshotStorage.setItem(snapshotId, newSnapshot),\n screenshotStorage.setItem(snapshotId, newScreenshot),\n ]);\n r++;\n }),\n ),\n );\n message.success(`导入${r}条新记录`);\n});\n\nconst {\n activityIdCol,\n appIdCol,\n appNameCol,\n ctimeCol,\n appVersionCodeCol,\n appVersionNameCol,\n resetColWidth,\n} = useSnapshotColumns();\nconst handleSorterChange = (sorter: SortState) => {\n if (sorter.columnKey == ctimeCol.key) {\n ctimeCol.sortOrder = sorter.order;\n }\n};\nconst previewSnapshot = useBatchTask(\n async (row: Snapshot) => {\n if (!(await snapshotStorage.hasItem(row.id))) {\n const obj = await api.getSnapshot({ id: row.id });\n await snapshotStorage.setItem(row.id, obj);\n }\n if (!(await screenshotStorage.hasItem(row.id))) {\n const bf = await api.getScreenshot({ id: row.id });\n await screenshotStorage.setItem(row.id, bf);\n }\n window.open(\n router.resolve({\n name: 'snapshot',\n params: { snapshotId: row.id },\n }).href,\n );\n },\n (r) => r.id,\n);\n\nconst columns: DataTableColumns<Snapshot> = [\n {\n type: 'selection',\n },\n ctimeCol,\n appNameCol,\n appIdCol,\n appVersionCodeCol,\n appVersionNameCol,\n activityIdCol,\n {\n key: `actions`,\n title: `操作`,\n fixed: 'right',\n width: `160px`,\n render(row) {\n return (\n <ActionCard\n snapshot={row}\n showExport={false}\n showShare={false}\n deleteConfirmText={`是否确认删除? 此操作不可恢复!\\n快照ID:${row.id}`}\n onPreview={() => previewSnapshot.invoke(row)}\n previewLoading={previewSnapshot.loading[row.id]}\n onBeforeDelete={async () => await api.deleteSnapshot({ id: row.id })}\n onDelete={() => {\n snapshots.value = snapshots.value.filter((s) => s.id !== row.id);\n }}\n />\n );\n },\n },\n];\n\nconst checkedRowKeys = ref<number[]>([]);\nconst { batchDelete } = useBatchActions(checkedRowKeys, {\n beforeDeleteItem: async (id) => await api.deleteSnapshot({ id }),\n onAfterDelete: async () => {\n const result = await api.getSnapshots();\n result.sort((a, b) => b.id - a.id);\n snapshots.value = result;\n },\n});\n\nconst pagination = shallowReactive<PaginationProps>({\n page: 1,\n pageSize: 50,\n showSizePicker: true,\n pageSizes: [50, 100],\n onChange: (page: number) => {\n pagination.page = page;\n },\n onUpdatePageSize: (pageSize: number) => {\n pagination.pageSize = pageSize;\n pagination.page = 1;\n },\n});\nwatch(pagination, resetColWidth);\n\nconst showSubsModel = shallowRef(false);\nconst subsText = shallowRef(``);\nconst updateSubs = useTask(async () => {\n const data = errorWrap(() => JSON5.parse(subsText.value.trim()));\n if (!data) return;\n if (data.categories || data.globalGroups || data.apps) {\n await api.updateSubscription(data);\n } else if (typeof data.id == 'string') {\n await api.updateSubscription({\n apps: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].id == 'string') {\n await api.updateSubscription({\n apps: data,\n });\n } else if (typeof data.key == 'number') {\n await api.updateSubscription({\n globalGroups: [data],\n });\n } else if (Array.isArray(data) && typeof data[0].key == 'number') {\n await api.updateSubscription({\n globalGroups: data,\n });\n } else {\n message.error(`无法识别的订阅文本`);\n return;\n }\n message.success(`修改成功`);\n});\n\nconst showSelectorModel = shallowRef(false);\n\nconst actionOptions: {\n value?: string;\n label: string;\n}[] = [\n {\n label: '仅查询',\n value: ``,\n },\n {\n value: 'click',\n label: 'click',\n },\n {\n value: 'clickNode',\n label: 'clickNode',\n },\n {\n value: 'clickCenter',\n label: 'clickCenter',\n },\n {\n value: 'back',\n label: 'back',\n },\n {\n value: 'longClick',\n label: 'longClick',\n },\n {\n value: 'longClickNode',\n label: 'longClickNode',\n },\n {\n value: 'longClickCenter',\n label: 'longClickCenter',\n },\n];\nconst clickAction = shallowReactive({\n selector: ``,\n action: 'click',\n quickFind: false,\n});\nconst execSelector = useTask(async () => {\n const result = await api.execSelector({\n ...clickAction,\n fastQuery: clickAction.quickFind,\n });\n if (result.message) {\n message.success(`操作成功:` + result.message);\n return;\n }\n if (result.action) {\n message.success((result.result ? `操作成功:` : `操作失败`) + result.action);\n } else if (!result.action && result.result) {\n message.success(`查询成功`);\n }\n});\n\nconst placeholder = `\n请输入订阅文本(JSON5语法):\n示例1-更新单个应用的规则:\n{\n id: 'appId',\n groups: []\n}\n\n示例2-更新多个应用的规则:\n[\n {\n id: 'appId1',\n groups: []\n },\n {\n id: 'appId2',\n groups: []\n }\n]\n\n示例3-更新全局规则(1.7.0):\n{\n name: '全局规则-1',\n key: 0,\n rules: []\n}\n\n示例3-更新多个全局规则(1.7.0):\n[\n {\n name: '全局规则-1',\n key: 0,\n rules: []\n },\n {\n name: '全局规则-2',\n key: 1,\n rules: []\n }\n]\n\n示例4-更新整个订阅(1.7.0):\n{\n apps: [],\n globalGroups: [],\n categories: [],\n}\n`.trim();\n</script>\n<template>\n <NModal\n v-model:show=\"showSubsModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"修改内存订阅\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: updateSubs.loading,\n onClick() {\n updateSubs.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"subsText\"\n :disabled=\"updateSubs.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 20,\n maxRows: 25,\n }\"\n :placeholder=\"placeholder\"\n />\n </NModal>\n <NModal\n v-model:show=\"showSelectorModel\"\n preset=\"dialog\"\n style=\"width: 800px\"\n title=\"执行选择器\"\n positiveText=\"确认\"\n :positiveButtonProps=\"{\n loading: execSelector.loading,\n onClick() {\n execSelector.invoke();\n },\n }\"\n >\n <NInput\n v-model:value=\"clickAction.selector\"\n :disabled=\"execSelector.loading\"\n type=\"textarea\"\n class=\"gkd_code\"\n :autosize=\"{\n minRows: 4,\n maxRows: 10,\n }\"\n placeholder=\"请输入合法的选择器\"\n />\n <div h-15px />\n <NSpace>\n <NCheckbox v-model:checked=\"clickAction.quickFind\"> 快速查找 </NCheckbox>\n <a\n href=\"https://gkd.li/api/interfaces/RawCommonProps.html#quickfind\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 查找说明\n </a>\n </NSpace>\n <div h-10px />\n <div flex gap-10px flex-items-center>\n <NSelect\n v-model:value=\"clickAction.action\"\n :options=\"actionOptions\"\n class=\"w-150px\"\n />\n <a\n href=\"https://gkd.li/api/interfaces/RawRuleProps#action\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n 操作说明\n </a>\n </div>\n </NModal>\n <div page-size flex flex-col p-10px gap-10px>\n <div flex items-center gap-24px>\n <RouterLink to=\"/\" class=\"flex ml-12px\" title=\"首页\">\n <NButton text style=\"--n-icon-size: 24px\">\n <template #icon>\n <SvgIcon name=\"home\" />\n </template>\n </NButton>\n </RouterLink>\n <NInputGroup>\n <NInput\n v-model:value=\"link\"\n placeholder=\"请输入设备地址\"\n class=\"gkd_code\"\n :style=\"{ width: `240px` }\"\n @keyup.enter=\"connect.invoke\"\n >\n <template #suffix>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 20px\"\n :loading=\"connect.loading\"\n @click=\"connect.invoke\"\n >\n <template #icon><SvgIcon name=\"refresh\" /></template>\n </NButton>\n </template>\n 刷新连接\n </NTooltip>\n </template>\n </NInput>\n\n <div\n v-if=\"serverInfo\"\n gkd_code\n pl-16px\n whitespace-nowrap\n flex\n items-center\n >\n {{ serverTitle }}\n </div>\n </NInputGroup>\n <template v-if=\"serverInfo\">\n <BatchActionsBar\n :checkedCount=\"checkedRowKeys.length\"\n :batchDelete=\"batchDelete\"\n />\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"captureSnapshot.loading\"\n @click=\"captureSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Snapshot\" /></template>\n </NButton>\n </template>\n 捕获快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n :loading=\"downloadAllSnapshot.loading\"\n @click=\"downloadAllSnapshot.invoke\"\n >\n <template #icon><SvgIcon name=\"Down-all\" /></template>\n </NButton>\n </template>\n 下载所有快照\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSubsModel = true\"\n >\n <template #icon><SvgIcon name=\"CacheSub\" /></template>\n </NButton>\n </template>\n 修改内存订阅\n </NTooltip>\n <NTooltip>\n <template #trigger>\n <NButton\n text\n style=\"--n-icon-size: 24px\"\n @click=\"showSelectorModel = true\"\n >\n <template #icon><SvgIcon name=\"Exe-Sel\" /></template>\n </NButton>\n </template>\n 执行选择器\n </NTooltip>\n </template>\n </div>\n <NDataTable\n v-model:checkedRowKeys=\"checkedRowKeys\"\n striped\n flex-height\n :data=\"snapshots\"\n :columns=\"columns\"\n :pagination=\"pagination\"\n :rowKey=\"(r:Snapshot)=>r.id\"\n size=\"small\"\n class=\"flex-1\"\n :scrollX=\"1200\"\n @update:sorter=\"handleSorterChange\"\n />\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{At as e,C as t,Cn as n,En as r,Et as i,M as a,Mn as o,Nn as s,Nt as c,On as l,P as u,Pn as d,R as f,Tt as p,Vt as m,W as h,_n as g,b as _,jn as v,kn as y,l as b,q as x,wt as S,xn as C}from"./discrete-BTrzVGvR.js";import{i as w,n as T}from"./Icon-DCNP04Bv.js";import{u as E}from"./Ellipsis-CIAsWxIX.js";import{$ as D,F as O,J as k,K as A,M as j,at as ee,dt as M,g as N,h as P,i as te,it as F,l as I,lt as L,nt as ne,p as re,q as R,st as z,u as B,v as V,x as H,z as U}from"./runtime-core.esm-bundler-Bb-gaXwr.js";import{a as W}from"./buildMatchPatternFn-Bh60_8FV.js";import{
|
|
1
|
+
import{At as e,C as t,Cn as n,En as r,Et as i,M as a,Mn as o,Nn as s,Nt as c,On as l,P as u,Pn as d,R as f,Tt as p,Vt as m,W as h,_n as g,b as _,jn as v,kn as y,l as b,q as x,wt as S,xn as C}from"./discrete-BTrzVGvR.js";import{i as w,n as T}from"./Icon-DCNP04Bv.js";import{u as E}from"./Ellipsis-CIAsWxIX.js";import{$ as D,F as O,J as k,K as A,M as j,at as ee,dt as M,g as N,h as P,i as te,it as F,l as I,lt as L,nt as ne,p as re,q as R,st as z,u as B,v as V,x as H,z as U}from"./runtime-core.esm-bundler-Bb-gaXwr.js";import{a as W}from"./buildMatchPatternFn-Bh60_8FV.js";import{n as ie}from"./directives-DTQ7Inwm.js";import{t as ae}from"./Input-BAZB1-O8.js";import{t as oe}from"./Checkbox-BMccKg-D.js";import{f as G,m as se,t as ce}from"./ActionCard-C3CVutCf.js";import{_ as le}from"./localforage-WIQUL5H9.js";import{o as ue}from"./storage-DzFZkTy8.js";import{t as de}from"./check-ICe0_ZVN.js";import{n as K}from"./node-Bov5nia1.js";import{i as fe}from"./p-limit-DoaQ2_S9.js";import{i as pe,n as me,r as he,t as ge}from"./useBatchActions-CQICUx2y.js";import{n as _e,t as ve}from"./import-D3p37-0k.js";var q={buttonHeightSmall:`14px`,buttonHeightMedium:`18px`,buttonHeightLarge:`22px`,buttonWidthSmall:`14px`,buttonWidthMedium:`18px`,buttonWidthLarge:`22px`,buttonWidthPressedSmall:`20px`,buttonWidthPressedMedium:`24px`,buttonWidthPressedLarge:`28px`,railHeightSmall:`18px`,railHeightMedium:`22px`,railHeightLarge:`26px`,railWidthSmall:`32px`,railWidthMedium:`40px`,railWidthLarge:`48px`};function J(e){let{primaryColor:t,opacityDisabled:n,borderRadius:r,textColor3:i}=e;return Object.assign(Object.assign({},q),{iconColor:i,textColor:`white`,loadingColor:t,opacityDisabled:n,railColor:`rgba(0, 0, 0, .14)`,railColorActive:t,buttonBoxShadow:`0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05)`,buttonColor:`#FFF`,railBorderRadiusSmall:r,railBorderRadiusMedium:r,railBorderRadiusLarge:r,buttonBorderRadiusSmall:r,buttonBorderRadiusMedium:r,buttonBorderRadiusLarge:r,boxShadowFocus:`0 0 0 2px ${C(t,{alpha:.2})}`})}var Y={name:`Switch`,common:a,self:J},X=y(`switch`,`
|
|
2
2
|
height: var(--n-height);
|
|
3
3
|
min-width: var(--n-width);
|
|
4
4
|
vertical-align: middle;
|
|
@@ -105,4 +105,4 @@ import{At as e,C as t,Cn as n,En as r,Et as i,M as a,Mn as o,Nn as s,Nt as c,On
|
|
|
105
105
|
每行一个
|
|
106
106
|
空白行自动忽略
|
|
107
107
|
非法链接行自动忽略`,autosize:{minRows:8,maxRows:16},inputProps:{style:`white-space: nowrap;`},"onUpdate:value":r[5]||=e=>{M(H).loading||(V.value=e)}},null,8,[`value`])]),_:1},8,[`show`,`loading`,`onPositiveClick`]),N(y,{show:M(Q),"onUpdate:show":r[14]||=e=>D(Q)?Q.value=e:null,preset:`dialog`,title:`设置`,showIcon:!1,positiveText:`关闭`,style:{width:`600px`},onPositiveClick:r[15]||=e=>Q.value=!1},{default:k(()=>[N(b,{checked:M(n).ignoreUploadWarn,"onUpdate:checked":r[11]||=e=>M(n).ignoreUploadWarn=e},{default:k(()=>[...r[27]||=[P(` 关闭生成分享链接弹窗提醒 `,-1)]]),_:1},8,[`checked`]),r[30]||=B(`div`,{"h-1px":``,"my-10px":``,bg:`#eee`},null,-1),N(b,{checked:M(n).ignoreWasmWarn,"onUpdate:checked":r[12]||=e=>M(n).ignoreWasmWarn=e},{default:k(()=>[...r[28]||=[P(` 关闭浏览器版本正则表达式 WASM(GC) 提醒 `,-1)]]),_:1},8,[`checked`]),r[31]||=B(`div`,{"h-1px":``,"my-10px":``,bg:`#eee`},null,-1),B(`div`,Te,[N(S,{value:M(n).autoUploadImport,"onUpdate:value":r[13]||=e=>M(n).autoUploadImport=e},null,8,[`value`]),r[29]||=B(`div`,null,`打开快照页面自动生成分享链接(请确保不含隐私)`,-1)])]),_:1},8,[`show`])],64)}}});export{$ as default};
|
|
108
|
-
//# sourceMappingURL=HomePage-
|
|
108
|
+
//# sourceMappingURL=HomePage-CD3CjOSq.js.map
|