push code
8
.idea/UI.iml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
44
.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,44 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<Languages>
|
||||
<language minSize="75" name="TypeScript" />
|
||||
<language minSize="152" name="Python" />
|
||||
</Languages>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="myValues">
|
||||
<value>
|
||||
<list size="8">
|
||||
<item index="0" class="java.lang.String" itemvalue="nobr" />
|
||||
<item index="1" class="java.lang.String" itemvalue="noembed" />
|
||||
<item index="2" class="java.lang.String" itemvalue="comment" />
|
||||
<item index="3" class="java.lang.String" itemvalue="noscript" />
|
||||
<item index="4" class="java.lang.String" itemvalue="embed" />
|
||||
<item index="5" class="java.lang.String" itemvalue="script" />
|
||||
<item index="6" class="java.lang.String" itemvalue="div" />
|
||||
<item index="7" class="java.lang.String" itemvalue="tr" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
<option name="myCustomValuesEnabled" value="true" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="ignoredErrors">
|
||||
<list>
|
||||
<option value="N806" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredIdentifiers">
|
||||
<list>
|
||||
<option value="dict.__getitem__" />
|
||||
<option value="str.__sub__" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
4
.idea/misc.xml
generated
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||
</project>
|
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/UI.iml" filepath="$PROJECT_DIR$/.idea/UI.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Vue 3 + Vite
|
||||
|
||||
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
- [VS Code](https://code.visualstudio.com/) + [Vue - Official](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (previously Volar) and disable Vetur
|
16
index.html
Normal file
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.png" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width,initial-scale=1,shrink-to-fit=no,maximum-scale=1,minimum-scale=1,user-scalable=0,minimal-ui,viewport-fit=cover"
|
||||
/>
|
||||
<title>Web</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
2128
package-lock.json
generated
Normal file
26
package.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "wsec",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios": "^1.7.2",
|
||||
"moment": "^2.30.1",
|
||||
"pinia": "^2.1.7",
|
||||
"sass": "^1.77.4",
|
||||
"socket.io-client": "^4.7.5",
|
||||
"swiper": "^11.1.4",
|
||||
"vant": "^4.9.1",
|
||||
"vue": "^3.4.21",
|
||||
"vue-router": "^4.0.13"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"vite": "^5.2.0"
|
||||
}
|
||||
}
|
BIN
public/favicon.png
Normal file
After Width: | Height: | Size: 12 KiB |
5
src/App.vue
Normal file
@ -0,0 +1,5 @@
|
||||
<script setup></script>
|
||||
|
||||
<template>
|
||||
<router-view />
|
||||
</template>
|
43
src/api/index.js
Normal file
@ -0,0 +1,43 @@
|
||||
export default {
|
||||
// auth
|
||||
LOGIN: "/auth/login",
|
||||
REGISTER: "/auth/register",
|
||||
VALID_USERNAME: "/auth/valid-username",
|
||||
|
||||
CHECK_PASSWORD: "/auth/check-password",
|
||||
CHANGE_PASSWORD: "/auth/change-password",
|
||||
|
||||
PASSWORD_WITHDRAW: "/auth/password-withdraw",
|
||||
CHECK_PASSWORD_WITHDRAW: "/auth/check-password-withdraw",
|
||||
CHANGE_PASSWORD_WITHDRAW: "/auth/change-password-withdraw",
|
||||
|
||||
// user
|
||||
USER_INFO: "/user/info",
|
||||
USER_SET_FULLNAME: "/user/set-fullname",
|
||||
|
||||
// game
|
||||
GAME_INFO: "/product/info",
|
||||
GAME_HISTORY: "/game/result-history",
|
||||
GAME_RESULT: "/game/last-result",
|
||||
GAME_CURRENT: "/game/current-game",
|
||||
|
||||
// bank
|
||||
BANK_LIST: "/bank/list",
|
||||
BANK_LINK: "/bank/link",
|
||||
|
||||
BANK_INFO: "admin/config/bank",
|
||||
|
||||
// transaction
|
||||
TRANSACTION_DEPOSIT: "/transaction/deposit",
|
||||
TRANSACTION_WITHDRAW: "/transaction/withdraw",
|
||||
TRANSACTION_HISTORY: "/transaction/history",
|
||||
|
||||
// /product
|
||||
PRODUCT_LIST: "/product/list",
|
||||
|
||||
// order
|
||||
ORDER_HISTORY: "order/history",
|
||||
ORDER: "/order",
|
||||
ORDER_DATE_PROFIT: "/order/date-profit"
|
||||
|
||||
};
|
10422
src/assets/css/chunkVendor.css
Normal file
4160
src/assets/css/main.css
Normal file
BIN
src/assets/images/common/beauty3.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
src/assets/images/common/bgGirl.png
Normal file
After Width: | Height: | Size: 878 KiB |
BIN
src/assets/images/common/bgMine.png
Normal file
After Width: | Height: | Size: 786 KiB |
BIN
src/assets/images/common/empty-image-default.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
src/assets/images/common/indexed.png
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
src/assets/images/common/logo.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
src/assets/images/common/my.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
src/assets/images/common/subscribe2.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
src/assets/images/common/video.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
src/assets/images/common/vip1.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
src/assets/images/common/vn.png
Normal file
After Width: | Height: | Size: 74 KiB |
21
src/assets/images/icon/baobiao.svg
Normal file
After Width: | Height: | Size: 10 KiB |
15
src/assets/images/icon/gonggao.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
|
||||
<title>通知公告</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="个人模块" transform="translate(0.000000, -104.000000)">
|
||||
<circle id="椭圆形备份-2" stroke="#BCBABA" stroke-width="0.6" cx="15" cy="119" r="14"/>
|
||||
<g id="公告" transform="translate(5.000000, 107.000000)" fill-rule="nonzero">
|
||||
<rect id="矩形" fill="#19547B" opacity="0" x="0" y="0" width="20" height="20"/>
|
||||
<path d="M9.95410156,2 C11.1453711,2 12.1110742,2.96539063 12.1110742,4.15625 C12.1110742,4.20736328 12.1093164,4.25804688 12.1058008,4.30828125 C12.1194727,4.31683594 12.1329883,4.32605469 12.1462109,4.3359375 L16.3557812,7.48046875 L17.099082,7.48048828 C17.9677148,7.48048828 18.671875,8.18441406 18.671875,9.05275391 L18.671875,18.3965039 C18.671875,19.2648438 17.9677148,19.9687695 17.099082,19.9687695 L2.76419922,19.9687695 C1.89556641,19.9687695 1.19140625,19.2648242 1.19140625,18.3964844 L1.19140625,9.05273438 C1.19140625,8.18439453 1.89556641,7.48046875 2.76419922,7.48046875 L3.82203125,7.48044922 L7.82308594,4.49171875 C7.80760127,4.39249846 7.79902595,4.29232257 7.79742187,4.19191406 L7.79712891,4.15625 C7.79712891,2.96539063 8.76285156,2 9.95410156,2 Z M17.099082,8.6484375 L2.76419922,8.6484375 C2.54482422,8.6484375 2.36625,8.82304688 2.35994141,9.04082031 L2.35976562,9.05273438 L2.35976562,18.3964844 C2.35976562,18.6157813 2.53443359,18.7942969 2.75226562,18.8006055 L2.76419922,18.8007813 L17.099082,18.8007813 C17.318457,18.8007813 17.4970312,18.6261719 17.5033398,18.4083984 L17.5035156,18.3964844 L17.5035156,9.05273438 C17.5035156,8.8334375 17.3288477,8.65492188 17.1110156,8.64861328 L17.099082,8.6484375 Z M15.0016211,14.7802734 C15.3242578,14.7802734 15.5858008,15.0417383 15.5858008,15.3642578 C15.5858008,15.682168 15.3316797,15.9407617 15.0154102,15.9480859 L15.0016211,15.9482422 L4.83130859,15.9482422 C4.50865234,15.9482422 4.24712891,15.6867773 4.24712891,15.3642578 C4.24712891,15.0463477 4.50123047,14.7877539 4.8175,14.7804297 L4.83128906,14.7802734 L15.0016211,14.7802734 Z M10.234668,11.4560547 C10.5573242,11.4560547 10.8188477,11.7175195 10.8188477,12.0400391 C10.8188477,12.3579492 10.5647461,12.616543 10.248457,12.6238672 L10.234668,12.6240234 L4.83128906,12.6240234 C4.50867187,12.6240234 4.24710937,12.3625586 4.24710937,12.0400391 C4.24710937,11.7221289 4.50125,11.4635352 4.8175,11.4562109 L4.83128906,11.4560547 L10.234668,11.4560547 Z M11.6819727,5.44716797 C11.2885742,5.9725 10.6610742,6.3125 9.95410156,6.3125 C9.30521484,6.3125 8.72324219,6.02605469 8.3278125,5.57275391 L5.77390625,7.48044922 L14.4039258,7.48044922 L11.6819727,5.44716797 Z M9.95410156,3.16796875 C9.40810547,3.16796875 8.96548828,3.61042969 8.96548828,4.15625 C8.96548828,4.70207031 9.40810547,5.14453125 9.95410156,5.14453125 C10.5000977,5.14453125 10.9427148,4.70207031 10.9427148,4.15625 C10.9427148,3.61042969 10.5000977,3.16796875 9.95410156,3.16796875 L9.95410156,3.16796875 Z" id="形状" fill="#686868"/>
|
||||
</g>
|
||||
<g id="编组-3"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/assets/images/icon/ico-addr.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
src/assets/images/icon/ico-img-active.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
src/assets/images/icon/ico-img.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
src/assets/images/icon/ico-info-active.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
src/assets/images/icon/ico-infoPp.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
src/assets/images/icon/ico-love.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
src/assets/images/icon/ico-notice-active.png
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
src/assets/images/icon/ico-notice.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
src/assets/images/icon/ico-time.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
10
src/assets/images/icon/kefu_1.svg
Normal file
@ -0,0 +1,10 @@
|
||||
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>官方客服</title>
|
||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<circle id="椭圆形备份-7" stroke="#BCBABA" stroke-width="0.6" cx="15" cy="15" r="14"/>
|
||||
<g id="客服" transform="translate(6.000000, 6.000000)" fill-rule="nonzero">
|
||||
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="18" height="18"/>
|
||||
<path d="M9.01933594,1.59609375 C9.96503906,1.59609375 10.884375,1.76660156 11.7509766,2.10410156 C12.5894531,2.43105469 13.3435547,2.90039063 13.9904297,3.49628906 C14.6408203,4.09570312 15.1523437,4.7953125 15.5109375,5.57578125 C15.8835937,6.38613281 16.0716797,7.24921875 16.0716797,8.13691406 C16.0716797,9.51328125 15.6164062,10.8298828 14.7550781,11.9443359 C13.9166016,13.0253906 12.7634766,13.8357422 11.4205078,14.2875 C11.2482422,14.3455078 10.9248047,14.7146484 10.6875,14.9835938 C10.1917969,15.5513672 9.67851562,16.1367188 9.00175781,16.1367188 C8.31621094,16.1367188 7.8046875,15.5478516 7.3125,14.9783203 C7.07871094,14.7076172 6.75703125,14.3367187 6.58125,14.2769531 C5.2453125,13.8216797 4.10097656,13.0095703 3.27304687,11.9302734 C2.41875,10.8175781 1.96699219,9.50625 1.96699219,8.13691406 C1.96699219,7.24921875 2.15507812,6.38613281 2.52773437,5.57578125 C2.88632812,4.7953125 3.39609375,4.09570313 4.04824219,3.49628906 C4.69511719,2.89863281 5.44921875,2.43105469 6.28769531,2.10410156 C7.15253906,1.76660156 8.071875,1.59609375 9.01933594,1.59609375 Z M9.01757812,2.64902344 C5.71113281,2.64902344 3.02167969,5.10996094 3.02167969,8.13691406 C3.02167969,10.4167969 4.58964844,12.4822266 6.92226562,13.2802734 C7.36875,13.4332031 7.72910156,13.8480469 8.11054687,14.2892578 C8.30390625,14.5125 8.50429687,14.7445312 8.68886719,14.9027344 C8.88574219,15.0714844 8.97890625,15.0837891 9.00175781,15.0837891 C9.01757812,15.0837891 9.10898437,15.075 9.31289062,14.9027344 C9.49921875,14.7445312 9.69960937,14.5142578 9.89472656,14.2910156 C10.2779297,13.8533203 10.6417969,13.4384766 11.0847656,13.2890625 C13.4349609,12.4980469 15.0134766,10.4273438 15.0134766,8.13515625 C15.0134766,5.10996094 12.3240234,2.64902344 9.01757812,2.64902344 Z M11.9355469,7.59902344 C12.2273437,7.59902344 12.4628906,7.83457031 12.4628906,8.12636719 C12.4628906,10.0423828 10.9037109,11.6015625 8.98769531,11.6015625 C7.07167969,11.6015625 5.5125,10.0423828 5.5125,8.12636719 C5.5125,7.83457031 5.74804687,7.59902344 6.03984375,7.59902344 C6.33164062,7.59902344 6.5671875,7.83457031 6.5671875,8.12636719 C6.5671875,9.46054688 7.65351562,10.546875 8.98769531,10.546875 C10.321875,10.546875 11.4082031,9.46054688 11.4082031,8.12636719 C11.4082031,7.83457031 11.64375,7.59902344 11.9355469,7.59902344 Z" id="形状结合" fill="#686868"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
15
src/assets/images/icon/mingxi.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
|
||||
<title>账户明细</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="个人模块" transform="translate(-177.000000, 0.000000)">
|
||||
<circle id="椭圆形备份-4" stroke="#BCBABA" stroke-width="0.6" cx="192" cy="15" r="14"/>
|
||||
<g id="账户信息" transform="translate(183.000000, 6.000000)" fill-rule="nonzero">
|
||||
<rect id="矩形" fill="#595959" opacity="0" x="0" y="0" width="18" height="18"/>
|
||||
<path d="M16.0888857,2.28997339 L1.90735481,2.28997339 C1.02269661,2.28997339 0.302968582,3.00970143 0.302968582,3.89435962 L0.302968582,13.72277 C0.302968582,14.6074462 1.02269661,15.3271562 1.90735481,15.3271562 L16.0888857,15.3271562 C16.9735619,15.3271562 17.693272,14.6074282 17.693272,13.72277 L17.693272,3.89435962 C17.693272,3.00968344 16.9735439,2.28997339 16.0888857,2.28997339 Z M1.90735481,3.45918067 L16.0888857,3.45918067 C16.328861,3.45918067 16.5240647,3.65440231 16.5240647,3.89435963 L16.5240647,5.29944098 L1.47217586,5.29944098 L1.47217586,3.89435963 C1.47217586,3.65440231 1.6673975,3.45918067 1.90735481,3.45918067 Z M16.0888857,14.1579489 L1.90735481,14.1579489 C1.6673975,14.1579489 1.47217586,13.9627093 1.47217586,13.72277 L1.47217586,6.29771015 L16.5240647,6.29771015 L16.5240647,13.72277 C16.5240647,13.9627273 16.328861,14.1579489 16.0888857,14.1579489 Z M14.967544,8.6449927 L11.7672438,8.6449927 C11.4453521,8.6449927 11.1819926,8.38163326 11.1819926,8.05974151 L11.1819926,8.05974151 C11.1819926,7.73784976 11.4453521,7.4744903 11.7672438,7.4744903 L14.967544,7.4744903 C15.2894358,7.4744903 15.5527952,7.73784974 15.5527952,8.05974149 L15.5527952,8.05974149 C15.5527952,8.38163326 15.2894358,8.6449927 14.967544,8.6449927 Z" id="形状" fill="#686868"/>
|
||||
</g>
|
||||
<g id="编组-3"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
13
src/assets/images/icon/user.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30" height="30" viewBox="0 0 30 30">
|
||||
<defs>
|
||||
<clipPath id="clip-iPhone_X_XS_11_Pro_6">
|
||||
<rect width="30" height="30"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="iPhone_X_XS_11_Pro_6" data-name="iPhone X、XS、11 Pro – 6" clip-path="url(#clip-iPhone_X_XS_11_Pro_6)">
|
||||
<g id="组_35" data-name="组 35" transform="translate(-5 -5)">
|
||||
<path id="路径_32" data-name="路径 32" d="M121.921,104.862a5.671,5.671,0,1,0-5.117,0,8.093,8.093,0,0,0-5.52,7.663.687.687,0,0,0,1.373,0,6.706,6.706,0,1,1,13.412,0,.687.687,0,0,0,1.373,0,8.093,8.093,0,0,0-5.521-7.663ZM115.064,99.8a4.3,4.3,0,1,1,4.3,4.3A4.3,4.3,0,0,1,115.064,99.8Z" transform="translate(-99.376 -84.774)" fill="#595959"/>
|
||||
<path id="路径_33" data-name="路径 33" d="M90.838,69.673a14.966,14.966,0,1,0,4.383,10.582,14.868,14.868,0,0,0-4.383-10.582ZM80.256,93.849A13.593,13.593,0,1,1,93.849,80.256,13.608,13.608,0,0,1,80.256,93.849Z" transform="translate(-60.222 -60.222)" fill="#bcbaba" opacity="0.3"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/assets/images/icon/wallet.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
15
src/assets/images/icon/youxi.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 60.1 (88133) - https://sketch.com -->
|
||||
<title>游戏记录</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="个人模块" transform="translate(0.000000, -51.000000)">
|
||||
<circle id="椭圆形备份" stroke="#BCBABA" stroke-width="0.6" cx="15" cy="66" r="14"/>
|
||||
<g id="游戏" transform="translate(5.000000, 56.000000)" fill-rule="nonzero">
|
||||
<rect id="矩形" fill="#595959" opacity="0" x="0" y="0" width="20" height="20"/>
|
||||
<path d="M14.1666667,2.91666666 C16.9279167,2.91666666 19.1666667,5.15541666 19.1666667,7.91666666 L19.1666667,13.75 C19.1666667,14.9409461 18.531448,16.0414646 17.5000737,16.636964 C16.4686993,17.2324633 15.1979674,17.2324633 14.166593,16.636964 C13.1352186,16.0414646 12.4999088,14.9409461 12.5,13.75 L12.5,12.9166667 L7.49958334,12.9166667 L7.5,13.75 C7.50009116,14.9409461 6.86478136,16.0414646 5.833407,16.636964 C4.80203264,17.2324633 3.5313007,17.2324633 2.49992634,16.636964 C1.46855198,16.0414646 0.83333334,14.9409461 0.83333334,13.75 L0.83333334,7.91666666 C0.83333334,5.15541666 3.07208334,2.91666666 5.83333334,2.91666666 L14.1666667,2.91666666 Z M13.75,4.16666666 L6.25,4.16666666 C3.9875,4.16666666 2.14666666,5.96958332 2.085,8.21666666 L2.08333334,8.33333334 L2.08333334,13.75 C2.08479558,14.8819245 2.98978586,15.805582 4.12144465,15.8301512 C5.25310344,15.8547205 6.19732886,14.9712111 6.24791666,13.8404167 L6.25,13.75 L6.25,12.0833333 C6.24999999,11.9728265 6.29389868,11.8668457 6.37203883,11.7887055 C6.45017899,11.7105653 6.55615979,11.6666667 6.66666666,11.6666667 L13.3333333,11.6666667 C13.4438402,11.6666667 13.549821,11.7105653 13.6279612,11.7887055 C13.7061013,11.8668457 13.75,11.9728265 13.75,12.0833333 L13.75,13.75 C13.751462,14.8819247 14.6564524,15.8055824 15.7881113,15.8301517 C16.9197703,15.8547209 17.8639958,14.9712113 17.9145833,13.8404167 L17.9166667,13.75 L17.9166667,8.33333334 C17.9166667,6.03208334 16.05125,4.16666666 13.75,4.16666666 Z M13.9583333,9.16666666 C14.3035113,9.16666666 14.5833333,9.44648869 14.5833333,9.79166666 C14.5833333,10.1368446 14.3035113,10.4166667 13.9583333,10.4166667 C13.6131554,10.4166667 13.3333333,10.1368446 13.3333333,9.79166666 C13.3333333,9.44648869 13.6131554,9.16666666 13.9583333,9.16666666 Z M6.04166666,6.66666666 C6.38684463,6.66666666 6.66666666,6.94648869 6.66666666,7.29166666 L6.66666666,7.91666666 L7.29166666,7.91666666 C7.63684463,7.91666666 7.91666666,8.19648869 7.91666666,8.54166666 C7.91666666,8.88684463 7.63684463,9.16666666 7.29166666,9.16666666 L6.66666666,9.16666666 L6.66666666,9.79166666 C6.66666666,10.1368446 6.38684463,10.4166667 6.04166666,10.4166667 C5.69648869,10.4166667 5.41666666,10.1368446 5.41666666,9.79166666 L5.41666666,9.16666666 L4.79166666,9.16666666 C4.44648869,9.16666666 4.16666666,8.88684463 4.16666666,8.54166666 C4.16666666,8.19648869 4.44648869,7.91666666 4.79166666,7.91666666 L5.41666666,7.91666666 L5.41666666,7.29166666 C5.41666666,6.94648869 5.69648869,6.66666666 6.04166666,6.66666666 L6.04166666,6.66666666 Z M15.2083333,7.91666666 C15.5535113,7.91666666 15.8333333,8.19648869 15.8333333,8.54166666 C15.8333333,8.88684463 15.5535113,9.16666666 15.2083333,9.16666666 C14.8631554,9.16666666 14.5833333,8.88684463 14.5833333,8.54166666 C14.5833333,8.19648869 14.8631554,7.91666666 15.2083333,7.91666666 Z M12.7083333,7.91666666 C13.0535113,7.91666666 13.3333333,8.19648869 13.3333333,8.54166666 C13.3333333,8.88684463 13.0535113,9.16666666 12.7083333,9.16666666 C12.3631554,9.16666666 12.0833333,8.88684463 12.0833333,8.54166666 C12.0833333,8.19648869 12.3631554,7.91666666 12.7083333,7.91666666 Z M13.9583333,6.66666666 C14.3035113,6.66666666 14.5833333,6.94648869 14.5833333,7.29166666 C14.5833333,7.63684463 14.3035113,7.91666666 13.9583333,7.91666666 C13.6131554,7.91666666 13.3333333,7.63684463 13.3333333,7.29166666 C13.3333333,6.94648869 13.6131554,6.66666666 13.9583333,6.66666666 Z" id="形状" fill="#686868"/>
|
||||
</g>
|
||||
<g id="编组-3"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.2 KiB |
37
src/axios/index.js
Normal file
@ -0,0 +1,37 @@
|
||||
import router from "@/router";
|
||||
import axios from "axios";
|
||||
|
||||
const axiosIns = axios.create({
|
||||
baseURL: `${import.meta.env.VITE_APP_BASE_URL}/api`,
|
||||
// timeout: 1000,
|
||||
// headers: {'X-Custom-Header': 'foobar'}
|
||||
});
|
||||
|
||||
axiosIns.interceptors.request.use((config) => {
|
||||
const token = localStorage.getItem("accessToken");
|
||||
if (token) {
|
||||
config.headers = config.headers || {};
|
||||
config.headers.Authorization = token ? `Bearer ${token}` : "";
|
||||
}
|
||||
return config;
|
||||
});
|
||||
|
||||
axiosIns.interceptors.response.use(
|
||||
(response) => {
|
||||
return response.data;
|
||||
},
|
||||
(error) => {
|
||||
console.log(error)
|
||||
if (error.response.status === 401) {
|
||||
localStorage.removeItem("accessToken");
|
||||
|
||||
// If 401
|
||||
router.push("/login");
|
||||
return Promise.reject(error.response.data);
|
||||
} else {
|
||||
return Promise.reject(error.response.data);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
export default axiosIns;
|
120
src/components/auth/Login.vue
Normal file
@ -0,0 +1,120 @@
|
||||
<script setup>
|
||||
import { ref, reactive } from "vue";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import { useRouter } from "vue-router";
|
||||
import { useUserStore } from "@/store/user";
|
||||
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
|
||||
const loginData = reactive({
|
||||
username: "",
|
||||
password: "",
|
||||
});
|
||||
|
||||
const showPassword = ref(false);
|
||||
|
||||
function submitLogin() {
|
||||
handleRequest(axios.post(API.LOGIN, loginData)).then((res) => {
|
||||
if(res.success) {
|
||||
userStore.login(res.data)
|
||||
router.push("/mine")
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi đăng nhập")
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<template>
|
||||
<div class="bg-container page">
|
||||
<img src="@/assets/images/common/bgGirl.png" class="bg-img" />
|
||||
<div class="bg-wrapper">
|
||||
<div class="login">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis"></div>
|
||||
<div class="van-nav-bar__right">
|
||||
<div class="language">
|
||||
<img src="@/assets/images/common/vn.png" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
<div class="logo-container">
|
||||
<div class="logo-wrapper">
|
||||
<img src="@/assets/images/common/logo.png" class="logo-img" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">Đăng Nhập</div>
|
||||
<div class="loginForm">
|
||||
<div class="input van-cell van-field">
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="loginData.username"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập tên đăng nhập"
|
||||
class="van-field__control van-field__control--center"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input van-cell van-field">
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="loginData.password"
|
||||
:type="!showPassword ? 'password': 'text'"
|
||||
placeholder="Vui lòng nhập mật khẩu đăng nhập"
|
||||
class="van-field__control van-field__control--center"
|
||||
/>
|
||||
<div class="van-field__right-icon">
|
||||
<van-icon name="closed-eye" v-if="!showPassword" @click="showPassword = !showPassword"/>
|
||||
<van-icon name="eye-o" v-else @click="showPassword = !showPassword"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="reset-text">
|
||||
<span>Quên mật khẩu?</span>
|
||||
</div>
|
||||
<router-link to="/register" class="register-text">
|
||||
<span> Không có tài khoản?Đăng ký ngay</span>
|
||||
</router-link>
|
||||
<button
|
||||
class="login-btn van-button van-button--normal"
|
||||
@click="submitLogin"
|
||||
>
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Đăng nhập</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-field__control {
|
||||
color: #323233;
|
||||
}
|
||||
</style>
|
138
src/components/auth/Register.vue
Normal file
@ -0,0 +1,138 @@
|
||||
<script setup>
|
||||
import { ref, reactive } from "vue";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import { useRouter } from "vue-router";
|
||||
import { useUserStore } from "@/store/user";
|
||||
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
|
||||
const formData = reactive({
|
||||
username: "",
|
||||
password: "",
|
||||
code: ""
|
||||
});
|
||||
|
||||
const showPassword = ref(false);
|
||||
|
||||
function submitForm() {
|
||||
handleRequest(axios.post(API.REGISTER, formData)).then((res) => {
|
||||
if (res.success) {
|
||||
userStore.login(res.data);
|
||||
showFailToast("Đăng ký tài khoản thành công.")
|
||||
router.push("/mine");
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi đăng nhập");
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<template>
|
||||
<div class="bg-container page">
|
||||
<img src="@/assets/images/common/bgGirl.png" class="bg-img" />
|
||||
<div class="bg-wrapper">
|
||||
<div class="register">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
<div class="logo-container">
|
||||
<div class="logo-wrapper">
|
||||
<img src="@/assets/images/common/logo.png" class="logo-img" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title">Đăng ký</div>
|
||||
<div class="loginForm">
|
||||
<div class="input van-cell van-field">
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.username"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập tên đăng nhập"
|
||||
class="van-field__control van-field__control--center"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input van-cell van-field">
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.password"
|
||||
type="password"
|
||||
placeholder="Vui lòng nhập mật khẩu đăng nhập"
|
||||
class="van-field__control van-field__control--center"
|
||||
/>
|
||||
<div class="van-field__right-icon">
|
||||
<i class="van-icon van-icon-closed-eye"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input van-cell van-field">
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.code"
|
||||
type="text"
|
||||
placeholder="Nhập mã giới thiệu"
|
||||
class="van-field__control van-field__control--center"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="agreement">
|
||||
<div
|
||||
role="checkbox"
|
||||
tabindex="0"
|
||||
aria-checked="true"
|
||||
class="van-checkbox"
|
||||
>
|
||||
<div
|
||||
class="van-checkbox__icon van-checkbox__icon--round van-checkbox__icon--checked"
|
||||
>
|
||||
<i class="van-icon van-icon-success"></i>
|
||||
</div>
|
||||
</div>
|
||||
<span class="agreement-text"
|
||||
>Tôi đã biết và đồng ý Thỏa thuận mở tài khoản Hiệp ước</span
|
||||
>
|
||||
</div>
|
||||
<button class="login-btn van-button van-button--normal" @click="submitForm">
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Đăng ký</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-field__control {
|
||||
color: #323233;
|
||||
}
|
||||
</style>
|
112
src/components/auth/SetLoginPassword.vue
Normal file
@ -0,0 +1,112 @@
|
||||
<script setup>
|
||||
import { ref, reactive, watch } from "vue";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import { useRouter } from "vue-router";
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
const formData = reactive({
|
||||
password: "",
|
||||
newPassword: "",
|
||||
confirmPassword: "",
|
||||
});
|
||||
|
||||
function submit() {
|
||||
const { password, newPassword ,confirmPassword } = formData
|
||||
if(newPassword !== confirmPassword) {
|
||||
return showFailToast("Mật khẩu mới không khớp");
|
||||
}
|
||||
handleRequest(axios.post(API.CHANGE_PASSWORD, { password, newPassword})).then((res) => {
|
||||
if (res.success) {
|
||||
router.go(-1);
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi");
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">
|
||||
Thay đổi mật khẩu đăng nhập
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell-group van-hairline--top-bottom">
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Mật khẩu cũ</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.password"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập mật khẩu cũ của bạn"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Mật khẩu mới</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.newPassword"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập mật khẩu mới của bạn"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Mật khẩu mới</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.confirmPassword"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập lại mật khẩu mới của bạn"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
class="sub-btn van-button van-button--default van-button--normal"
|
||||
@click="submit"
|
||||
>
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Hoàn Thành</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
183
src/components/deposit/Channel.vue
Normal file
@ -0,0 +1,183 @@
|
||||
<script setup>
|
||||
import { reactive, ref } from "vue";
|
||||
import { showFailToast } from "vant";
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { formatNumber } from "@/helpers/format";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
const type = ref("");
|
||||
|
||||
const amount = Number(route.query.money);
|
||||
|
||||
const bankInfo = reactive({
|
||||
bankName: "bank",
|
||||
accountNumber: "123456",
|
||||
holder: "NGUYEN VAN A"
|
||||
})
|
||||
|
||||
if (isNaN(amount) || amount <= 0) {
|
||||
router.push("/Recharge");
|
||||
}
|
||||
|
||||
const submit = () => {
|
||||
|
||||
handleRequest(axios.post(API.TRANSACTION_DEPOSIT, { amount, note: "ok" })).then(res => {
|
||||
if(res.success) {
|
||||
type.value = 'bank';
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi nạp tiền")
|
||||
}
|
||||
})
|
||||
// if (amount.value > 0) {
|
||||
// router.push({ name: "Channel", query: { money: amount.value } });
|
||||
// } else {
|
||||
// showFailToast("Số tiền sai");
|
||||
// }
|
||||
};
|
||||
|
||||
const copy = (filed) => {
|
||||
navigator.clipboard.writeText(bankInfo[filed]);
|
||||
showFailToast("Thành công");
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="type === '' ? $router.go(-1): $router.push('/mine')" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">NẠP ĐIỂM</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content recharge">
|
||||
<div v-if="!type">
|
||||
<div style="width: 100%"><div class="payBtn" @click="submit">Bank</div></div>
|
||||
</div>
|
||||
|
||||
<div class="bank" style="display: block" v-else-if="type =='bank'">
|
||||
<div class="text-container" style="margin-top: 0.25rem">
|
||||
<span class="bank-title input-text">Tên ngân hàng:</span>
|
||||
<div class="bank-content">
|
||||
<span class="text" id="seno">{{ bankInfo.bankName }}</span>
|
||||
<span class="btn" @click="copy('bankName')">Nhấn để sao chép</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="text-container bank-username bank-info-main">
|
||||
<span class="bank-title bank-info-username">số thẻ ngân hàng:</span>
|
||||
<div class="bank-content">
|
||||
<span class="text" id="copy1">{{ bankInfo.accountNumber }}</span>
|
||||
<span class="btn" @click="copy('accountNumber')">Nhấn để sao chép</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-container bank-account bank-info-main">
|
||||
<span class="bank-title bank-info-account">Họ Tên:</span>
|
||||
<div class="bank-content">
|
||||
<span class="text" id="copy2">{{ bankInfo.holder }}</span>
|
||||
<span class="btn" @click="copy('holder')">Nhấn để sao chép</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div
|
||||
class="text-container bank-name bank-info-main"
|
||||
style="display: none"
|
||||
>
|
||||
<span class="bank-title bank-info-name">số seri:</span>
|
||||
<div class="bank-content">
|
||||
<span class="text" id="copy3">6014</span>
|
||||
<span class="btn" onclick="copy1('copy3')">Nhấn để sao chép</span>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.btn {
|
||||
width: 118px;
|
||||
// height: 34px;
|
||||
padding: 15px 0;
|
||||
margin-right: 10px;
|
||||
background: #4964f3;
|
||||
border: 1px solid rgba(255, 255, 255, 1);
|
||||
box-shadow: 0px 4px 8px 0px rgba(0, 34, 215, 0.5);
|
||||
border-radius: 12px;
|
||||
/*line-height: 34px;*/
|
||||
text-align: center;
|
||||
font-family: DINAlternate-Bold;
|
||||
font-size: 12px;
|
||||
color: #ffffff;
|
||||
letter-spacing: 0;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.bank {
|
||||
background: #ffffff;
|
||||
padding: 10px 2px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.bank > p {
|
||||
font-family: DINAlternate-Bold;
|
||||
font-size: 14px;
|
||||
color: #acacb5;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.bank .text-container {
|
||||
text-align: left;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.bank .text-container .bank-title {
|
||||
font-family: DINAlternate-Bold;
|
||||
font-size: 14px;
|
||||
color: #acacb5;
|
||||
letter-spacing: 0;
|
||||
font-weight: 700;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.bank .text-container .bank-content {
|
||||
width: 100%;
|
||||
padding: 5px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-radius: 10px;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.bank-content .text {
|
||||
width: 50%;
|
||||
height: 34px;
|
||||
line-height: 34px;
|
||||
background: #f3f4fd;
|
||||
border-radius: 12px;
|
||||
padding: 0 10px;
|
||||
font-family: DINAlternate-Bold;
|
||||
font-size: 16px;
|
||||
color: #1b1c21;
|
||||
letter-spacing: 1.2px;
|
||||
font-weight: 700;
|
||||
}
|
||||
</style>
|
88
src/components/deposit/Recharge.vue
Normal file
@ -0,0 +1,88 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
import { showFailToast } from "vant";
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { formatNumber } from "@/helpers/format";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
const amount = ref("");
|
||||
|
||||
const submit = () => {
|
||||
if (amount.value > 0) {
|
||||
router.push({ name: "Channel", query: { money: amount.value } });
|
||||
} else {
|
||||
showFailToast("Số tiền sai");
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">NẠP ĐIỂM</div>
|
||||
<router-link to="/RechargeRecord" class="van-nav-bar__right">
|
||||
<span class="nav-right">Lịch sử quy đổi điểm</span>
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
<p class="title">Số dư hiện tại(Đ)</p>
|
||||
<p class="value">{{ formatNumber(userInfo?.money) }}Đ</p>
|
||||
</div>
|
||||
<div class="content recharge">
|
||||
<form class="van-form" @click.prevent="submit">
|
||||
<div class="form-item">
|
||||
<div class="form-item-title">Vui lòng nhập số tiền nạp</div>
|
||||
<div>
|
||||
<div
|
||||
class="van-cell van-field"
|
||||
style="font-size: 15px; padding: 1.333vw 2.133vw"
|
||||
>
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model.number="amount"
|
||||
type="text"
|
||||
name="money"
|
||||
placeholder="Vui lòng nhập số tiền nạp"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<div style="margin: 16px">
|
||||
<button
|
||||
type="submit"
|
||||
class="subBtn van-button van-button--normal van-button--block van-button--round"
|
||||
style="border: none"
|
||||
>
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Kế tiếp</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
37
src/components/deposit/RechargeRecord.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">
|
||||
Lịch sử quy đổi điểm
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="van-empty">
|
||||
<div class="van-empty__image">
|
||||
<img src="@/assets/images/common/empty-image-default.png" />
|
||||
</div>
|
||||
<p class="van-empty__description">Dữ liệu trống</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-empty__description {
|
||||
color: #969799;
|
||||
}
|
||||
</style>
|
62
src/components/home/Choose.vue
Normal file
@ -0,0 +1,62 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
|
||||
const activeTab = ref(0);
|
||||
</script>
|
||||
<template>
|
||||
<div class="convention-hall page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div class="van-nav-bar__title van-ellipsis">CHỌN TỈNH</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="convention-itemm">
|
||||
<van-tabs v-model:active="activeTab" sticky swipeable>
|
||||
<van-tab title="Thành phố">
|
||||
<div class="card">
|
||||
Dịch vụ cung cấp gái đẹp miễn phí trên toàn quốc , Có thể sắp xếp
|
||||
bất cứ nơi nào tại Việt Nam và bất cứ lúc nào , Bạn chỉ cần liên hệ
|
||||
lễ tân sẽ lập tức sắp xếp.
|
||||
</div>
|
||||
<div class="address">
|
||||
<van-cell-group>
|
||||
<van-cell title="AN GIANG" to="/list" />
|
||||
<van-cell title="BÌNH ĐỊNH" />
|
||||
</van-cell-group>
|
||||
</div>
|
||||
</van-tab>
|
||||
<van-tab title="Giới Thiệu Nền Tảng">
|
||||
<div class="card">
|
||||
Dịch vụ cung cấp gái đẹp miễn phí trên toàn quốc , Có thể sắp xếp
|
||||
bất cứ nơi nào tại Việt Nam và bất cứ lúc nào , Bạn chỉ cần liên hệ
|
||||
lễ tân sẽ lập tức sắp xếp.
|
||||
</div>
|
||||
<div class="rig-box">
|
||||
<p class="rig-title" style="margin: 18px 0">
|
||||
Có những mẫu em gái nào?
|
||||
</p>
|
||||
<p class="rig-content" style="margin: 9.6px 0">
|
||||
Người nổi tiếng trên mạng, người mẫu, tiếp viên hàng không, người
|
||||
mẫu trẻ, sinh viên đại học, chỉ có điều bạn không nghĩ ra được và
|
||||
bạn không thể làm được nếu không có nền tảng này
|
||||
</p>
|
||||
<p class="rig-title" style="margin: 18px 0">Khu vực phục vụ?</p>
|
||||
<p class="rig-content" style="margin: 9.6px 0">
|
||||
Các cuộc hẹn miễn phí trong cùng một thành phố, trên không ở bất
|
||||
kỳ đâu trong cả nước, các thành phố cấp một và cấp hai tại địa
|
||||
phương ở Việt Nam và các thành phố cấp ba cũng có thể được sắp xếp
|
||||
bằng cách liên hệ với nhân viên tiếp tân。
|
||||
</p>
|
||||
<p class="rig-content" style="margin: 9.6px 0">
|
||||
Dịch vụ cung cấp gái đẹp miễn phí trên toàn quốc , Có thể sắp xếp
|
||||
bất cứ nơi nào tại Việt Nam và bất cứ lúc nào , Bạn chỉ cần liên
|
||||
hệ lễ tân sẽ lập tức sắp xếp.
|
||||
</p>
|
||||
</div>
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped></style>
|
219
src/components/home/DetailGirl.vue
Normal file
@ -0,0 +1,219 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
|
||||
import IconNoiti from "@/assets/images/icon/ico-notice.png";
|
||||
import IcNoitiActive from "@/assets/images/icon/ico-notice-active.png";
|
||||
import IconImage from "@/assets/images/icon/ico-img.png";
|
||||
import IcImageActive from "@/assets/images/icon/ico-img-active.png";
|
||||
import IconInfo from "@/assets/images/icon/ico-infoPp.png";
|
||||
import IcInfoActive from "@/assets/images/icon/ico-notice-active.png";
|
||||
|
||||
const isActivetab = ref("info");
|
||||
function onActivetab(index) {
|
||||
isActivetab.value = index;
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<div class="nHome-detail">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">NẠP ĐIỂM</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-title">
|
||||
[RE-UP] NGỌC EM GÁI DỄ THƯƠNG NỤ CƯỜI TỎA NẮNG MỚI VÀO NGHỀ
|
||||
</div>
|
||||
<div style="display: flex">
|
||||
<div
|
||||
@click="onActivetab('info')"
|
||||
class="detail-tabs"
|
||||
:class="isActivetab === 'info' ? 'active' : ''"
|
||||
>
|
||||
<img
|
||||
:src="isActivetab === 'info' ? IconInfo : IcInfoActive"
|
||||
alt=""
|
||||
class="detail-tabs-ico"
|
||||
/>
|
||||
info
|
||||
</div>
|
||||
<div
|
||||
@click="onActivetab('image')"
|
||||
class="detail-tabs"
|
||||
:class="isActivetab === 'image' ? 'active' : ''"
|
||||
>
|
||||
<img
|
||||
:src="isActivetab === 'image' ? IconImage : IcImageActive"
|
||||
alt=""
|
||||
class="detail-tabs-ico"
|
||||
/>
|
||||
images (6)
|
||||
</div>
|
||||
<div
|
||||
@click="onActivetab('reprot')"
|
||||
class="detail-tabs"
|
||||
:class="isActivetab === 'reprot' ? 'active' : ''"
|
||||
>
|
||||
<img
|
||||
:src="isActivetab === 'reprot' ? IconNoiti : IcNoitiActive"
|
||||
alt=""
|
||||
class="detail-tabs-ico"
|
||||
/>
|
||||
reprot (20)
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-content" v-if="isActivetab === 'info'">
|
||||
<div class="movie-list-n-img">
|
||||
<div
|
||||
class="movie-list-n-img van-image"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
lazy="loaded"
|
||||
>
|
||||
<img
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
alt=""
|
||||
class="van-image__img"
|
||||
style="object-fit: cover"
|
||||
/>
|
||||
</div>
|
||||
<div class="movie-list-n-lab">
|
||||
Phan Đình Phùng, Phú Nhuận,Hồ Chí Minh, Vietnam
|
||||
</div>
|
||||
</div>
|
||||
<div class="movie-list-n-item-bottom">
|
||||
<div class="movie-n-time-div">
|
||||
<img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/>
|
||||
<div class="movie-list-money">
|
||||
<img
|
||||
src="@/assets/images/icon/wallet.png"
|
||||
alt=""
|
||||
class="movie-list-ico-money"
|
||||
style="width: 20px"
|
||||
/>350
|
||||
</div>
|
||||
<div class="movie-list-addr">
|
||||
<img
|
||||
src="@/assets/images/icon/ico-addr.png"
|
||||
alt=""
|
||||
class="movie-list-ico-addr"
|
||||
/>
|
||||
Phú Nhuận
|
||||
</div>
|
||||
<div class="movie-list-notice">
|
||||
<img
|
||||
src="@/assets/images/icon/ico-time.png"
|
||||
alt=""
|
||||
class="movie-list-ico-notice"
|
||||
/>
|
||||
1993-01-01
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-title">Thông số</div>
|
||||
<div class="table">
|
||||
<div class="table-list">
|
||||
<div class="name">Pass</div>
|
||||
<div class="content"></div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Năm sinh</div>
|
||||
<div class="content">1993</div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Cao (cm)</div>
|
||||
<div class="content">156</div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Nặng (kg)</div>
|
||||
<div class="content">48</div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Vòng 1 (cm)</div>
|
||||
<div class="content">88</div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Vòng 2 (cm)</div>
|
||||
<div class="content">65</div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Vòng 3 (cm)</div>
|
||||
<div class="content">90</div>
|
||||
</div>
|
||||
<div class="table-list">
|
||||
<div class="name">Từ chối</div>
|
||||
<div class="content">Say xỉn, đập đá, bạo dâm</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-content" v-if="isActivetab === 'image'">
|
||||
<div class="tabs1">
|
||||
<div
|
||||
class="tabs1-img van-image"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
lazy="loaded"
|
||||
>
|
||||
<img
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
alt=""
|
||||
class="van-image__img"
|
||||
style="object-fit: cover"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail-content" v-if="isActivetab === 'reprot'">
|
||||
<div class="table-title">Bình luận</div>
|
||||
<div class="comment">
|
||||
<div class="commentList">
|
||||
<div class="commentList-content">
|
||||
<!-- <img alt="" class="commentList-content-avatar" lazy="error" /> -->
|
||||
<div style="width: 100%">
|
||||
<div>
|
||||
<div class="commentList-content-name">Đăng Khôi</div>
|
||||
<div class="commentList-content-txt">
|
||||
E thân thiện ,nói chuyện dễ thương làm tinh phê
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.movie-list-n-img {
|
||||
width: 100vw;
|
||||
height: 100vw;
|
||||
position: relative;
|
||||
}
|
||||
</style>
|
228
src/components/home/HomePage.vue
Normal file
@ -0,0 +1,228 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
|
||||
import { Swiper, SwiperSlide } from "swiper/vue";
|
||||
import { EffectCoverflow } from "swiper/modules";
|
||||
|
||||
import "swiper/css";
|
||||
import "swiper/css/effect-coverflow";
|
||||
</script>
|
||||
<template>
|
||||
<div class="home-container">
|
||||
<div class="header linear-bg" style="height: auto">
|
||||
<div style="flex: 1 1 0%"></div>
|
||||
</div>
|
||||
|
||||
<div class="linear-bg"></div>
|
||||
<div class="home-scroll">
|
||||
<div class="banner">
|
||||
<swiper
|
||||
:grabCursor="true"
|
||||
:centeredSlides="true"
|
||||
:slidesPerView="'auto'"
|
||||
:modules="[EffectCoverflow]"
|
||||
effect="coverflow"
|
||||
class="banner_swiper swiper-container-3d"
|
||||
>
|
||||
<swiper-slide>
|
||||
<div class="banner_img van-image van-image--round">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="https://api.canalis.vip/lottery/banner/20231213/8ac60765e5cffad8f4cdf99880f31e0e.png"
|
||||
/>
|
||||
</div>
|
||||
</swiper-slide>
|
||||
<swiper-slide>
|
||||
<div class="banner_img van-image van-image--round">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="https://api.canalis.vip/lottery/banner/20231211/e2006090630c657813d904b6b8dc270b.jpg"
|
||||
/>
|
||||
</div> </swiper-slide
|
||||
><swiper-slide>
|
||||
<div class="banner_img van-image van-image--round">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="https://api.canalis.vip/lottery/banner/20231213/6131810d990e4d590d5643820ca885b1.png"
|
||||
/>
|
||||
</div>
|
||||
</swiper-slide>
|
||||
</swiper>
|
||||
</div>
|
||||
<div class="notice-bar">
|
||||
<van-notice-bar
|
||||
color="rgb(119, 95, 217)"
|
||||
background="rgb(255, 255, 255)"
|
||||
text="Chúng tôi là CANALIS CLUB - Một quán Bar lớn . Phục vụ tận nơi tại
|
||||
63 tỉnh thành trên toàn quốc . Chúng tôi có những người mẫu cao
|
||||
cấp, tiếp viên hàng không, du học sinh.... Sẵn sàng phục vụ quý
|
||||
khách hàng !"
|
||||
left-icon="bullhorn-o"
|
||||
class="notice-swipe"
|
||||
/>
|
||||
<div class="linear-gradient"></div>
|
||||
</div>
|
||||
|
||||
<div class="hot-game">
|
||||
<router-link to="/Game" class="hot-title-div">
|
||||
<div>
|
||||
<span>TOP 10 BÉ HOT NHẤT</span>
|
||||
</div>
|
||||
<div>
|
||||
<span>Xem thêm</span
|
||||
><i
|
||||
class="van-icon van-icon-arrow"
|
||||
style="color: rgb(194, 68, 145)"
|
||||
></i>
|
||||
</div>
|
||||
</router-link>
|
||||
<div class="hot-items-div">
|
||||
<div class="van-grid">
|
||||
<router-link
|
||||
to="/Lottery"
|
||||
class="van-grid-item"
|
||||
style="flex-basis: 25%"
|
||||
>
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>BỎ PHIẾU 1</span>
|
||||
</div>
|
||||
</router-link>
|
||||
<div class="van-grid-item" style="flex-basis: 25%">
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>BỎ PHIẾU 2</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-grid-item" style="flex-basis: 25%">
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>BỎ PHIẾU 3</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-grid-item" style="flex-basis: 25%">
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>ĐẶC BIỆT</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 300ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="hot-title-div" style="margin-bottom: -20px">
|
||||
<div>
|
||||
<span>Phổ biến nhất</span>
|
||||
</div>
|
||||
</div>
|
||||
<div role="feed" class="van-list">
|
||||
<div class="movie_list_n">
|
||||
<router-link to="/HomeDetail" class="movie-list-n-item">
|
||||
<div class="movie-list-n-title">
|
||||
Linh Anh ❤️ Siêu Dâm Ngoan - Nhiệt Tình Chiều Chuộng Hết Mình
|
||||
</div>
|
||||
<div class="movie-list-n-img">
|
||||
<div class="movie-list-n-img van-image" lazy="loading">
|
||||
<img
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
alt=""
|
||||
class="van-image__img"
|
||||
style="object-fit: cover"
|
||||
/>
|
||||
</div>
|
||||
<div class="movie-list-n-lab">
|
||||
Chu Văn An, Bình Thạnh,Hồ Chí Minh, Vietnam
|
||||
</div>
|
||||
</div>
|
||||
<div class="movie-list-n-item-bottomm">
|
||||
<div class="movie-n-time-div">
|
||||
<img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/><img
|
||||
src="@/assets/images/icon/ico-love.png"
|
||||
alt=""
|
||||
class="movie-list-ico-loves"
|
||||
/>
|
||||
<div class="movie-list-notice">
|
||||
<img
|
||||
src="@/assets/images/icon/ico-notice.png"
|
||||
alt=""
|
||||
class="movie-list-ico-notice"
|
||||
/>
|
||||
55
|
||||
</div>
|
||||
<div class="movie-list-addr">
|
||||
<img
|
||||
src="@/assets/images/icon/ico-addr.png"
|
||||
alt=""
|
||||
class="movie-list-ico-addr"
|
||||
/>
|
||||
Bình Thạnh
|
||||
</div>
|
||||
<div class="movie-list-money">
|
||||
<img
|
||||
src="@/assets/images/icon/wallet.png"
|
||||
alt=""
|
||||
class="movie-list-ico-money"
|
||||
/>300
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="van-list__placeholder"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped></style>
|
26
src/components/home/Language.vue
Normal file
@ -0,0 +1,26 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Ngôn ngữ</div>
|
||||
</div>
|
||||
</div>
|
||||
<router-link to="/" class="items">
|
||||
<div class="item van-hairline--bottom">
|
||||
<div class="flex_center">
|
||||
<div>
|
||||
<img src="@/assets/images/common/vn.png" />
|
||||
</div>
|
||||
<div class="info">Việt Nam</div>
|
||||
</div>
|
||||
<div>✓</div>
|
||||
</div>
|
||||
</router-link>
|
||||
</div>
|
||||
</template>
|
32
src/components/home/List.vue
Normal file
@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">AN GIANG</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<van-grid :column-num="2" style="padding-left: 10px">
|
||||
<van-grid-item
|
||||
to="/ProfileOnList"
|
||||
style="flex-basis: 50%; padding-right: 10px"
|
||||
>
|
||||
<van-image src="src/assets/images/common/bgGirl.png" />
|
||||
<span class="rig-name">A01</span>
|
||||
</van-grid-item>
|
||||
</van-grid>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style>
|
||||
.van-image__img {
|
||||
border-radius: 1.333vw;
|
||||
padding: 2vw;
|
||||
}
|
||||
</style>
|
42
src/components/home/ProfileOnList.vue
Normal file
@ -0,0 +1,42 @@
|
||||
<template>
|
||||
<div class="page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">CHỌN TỈNH</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<p class="name">A01</p>
|
||||
<p class="title"></p>
|
||||
<van-image
|
||||
width="98%"
|
||||
height="100%"
|
||||
fit="contain"
|
||||
src="src/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
|
||||
<button
|
||||
class="button van-button van-button--default van-button--normal van-button--round"
|
||||
style="
|
||||
color: white;
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
rgb(127, 87, 120),
|
||||
rgb(229, 194, 160)
|
||||
);
|
||||
border: 0px;
|
||||
"
|
||||
>
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Liên lạc với tô</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
57
src/components/home/Settings.vue
Normal file
@ -0,0 +1,57 @@
|
||||
<script setup>
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Cài đặt</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="items">
|
||||
<router-link to="/Infomation" class="item van-hairline--bottom">
|
||||
<div class="left">Thông tin cơ bản</div>
|
||||
<i class="van-icon van-icon-arrow"></i>
|
||||
</router-link>
|
||||
<router-link to="/SetLoginPassword" class="item van-hairline--bottom">
|
||||
<div class="left">Mật khẩu đăng nhập</div>
|
||||
<i class="van-icon van-icon-arrow"></i>
|
||||
</router-link>
|
||||
<router-link to="/EditPayPassword" class="item van-hairline--bottom">
|
||||
<div class="left">Mật khẩu rút tiền</div>
|
||||
<div class="right">
|
||||
<span class="desc">{{ userInfo.isSetPayPass ? "Đã được chuẩn bị": "Không được thiết lập"}}</span
|
||||
><i class="van-icon van-icon-arrow"></i>
|
||||
</div>
|
||||
</router-link>
|
||||
<router-link to="/Language" class="item van-hairline--bottom">
|
||||
<div class="left">Ngôn ngữ</div>
|
||||
<div class="right">
|
||||
<i class="van-icon van-icon-arrow"></i>
|
||||
</div>
|
||||
</router-link>
|
||||
</div>
|
||||
<button class="sign-out van-button van-button--normal" @click="userStore.logout">
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Đăng xuất</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
a {
|
||||
color: black;
|
||||
}
|
||||
</style>
|
49
src/components/layout/Footer.vue
Normal file
@ -0,0 +1,49 @@
|
||||
<template>
|
||||
<div class="van-hairline--top-bottom van-tabbar van-tabbar--fixed">
|
||||
<router-link to="/" class="van-tabbar-item">
|
||||
<div class="van-tabbar-item__icon">
|
||||
<img src="@/assets/images/common/indexed.png" alt="Trang chủ" />
|
||||
</div>
|
||||
<div class="van-tabbar-item__text">
|
||||
<span class="foorterTxt foorterTxtF">Trang chủ</span>
|
||||
</div>
|
||||
</router-link>
|
||||
<router-link to="/Game" class="van-tabbar-item">
|
||||
<div class="van-tabbar-item__icon">
|
||||
<img src="@/assets/images/common/subscribe2.png" alt="XẾP HẠNG" />
|
||||
</div>
|
||||
<div class="van-tabbar-item__text">
|
||||
<span class="foorterTxt foorterTxtF">XẾP HẠNG</span>
|
||||
</div>
|
||||
</router-link>
|
||||
<router-link to="/Choose" class="van-tabbar-item">
|
||||
<div class="van-tabbar-item__icon">
|
||||
<img src="@/assets/images/common/beauty3.png" class="tui" />
|
||||
</div>
|
||||
<div class="van-tabbar-item__text"><span></span></div>
|
||||
</router-link>
|
||||
<router-link to="/Video" class="van-tabbar-item">
|
||||
<div class="van-tabbar-item__icon">
|
||||
<img src="@/assets/images/common/video.png" alt="VIDEO" />
|
||||
</div>
|
||||
<div class="van-tabbar-item__text">
|
||||
<span class="foorterTxt foorterTxtF">VIDEO</span>
|
||||
</div>
|
||||
</router-link>
|
||||
<router-link to="/mine" class="van-tabbar-item">
|
||||
<div class="van-tabbar-item__icon">
|
||||
<img src="@/assets/images/common/my.png" alt="Của tôi" />
|
||||
</div>
|
||||
<div class="van-tabbar-item__text">
|
||||
<span class="foorterTxt foorterTxtF">Của tôi</span>
|
||||
</div>
|
||||
</router-link>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
a:active,
|
||||
a.router-link-exact-active {
|
||||
color: rgb(126, 86, 120);
|
||||
transition: all 100ms ease-in;
|
||||
}
|
||||
</style>
|
7
src/components/layout/MainLayout.vue
Normal file
@ -0,0 +1,7 @@
|
||||
<script setup>
|
||||
import Footer from "@/components/layout/Footer.vue";
|
||||
</script>
|
||||
<template>
|
||||
<router-view></router-view>
|
||||
<Footer />
|
||||
</template>
|
125
src/components/lottery/Game.vue
Normal file
@ -0,0 +1,125 @@
|
||||
<script setup>
|
||||
const games = [
|
||||
{
|
||||
id: 1,
|
||||
name: "BỎ PHIẾU 1",
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: "BỎ PHIẾU 2",
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
name: "BỎ PHIẾU 3",
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
name: "ĐẶC BIỆT",
|
||||
},
|
||||
];
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="convention-hall page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div class="van-nav-bar__title van-ellipsis">XẾP HẠNG</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="convention-item">
|
||||
<div class="left">
|
||||
<div class="van-sidebar">
|
||||
<a class="van-sidebar-item van-sidebar-item--select"
|
||||
><div class="van-sidebar-item__text">Tất cả</div></a
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="list-wrapper van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="van-grid van-hairline--top">
|
||||
<router-link
|
||||
v-for="(g, idx) in games"
|
||||
:key="idx"
|
||||
:to="{ name: 'Lottery', query: { id: g.id } }"
|
||||
class="van-grid-item"
|
||||
style="flex-basis: 50%"
|
||||
>
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center van-hairline"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>{{ g.name }}</span
|
||||
><span></span>
|
||||
</div>
|
||||
</router-link>
|
||||
<!-- <div class="van-grid-item" style="flex-basis: 50%">
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center van-hairline"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>BỎ PHIẾU 2</span><span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-grid-item" style="flex-basis: 50%">
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center van-hairline"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>BỎ PHIẾU 3</span><span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-grid-item" style="flex-basis: 50%">
|
||||
<div
|
||||
class="van-grid-item__content van-grid-item__content--center van-hairline"
|
||||
>
|
||||
<div class="game_item_img van-image">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<span>ĐẶC BIỆT</span><span></span>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-image__img {
|
||||
border-radius: 5.333vw;
|
||||
}
|
||||
.van-grid-item__content {
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-direction: normal;
|
||||
-webkit-flex-direction: column;
|
||||
flex-direction: column;
|
||||
box-sizing: border-box;
|
||||
height: 100%;
|
||||
padding: 2.133vw 1.067vw;
|
||||
background-color: #fff;
|
||||
}
|
||||
</style>
|
326
src/components/lottery/LotteryGame.vue
Normal file
@ -0,0 +1,326 @@
|
||||
<script setup>
|
||||
import { ref, reactive, computed, watch } from "vue";
|
||||
import socket from "@/socket";
|
||||
import { useRoute } from "vue-router";
|
||||
import CountDown from "@/helpers/CountDown";
|
||||
import { formatNumber } from "@/helpers/format";
|
||||
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
|
||||
const route = useRoute();
|
||||
|
||||
const id = route.query.id;
|
||||
|
||||
const amount = ref("");
|
||||
const isShowOrder = ref(false);
|
||||
const showResult = ref(false);
|
||||
const showPopupRs = () => {
|
||||
showResult.value = !showResult.value;
|
||||
};
|
||||
|
||||
const countDown = reactive({
|
||||
hh: 0,
|
||||
mm: 0,
|
||||
ss: 0,
|
||||
t: 0,
|
||||
});
|
||||
|
||||
const gameInfo = reactive({
|
||||
name: "",
|
||||
session: "",
|
||||
end: 0,
|
||||
});
|
||||
|
||||
const choices = ref([
|
||||
{ id: "1", name: "IDOL 1", active: false },
|
||||
{ id: "2", name: "IDOL 2", active: false },
|
||||
{ id: "3", name: "IDOL 3", active: false },
|
||||
{ id: "4", name: "IDOL 4", active: false },
|
||||
]);
|
||||
|
||||
const hhmmss = computed(() => {
|
||||
return `${String(countDown.hh).padStart(2, "0")}:${String(
|
||||
countDown.mm
|
||||
).padStart(2, "0")}:${String(countDown.ss).padStart(2, "0")}`;
|
||||
});
|
||||
|
||||
const countDownTime = new CountDown(0, (hh, mm, ss, t) => {
|
||||
Object.assign(countDown, { hh, mm, ss, t });
|
||||
});
|
||||
|
||||
const io = socket();
|
||||
|
||||
io.emit("join", id);
|
||||
|
||||
io.on("game-info", (data) => {
|
||||
const { name, session, end } = data;
|
||||
Object.assign(gameInfo, { name, session, end });
|
||||
countDownTime.restart(end);
|
||||
});
|
||||
|
||||
const toggleChoice = (idx) => {
|
||||
choices.value[idx].active = !choices.value[idx].active;
|
||||
if(!choices.value[idx].active) {
|
||||
choices.value[idx].amount = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const submit = () => {
|
||||
const cs = choices.value.filter(e => e.active)
|
||||
if(cs.length === 0) return;
|
||||
const data = {
|
||||
id,
|
||||
choices: cs.map(e => {
|
||||
return {
|
||||
id: e.id,
|
||||
amount: Number(amount.value)
|
||||
}
|
||||
})
|
||||
}
|
||||
handleRequest(axios.post(API.ORDER, data)).then(res => {
|
||||
if(res.success) {
|
||||
showFailToast("Bình chọn thành công.")
|
||||
amount.value = 0;
|
||||
choices.value.forEach((e) => e.active = 0);
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi bình chọn")
|
||||
}
|
||||
})
|
||||
}
|
||||
const countChoices = computed(() => {
|
||||
return choices.value.filter((e) => e.active).length;
|
||||
});
|
||||
|
||||
const totalAmount = computed(() => {
|
||||
return choices.value.reduce((prev, curr) => {
|
||||
return prev + (curr.active ? amount.value : 0)
|
||||
}, 0);
|
||||
});
|
||||
|
||||
const choicesText = computed(() => {
|
||||
const cs = choices.value.filter((e) => e.active);
|
||||
if(cs.length) {
|
||||
return cs.map(e => e.name).join(",")
|
||||
}
|
||||
return "Không được chọn"
|
||||
});
|
||||
|
||||
watch(amount, (value) => {
|
||||
choices.value.forEach(c => {
|
||||
c.amount = value;
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
>
|
||||
</i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">{{ gameInfo.name }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="record">
|
||||
<div class="period">
|
||||
<div class="cover van-image">
|
||||
<img class="van-image__img" src="@/assets/images/common/bgGirl.png" />
|
||||
</div>
|
||||
<span class="period-number">{{ gameInfo.session }}</span>
|
||||
<div class="next-number">
|
||||
<div class="van-count-down">{{ hhmmss }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="linear-gradient"
|
||||
style="
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
rgba(126, 86, 120, 0),
|
||||
rgb(230, 195, 161),
|
||||
rgba(126, 86, 120, 0)
|
||||
);
|
||||
"
|
||||
></div>
|
||||
<div class="recent" @click="showPopupRs">
|
||||
<div class="kuaisan-ball left">
|
||||
<span class="res-des middle">IDOL 2</span
|
||||
><span class="res-des middle">IDOL 4</span>
|
||||
</div>
|
||||
<i
|
||||
class="van-icon van-icon-arrow-down down"
|
||||
:class="showResult ? 'up' : ''"
|
||||
></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="history_popup"></div>
|
||||
|
||||
<div class="wrapper">
|
||||
<div class="options-bar">
|
||||
<div class="game">
|
||||
<div
|
||||
class="linear-gradient"
|
||||
style="
|
||||
background: linear-gradient(
|
||||
to right,
|
||||
rgba(126, 86, 120, 0),
|
||||
rgb(230, 195, 161),
|
||||
rgba(126, 86, 120, 0)
|
||||
);
|
||||
"
|
||||
></div>
|
||||
<div class="sumValueTwoSides">
|
||||
<div
|
||||
class="rectangle large"
|
||||
:class="{ active: c.active }"
|
||||
v-for="(c, idx) in choices"
|
||||
:key="idx"
|
||||
@click="toggleChoice(idx)"
|
||||
>
|
||||
<div class="wrapper">
|
||||
<div class="content">
|
||||
<p class="name-text large">{{ c.name }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="bottom-bar">
|
||||
<div class="bar">
|
||||
<div class="left" @click="isShowOrder = !isShowOrder">
|
||||
<div class="item">
|
||||
<i class="jixuanico van-icon van-icon-cart-o"> </i
|
||||
><span class="text">Bình chọn</span>
|
||||
</div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="mid">
|
||||
<div>
|
||||
<span class="text">Số dư khả dụng</span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="text num">0</span><span class="text">Đ</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right" @click="submit">Xác nhận</div>
|
||||
</div>
|
||||
<div class="wrapper" :class="isShowOrder === true ? 'active' : ''">
|
||||
<div class="item">
|
||||
<span class="label">Hiện tại số đã chọn:</span>
|
||||
<div class="bet-number">{{ choicesText }}</div>
|
||||
<i
|
||||
class="van-icon van-icon-arrow-down down"
|
||||
:class="isShowOrder ? '' : 'up'"
|
||||
@click="isShowOrder = !isShowOrder"
|
||||
>
|
||||
</i>
|
||||
</div>
|
||||
<div class="item">
|
||||
<span class="label">Điểm xếp hạng</span>
|
||||
<div class="amount-wrapper">
|
||||
<div class="van-cell van-field">
|
||||
<div
|
||||
class="van-cell__value van-cell__value--alone van-field__value"
|
||||
>
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model.number="amount"
|
||||
type="number"
|
||||
inputmode="numeric"
|
||||
placeholder="Vui lòng nhập số tiền"
|
||||
class="van-field__control"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="label">Đ</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="part">
|
||||
<span> Tổng cộng</span
|
||||
><span class="number">{{ countChoices }}</span
|
||||
><span>Đặt</span>
|
||||
</div>
|
||||
<div class="part">
|
||||
<span> Tổng cộng</span
|
||||
><span class="number">{{ totalAmount }} </span><span>Đ</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<van-popup
|
||||
v-model:show="showResult"
|
||||
position="top"
|
||||
:style="{ height: '70%' }"
|
||||
>
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="wrapper">
|
||||
<div class="item">
|
||||
<div class="left font-weight">Mã xếp hạng</div>
|
||||
<div class="right font-weight">Kết quả xếp hạng</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<div class="left font-weight">202406103303</div>
|
||||
<div class="right font-weight">
|
||||
<div
|
||||
class="kuaisan-ball left"
|
||||
style="
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
margin-left: 40%;
|
||||
"
|
||||
>
|
||||
<span class="res-des middle">IDOL 2</span
|
||||
><span class="res-des middle">IDOL 4</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-cell {
|
||||
font-size: 4vw !important;
|
||||
line-height: 6.667vw !important;
|
||||
}
|
||||
.van-cell {
|
||||
position: relative;
|
||||
display: -webkit-box;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
padding: 1.333vw 2.133vw;
|
||||
overflow: hidden;
|
||||
color: #323233;
|
||||
font-size: 1.867vw;
|
||||
line-height: 3.2vw;
|
||||
background-color: #fff;
|
||||
}
|
||||
.wrapper .item .kuaisan-ball .res-des.middle {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.rectangle.active .content {
|
||||
background: transparent;
|
||||
}
|
||||
</style>
|
37
src/components/mine/GameRecord.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">
|
||||
Lịch sử bỏ phiếu bầu
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="van-empty">
|
||||
<div class="van-empty__image">
|
||||
<img src="@/assets/images/common/empty-image-default.png" />
|
||||
</div>
|
||||
<p class="van-empty__description">Dữ liệu trống</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-empty__description {
|
||||
color: #969799;
|
||||
}
|
||||
</style>
|
170
src/components/mine/Mine.vue
Normal file
@ -0,0 +1,170 @@
|
||||
<script setup>
|
||||
import { showFailToast } from "vant";
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { formatNumber } from "@/helpers/format"
|
||||
// const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<div class="mine page">
|
||||
<div
|
||||
class="bg-container page-bg"
|
||||
style="background-image: url('src/assets/images/common/bgMine.png')"
|
||||
>
|
||||
<div class="bg-wrapper"></div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
<div class="header" style="background: none">
|
||||
<div
|
||||
class="nav-bar van-nav-bar van-hairline--bottom"
|
||||
style="background: none"
|
||||
>
|
||||
<div class="van-nav-bar__content">
|
||||
<div class="van-nav-bar__title van-ellipsis"></div>
|
||||
<router-link to="/Setting" class="van-nav-bar__right">
|
||||
<i
|
||||
class="van-icon van-icon-setting-o"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
<div class="user-wrapper">
|
||||
<div class="user_img van-image van-image--round">
|
||||
<img
|
||||
class="van-image__img"
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
/>
|
||||
</div>
|
||||
<div class="login-content">
|
||||
<p class="login-btn" style="margin: 19.1833px 0">
|
||||
{{ userInfo?.username }}
|
||||
<img
|
||||
src="@/assets/images/common/vip1.png"
|
||||
alt=""
|
||||
class="login-vip"
|
||||
/>
|
||||
</p>
|
||||
<div class="login-label" style="margin: 13.4333px 0">
|
||||
<div class="van-progress" style="height: 8px">
|
||||
<span
|
||||
class="van-progress__portion"
|
||||
style="
|
||||
background: linear-gradient(
|
||||
270deg,
|
||||
rgb(194, 68, 145),
|
||||
rgb(119, 95, 217)
|
||||
);
|
||||
width: 14.7px;
|
||||
"
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="finance">
|
||||
<router-link to="/Recharge" class="finance-item">
|
||||
<i class="icon van-icon van-icon-peer-pay"></i
|
||||
><span class="text">NẠP ĐIỂM</span>
|
||||
</router-link>
|
||||
<div class="line"></div>
|
||||
<router-link to="/Setbank" class="finance-item">
|
||||
<i class="icon van-icon van-icon-idcard"></i
|
||||
><span class="text">RÚT ĐIỂM</span>
|
||||
</router-link>
|
||||
</div>
|
||||
<div class="wallet">
|
||||
<router-link to="Moneylog" class="part-1 van-hairline--bottom">
|
||||
<p class="flex-1 font-28 font-primary-color">Ví của tôi</p>
|
||||
<span class="font-28 font-gray">Chi tiết</span
|
||||
><i class="font-gray van-icon van-icon-arrow" style=""></i>
|
||||
</router-link>
|
||||
<div class="part-2">
|
||||
<p class="balance van-ellipsis" style="font-size: 24px">{{ formatNumber(userInfo?.money ?? 0) }} Đ</p>
|
||||
<span class="font-28 font-gray" style="font-size: 14px"
|
||||
>(100 Đ=100,000 VND)</span
|
||||
>
|
||||
<div class="refresh-btn">
|
||||
<i class="van-icon van-icon-replay"></i>
|
||||
</div>
|
||||
</div>
|
||||
<div class="part-2">
|
||||
<p class="balance van-ellipsis" style="font-size: 24px">100/100</p>
|
||||
<span class="font-28 font-gray" style="font-size: 14px">
|
||||
Điểm tín nhiệm</span
|
||||
>
|
||||
<div class="refresh-btn">
|
||||
<i class="van-icon van-icon-replay"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="menu" style="margin-top: 15px">
|
||||
<router-link to="/Personalreport" class="menu-item">
|
||||
<div class="menu-item-icon van-image">
|
||||
<img
|
||||
src="@/assets/images/icon/baobiao.svg"
|
||||
class="van-image__img"
|
||||
/>
|
||||
</div>
|
||||
<span class="menu-item-label"> Thông tin tài khoản</span>
|
||||
</router-link>
|
||||
<router-link to="Infomation" class="menu-item">
|
||||
<div class="menu-item-icon van-image">
|
||||
<img src="@/assets/images/icon/user.svg" class="van-image__img" />
|
||||
</div>
|
||||
<span class="menu-item-label">Thông tin cá nhân</span>
|
||||
</router-link>
|
||||
<router-link to="/RechargeRecord" class="menu-item">
|
||||
<div class="menu-item-icon van-image">
|
||||
<img
|
||||
src="@/assets/images/icon/mingxi.svg"
|
||||
class="van-image__img"
|
||||
/>
|
||||
</div>
|
||||
<span class="menu-item-label">Lịch sử quy đổi điểm</span>
|
||||
</router-link>
|
||||
<router-link to="/GameRecord" class="menu-item">
|
||||
<div class="menu-item-icon van-image">
|
||||
<img
|
||||
src="@/assets/images/icon/youxi.svg"
|
||||
class="van-image__img"
|
||||
/>
|
||||
</div>
|
||||
<span class="menu-item-label">Lịch sử bỏ phiếu bầu</span>
|
||||
</router-link>
|
||||
<router-link to="/Notice" class="menu-item">
|
||||
<div class="menu-item-icon van-image">
|
||||
<img
|
||||
src="@/assets/images/icon/gonggao.svg"
|
||||
class="van-image__img"
|
||||
/>
|
||||
</div>
|
||||
<span class="menu-item-label">Thông báo</span>
|
||||
</router-link>
|
||||
<div
|
||||
class="menu-item"
|
||||
@click="showFailToast('Tính năng bị vô hiệu hóa')"
|
||||
>
|
||||
<div class="menu-item-icon van-image">
|
||||
<img
|
||||
src="@/assets/images/icon/kefu_1.svg"
|
||||
class="van-image__img"
|
||||
/>
|
||||
</div>
|
||||
<span class="menu-item-label">Phim của tôi</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
a {
|
||||
color: black;
|
||||
}
|
||||
</style>
|
45
src/components/mine/Noitice.vue
Normal file
@ -0,0 +1,45 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Thông báo hệ thống</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="listItem">
|
||||
<div class="listTitle">Hoạt động trên không</div>
|
||||
<div class="listContent html">
|
||||
<p>
|
||||
Chúng tôi là CANALIS CLUB - Một quán Bar lớn . Phục vụ tận nơi
|
||||
tại 63 tỉnh thành trên toàn quốc . Chúng tôi có những người mẫu
|
||||
cao cấp, tiếp viên hàng không, du học sinh.... Sẵn sàng phục vụ
|
||||
quý khách hàng !<br />
|
||||
</p>
|
||||
</div>
|
||||
<div class="listTime">
|
||||
<div class="listTimeText">2023-07-05 23:06:33</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.container p {
|
||||
color: #000;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
</style>
|
59
src/components/mine/Personalreport.vue
Normal file
@ -0,0 +1,59 @@
|
||||
<script setup>
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { formatNumber } from "@/helpers/format"
|
||||
|
||||
const userStore = useUserStore();
|
||||
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Thông tin tài khoản</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="info">
|
||||
<p class="title">Số lượng nhiệm vụ(Đ)</p>
|
||||
<p class="value">{{ formatNumber(userInfo.money) }}Đ</p>
|
||||
<p class="tip">
|
||||
Công thức tính lợi nhuận: số tiền thắng - số tiền nhiệm vụ
|
||||
</p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="datalist">
|
||||
<div class="datalistitem">
|
||||
<div class="datalistitemValue">{{ formatNumber(userInfo?.money ?? 0) }}Đ</div>
|
||||
<div class="datalistitemKey">Số lượng nhiệm vụ</div>
|
||||
<div class="datalistitemRightLine"></div>
|
||||
</div>
|
||||
<div class="datalistitem">
|
||||
<div class="datalistitemValue">{{ formatNumber(userInfo?.moneyDeposit ?? 0) }}Đ</div>
|
||||
<div class="datalistitemKey">Số tiền nạp</div>
|
||||
<div class="datalistitemRightLine"></div>
|
||||
</div>
|
||||
<div class="datalistitem">
|
||||
<div class="datalistitemValue">{{ formatNumber(userInfo?.moneyWithdraw ?? 0) }}Đ</div>
|
||||
<div class="datalistitemKey">Số điểm rút</div>
|
||||
<div class="datalistitemRightLine"></div>
|
||||
</div>
|
||||
<div class="datalistitem">
|
||||
<div class="datalistitemValue">{{ formatNumber(userInfo?.moneyWin ?? 0) }}Đ</div>
|
||||
<div class="datalistitemKey">Số tiền chiến thắng</div>
|
||||
<div class="datalistitemRightLine"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
37
src/components/mine/RechargeRecord.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">
|
||||
Lịch sử quy đổi điểm
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main">
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
<div class="van-empty">
|
||||
<div class="van-empty__image">
|
||||
<img src="@/assets/images/common/empty-image-default.png" />
|
||||
</div>
|
||||
<p class="van-empty__description">Dữ liệu trống</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.van-empty__description {
|
||||
color: #969799;
|
||||
}
|
||||
</style>
|
64
src/components/setting/Info.vue
Normal file
@ -0,0 +1,64 @@
|
||||
<script setup>
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { formatNumber } from "@/helpers/format"
|
||||
|
||||
const userStore = useUserStore();
|
||||
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Thông tin cơ bản</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="main-content">
|
||||
<div class="item van-hairline--bottom">
|
||||
<div class="left">Hình đại diện</div>
|
||||
<div class="right">
|
||||
<img
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
style="border-radius: 50%; width: 43px; height: 43px"
|
||||
/><i class="van-icon van-icon-arrow"></i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<router-link to="/Setname" class="item van-hairline--bottom">
|
||||
<div class="left">Tên thật</div>
|
||||
<div class="right">
|
||||
<span class="desc">{{ userInfo?.fullname ?? "Không được thiết lập" }}</span
|
||||
><i class="van-icon van-icon-arrow"></i>
|
||||
</div>
|
||||
</router-link>
|
||||
<router-link to="/Setsex" class="item van-hairline--bottom">
|
||||
<div class="left">Giới tính</div>
|
||||
<div class="right">
|
||||
<span class="desc">Không xác định</span
|
||||
><i class="van-icon van-icon-arrow"></i>
|
||||
</div>
|
||||
</router-link>
|
||||
<router-link to="/Setbank" class="item van-hairline--bottom">
|
||||
<div class="left">Liên kết thông tin thẻ ngân hàng</div>
|
||||
<div class="right">
|
||||
<span class="desc">Không có</span
|
||||
><i class="van-icon van-icon-arrow"></i>
|
||||
</div>
|
||||
</router-link>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
a {
|
||||
color: black;
|
||||
}
|
||||
</style>
|
24
src/components/setting/Moneylog.vue
Normal file
@ -0,0 +1,24 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="header">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Số dư biến động</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<div class="van-pull-refresh">
|
||||
<div class="van-pull-refresh__track" style="transition-duration: 0ms">
|
||||
<div class="van-pull-refresh__head"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
25
src/components/setting/SetBank.vue
Normal file
@ -0,0 +1,25 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Tài khoản ngân hàng</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper" style="background-color: #f2f2f5">
|
||||
<router-link to="/SetPayPassword" class="add-card">
|
||||
<i class="van-icon van-icon-plus"></i
|
||||
><span>Thêm tài khoản ngân hàng</span>
|
||||
</router-link>
|
||||
<div class="tips">
|
||||
Nhắc nhở: Vui lòng liên kết với ngân hàng. Nếu cần sửa đổi, vui lòng
|
||||
liên hệ bộ phận chăm sóc khách hàng trực tuyến
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
72
src/components/setting/SetName.vue
Normal file
@ -0,0 +1,72 @@
|
||||
<script setup>
|
||||
import { ref, reactive, watch } from "vue";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import { useRouter } from "vue-router";
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
const formData = reactive({
|
||||
fullname: userInfo.value?.fullname,
|
||||
});
|
||||
|
||||
const showPassword = ref(false);
|
||||
|
||||
function submit() {
|
||||
handleRequest(axios.post(API.USER_SET_FULLNAME, formData)).then((res) => {
|
||||
if (res.success) {
|
||||
router.go(-1);
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Sửa tên thật </div>
|
||||
<div class="van-nav-bar__right" @click="submit">
|
||||
<span class="nav-right">Xác nhận</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell-group van-hairline--top-bottom">
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label"><span>Tên</span></div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.fullname"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập tên thật của bạn"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
Để đảm bảo an toàn cho tài khoản của bạn, tên thật cần phải nhất quán với
|
||||
tên trên thẻ ngân hàng bị ràng buộc
|
||||
</p>
|
||||
</div>
|
||||
</template>
|
25
src/components/setting/Setsex.vue
Normal file
@ -0,0 +1,25 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
const checked = ref("1");
|
||||
</script>
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">Sửa đổi giới tính</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sex">
|
||||
<van-radio-group v-model="checked">
|
||||
<van-radio name="1">Nam giới</van-radio>
|
||||
<van-radio name="2">Nữ giới</van-radio>
|
||||
</van-radio-group>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
77
src/components/video/PlayVideo.vue
Normal file
@ -0,0 +1,77 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
|
||||
const show = ref(true);
|
||||
const showPopup = () => {
|
||||
show.value = true;
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">
|
||||
Gieo màu xanh xuống biển!
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="movie-video">
|
||||
<div
|
||||
class="video-js noVip vjs-paused my-video-dimensions vjs-controls-enabled vjs-workinghover vjs-v7 vjs-user-inactive"
|
||||
id="my-video"
|
||||
>
|
||||
<!-- <video
|
||||
id="my-video_html5_api"
|
||||
class="vjs-tech"
|
||||
src="blob:https://canalis.vip/d222f00d-594f-48eb-84ee-fe3ae706b29c"
|
||||
></video> -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="movie-content">
|
||||
<div class="movie-descript">
|
||||
<p>Gieo màu xanh xuống biển!</p>
|
||||
<span>242Lượt xem</span>
|
||||
</div>
|
||||
<div class="movie-body">
|
||||
<div class="movie-title">
|
||||
<div><span>Xem thêm</span></div>
|
||||
</div>
|
||||
<div class="movie-list">
|
||||
<div class="movie-play-item">
|
||||
<div>
|
||||
<img src="@/assets/images/common/bgGirl.png" />
|
||||
<div>
|
||||
<div class="van-count-down">00:07:18</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<p>Gieo màu xanh xuống biển!</p>
|
||||
<span>242Lượt xem</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<van-cell title="Xem video" is-link @click="showPopup" />
|
||||
<van-popup class="errorMoney van-popup van-popup--center" v-model:show="show"
|
||||
><div class="header">
|
||||
Xem video
|
||||
<i class="close van-icon van-icon-cross"></i>
|
||||
</div>
|
||||
<div class="content">
|
||||
Những người chưa hoàn thành bình chọn chỉ cung cấp bản dùng thử 15 giây,
|
||||
hãy liên hệ với chuyên viên hướng dẫn bình chọn để trở thành thành viên
|
||||
của trang này, thưởng thức tất cả các video trên trang này và mở khóa dịch
|
||||
vụ tận nhà của những người đẹp nóng bỏng trong cùng một thành phố!
|
||||
</div>
|
||||
</van-popup>
|
||||
</template>
|
37
src/components/video/Video.vue
Normal file
@ -0,0 +1,37 @@
|
||||
<script setup>
|
||||
import { ref } from "vue";
|
||||
|
||||
const activeTab = ref(0);
|
||||
</script>
|
||||
<template>
|
||||
<div class="movie-hall page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div class="van-nav-bar__title van-ellipsis">VIDEO</div>
|
||||
</div>
|
||||
</div>
|
||||
<van-tabs v-model:active="activeTab" sticky swipeable>
|
||||
<van-tab title="Việt Nam">
|
||||
<div class="hot-recommend-div">
|
||||
<div class="van-list">
|
||||
<div class="list-item">
|
||||
<a href="/PlayVideo" class="movie-list-item">
|
||||
<div class="cover_img van-image van-image--round">
|
||||
<img
|
||||
src="@/assets/images/common/bgGirl.png"
|
||||
class="van-image__img"
|
||||
/>
|
||||
</div>
|
||||
<div class="movie-list-item-bottom">
|
||||
<div class="movie-time-div">
|
||||
<span>Gieo màu xanh xuống biển! </span><span>Chơi:242</span>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</van-tab>
|
||||
</van-tabs>
|
||||
</div>
|
||||
</template>
|
71
src/components/withdraw/BinCard.vue
Normal file
@ -0,0 +1,71 @@
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">MẬT KHẨU RÚT TIỀN</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
<div
|
||||
class="van-cell-group van-cell-group--inset van-hairline--top-bottom"
|
||||
>
|
||||
<div class="van-cell van-field van-field--label-top">
|
||||
<div class="van-cell__title van-field__label van-field__label--top">
|
||||
<span>Mật khẩu rút tiền hiện tại</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Tạo Mật Khẩu Rút Tiền"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Mật khẩu rút tiền mới</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập lại mật khẩu rút tiền mới"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Nhập lại mật rút tiền mới</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Nhập Lại Mật Khẩu Rút Tiền Đã Tạo"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="sub-btn van-button van-button--default van-button--normal">
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Xác nhận</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
111
src/components/withdraw/EditPayPassword.vue
Normal file
@ -0,0 +1,111 @@
|
||||
<script setup>
|
||||
import { ref, reactive, watch } from "vue";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import { useRouter } from "vue-router";
|
||||
import { useUserStore } from "@/store/user";
|
||||
import { storeToRefs } from "pinia";
|
||||
|
||||
const router = useRouter();
|
||||
const userStore = useUserStore();
|
||||
const { userInfo } = storeToRefs(userStore);
|
||||
|
||||
const formData = reactive({
|
||||
password: "",
|
||||
newPassword: "",
|
||||
confirmPassword: "",
|
||||
});
|
||||
|
||||
function submit() {
|
||||
const { password, newPassword ,confirmPassword } = formData
|
||||
if(newPassword !== confirmPassword) {
|
||||
return showFailToast("Mật khẩu mới không khớp");
|
||||
}
|
||||
handleRequest(axios.post(API.CHANGE_PASSWORD_WITHDRAW, { password, newPassword})).then((res) => {
|
||||
if (res.success) {
|
||||
router.go(-1);
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi");
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">MẬT KHẨU RÚT TIỀN</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
<div
|
||||
class="van-cell-group van-cell-group--inset van-hairline--top-bottom"
|
||||
>
|
||||
<div class="van-cell van-field van-field--label-top">
|
||||
<div class="van-cell__title van-field__label van-field__label--top">
|
||||
<span>Mật khẩu rút tiền hiện tại</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.password"
|
||||
type="text"
|
||||
placeholder="Tạo Mật Khẩu Rút Tiền"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Mật khẩu rút tiền mới</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.newPassword"
|
||||
type="text"
|
||||
placeholder="Vui lòng nhập lại mật khẩu rút tiền mới"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="van-cell van-field">
|
||||
<div class="van-cell__title van-field__label">
|
||||
<span>Nhập lại mật rút tiền mới</span>
|
||||
</div>
|
||||
<div class="van-cell__value van-field__value">
|
||||
<div class="van-field__body">
|
||||
<input
|
||||
v-model="formData.confirmPassword"
|
||||
type="text"
|
||||
placeholder="Nhập Lại Mật Khẩu Rút Tiền Đã Tạo"
|
||||
class="van-field__control"
|
||||
style="color: #323233"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="sub-btn van-button van-button--default van-button--normal" @click="submit">
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Xác nhận</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
115
src/components/withdraw/SetPayPassword.vue
Normal file
@ -0,0 +1,115 @@
|
||||
<script setup>
|
||||
import { ref, reactive } from "vue";
|
||||
import { PasswordInput, NumberKeyboard } from "vant";
|
||||
import { showFailToast } from "vant";
|
||||
|
||||
import axios from "@/axios";
|
||||
import API from "@/api";
|
||||
import { handleRequest } from "@/helpers/request";
|
||||
|
||||
const formData = reactive({
|
||||
password: "",
|
||||
confirmPassword: "",
|
||||
});
|
||||
|
||||
const maxLength = 6;
|
||||
|
||||
const focusPassword = ref(true);
|
||||
const focusConfirmPassword = ref(false);
|
||||
|
||||
const showKeyboard = ref(true);
|
||||
|
||||
const onFocusPassword = () => {
|
||||
focusPassword.value = true;
|
||||
focusConfirmPassword.value = false;
|
||||
showKeyboard.value = true;
|
||||
};
|
||||
|
||||
const onFocusConfirmPassword = () => {
|
||||
focusPassword.value = false;
|
||||
focusConfirmPassword.value = true;
|
||||
showKeyboard.value = true;
|
||||
};
|
||||
|
||||
const onKeyBoardInput = (value) => {
|
||||
if (focusPassword.value && formData.password.length < 6) {
|
||||
formData.password += String(value);
|
||||
} else if (focusConfirmPassword.value && formData.confirmPassword.length < 6) {
|
||||
formData.confirmPassword += String(value);
|
||||
}
|
||||
};
|
||||
const onKeyBoardDelete = () => {
|
||||
if (focusPassword.value) {
|
||||
formData.password = formData.password.slice(0, -1);
|
||||
} else if (focusConfirmPassword.value) {
|
||||
formData.confirmPassword = formData.confirmPassword.slice(0, -1);
|
||||
}
|
||||
};
|
||||
|
||||
const submit = () => {
|
||||
if(formData.password.length < maxLength || formData.confirmPassword.length < maxLength) {
|
||||
showFailToast("Vui lòng nhập đẩy đủ thông tin")
|
||||
}
|
||||
if(formData.password !== formData.confirmPassword) {
|
||||
showFailToast("Mật khẩu không khớp")
|
||||
}
|
||||
|
||||
const { password } = formData;
|
||||
|
||||
handleRequest(axios.post(API.PASSWORD_WITHDRAW, { password })).then((res) => {
|
||||
if(res.success) {
|
||||
userStore.login(res.data)
|
||||
router.push("/mine")
|
||||
} else {
|
||||
showFailToast(res.message ?? "Lỗi đăng nhập")
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<div class="container page">
|
||||
<div class="nav-bar van-nav-bar van-hairline--bottom">
|
||||
<div class="van-nav-bar__content">
|
||||
<div @click="$router.go(-1)" class="van-nav-bar__left">
|
||||
<i
|
||||
class="van-icon van-icon-arrow-left"
|
||||
style="color: rgb(255, 255, 255)"
|
||||
></i>
|
||||
</div>
|
||||
<div class="van-nav-bar__title van-ellipsis">MẬT KHẨU RÚT TIỀN</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="wrapper">
|
||||
<div class="item">
|
||||
<p class="title">Tạo Mật Khẩu Rút Tiền</p>
|
||||
<van-password-input
|
||||
:value="formData.password"
|
||||
:gutter="10"
|
||||
:focused="focusPassword"
|
||||
@focus="onFocusPassword"
|
||||
/>
|
||||
</div>
|
||||
<div class="item">
|
||||
<p class="title">Vui lòng nhập lại mật khẩu rút tiền mới</p>
|
||||
<van-password-input
|
||||
:value="formData.confirmPassword"
|
||||
:gutter="10"
|
||||
:focused="focusConfirmPassword"
|
||||
@focus="onFocusConfirmPassword"
|
||||
/>
|
||||
</div>
|
||||
<van-number-keyboard
|
||||
:show="showKeyboard"
|
||||
@blur="showKeyboard = false"
|
||||
@input="onKeyBoardInput"
|
||||
@delete="onKeyBoardDelete"
|
||||
/>
|
||||
<button class="sub-btn van-button van-button--default van-button--normal" @click="submit">
|
||||
<div class="van-button__content">
|
||||
<span class="van-button__text">Xác nhận</span>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
41
src/helpers/CountDown.js
Normal file
@ -0,0 +1,41 @@
|
||||
class CountDown {
|
||||
endTime = 0;
|
||||
interval
|
||||
callback
|
||||
constructor(endTime, callback, start = false) {
|
||||
this.endTime = endTime
|
||||
this.callback = callback;
|
||||
if(start) {
|
||||
this.start();
|
||||
}
|
||||
}
|
||||
|
||||
start() {
|
||||
this.interval = setInterval(() => {
|
||||
const t = ((this.endTime - Date.now()) / 1000) >> 0;
|
||||
if (t >= 0) {
|
||||
const hh = (t / 3600) >> 0;
|
||||
const mm = ((t - hh * 3600) / 60) >> 0
|
||||
const ss = t % 60
|
||||
if(this.callback) {
|
||||
this.callback(hh, mm, ss, t)
|
||||
}
|
||||
} else {
|
||||
this.stop();
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
restart(endTime) {
|
||||
this.stop();
|
||||
this.endTime = endTime;
|
||||
this.start();
|
||||
}
|
||||
|
||||
stop(){
|
||||
clearInterval(this.interval)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default CountDown
|
33
src/helpers/format.js
Normal file
@ -0,0 +1,33 @@
|
||||
import moment from "moment"
|
||||
|
||||
export function formatNumber(value, minFraction = 0, maxFraction = 3 ){
|
||||
try {
|
||||
var formatter = new Intl.NumberFormat('en-US', {
|
||||
minimumFractionDigits: minFraction,
|
||||
maximumFractionDigits: maxFraction
|
||||
});
|
||||
return formatter.format(value);
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return value
|
||||
}
|
||||
}
|
||||
|
||||
export function formatDateTime(time, format="YYYY-MM-DD HH:mm:ss") {
|
||||
return moment(time).utcOffset("Asean/Ho_Chi_Minh").format(format)
|
||||
}
|
||||
|
||||
export function formatTransactionStatus(value) {
|
||||
switch (value) {
|
||||
case 0:
|
||||
return 'Chờ xử lý'
|
||||
case 1:
|
||||
return 'Thành công'
|
||||
case 2:
|
||||
return 'Thất bại'
|
||||
case "all":
|
||||
return 'Tất cả'
|
||||
default:
|
||||
return 'N/A'
|
||||
}
|
||||
}
|
4
src/helpers/redirect.js
Normal file
@ -0,0 +1,4 @@
|
||||
|
||||
export function gotoChat() {
|
||||
window.open(import.meta.env.VITE_APP_CHAT_URL + `?token=${localStorage.getItem('accessToken')}`, "_self");
|
||||
}
|
16
src/helpers/request.js
Normal file
@ -0,0 +1,16 @@
|
||||
async function handleRequest(request, throwError = false) {
|
||||
if (!throwError) {
|
||||
try {
|
||||
return await request
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
return error
|
||||
}
|
||||
}
|
||||
return request
|
||||
}
|
||||
|
||||
|
||||
export {
|
||||
handleRequest
|
||||
}
|
17
src/main.js
Normal file
@ -0,0 +1,17 @@
|
||||
import { createApp } from "vue";
|
||||
import App from "./App.vue";
|
||||
import router from "./router";
|
||||
import Vant, { Icon } from "vant";
|
||||
|
||||
import { createPinia } from 'pinia'
|
||||
|
||||
import "vant/lib/index.css";
|
||||
import "@/assets/css/chunkVendor.css";
|
||||
import "@/assets/css/main.css";
|
||||
|
||||
const app = createApp(App);
|
||||
app.use(router);
|
||||
app.use(createPinia())
|
||||
app.use(Vant);
|
||||
app.use(Icon);
|
||||
app.mount("#app");
|
210
src/router/index.js
Normal file
@ -0,0 +1,210 @@
|
||||
import { createRouter, createWebHistory } from "vue-router";
|
||||
import MainLayout from "@/components/layout/MainLayout.vue";
|
||||
import { useUserStore } from "@/store/user";
|
||||
|
||||
const routes = [
|
||||
{
|
||||
path: "/",
|
||||
component: MainLayout,
|
||||
children: [
|
||||
{
|
||||
path: "/",
|
||||
name: "index",
|
||||
component: () => import("@/components/home/HomePage.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Game",
|
||||
name: "Game",
|
||||
component: () => import("@/components/lottery/Game.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Choose",
|
||||
name: "Choose",
|
||||
component: () => import("@/components/home/Choose.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Video",
|
||||
name: "Video",
|
||||
component: () => import("@/components/video/Video.vue"),
|
||||
},
|
||||
{
|
||||
path: "/mine",
|
||||
name: "Mine",
|
||||
component: () => import("@/components/mine/Mine.vue"),
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "/register",
|
||||
name: "Register",
|
||||
meta: { redirectIfLoggedIn: true },
|
||||
component: () => import("@/components/auth/Register.vue"),
|
||||
},
|
||||
{
|
||||
path: "/login",
|
||||
name: "Login",
|
||||
meta: { redirectIfLoggedIn: true },
|
||||
component: () => import("@/components/auth/Login.vue"),
|
||||
},
|
||||
{
|
||||
path: "/HomeDetail",
|
||||
name: "DetailGirl",
|
||||
component: () => import("@/components/home/DetailGirl.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Lottery",
|
||||
name: "Lottery",
|
||||
component: () => import("@/components/lottery/LotteryGame.vue"),
|
||||
},
|
||||
{
|
||||
path: "/list",
|
||||
name: "List",
|
||||
component: () => import("@/components/home/List.vue"),
|
||||
},
|
||||
{
|
||||
path: "/ProfileOnList",
|
||||
name: "ProfileOnList",
|
||||
component: () => import("@/components/home/ProfileOnList.vue"),
|
||||
},
|
||||
{
|
||||
path: "/PlayVideo",
|
||||
name: "PlayVideo",
|
||||
component: () => import("@/components/video/PlayVideo.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Setting",
|
||||
name: "Setting",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/home/Settings.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Infomation",
|
||||
name: "Infomation",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/setting/Info.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Language",
|
||||
name: "Language",
|
||||
component: () => import("@/components/home/Language.vue"),
|
||||
},
|
||||
{
|
||||
path: "/EditPayPassword",
|
||||
name: "EditPayPassword",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/withdraw/EditPayPassword.vue"),
|
||||
},
|
||||
{
|
||||
path: "/SetLoginPassword",
|
||||
name: "SetLoginPassword",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/auth/SetLoginPassword.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Setname",
|
||||
name: "Setname",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/setting/SetName.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Setsex",
|
||||
name: "Setsex",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/setting/Setsex.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Setbank",
|
||||
name: "Setbank",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/setting/SetBank.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Personalreport",
|
||||
name: "Personalreport",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/mine/Personalreport.vue"),
|
||||
},
|
||||
{
|
||||
path: "/RechargeRecord",
|
||||
name: "RechargeRecord",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/mine/RechargeRecord.vue"),
|
||||
},
|
||||
{
|
||||
path: "/GameRecord",
|
||||
name: "GameRecord",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/mine/GameRecord.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Notice",
|
||||
name: "Notice",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/mine/Noitice.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Moneylog",
|
||||
name: "Moneylog",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/setting/Moneylog.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Recharge",
|
||||
name: "Recharge",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/deposit/Recharge.vue"),
|
||||
},
|
||||
{
|
||||
path: "/Channel",
|
||||
name: "Channel",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/deposit/Channel.vue"),
|
||||
},
|
||||
{
|
||||
path: "/RechargeRecord",
|
||||
name: "RechargeRecord",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/deposit/RechargeRecord.vue"),
|
||||
},
|
||||
{
|
||||
path: "/SetPayPassword",
|
||||
name: "SetPayPassword",
|
||||
meta: { auth: true },
|
||||
component: () => import("@/components/withdraw/SetPayPassword.vue"),
|
||||
},
|
||||
|
||||
{
|
||||
path: "/:pathMatch(.*)*",
|
||||
redirect: { name: "home" },
|
||||
},
|
||||
];
|
||||
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes: routes,
|
||||
});
|
||||
|
||||
router.beforeEach(async (to, _, next) => {
|
||||
const isLoggedIn = localStorage.getItem("accessToken");
|
||||
|
||||
if (to.meta.auth && !isLoggedIn) {
|
||||
return next({ name: "Login" });
|
||||
}
|
||||
|
||||
if (to.meta.redirectIfLoggedIn && isLoggedIn) {
|
||||
return next({ name: "index" });
|
||||
}
|
||||
|
||||
if (isLoggedIn) {
|
||||
const userStore = useUserStore();
|
||||
try {
|
||||
userStore.getUserInfo();
|
||||
} catch (error) {
|
||||
return next();
|
||||
}
|
||||
}
|
||||
return next();
|
||||
});
|
||||
|
||||
|
||||
export default router;
|
9
src/socket/index.js
Normal file
@ -0,0 +1,9 @@
|
||||
import { io } from "socket.io-client"
|
||||
|
||||
export default () => {
|
||||
return io(import.meta.env.VITE_APP_BASE_URL, {
|
||||
auth: {
|
||||
token: localStorage.getItem("accessToken")
|
||||
},
|
||||
});
|
||||
}
|
50
src/store/user.js
Normal file
@ -0,0 +1,50 @@
|
||||
import API from "@/api";
|
||||
import axios from "@/axios";
|
||||
import { defineStore } from "pinia";
|
||||
import router from "@/router";
|
||||
|
||||
const defaultState = () => {
|
||||
return {
|
||||
userInfo: null,
|
||||
isLogin: localStorage.hasOwnProperty("accessToken")
|
||||
}
|
||||
}
|
||||
|
||||
export const useUserStore = defineStore("user", {
|
||||
state: () => defaultState(),
|
||||
|
||||
getters: {},
|
||||
|
||||
actions: {
|
||||
async getUserInfo() {
|
||||
try {
|
||||
const res = await axios.get(API.USER_INFO)
|
||||
if (res.success) {
|
||||
this.userInfo = res.data;
|
||||
return res.data
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
},
|
||||
|
||||
updateUserInfo(payload) {
|
||||
Object.assign(this.userInfo, payload)
|
||||
},
|
||||
|
||||
login(accessToken) {
|
||||
localStorage.setItem("accessToken", accessToken);
|
||||
this.isLogin = true;
|
||||
},
|
||||
|
||||
logout() {
|
||||
localStorage.removeItem("accessToken");
|
||||
this.$reset();
|
||||
router.push("/")
|
||||
},
|
||||
|
||||
$reset() {
|
||||
Object.assign(this, defaultState());
|
||||
},
|
||||
},
|
||||
});
|
13
vite.config.js
Normal file
@ -0,0 +1,13 @@
|
||||
import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
import path from "path";
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
resolve: {
|
||||
alias: {
|
||||
"@": path.resolve(__dirname, "./src")
|
||||
}
|
||||
}
|
||||
})
|