From 9a4462ff8059ed62d67c70ad37e9d883cc75abb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E5=90=9B?= <13760614423@163.com> Date: Sun, 16 Aug 2020 19:54:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=9F=BA=E6=9C=AC=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- package.json | 6 +- plugin.config.js | 29 ++-- rollup.config.js | 2 +- src/Hello.ts | 13 -- src/Helper/FundDBHelper.ts | 29 ++++ src/assets/doc/index.html | 11 -- src/assets/img/add.png | Bin 0 -> 3392 bytes src/assets/img/del.png | Bin 0 -> 2269 bytes src/assets/img/down.png | Bin 0 -> 2163 bytes src/assets/img/logo.png | Bin 11736 -> 13689 bytes src/assets/img/up.png | Bin 0 -> 1981 bytes src/main.ts | 220 +++++++++++++++++++----- src/model/IFundEnt.ts | 31 ++++ src/model/IFundValuationDetailResult.ts | 32 ++++ src/model/ISearchFundResult.ts | 22 +++ src/types/utools.d.ts | 2 +- 17 files changed, 310 insertions(+), 91 deletions(-) delete mode 100644 src/Hello.ts create mode 100644 src/Helper/FundDBHelper.ts delete mode 100644 src/assets/doc/index.html create mode 100644 src/assets/img/add.png create mode 100644 src/assets/img/del.png create mode 100644 src/assets/img/down.png create mode 100644 src/assets/img/up.png create mode 100644 src/model/IFundEnt.ts create mode 100644 src/model/IFundValuationDetailResult.ts create mode 100644 src/model/ISearchFundResult.ts diff --git a/README.md b/README.md index 13a37a2..5878d17 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -### utools-tmpl +### utools-fund -- 使用 uTools 模板插件的模板 +- 自选基金助手 diff --git a/package.json b/package.json index 910e693..d853df4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "utools-tmpl", + "name": "utools-fund", "version": "1.0.0", - "description": "使用 uTools 模板插件的模板", + "description": "自选基金助手", "main": "main.ts", "scripts": { "dev": "set NODE_ENV=development && rollup -c -w", @@ -26,4 +26,4 @@ "axios": "^0.19.2", "encoding": "^0.1.13" } -} +} \ No newline at end of file diff --git a/plugin.config.js b/plugin.config.js index c08afae..4869937 100644 --- a/plugin.config.js +++ b/plugin.config.js @@ -2,11 +2,11 @@ * @type { import ('./src/types/utools').PluginConfig } */ const pluginConfig = { - pluginName: 'utools-tmpl', + pluginName: '自选基金助手', version: 'v1.0.0', - description: '使用模板插件模式', + description: '自选基金助手', author: '罗君', - homepage: 'https://github.com/adams549659584/utools-tmpl', + homepage: 'https://github.com/adams549659584/utools-fund', // main: 'index.html', preload: 'preload.js', logo: 'assets/img/logo.png', @@ -23,20 +23,23 @@ const pluginConfig = { // }, features: [ { - code: 'utools_tmpl_hello_none', - explain: '无 UI 模式', - cmds: ['hello', 'none'], + code: 'utools_fund_add', + explain: '添加自选基金', + icon: 'assets/img/add.png', + cmds: ['添加自选基金', '基金', 'fund'] }, { - code: 'utools_tmpl_hello_list', - explain: '列表模式', - cmds: ['hello', 'list'], + code: 'utools_fund_del', + explain: '删除自选基金', + icon: 'assets/img/del.png', + cmds: ['删除自选基金', '基金', 'fund'] }, { - code: 'utools_tmpl_hello_doc', - explain: '文档模式', - cmds: ['hello', 'doc'], - }, + code: 'utools_fund_my', + explain: '我的自选基金', + icon: 'assets/img/logo.png', + cmds: ['我的自选基金', '基金', 'fund'], + } ], }; export default pluginConfig; diff --git a/rollup.config.js b/rollup.config.js index 5b8a318..3efb160 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -24,7 +24,7 @@ const rollupOptions = { output: { file: './dist/preload.js', format: 'cjs', - sourcemap: NODE_ENV === 'production' ? 'hidden' : 'inline', + sourcemap: NODE_ENV === 'production' ? false : 'inline', }, plugins: [ cleaner({ diff --git a/src/Hello.ts b/src/Hello.ts deleted file mode 100644 index 169f8a9..0000000 --- a/src/Hello.ts +++ /dev/null @@ -1,13 +0,0 @@ -export default class Hello { - static sayHello(message) { - utools.showMessageBox({ - message, - }); - } - - static repeat(message) { - return utools.showMessageBox({ - message, - }); - } -} diff --git a/src/Helper/FundDBHelper.ts b/src/Helper/FundDBHelper.ts new file mode 100644 index 0000000..7e33043 --- /dev/null +++ b/src/Helper/FundDBHelper.ts @@ -0,0 +1,29 @@ +import { IFundEnt } from '@/model/IFundEnt'; +import { DBItem } from '@/types/utools'; + +const FUND_DB_PRE_FIX = 'fund_'; + +export default class FundDBHelper { + static set(fundId: string, data: IFundEnt) { + return utools.db.put({ + _id: `${FUND_DB_PRE_FIX}${fundId}`, + data, + }); + } + + static update(data: DBItem) { + return utools.db.put(data); + } + + static get(fundId: string) { + return utools.db.get(`${FUND_DB_PRE_FIX}${fundId}`); + } + + static getAll() { + return utools.db.allDocs(FUND_DB_PRE_FIX); + } + + static del(fundId: string) { + return utools.db.remove(`${FUND_DB_PRE_FIX}${fundId}`); + } +} diff --git a/src/assets/doc/index.html b/src/assets/doc/index.html deleted file mode 100644 index d10a7c8..0000000 --- a/src/assets/doc/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - 文档模式 - - - 去github - - diff --git a/src/assets/img/add.png b/src/assets/img/add.png new file mode 100644 index 0000000000000000000000000000000000000000..dc00146a0873ab4414ce66ac8be157112bbba404 GIT binary patch literal 3392 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 literal 0 HcmV?d00001 diff --git a/src/assets/img/logo.png b/src/assets/img/logo.png index f42d663d46c2c330891c466ffae732a5d1c6e252..01f074edc800e3b3b567bef91b2d81362a86bd88 100644 GIT binary patch literal 13689 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 literal 11736 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 KvRd3Y=>G$6B`kjc diff --git a/src/assets/img/up.png b/src/assets/img/up.png new file mode 100644 index 0000000000000000000000000000000000000000..7627664ee902d92a92576bee6ec5d1f4322ffcc6 GIT binary patch literal 1981 zcmd^A=U3C|5`L4AAT?s00o(OZe519_bh3x-vo| zE14BW6}0YL1U&W90U3gEpsI>qggQJm(jyT6Hg~^)3v9R9bImnuxqtC=GC=#5bJ7Kl&-$pZWAX+&AUJRZ}Q14h9?H-`P zM!iI*9#@i9`?4ciy#D8xdRZvU(^j_P@e!zhGgn}>v|>`FWbf3#P^m*fVMHgn^GYVL zvtKqd<{87o3}pQ$$=xEorfneN!Q2+h%x9?Lx27mY*^2PwJJxL0IW{*4^o!k88nhq# z^3%K(8nBB66|!|QkmJfJFfQj1m$DI3G;`m|y&fSg>4DaVbn0#i@0CWo%YiyLG$2-0 zx$!6_x%nE6mpZWqm#>FGhQwAVcIcv`Zr;IBvAa9#Ai=l^4wei2faC8XfdsqQ{jF~* zOiW};iP#L`M#g%MiG)Tidg&ZD|L=P&!3W!Hkm_l-4|($fsx5be9wyJwilT(VW;6w{ zIHjC;|J2D1)$bxttu8dF?#la7whR(({RYdKy zGBtEfX3O@PNNpec#&fG$s@H)z$E5_qN2VS6sBZoj?qd9ww_95!=(g-iLnvw zhPHzrUBhdhpFbV(jf4x-025I@uohGH_AQNbqjSHdCGR9>sl$P>JtK*lYZh=K$nDPO z9pp7l!aw;4E`|ZqKxc*U&z2_#)Lh*jU_MbYWmB+^5I-e zD<*wN-{^gDr%ENsYQdZ%+;2(U1p;HVuTd2=$Qi+VL(yxo*wL=x)gbia;z*$Az!_>m za%+(O3&(Vee0m-YWx%1ys)7VQ-xv~_T$XI!{kKkWYwLA81}mt1IzzgY>`a9F{FAwz zMs#|k2=VT8#XEscnt9SzV2b}-(7SP?bgy{${G!ils39yc*>4bVqskhO+)it13SC~+ zmhcKfi-x}Wib2yGx6NF0=W(NQ5=%+KOFY})B_0ce&HT}!oxHm*gFHb@$9OB;z>bX; z$NVZi8S8T~&gW8IEDMh>CS9*o&Q*}Inon5RL%MmD89X>nGD@HJF&Agsf)Dpb;+Q5H zt(TUx+VeI-$ZM1n7;_|KD4;A<8LMPoyK{TGpdEON zluZp{m8oY>yIim34LZbmDgon;tOPo#s2fwdZ#J?PY5it2+(0VRwCs%Feu_cJ)OsIU z++X&oN2*bj{ly)<n zK$Q)j=`DXvsf*KcFZ2*TxZ3yRVIMdYQ~@HqSZV8}~l+@?XUbY-r`jAMI2#CPes?tCT z3#f2uj~cV1C33n9H#NK(-YcUDmBJ)CRfufxIy1mjDN%Bg(( z-B4^2l8%WZOza<>(P(a%fv*Exhdm(&x6E!%qw#kAw^ZGBo9Fw}3VX5_Z9NeE(8pJn z%gur{_Q|$6u)?WZB~!P4i=Qsa_JKE{;bD6CTPZEIJw{KrMri&08jv9%@sC+(Aqc1g zn>B!rM}Bs?xb5(rb>e}}?PI<^2-5|_KL=}ON5&a&ES6K1IUa)!w~wY*M}TUC2|1%0 p^!VpH?nH8Tn2?F3|1()cJ1FWjT=w3TE`7_u<6mB`4K5*xe*toHgLnV{ literal 0 HcmV?d00001 diff --git a/src/main.ts b/src/main.ts index b16b862..cc2a7e0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,69 +1,195 @@ -import { TemplatePlugin } from '@/types/utools'; -import Hello from './Hello'; +import { TemplatePlugin, CallbackListItem, DBItem } from '@/types/utools'; +import { get } from './Helper/HttpHelper'; +import FundDBHelper from './Helper/FundDBHelper'; +import { ISearchFundResult } from './model/ISearchFundResult'; +import { IFundValuationDetailResult } from './model/IFundValuationDetailResult'; +import { IFundEnt } from './model/IFundEnt'; -// utools.onPluginEnter(params => { -// Hello.sayHello(); -// }); +// 缓存基金详情 +let CACHE_FUND_DB_LIST: DBItem[]; +// 当前基金持有数量 +let CURRENT_FUND_HOLD_COUNT = 0; + +const getMyFundDetails = async () => { + const dbList = FundDBHelper.getAll(); + for (const db of dbList) { + const oldData = db.data; + const fundValuationDetail = await get( + `https://fundmobapi.eastmoney.com/FundMApi/FundVarietieValuationDetail.ashx?FCODE=${oldData.id}&deviceid=D03E8A22-9E0A-473F-B045-3745FC7931C4&plat=Iphone&product=EFund&version=6.2.9>OKEN=793EAE9248BC4181A9380C49938D1E31` + ); + if (fundValuationDetail.ErrCode !== 0) { + utools.showMessageBox({ + message: fundValuationDetail.ErrMsg, + }); + continue; + } + let lastTime = fundValuationDetail.Expansion.GZTIME; + let nowJJJZ = Number(fundValuationDetail.Expansion.GZ); + const searchFundResult = await get(`http://fundsuggest.eastmoney.com/FundSearch/api/FundSearchAPI.ashx?m=1&key=${oldData.id}`); + if (searchFundResult.ErrCode !== 0) { + utools.showMessageBox({ + message: searchFundResult.ErrMsg, + }); + continue; + } else { + const searchFundDetail = searchFundResult.Datas[0]; + // 最后单位净值 + if (lastTime.includes(searchFundDetail.FundBaseInfo.FSRQ)) { + lastTime = searchFundDetail.FundBaseInfo.FSRQ; + nowJJJZ = Number(searchFundDetail.FundBaseInfo.DWJZ); + } + } + db.data = { + ...oldData, + yesJJJZ: Number(fundValuationDetail.Expansion.DWJZ), + nowJJJZ: Number(nowJJJZ), + lastTime, + }; + FundDBHelper.update(db); + console.log(db.data); + } + return FundDBHelper.getAll(); +}; + +const fundDetailsToCbList = (dbList: DBItem[]) => { + let sumIncome = 0; + let cbList = dbList.map(db => { + const fund = db.data; + const rate = Math.round((fund.nowJJJZ / fund.yesJJJZ - 1) * 10000) / 10000; + const income = fund.holdCount > 0 ? rate * fund.holdCount * fund.yesJJJZ : 0; + sumIncome += income; + const cb: CallbackListItem = { + fundCode: fund.id, + title: `${fund.id} ${fund.name}`, + description: `${(rate * 100).toFixed(2)}% ¥${income.toFixed(2)}`, + icon: rate >= 0 ? 'assets/img/up.png' : 'assets/img/down.png', + }; + return cb; + }); + cbList = [ + { + title: `今日总收益`, + description: `¥${sumIncome.toFixed(2)}`, + icon: sumIncome >= 0 ? 'assets/img/up.png' : 'assets/img/down.png', + }, + ...cbList, + ]; + return cbList; +}; const preload: TemplatePlugin = { - utools_tmpl_hello_none: { - mode: 'none', + utools_fund_add: { + mode: 'list', args: { - placeholder: '无 UI 模式', - enter: (action, cb) => { - Hello.sayHello('Hello None'); - utools.outPlugin(); + placeholder: '输入基金简称/代码/拼音,回车键确认', + search: async (action, searchWord, callbackSetList) => { + // 获取一些数据 + let cbList: CallbackListItem[] = []; + if (searchWord) { + const searchResult = await get(`http://fundsuggest.eastmoney.com/FundSearch/api/FundSearchAPI.ashx?m=1&key=${searchWord}`); + if (searchResult) { + if (searchResult.ErrCode === 0) { + cbList = searchResult.Datas.map(fund => { + const cb: CallbackListItem = { + title: fund.CODE, + description: fund.NAME, + DWJZ: fund.FundBaseInfo.DWJZ, + FSRQ: fund.FundBaseInfo.FSRQ, + }; + return cb; + }); + } else { + utools.showMessageBox({ + message: searchResult.ErrMsg, + }); + } + } + } + callbackSetList(cbList); + }, // 用户选择列表中某个条目时被调用 + select: (action, itemData, callbackSetList) => { + const existFund = FundDBHelper.get(itemData.title); + if (!existFund) { + FundDBHelper.set(itemData.title, { + id: itemData.title, + name: itemData.description, + holdCount: 0, + yesJJJZ: 0, + nowJJJZ: itemData.DWJZ, + lastTime: itemData.FSRQ, + }); + } + utools.redirect('我的自选基金', ''); }, }, }, - utools_tmpl_hello_list: { + utools_fund_del: { mode: 'list', args: { - placeholder: '列表模式', + placeholder: '选择需删除的基金,回车键确认', enter: (action, callbackSetList) => { - console.log(action); + const dbList = FundDBHelper.getAll(); + const cbList = dbList.map(db => { + const cb: CallbackListItem = { + title: db.data.id, + description: db.data.name, + }; + return cb; + }); // 如果进入插件就要显示列表数据 - callbackSetList([ - { - title: '这是标题', - description: '这是描述(跳去我的github)', - icon: '', // 图标(可选) - url: 'https://github.com/adams549659584/utools-tmpl', - }, - ]); + callbackSetList(cbList); }, search: (action, searchWord, callbackSetList) => { - // 获取一些数据 - // 执行 callbackSetList 显示出来 - callbackSetList([ - { - title: searchWord, - description: '虽然文字变了,但是还是跳去我的github', - icon: '', // 图标, - url: 'https://github.com/adams549659584/utools-tmpl', - other: 'xxx', - }, - ]); + let dbList = FundDBHelper.getAll(); + if (searchWord) { + dbList = dbList.filter(x => x.data.id.includes(searchWord) || x.data.name.includes(searchWord)); + } + const cbList = dbList.map(db => { + const cb: CallbackListItem = { + title: db.data.id, + description: db.data.name, + }; + return cb; + }); + callbackSetList(cbList); }, // 用户选择列表中某个条目时被调用 select: (action, itemData, callbackSetList) => { - utools.hideMainWindow(); - const url = itemData.url; - require('electron').shell.openExternal(url); - utools.outPlugin(); + FundDBHelper.del(itemData.title); + utools.redirect('我的自选基金', ''); }, }, }, - utools_tmpl_hello_doc: { - mode: 'doc', + utools_fund_my: { + mode: 'list', args: { - indexes: [ - { - t: '这是标题', - d: '这是描述', - p: 'assets/doc/index.html', //页面, 只能是相对路径 - }, - ], - placeholder: '文档模式', + placeholder: '输入持有份额,选择对应基金,回车键保存', + enter: async (action, callbackSetList) => { + const dbList = await getMyFundDetails(); + // 缓存 + CACHE_FUND_DB_LIST = dbList; + CURRENT_FUND_HOLD_COUNT = 0; + const cbList = fundDetailsToCbList(dbList); + // 如果进入插件就要显示列表数据 + callbackSetList(cbList); + }, + search: async (action, searchWord, callbackSetList) => { + let dbList = CACHE_FUND_DB_LIST && CACHE_FUND_DB_LIST.length > 0 ? CACHE_FUND_DB_LIST : await getMyFundDetails(); + CURRENT_FUND_HOLD_COUNT = Number(searchWord); + const cbList = fundDetailsToCbList(dbList); + callbackSetList(cbList); + }, // 用户选择列表中某个条目时被调用 + select: (action, itemData, callbackSetList) => { + if (!CACHE_FUND_DB_LIST || CACHE_FUND_DB_LIST.length === 0) { + utools.redirect('添加自选基金', ''); + return; + } + if (action.type === 'text' && itemData.fundCode) { + const fundDb = FundDBHelper.get(itemData.fundCode); + fundDb.data.holdCount = CURRENT_FUND_HOLD_COUNT; + FundDBHelper.update(fundDb); + } + utools.redirect('我的自选基金', ''); + }, }, }, }; diff --git a/src/model/IFundEnt.ts b/src/model/IFundEnt.ts new file mode 100644 index 0000000..43c536b --- /dev/null +++ b/src/model/IFundEnt.ts @@ -0,0 +1,31 @@ +export interface IFundEnt { + /** + * 基金id + */ + id: string; + + /** + * 基金名称 + */ + name: string; + + /** + * 持有数量 + */ + holdCount: number; + + /** + * 昨日基金净值 + */ + yesJJJZ: number; + + /** + * 现在基金净值 + */ + nowJJJZ: number; + + /** + * 当前净值对应时间 + */ + lastTime: string; +} diff --git a/src/model/IFundValuationDetailResult.ts b/src/model/IFundValuationDetailResult.ts new file mode 100644 index 0000000..5e80ce5 --- /dev/null +++ b/src/model/IFundValuationDetailResult.ts @@ -0,0 +1,32 @@ +/** + * 基金估值结果 + */ +export interface IFundValuationDetailResult { + ErrCode: number; + ErrMsg: string; + TotalCount: number; + Datas: string[]; + Expansion: { + FCODE: string; + SHORTNAME: string; + /** + * 估值时间 2020-08-14 15:00 + */ + GZTIME: string; + + /** + * 估值 + */ + GZ: string; + + /** + * 单位净值 + */ + DWJZ: string; + + /** + * 净值日期 2020-08-13 + */ + JZRQ: string; + }; +} diff --git a/src/model/ISearchFundResult.ts b/src/model/ISearchFundResult.ts new file mode 100644 index 0000000..5774af7 --- /dev/null +++ b/src/model/ISearchFundResult.ts @@ -0,0 +1,22 @@ +/** + * 基金搜索结果 + */ +export interface ISearchFundResult { + ErrCode: number; + ErrMsg: string; + Datas: { + CODE: string; + NAME: string; + FundBaseInfo: { + /** + * 单位净值 + */ + DWJZ: number; + + /** + * 净值对应日期 2020-08-14 + */ + FSRQ: string; + }; + }[]; +} diff --git a/src/types/utools.d.ts b/src/types/utools.d.ts index 7e90464..12d60ad 100644 --- a/src/types/utools.d.ts +++ b/src/types/utools.d.ts @@ -100,7 +100,7 @@ export interface UTools { * @param cmd 插件关键词 * @param payload */ - redirect(cmd: string, payload: string | any): Boolean; + redirect(cmd: string, payload: string | FilesPayload | WindowPayload;): Boolean; /** * 弹出文件选择框