push code

This commit is contained in:
gin 2024-06-15 14:59:52 +07:00
commit b519879332
84 changed files with 20222 additions and 0 deletions

8
.idea/UI.iml generated Normal file
View 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>

View 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>

View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

26
package.json Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

5
src/App.vue Normal file
View File

@ -0,0 +1,5 @@
<script setup></script>
<template>
<router-view />
</template>

43
src/api/index.js Normal file
View 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

File diff suppressed because one or more lines are too long

4160
src/assets/css/main.css Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

View 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

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View 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
View 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;

View 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 tài khoảnĐăng 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>

View 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 </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 đồ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 </span>
</div>
</button>
</div>
</div>
</div>
</div>
</div>
</template>
<style scoped>
.van-field__control {
color: #323233;
}
</style>

View 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 </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>

View 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 tin 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>

View 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ố 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>

View 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>

View 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 , thể sắp xếp
bất cứ nơi nào tại Việt Nam 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 , thể sắp xếp
bất cứ nơi nào tại Việt Nam 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">
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ỉ điều bạn không nghĩ ra được
bạn không thể làm được nếu không 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 cấp hai tại địa
phương Việt Nam các thành phố cấp ba cũng 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 , thể sắp xếp
bất cứ nơi nào tại Việt Nam 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>

View 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>

View 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 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 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 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>

View 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>

View 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>

View 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 </span>
</div>
</button>
</div>
</div>
</template>

View 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 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>

View 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>

View File

@ -0,0 +1,7 @@
<script setup>
import Footer from "@/components/layout/Footer.vue";
</script>
<template>
<router-view></router-view>
<Footer />
</template>

View 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>

View 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ố 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"> 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>

View 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>

View 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"> 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 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>

View 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 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 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>

View 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>

View 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>

View 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 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 </span
><i class="van-icon van-icon-arrow"></i>
</div>
</router-link>
</div>
</div>
</template>
<style scoped>
a {
color: black;
}
</style>

View 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ố 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>

View 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>

View 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>

View 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>

View 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 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>

View 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>

View 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>

View 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>

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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")
}
}
})