Преглед изворни кода

改布局 对接列表接口和礼包接口

pujiaming пре 2 година
родитељ
комит
9f02389328

+ 13 - 0
index.html

@@ -5,6 +5,19 @@
   <meta charset="UTF-8" />
   <link rel="icon" type="image/svg+xml" href="http://gm.nkfzs.com/favicon.ico" />
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <meta name="apple-touch-fullscreen" content="yes">
+  <meta name="Cache-Control" content="no-siteapp">
+  <meta content="black" name="apple-mobile-web-app-status-bar-style">
+  <meta name="format-detection" content="telephone=no, email=no" />
+  <meta http-equiv="Cache-Control" content="no-siteapp" />
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="Keywords" Content="好玩的游戏上朱雀">
+  <meta name="Description" Content="好玩的游戏上朱雀,朱雀游戏,手游">
+  <meta name="google" value="notranslate">
+  <meta name="renderer" content="webkit|ie-stand">
+  <meta name="force-rendering" content="webkit"/>
+  <meta name="layoutmode" content="fitscreen">
+  <meta name="HandheldFriendly" content="true">
   <script src="http://cdn.bootcss.com/blueimp-md5/1.1.0/js/md5.js"></script>
   <title>朱雀游戏官网</title>
 

+ 1 - 1
src/App.vue

@@ -22,7 +22,7 @@ onMounted(() => {
 
 const resizeChange = () => {
   // 移动端页面
-  if (document.body.clientWidth < 750) {
+  if (document.body.clientWidth <= 750) {
     if (route.path.indexOf('/p_') !== -1) {
       router.replace({ path: route.path.replace('/p_', '/m_') })
     }

+ 36 - 0
src/api/index.ts

@@ -120,4 +120,40 @@ export const userAccount = <T>(data:T) => {
         method: 'post',
         data
     })
+}
+// 用户名更改
+export const getGiftHttp = <T>(params:T) => {
+    return request({
+        url: '/game/gift',
+        method: 'get',
+        params
+    })
+}
+export const receiveGiftHttp = <T>(data:T) => {
+    return request({
+        url: '/game/tera',
+        method: 'post',
+        data
+    })
+}
+export const userOrder = <T>(params:T) => {
+    return request({
+        url: '/user/order',
+        method: 'get',
+        params
+    })
+}
+export const userEcoin = <T>(params:T) => {
+    return request({
+        url: '/user/ecoin',
+        method: 'get',
+        params
+    })
+}
+export const userNcoin = <T>(params:T) => {
+    return request({
+        url: '/user/ncoin',
+        method: 'get',
+        params
+    })
 }

+ 3 - 3
src/common/request.ts

@@ -21,11 +21,11 @@ instance.interceptors.response.use(response => {
     return response
 }, err => {
     if (err.response.status === 401) {
-        localStorage.setItem('token', '')
+        localStorage.removeItem('token')
         Message.error('登录状态已失效!请重新登录!')
         setTimeout(() => {
-            window.location.reload()
-            router.push({ path: '/p_login' })
+            let isMobile = !!navigator.userAgent.match(/AppleWebKit.*Mobile.*/)
+            router.push({ path: isMobile?'/m_login':'/p_login' })
         }, 1000)
     }
     return Promise.reject(err.response)

+ 7 - 11
src/layout/Layout.vue

@@ -2,8 +2,9 @@
     <div class="gameIndex df fdc psr">
         <!-- 头部 -->
         <header-vue class="header psf"></header-vue>
+        <div style="height: 120px;background-color: #ed8c0f;"></div>
         <!-- 内容 -->
-        <section-vue class="main"></section-vue>
+        <section-vue></section-vue>
         <!-- 尾部 -->
         <!-- <footer-vue class="footer"></footer-vue> -->
         <el-backtop :bottom="100">
@@ -32,23 +33,18 @@ import sectionVue from './section.vue';
 
 <style scoped lang="scss">
 .gameIndex {
-    background-color: #f7f7f7;
-
+    // background-color: #f7f7f7;
     .header {
         width: 100%;
-        height: 80px;
+        height: 120px;
         top: 0;
         left: 0;
-        background-color: #fff;
-    }
-
-    .main {
-        margin-top: 120px;
-        overflow: hidden;
+        background-color: rgba($color: #fff, $alpha: 1);
+        z-index: 999;
     }
 
     .footer {
-        height: 100px;
+        height: 40px;
         background-color: #e7e7e7;
     }
 }

+ 2 - 2
src/layout/footer.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="foot">
-        <div class="w1000 footer_cont df aic jcc">
-            尾部内容
+        <div class="footer_cont df aic jcc">
+            
         </div>
     </div>
 </template>

+ 14 - 13
src/layout/header.vue

@@ -1,13 +1,13 @@
 <template>
-  <div class="header_nav">
-    <nav class="w1000 df jcsb aic">
+  <div class="header_nav" >
+    <nav class="w1000 df jcsb aic" >
       <!-- 网站title -->
       <h1 class="game_logo df aic" @click="clearAct">
         <a class="logo" href="/p_index" alt="朱雀游戏官网" title="朱雀游戏官网">朱雀游戏中心</a>
       </h1>
 
       <!-- 首页、分类、排行 -->
-      <router-link v-for="(item, index) in routes" :key="index" class="nav_title" :to="item.path"
+      <router-link v-for="(item, index) in user.routes" :key="index" class="nav_title" :to="item.path"
         @click="changeIndex(item.title)" :class="{ active: currentIndex === item.title }">
         {{ item.title }}
       </router-link>
@@ -36,23 +36,25 @@
         </el-dropdown>
       </router-link>
     </nav>
-    <div class="w1000 df aic jcc" style="padding-top: 8px;padding: 10px 0; background-color: #fff;font-size: 16px;color: #ed8c0f;">客服qq:386501046</div>
+    <div class="w1000 df aic jcc" style="padding-top: 8px;padding: 10px 0;height: 40px;font-size: 16px;color: #ed8c0f;">客服qq:386501046</div>
   </div>
 </template>
 
 <script setup lang="ts">
-import { reactive, ref, watch } from 'vue'
+import { reactive, ref, watch, onMounted } from 'vue'
 import { Search } from '@element-plus/icons-vue'
 import { useRouter, useRoute } from 'vue-router'
-import { getGameList } from '@/api/index'
+import { getGameList, userAccount } from '@/api/index'
 import Message from '@/utils/Message'
 import local from '@/utils/local'
 import { useStore } from '@/store'
+import { on } from 'events'
 
 const router = useRouter()
 const route = useRoute()
 const search = useStore('search')
 const header = useStore('header')
+const user = useStore('user')
 
 // 搜索内容
 const game_name = ref(local.get('searchText') || '')
@@ -69,13 +71,12 @@ if (route.query.account) {
 }
 
 // 顶部导航栏
-const routes = reactive([
-  { id: 0, path: '/p_index', title: '首页' },
-  // { id: 1, path: '/p_rank', title: '排行' },
-  { id: 2, path: '/p_categroy', title: '分类' },
-  { id: 3, path: '/p_mine', title: '我的' }
-])
-
+onMounted(() => {
+  let token = localStorage.getItem('token')
+  if(token){
+    user.getUserProfile()
+  }
+})
 // 改变字体颜色
 const changeIndex = (val: string) => {
   currentIndex.value = val

+ 25 - 2
src/layout/section.vue

@@ -1,12 +1,35 @@
 <template>
     <!-- 二级路由出口 -->
-    <router-view></router-view>
+    <div class="main">
+        <div class="body-wrapper">
+            <router-view></router-view>
+        </div>
+    </div>
 </template>
 
 <script setup lang="ts">
 
 </script>
 
-<style scoped>
+<style lang="scss" scoped>
+.main{
+    width: 100%;
+    // background-color: #ed8c0f;
+    background-image: linear-gradient(to bottom left, #ED8C0F, #EF6158, #C85384, #875892, #49557F, #2F4858 );
+    min-height: calc(100vh - 160px);
+    padding-bottom: 30px;
+    .body-wrapper{
+        width: 1000px;
+        margin: 0 auto;
+        margin-top: 30px;
+        border-radius: 12px;
+        overflow: hidden;
+        min-height: calc(100vh - 160px);
+        // background-color: rgba($color: #fff, $alpha: 0.5);
+        background-color: rgba($color: #fff, $alpha: 1);
+        padding: 30px;
+        box-sizing: border-box;
 
+    }
+}
 </style>

+ 4 - 1
src/main.ts

@@ -5,6 +5,7 @@ import router from './router'
 // 引入element-plus
 import ElementPlus from 'element-plus'
 import 'element-plus/dist/index.css'
+import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
 
 //引入样式
 import './assets/css/normalize.css'
@@ -25,7 +26,9 @@ import Footer from './components/Footer.vue'
 const app = createApp(App)
 
 app
-.use(ElementPlus)
+.use(ElementPlus,{
+    locale: zhCn,
+  })
 .use(router)
 .use(store)
 .component('loading', loading)

+ 54 - 2
src/router/index.ts

@@ -88,6 +88,42 @@ const routes:Array<RouteRecordRaw> = [
       }
     ]
   },
+  {
+    path: '/order',
+    name: 'order',
+    component: Layout,
+    meta: { type: 'pc', title:'订单' },
+    children: [
+      {
+        path: '/order',
+        component: () => import('@/view/p_views/order/index.vue')
+      }
+    ]
+  },
+  {
+    path: '/ecoin',
+    name: 'ecoin',
+    component: Layout,
+    meta: { type: 'pc', title:'订单' },
+    children: [
+      {
+        path: '/ecoin',
+        component: () => import('@/view/p_views/ecoin/index.vue')
+      }
+    ]
+  },
+  {
+    path: '/ncoin',
+    name: 'ncoin',
+    component: Layout,
+    meta: { type: 'pc', title:'订单' },
+    children: [
+      {
+        path: '/ncoin',
+        component: () => import('@/view/p_views/ncoin/index.vue')
+      }
+    ]
+  },
   // 搜索
   {
     path: '/p_search',
@@ -144,7 +180,13 @@ const routes:Array<RouteRecordRaw> = [
     name: 'm_reset',
     meta: { type: 'mobile', title:'密码设置' },
     component: () => import('@/view/m_views/resetPwd/resetPwd.vue')
-  }
+  },
+  // {
+  //   path: '/m_reset',
+  //   name: 'm_reset',
+  //   meta: { type: 'mobile', title:'订单' },
+  //   component: () => import('@/view/m_views/resetPwd/resetPwd.vue')
+  // }
 ]
 
 
@@ -164,7 +206,17 @@ router.beforeEach((to, form, next) => {
   } else {
       document.title = '朱雀游戏中心' //此处写默认的title
   }
-  next()
+  // && needLoginPath.includes(to.path)
+  let token = localStorage.getItem('token')
+  let isMobile = !!navigator.userAgent.match(/AppleWebKit.*Mobile.*/)
+  let whiteList = ['/m_login', '/p_login', '/p_index', '/m_index', '/p_rank', '/m_rank', '/p_categroy', '/m_categroy']
+  console.log(!token, !whiteList.includes(to.path));
+  
+  if(!token && !whiteList.includes(to.path) ){
+    isMobile? next('/m_login') : next('/p_login')
+  }else{
+    next()
+  }
 })
 
 export default router

+ 17 - 1
src/store/user.ts

@@ -8,7 +8,14 @@ const userInfo = defineStore({
             account: '',
             password: ''
         },
-        profile:{}
+        profile:{} as any,
+        routes:[
+            { id: 0, path: '/p_index', title: '首页' },
+            // { id: 1, path: '/p_rank', title: '排行' },
+            { id: 2, path: '/p_categroy', title: '分类' },
+            { id: 4, path: '/order', title: '订单' },
+            { id: 3, path: '/p_mine', title: '我的' }
+        ] as {id:number,path:string,title:string}[]
     }),
     actions: {
         setUerInfo(data: any) {
@@ -23,6 +30,15 @@ const userInfo = defineStore({
             await userProfile({from: parseInt(localStorage.getItem('from') as string)}).then((res) => {
                 console.log(res)
                 this.setProfile(res.data.data)
+                this.routes = [
+                    { id: 0, path: '/p_index', title: '首页' },
+                    // { id: 1, path: '/p_rank', title: '排行' },
+                    { id: 2, path: '/p_categroy', title: '分类' },
+                    { id: 4, path: '/order', title: '订单' },
+                    { id: 5, path: '/ecoin', title: this.profile.ecoinName },
+                    { id: 6, path: '/ncoin', title: this.profile.ncoinName },
+                    { id: 3, path: '/p_mine', title: '我的' }
+                ]
             }).catch((error) => {
                 console.log(error)
             })

+ 31 - 0
src/utils/index.ts

@@ -0,0 +1,31 @@
+export function parseTime (time, cFormat) {
+    if (arguments.length === 0) {
+      return null
+    }
+    const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+    let date
+    if (typeof time === 'object') {
+      date = time
+    } else {
+      if (('' + time).length === 10) time = parseInt(time) * 1000
+      date = new Date(time)
+    }
+    const formatObj = {
+      y: date.getFullYear(),
+      m: date.getMonth() + 1,
+      d: date.getDate(),
+      h: date.getHours(),
+      i: date.getMinutes(),
+      s: date.getSeconds(),
+      a: date.getDay()
+    }
+    const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+      let value = formatObj[key]
+      if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
+      if (result.length > 0 && value < 10) {
+        value = '0' + value
+      }
+      return value || 0
+    })
+    return time_str
+  }

+ 58 - 9
src/view/m_views/mine/index.vue

@@ -28,15 +28,38 @@
         </van-empty>
     </div>
     <van-dialog v-model:show="dialogVisible" title="查看礼包" confirm-button-text="关闭">
-        <van-collapse v-model="activeNames">
-            <van-collapse-item title="新手礼包" name="1">
+        <van-collapse v-if="giftData.length" v-model="activeNames">
+            <van-collapse-item v-for="(item, index) in giftData" :key="index" :title="item.gift_name" :name="item.id">
                 <template #value>
-                    <van-button round color="#ed8c0f">领取礼包</van-button>
+                    <van-button :disabled="item.user_get_at !== ''" round color="#ed8c0f" @click="receiveGift(item.id)">领取礼包</van-button>
                 </template>
-                代码是写出来给人看的,附带能在机器上运行。
+                <van-cell-group>
+                    <van-cell value-class="value-length" center size="large" title="礼包内容:" :value="item.gift_content">
+                        <template #value>
+                            <div style="text-align: left;">
+                                {{ item.gift_content }}
+                            </div>
+                        </template>
+                    </van-cell>
+                    <van-cell value-class="value-length" center size="large" title="使用方法:" :value="item.usage">
+                        <template #value>
+                            <div style="text-align: left;">
+                                {{ item.usage }}
+                            </div>
+                        </template>
+                    </van-cell>
+                    <van-cell value-class="value-length" center size="large" title="有效期:" :value="item.start_at+'-'+item.end_at">
+                        <template #value>
+                            <div style="text-align: left;">
+                                {{ item.start_at+'-'+item.end_at }}
+                            </div>
+                        </template>
+                    </van-cell>
+                </van-cell-group>
             </van-collapse-item>
             
         </van-collapse>
+        <van-empty v-else description="暂无礼包" />
     </van-dialog>
     <van-back-top style="background-color: #ed8c0f;" />
     <!-- <m_footer></m_footer> -->
@@ -44,11 +67,13 @@
 
 <script setup lang="ts">
 import { onMounted, ref, reactive } from 'vue'
-import { getMineGame } from '@/api/index'
+import { getMineGame, getGiftHttp, receiveGiftHttp } from '@/api/index'
+
 import { useRouter, useRoute } from 'vue-router'
 import Message from '@/utils/Message'
 import MobList from '@/components/MobList.vue';
 import { useStore } from '@/store/index'
+import { showSuccessToast, showFailToast } from 'vant';
 
 const router = useRouter()
 const route = useRoute()
@@ -115,13 +140,29 @@ const loadMore = () => {
 const goLogin = () => {
     router.push({ path: 'm_login' })
 }
+const giftData = ref<any[]>([])
 const activeNames = ref(['1']);
 const dialogVisible = ref<boolean>(false)
-const showGifts = (row:any) => {
-   console.log(row);
-   dialogVisible.value = true
+const showGifts = async(row:any) => {
+    await getGiftHttp({game_id: row.game_id}).then((res) => {
+    // console.log(res.data.data)
+    giftData.value = res.data.data || []
+    dialogVisible.value = true
+   }).catch((error) => {
+    console.log(error)
+    showSuccessToast(error.data.msg)
+   })
+}
+const receiveGift = async(id:number) => {
+   await receiveGiftHttp({id}).then((res) => {
+    console.log(res)
+    showSuccessToast(res.data.msg)
+    dialogVisible.value = false
+   }).catch((error) => {
+    console.log(error)
+    showSuccessToast(error.data.msg)
+   })
 }
-
 </script>
 
 <style scoped lang="scss">
@@ -151,5 +192,13 @@ const showGifts = (row:any) => {
         border: 1px solid #c7c7c7;
     }
 }
+.title-length{
+    // flex: ;
+}
 
+</style>
+<style>
+.value-length{
+    flex: 2!important;
+}
 </style>

+ 1 - 1
src/view/p_views/categroy/index.vue

@@ -1,6 +1,6 @@
 <template>
     <loading v-if="isLoading" :style="{ height: viewWidth + 'px' }" />
-    <div v-else class="w1000 category">
+    <div v-else class="category">
         <div class="header_list">
             <div class="top_type">
                 <div class="type df aic">

+ 85 - 0
src/view/p_views/ecoin/index.vue

@@ -0,0 +1,85 @@
+<template>
+    <loading v-if="isLoading" :style="{ height: viewWidth + 'px' }" />
+    <div v-else>
+        <el-table :data="gameHot" style="width: 100%">
+            <el-table-column prop="game_name" label="游戏名称"  />
+           
+            <el-table-column prop="total_ecoin" label="余额" />
+            <el-table-column prop="created_at" label="创建时间" width="180" />
+            <el-table-column prop="modified_at" label="修改时间" width="180" />
+        </el-table>
+        <div class="demo-pagination-block">
+            <el-pagination
+                v-model:current-page="pageConfig.page"
+                hide-on-single-page
+                v-model:page-size="pageConfig.pagesize"
+                layout="prev, pager, next, jumper,total"
+                :total="pageConfig.total"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, ref, reactive } from 'vue'
+import { userEcoin } from '@/api/index'
+import Message from '@/utils/Message'
+import IndexList from '@/components/IndexList.vue'
+import {parseTime } from '@/utils/index'
+
+const gameHot: any = ref([])
+const gameRecommand: any = ref([])
+const prefix = ref<string>('')
+const isLoading = ref<boolean>(true)
+const viewWidth = ref<number>(document.documentElement.clientHeight - 80)
+const pageConfig = reactive({
+    page: 1,
+    pagesize: 10,
+    total: 0
+})
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`)
+  pageConfig.page = val
+}
+const status = ref<any[]>([])
+const getTableData = async() => {
+   const params = {
+    page:pageConfig.page,
+    pagesize: pageConfig.pagesize
+   }
+   await userEcoin(params).then(res => {
+        console.log('热门游戏', res.data);
+        if (res.data.code === 200 && res.data.data) {
+            gameHot.value = res.data.data.lists || []
+            isLoading.value = false
+            pageConfig.total = res.data.data.total.total || 0
+            status.value = res.data.data.status
+        }
+    }).catch(err => {
+        console.log(err);
+        
+        Message.error(err.data.msg)
+    })
+}
+onMounted(async() => {
+    getTableData()
+})
+
+</script>
+
+<style scoped lang="scss">
+.game_list {
+    box-sizing: border-box;
+    // padding: 20px;
+    background-color: #fff;
+    margin: 15px auto 20px;
+
+    h2 {
+        font-size: 28px;
+        font-weight: normal;
+        height: 30px;
+        padding: 30px;
+    }
+}
+</style>

+ 1 - 2
src/view/p_views/index/index.vue

@@ -1,7 +1,7 @@
 <template>
     <loading v-if="isLoading" :style="{ height: viewWidth + 'px' }" />
 
-    <div v-else class="w1000">
+    <div v-else >
         <!-- 热门游戏 -->
         <div v-if="gameHot.length > 0" class="game_list">
             <h2>热门游戏</h2>
@@ -12,7 +12,6 @@
             <h2>推荐游戏</h2>
             <IndexList :list="gameRecommand" :prefix="prefix"></IndexList>
         </div>
-
     </div>
 </template>
 

+ 1 - 1
src/view/p_views/login/index.vue

@@ -197,7 +197,7 @@ onMounted(() => {
 <style scoped lang="scss">
 .login {
     // background-color: #fff;
-    padding-top: 130px;
+    // padding-top: 130px;
     // background: url('https://t7.baidu.com/it/u=3939632370,2791869803&fm=193&f=GIF') no-repeat 100% / 100%;
 
     .login_logo{

+ 35 - 23
src/view/p_views/mine/index.vue

@@ -3,7 +3,7 @@
 
     <div v-if="token">
         <loading v-if="isLoading" :style="{ height: viewWidth + 'px' }" />
-        <div v-else class="w1000" style="margin: 20px auto;">
+        <div v-else  >
                 <!-- <h2>我的游戏</h2> -->
                 <!-- <IndexList :list="mineGame" :prefix="prefix"></IndexList>
                 <div class="more df aic jcc" v-if="(total > 10 ? true : false)">
@@ -12,7 +12,7 @@
                 <div v-if="mineGame.length > 0">
                     <IndexList :list="mineGame" :prefix="prefix">
                         <template #custom-button="scope">
-                            <el-button @click="showGifts(scope.row)">查看礼包</el-button>
+                            <el-button style="color: #fff;" color="#ed8c0f" @click="showGifts(scope.row)">查看礼包</el-button>
                         </template>
                     </IndexList>
                     <div class="more df aic jcc" v-if="params.page * params.pagesize <= mineGame.length">
@@ -32,29 +32,23 @@
         </el-empty>
     </div>
     <el-dialog  v-model="dialogVisible" title="游戏礼包">
-        <el-collapse v-model="activeName" accordion>
-            <div style="display: flex;justify-content: space-between; align-items: center;">
-                <el-collapse-item title="新手礼包" name="1" style="width: 70%;">
-                    <div>
-                    礼包内容:守护符[武器]*1,守护符[防具]*1,强化石*1幸运符(5%)*5
-                    </div>
-                    <div>使用方法: 活动-礼包码兑换-邮件领取</div>
-                    <div>有效期:2023-08-02-2025-12-31</div>
+        <el-collapse v-if="giftData.length" v-model="activeName" accordion>
+            <div v-for="(item, index) in giftData" :key="index" style="display: flex;justify-content: space-between; align-items: center;">
+                <el-collapse-item :title="item.gift_name" :name="item.id" style="width: 70%;">
+                    <el-form label-width="120px">
+                        <el-form-item label="礼包内容:">{{ item.gift_content }}</el-form-item>
+                        <el-form-item label="使用方法:">{{ item.usage }}</el-form-item>
+                        <el-form-item label="有效期:">{{ item.start_at+'-'+item.end_at }}</el-form-item>
+                    </el-form>
                 </el-collapse-item>
                 <div style="width: 20%;">
-                    <el-button @click="dialogVisible = false">领取礼包</el-button>
+                    <el-button :disabled="item.user_get_at !== ''" color="#ed8c0f" style="color: #fff;" @click="receiveGift(item.id)">领取礼包</el-button>
                 </div>
             </div>
             
         </el-collapse>
-        <!-- <template #footer>
-            <span class="dialog-footer">
-                <el-button @click="dialogVisible = false">Cancel</el-button>
-                <el-button type="primary" @click="dialogVisible = false">
-                Confirm
-                </el-button>
-            </span>
-        </template> -->
+        <el-empty v-else description="暂无礼包" />
+        
     </el-dialog>
 </div>
 
@@ -62,7 +56,7 @@
 
 <script setup lang="ts">
 import { onMounted, ref, reactive, watch } from 'vue'
-import { getMineGame } from '@/api/index'
+import { getMineGame, getGiftHttp, receiveGiftHttp } from '@/api/index'
 import { useStore } from '@/store/index'
 import { useRouter, useRoute, onBeforeRouteUpdate } from 'vue-router'
 import Message from '@/utils/Message'
@@ -132,9 +126,27 @@ const goLogin = () => {
     router.push({ path: 'p_login' })
     local.remove('headerPath')
 }
-const showGifts = (row:any) => {
-   console.log(row);
-   dialogVisible.value = true
+const giftData = ref<any[]>([])
+const showGifts = async(row:any) => {
+//    console.log(row);
+   await getGiftHttp({game_id: row.game_id}).then((res) => {
+    // console.log(res.data.data)
+    giftData.value = res.data.data || []
+    dialogVisible.value = true
+   }).catch((error) => {
+    console.log(error)
+   })
+   
+}
+const receiveGift = async(id:number) => {
+   await receiveGiftHttp({id}).then((res) => {
+    console.log(res)
+    Message.error(res.data.msg)
+    dialogVisible.value = false
+   }).catch((error) => {
+    console.log(error)
+    Message.error(error.data.msg)
+   })
 }
 
 </script>

+ 83 - 0
src/view/p_views/ncoin/index.vue

@@ -0,0 +1,83 @@
+<template>
+    <loading v-if="isLoading" :style="{ height: viewWidth + 'px' }" />
+    <div v-else>
+        <el-table :data="gameHot" style="width: 100%">
+            <el-table-column prop="game_name" label="游戏名称"  />
+           
+            <el-table-column prop="total_coin" label="余额" />
+            <el-table-column prop="created_at" label="创建时间" width="180" />
+            <el-table-column prop="modified_at" label="修改时间" width="180" />
+        </el-table>
+        <div class="demo-pagination-block">
+            <el-pagination
+                v-model:current-page="pageConfig.page"
+                hide-on-single-page
+                v-model:page-size="pageConfig.pagesize"
+                layout="prev, pager, next, jumper,total"
+                :total="pageConfig.total"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, ref, reactive } from 'vue'
+import { userNcoin } from '@/api/index'
+import Message from '@/utils/Message'
+import IndexList from '@/components/IndexList.vue'
+import {parseTime } from '@/utils/index'
+
+const gameHot: any = ref([])
+const gameRecommand: any = ref([])
+const prefix = ref<string>('')
+const isLoading = ref<boolean>(true)
+const viewWidth = ref<number>(document.documentElement.clientHeight - 80)
+const pageConfig = reactive({
+    page: 1,
+    pagesize: 10,
+    total: 0
+})
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`)
+  pageConfig.page = val
+}
+const getTableData = async() => {
+   const params = {
+    page:pageConfig.page,
+    pagesize: pageConfig.pagesize
+   }
+   await userNcoin(params).then(res => {
+        console.log('热门游戏', res.data);
+        if (res.data.code === 200 && res.data.data) {
+            gameHot.value = res.data.data.lists || []
+            isLoading.value = false
+            pageConfig.total = res.data.data.total || 0
+        }
+    }).catch(err => {
+        console.log(err);
+        
+        Message.error(err.data.msg)
+    })
+}
+onMounted(async() => {
+    getTableData()
+})
+
+</script>
+
+<style scoped lang="scss">
+.game_list {
+    box-sizing: border-box;
+    // padding: 20px;
+    background-color: #fff;
+    margin: 15px auto 20px;
+
+    h2 {
+        font-size: 28px;
+        font-weight: normal;
+        height: 30px;
+        padding: 30px;
+    }
+}
+</style>

+ 108 - 0
src/view/p_views/order/index.vue

@@ -0,0 +1,108 @@
+<template>
+    <loading v-if="isLoading" :style="{ height: viewWidth + 'px' }" />
+    <div v-else>
+        <el-table :data="gameHot" style="width: 100%">
+            <el-table-column prop="order_number" label="订单号" width="180"/>
+            <el-table-column prop="appname" label="游戏名称"  />
+            <el-table-column prop="game_product_name" label="道具名称"  />
+            <el-table-column prop="order_amount" label="道具数量" />
+            <el-table-column prop="order_submit_time" label="创建时间" width="180">
+                <template #default="scope">
+                    <div>
+                        {{ parseTime(scope.row.order_submit_time) }}
+                    </div>
+                </template>
+            </el-table-column>
+            <el-table-column prop="order_asynch_time" label="付款时间" width="180">
+                <template #default="scope">
+                    <div>
+                        {{ scope.row.order_asynch_time? parseTime(scope.row.order_asynch_time):'-' }}
+                    </div>
+                </template>
+            </el-table-column>
+            <el-table-column prop="channel_name" label="支付方式" />
+            <el-table-column prop="order_submit_time" label="订单状态" >
+                <template #default="scope">
+                    <div>
+                        {{ status[scope.row.order_status] }}
+                    </div>
+                </template>
+            </el-table-column>
+            <el-table-column prop="target_role_id" label="游戏订单号" width="180"/>
+            <el-table-column prop="out_trade_no" label="支付平台订单号" width="180" />
+        </el-table>
+        <div class="demo-pagination-block">
+            <el-pagination
+                v-model:current-page="pageConfig.page"
+                hide-on-single-page
+                v-model:page-size="pageConfig.pagesize"
+                layout="prev, pager, next, jumper,total"
+                :total="pageConfig.total"
+                @current-change="handleCurrentChange"
+            />
+        </div>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, ref, reactive } from 'vue'
+import { userOrder } from '@/api/index'
+import Message from '@/utils/Message'
+import IndexList from '@/components/IndexList.vue'
+import {parseTime } from '@/utils/index'
+
+const gameHot: any = ref([])
+const gameRecommand: any = ref([])
+const prefix = ref<string>('')
+const isLoading = ref<boolean>(true)
+const viewWidth = ref<number>(document.documentElement.clientHeight - 80)
+const pageConfig = reactive({
+    page: 1,
+    pagesize: 10,
+    total: 0
+})
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`)
+  pageConfig.page = val
+}
+const status = ref<any[]>([])
+const getTableData = async() => {
+   const params = {
+    page:pageConfig.page,
+    pagesize: pageConfig.pagesize
+   }
+   await userOrder(params).then(res => {
+        console.log('热门游戏', res.data);
+        if (res.data.code === 200 && res.data.data) {
+            gameHot.value = res.data.data.lists || []
+            isLoading.value = false
+            pageConfig.total = res.data.data.total.total || 0
+            status.value = res.data.data.status
+        }
+    }).catch(err => {
+        console.log(err);
+        
+        Message.error(err.data.msg)
+    })
+}
+onMounted(async() => {
+    getTableData()
+})
+
+</script>
+
+<style scoped lang="scss">
+.game_list {
+    box-sizing: border-box;
+    // padding: 20px;
+    background-color: #fff;
+    margin: 15px auto 20px;
+
+    h2 {
+        font-size: 28px;
+        font-weight: normal;
+        height: 30px;
+        padding: 30px;
+    }
+}
+</style>

+ 2 - 4
src/view/p_views/resetPwd/resetPwd.vue

@@ -1,7 +1,6 @@
 <template>
   <div>
     <div class="wrapper">
-      
         <el-tabs>
             <el-tab-pane label="密码设置">
               <div class="form-wrapper">
@@ -189,11 +188,10 @@ onMounted(async()=>{
 .wrapper{
   width: 1000px;
   background-color: #fff;
-  min-height: 500px;
-  margin: 30px auto;
+  margin: 0px auto;
   border-radius: 15px;
   box-sizing: border-box;
-  padding: 30px;
+  padding: 0px;
   .form-wrapper{
     width: 60%;
     // height: 100%;