wkw пре 3 недеља
родитељ
комит
fda26df486

+ 14 - 4
src/api/path/exchange.api.js

@@ -10,7 +10,17 @@ export function syceeRecords(param) {
     return service.get('sycee/records', { params: param });
 }
 
-// // 资产增减接口
-// export function changeBalanceNew(param) {
-//     return service.post('playerStore/changeBalanceNew', param);
-// }
+// wgt兑换元宝
+export function wgt2sycee(param) {
+    return service.post('exchange/wgt2sycee', param);
+}
+
+// 元宝兑换wgt
+export function sycee2wgt(param) {
+    return service.post('exchange/sycee2wgt', param);
+}
+
+// STT兑换ACC
+export function stt2acc(param) {
+    return service.post('exchange/stt2acc', param);
+}

+ 31 - 0
src/api/path/jdfh.api.js

@@ -0,0 +1,31 @@
+import service from '../axios'
+
+// 获取用户当前创世纪节点数据
+export function userNode(param) {
+    return service.get('genesis/user/node', { params: param });
+}
+
+// 查询用户领取记录
+export function receiveRecord(param) {
+    return service.get('genesis/receive/record', { params: param });
+}
+
+// 获取用户信息
+export function userInfo(param) {
+    return service.get('genesis/user/info', { params: param });
+}
+
+// 激活创世纪节点
+export function nodeActive(param) {
+    return service.post('genesis/node/active', param);
+}
+
+// 领取用户分红STT(新)
+export function receiveReward(param) {
+    return service.post('genesis/receive/reward', param);
+}
+
+// // STT兑换ACC
+// export function stt2acc(param) {
+//     return service.post('exchange/stt2acc', param);
+// }

+ 2 - 4
src/api/path/login.api.js

@@ -1,9 +1,6 @@
 import service from '../axios'
 
 // 登录
-export function walletLoginNew(param) {
-  return service.post('login/walletLoginNew',param);
-}
 
 // * 获取网络信息
 export function getNetwork(param) {
@@ -17,8 +14,9 @@ export function createAccent(param) {
 
 // 获取代币地址
 export function hotTokens(param) {
-  return service.get('hot-tokens', {params: param});
+  return service.get('wallet/tokens', {params: param});
 }
+
 // 登录
 export function login(param) {
   return service.post('login/walletLoginNew', param );

+ 1 - 1
src/common/login.js

@@ -6,7 +6,7 @@ import { useSystemStore } from "@/stores/modules/systemStore";
 const systemStore = useSystemStore();
 export async function sysLogin(address) {
 
-  const { data, code } = await login({ address:address }); 
+  const { data, code } = await login({ wallet_address:address }); 
   if(code !== 1){
     $msg($t("form.LoginFailed"));
     return

+ 1 - 1
src/stores/modules/walletStore.js

@@ -120,7 +120,7 @@ export const useWalletStore = defineStore("useWalletStore", {
       } 
       const findIndex = this.walletList.findIndex(item =>  item.id === this.id);
       if(findIndex != -1){
-        this.walletList[walletList] = data
+        this.walletList[findIndex] = data
       }else{
         this.walletList.push(data)
       }

+ 37 - 0
src/utils/crypto.js

@@ -30,3 +30,40 @@ export const cryptoDecode = (data) => {
   });
   return bytes.toString(CryptoJS.enc.Utf8);
 }
+
+function getRandomString16() {
+  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+  let result = '';
+  for (let i = 0; i < 16; i++) {
+    result += chars.charAt(Math.floor(Math.random() * chars.length));
+  }
+  return result;
+}
+export function AES_CBC_ENCRYPT(val) {
+  const IV = getRandomString16();
+  const KEY = '05f8f563b95103e1';
+  const secretKey = CryptoJS.enc.Utf8.parse(KEY);
+  const ivk = CryptoJS.enc.Utf8.parse(IV);
+  let ivHex = CryptoJS.enc.Base64.stringify(ivk);
+  let messageHex = CryptoJS.enc.Utf8.parse(val);
+  let encrypted = CryptoJS.AES.encrypt(messageHex, secretKey, {
+    iv: ivk,
+    mode: CryptoJS.mode.CBC,
+    padding: CryptoJS.pad.Pkcs7
+  });
+  let result = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
+  return {
+    ciphertext: result,
+    iv: ivHex,
+  };
+}
+export function generateSign(data) {
+  const KEY = '05f8f563b95103e1';
+  delete data.sign;
+  const keys = Object.keys(data).sort();
+  let str = keys.map(key => {
+    return `${key}=${encodeURIComponent(data[key])}`
+  }).join('&');
+  data.sign = CryptoJS.MD5(`${str}${KEY}`).toString();
+  return data;
+}

+ 89 - 46
src/views/me/nodeDividend/index.vue

@@ -10,41 +10,38 @@
                     <div class="box-item-lf">
                         <svg-icon style="width: 50px; height: 50px;" name="pledge" />
                         <div class="box-item-text">
-                            <div>300W</div>
+                            <div>{{ userData?.security_amount >= 10000 ? (userData.security_amount / 10000).toFixed(0) + 'W' : userData?.security_amount || 0 }}</div>
                             <div>質押數</div>
                         </div>
                     </div>
                     <div class="box-item-ri">
                         <svg-icon style="width: 50px; height: 50px;" name="available" />
                         <div class="box-item-text">
-                            <div>0.0STT</div>
+                            <div>{{userData?.stt || 0}} STT</div>
                             <div>可領取數</div>
                         </div>
                     </div>
                 </div>
-                <div class="deadline">收益週期截止時間:2025-12-01 23:59:59</div>
+                <div class="deadline">收益週期截止時間:{{userData?.end_time}}</div>
                 <div class="btn">
-                    <van-button class="activate" color="#4765DD" :disabled="true">激活創世節點</van-button>
-                    <van-button class="receive" color="#4765DD">領取STT</van-button>
+                    <van-button class="activate" color="#4765DD" :disabled="isDisabled" @click="changeactivate">激活創世節點</van-button>
+                    <van-button class="receive" color="#4765DD" :disabled="isLQDisabled" @click="collect">領取STT</van-button>
                 </div>
                 <div class="list-box">
                     <div class="receive-record">領取記錄</div>
                     <div class="list-ul">
-                        <div class="list-li" v-for="item in 40">
-                            <div>2025-06-16 15:22:36</div>
-                            <div>49.260000000STT</div>
-                        </div>
+                        <van-pull-refresh v-model="loading" @refresh="onRefresh" style="height:100%">
+                            <template v-if="list && list.length > 0 && !noMore">
+                                <div class="list-li" v-for="(item,index) in list" :key="index">
+                                    <div>{{item.created_at}}</div>
+                                    <div>{{item.money_amount}} STT</div>
+                                </div>
+                            </template>
+                            <template v-if="noMore">
+                                <view style="text-align: center;">暂无记录!</view>
+                            </template>
+                        </van-pull-refresh>
                     </div>
-                    <!-- <van-pull-refresh v-model="refreshing" @refresh="onRefresh">
-                        <van-list
-                            v-model:loading="loading"
-                            :finished="finished"
-                            finished-text="没有更多了"
-                            @load="onLoad"
-                        >
-                            <van-cell v-for="item in list" :key="item" :title="item" />
-                        </van-list>
-                    </van-pull-refresh> -->
                 </div>
             </div>
         </div>
@@ -52,34 +49,80 @@
 </template>
 
 <script setup>
-    const list = ref([]);
-    const loading = ref(false);
-    const finished = ref(false);
-    const refreshing = ref(false);
-    const onLoad = () => {
-        setTimeout(() => {
-            if (refreshing.value) {
-                list.value = [];
-                refreshing.value = false;
-            }
-            for (let i = 0; i < 10; i++) {
-                list.value.push(list.value.length + 1);
-            }
-            loading.value = false;
-            if (list.value.length >= 40) {
-                finished.value = true;
-            }
-        }, 1000);
-    };
+import { userNode,nodeActive,receiveRecord,receiveReward } from '@/api/path/jdfh.api'
+import { useWalletStore } from "@/stores/modules/walletStore";
+import { AES_CBC_ENCRYPT } from '@/utils/crypto';
+const walletStore = useWalletStore();
 
-    const onRefresh = () => {
-      // 清空列表数据
-      finished.value = false;
-      // 重新加载数据
-      // 将 loading 设置为 true,表示处于加载状态
-      loading.value = true;
-      onLoad();
-    };
+const userData = ref({});
+const isDisabled = ref(true);
+const isLQDisabled = ref(true);
+const list = ref([]);
+const noMore = ref(false);
+const loading = ref(false);
+
+let {ciphertext, iv} = AES_CBC_ENCRYPT(walletStore.privateKey);
+
+// 获取节点数据
+const getuserNode = async () => {
+    const res = await userNode({address:walletStore.account});
+    if(res.ret){
+        userData.value = res.data;
+        isDisabled.value = res.data.is_active;
+        const sttValue = Number(res.data?.stt);
+        isLQDisabled.value = !(sttValue > 0 && !isNaN(sttValue));
+    }
+}
+// 激活
+const changeactivate = async () => {
+    const res = await nodeActive({address:walletStore.account});
+    if(res.ret){
+        userData.value = res.data;
+        isDisabled.value = res.data.is_active;
+        const sttValue = Number(res.data?.stt);
+        isLQDisabled.value = !(sttValue > 0 && !isNaN(sttValue));
+        setTimeout(()=>{
+            getuserNode();
+            getreciveRecord();
+        },500)
+    }
+}
+// 查询用户领取记录
+const getreciveRecord = async () => {
+    const res = await receiveRecord({address:walletStore.account});
+    if(res.ret){
+        list.value = res.data.list;
+        if(res.data.list.length == 0){
+            noMore.value = true;
+        }
+    }
+}
+// 领取
+const collect = async () => {
+    let params = {
+        node_id:userData.value?.id,
+        address:walletStore.account,
+        key:ciphertext,
+        _n:iv
+    }
+    const res = await receiveReward(params);
+    if(res.ret){
+        setTimeout(()=>{
+            getuserNode();
+            getreciveRecord();
+        },500)
+    }
+}
+const onRefresh = () => {
+  setTimeout(() => {
+    getreciveRecord();
+    loading.value = false;
+  }, 1000);
+};
+onMounted(async ()=>{
+    getuserNode();
+    getreciveRecord();
+})
 </script>
 
 <style lang="less" scoped>

+ 80 - 10
src/views/transaction/index.vue

@@ -1,47 +1,66 @@
 <template>
     <div class="container">
+      <van-pull-refresh v-model="loading" @refresh="onRefresh" style="height:100%">
       <div class="content">
+        <!--  -->
         <div class="card-box">
           <div class="box-item m12">
             <div class="box-item-lf-text">卖出</div>
             <div class="box-item-ri-text">
               <svg-icon style="width: 16px; height: 16px;margin-right: 2px;" name="qb" />
-              <span>18.34335890</span>
+              <span>{{STTLIST.balance}}</span>
             </div>
           </div>
           <div class="box-item">
             <div class="unit">
-              <svg-icon style="width: 42px; height: 42px;margin-right: 12px;" name="acc" />
-              <div>STT</div>
+              <van-image
+                width="42px"
+                height="42px"
+                round
+                :src="STTLIST.logo"
+              />
+              <div style="margin-left: 12px;">{{STTLIST.name}}</div>
             </div>
             <van-field v-model="sell" class="box-input" placeholder="0.00" input-align="right"/>
           </div>
         </div>
+        <!--  -->
         <div class="arrow">
           <div class="line"></div>
           <div class="arrow-icon"><svg-icon style="width: 16px; height: 16px;" name="jt" /></div>
           <div class="line"></div>
         </div>
+        <!--  -->
         <div class="card-box">
           <div class="box-item m12">
             <div class="box-item-lf-text">买入</div>
             <div class="box-item-ri-text">
               <svg-icon style="width: 16px; height: 16px;margin-right: 2px;" name="qb" />
-              <span>18.34335890</span>
+              <span>{{ACCLIST.balance}}</span>
             </div>
           </div>
           <div class="box-item">
             <div class="unit">
-              <svg-icon style="width: 42px; height: 42px;margin-right: 12px;" name="acc" />
-              <div>ACC</div>
+              <van-image
+                width="42px"
+                height="42px"
+                round
+                :src="ACCLIST.logo"
+              />
+              <div style="margin-left: 12px;">{{ACCLIST.name}}</div>
             </div>
             <van-field v-model="buyIn" class="box-input" input-align="right" :disabled="true"/>
           </div>
         </div>
       </div>
-      <div class="proportion">1 ACC= 100.34546766  STT</div>
+      <div class="proportion">1 ACC= {{ACCLIST.rate}}  STT</div>
       <div class="btn-box">
-        <van-button class="btn" :class="sell == ''?'':'active-btn'" type="primary" size="large">确认兑换</van-button>
+        <van-button 
+          class="btn" 
+          :class="isSellValid ? 'active-btn' : ''" 
+          :disabled="!isSellValid"  
+          type="primary" size="large" @click="confirm">确认兑换
+        </van-button>
       </div>
       <div class="information-box">
         <div class="information-item">
@@ -65,22 +84,73 @@
             radius="4"
             width="42" 
             height="42" 
-            src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
+            src="https://wallet.accshare.io/storage/images/aaa.jpg"
           />
           <div style="margin-top: 4px;">ANGEL DEX</div>
         </div>
       </div>
+      </van-pull-refresh>
     </div>
 </template>
 
 <script setup>
 import { useRouter } from 'vue-router'
+import { hotTokens } from '@/api/path/login.api'
+import { useWalletStore } from "@/stores/modules/walletStore";
+import { stt2acc } from '@/api/path/exchange.api'
+import { AES_CBC_ENCRYPT,generateSign } from '@/utils/crypto';
 const router = useRouter();
+const walletStore = useWalletStore();
+
+
 const sell = ref('');
-const buyIn = ref('0.00');
+const STTLIST = ref({});
+const ACCLIST = ref({});
+const loading = ref(false);
+
+const buyIn = computed(() => {
+  const n = parseFloat(sell.value);
+  return isNaN(n) ? '0.00' : (n / ACCLIST.value.rate).toString();
+});
+// 校验 sell 是否有效:大于 0 且小于等于 51
+const isSellValid = computed(() => {
+  const n = parseFloat(sell.value);
+  return !isNaN(n) && n > 0 && n <= STTLIST.value.balance;
+});
+// 代币数据
+const gethotTokens = async () => {
+    const {data} = await hotTokens({chain: walletStore.accountName,address:walletStore.account});
+    ACCLIST.value = data[0];
+    STTLIST.value = data[1];
+}
+// 确认兑换
+const confirm = async () => {
+  let {ciphertext, iv} = AES_CBC_ENCRYPT(walletStore.privateKey);
+  let params = {
+    address: walletStore.account,
+    quantity:sell.value,
+    key:ciphertext,
+    _y:iv
+  }
+  params = generateSign(params);
+  const res = await stt2acc(params);
+  if(res.ret){
+    gethotTokens();
+    sell.value = ''
+  }
+}
 const goToPage = () => {
   router.push('jysExchange')
 }
+const onRefresh = () => {
+  setTimeout(() => {
+    gethotTokens();
+    loading.value = false;
+  }, 1000);
+};
+onMounted(async ()=>{
+  gethotTokens();
+})
 </script>
 
 <style lang="less" scoped>

+ 2 - 1
src/views/wallet/transferDetail/index.vue

@@ -49,7 +49,7 @@
                 </div>
             </div>
         </div>
-        <van-button class="footer-btn" type="primary" size="large" @click="selectPop(2)">确认</van-button>
+        <van-button class="footer-btn" type="primary" size="large" @click="selectPop(2)" :disabled="disabled">确认</van-button>
         <van-popup v-model:show="showWallet" position="bottom" round style="height:400px">
             <div class="pop-content" style="height:400px">
                 <div class="pop-title">
@@ -105,6 +105,7 @@ const showWallet = ref(false)
 const selectType = ref('');
 const hotTokensList = ref([]);
 const selecctList = ref({})
+const disabled = ref(true)
 
 const gethotTokens = async () => {
     const {data} = await hotTokens({chain: walletStore.accountName,address:walletStore.account});

+ 69 - 12
src/views/wallet/ybExchange/index.vue

@@ -7,7 +7,7 @@
                         width="50px"
                         height="50px"
                         round
-                        src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"
+                        src="https://wallet.accshare.io/storage/images/aaa.jpg"
                     />
                     <div class="card-text">
                         <div>元宝总额</div>
@@ -31,13 +31,15 @@
             <div class="list-box">
                 <div>明细</div>
                 <div class="list-box-ul">
-                    <div class="list-box-li" v-for="(item,i) in list" :key="i">
-                        <div>{{item.reason}}</div>
-                        <div class="list-box-li-text">
-                            <div>{{item.CreateTime}}</div>
-                            <div :class="item.amount < 0 ? 'red' : 'green'">{{ item.amount > 0 ? '+' + item.amount : item.amount }}</div>
+                    <van-pull-refresh v-model="loading" @refresh="onRefresh">
+                        <div class="list-box-li" v-for="(item,i) in list" :key="i">
+                            <div>{{item.reason}}</div>
+                            <div class="list-box-li-text">
+                                <div>{{item.CreateTime}}</div>
+                                <div :class="item.amount < 0 ? 'red' : 'green'">{{ item.amount > 0 ? '+' + item.amount : item.amount }}</div>
+                            </div>
                         </div>
-                    </div>
+                    </van-pull-refresh>
                 </div>
             </div>
         </div>
@@ -51,8 +53,8 @@
                     <div>{{selectIndex == 1?'兑换的币种数量,将按照当前价值转换成对应元宝实时到账':'取款的元宝数量,按照当前价值转换成兑换的币种实时到账'}}</div>
                 </div>
                 <div class="pop-btn">
-                    <van-button type="default" class="btn cancel" @click="show = false">取消</van-button>
-                    <van-button type="default" class="btn confirm" @click="show = false">提交</van-button>
+                    <van-button type="default" class="btn cancel" @click="cancel">取消</van-button>
+                    <van-button type="default" class="btn confirm" @click="confirm">提交</van-button>
                 </div>
             </div>
         </van-popup>
@@ -61,19 +63,23 @@
 
 <script setup>
 import { useWalletStore } from "@/stores/modules/walletStore";
-import { syceeBalance,syceeRecords } from '@/api/path/exchange.api'
+import { syceeBalance,syceeRecords,wgt2sycee,sycee2wgt } from '@/api/path/exchange.api'
 import { hotTokens } from '@/api/path/login.api'
+import { showToast } from 'vant';
+import { AES_CBC_ENCRYPT,generateSign } from '@/utils/crypto';
 const walletStore = useWalletStore();
 
 const list = ref([]);
 const ybbalance = ref(0);
 const text = ref('')
 const show = ref(false);
-const selectIndex = ref(1);
+const selectIndex = ref(1);//1:wgt-元宝   2:元宝-wgt
 const WGTbalance = ref(0);
+const loading = ref(false);
 
 const changePop = (i) => {
     selectIndex.value = i;
+    text.value = '';
     show.value = true;
 }
 
@@ -90,12 +96,63 @@ const gethotTokens = async () => {
     const {data} = await hotTokens({chain: walletStore.accountName,address:walletStore.account});
     WGTbalance.value = data[2].balance;
 }
+// 取消
+const cancel = () => {
+    show.value  = false;
+    text.value = ''
+}
+// 提交
+const confirm = () => {
+    const inputValue = parseFloat(text.value);
+	if (!text.value || isNaN(inputValue)) {
+        showToast('请输入有效的数量');
+	    return;
+	}
+	
+	if (inputValue <= 0) {
+        showToast('数量必须大于0');
+	    return;
+	}
+	
+	let maxValue = selectIndex.value == 1 ? parseFloat(WGTbalance.value) : parseFloat(ybbalance.value);
+	let tokenName = selectIndex.value == 1 ? 'WGT' : '元宝';
+	if (inputValue > maxValue) {
+        showToast(`输入数量不能大于可用${tokenName}数量`);
+	    return;
+	}
+    const { ciphertext, iv } = AES_CBC_ENCRYPT(walletStore.privateKey);
+    let params = {
+        address: walletStore.account,
+        quantity:text.value,
+        key:ciphertext,
+        _y:iv
+    }
+    params = generateSign(params);
+    getwgt2sycee(params);
+
+}
+const getwgt2sycee = async (params) => {
+    let res = ''
+    if(selectIndex.value == 1){
+        res = await wgt2sycee(params);
+    }else{
+        res = await sycee2wgt(params);
+    }
+    show.value  = false;
+}
+const onRefresh = () => {
+    setTimeout(() => {
+        getList();
+        getbalanceInfo();
+        gethotTokens();
+        loading.value = false;
+    }, 1000);
+};
 onMounted(async ()=>{
     getList();
     getbalanceInfo();
     gethotTokens();
 })
-
 </script>
 
 <style lang="less" scoped>