123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847 |
- <template name="dever-seat">
- <view class="w-100 grace-body">
- <view class="bg-f1">
- <movable-area :style="'height:'+(seatRow*40+350)+'rpx;width: 100vw;tops:'+(rpxNum*132)+'px'" class="pt-f left-0">
- <movable-view :style="'width: 100vw;height:'+(seatRow*40+350)+'rpx;'" :inertia="true" :scale="true" :scale-min="0.95"
- :scale-max="2" direction="all" @change="onMove" @scale="onScale">
- <picker @change="openHall" :value="hall_index" :range="hall_data" v-if="hall_state">
- <view class="Stage dp-f jc-c ai-c fz-22 color-333" style="margin-top:10rpx">
- {{hall_data[hall_index]}}
- </view>
- </picker>
- <view style="height: 30rpx;margin-top: 30rpx;margin-bottom: 30rpx;" class="m-0-a mt-48 dp-f jc-c ai-c fz-22 color-999 br-5">{{item.name}}</view>
- <view v-for="(item,index) in seatArray" :key="index" class="dp-f jc-c mt-20" :style="'width:'+boxWidth+'px;height:'+seatSize+'px'">
- <view v-for="(seat,col) in item" :key="col" class="dp-ib" :style="'width:'+seatSize+'px;height:'+seatSize+'px'"
- @click="handleChooseSeat(index,col)">
- <image v-if="seat.type===0" class="w-100 h-100" src="@/static/seat/unselected.png" mode="aspectFit"></image>
- <image v-else-if="seat.type===1" class="w-100 h-100" src="@/static/seat/selected.png" mode="aspectFit" style="width:40rpx;height:40rpx;"></image>
- <image v-else-if="seat.type===2" class="w-100 h-100" :id="seat.TipsId" src="@/static/seat/bought.png" mode="aspectFit" style="width:40rpx;height:40rpx;border-radius:50%;margin-top: -1px;" :src="seat.User.avatar" @click="showTips(seat.TipsId, seat.Id, seat.Tips, seat.SeatCode, seat.User)"></image>
- </view>
- </view>
- <view class="pt-f bg-line br-15 over-h" :style="'left: '+(20-moveX/scale)+'px;top:112rpx;width:30rpx;'">
- <view class="w-100 dp-f ai-c jc-c fz-22 color-fff" :style="'height:'+seatSize+'px;margin-top:20rpx;'" v-for="(m,mindex) in mArr"
- :key="mindex">{{m}}</view>
- <view :style="'height: 20rpx;'"></view>
- </view>
- </movable-view>
- </movable-area>
- <view class="pt-f bottom-bar left-0 dp-f fd-cr z1000">
- <view class="bg-white p-all-32" style="width: 750rpx;">
- <view class="dp-f ai-c jc-c fz-28 color-333 mb-20" v-if="SelectNum===0">
- 推荐选座
- <view style="width: 106rpx;height: 60rpx;" class="b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(n,numindex) in 4"
- :key="n" @click="smartChoose(numindex+1)">
- {{numindex+1}}人
- </view>
- </view>
- <view class="dp-f ai-c fw-w fz-28 color-333 mb-20" v-if="SelectNum>0">
- <text>已选</text>
- <view class="p-all-10 b-1 br-5 dp-f ai-c jc-c fz-28 ml-20" v-for="(optItem,optindex) in optArr" :key="optindex">
- {{optItem.RowNum+'排'+optItem.ColumnNum+'座'}}
- </view>
- </view>
- <view style="width: 566rpx;height: 90rpx;" class="dp-f jc-c ai-c br-10 fz-34 color-fff" :class="SelectNum>0?'bg-red-1':'bg-unbtn'"
- @click="buySeat">
- <text>{{SelectNum>0?('¥ '+aPrice+' 确认座位'):'选择座位后才能观看'}}</text>
- </view>
- </view>
- </view>
- </view>
- <view v-if="show">
- <dever-publish :title="title" :is_upload="false" @hideModal="hideTips" @getRefresh="getRefresh" :type="seat_table" :type_id="seat_table_id" :api="api" :playtime="playtime"></dever-publish>
- </view>
- </view>
- </template>
- <script>
- import deverPublish from '@/lib/dever/components/publish.vue';
- export default {
- props: {
- type : {
- type : String,
- value : null
- },
- type_id : {
- type : String,
- value : null
- },
- item : {
- type : Object,
- value : null
- },
- index : 0
- },
- components:{
- deverPublish
- },
- data() {
- return {
- cycle : false,
- scaleMin:1,//h5端为解决1无法缩小问题,设为0.95
- boxWidth: 400, //屏幕宽度px
- space: ' ', //空格
- seatArray: [], //影院座位的二维数组,-1为非座位,0为未购座位,1为已选座位(绿色),2为已购座位(红色),一维行,二维列
- seatRow: 0, //影院座位行数
- seatCol: 0, //影院座位列数
- seatSize: 0, //座位尺寸
- SelectNum: 0, //选择座位数
- moveX: 0, //水平移动偏移量
- scale: 1, //放大倍数
- minRow: 0, //从第几行开始排座位
- minCol: 0, //从第几列开始排座位
- showTis: true, //显示选座提示
- seatList: [], //接口获取的原始位置
- mArr: [], //排数提示
- optArr: [], //选中的座位数组。
- isWXAPP:false,
- price : 1,
- fetch : {
- user : {},
- hall : 1,
- disabled : true,
- },
- show : false,
- api : 'app/community/?l=api.addTips',
- title : '发布聊天泡泡',
- seat_table : '',
- seat_table_id : 0,
- tipsData : {},
- page : 1,
- play : false,
- playtime : 0,
- tipsTimeData : {},
- hall_state : false,
- hall_data : [],
- hall_index : 0,
- //手动停止播放
- setStop : false,
- source : false,
-
- };
- },
- computed: {
- aPrice() {
- if (this.fetch.disabled) {
- return (this.SelectNum - 1) * this.price
- } else {
- return (this.SelectNum) * this.price
- }
- },
- rpxNum() {
- return this.boxWidth / 750
- },
- pxNum() {
- return 750 / this.boxWidth
- },
- },
- mounted() {
- if (this.item.title) {
- this.title = this.item.title;
- }
- this.price = parseFloat(this.item.seat_price);
- this.setHall();
- //获取宽度
- uni.getSystemInfo({
- success: function(e) {
- this.boxWidth = e.screenWidth
- //#ifdef H5
- this.scaleMin = 0.95
- //#endif
- }
- })
- this.page = 1;
- this.initData(this.hall)
- },
- methods: {
- setHall : function() {
- var default_hall = this.Dever.data('hall_' + this.type_id);
- if (!default_hall) {
- default_hall = 1;
- } else {
- default_hall = parseInt(default_hall);
- }
-
- var hall = parseInt(this.item.hall_num);
- this.hall_index = default_hall - 1;
- this.hall = default_hall;
- var hall_state = false;
- for (var i=0; i<hall ; i++) {
- this.hall_data[i] = (i+1) + '号厅';
- if (this.hall_index == i) {
- hall_state = true;
- }
- }
- if (!hall_state) {
- this.hall_index = 0;
- this.hall = 1;
- }
- this.hall_state = true;
- },
- openHall : function(e) {
- this.hall_index = e.detail.value;
- this.hall = parseInt(this.hall_index+1);
- this.Dever.data('hall_' + this.type_id, this.hall);
- this.page = 1;
- this.initData(this.hall);
- },
- showTips : function(tipsid, id, tips, code, user) {
- if (!this.play && this.playtime == 0) {
- this.Dever.alert('播放时才能发送消息');
- return;
- }
- this.seat_table = tips;
- this.seat_table_id = id;
- this.show = true;
-
- if (this.play) {
- this.setStop = true;
- this.$emit('stop');
- }
- },
- hideTips : function() {
- this.show = false;
- if (this.setStop == true) {
- this.$emit('start');
- this.setStop = false;
- }
- },
- setDisabled : function() {
- this.$emit('setDisabled', this.fetch.disabled);
- },
- tips : function(id, content, curtime) {
- var id = '#tips_' + this.type_id + '_' + id;
- if (this.tipsData[id]) {
- this.Dever.layer.close(this.tipsData[id]);
- }
- var self = this;
- this.tipsData[id] = this.Dever.layer.tips(content, id, {
- tips: [1, '#0FA6D8'],
- tipsMore: true,
- end : function() {
- if (self.source && curtime) {
- self.source.time[curtime] = false;
- }
- }
- //time : 100000,
- });
- },
- getRefresh : function(cate_id, type, type_id, content) {
- this.tips(type_id, content, this.playtime);
- if (!this.tipsTimeData[this.playtime]) {
- this.tipsTimeData[this.playtime] = [];
- }
- this.tipsTimeData[this.playtime].push({type_id:type_id,content:content});
- this.hideTips();
- },
-
- initData: function(hall) {
- var self = this;
- this.cycle && (clearInterval(this.cycle));
- this.Dever.get(this, 'app/user/?l=api.seat', {code:this.Dever.config.code,noloading:1, content_id : this.type_id, hall : hall}, function(t) {
- self.setDisabled();
- let arr = t.seat
- //数据说明:SeatCode座位编号,RowNum-行号,ColumnNum-纵号,YCoord-Y坐标,XCoord-X坐标,Status-状态
- let row = 0
- let col = 0
- let minCol = parseInt(arr[0].XCoord)
- let minRow = parseInt(arr[0].YCoord)
- for (let i of arr) {
- minRow = parseInt(i.YCoord) < minRow ? parseInt(i.YCoord) : minRow
- minCol = parseInt(i.XCoord) < minCol ? parseInt(i.XCoord) : minCol
- row = parseInt(i.YCoord) > row ? parseInt(i.YCoord) : row
- col = parseInt(i.XCoord) > col ? parseInt(i.XCoord) : col
- self.seat_table = i.Tips
- }
- self.seatList = arr
- self.seatRow = row - minRow + 1
- self.seatCol = col - minCol + 3
- self.minRow = minRow
- self.minCol = minCol - 1
- self.initSeatArray()
- self.tipsTimeData = {};
- self.getData();
- });
-
- },
- start : function() {
- this.play = true;
- },
- stop : function() {
- this.play = false;
- this.Dever.layer.closeAll();
- },
- time : function(data) {
- var time = data[1];
- this.source = data[0];
- this.playtime = time;
- //console.info(time);
- if (this.tipsTimeData[time]) {
- this.handle(this.tipsTimeData[time], time);
- }
- },
- // 获取聊天历史数据
- getData : function() {
- var self = this;
- this.Dever.get(this, 'app/community/?l=api.tips', {code:this.Dever.config.code,noloading:1, type:this.seat_table, pg:this.page}, function(t) {
- var arr = Object.keys(t.info);
- if (arr.length > 0) {
- self.save(t.info);
- }
- });
- },
- save : function(data) {
- this.tipsTimeData = Object.assign(this.tipsTimeData, data);
- this.page++;
- this.getData();
- },
- //执行聊天泡泡
- handle : function(items, curtime) {
- if (!this.play) {
- return;
- }
- this.cycle && (clearInterval(this.cycle));
- var i = 0;
- var len = items.length;
- this.tips(items[i]['type_id'], items[i]['content'], curtime);
- i++;
- this.cycle = setInterval(() => {
- var time = 5;
- // #ifndef H5
- time = Math.ceil(Math.floor(Math.random() * (this.maxTime - this.minTime + 1) + this.minTime));
- // #endif
- if (!this.play) {
- clearInterval(this.cycle);
- } else if (i < len) {
- this.tips(items[i]['type_id'], items[i]['content'], curtime);
- i++;
- } else {
- clearInterval(this.cycle);
- }
- }, 1000)
- },
- //初始座位数组
- initSeatArray: function() {
- let seatArray = Array(this.seatRow).fill(0).map(() => Array(this.seatCol).fill({
- type: -1,
- SeatCode: '',
- RowNum: '',
- ColumnNum: ''
- }));
- this.seatArray = seatArray
- this.seatSize = this.boxWidth > 0 ?
- parseInt(parseInt(this.boxWidth, 10) / (this.seatCol + 1), 10) :
- parseInt(parseInt(414, 10) / (this.seatCol + 1), 10)
- this.initNonSeatPlace();
- },
- //初始化是座位的地方
- initNonSeatPlace: function() {
- let seat = this.seatList.slice()
- let arr = this.seatArray.slice()
- for (let num in seat) {
- let status = 2 //-1为非座位,0为未购座位,1为已选座位(绿色),2为已购座位(红色)
- if (seat[num].Status === 0) {
- status = 0
- } else if (seat[num].Status === -1) {
- status = -1
- }
- arr[parseInt(seat[num].YCoord) - this.minRow][parseInt(seat[num].XCoord) - this.minCol] = {
- type: status,
- SeatCode: seat[num].SeatCode,
- RowNum: seat[num].RowNum,
- ColumnNum: seat[num].ColumnNum,
- User: seat[num].User,
- Id : seat[num].Id,
- Tips : seat[num].Tips,
- TipsId : 'tips_' + this.type_id + '_' + seat[num].Id
- }
- }
- this.seatArray = arr.slice()
- let mArr = []
- for (let i in arr) {
- let m = ''
- for (let n of arr[i]) {
- if (n.SeatCode) {
- m = n.RowNum
- }
- }
- if (m) {
- mArr.push(m)
- } else {
- mArr.push('')
- }
- }
- this.mArr = mArr
- },
- //放大缩小事件
- onScale: function(e) {
- this.showTis = false
- // this.moveX=-e.detail.x
- let w = this.boxWidth * 0.5
- let s = 1 - e.detail.scale
- this.moveX = w * s
- this.scale = e.detail.scale
- if (s > 0 || s === 0) {
- this.showTis = true
- }
- },
- //移动事件
- onMove: function(e) {
- this.showTis = false
- this.moveX = e.detail.x
- },
- //重置座位
- resetSeat: function() {
- this.SelectNum = 0
- this.optArr = []
- //将所有已选座位的值变为0
- let oldArray = this.seatArray.slice();
- for (let i = 0; i < this.seatRow; i++) {
- for (let j = 0; j < this.seatCol; j++) {
- if (oldArray[i][j].type === 1) {
- oldArray[i][j].type = 0
- }
- }
- }
- this.seatArray = oldArray;
- },
- //选定且购买座位
- buySeat: function() {
- if (this.SelectNum === 0) {
- return
- }
- let oldArray = [];
- for (let i = 0; i < this.seatRow; i++) {
- for (let j = 0; j < this.seatCol; j++) {
- if (this.seatArray[i][j].type === 1) {
- oldArray.push(this.seatArray[i][j].SeatCode)
- }
- }
- }
-
- this.buy(oldArray);
- },
-
- buy : function(seat) {
- seat = seat.join(',');
- var self = this;
- this.Dever.confirm('确定购买座位吗?第一个座位免费哦~有了座位就有观看权了~还有内容发布权~', function() {
- var data = {};
- data.code = self.Dever.config.code;
- data.seat = seat;
- data.content_id = self.type_id;
- data.type = self.type;
- data.index = self.index;
- var location = 'dream/view?code={code}&name=' + self.Dever.config.name;
- data.location = location;
- data.refer = self.Dever.host + '/' + location;
- self.Dever.post('app/user/?l=pay.seat', data, function(t) {
- if (t.type && t.type == 'free') {
- self.Dever.alert('选座成功,您可以点击头像发布内容~');
- self.resetSeat();
- self.initData(self.hall);
- } else {
- self.Dever.pay(t, t.location, '支付失败');
- }
- });
-
- /*
- self.Dever.post('app/user/?l=api.seatSave', {code:self.Dever.config.code, seat:seat, content_id : self.type_id}, function(t) {
- self.Dever.alert('选座成功,您可以点击头像发布内容~');
- self.resetSeat();
- self.initData(self.hall);
- });
- */
- })
-
- },
- //处理座位选择逻辑
- handleChooseSeat: function(row, col) {
- let seatValue = this.seatArray[row][col].type;
- let newArray = this.seatArray;
- //如果是已购座位,直接返回
- if (seatValue === 2 || seatValue === -1) return
- //如果是已选座位点击后变未选
- if (seatValue === 1) {
- newArray[row][col].type = 0
- this.SelectNum--
- this.getOptArr(newArray[row][col], 0)
- } else if (seatValue === 0) {
- if (this.SelectNum >= 4) {
- this.Dever.alert('一次最多只能购买4个座位');
- return;
- }
- newArray[row][col].type = 1
- this.SelectNum++
- this.getOptArr(newArray[row][col], 1)
- }
- //必须整体更新二维数组,Vue无法检测到数组某一项更新,必须slice复制一个数组才行
- this.seatArray = newArray.slice();
-
- },
- //处理已选座位数组
- getOptArr: function(item, type) {
- let optArr = this.optArr
- if (type === 1) {
- optArr.push(item)
- } else if (type === 0) {
- let arr = []
- optArr.forEach(v => {
- if (v.SeatCode !== item.SeatCode) {
- arr.push(v)
- }
- })
- optArr = arr
- }
- this.optArr = optArr.slice()
- },
- //推荐选座,参数是推荐座位数目,
- smartChoose: function(num) {
- //console.log('num===', num)
- // 先重置
- this.resetSeat()
- //找到影院座位水平垂直中间位置的后一排
- let rowStart = parseInt((this.seatRow - 1) / 2, 10) + 1;
- //先从中间排往后排搜索
- let backResult = this.searchSeatByDirection(rowStart, this.seatRow - 1, num);
- if (backResult.length > 0) {
- this.chooseSeat(backResult);
- this.SelectNum += num
- return
- }
- //再从中间排往前排搜索
- let forwardResult = this.searchSeatByDirection(rowStart - 1, 0, num);
- if (forwardResult.length > 0) {
- this.chooseSeat(forwardResult);
- this.SelectNum += num
- return
- }
- //提示用户无合法位置可选
- alert('无合法位置可选!')
-
- },
-
- //搜索函数,参数:fromRow起始行,toRow终止行,num推荐座位数
- searchSeatByDirection: function(fromRow, toRow, num) {
- /*
- * 推荐座位规则
- * (1)初始状态从座位行数的一半处的后一排的中间开始向左右分别搜索,取离中间最近的,如果满足条件,
- * 记录下该结果离座位中轴线的距离,后排搜索完成后取距离最小的那个结果座位最终结果,优先向后排进行搜索,
- * 后排都没有才往前排搜,前排逻辑同上
- *
- * (2)只考虑并排且连续的座位,不能不在一排或者一排中间有分隔
- *
- * */
- /*
- * 保存当前方向搜索结果的数组,元素是对象,result是结果数组,offset代表与中轴线的偏移距离
- * {
- * result:Array([x,y])
- * offset:Number
- * }
- *
- */
- let currentDirectionSearchResult = [];
- let largeRow = fromRow > toRow ? fromRow : toRow,
- smallRow = fromRow > toRow ? toRow : fromRow;
- for (let i = smallRow; i <= largeRow; i++) {
- //每一排的搜索,找出该排里中轴线最近的一组座位
- let tempRowResult = [],
- minDistanceToMidLine = Infinity;
- for (let j = 0; j <= this.seatCol - num; j++) {
- //如果有合法位置
- if (this.checkRowSeatContinusAndEmpty(i, j, j + num - 1)) {
- //计算该组位置距离中轴线的距离:该组位置的中间位置到中轴线的距离
- let resultMidPos = parseInt((j + num / 2), 10);
- let distance = Math.abs(parseInt(this.seatCol / 2) - resultMidPos);
- //如果距离较短则更新
- if (distance < minDistanceToMidLine) {
- minDistanceToMidLine = distance;
- //该行的最终结果
- tempRowResult = this.generateRowResult(i, j, j + num - 1)
- }
- }
- }
- //保存该行的最终结果
- currentDirectionSearchResult.push({
- result: tempRowResult,
- offset: minDistanceToMidLine
- })
- }
- //处理后排的搜索结果:找到距离中轴线最短的一个
- //注意这里的逻辑需要区分前后排,对于后排是从前往后,前排则是从后往前找
- let isBackDir = fromRow < toRow;
- let finalReuslt = [],
- minDistanceToMid = Infinity;
- if (isBackDir) {
- //后排情况,从前往后
- currentDirectionSearchResult.forEach((item) => {
- if (item.offset < minDistanceToMid) {
- finalReuslt = item.result;
- minDistanceToMid = item.offset;
- }
- });
- } else {
- //前排情况,从后往前找
- currentDirectionSearchResult.reverse().forEach((item) => {
- if (item.offset < minDistanceToMid) {
- finalReuslt = item.result;
- minDistanceToMid = item.offset;
- }
- })
- }
- //直接返回结果
- return finalReuslt
- },
- /*辅助函数,判断每一行座位从i列到j列是否全部空余且连续
- *
- */
- checkRowSeatContinusAndEmpty: function(rowNum, startPos, endPos) {
- let isValid = true;
- for (let i = startPos; i <= endPos; i++) {
- if (this.seatArray[rowNum][i].type !== 0) {
- isValid = false;
- break;
- }
- }
- return isValid
- },
- //辅助函数:返回每一行的某个合理位置的座位数组
- generateRowResult: function(row, startPos, endPos) {
- let result = [];
- for (let i = startPos; i <= endPos; i++) {
- result.push([row, i])
- }
- return result
- },
- //辅助函数:智能推荐的选座操作
- chooseSeat: function(result) {
- let opt = this.optArr
- let oldArray = this.seatArray.slice();
- for (let i = 0; i < result.length; i++) {
- //选定座位
- oldArray[result[i][0]][result[i][1]].type = 1
- this.optArr.push(oldArray[result[i][0]][result[i][1]])
- }
- this.seatArray = oldArray;
- },
- }
- }
- </script>
- <style lang="scss" scoped>
- @import '@/static/layer/theme/default/layer.css';
- .main {
- position: relative;
- }
- .p-all-10{
- padding: 10rpx;
- }
- .ml-10 {
- margin-left: 10rpx;
- }
- .m-0-10 {
- margin: 0 10rpx;
- }
- .bg-unbtn {
- background-color: #f9abb3;
- }
- .bg-red-1 {
- background-color: #F45664;
- }
- .br-10 {
- border-radius: 10rpx;
- }
- .ml-20 {
- margin-left: 20rpx;
- }
- .mb-20 {
- margin-bottom: 20rpx;
- }
- .p-all-32 {
- padding: 32rpx;
- }
- .fd-cr {
- flex-direction: column-reverse;
- /* 主轴方向从下到上,默认从左到右 */
- }
- .bottom-bar {
- bottom: var(--window-bottom);
- }
- .color-fff {
- color: #fff
- }
- .br-15 {
- border-radius: 15rpx;
- }
- .over-h {
- overflow: hidden;
- }
- .dp-ib {
- display: inline-block;
- }
- .mt-20 {
- margin-top: 20rpx;
- margin-left: 30rpx;
- }
- .pa-v-2 {
- /* 定位垂直对齐 */
- left: 50%;
- transform: translateX(-50%)
- }
- .b-d-1 {
- border: 1px dashed #e5e5e5;
- }
- .w-100 {
- width: 100%;
- }
- .h-100 {
- height: 100%;
- }
- .bg-f1 {
- background-color: #f1f1f1;
- }
- .h-100vh {
- height: 100vh;
- }
- .pt-f {
- position: fixed;
- }
- .left-0 {
- left: 0;
- }
- .p-0-32 {
- padding: 0 32rpx;
- }
- .pt-20 {
- padding-top: 20rpx;
- }
- .bg-white {
- background-color: #fff;
- }
- .z1000 {
- z-index: 1000;
- }
- .fz-34 {
- font-size: 34rpx;
- }
- .fw-b {
- font-weight: bold;
- }
- .mt-10 {
- margin-top: 10rpx;
- }
- .fz-28 {
- font-size: 28rpx;
- }
- .color-666 {
- color: #666666
- }
- .dp-f {
- display: flex;
- }
- .jc-c {
- justify-content: center;
- }
- .ai-c {
- align-items: center;
- }
- .fz-22 {
- font-size: 22rpx;
- }
- .color-333 {
- color: #333333
- }
- .m-0-a {
- margin: 0 auto;
- }
- .mt-48 {
- margin-top: 48rpx;
- }
- .fz-20 {
- font-size: 20rpx;
- }
- .color-999 {
- color: #999999
- }
- .b-1 {
- border: 1px solid #CCCCCC;
- }
- .br-5 {
- border-radius: 5rpx;
- }
- .Stage {
- background-color: #dddddd;
- width: 380rpx;
- height: 34rpx;
- transform: perspective(34rpx) rotateX(-10deg);
- margin: 0 auto;
- }
- .bg-line {
- background-color: rgba(0, 0, 0, 0.3);
- }
- .sel-seat {
- background: url('@/static/seat/selected.png') center center no-repeat;
- background-size: 100% 100%;
- }
-
- .unsel-seat {
- background: url('@/static/seat/unselected.png') center center no-repeat;
- background-size: 100% 100%;
- }
-
- .bought-seat {
- background: url('@/static/seat/bought.png') center center no-repeat;
- background-size: 100% 100%;
- }
- </style>
|