From ff0f34a485af1d173bdca6df4042906f0665f6bc Mon Sep 17 00:00:00 2001 From: li Date: Mon, 19 Jan 2026 16:46:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E8=A7=86=E5=9B=BEUI=EF=BC=8C=E6=8F=90=E5=8F=96?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E6=A0=8F=EF=BC=8C=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=A0=87=E7=AD=BE=E9=A1=B5=E5=92=8C=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=88=97=E8=A1=A8=E6=A0=B7=E5=BC=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/SwitchTab2.vue | 98 +++-- src/components/SwitchTableButton.vue | 42 +++ src/components/TableList.vue | 180 +++++----- src/views/play.vue | 511 ++++++++++++++++----------- 4 files changed, 497 insertions(+), 334 deletions(-) create mode 100644 src/components/SwitchTableButton.vue diff --git a/src/components/SwitchTab2.vue b/src/components/SwitchTab2.vue index 53d4e333..d2fb5730 100644 --- a/src/components/SwitchTab2.vue +++ b/src/components/SwitchTab2.vue @@ -30,30 +30,25 @@ import { mapState } from "vuex" import GoodRoad from "@/components/GoodRoad.vue" import TableList from "@/components/TableList.vue" + export default { name: "SwitchTab", + components: { GoodRoad, TableList }, props: { - tabInfo: Object, - default: () => ({ - game_id: 1, - table_id: null - }) + tabInfo: { + type: Object, + default: () => ({ + game_id: 1, + table_id: null + }) + } }, + emits: ["showSwitchtab"], data() { return { active: 0 } }, - components: { GoodRoad, TableList }, - created() {}, - methods: { - chooseType(active) { - this.active = active - }, - close() { - this.$emit("showSwitchtab", false) - } - }, computed: { ...mapState({ Lang: (state) => state.config.$lang, @@ -63,69 +58,72 @@ export default { userInfo: (state) => state.app.userInfo }) }, - watch: {} + methods: { + chooseType(active) { + this.active = active + }, + close() { + this.$emit("showSwitchtab", false) + } + } } diff --git a/src/components/SwitchTableButton.vue b/src/components/SwitchTableButton.vue new file mode 100644 index 00000000..9d5de8eb --- /dev/null +++ b/src/components/SwitchTableButton.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/TableList.vue b/src/components/TableList.vue index 7ed9b421..e886f3a5 100644 --- a/src/components/TableList.vue +++ b/src/components/TableList.vue @@ -204,110 +204,126 @@ export default { diff --git a/src/views/play.vue b/src/views/play.vue index d0dc113a..82fa1b20 100644 --- a/src/views/play.vue +++ b/src/views/play.vue @@ -7,67 +7,16 @@ ]" > - -
+ + - -
- - - -
+
@@ -160,6 +48,127 @@ >
+ + +
+
+ +
+ + +
+ +
+ 发牌中 +
+ +
+ {{ circle.num }} +
+ +
+ 洗牌中 +
+
+ + + + +
+ +
+ + + + + +
+
+ + + +
@@ -203,7 +212,7 @@ import { ref, computed, watch, nextTick, onUnmounted } from "vue" import { useRouter, useRoute } from "vue-router" import { useStore } from "vuex" -import { Circle, showToast, showDialog, closeDialog, closeToast } from "vant" +import { showToast, showDialog, closeDialog, closeToast } from "vant" import PlayTable from "@/components/PlayTable/Index.vue" import PlayWay from "@/components/PlayWay.vue" import PlayChip from "@/components/PlayChip.vue" @@ -213,6 +222,7 @@ import ToningResult from "@/components/ToningResult" import DiceResult from "@/components/DiceResult" import RouletteResult from "@/components/RouletteResult" import SwitchTab from "@/components/SwitchTab2" +import SwitchTableButton from "@/components/SwitchTableButton" import setCamera from "@/components/setCamera" import PlayTypePop from "@/components/PlayTypePop" import TableInfoPop from "@/components/TableInfoPop" @@ -234,9 +244,9 @@ export default { PlayTable, PlayWay, PlayChip, - Circle, Poker, SwitchTab, + SwitchTableButton, setCamera, PlayTypePop, TableInfoPop, @@ -1231,95 +1241,80 @@ $gold: #c5a059; box-sizing: border-box; overflow: hidden; - /* Navigation Bar */ + + + /* Navigation Bar - Redesigned */ .nav { position: relative; z-index: 100; width: 100%; - height: 45px; + height: 36px; /* Slightly compact */ display: flex; align-items: center; justify-content: space-between; - background: $dark-bg-secondary; - border-bottom: 1px solid $border-color; + background: #000; /* Pure black as per ref */ + border-bottom: 1px solid #222; flex-shrink: 0; + padding: 0 10px; + box-sizing: border-box; - .left { - height: 0.923rem; - display: flex; - align-items: center; - gap: 0.3rem; - .back { - width: 0.923rem; - height: 0.923rem; - background: url("~@/assets/images/icon/back.png") center center no-repeat; - background-size: 60% auto; - margin-left: 0.6rem; - } - .switch-tab { - width: 0.923rem; - height: 0.923rem; - background: url("~@/assets/images/icon/switch_tab.png") center center no-repeat; - background-size: 60% auto; - } - .user { - font-size: 13px; - font-weight: 600; - line-height: 1; - margin-left: 10px; - .name { - color: #fff; - padding-left: 20px; - margin-top: 3px; - background: url("~@/assets/images/icon/user.png") left center no-repeat; - background-size: 14px; - } - .money { - color: $gold; - padding-left: 20px; - margin-top: 3px; - background: url("~@/assets/images/icon/money.png") left center no-repeat; - background-size: 14px; - } - } - } - .right { - margin-right: 0.7rem; - display: flex; - align-items: center; - .cutdown { - position: absolute; - left: 50%; - top: 0.15rem; - margin-left: 2rem; - ::v-deep .van-circle__text { - color: #fff; - } - } - .box { + .nav-item { display: flex; - .btn { - width: 0.923rem; - height: 0.7rem; - padding: 0.2rem 0.1rem; - margin-left: 0.677rem; - background-size: 1.2rem; - background-position: center center; - background-repeat: no-repeat; - &.camera { - background-image: url("~@/assets/images/icon/camera.png"); - &.off { - background-image: url("~@/assets/images/icon/camera_off.png"); - } - } - &.muise { - background-image: url("~@/assets/images/icon/musie.png"); - } - &.menu { - background-image: url("~@/assets/images/icon/meun.png"); - } + align-items: center; + height: 100%; + color: #fff; + font-size: 13px; + + .icon { + width: 16px; + height: 16px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + margin-right: 6px; + } + + &.user-info { + .user-icon { background-image: url("~@/assets/images/icon/user.png"); } + .text { font-weight: bold; } + } + + &.balance-info { + .money-icon { background-image: url("~@/assets/images/icon/money.png"); } + .text { color: $gold; font-family: monospace; font-size: 14px; } + } + + &.limit-info { + /* Use switch_tab icon as placeholder for limit arrows if specific icon invalid, + or styling css borders for arrows */ + .limit-icon { + width: 12px; height: 12px; + background-image: url("~@/assets/images/icon/switch_tab.png"); /* Placeholder */ + transform: rotate(90deg); /* Make it look like up/down sort */ + opacity: 0.7; + } + .text { color: #aaa; font-size: 12px; } + } + + &.right-controls { + display: flex; + gap: 15px; + + .btn { + width: 24px; + height: 24px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + + &.camera { + background-image: url("~@/assets/images/icon/camera.png"); + &.off { background-image: url("~@/assets/images/icon/camera_off.png"); } + } + &.muise { background-image: url("~@/assets/images/icon/musie.png"); } + &.menu { background-image: url("~@/assets/images/icon/meun.png"); } + } } - } } } @@ -1328,7 +1323,7 @@ $gold: #c5a059; display: flex; flex-direction: column; width: 100%; - height: calc(100% - 45px); /* Subtract nav height */ + height: 100%; /* Full height, Nav is now inside */ position: relative; overflow: hidden; @@ -1342,14 +1337,13 @@ $gold: #c5a059; .iframe { border: none; - /* Remove fixed width/height to allow JS dynamic sizing */ - /* width: 100%; */ - /* height: 100%; */ + width: 100%; + height: 100%; position: absolute; top: 0; left: 0; z-index: 1; - /* object-fit: cover; Remove object-fit as it might conflict with iframe content */ + object-fit: cover; /* This won't affect iframe content but is good for semantics if it were a video tag. */ } .game-area { @@ -1379,12 +1373,125 @@ $gold: #c5a059; border-top-left-radius: 0.3rem; &.camera { width: 40%; } } + + /* Separated Video Controls */ + .video-btn-back { + position: absolute; + top: 10px; + left: 10px; + z-index: 2005; /* Highest priority */ + width: 30px; + height: 30px; + background-image: url("~@/assets/images/icon/back.png"); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + } + + /* Overlay Camera Icon */ + .video-overlay-camera { + position: absolute; + top: 10px; + right: 60px; /* Switch is at 10px, so this is left of it */ + z-index: 2001; + width: 30px; + height: 30px; + background-size: contain; + background-repeat: no-repeat; + background-position: center; + background-image: url("~@/assets/images/icon/camera.png"); + + &.off { + background-image: url("~@/assets/images/icon/camera_off.png"); + } + } + + /* Status Overlay Styles */ + .status-overlay { + position: absolute; + top: 60px; /* Moved down to avoid row overlap, or move Left? Let's move LEFT of Camera */ + left: 50%; + transform: translateX(-50%); /* Removed translateZ to avoid potential clipping/context issues */ + z-index: 2005; /* Matches highest priority buttons */ + display: flex; + pointer-events: none; /* Allow clicks to pass through if needed, though buttons inside might need events. Actually, user might want to see it. It's display only. */ + align-items: center; + justify-content: center; + + .status-circle { + width: 50px; + height: 50px; + border-radius: 50%; + background: rgba(0,0,0,0.6); + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-weight: bold; + font-size: 16px; + border: 2px solid rgba(255, 255, 255, 0.2); + backdrop-filter: blur(4px); + + &.dealing { + background: rgba(46, 204, 113, 0.8); /* Green */ + border-color: #2ecc71; + font-size: 14px; + } + + &.countdown { + background: rgba(231, 76, 60, 0.8); /* Red/Orange for countdown */ + border-color: #e74c3c; + font-size: 24px; + } + + &.wait { + background: rgba(52, 152, 219, 0.8); + border-color: #3498db; + } + } + } + } + + /* 4. Game Table Area (New Flex Item) */ + .game-area-block { + width: 100%; + height: 200px; /* Fixed height for table area */ + flex-shrink: 0; + position: relative; + background: transparent; + z-index: 10; + overflow: hidden; + + /* Content wrapper that mimics old absolute positioning for internal components */ + .game-area-content { + width: 100%; + height: 100%; + position: relative; + + /* Ensure PlayTable fits inside this block */ + ::v-deep .playtable { + .view { + bottom: 0 !important; /* Anchor to bottom of this block */ + top: auto !important; + height: 100% !important; /* Fill the block */ + transform: none !important; /* Reset 3D transform for flat view if needed, or keep if 3D desired within this block */ + } + + /* Adjust portrait mode specifically if needed */ + @media screen and (orientation: portrait) { + .view { + height: 100% !important; + border-radius: 0 !important; + } + } + } + } } /* 2. Chip Control Bar (Middle) - Fixed Height */ .bet-chip-bar { width: 100%; - height: 70px; + height: 60px; flex-shrink: 0; position: relative; z-index: 20; @@ -1395,7 +1502,7 @@ $gold: #c5a059; /* 3. Roadmap Container (Bottom) - Auto Height for Aspect Ratio */ .roadmap-container { width: 100%; - height: 180px; + height: 160px; flex-shrink: 0; background: #fff; position: relative;