ScenePage.vue 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690
  1. <script setup lang='ts'>
  2. import browser from '@/utils/browser'
  3. import { useStore } from '@/stores';
  4. import baseResourceUrl from "@/utils/https";
  5. import axios from 'axios'
  6. import { Base64 } from "js-base64"
  7. import encodeStr from "@/utils/pass"
  8. // import { Toast } from 'vant';
  9. // 为 window 添加属性ts类型
  10. // gei window 增加函数,让子页面去触发
  11. declare global {
  12. interface Window {
  13. hotListShowChangeFu: (v: boolean) => void,
  14. handleRobot: (state: string) => void,
  15. handleTopRobot: (state: string) => void,
  16. handleShowFigure: (v: boolean) => void,
  17. openGameBoxFu: (v: boolean) => void,
  18. openPricePageFu: () => void,
  19. addScoreFu: (v: string) => void
  20. changeUnitByHot: (v: string, point: string) => void
  21. }
  22. }
  23. const baseAPIUrl = ref('')
  24. // const baseAPIUrl = ref('http://192.168.20.61:8063')
  25. // const baseAPIUrl = ref('https://sit-cnzhengquan.4dage.com')
  26. const route = useRoute()
  27. const router = useRouter()
  28. const store = useStore()
  29. const isShowHosList = ref(false)
  30. const currentUnit = ref({} as any)
  31. const currentHot = ref({} as any)
  32. const currentHotsUnit = ref({} as any)
  33. const isReady = ref(false)
  34. const pointInfo = ref('')
  35. const changeUnit = (unit: any) => {
  36. store.currentUnit = unit
  37. localStorage.setItem('currentUnit', JSON.stringify(unit))
  38. currentUnit.value = unit
  39. if (store.customThemeId) {
  40. changeThemeFu()
  41. } else {
  42. animalZhenShuNumber.value = currentUnit.value.xuliezhen[animalStat.value].zhenShu
  43. duration.value = currentUnit.value.xuliezhen[animalStat.value].duration
  44. }
  45. // if (currentUnit.value.unit == '尾厅') {
  46. // pointInfo.value = '&firstView=pano:42,qua:0.009218044457158925,0.8470543054294898,-0.01469850441003682,0.5312231071060547&qs=1'
  47. // }
  48. clostHotListFu()
  49. isShowExperienceGame.value = true
  50. }
  51. const hotspots = ref([] as any)
  52. // 用Object.keys 和 reduce 方法过滤空值属性
  53. const filterEmptyProps = (obj: any) => {
  54. return Object.keys(obj).reduce((acc, key) => {
  55. if (obj[key].title !== '' && obj[key].title !== ' ') {
  56. // @ts-ignore
  57. acc[key] = obj[key];
  58. }
  59. return acc;
  60. }, {});
  61. }
  62. const sortHotspots = (hotspots: any) => {
  63. // 将数据对象转换成数组
  64. let newHotspots = Object.values(hotspots)
  65. let newShowHotspots = [] as any
  66. newHotspots.forEach((item: any) => {
  67. const nameArr = item.title.split('&')
  68. if (nameArr[1] == 'show') {
  69. newShowHotspots.push({
  70. ...item,
  71. title: nameArr[2],
  72. sort: nameArr[0]
  73. })
  74. }
  75. })
  76. return newShowHotspots.sort((a: any, b: any) => {
  77. return Number(a.sort) - Number(b.sort)
  78. })
  79. }
  80. // 获取所有单元的热点列表
  81. const getAllHotspot = () => {
  82. store.dataAll.sceneList.forEach((item: any) => {
  83. // https://super.4dage.com
  84. axios.get(`https://super.4dage.com/data/${item.code}/data2.js?m=${new Date().getTime()}`).then((res: any) => {
  85. console.log(sortHotspots)
  86. //@ts-ignore
  87. hotspots.value.push({
  88. id: item.id,
  89. unit: item.name,
  90. hots: sortHotspots(filterEmptyProps(res.data.hots)),
  91. code: item.code,
  92. xuliezhen: item.xuliezhen,
  93. gameId: item.gameId,
  94. backPoint: item.backPoint,
  95. sort: item.sort,
  96. })
  97. if (item.code == route.query.code) {
  98. currentUnit.value = {
  99. id: item.id,
  100. unit: route.query.name == '尾厅' ? '尾厅' : item.name,
  101. hots: sortHotspots(filterEmptyProps(res.data.hots)),
  102. code: item.code,
  103. xuliezhen: item.xuliezhen,
  104. gameId: item.gameId,
  105. backPoint: item.backPoint
  106. }
  107. currentHotsUnit.value = currentUnit.value
  108. store.currentUnit = currentUnit.value
  109. localStorage.setItem('currentUnit', JSON.stringify(currentUnit.value))
  110. if (route.query.name == '尾厅') {
  111. pointInfo.value = route.query.pano ? route.query.pano.toString() : '&firstView=pano:42,qua:0.009218044457158925,0.8470543054294898,-0.01469850441003682,0.5312231071060547&qs=1'
  112. }
  113. }
  114. })
  115. })
  116. setTimeout(() => {
  117. // let newList = []
  118. // 场景排序
  119. hotspots.value.sort((a: any, b: any) => {
  120. return Number(a.sort) - Number(b.sort)
  121. })
  122. }, 500)
  123. }
  124. watch(hotspots.value, (newVal: any) => {
  125. if (newVal.length == store.dataAll.sceneList.length) {
  126. store.hotspots = hotspots.value
  127. currentUnit.value = hotspots.value.filter((item: any) => {
  128. return item.code == route.query.code
  129. })[0]
  130. if (store.customThemeId) {
  131. changeThemeFu()
  132. } else {
  133. animalZhenShuNumber.value = currentUnit.value.xuliezhen[animalStat.value].zhenShu
  134. duration.value = currentUnit.value.xuliezhen[animalStat.value].duration
  135. }
  136. }
  137. }, { immediate: true })
  138. watch(isShowHosList, (newVal: any) => {
  139. if (newVal && browser.mobile) {
  140. isShowFigure.value = false
  141. }
  142. })
  143. const goHotCamarer = (hot: any) => {
  144. currentUnit.value = currentHotsUnit.value
  145. store.currentUnit = currentHotsUnit.value
  146. localStorage.setItem('currentUnit', JSON.stringify(currentHotsUnit.value))
  147. pointInfo.value = ''
  148. // isShowExperienceGame.value = true
  149. isShowHosList.value = false
  150. setTimeout(() => {
  151. const iframe = document.getElementById('sceneiframe') as HTMLIFrameElement
  152. //@ts-ignore
  153. iframe.contentWindow.initCamera(hot.sid)
  154. currentHot.value = hot
  155. console.log(currentHot.value)
  156. //@ts-ignore
  157. iframe.contentWindow.closeHotListIcon()
  158. isShowFigure.value = true
  159. }, 1000)
  160. }
  161. const clostHotListFu = () => {
  162. isShowHosList.value = false
  163. const iframe = document.getElementById('sceneiframe') as HTMLIFrameElement
  164. //@ts-ignore
  165. iframe.contentWindow.closeHotListIcon()
  166. }
  167. // 形象状态 greeting-招呼 idle-静默 talk-说话
  168. const animalStat = ref('greeting')
  169. const animalZhenShuNumber = ref(48 as number)
  170. const animalZhenShu = computed(() => {
  171. return `steps(${animalZhenShuNumber.value})`
  172. })
  173. const translateXNumber = computed(() => {
  174. return browser.mobile ? `${-100 * animalZhenShuNumber.value}px` : `${-200 * animalZhenShuNumber.value}px`
  175. })
  176. // const translateXNumberChange = computed(() => {
  177. // return `${-200 * animalZhenShuNumber.value}px`
  178. // })
  179. const duration = ref(`3s`)
  180. const xingxiangListShow = ref(false)
  181. const isShowFigure = ref(true)
  182. const isShowGameList = ref(false)
  183. const isShowExperienceGame = ref(false)
  184. const isLogin = ref(false)
  185. // 检查token是否生效
  186. const checkLoginStatus = async () => {
  187. const lastToken = localStorage.getItem('token')
  188. const lastUserInfoStr = localStorage.getItem('useInfo')
  189. if (lastToken && lastUserInfoStr) {
  190. const res = await axios({
  191. method: 'get',
  192. url: `${baseAPIUrl.value}/api/show/checkLogin`,
  193. headers: {
  194. token: lastToken
  195. }
  196. })
  197. if (res?.data?.code === 0 && res?.data?.data) {
  198. store.token = lastToken
  199. store.userInfo = JSON.parse(lastUserInfoStr)
  200. // 请求积分
  201. axios({
  202. method: 'get',
  203. url: `${baseAPIUrl.value}/api/cms/game/getPoint`,
  204. headers: {
  205. token: store.token
  206. }
  207. }).then((res: any) => {
  208. userScore.value = res.data.data.total
  209. isLogin.value = true
  210. })
  211. } else {
  212. store.token = ""
  213. store.userInfo = {}
  214. localStorage.removeItem('token')
  215. localStorage.removeItem('userInfo')
  216. }
  217. }
  218. }
  219. const Toast = (text: string, type?: string) => {
  220. let toastDom: HTMLElement = document.createElement('div')
  221. toastDom.innerText = text
  222. toastDom.style.padding = '5px 15px'
  223. toastDom.style.display = 'flex'
  224. toastDom.style.justifyItems = 'center'
  225. toastDom.style.alignItems = 'center'
  226. toastDom.style.position = 'fixed'
  227. toastDom.style.left = '50%'
  228. toastDom.style.top = '5%'
  229. toastDom.style.transform = 'translateX(-50%)'
  230. toastDom.style.background = '#fff'
  231. toastDom.style.zIndex = '99'
  232. toastDom.style.borderRadius = '50px'
  233. toastDom.style.boxShadow = '0px 4px 16px 0px rgba(0, 0, 0, 0.5)'
  234. toastDom.style.fontSize = '15px'
  235. toastDom.style.color = type == 'error' ? 'red' : 'black'
  236. document.body.appendChild(toastDom);
  237. setTimeout(() => {
  238. document.body.removeChild(toastDom);
  239. }, 2000)
  240. }
  241. // 内嵌小游戏界面打开
  242. const openGame = (index: any) => {
  243. router.push({
  244. path: '/game',
  245. query: {
  246. code: index
  247. }
  248. })
  249. }
  250. const isShowLogon = ref(false)
  251. // 点击登录
  252. const goLogin = () => {
  253. // 跳转到手机端登录界面
  254. // router.push({
  255. // path: '/homePageMo',
  256. // })
  257. isShowLogon.value = true
  258. }
  259. const isShowUserBox = ref(false)
  260. const goDetail = () => {
  261. !isLogin.value ? goLogin() : isShowUserBox.value = !isShowUserBox.value
  262. }
  263. const userScore = ref(0)
  264. const logout = () => {
  265. axios({
  266. method: 'get',
  267. url: `${baseAPIUrl.value}/api/cms/game/logout`,
  268. headers: {
  269. token: store.token
  270. }
  271. }).then(() => {
  272. store.token = ""
  273. store.userInfo = {}
  274. localStorage.removeItem('token')
  275. localStorage.removeItem('userInfo')
  276. isLogin.value = false
  277. })
  278. }
  279. const oldPass = ref('')
  280. const newPass = ref('')
  281. const affirmPass = ref('')
  282. const isPassChange = ref(false)
  283. const changePassword = () => {
  284. if (oldPass.value == '' || newPass.value == '' || affirmPass.value == '') {
  285. Toast('密码不能为空', 'error');
  286. } else if (!/^[a-zA-Z0-9]{6,12}$/.test(oldPass.value) || !/^[a-zA-Z0-9]{6,12}$/.test(newPass.value) || !/^[a-zA-Z0-9]{6,12}$/.test(affirmPass.value)) {
  287. Toast('密码格式不正确', 'error')
  288. } else if (newPass.value != affirmPass.value) {
  289. Toast('两次密码不一致', 'error')
  290. } else {
  291. console.log(oldPass.value, newPass.value, affirmPass.value)
  292. const pwdNewEncrypted = encodeStr(Base64.encode(newPass.value))
  293. const pwdOldEncrypted = encodeStr(Base64.encode(oldPass.value))
  294. axios({
  295. method: 'post',
  296. url: `${baseAPIUrl.value}/api/cms/game/update/pass`,
  297. headers: {
  298. token: store.token
  299. },
  300. data: {
  301. newPassword: pwdNewEncrypted,
  302. oldPassword: pwdOldEncrypted
  303. }
  304. }).then((res: any) => {
  305. if (res.data.code == 0) {
  306. Toast('修改成功,请重新进行登录')
  307. // Toast)
  308. logout()
  309. isLogin.value = false
  310. isPassChange.value = false
  311. } else {
  312. Toast(res.data.msg, 'error')
  313. }
  314. })
  315. }
  316. }
  317. const goBack = () => {
  318. if (currentUnit.value.backPoint != '') {
  319. // pointInfo.value = currentUnit.value.backPoint
  320. window.changeUnitByHot('SHANGJJ', currentUnit.value.backPoint)
  321. }
  322. }
  323. // 切换主题
  324. const changeThemeFu = () => {
  325. const newTheme = store.dataAll.sceneList.find((item: any) => {
  326. return item.id == store.customThemeId
  327. })
  328. if (newTheme) {
  329. animalZhenShuNumber.value = newTheme.xuliezhen[animalStat.value].zhenShu
  330. duration.value = newTheme.xuliezhen[animalStat.value].duration
  331. }
  332. }
  333. const changeXuLeiReady = ref(true)
  334. // 当自主变换主题时候,帧数也对应发生改变
  335. watch(() => store.customThemeId, () => {
  336. console.log('主题发生改变')
  337. isReady.value = false
  338. changeXuLeiReady.value = false
  339. const newTheme = store.dataAll.sceneList.find((item: any) => {
  340. return item.id == store.customThemeId
  341. })
  342. if (newTheme) {
  343. animalZhenShuNumber.value = newTheme.xuliezhen[animalStat.value].zhenShu
  344. duration.value = newTheme.xuliezhen[animalStat.value].duration
  345. }
  346. // alert(animalZhenShuNumber.value)
  347. // alert(duration.value)
  348. setTimeout(() => {
  349. isReady.value = true
  350. changeXuLeiReady.value = true
  351. }, 200)
  352. })
  353. // 首次进入且没有登录
  354. const isFirstEnterScene = ref(false)
  355. const changeFirstEnterScene = () => {
  356. isFirstEnterScene.value = false
  357. localStorage.setItem('isFirstEnterScene', 'false')
  358. }
  359. onMounted(() => {
  360. getAllHotspot()
  361. // 首次打开场景且没有登录打开弹窗
  362. if (localStorage.getItem('isFirstEnterScene') === 'true' && !localStorage.getItem('token') && !localStorage.getItem('userInfo')) {
  363. setTimeout(() => {
  364. isFirstEnterScene.value = true
  365. }, 1000)
  366. }
  367. setTimeout(() => {
  368. store.isShowGameThumb ? isShowExperienceGame.value = true : store.isShowGameThumb = true
  369. }, 500)
  370. // store.hotspots.length == 0 ? getAllHotspot() : hotspots.value = store.hotspots, currentUnit.value = hotspots.value[0]
  371. window.hotListShowChangeFu = () => {
  372. isShowHosList.value = !isShowHosList.value
  373. }
  374. // 机器人状态改变
  375. // greeting-招呼 idle-静默 talk-说话
  376. window.handleRobot = (state: string) => {
  377. animalStat.value = state
  378. if (store.customThemeId) {
  379. // 如果有切换过,序列帧换成所选主题
  380. changeThemeFu()
  381. } else {
  382. animalZhenShuNumber.value = currentUnit.value.xuliezhen[animalStat.value].zhenShu
  383. duration.value = currentUnit.value.xuliezhen[animalStat.value].duration
  384. }
  385. setTimeout(() => {
  386. isReady.value = true
  387. }, 500)
  388. }
  389. // 机器人在上面 top:上 bottom:下
  390. // @ts-ignore
  391. window.handleTopRobot = (state: string) => {
  392. const xuliezhenDom = document.getElementById('xuliezhenid')
  393. state == 'top' ? !browser.mobile ? xuliezhenDom!.style.bottom = '120px' : xuliezhenDom!.style.bottom = '120px' : !browser.mobile ? xuliezhenDom!.style.bottom = '0px' : xuliezhenDom!.style.bottom = '10px'
  394. }
  395. // 机器人隐藏与显示(热点打开时隐藏)
  396. window.handleShowFigure = (state: boolean) => {
  397. isShowFigure.value = state
  398. if (state) {
  399. axios({
  400. method: 'get',
  401. url: `${baseAPIUrl.value}/api/cms/game/getPoint`,
  402. headers: {
  403. token: store.token
  404. }
  405. }).then((res: any) => {
  406. userScore.value = res.data.data.total
  407. })
  408. }
  409. }
  410. // 打开游戏界面弹窗
  411. window.openGameBoxFu = () => {
  412. !browser.mobile ? isShowGameList.value = true : router.push({
  413. path: 'homePageMo',
  414. query: {
  415. src: '/game/index.html#/?no-redirect=1'
  416. }
  417. })
  418. }
  419. // 跳转到游戏兑换页面
  420. window.openPricePageFu = () => {
  421. // 未登录状态
  422. if (!isLogin.value) {
  423. router.push({
  424. path: 'homePageMo',
  425. query: {
  426. src: '/game/index.html#/shop-for-visitor'
  427. }
  428. })
  429. } else {
  430. // 登录状态
  431. router.push({
  432. path: 'homePageMo',
  433. query: {
  434. src: '/game/index.html#/shop-view?no-redirect=1'
  435. }
  436. })
  437. }
  438. }
  439. checkLoginStatus()
  440. // 监听是否登录
  441. window.addEventListener('storage', () => {
  442. const token = localStorage.getItem('token')
  443. const userInfo = localStorage.getItem('userInfo')
  444. if (token && userInfo) {
  445. store.token = token
  446. store.userInfo = JSON.parse(userInfo)
  447. isShowLogon.value = false
  448. // 请求积分
  449. axios({
  450. method: 'get',
  451. url: `${baseAPIUrl.value}/api/cms/game/getPoint`,
  452. headers: {
  453. token: store.token
  454. }
  455. }).then((res: any) => {
  456. userScore.value = res.data.data.total
  457. isLogin.value = true
  458. })
  459. }
  460. })
  461. // 查看视频记录积分
  462. window.addScoreFu = (v: string) => {
  463. // 获取游戏规则
  464. axios({
  465. method: 'get',
  466. url: `${baseAPIUrl.value}/api/show/rule/getList?type=online`,
  467. headers: {
  468. token: store.token
  469. }
  470. }).then((res: any) => {
  471. const score = res.data.data.find((item: any) => { return item.name == v }).score
  472. axios({
  473. method: 'post',
  474. url: `${baseAPIUrl.value}/api/cms/game/point/add`,
  475. headers: {
  476. token: store.token
  477. },
  478. data: {
  479. description: "",
  480. score: encodeStr(Base64.encode(score)),
  481. type: v,
  482. userId: store.userInfo.id
  483. }
  484. }).then(() => {
  485. // alert('观看完成')
  486. })
  487. })
  488. }
  489. // 热点跳转展厅/游戏
  490. window.changeUnitByHot = (v: string, point: string) => {
  491. console.log(v, point)
  492. if (v === 'game') {
  493. openGame(parseInt(point) - 1)
  494. } else if (v === 'zhaopianqiang') {
  495. router.replace('wall')
  496. } else {
  497. const unit = store.hotspots.find((item: any) => {
  498. return item.code == v
  499. })
  500. if (unit) {
  501. changeUnit(unit)
  502. pointInfo.value = point
  503. }
  504. }
  505. }
  506. })
  507. const changePassFu = () => {
  508. if (!browser.mobile) {
  509. isPassChange.value = true; oldPass.value = ''; newPass.value = ''; affirmPass.value = ''
  510. } else {
  511. router.push({
  512. path: '/homePageMo',
  513. query: {
  514. src: '/game/index.html#/change-password?no-redirect=1'
  515. }
  516. })
  517. }
  518. }
  519. </script>
  520. <template>
  521. <div class='all'>
  522. <!-- 返回按钮 -->
  523. <img class="backBtn" v-show="isShowFigure && currentUnit.code != 'SHANGJJ' && currentUnit.code != 'FFF'"
  524. src="@/assets/images/scene/back.png" alt="" @click="goBack()">
  525. <!-- 首次进入场景且未登录时,显示弹窗 -->
  526. <div class="first-box" v-show="isFirstEnterScene">
  527. <div class="box-content">
  528. <div class="text">完成<bottom @click="() => {
  529. router.push({
  530. path: 'homePageMo',
  531. query: {
  532. src: '/game/index.html#/sign-up'
  533. }
  534. })
  535. changeFirstEnterScene()
  536. }">注册</bottom>或<bottom @click="() => { goLogin(); changeFirstEnterScene() }">登陆</bottom>
  537. 后,体验互动游戏,可以获得积分。<br v-show="browser.mobile" />积分可以在
  538. <bottom @click="() => {
  539. router.push({
  540. path: 'homePageMo',
  541. query: {
  542. src: '/game/index.html#/shop-for-visitor'
  543. }
  544. })
  545. changeFirstEnterScene()
  546. }">商城</bottom>中兑换奖品。
  547. </div>
  548. <div class="i-know" @click="changeFirstEnterScene()">我知道了</div>
  549. </div>
  550. </div>
  551. <!-- 回到主页按钮 -->
  552. <div class="backHome" v-show="isShowFigure" @click="() => { router.replace('/home') }">
  553. <img src="@/assets/images/scene/backHome.png" alt="">
  554. </div>
  555. <iframe v-if="currentUnit && currentUnit.code" id="sceneiframe"
  556. :src="`/scene/index.html?m=${currentUnit.code}${currentUnit.unit == '尾厅' ? '&firstView=pano:42,qua:0.009218044457158925,0.8470543054294898,-0.01469850441003682,0.5312231071060547&qs=1' : pointInfo}`"></iframe>
  557. <!-- <iframe id="sceneiframe"
  558. :src="`/web/index.html#/scene?code=KJ-mTSkFdm273x`"></iframe> -->
  559. <!-- 本地 -->
  560. <!-- <iframe id="sceneiframe" :src="`./scene/index.html?m=${currentUnit.code}`"></iframe> -->
  561. <!-- 热点列表 -->
  562. <div v-show="isShowHosList" class="hots-box">
  563. <img v-show="browser.mobile" @click="() => { clostHotListFu(); isShowFigure = true }" class="close-icon"
  564. src="@/assets/images/close-icon-red.png" alt="">
  565. <!-- <div v-show="browser.mobile" class="show-title">行业公益力量展</div> -->
  566. <div class="hots-box-left">
  567. <div class="left-item" :style="{ background: currentHotsUnit.unit == item.unit ? '#66141885' : '' }"
  568. v-for="(item, index) in store.hotspots" :key="index" @click="() => { currentHotsUnit = item }">{{
  569. item.unit
  570. }}</div>
  571. </div>
  572. <div class="hots-box-right">
  573. <img v-show="!browser.mobile" @click="clostHotListFu()" class="close-icon" src="@/assets/images/close-icon.png"
  574. alt="">
  575. <div class="right-content">
  576. <div v-show="JSON.stringify(currentUnit.hots) == '{}'" class="right-item">暂无热点</div>
  577. <div class="right-item" :title="item.title" v-for="(item, index) in currentHotsUnit.hots" :key="index"
  578. @click="goHotCamarer(item)" :style="{ color: currentHot.sid == item.sid ? '#C5A16C' : '' }">
  579. <div :class="!browser.mobile ? item.title.length > 8 ? 'gundong' : '' : 'mobileMo'">{{ item.title }}</div>
  580. </div>
  581. </div>
  582. </div>
  583. </div>
  584. <div id="xuliezhenid" class="xingxiangBox" v-show="isShowFigure">
  585. <!-- 形象人 -->
  586. <!-- 招呼状态 -->
  587. <div class="xuliezhen-greeting" v-show="isReady && animalStat == 'greeting'" @click="xingxiangListShow = true"
  588. :style="{ backgroundImage: `url(${baseResourceUrl}/animation/${store.customThemeId != null ? store.customThemeId : currentUnit.id}/greeting.png)`, backgroundSize: 'cover' }">
  589. </div>
  590. <div class="xuliezhen-talk" v-show="isReady && animalStat == 'talk'" @click="xingxiangListShow = true"
  591. :style="{ backgroundImage: `url(${baseResourceUrl}/animation/${store.customThemeId != null ? store.customThemeId : currentUnit.id}/talk.png)`, backgroundSize: 'cover' }">
  592. </div>
  593. <!-- 积分牌 -->
  594. <div class="score-box" v-if="isReady" @click="goDetail()">
  595. <img class="headImg" src="@/assets/images/scene/userHead.png" alt="">
  596. <!-- 已登录状态 -->
  597. <div>
  598. <div class="title" :style="{ marginTop: !isLogin ? '5px' : '' }">{{
  599. isLogin ? '积分' : "未登录" }}</div>
  600. <div class="scroll-wrap" v-show="isLogin">
  601. <div class="scroll-item" :title="String(userScore)">
  602. {{ userScore }}
  603. </div>
  604. </div>
  605. </div>
  606. <!-- 退出登录 -->
  607. <div class="user-box" v-if="isShowUserBox">
  608. <div @click="logout()">退出登录</div>
  609. <div @click="changePassFu()">修改密码</div>
  610. <div @click="() => {
  611. router.push({
  612. path: 'homePageMo',
  613. query: {
  614. src: '/game/index.html#/shop-view?no-redirect=1'
  615. }
  616. })
  617. }">奖品兑换</div>
  618. </div>
  619. </div>
  620. <!-- 形象切换listBox -->
  621. <div class="xulielistBox" v-show="xingxiangListShow && !browser.mobile">
  622. <img @click="xingxiangListShow = false" class="close-icon" src="@/assets/images/close-icon.png" alt="">
  623. <div class="item" v-for="(item, index) in store.dataAll.themeList" :key="index"
  624. @click="() => { store.customThemeId = item.id; xingxiangListShow = false }">{{
  625. item.unit }}
  626. </div>
  627. </div>
  628. <div class="xulielistBox" v-show="xingxiangListShow && browser.mobile">
  629. <div class="content-box">
  630. <img @click="xingxiangListShow = false" class="close-icon" src="@/assets/images/close-icon.png" alt="">
  631. <div class="item" v-for="(item, index) in store.dataAll.themeList" :key="index"
  632. @click="() => { store.customThemeId = item.id }">{{
  633. item.unit }}
  634. </div>
  635. </div>
  636. <!-- 形象切换序列帧 -->
  637. <div class="xuliezhen-greeting changing" v-show="changeXuLeiReady"
  638. :style="{ backgroundImage: `url(${baseResourceUrl}/animation/${store.customThemeId != null ? store.customThemeId : currentUnit.id}/greeting.png)`, backgroundSize: 'cover' }">
  639. </div>
  640. <div></div>
  641. </div>
  642. </div>
  643. <!-- 游戏列表弹窗 -->
  644. <div class="game-list-box" v-show="isShowGameList && !browser.mobile">
  645. <div class="game-list">
  646. <div class="game-list-item" v-for="(item, index) in store.dataAll.gameList" :key="index" @click="openGame(index)">
  647. <img :src="`${baseResourceUrl}/game/${browser.mobile ? 'mobile/' : 'pc/'}${item.id}.png`" alt="">
  648. <div v-show="!browser.mobile">{{ item.name }}</div>
  649. </div>
  650. </div>
  651. <img src="@/assets/images/close-icon.png" class="close-icon" @click="isShowGameList = false" alt="">
  652. </div>
  653. <!-- 游戏体验弹窗 -->
  654. <!-- <div class="game-list-box" v-if="isShowExperienceGame && currentUnit.gameId !== null">
  655. <img class="game-ex-themb"
  656. :src="`${baseResourceUrl}/game/${browser.mobile ? 'mobile/' : 'pc/'}${!browser.mobile ? currentUnit.gameId : currentUnit.gameId + 'g'}.png`"
  657. alt="">
  658. <div class="btn" @click="openGame(currentUnit.gameId - 1)">
  659. <div>立即体验</div>
  660. </div>
  661. <img src="@/assets/images/close-icon.png" class="close-icon" @click="isShowExperienceGame = false" alt="">
  662. </div> -->
  663. <!-- 登录iframe -->
  664. <div v-if="isShowLogon" class="game-page">
  665. <iframe :src="`/game/index.html#/login-view?no-redirect=1`" frameborder="0"></iframe>
  666. </div>
  667. <!-- 修改密码弹窗 -->
  668. <div class="passChangeBox" v-if="isPassChange">
  669. <div class="conttent">
  670. <div><span style="margin-right: 20px;">旧密码:</span><input v-model="oldPass" type="password"
  671. placeholder="请输入6-10个数字或字母">
  672. </div>
  673. <div><span style="margin-right: 20px;">新密码:</span><input v-model="newPass" type="password"
  674. placeholder="请输入6-10个数字或字母">
  675. </div>
  676. <div><span style="margin-right: 5px;">确认密码:</span><input v-model="affirmPass" type="password"
  677. placeholder="请输入6-10个数字或字母">
  678. </div>
  679. <div class="btns">
  680. <div @click="changePassword">修改密码</div>
  681. <div @click="isPassChange = false">返回</div>
  682. </div>
  683. </div>
  684. </div>
  685. </div>
  686. </template>
  687. <style lang='less' scoped>
  688. .all {
  689. width: 100%;
  690. height: 100%;
  691. overflow: hidden;
  692. .game-page {
  693. width: 100%;
  694. height: 100%;
  695. display: flex;
  696. justify-content: center;
  697. position: absolute;
  698. top: 0;
  699. left: 0;
  700. background: white;
  701. iframe {
  702. width: 100%;
  703. height: 100%;
  704. @media screen and (max-width: 700px),
  705. (orientation: portrait) {
  706. width: 100%;
  707. // height: 100%;
  708. }
  709. }
  710. }
  711. .passChangeBox {
  712. width: 100%;
  713. height: 100%;
  714. background: rgba(0, 0, 0, 0.404);
  715. position: absolute;
  716. top: 0;
  717. left: 0;
  718. display: flex;
  719. justify-content: center;
  720. align-items: center;
  721. .conttent {
  722. width: 30%;
  723. height: 40%;
  724. background: rgba(255, 0, 0, 0.562);
  725. border-radius: 15px;
  726. display: flex;
  727. flex-direction: column;
  728. justify-content: center;
  729. align-items: center;
  730. color: white;
  731. div {
  732. height: 15%;
  733. width: 80%;
  734. font-size: 16px;
  735. font-size: 18px;
  736. input {
  737. border: none;
  738. background: none;
  739. border-bottom: 1px solid #C5A16C;
  740. width: 70%;
  741. height: 50%;
  742. outline: none;
  743. font-size: 16px;
  744. color: white;
  745. }
  746. input::placeholder {
  747. color: rgba(255, 255, 255, .7) !important;
  748. }
  749. input:focus {
  750. outline: none;
  751. }
  752. }
  753. .btns {
  754. width: 80%;
  755. display: flex;
  756. flex-direction: row;
  757. justify-content: space-between;
  758. div {
  759. max-width: 30%;
  760. height: 30px;
  761. text-align: center;
  762. line-height: 30px;
  763. padding: 5px 20px;
  764. border-radius: 50px;
  765. background: rgba(255, 255, 255, 0.555);
  766. cursor: pointer;
  767. margin-top: 20px;
  768. }
  769. div:hover {
  770. color: #C5A16C;
  771. }
  772. }
  773. }
  774. }
  775. .backBtn {
  776. position: absolute;
  777. top: 3%;
  778. left: 2%;
  779. cursor: pointer;
  780. }
  781. .first-box {
  782. width: 100%;
  783. height: 100%;
  784. position: fixed;
  785. z-index: 99;
  786. display: flex;
  787. justify-content: center;
  788. align-items: center;
  789. .box-content {
  790. padding: 30px;
  791. background: rgba(0, 0, 0, 0.5);
  792. border-radius: 10px;
  793. color: white;
  794. line-height: 35px;
  795. display: flex;
  796. flex-direction: column;
  797. justify-content: center;
  798. align-items: center;
  799. .text {
  800. display: -webkit-inline-box;
  801. // align-items: center;
  802. bottom {
  803. padding: 5px 20px;
  804. font-size: 14px;
  805. border: white solid 1px;
  806. border-radius: 10px;
  807. height: 30px;
  808. cursor: pointer;
  809. height: 20px;
  810. margin: 0 5px;
  811. }
  812. }
  813. .i-know {
  814. width: 200px;
  815. color: black;
  816. background: white;
  817. border-radius: 10px;
  818. border: 1px solid rgba(0, 0, 0, 0.5);
  819. cursor: pointer;
  820. display: flex;
  821. justify-content: center;
  822. margin-top: 20px;
  823. }
  824. }
  825. }
  826. .backHome {
  827. width: 40px;
  828. height: 40px;
  829. position: absolute;
  830. top: 3%;
  831. right: 2%;
  832. cursor: pointer;
  833. padding: 10px;
  834. background: rgba(255, 255, 255, 0.418);
  835. border-radius: 50px;
  836. box-sizing: border-box;
  837. img {
  838. width: 100%;
  839. }
  840. }
  841. iframe {
  842. width: 100%;
  843. height: 100%;
  844. }
  845. .hots-box {
  846. width: 25vw;
  847. height: 70vh;
  848. // background: red;
  849. position: absolute;
  850. bottom: 10%;
  851. left: 1%;
  852. display: flex;
  853. overflow: hidden;
  854. // justify-content: left;
  855. .close-icon {
  856. width: 30px;
  857. height: 30px;
  858. position: absolute;
  859. right: 10px;
  860. top: 10px;
  861. cursor: pointer;
  862. z-index: 2;
  863. }
  864. &-left {
  865. width: 30%;
  866. height: 100%;
  867. overflow: auto;
  868. background: #bc121b75;
  869. backdrop-filter: blur(10px);
  870. border-radius: 15px 0 0 0;
  871. @media screen and (max-width:700),
  872. (orientation: portrait) {
  873. border-radius: 0 0 0 0;
  874. }
  875. &::-webkit-scrollbar {
  876. display: none;
  877. }
  878. .left-item {
  879. width: 100%;
  880. height: 9vh;
  881. display: flex;
  882. justify-content: center;
  883. align-items: center;
  884. font-size: 14px;
  885. color: #ffffff;
  886. font-family: 'AlibabaPuHuiTi2.0-105Heavy';
  887. text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.6);
  888. cursor: pointer;
  889. &:hover {
  890. background: #66141885;
  891. }
  892. }
  893. .left-item:first-child {
  894. border-radius: 15px 0 0 0;
  895. @media screen and (max-width:700),
  896. (orientation: portrait) {
  897. border-radius: 0 0 0 0;
  898. }
  899. }
  900. }
  901. &-right {
  902. width: 70%;
  903. height: 100%;
  904. overflow: auto;
  905. // padding: 20px 0 0;
  906. background: rgb(0, 0, 0);
  907. backdrop-filter: blur(10px);
  908. color: #ffffff;
  909. font-family: 'AlibabaPuHuiTi2.0-105Heavy';
  910. box-sizing: border-box;
  911. display: flex;
  912. flex-direction: column;
  913. align-items: center;
  914. justify-content: end;
  915. position: relative;
  916. padding: 0 10px;
  917. // .close-icon {
  918. // width: 30px;
  919. // height: 30px;
  920. // position: absolute;
  921. // right: 10px;
  922. // top: 10px;
  923. // cursor: pointer;
  924. // }
  925. .right-content {
  926. width: 100%;
  927. height: 95%;
  928. // background: red;
  929. overflow: auto;
  930. &::-webkit-scrollbar {
  931. display: none;
  932. }
  933. }
  934. .right-item {
  935. width: 100%;
  936. height: 5vh;
  937. display: flex;
  938. justify-content: left;
  939. align-items: center;
  940. white-space: nowrap;
  941. overflow: hidden;
  942. text-overflow: ellipsis;
  943. cursor: pointer;
  944. .gundong {
  945. width: 100%;
  946. animation: identifier 8s linear infinite;
  947. }
  948. @keyframes identifier {
  949. 30% {
  950. transform: translateX(0%);
  951. }
  952. 100% {
  953. transform: translateX(-100%);
  954. }
  955. }
  956. &:hover {
  957. color: #C5A16C;
  958. background: rgba(114, 37, 37, 0.74);
  959. }
  960. }
  961. }
  962. }
  963. .xingxiangBox {
  964. position: absolute;
  965. right: 1%;
  966. bottom: 0;
  967. transition-property: bottom;
  968. transition-duration: .5s;
  969. .xuliezhen-greeting {
  970. position: absolute;
  971. right: 0;
  972. bottom: 150px;
  973. width: 200px;
  974. height: 200px;
  975. background-position-x: 0;
  976. background-repeat: no-repeat;
  977. // animation-name: xuliezhen-animation;
  978. animation-name: xuliezhen-animation;
  979. animation-timing-function: v-bind('animalZhenShu');
  980. animation-duration: v-bind('duration');
  981. animation-iteration-count: infinite;
  982. transition-property: bottom;
  983. cursor: pointer;
  984. }
  985. @keyframes xuliezhen-animation {
  986. 50% {
  987. background-position-x: 0;
  988. }
  989. 100% {
  990. background-position-x: v-bind('translateXNumber');
  991. }
  992. }
  993. .xuliezhen-talk {
  994. position: absolute;
  995. right: 0;
  996. bottom: 150px;
  997. width: 200px;
  998. height: 200px;
  999. background-position-x: 0;
  1000. background-repeat: no-repeat;
  1001. // animation-name: xuliezhen-animation;
  1002. animation-name: xuliezhen-talk;
  1003. animation-timing-function: v-bind('animalZhenShu');
  1004. animation-duration: v-bind('duration');
  1005. animation-iteration-count: infinite;
  1006. transition-property: bottom;
  1007. cursor: pointer;
  1008. }
  1009. @keyframes xuliezhen-talk {
  1010. 0% {
  1011. background-position-x: 0;
  1012. }
  1013. 100% {
  1014. background-position-x: v-bind('translateXNumber');
  1015. }
  1016. }
  1017. .xulielistBox {
  1018. position: fixed;
  1019. bottom: 160px;
  1020. right: 200px;
  1021. background: #BC121A;
  1022. border-radius: 10px;
  1023. padding: 20px 0;
  1024. .item {
  1025. // width: 100%;
  1026. height: 5vh;
  1027. display: flex;
  1028. justify-content: center;
  1029. align-items: center;
  1030. font-size: 14px;
  1031. color: #ffffff;
  1032. font-family: 'AlibabaPuHuiTi2.0-105Heavy';
  1033. text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.6);
  1034. cursor: pointer;
  1035. padding: 0 20px;
  1036. }
  1037. .item:hover {
  1038. background: #7c0e14;
  1039. }
  1040. .close-icon {
  1041. position: absolute;
  1042. right: -20px;
  1043. top: -20px;
  1044. cursor: pointer;
  1045. }
  1046. }
  1047. .score-box {
  1048. width: 70px;
  1049. height: 110px;
  1050. background: url(@/assets/images/scene/userBg.png);
  1051. background-size: 100% 100%;
  1052. position: absolute;
  1053. right: 60px;
  1054. bottom: 30px;
  1055. display: flex;
  1056. flex-direction: column;
  1057. align-items: center;
  1058. text-align: center;
  1059. font-size: 12px;
  1060. color: #EBC68F;
  1061. text-shadow: 0 1px 2px 0 #00000091;
  1062. font-family: 'SourceHanSansCN-Medium';
  1063. img {
  1064. width: 75%;
  1065. }
  1066. .user-box {
  1067. width: 100px;
  1068. height: 80px;
  1069. background: rgba(255, 0, 0, 0.562);
  1070. border-radius: 10px;
  1071. color: white;
  1072. text-align: center;
  1073. position: absolute;
  1074. top: 15%;
  1075. left: -150%;
  1076. display: flex;
  1077. flex-direction: column;
  1078. justify-content: center;
  1079. font-size: 16px;
  1080. cursor: pointer;
  1081. div:hover {
  1082. color: #EBC68F;
  1083. }
  1084. }
  1085. .title {
  1086. cursor: pointer;
  1087. }
  1088. .scroll-wrap {
  1089. max-width: 70%;
  1090. display: inline-block;
  1091. vertical-align: top;
  1092. overflow: hidden;
  1093. white-space: nowrap;
  1094. margin-top: -3px;
  1095. .scroll-item {
  1096. animation: scroll linear 4s alternate infinite;
  1097. float: left;
  1098. }
  1099. @keyframes scroll {
  1100. 0% {
  1101. margin-left: 0;
  1102. transform: translateX(0);
  1103. }
  1104. 10% {
  1105. margin-left: 0;
  1106. transform: translateX(0);
  1107. }
  1108. 90% {
  1109. margin-left: 100%;
  1110. transform: translateX(-100%);
  1111. }
  1112. 100% {
  1113. margin-left: 100%;
  1114. transform: translateX(-100%);
  1115. }
  1116. }
  1117. }
  1118. }
  1119. }
  1120. .game-list-box {
  1121. width: 100%;
  1122. height: 100%;
  1123. position: absolute;
  1124. left: 0;
  1125. top: 0;
  1126. display: flex;
  1127. flex-direction: column;
  1128. justify-content: center;
  1129. align-items: center;
  1130. background: rgba(0, 0, 0, 0.486);
  1131. backdrop-filter: blur(10px);
  1132. .game-list {
  1133. width: 80%;
  1134. height: 80%;
  1135. background: #ffffff85;
  1136. border-radius: 15px;
  1137. padding: 20px;
  1138. display: grid;
  1139. grid-template-columns: repeat(4, 1fr);
  1140. justify-items: center;
  1141. font-family: 'AlibabaPuHuiTi2.0-105Heavy';
  1142. color: white;
  1143. @media screen and (max-width: 700px),
  1144. (orientation: portrait) {
  1145. display: flex;
  1146. flex-direction: column;
  1147. overflow: auto;
  1148. &::-webkit-scrollbar {
  1149. width: 0;
  1150. height: 0;
  1151. }
  1152. }
  1153. .game-list-item {
  1154. width: 100%;
  1155. display: flex;
  1156. flex-direction: column;
  1157. // justify-content: center;
  1158. align-items: center;
  1159. img {
  1160. width: 90%;
  1161. height: 60%;
  1162. margin-bottom: 10px;
  1163. border-radius: 15px;
  1164. @media screen and (max-width: 700px),
  1165. (orientation: portrait) {
  1166. width: 100%;
  1167. height: 100%;
  1168. margin-bottom: 0;
  1169. object-fit: none;
  1170. }
  1171. }
  1172. }
  1173. }
  1174. img {
  1175. width: 44px;
  1176. height: 44px;
  1177. margin-top: 20px;
  1178. cursor: pointer;
  1179. }
  1180. .game-ex-themb {
  1181. width: 70%;
  1182. height: 75%;
  1183. // background: #ffffff85;
  1184. border-radius: 15px;
  1185. object-fit: cover;
  1186. border-radius: 15px;
  1187. }
  1188. .btn {
  1189. width: 200px;
  1190. padding: 10px 10px;
  1191. background: url('../../assets/images/scene/goExBtn.png');
  1192. border-radius: 10px;
  1193. background-size: cover;
  1194. cursor: pointer;
  1195. position: absolute;
  1196. bottom: 20%;
  1197. div {
  1198. font-family: 'SourceHanSerifCN-Heavy';
  1199. font-weight: 800;
  1200. color: #FFFFFF;
  1201. line-height: 28px;
  1202. -webkit-text-stroke: 2px #4E3933;
  1203. font-size: 30px;
  1204. text-align: center;
  1205. -webkit-background-clip: text;
  1206. -webkit-text-fill-color: transparent;
  1207. }
  1208. }
  1209. }
  1210. @media screen and (max-width: 700px),
  1211. (orientation: portrait) {
  1212. .hots-box {
  1213. width: 100%;
  1214. height: 100%;
  1215. background: rgba(226, 226, 226, 0.068);
  1216. backdrop-filter: blur(10px);
  1217. position: absolute;
  1218. bottom: 0;
  1219. left: 0;
  1220. display: flex;
  1221. justify-content: flex-end;
  1222. align-items: flex-end;
  1223. .close-icon {
  1224. width: 40px;
  1225. height: 40px;
  1226. }
  1227. .show-title {
  1228. width: 100%;
  1229. height: 15vh;
  1230. overflow: auto;
  1231. display: flex;
  1232. justify-content: center;
  1233. align-items: center;
  1234. padding: 5%;
  1235. color: white;
  1236. position: absolute;
  1237. left: 50%;
  1238. transform: translateX(-50%);
  1239. top: 10px;
  1240. font-size: 1.2em;
  1241. font-family: 'AlibabaPuHuiTi2.0-105Heavy';
  1242. text-shadow: 0px 2px 8px rgba(0, 0, 0, 0.8);
  1243. }
  1244. &-left {
  1245. height: 100%;
  1246. background: #BC121A;
  1247. border-radius: 0 0 0 0;
  1248. display: flex;
  1249. flex-direction: column;
  1250. justify-content: space-around;
  1251. &::-webkit-scrollbar {
  1252. display: none;
  1253. }
  1254. .left-item {
  1255. // height: 15%;
  1256. font-size: 1em;
  1257. &:hover {
  1258. background: #66141885;
  1259. }
  1260. ;
  1261. }
  1262. .left-item:first-child {
  1263. border-radius: 0 0 0 0;
  1264. }
  1265. }
  1266. &-right {
  1267. width: 70%;
  1268. height: 100%;
  1269. padding: 0 10px;
  1270. box-sizing: border-box;
  1271. // .close-icon {}
  1272. // .right-content {}
  1273. .right-item {
  1274. width: 100%;
  1275. height: 10vh;
  1276. display: flex;
  1277. justify-content: left;
  1278. align-items: center;
  1279. white-space: inherit;
  1280. overflow: hidden;
  1281. text-overflow: ellipsis;
  1282. font-size: 0.9em;
  1283. cursor: pointer;
  1284. font-family: 'Courier New';
  1285. .mobileMo {
  1286. width: 100%;
  1287. display: -webkit-box;
  1288. -webkit-box-orient: vertical;
  1289. overflow: hidden;
  1290. text-overflow: ellipsis;
  1291. -webkit-line-clamp: 2;
  1292. /* 显示两行 */
  1293. line-height: 1.2;
  1294. /* 设置行高,根据需要调整 */
  1295. max-height: 2.4em;
  1296. /* 设置最大高度,根据需要调整 */
  1297. }
  1298. // .gundong {
  1299. // width: 100%;
  1300. // animation: identifier 8s linear infinite;
  1301. // }
  1302. // @keyframes identifier {
  1303. // 0% {
  1304. // transform: translateX(100%);
  1305. // }
  1306. // 100% {
  1307. // transform: translateX(-100%);
  1308. // }
  1309. // }
  1310. &:hover {
  1311. color: #C5A16C;
  1312. background: rgba(114, 37, 37, 0.74);
  1313. }
  1314. }
  1315. }
  1316. }
  1317. .xingxiangBox {
  1318. position: absolute;
  1319. right: 0px;
  1320. bottom: 0;
  1321. .xuliezhen {
  1322. position: absolute;
  1323. right: 0;
  1324. bottom: 120px;
  1325. width: 100px;
  1326. height: 100px;
  1327. background-position-x: 0;
  1328. background-repeat: no-repeat;
  1329. animation: mouse-in;
  1330. animation-duration: v-bind('duration');
  1331. animation-timing-function: v-bind('animalZhenShu');
  1332. animation-iteration-count: infinite;
  1333. transition-property: bottom;
  1334. transition-duration: 0.4s;
  1335. cursor: pointer;
  1336. will-change: transform, background-position-x;
  1337. }
  1338. @keyframes mouse-in {
  1339. 50% {
  1340. background-position-x: 0;
  1341. }
  1342. 100% {
  1343. background-position-x: v-bind('translateXNumber');
  1344. }
  1345. }
  1346. .xuliezhen-greeting {
  1347. position: absolute;
  1348. right: 0;
  1349. bottom: 120px;
  1350. width: 100px;
  1351. height: 100px;
  1352. background-position-x: 0;
  1353. background-repeat: no-repeat;
  1354. animation: xuliezhen-animation;
  1355. animation-duration: v-bind('duration');
  1356. animation-timing-function: v-bind('animalZhenShu');
  1357. animation-iteration-count: infinite;
  1358. transition-property: bottom;
  1359. // transition-duration: 0.4s;
  1360. cursor: pointer;
  1361. will-change: transform, background-position-x;
  1362. }
  1363. @keyframes xuliezhen-animation {
  1364. 50% {
  1365. background-position-x: 0;
  1366. }
  1367. 100% {
  1368. // background-position-x: v-bind('translateXNumber');
  1369. background-position-x: calc(100% - 100px);
  1370. }
  1371. }
  1372. .xuliezhen-talk {
  1373. position: absolute;
  1374. right: 0;
  1375. bottom: 120px;
  1376. width: 100px;
  1377. height: 100px;
  1378. background-position-x: 0;
  1379. background-repeat: no-repeat;
  1380. animation: xuliezhen-talk;
  1381. animation-duration: v-bind('duration');
  1382. animation-timing-function: v-bind('animalZhenShu');
  1383. animation-iteration-count: infinite;
  1384. transition-property: bottom;
  1385. // transition-duration: 0.4s;
  1386. cursor: pointer;
  1387. will-change: transform, background-position-x;
  1388. }
  1389. @keyframes xuliezhen-talk {
  1390. 0% {
  1391. background-position-x: 0;
  1392. }
  1393. 100% {
  1394. // background-position-x: v-bind('translateXNumber');
  1395. background-position-x: calc(100% - 100px);
  1396. }
  1397. }
  1398. .xulielistBox {
  1399. width: 100%;
  1400. height: 100%;
  1401. position: fixed;
  1402. top: 0;
  1403. left: 0;
  1404. background: rgba(0, 0, 0, 0.692);
  1405. backdrop-filter: blur(10px);
  1406. .content-box {
  1407. position: absolute;
  1408. top: 40%;
  1409. left: 50%;
  1410. transform: translate(-50%, -50%);
  1411. background: #bc121ba9;
  1412. border-radius: 10px;
  1413. padding: 20px 0;
  1414. box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.6);
  1415. // opacity: 0.7;
  1416. .item {
  1417. height: 8vh;
  1418. font-size: 1em;
  1419. padding: 0 40px;
  1420. }
  1421. }
  1422. .changing {
  1423. position: absolute;
  1424. right: -10px;
  1425. bottom: 100px;
  1426. width: 200px;
  1427. height: 200px;
  1428. background-position-x: 0;
  1429. background-repeat: no-repeat;
  1430. // animation-name: xuliezhen-animation;
  1431. animation-name: xuliezhen-animation-mo;
  1432. animation-timing-function: v-bind('animalZhenShu');
  1433. animation-duration: v-bind('duration');
  1434. animation-iteration-count: infinite;
  1435. transition-property: bottom;
  1436. cursor: pointer;
  1437. }
  1438. @keyframes xuliezhen-animation-mo {
  1439. 50% {
  1440. background-position-x: 0;
  1441. }
  1442. 100% {
  1443. // background-position-x: v-bind('translateXNumberChange');
  1444. background-position-x: calc(100% - 200px);
  1445. }
  1446. }
  1447. }
  1448. .score-box {
  1449. bottom: 13px;
  1450. right: 15px;
  1451. }
  1452. }
  1453. .game-list-box {
  1454. .game-ex-themb {
  1455. width: 80%;
  1456. height: 80%;
  1457. // background: #ffffff85;
  1458. border-radius: 15px;
  1459. object-fit: cover;
  1460. border-radius: 15px;
  1461. }
  1462. .btn {
  1463. width: 150px;
  1464. bottom: 17%;
  1465. div {
  1466. font-size: 22px;
  1467. }
  1468. }
  1469. }
  1470. }
  1471. }
  1472. </style>