这个只是一个非常原始的功能页面,根据输入的基金代码和购买的份额可以计算出最新的基金收益。刚开始做的时候,苦于寻找最近2个交易日数据的接口,可惜最初找到的网上的Jsonp接口数据只有最近一天的,后面发现了一个新的接口,但是这个不是可以使用ajax技术访问的接口,只是一个普通的JS链接,经过一番折腾,完成下面的页面,当然UI什么的还是非常的原始的,Vue的使用时越来越上瘾了,它的数据驱动的概念也会体会的越深刻。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>当日基金收益计算器</title> <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" /> <style> [v-cloak] { display: none; } .bg { background-color: #e9ecef; } span { font-weight: 500; } .red { color: red; } .green { color: green; } .black { color: black; } input { width: 100%; } .row { padding: 10px 10px; } </style> <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script> <link rel="canonical" href="https://chaihongjun.me/tools/fund.html" /> </head> <body> <div id="app" class="bg"> <div class="container"> <div class="row"> <div class="col text-center"> <h1>当日基金收益计算</h1> <p v-cloak>当前日期: {{currentMonth}}月{{currentDate}}日</p> </div> </div> <!-- 基金代码 --> <div class="row"> <div class="col text-center"> <label for="fundCode" class="">基金代码:</label> </div> <div class="col text-center form-group"> <input type="text" class="form-control" name="fundCode" placeholder="请输入基金代码" v-model.trim="fundCode" @blur="getAPI(fundCode)" @focus="clearJS(fundCode)" /> </div> </div> <!-- 购买份额 --> <div class="row"> <div class="col text-center"> <label for="fundCode" class="">购买份额:</label> </div> <div class="col text-center form-group"> <input type="text" class="form-control" name="amount" placeholder="请输入购买份额" v-model.trim="amount" @focus="amount =''" /> </div> </div> <!-- 最新净值 --> <div class="row"> <div class="col text-center"> <label for="fundCode">最新净值:</label> </div> <div class="col text-center"> <span :class="[newWorth>oldWorth?red:green]" v-cloak >{{newWorth}}</span ><span v-cloak>-[{{jzrq}}]</span> </div> </div> <!-- 前一净值 --> <div class="row"> <div class="col text-center"> <label for="fundCode">前一净值:</label> </div> <div class="col text-center"> <span class="black" v-cloak>{{oldWorth}}</span> </div> </div> <!-- 基金名称 --> <div class="row"> <div class="col text-center"> <label for="fundName">基金名称:</label> </div> <div class="col text-center"> <span class="black" v-cloak>{{fundName}}</span> </div> </div> <!-- 盈亏金额 --> <div class="row"> <div class="col text-center"> <label for="income">盈亏金额:</label> </div> <div class="col text-center"> <span class="black" v-cloak>{{getIncome}}</span> </div> </div> <!-- 操作 --> <div class="row"> <div class="col text-center"> <button type="button" class="btn btn-lg btn-warning btn-block" @click="reset" > 重置 </button> </div> <div class="col text-center"> <button type="button" class="btn btn-lg btn-primary btn-block" @click="confirm(fundCode,amount)" > 计算 </button> </div> </div> <!-- 结果 --> <div class="row"> <div class="col"> <p class="text-center"> 合计盈亏:<span :class="[allIncome>0?red:green]" style="font-size: 2rem;" v-cloak > {{getAllIncome}} </span >元 </p> </div> </div> <!-- 列表 --> <div class="row"> <div class="table-responsive"> <table class="table table-striped text-nowrap table-bordered text-center" > <thead class="table-info"> <tr> <th>序号</th> <!-- <th>基金代码</th> --> <th>基金名称</th> <th>盈亏金额</th> </tr> </thead> <tbody> <tr v-cloak v-for="(fund,index) of fundData" :key="index"> <td v-cloak> {{index+1}} </td> <!-- <td v-cloak> {{fund.fundCode}} </td> --> <td v-cloak> {{fund.fundName}} </td> <td v-cloak> {{fund.income}} </td> </tr> </tbody> </table> </div> </div> <div class="row"> <div class="col"> <footer class="text-center"> <p class="text-center">叠加计算的使用方法:</p> <ul class="list-group"> <li class="text-center list-group-item">1. 输入【基金代码】</li> <li class="text-center list-group-item">2. 输入【购买份额】</li> <li class="text-center list-group-item">3. 点击【计算】按钮</li> <li class="text-center list-group-item"> 4. 点击【重置】回第一步,依此类推 </li> </ul> </footer> </div> </div> </div> </div> </body> </html> <script> let global = window; let vm = new Vue({ el: "#app", data: { red: "red", green: "green", jzrq: "", fundName: "", fundCode: "", //基金代码 newWorth: 0, //当前基金净值 oldWorth: 0, //前一个净值 income: 0, //单只基金收益 allIncome: 0, //全部基金收益 amount: null, //基金份额 currentMonth: new Date().getMonth() + 1, //当前月份 currentDate: new Date().getDate(), //当前日 fundData: [], //元素为每条基金数据 funds: [ { name: "富国天惠成长A", code: "161005", }, { name: "工银文体产业股票", code: "001714", }, { name: "国泰聚信价值灵活A", code: "000362", }, { name: "诺安先锋混合", code: "320003", }, { name: "易方达中小盘混合", code: "110011", }, ], }, computed: { getIncome() { return parseFloat(this.income).toFixed(2); }, getAllIncome() { return parseFloat(this.allIncome).toFixed(2); }, }, methods: { reset() { // 清除页面挂载的基金JS global.removeFundJS(this.fundCode); // 清除表单 this.amount = 0; this.fundCode = ""; this.fundName = ""; this.newWorth = 0; this.oldWorth = 0; this.income = 0; }, clearJS(fundCode) { global.removeFundJS(fundCode); }, getAPI(fundCode) { let url = "https://fund.eastmoney.com/pingzhongdata/" + fundCode + ".js?time=" + new Date().getTime(); let fundData = document.createElement("script"); fundData.type = "text/javascript"; fundData.src = url; fundData.id = fundCode; if (!document.getElementById(fundCode)) { document.getElementsByTagName("head")[0].appendChild(fundData); } //判断基金净值有没有更新 let jz = setTimeout(function () { //净值日期 //2020-07-12 let jzrq = global.Data_currentFundManager[0].power.jzrq; // console.log("净值日期:" + jzrq); //净值日 let jzDay = jzrq.split("-")[jzrq.split("-").length - 1]; // console.log("净值日:" + jzDay); //当前日日 let currentDay = new Date().getDate(); // console.log(currentDay); if (jzDay == currentDay) { global.alert("当前净值已经更新,可继续查询"); } }, 500); // clearTimeout(jz); }, confirm(fundCode, amount) { if (!fundCode || amount == 0 || amount == "") { alert("请输入基金代码和购买份额"); } else { global.getFundWorth(amount); // 填充到明细表 this.fundData.push({ fundCode: this.fundCode, fundName: this.fundName, income: this.getIncome, }); } }, copy(code) { //复制双击的数据到表单 this.fundCode = code; }, }, }); // 获取基金数据 function getFundWorth(amount) { // 判断基金是否存在 if (global.fS_name == undefined) { global.alert("基金代码输入错误!"); } //获取基金数据 // 基金名称 vm.fundName = fS_name; // 当前基金最新净值 vm.newWorth = Data_netWorthTrend[Data_netWorthTrend.length - 1].y; // 前一个净值 vm.oldWorth = Data_netWorthTrend[Data_netWorthTrend.length - 2].y; // 当前净值日期 vm.jzrq = global.Data_currentFundManager[0].power.jzrq; // 计算最后的单只收益 vm.income = (vm.newWorth - vm.oldWorth) * amount; // 计算最后的全部总收益 vm.allIncome += vm.income; // 清除页面挂载的基金JS global.removeFundJS(vm.fundCode); } // 清除基金接口 function removeFundJS(fundCode) { let fundJs = document.getElementById(fundCode); if (fundJs) { document.getElementsByTagName("head")[0].removeChild(fundJs); } } </script>