完成订单

main
lynn 1 year ago
parent c93df3e569
commit 39aa6178cb

@ -1,6 +1,9 @@
// API配置
export const BASE_URL = 'https://xukoushuniu.115.langye.net'
// 判断环境(你可以用 process.env.NODE_ENV 或自定义变量)
const IS_PROD = process.env.NODE_ENV === 'production';
// API接口地址
export const API = {
LOGIN: `${BASE_URL}/api/customer/login-by-code`,
@ -14,4 +17,11 @@ export const API = {
RESERVATION_STATUS_ENUM: `${BASE_URL}/api/customer/reservation/get-status-enum`,
RESERVATION_CREATE: `${BASE_URL}/api/customer/reservation/create`,
RESERVATION_LIST: `${BASE_URL}/api/customer/reservation/index`,
AVAILABLE_SHIP: `${BASE_URL}/api/customer/reservation/get-available-ship`,
GET_PAYMENT_QRCODE: IS_PROD
? `${BASE_URL}/api/customer/reservation/get-payment-qrcode`
: `${BASE_URL}/api/customer/reservation/get-fake-payment-qrcode`,
FAKE_PAY: `${BASE_URL}/api/customer/reservation/fake-pay`,
NOTIFICATION_LIST: `${BASE_URL}/api/customer/notifications/index`,
CANCEL_RESERVATION: `${BASE_URL}/api/customer/reservation/cancel`,
}

@ -46,6 +46,20 @@
"navigationStyle": "custom"
}
},
{
"path": "pages/order/pay_order_detail",
"style": {
"navigationBarTitleText": "订单详情",
"navigationStyle": "custom"
}
},
{
"path": "pages/order/pay_order_list",
"style": {
"navigationBarTitleText": "在线付款",
"navigationStyle": "custom"
}
},
{
"path": "pages/message/index",
"style": {

@ -47,7 +47,7 @@
<view class="arrow">&gt;</view>
<view class="process-step">
<image class="icon" src="/static/icon_step_index2.png" mode="aspectFit" />
<text class="process-label">购票</text>
<text class="process-label">购票</text>
</view>
<view class="arrow">&gt;</view>
<view class="process-step">
@ -68,21 +68,21 @@
</view>
<view class="func-card bg-blue" @click="goOrder">
<view class="func-card-content">
<text class="func-title">在线购票</text>
<text class="func-title">在线付款</text>
<text class="func-num">30</text>
</view>
<view class="func-bg-icon ticket"></view>
</view>
<view class="func-card bg-orange" @click="goShipManager">
<view class="func-card bg-orange" @click="goWaitPass">
<view class="func-card-content">
<text class="func-title">船只管理</text>
<text class="func-title">排队过闸</text>
<text class="func-num">6</text>
</view>
<view class="func-bg-icon ship"></view>
</view>
<view class="func-card bg-purple" @click="goInvoiceManage">
<view class="func-card-content">
<text class="func-title">发票管理</text>
<text class="func-title">申请开票</text>
<text class="func-num">20</text>
</view>
<view class="func-bg-icon invoice"></view>
@ -114,11 +114,11 @@ export default {
goReservation() {
uni.navigateTo({ url: '/pages/reservation/index' });
},
goShipManager() {
uni.navigateTo({ url: '/pages/index/ship_manage' });
goWaitPass() {
uni.navigateTo({ url: '/pages/order/pay_order_list?status=paid' });
},
goOrder() {
uni.navigateTo({ url: '/pages/order/pay_order' });
uni.navigateTo({ url: '/pages/order/pay_order_list?status=unpaid' });
},
goInvoiceManage() {
uni.navigateTo({ url: '/pages/index/invoice_manage' });

@ -32,6 +32,27 @@
<text class="form-label required">船舶编号</text>
<input class="form-input" v-model="form.shipNo" placeholder="请输入船舶编号" />
</view>
<view class="form-row">
<text class="form-label required">船舶类型</text>
<view class="fee-type-group">
<view
v-for="(value, label) in feeTypeEnum"
:key="value.value"
class="fee-type-item"
>
<radio
class="form-radio"
:value="value.value.toString()"
:checked="form.feeType === value.value.toString()"
@tap="onFeeTypeChange({detail: {value: value.value.toString()}})"
/>
<view class="fee-type-info">
<text class="fee-type-label">{{ label }}</text>
<text class="fee-type-desc">{{ value.desc }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 第二步船舶参数 -->
@ -227,11 +248,13 @@ export default {
isEdit: false,
shipTypeEnum: {}, //
tonnageClassEnum: {}, //
feeTypeEnum: {}, //
form: {
owner: 'sdf',
idCard: '23423423423423423',
phone: '12312312311',
shipNo: '2222',
feeType: '1', //
ton: '',
length: '',
width: '',
@ -273,6 +296,7 @@ export default {
this.form.depth = ship.molded_depth || '';
this.form.tonLevel = ship.tonnage_class || '';
this.form.shipType = ship.ship_type || '';
this.form.feeType = ship.fee_type || '1'; //
this.form.page1FileId = ship.picture1 || '';
this.form.page2FileId = ship.picture2 || '';
this.form.page3FileId = ship.picture3 || '';
@ -311,10 +335,12 @@ export default {
const enumData = res.data.data;
this.shipTypeEnum = enumData.ship_type;
this.tonnageClassEnum = enumData.tonnage_class;
this.feeTypeEnum = enumData.fee_type;
//
if (!this.isEdit) {
this.form.shipType = Object.values(this.shipTypeEnum)[0].toString();
this.form.tonLevel = Object.values(this.tonnageClassEnum)[0];
this.form.feeType = '1'; //
}
return true;
} else {
@ -529,6 +555,7 @@ export default {
molded_depth: this.form.depth,
tonnage_class: this.form.tonLevel,
ship_type: this.form.shipType,
fee_type: this.form.feeType,
picture1: this.form.page1FileId,
picture2: this.form.page2FileId,
picture3: this.form.page3FileId,
@ -622,8 +649,8 @@ export default {
ctx.moveTo(x, y);
ctx.setStrokeStyle('#222');
ctx.setLineWidth(4);
ctx.beginPath();
this.lastPoint = { x, y };
ctx.beginPath();
ctx.draw(true);
},
moveSign(e) {
@ -675,6 +702,9 @@ export default {
onShipTypeChange(e) {
this.form.shipType = e.detail.value
},
onFeeTypeChange(e) {
this.form.feeType = e.detail.value;
},
toggleSignChecked() {
this.signChecked = !this.signChecked;
},
@ -904,6 +934,34 @@ export default {
display: flex;
align-items: center;
}
/* 船舶类型特殊样式 */
.fee-type-group {
display: flex;
flex-direction: column;
gap: 24rpx;
margin-left: 24rpx;
width: 100%;
}
.fee-type-item {
display: flex;
align-items: flex-start;
width: 100%;
}
.fee-type-info {
display: flex;
flex-direction: column;
margin-left: 8rpx;
flex: 1;
}
.fee-type-label {
font-size: 28rpx;
color: #222;
}
.fee-type-desc {
font-size: 24rpx;
color: #888;
margin-top: 4rpx;
}
.info-title-row {
display: flex;
justify-content: space-between;

@ -47,10 +47,10 @@
</view>
</view>
</view>
<view class="fixed-bottom-btn-bar">
<!-- <view class="fixed-bottom-btn-bar">
<button class="delete-btn" @click="onDelete"></button>
<button class="edit-btn" @click="onEdit"></button>
</view>
</view> -->
</view>
</template>
@ -251,7 +251,7 @@ export default {
}
.content-area {
padding-top: 90px;
padding-bottom: 70px;
padding-bottom: 20px;
}
.fixed-bottom-btn-bar {
position: fixed;

@ -5,8 +5,17 @@
</NavBar>
</view>
<view class="content-area">
<view v-if="shipList.length > 0">
<view v-if="shipList.length === 0" class="empty-tip">
<image src="/static/images/empty.png" mode="aspectFit" class="empty-img" />
<text class="empty-text">暂无船只信息</text>
</view>
<view v-else>
<view v-for="item in shipList" :key="item.id" class="ship-cell" @click="goDetail(item)">
<view class="ship-card-header">
<view v-if="item.status === 'pending'" class="status pending"><span class="status-text"></span></view>
<view v-else-if="item.status === 'rejected'" class="status rejected"><span class="status-text">已拒绝</span></view>
<view v-else-if="item.status === 'approved'" class="status approved"><span class="status-text">已通过</span></view>
</view>
<view class="ship-title">
船号: <text class="ship-no">{{ item.ship_number }}</text>
</view>
@ -15,14 +24,22 @@
<view class="ship-row">总吨位: {{ item.total_tonnage }} </view>
</view>
</view>
<view v-else class="empty-tip">
<image src="/static/images/empty.png" mode="aspectFit" class="empty-img" />
<text class="empty-text">暂无船只信息</text>
</view>
</view>
<view class="fixed-bottom">
<view class="fixed-bottom" v-if="shipList.length === 0">
<button class="add-cell-btn" @click="goAdd"></button>
</view>
<view class="fixed-bottom" v-if="shipList.length === 1">
<template v-if="shipList[0].status === 'pending'">
<button class="add-cell-btn" @click.stop="goEdit(shipList[0])">修改</button>
</template>
<template v-else-if="shipList[0].status === 'rejected'">
<button class="add-cell-btn" @click.stop="goEdit(shipList[0])">修改</button>
<button class="delete-cell-btn" @click.stop="onDelete(shipList[0])">删除</button>
</template>
<template v-else-if="shipList[0].status === 'approved'">
<button class="delete-cell-btn" @click.stop="onDelete(shipList[0])">删除</button>
</template>
</view>
</view>
</template>
@ -82,6 +99,65 @@ export default {
uni.navigateTo({
url: `/pages/index/ship_detail?id=${item.id}&item=${itemStr}`
})
},
getShipStatusText(status) {
if (status === 'pending') return '待审核';
if (status === 'rejected') return '已拒绝';
if (status === 'approved') return '已通过';
return '';
},
getShipStatusClass(status) {
if (status === 'pending') return 'pending';
if (status === 'rejected') return 'rejected';
if (status === 'approved') return 'approved';
return '';
},
goEdit(item) {
const itemStr = encodeURIComponent(JSON.stringify(item));
uni.navigateTo({
url: `/pages/index/ship_add?edit=1&ship=${itemStr}`
});
},
onDelete(item) {
const token = uni.getStorageSync('token');
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' });
return;
}
if (!item || !item.id) {
uni.showToast({ title: '无效的船舶信息', icon: 'none' });
return;
}
uni.showModal({
title: '提示',
content: '确定要删除该船舶吗?',
success: (res) => {
if (res.confirm) {
uni.showLoading({ title: '删除中...' });
uni.request({
url: `${API.SHIP_DELETE}/${item.id}?token=${token}`,
method: 'POST',
data: {},
header: { 'content-type': 'application/json' },
success: (res) => {
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '删除成功', icon: 'success' });
setTimeout(() => {
this.fetchShipList();
}, 1000);
} else {
uni.showToast({ title: res.data.errmsg || '删除失败', icon: 'none' });
}
},
fail: (err) => {
uni.hideLoading();
uni.showToast({ title: '网络错误', icon: 'none' });
}
});
}
}
});
}
}
}
@ -116,6 +192,29 @@ export default {
margin-bottom: 32rpx;
border: 1rpx solid #e5e5e5;
}
.ship-card-header {
display: flex;
align-items: center;
margin-bottom: 12rpx;
}
.status {
font-size: 24rpx;
border-radius: 8rpx;
padding: 2px 18rpx;
color: #fff;
font-weight: 500;
display: inline-block;
transform: skewX(-20deg);
border: none;
margin-right: 16rpx;
}
.status-text {
display: inline-block;
transform: skewX(20deg);
}
.status.pending { background: #ff9800; }
.status.rejected { background: #ff3b3b; }
.status.approved { background: #22c58b; }
.ship-title {
@include font-primary;
font-weight: $font-weight-bold;
@ -173,4 +272,20 @@ export default {
@include font-secondary;
color: $font-color-secondary;
}
.delete-cell-btn {
min-width: 320rpx;
height: 80rpx;
border-radius: 40rpx;
background: #ff3b3b;
color: #fff;
@include font-primary;
font-weight: $font-weight-medium;
border: none;
outline: none;
box-shadow: 0 4rpx 16rpx rgba(255,59,59,0.12);
transition: background 0.2s;
}
.with-margin {
margin-left: 24rpx;
}
</style>

@ -44,8 +44,41 @@
</template>
<script>
import { API } from '@/config/index.js';
export default {
name: 'MessagePage'
name: 'MessagePage',
data() {
return {
notifications: [],
page: 1,
per_page: 5,
status: '', // : '', 'unread', 'read'
}
},
onShow() {
this.fetchNotifications();
},
methods: {
async fetchNotifications() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.NOTIFICATION_LIST}?token=${token}&page=${this.page}&per_page=${this.per_page}${this.status ? `&status=${this.status}` : ''}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.notifications = res.data.data.list || [];
}
} catch (e) {
console.error('Failed to fetch notifications:', e);
}
},
},
}
</script>

@ -4,81 +4,89 @@
<view class="header-title">我的购票</view>
<!-- 订单卡片列表 -->
<view class="order-list">
<!-- 已购票 -->
<view class="order-card purchased">
<view class="order-card-header">
<view class="status purchased"><span class="status-text">已购票</span></view>
<view class="date">2024-01-15</view>
<template v-if="reservationList.length > 0">
<view v-for="item in reservationList" :key="item.id">
<!-- 已付款 -->
<view v-if="item.status === 'paid' || item.status === 'completed'" class="order-card purchased">
<view class="order-card-header">
<view class="status purchased"><span class="status-text">{{ getStatusText(item.status) }}</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions single-btn">
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
<!-- 待审核 -->
<view v-else-if="item.status === 'pending'|| item.status === 'price_checked'" class="order-card pending">
<view class="order-card-header">
<view class="status pending"><span class="status-text">{{ getStatusText(item.status) }}</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions">
<button class="cancel-btn" :disabled="false" @click="onCancelOrder(item)"></button>
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
<!-- 已拒绝 -->
<view v-else-if="item.status === 'rejected'" class="order-card pending">
<view class="order-card-header">
<view class="status rejected"><span class="status-text">{{ getStatusText(item.status) }}</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions">
<button class="cancel-btn" :disabled="false" @click="goReservation(item)"></button>
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
<!-- 待支付 -->
<view v-else-if="item.status === 'unpaid' || item.status === 'approved'" class="order-card confirmed">
<view class="order-card-header">
<view class="status confirmed"><span class="status-text">{{ getStatusText(item.status) }}</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions">
<button class="detail-btn" @click="onShowDetail(item)"></button>
<button class="buy-btn" @click="goPayOrder(item)"></button>
</view>
</view>
<!-- 已取消 -->
<view v-else-if="item.status === 'canceled'" class="order-card canceled">
<view class="order-card-header">
<view class="status canceled"><span class="status-text">{{ getStatusText(item.status) }}</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc">{{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions single-btn">
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
</view>
<view class="order-info">
<view class="flight">苏航666(ZJ12345)</view>
<view class="desc"> 南向北 | 下午批次</view>
</template>
<template v-else>
<view class="empty-box">
<image src="/static/empty.png" class="empty-img" mode="aspectFit" />
<view class="empty-text">暂无订单</view>
</view>
<view class="order-actions single-btn">
<button class="detail-btn" @click="onShowDetail"></button>
</view>
</view>
<!-- 待确认 -->
<view class="order-card pending">
<view class="order-card-header">
<view class="status pending"><span class="status-text">待确认</span></view>
<view class="date">2024-01-15</view>
</view>
<view class="order-info">
<view class="flight">苏航666(ZJ12345)</view>
<view class="desc"> 北向南 | 上午批次</view>
</view>
<view class="order-actions">
<button class="cancel-btn" :disabled="false" @click="onCancelOrder"></button>
<button class="detail-btn" @click="onShowDetail"></button>
</view>
</view>
<!-- 已确认 -->
<view class="order-card confirmed">
<view class="order-card-header">
<view class="status confirmed"><span class="status-text">已确认</span></view>
<view class="date">2024-01-15</view>
</view>
<view class="order-info">
<view class="flight">苏航666(ZJ12345)</view>
<view class="desc"> 北向南 | 上午批次</view>
</view>
<view class="order-actions">
<button class="detail-btn" @click="onShowDetail"></button>
<button class="buy-btn" @click="goPayOrder"></button>
</view>
</view>
<!-- 已取消 -->
<view class="order-card cancelled">
<view class="order-card-header">
<view class="status cancelled"><span class="status-text">已取消</span></view>
<view class="date">2024-01-15</view>
</view>
<view class="order-info">
<view class="flight">苏航666(ZJ12345)</view>
<view class="desc"> 北向南 | 上午批次</view>
</view>
<view class="order-actions">
<button class="detail-btn" @click="onShowDetail"></button>
<button class="rebook-btn" @click="goReservation"></button>
</view>
</view>
</view>
<view v-if="showDetail" class="detail-modal-mask">
<view class="detail-modal">
<view class="modal-close" @click="onCloseDetail">×</view>
<view class="modal-title">船舶信息</view>
<view class="modal-row"><text class="modal-label">过闸方向</text><text>{{ detailInfo.direction }}</text></view>
<view class="modal-row"><text class="modal-label">批次号</text><text>{{ detailInfo.batchNo }}</text></view>
<view class="modal-row"><text class="modal-label">船舶信息</text><text>{{ detailInfo.ship }}</text></view>
<view class="modal-row"><text class="modal-label">购票时间</text><text>{{ detailInfo.time }}</text></view>
<view class="modal-row"><text class="modal-label">支付方式</text><text>{{ detailInfo.payType }}</text></view>
<view class="modal-row">
<text class="modal-label">支付金额</text>
<text class="modal-amount">{{ detailInfo.amount }}</text>
</view>
<button class="modal-confirm-btn" @click="onCloseDetail"></button>
</view>
</template>
</view>
</view>
</template>
@ -90,15 +98,6 @@ export default {
name: 'OrderPage',
data() {
return {
showDetail: false,
detailInfo: {
direction: '北向南过闸',
batchNo: '2025040101',
ship: '苏航666(ZJ12345)',
time: '2024-01-15 10:30',
payType: '微信支付',
amount: '120.00'
},
reservationStatusEnum: [],
reservationList: []
}
@ -109,6 +108,17 @@ export default {
});
},
methods: {
formatChinaDate(dateStr) {
if (!dateStr) return '';
// ISO Date
const date = new Date(dateStr);
//
// Date dateStr ISO
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
},
async fetchReservationStatusEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
@ -141,13 +151,14 @@ export default {
});
});
if (res.data && res.data.errcode === 0) {
this.reservationList = res.data.data;
this.reservationList = res.data.data.data;
console.log(this.reservationList);
}
} catch (e) {
//
}
},
onCancelOrder() {
onCancelOrder(item) {
uni.showModal({
title: '提示',
content: '确定要取消该预约吗?',
@ -155,23 +166,50 @@ export default {
cancelText: '再想想',
success: (res) => {
if (res.confirm) {
//
uni.showToast({ title: '已取消预约', icon: 'success' });
//
const token = uni.getStorageSync('token');
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' });
return;
}
uni.showLoading({ title: '取消中...' });
uni.request({
url: `${API.CANCEL_RESERVATION}/${item.id}?token=${token}`,
method: 'POST',
success: (res) => {
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '已取消预约', icon: 'success' });
this.fetchReservationList();
} else {
uni.showToast({ title: res.data.errmsg || '取消失败', icon: 'none' });
}
},
fail: () => {
uni.hideLoading();
uni.showToast({ title: '网络错误', icon: 'none' });
}
});
}
}
});
},
onShowDetail() {
this.showDetail = true;
},
onCloseDetail() {
this.showDetail = false;
onShowDetail(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
},
goPayOrder() {
uni.navigateTo({ url: '/pages/order/pay_order' });
goPayOrder(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
},
goReservation() {
goReservation(item) {
uni.navigateTo({ url: '/pages/reservation/index' });
},
getStatusText(status) {
if (this.reservationStatusEnum && this.reservationStatusEnum[status]) {
return this.reservationStatusEnum[status].label;
}
return status;
}
}
}
@ -242,8 +280,13 @@ export default {
}
.status.purchased { background: #22c58b; }
.status.pending { background: #ff9800; }
.status.rejected { background: #ff4d4f; }
.status.confirmed { background: #217aff; }
.status.cancelled { background: #bdbdbd; }
.status.canceled {
background: #b0b8c6;
color: #fff;
}
.date { color: #173766; font-size: 15px; }
.order-info {
margin-bottom: 24px;
@ -399,19 +442,42 @@ button {
font-weight: bold;
}
.modal-confirm-btn {
width: 220px;
height: 44px;
line-height: 44px;
border-radius: 12px;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%);
color: #fff;
font-size: 18px;
font-weight: 500;
margin: 40px auto 0 auto;
border: none;
outline: none;
display: block;
width: 160px !important;
height: 44px !important;
line-height: 44px !important;
border-radius: 12px !important;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%) !important;
color: #fff !important;
font-size: 18px !important;
font-weight: 500 !important;
margin: 40px auto 0 auto !important;
border: none !important;
outline: none !important;
display: block !important;
padding: 0 !important;
box-sizing: border-box;
box-sizing: border-box !important;
text-align: center !important;
align-self: center !important;
flex-shrink: 0 !important;
flex-grow: 0 !important;
}
.order-card.canceled {
opacity: 0.7;
}
.empty-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-top: 120rpx;
}
.empty-img {
width: 320rpx;
height: 320rpx;
margin-bottom: 32rpx;
}
.empty-text {
color: #888;
font-size: 28rpx;
}
</style>

@ -7,54 +7,41 @@
<!-- 预约信息 -->
<view class="pay-section">
<view class="pay-title">预约信息</view>
<view class="pay-row"><text>预约日期</text><text>2024-01-14</text></view>
<view class="pay-row"><text>预约批次</text><text>下午批次</text></view>
<view class="pay-row"><text>航行方向</text><text>南向北</text></view>
<view class="pay-row"><text>预约日期</text><text>{{ item.batch && item.batch.created_at ? formatChinaDate(item.batch.created_at) : '' }}</text></view>
<view class="pay-row"><text>预约批次</text><text>{{ item.batch.name }}</text></view>
<view class="pay-row"><text>航行方向</text><text>{{ item.direction_name }}</text></view>
<view class="pay-row">
<text>预约状态</text>
<text class="pay-status">确认</text>
<text class="pay-status">预约</text>
</view>
</view>
<!-- 船舶信息 -->
<view class="pay-section">
<view class="pay-title">船舶信息</view>
<view class="pay-row"><text>船舶</text><text>苏航666</text></view>
<view class="pay-row"><text>编号</text><text>ZJ12345</text></view>
<view class="pay-row"><text>载重</text><text>500</text></view>
<view class="pay-row"><text>类型</text><text>货船</text></view>
<view class="pay-row"><text>总长度</text><text>45</text></view>
<view class="pay-row"><text>型宽</text><text>8</text></view>
<view class="pay-row"><text>型深</text><text>3.5</text></view>
<view class="pay-row"><text>船舶编号</text><text>{{ item.ship.ship_number }}</text></view>
<view class="pay-row"><text>总长度</text><text>{{ item.ship.total_length }}</text></view>
<view class="pay-row"><text>型宽</text><text>{{ item.ship.total_width }}</text></view>
<view class="pay-row"><text>型深</text><text>{{ item.ship.molded_depth }}</text></view>
<view class="pay-row"><text>载重</text><text>{{ item.ship.total_tonnage }}</text></view>
<view class="pay-row"><text>类型</text><text>{{ item.ship && item.ship.ship_type ? getShipTypeName(item.ship.ship_type) : '' }}</text></view>
</view>
<!-- 票价信息 -->
<view class="pay-section">
<view class="pay-title">票价信息</view>
<view class="pay-row"><text>过闸费用</text><text>300.00</text></view>
<view class="pay-row"><text>按吨位计费</text><text>500</text></view>
<view class="pay-row"><text>过闸费用</text><text>{{ item.price }}</text></view>
<view class="pay-row"><text>按吨位计费</text><text>{{ item.ship.total_tonnage }}</text></view>
<view class="pay-row pay-total">
<text>总计</text>
<text class="pay-total-num">300.00</text>
<text class="pay-total-num">{{ item.price }}</text>
</view>
</view>
<!-- 支付方式 -->
<view class="pay-section">
<view class="pay-title">支付方式</view>
<radio-group v-model="payType" class="pay-radio-group">
<view class="pay-row pay-paytype" @click="payType = 'wechat'">
<view class="pay-label">
<image src="/static/wechat.png" class="pay-icon" />
<text>微信支付</text>
</view>
<radio value="wechat" :checked="payType === 'wechat'" />
</view>
<view class="pay-row pay-paytype" @click="payType = 'alipay'">
<view class="pay-label">
<image src="/static/alipay.png" class="pay-icon" />
<text>支付宝支付</text>
</view>
<radio value="alipay" :checked="payType === 'alipay'" />
</view>
</radio-group>
<view class="pay-title">扫码支付</view>
<view class="pay-qrcode-box">
<image :src="qrcodeUrl" class="pay-qrcode-img" mode="aspectFit" @longpress="handleLongPress" />
</view>
<view class="pay-qrcode-tip">请使用微信或支付宝扫码支付</view>
</view>
</view>
<view class="pay-bottom-bar">
@ -66,7 +53,7 @@
</view>
<view class="pay-bottom-btns">
<button class="pay-cancel-btn">取消订单</button>
<button class="pay-pay-btn">立即支付 300.00</button>
<button class="pay-pay-btn" @click="handlePay"> 300.00</button>
</view>
</view>
</view>
@ -74,14 +61,155 @@
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
export default {
components: {
NavBar
},
data() {
return {
payType: 'wechat'
qrcodeUrl: 'https://xukoushuniu.115.langye.net/assets/images/fake-qrcode.png',
payType: 'wechat',
item: {},
shipTypeEnum: []
}
},
onLoad(options) {
if (options.item) {
try {
this.item = JSON.parse(decodeURIComponent(options.item));
} catch (e) {
console.error('Failed to parse item:', e);
this.item = {};
}
}
console.log(this.item);
},
onShow() {
this.fetchShipTypeEnum().then(() => {
if (this.item.id) {
this.fetchQrcode(this.item.id);
}
});
},
methods: {
formatChinaDate(dateStr) {
if (!dateStr) return '';
// ISO Date
const date = new Date(dateStr);
//
// Date dateStr ISO
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
},
async fetchQrcode(id) {
const token = uni.getStorageSync('token');
if (!token || !id) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.GET_PAYMENT_QRCODE}?id=${id}&token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.qrcodeUrl = res.data.data.qrcode;
}
} catch (e) {}
},
async fetchShipTypeEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.SHIP_PROPERTY_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
const shipTypeRaw = res.data.data.ship_type || {};
if (Array.isArray(shipTypeRaw)) {
this.shipTypeEnum = shipTypeRaw;
} else {
this.shipTypeEnum = Object.keys(shipTypeRaw).map(label => ({
label,
value: shipTypeRaw[label]
}));
}
}
} catch (e) {
console.error('Failed to fetch ship type enum:', e);
}
},
getShipTypeName(type) {
const found = this.shipTypeEnum.find(item => item.value === type || item.value == type);
return found ? found.label : type;
},
handlePay() {
//POST
uni.request({
url: `${API.FAKE_PAY}`,
method: 'POST',
data: {
id: this.item.id,
token: uni.getStorageSync('token')
},
success: (res) => {
console.log('模拟支付结果:', res);
},
fail: (err) => {
console.error('模拟支付失败:', err);
}
});
},
handleLongPress() {
//
uni.getImageInfo({
src: this.qrcodeUrl,
success: (imageInfo) => {
// 使
uni.scanCode({
scanType: ['qrCode'],
onlyFromCamera: false,
path: imageInfo.path,
success: (res) => {
console.log('扫码结果:', res);
if (res.result) {
uni.showToast({
title: '扫码成功',
icon: 'success'
});
//
// uni.navigateTo({
// url: `/pages/payment/index?url=${encodeURIComponent(res.result)}`
// });
}
},
fail: (err) => {
console.error('扫码失败:', err);
uni.showToast({
title: '扫码失败',
icon: 'none'
});
}
});
},
fail: (err) => {
console.error('获取图片信息失败:', err);
uni.showToast({
title: '获取图片失败',
icon: 'none'
});
}
});
},
}
}
</script>
@ -235,4 +363,23 @@ export default {
border: none;
}
}
.pay-qrcode-box {
display: flex;
justify-content: center;
align-items: center;
margin: 32rpx 0;
}
.pay-qrcode-img {
width: 260rpx;
height: 260rpx;
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.06);
}
.pay-qrcode-tip {
text-align: center;
color: #888;
font-size: 26rpx;
margin-top: 12rpx;
}
</style>

@ -0,0 +1,485 @@
<template>
<view class="pay-bg">
<view class="fixed-nav">
<NavBar title="订单详情" />
</view>
<view class="pay-scroll">
<!-- 预约信息 -->
<view class="pay-section">
<view class="pay-title">预约信息</view>
<view class="pay-row"><text>预约日期</text><text>{{ formatChinaDate(item.batch && item.batch.created_at ? item.batch.created_at : item.created_at) }}</text></view>
<view class="pay-row"><text>预约批次</text><text>{{ item.batch && item.batch.name ? item.batch.name : '-' }}</text></view>
<view class="pay-row"><text>航行方向</text><text>{{ item.direction_name }}</text></view>
<view class="pay-row">
<text>预约状态</text>
<text class="pay-status" :class="item.status">{{ getStatusText(item.status) }}</text>
</view>
</view>
<!-- 船舶信息 -->
<view class="pay-section">
<view class="pay-title">船舶信息</view>
<view class="pay-row"><text>船舶编号</text><text>{{ item.ship.ship_number }}</text></view>
<view class="pay-row"><text>总长度</text><text>{{ item.ship.total_length }}</text></view>
<view class="pay-row"><text>型宽</text><text>{{ item.ship.total_width }}</text></view>
<view class="pay-row"><text>型深</text><text>{{ item.ship.molded_depth }}</text></view>
<view class="pay-row"><text>载重</text><text>{{ item.ship.total_tonnage }}</text></view>
<view class="pay-row"><text>类型</text><text>{{ item.ship && item.ship.ship_type ? getShipTypeName(item.ship.ship_type) : '' }}</text></view>
</view>
<!-- 票价信息 -->
<view class="pay-section" v-if="item.status === 'paid' || item.status === 'completed'">
<view class="pay-title">票价信息</view>
<view class="pay-row"><text>过闸费用</text><text>{{ item.price }}</text></view>
<view class="pay-row"><text>按吨位计费</text><text>{{ item.ship.total_tonnage }}</text></view>
<view class="pay-row pay-total">
<text>总计</text>
<text class="pay-total-num">{{ item.price }}</text>
</view>
</view>
<!-- 支付方式 -->
<view class="pay-section" v-if="item.status === 'unpaid' || item.status === 'approved'">
<view class="pay-title">扫码支付</view>
<view class="pay-qrcode-box">
<image :src="qrcodeUrl" class="pay-qrcode-img" mode="aspectFit" @longpress="handleLongPress" />
</view>
<view class="pay-qrcode-tip">请使用微信或支付宝扫码支付</view>
</view>
</view>
<view class="pay-bottom-bar">
<template v-if="item.status === 'unpaid' || item.status === 'approved'">
<view class="pay-bottom-tip">
<text class="pay-bottom-clock">🕒</text>
<text class="pay-bottom-tip-text">
请在 <text class="pay-bottom-time">14:06</text> 内完成支付
</text>
</view>
<view class="pay-bottom-btns">
<button class="pay-pay-btn" @click="handlePay"> {{ item.price }}</button>
</view>
</template>
<template v-else-if="item.status === 'pending'">
<view class="pay-bottom-btns">
<button class="pay-cancel-btn" @click="handleCancel"></button>
</view>
</template>
<template v-else-if="item.status === 'rejected'">
<view class="pay-bottom-btns">
<button class="pay-cancel-btn" @click="handleReReserve"></button>
</view>
</template>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
export default {
components: {
NavBar
},
data() {
return {
qrcodeUrl: 'https://xukoushuniu.115.langye.net/assets/images/fake-qrcode.png',
payType: 'wechat',
item: {},
shipTypeEnum: [],
reservationStatusEnum: []
}
},
onLoad(options) {
if (options.item) {
try {
this.item = JSON.parse(decodeURIComponent(options.item));
} catch (e) {
console.error('Failed to parse item:', e);
this.item = {};
}
}
console.log(this.item);
},
onShow() {
this.fetchShipTypeEnum().then(() => {
if (this.item.id) {
this.fetchQrcode(this.item.id);
}
});
this.fetchReservationStatusEnum();
},
methods: {
formatChinaDate(dateStr) {
if (!dateStr) return '';
// ISO Date
const date = new Date(dateStr);
//
// Date dateStr ISO
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
},
async fetchQrcode(id) {
const token = uni.getStorageSync('token');
if (!token || !id) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.GET_PAYMENT_QRCODE}?id=${id}&token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.qrcodeUrl = res.data.data.qrcode;
}
} catch (e) {}
},
async fetchShipTypeEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.SHIP_PROPERTY_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
const shipTypeRaw = res.data.data.ship_type || {};
if (Array.isArray(shipTypeRaw)) {
this.shipTypeEnum = shipTypeRaw;
} else {
this.shipTypeEnum = Object.keys(shipTypeRaw).map(label => ({
label,
value: shipTypeRaw[label]
}));
}
}
} catch (e) {
console.error('Failed to fetch ship type enum:', e);
}
},
getShipTypeName(type) {
const found = this.shipTypeEnum.find(item => item.value === type || item.value == type);
return found ? found.label : type;
},
handleLongPress() {
//
uni.getImageInfo({
src: this.qrcodeUrl,
success: (imageInfo) => {
// 使
uni.scanCode({
scanType: ['qrCode'],
onlyFromCamera: false,
path: imageInfo.path,
success: (res) => {
console.log('扫码结果:', res);
if (res.result) {
uni.showToast({
title: '扫码成功',
icon: 'success'
});
//
// uni.navigateTo({
// url: `/pages/payment/index?url=${encodeURIComponent(res.result)}`
// });
}
},
fail: (err) => {
console.error('扫码失败:', err);
uni.showToast({
title: '扫码失败',
icon: 'none'
});
}
});
},
fail: (err) => {
console.error('获取图片信息失败:', err);
uni.showToast({
title: '获取图片失败',
icon: 'none'
});
}
});
},
handleCancel() {
uni.showModal({
title: '提示',
content: '确定要取消该预约吗?',
confirmText: '确定',
cancelText: '再想想',
success: (res) => {
if (res.confirm) {
//
uni.showToast({ title: '已取消预约', icon: 'success' });
}
}
});
},
handleReReserve() {
uni.navigateTo({ url: '/pages/reservation/index' });
},
handlePay() {
//POST
uni.request({
url: `${API.FAKE_PAY}`,
method: 'POST',
data: {
reservation_id: this.item.id,
token: uni.getStorageSync('token')
},
success: (res) => {
console.log('模拟支付结果:', res);
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '支付成功', icon: 'success' });
uni.navigateBack();
} else {
uni.showToast({ title: res.data.errmsg || '支付失败', icon: 'none' });
}
},
fail: (err) => {
console.error('模拟支付失败:', err);
}
});
},
async fetchReservationStatusEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.RESERVATION_STATUS_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.reservationStatusEnum = res.data.data;
}
} catch (e) {
console.error('Failed to fetch reservation status enum:', e);
}
},
getStatusText(status) {
if (this.reservationStatusEnum && this.reservationStatusEnum[status]) {
return this.reservationStatusEnum[status].label;
}
return status;
},
}
}
</script>
<style lang="scss" scoped>
@import '@/styles/common.scss';
.pay-bg {
min-height: 100vh;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
padding-bottom: 32rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
height: 90px;
}
.pay-scroll {
padding-top: 110px;
padding-bottom: 160rpx;
}
.pay-section {
background: #fff;
border-radius: 24rpx;
margin: 0 24rpx 32rpx 24rpx;
box-shadow: 0 4rpx 16rpx rgba(59,124,255,0.08);
padding: 32rpx 24rpx 8rpx 24rpx;
}
.pay-title {
@include font-primary;
font-weight: bold;
color: #222;
margin-bottom: 24rpx;
}
.pay-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
text:first-child {
@include font-secondary;
color: $font-color-primary;
}
text:last-child {
@include font-secondary;
color: $font-color-secondary;
}
}
.pay-row:last-child {
border-bottom: none;
}
.pay-status {
background: #217aff;
color: #fff !important; //
border-radius: 24rpx;
padding: 4rpx 24rpx;
font-size: 24rpx;
&.pending {
background: #ff9800;
}
&.rejected {
background: #ff4d4f;
}
&.unpaid, &.approved {
background: #217aff;
}
&.paid {
background: #22c58b;
}
}
.pay-total {
font-weight: bold;
}
.pay-total-num {
color: #217aff;
font-size: 32rpx;
}
.pay-paytype {
gap: 16rpx;
}
.pay-label {
display: flex;
align-items: center;
}
.pay-icon {
width: 36rpx;
height: 36rpx;
margin-right: 20rpx;
}
.pay-paytype text {
margin-left: 0; /* 确保文字紧跟图标 */
}
.pay-radio-group {
display: flex;
flex-direction: column;
gap: 12rpx;
}
.pay-bottom-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(59,124,255,0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
display: flex;
flex-direction: column;
align-items: center;
}
.pay-bottom-tip {
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
margin-bottom: 18rpx;
}
.pay-bottom-clock-box {
width: 40rpx;
height: 40rpx;
border: 2rpx solid #217aff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 12rpx;
}
.pay-bottom-clock {
color: #217aff;
font-size: 28rpx;
}
.pay-bottom-tip-text {
color: #222;
}
.pay-bottom-time {
color: #217aff;
font-weight: bold;
}
.pay-bottom-btns {
display: flex;
gap: 24rpx;
justify-content: center;
width: 100%;
}
.pay-cancel-btn {
min-width: 240rpx;
height: 72rpx;
border-radius: 36rpx;
background: #f5f7fa;
color: #222;
font-size: 28rpx;
border: none;
outline: none;
&::after {
border: none;
}
}
.pay-pay-btn {
min-width: 320rpx;
height: 72rpx;
border-radius: 36rpx;
background: #217aff;
color: #fff;
font-size: 28rpx;
font-weight: 500;
border: none;
outline: none;
&::after {
border: none;
}
}
.pay-qrcode-box {
display: flex;
justify-content: center;
align-items: center;
margin: 32rpx 0;
}
.pay-qrcode-img {
width: 260rpx;
height: 260rpx;
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.06);
}
.pay-qrcode-tip {
text-align: center;
color: #888;
font-size: 26rpx;
margin-top: 12rpx;
}
.pay-detail-btn {
min-width: 240rpx;
height: 72rpx;
border-radius: 36rpx;
background: #e4f3fe;
color: #217aff;
font-size: 28rpx;
border: none;
outline: none;
&::after {
border: none;
}
}
</style>

@ -0,0 +1,465 @@
<template>
<view class="order-page">
<view class="fixed-nav">
<NavBar :title="title" />
</view>
<!-- 订单卡片列表 -->
<view class="order-list">
<template v-if="reservationList.length > 0">
<view v-for="item in reservationList" :key="item.id">
<!-- 已付款 -->
<view v-if="item.status === 'paid'" class="order-card purchased">
<view class="order-card-header">
<view class="status purchased"><span class="status-text">已付款</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions single-btn">
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
<!-- 待确认 -->
<view v-else-if="item.status === 'pending'" class="order-card pending">
<view class="order-card-header">
<view class="status pending"><span class="status-text">待确认</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions">
<button class="cancel-btn" :disabled="false" @click="onCancelOrder(item)"></button>
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
<!-- 已拒绝 -->
<view v-else-if="item.status === 'rejected'" class="order-card pending">
<view class="order-card-header">
<view class="status pending"><span class="status-text">已拒绝</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions">
<button class="cancel-btn" :disabled="false" @click="goReservation(item)"></button>
<button class="detail-btn" @click="onShowDetail(item)"></button>
</view>
</view>
<!-- 待支付 -->
<view v-else-if="item.status === 'unpaid' || item.status === 'approved'" class="order-card confirmed">
<view class="order-card-header">
<view class="status confirmed"><span class="status-text">待支付</span></view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="order-info">
<view class="flight">{{ item.ship ? item.ship.ship_number : '' }}</view>
<view class="desc"> {{ item.direction_name }} | {{ item.batch && item.batch.name ? item.batch.name : '-' }}</view>
</view>
<view class="order-actions">
<button class="detail-btn" @click="onShowDetail(item)"></button>
<button class="buy-btn" @click="goPayOrder(item)"></button>
</view>
</view>
</view>
</template>
<template v-else>
<view class="empty-box">
<image src="/static/empty.png" class="empty-img" mode="aspectFit" />
<view class="empty-text">暂无订单</view>
</view>
</template>
</view>
</view>
</template>
<script>
import { API } from '@/config/index.js'
import NavBar from '@/components/NavBar.vue'
export default {
name: 'OrderPage',
components: {
NavBar
},
data() {
return {
status: 'unpaid', // 0: , 1:
list: [],
page: 1,
title: '在线付款',
hasMore: true,
loading: false,
reservationStatusEnum: [],
reservationList: []
}
},
onLoad(options) {
if (options.status) {
if (options.status === 'paid') {
this.status = 'paid';
this.title = '排队过闸';
} else {
this.status = 'unpaid';
this.title = '在线付款';
}
}
},
onShow() {
this.fetchReservationStatusEnum().then(() => {
this.fetchReservationList();
});
},
methods: {
formatChinaDate(dateStr) {
if (!dateStr) return '';
// ISO Date
const date = new Date(dateStr);
//
// Date dateStr ISO
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
return `${y}-${m}-${d}`;
},
async fetchReservationStatusEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.RESERVATION_STATUS_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.reservationStatusEnum = res.data.data;
}
} catch (e) {
//
}
},
async fetchReservationList() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.RESERVATION_LIST}?token=${token}&status=${this.status}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.reservationList = res.data.data.data;
console.log(this.reservationList);
}
} catch (e) {
//
}
},
onCancelOrder(item) {
uni.showModal({
title: '提示',
content: '确定要取消该预约吗?',
confirmText: '确定',
cancelText: '再想想',
success: (res) => {
if (res.confirm) {
//
uni.showToast({ title: '已取消预约', icon: 'success' });
}
}
});
},
onShowDetail(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
},
goPayOrder(item) {
const itemString = JSON.stringify(item);
uni.navigateTo({ url: `/pages/order/pay_order_detail?item=${encodeURIComponent(itemString)}` });
},
goReservation(item) {
uni.navigateTo({ url: '/pages/reservation/index' });
}
}
}
</script>
<style scoped>
.order-page {
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 20px;
font-family: 'SourceHanSansCN', 'PingFang SC', 'Microsoft YaHei', sans-serif;
}
.header-title {
text-align: center;
font-size: 36rpx;
font-weight: bold;
padding-top: 7vh;
letter-spacing: 2rpx;
}
.fixed-nav {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
height: 90px;
}
.header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 16px 10px 16px;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
}
.back-btn, .more-btn {
font-size: 24px;
color: #333;
}
.title {
font-size: 22px;
font-weight: bold;
color: #222;
}
.order-list {
padding: 10px 0 0 0;
margin-top: 110px;
padding-bottom: 160rpx;
}
.order-card {
background: #fff;
border-radius: 10px;
margin: 0 16px 16px 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
padding: 18px 18px 12px 18px;
height: 340rpx;
}
.order-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.status {
font-size: 12px;
border-radius: 8rpx;
padding: 2px 8px;
color: #fff;
font-weight: 500;
display: inline-block;
transform: skewX(-20deg);
border: none;
}
.status-text {
display: inline-block;
transform: skewX(20deg);
}
.status.purchased { background: #22c58b; }
.status.pending { background: #ff9800; }
.status.confirmed { background: #217aff; }
.status.cancelled { background: #bdbdbd; }
.date { color: #173766; font-size: 15px; }
.order-info {
margin-bottom: 24px;
}
.flight {
font-size: 16px;
font-weight: 500;
margin-top: 12px;
}
.desc {
color: #888;
font-size: 14px;
margin-top: 10px;
}
.order-actions {
display: flex;
gap: 12px;
}
button {
flex: 1;
border-radius: 4px;
padding: 8px 0;
font-size: 16px;
margin: 0;
}
.detail-btn {
background: #e4f3fe;
color: #217aff;
height: 69rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
margin-left: auto;
}
.order-actions.single-btn {
justify-content: flex-end;
}
.order-actions.single-btn .detail-btn {
flex: 0 0 auto;
width: 153px;
}
.buy-btn, .rebook-btn {
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%);
color: #fff;
height: 69rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.cancel-btn {
background: #ededed;
color: #bdbdbd;
height: 69rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.cancel-btn[disabled] {
opacity: 1;
}
.tabbar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
height: 60px;
background: #fff;
display: flex;
border-top: 1px solid #eaeaea;
z-index: 10;
}
.tab-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #888;
font-size: 14px;
}
.tab-item.active {
color: #217aff;
}
.icon {
font-size: 22px;
margin-bottom: 2px;
}
.detail-modal-mask {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
}
.detail-modal {
background: #fff;
border-radius: 20px;
padding: 64rpx 56rpx 48rpx 56rpx;
width: 90vw;
max-width: 500px;
min-height: 420px;
margin: 0 auto;
position: relative;
display: flex;
flex-direction: column;
}
.detail-modal-content {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
}
.modal-close {
position: absolute;
right: 24rpx;
top: 24rpx;
font-size: 44rpx;
color: #222;
z-index: 2;
cursor: pointer;
}
.modal-title {
font-size: 38rpx;
font-weight: bold;
margin-bottom: 40rpx;
text-align: left;
}
.modal-row {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 34rpx;
color: #222;
margin-bottom: 36rpx;
}
.modal-label {
color: #3b4a6b;
min-width: 180rpx;
font-size: 34rpx;
}
.modal-amount {
color: #217aff;
font-size: 32rpx;
font-weight: bold;
}
.modal-confirm-btn {
width: 160px !important;
height: 44px !important;
line-height: 44px !important;
border-radius: 12px !important;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%) !important;
color: #fff !important;
font-size: 18px !important;
font-weight: 500 !important;
margin: 40px auto 0 auto !important;
border: none !important;
outline: none !important;
display: block !important;
padding: 0 !important;
box-sizing: border-box !important;
text-align: center !important;
align-self: center !important;
flex-shrink: 0 !important;
flex-grow: 0 !important;
}
.empty-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-top: 120rpx;
}
.empty-img {
width: 320rpx;
height: 320rpx;
margin-bottom: 32rpx;
}
.empty-text {
color: #888;
font-size: 28rpx;
}
</style>

@ -27,6 +27,10 @@
<view class="card">
<view class="card-title">船舶信息</view>
<view class="info-list">
<view class="info-row">
<text class="info-label">编号</text>
<view class="info-value">{{ currentShip.ship_number }} <text class="arrow"></text></view>
</view>
<view class="info-row">
<text class="info-label">总长度</text>
<view class="info-value">{{ currentShip.total_length }} <text class="arrow"></text></view>
@ -39,10 +43,7 @@
<text class="info-label">型深</text>
<view class="info-value">{{ currentShip.molded_depth }} <text class="arrow"></text></view>
</view>
<view class="info-row">
<text class="info-label">编号</text>
<view class="info-value">{{ currentShip.ship_number }} <text class="arrow"></text></view>
</view>
<view class="info-row">
<text class="info-label">载重</text>
<view class="info-value">{{ currentShip.total_tonnage }} <text class="arrow"></text></view>
@ -63,6 +64,23 @@
</view>
</view>
<!-- 过闸日期选择 -->
<view class="card">
<view class="card-title">过闸日期</view>
<view class="direction-row">
<button
class="direction-btn"
:class="{ active: gateDate === 'today' }"
@click="setGateDate('today')"
>今天</button>
<button
class="direction-btn"
:class="{ active: gateDate === 'tomorrow' }"
@click="setGateDate('tomorrow')"
>明天</button>
</view>
</view>
<!-- 预约须知 -->
<view class="notice-row">
<text class="notice-title">预约须知</text>
@ -98,7 +116,8 @@ export default {
ship_type: ''
},
shipTypeEnum: [],
agreeNotice: false
agreeNotice: false,
gateDate: 'today', // ""
}
},
onShow() {
@ -116,28 +135,25 @@ export default {
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.SHIP_INDEX}?token=${token}`,
url: `${API.AVAILABLE_SHIP}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.shipList = res.data.data;
if (!this.shipList || this.shipList.length === 0) {
uni.redirectTo({ url: '/pages/ship_manage/index' });
} else {
const first = this.shipList[0];
// this.ship = res.data.data;
this.currentShip = {
id: first.id,
total_length: first.total_length,
total_width: first.total_width,
molded_depth: first.molded_depth,
ship_number: first.ship_number,
total_tonnage: first.total_tonnage,
ship_type: first.ship_type
id: res.data.data.id,
total_length: res.data.data.total_length,
total_width: res.data.data.total_width,
molded_depth: res.data.data.molded_depth,
ship_number: res.data.data.ship_number,
total_tonnage: res.data.data.total_tonnage,
ship_type: res.data.data.ship_type
};
}
}
} catch (e) {
//
@ -156,7 +172,15 @@ export default {
});
});
if (res.data && res.data.errcode === 0) {
this.shipTypeEnum = res.data.data.ship_type || [];
const shipTypeRaw = res.data.data.ship_type || {};
if (Array.isArray(shipTypeRaw)) {
this.shipTypeEnum = shipTypeRaw;
} else {
this.shipTypeEnum = Object.keys(shipTypeRaw).map(label => ({
label,
value: shipTypeRaw[label]
}));
}
}
} catch (e) {
//
@ -183,6 +207,18 @@ export default {
// direction: north->in, south->out
const directionMap = { north: 'in', south: 'out' };
const directionValue = directionMap[this.direction] || 'in';
//
let gateDateStr = '';
const today = new Date();
if (this.gateDate === 'today') {
gateDateStr = today.toISOString().slice(0, 10);
} else if (this.gateDate === 'tomorrow') {
const tomorrow = new Date(today);
tomorrow.setDate(today.getDate() + 1);
gateDateStr = tomorrow.toISOString().slice(0, 10);
}
uni.showLoading({ title: '提交中...' });
uni.request({
url: `${API.RESERVATION_CREATE}`,
@ -190,16 +226,18 @@ export default {
data: {
token,
ship_id: this.currentShip.id,
direction: directionValue
direction: directionValue,
passage_date: gateDateStr
},
success: (res) => {
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '预约成功', icon: 'success' });
setTimeout(() => {
uni.switchTab({ url: '/pages/index/index' });
uni.switchTab({ url: '/pages/order/index' });
}, 800);
} else {
uni.hideLoading();
uni.showToast({ title: res.data.errmsg || '预约失败', icon: 'none' });
}
},
@ -211,7 +249,10 @@ export default {
},
toggleAgreeNotice() {
this.agreeNotice = !this.agreeNotice;
}
},
setGateDate(val) {
this.gateDate = val;
},
}
}
</script>
@ -411,4 +452,8 @@ export default {
.reservation-scroll {
padding-bottom: 80rpx;
}
.date-btn.active {
background: #217aff;
color: #fff;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -6,6 +6,8 @@
"pages/my/index",
"pages/order/index",
"pages/order/pay_order",
"pages/order/pay_order_detail",
"pages/order/pay_order_list",
"pages/message/index",
"pages/reservation/index",
"pages/index/ship_detail",

File diff suppressed because one or more lines are too long

@ -1,10 +1,10 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["components/NavBar"],{314:function(n,t,e){"use strict";e.r(t);var r=e(315),u=e(317);for(var c in u)["default"].indexOf(c)<0&&function(n){e.d(t,n,(function(){return u[n]}))}(c);e(319);var o,a=e(33),i=Object(a["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"0957edea",null,!1,r["components"],o);i.options.__file="components/NavBar.vue",t["default"]=i.exports},315:function(n,t,e){"use strict";e.r(t);var r=e(316);e.d(t,"render",(function(){return r["render"]})),e.d(t,"staticRenderFns",(function(){return r["staticRenderFns"]})),e.d(t,"recyclableRender",(function(){return r["recyclableRender"]})),e.d(t,"components",(function(){return r["components"]}))},316:function(n,t,e){"use strict";var r;e.r(t),e.d(t,"render",(function(){return u})),e.d(t,"staticRenderFns",(function(){return o})),e.d(t,"recyclableRender",(function(){return c})),e.d(t,"components",(function(){return r}));var u=function(){var n=this,t=n.$createElement;n._self._c},c=!1,o=[];u._withStripped=!0},317:function(n,t,e){"use strict";e.r(t);var r=e(318),u=e.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){e.d(t,n,(function(){return r[n]}))}(c);t["default"]=u.a},318:function(n,t,e){"use strict";(function(n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var e={props:{title:{type:String,default:""}},data:function(){return{statusBarHeight:0}},mounted:function(){this.statusBarHeight=n.getSystemInfoSync().statusBarHeight||0},methods:{onBack:function(){console.log("onBack"),n.navigateBack()}}};t.default=e}).call(this,e(2)["default"])},319:function(n,t,e){"use strict";e.r(t);var r=e(320),u=e.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){e.d(t,n,(function(){return r[n]}))}(c);t["default"]=u.a},320:function(n,t,e){}}]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["components/NavBar"],{330:function(n,t,e){"use strict";e.r(t);var r=e(331),u=e(333);for(var c in u)["default"].indexOf(c)<0&&function(n){e.d(t,n,(function(){return u[n]}))}(c);e(335);var o,a=e(33),i=Object(a["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"0957edea",null,!1,r["components"],o);i.options.__file="components/NavBar.vue",t["default"]=i.exports},331:function(n,t,e){"use strict";e.r(t);var r=e(332);e.d(t,"render",(function(){return r["render"]})),e.d(t,"staticRenderFns",(function(){return r["staticRenderFns"]})),e.d(t,"recyclableRender",(function(){return r["recyclableRender"]})),e.d(t,"components",(function(){return r["components"]}))},332:function(n,t,e){"use strict";var r;e.r(t),e.d(t,"render",(function(){return u})),e.d(t,"staticRenderFns",(function(){return o})),e.d(t,"recyclableRender",(function(){return c})),e.d(t,"components",(function(){return r}));var u=function(){var n=this,t=n.$createElement;n._self._c},c=!1,o=[];u._withStripped=!0},333:function(n,t,e){"use strict";e.r(t);var r=e(334),u=e.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){e.d(t,n,(function(){return r[n]}))}(c);t["default"]=u.a},334:function(n,t,e){"use strict";(function(n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var e={props:{title:{type:String,default:""}},data:function(){return{statusBarHeight:0}},mounted:function(){this.statusBarHeight=n.getSystemInfoSync().statusBarHeight||0},methods:{onBack:function(){console.log("onBack"),n.navigateBack()}}};t.default=e}).call(this,e(2)["default"])},335:function(n,t,e){"use strict";e.r(t);var r=e(336),u=e.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){e.d(t,n,(function(){return r[n]}))}(c);t["default"]=u.a},336:function(n,t,e){}}]);
//# sourceMappingURL=../../.sourcemap/mp-weixin/components/NavBar.js.map
;(global["webpackJsonp"] = global["webpackJsonp"] || []).push([
'components/NavBar-create-component',
{
'components/NavBar-create-component':(function(module, exports, __webpack_require__){
__webpack_require__('2')['createComponent'](__webpack_require__(314))
__webpack_require__('2')['createComponent'](__webpack_require__(330))
})
},
[['components/NavBar-create-component']]

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/index"],{210:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var i=r(t(211));n.__webpack_require_UNI_MP_PLUGIN__=t,e(i.default)}).call(this,t(1)["default"],t(2)["createPage"])},211:function(n,e,t){"use strict";t.r(e);var r=t(212),i=t(214);for(var a in i)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return i[n]}))}(a);t(216);var u,o=t(33),c=Object(o["default"])(i["default"],r["render"],r["staticRenderFns"],!1,null,"57280228",null,!1,r["components"],u);c.options.__file="pages/index/index.vue",e["default"]=c.exports},212:function(n,e,t){"use strict";t.r(e);var r=t(213);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},213:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return i})),t.d(e,"staticRenderFns",(function(){return u})),t.d(e,"recyclableRender",(function(){return a})),t.d(e,"components",(function(){return r}));var i=function(){var n=this,e=n.$createElement;n._self._c},a=!1,u=[];i._withStripped=!0},214:function(n,e,t){"use strict";t.r(e);var r=t(215),i=t.n(r);for(var a in r)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(a);e["default"]=i.a},215:function(n,e,t){"use strict";(function(n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={name:"IndexPage",methods:{goReservation:function(){n.navigateTo({url:"/pages/reservation/index"})},goShipManager:function(){n.navigateTo({url:"/pages/index/ship_manage"})},goOrder:function(){n.navigateTo({url:"/pages/order/pay_order"})},goInvoiceManage:function(){n.navigateTo({url:"/pages/index/invoice_manage"})}}};e.default=t}).call(this,t(2)["default"])},216:function(n,e,t){"use strict";t.r(e);var r=t(217),i=t.n(r);for(var a in r)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(a);e["default"]=i.a},217:function(n,e,t){}},[[210,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/index"],{210:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var a=r(t(211));n.__webpack_require_UNI_MP_PLUGIN__=t,e(a.default)}).call(this,t(1)["default"],t(2)["createPage"])},211:function(n,e,t){"use strict";t.r(e);var r=t(212),a=t(214);for(var i in a)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return a[n]}))}(i);t(216);var u,o=t(33),c=Object(o["default"])(a["default"],r["render"],r["staticRenderFns"],!1,null,"57280228",null,!1,r["components"],u);c.options.__file="pages/index/index.vue",e["default"]=c.exports},212:function(n,e,t){"use strict";t.r(e);var r=t(213);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},213:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return a})),t.d(e,"staticRenderFns",(function(){return u})),t.d(e,"recyclableRender",(function(){return i})),t.d(e,"components",(function(){return r}));var a=function(){var n=this,e=n.$createElement;n._self._c},i=!1,u=[];a._withStripped=!0},214:function(n,e,t){"use strict";t.r(e);var r=t(215),a=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=a.a},215:function(n,e,t){"use strict";(function(n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={name:"IndexPage",methods:{goReservation:function(){n.navigateTo({url:"/pages/reservation/index"})},goWaitPass:function(){n.navigateTo({url:"/pages/order/pay_order_list?status=paid"})},goOrder:function(){n.navigateTo({url:"/pages/order/pay_order_list?status=unpaid"})},goInvoiceManage:function(){n.navigateTo({url:"/pages/index/invoice_manage"})}}};e.default=t}).call(this,t(2)["default"])},216:function(n,e,t){"use strict";t.r(e);var r=t(217),a=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=a.a},217:function(n,e,t){}},[[210,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/index.js.map

@ -1 +1 @@
<view class="home-container data-v-57280228"><view class="header-gradient data-v-57280228"><view class="header-title data-v-57280228">胥口枢纽闸站状态</view><view class="header-info data-v-57280228"><view class="info-item data-v-57280228"><text class="info-label data-v-57280228">今日水位:</text><text class="info-value data-v-57280228">4.2m</text></view><view class="info-item data-v-57280228"><text class="info-label data-v-57280228">水深:</text><text class="info-value data-v-57280228">3.8m</text></view><view class="info-item data-v-57280228"><text class="info-label data-v-57280228">限高:</text><text class="info-value data-v-57280228">7.5m</text></view></view><view class="batch-row-strict data-v-57280228"><view class="batch-col data-v-57280228"><text class="batch-num-strict data-v-57280228">2025040101</text><view class="batch-tag-strict orange data-v-57280228"><text class="tag-orange data-v-57280228">南向北</text>当前批次</view></view><view class="batch-divider-strict data-v-57280228"></view><view class="batch-col data-v-57280228"><text class="batch-num-strict data-v-57280228">2025040101</text><view class="batch-tag-strict orange data-v-57280228"><text class="tag-green data-v-57280228">南向北</text>当前批次</view></view></view></view><view class="process-card data-v-57280228"><view class="process-title-bar data-v-57280228"><text class="data-v-57280228">闸站流程</text></view><view class="process-flow data-v-57280228"><view class="process-step data-v-57280228"><image class="icon data-v-57280228" src="/static/icon_step_index1.png" mode="aspectFit"></image><text class="process-label data-v-57280228">先预约</text></view><view class="arrow data-v-57280228">></view><view class="process-step data-v-57280228"><image class="icon data-v-57280228" src="/static/icon_step_index2.png" mode="aspectFit"></image><text class="process-label data-v-57280228">购票</text></view><view class="arrow data-v-57280228">></view><view class="process-step data-v-57280228"><image class="icon data-v-57280228" src="/static/icon_step_index3.png" mode="aspectFit"></image><text class="process-label data-v-57280228">排队过闸</text></view></view></view><view class="card-grid data-v-57280228"><view data-event-opts="{{[['tap',[['goReservation',['$event']]]]]}}" class="func-card bg-green data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">过闸预约</text><text class="func-num data-v-57280228">2</text></view><view class="func-bg-icon clock data-v-57280228"></view></view><view data-event-opts="{{[['tap',[['goOrder',['$event']]]]]}}" class="func-card bg-blue data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">在线购票</text><text class="func-num data-v-57280228">30</text></view><view class="func-bg-icon ticket data-v-57280228"></view></view><view data-event-opts="{{[['tap',[['goShipManager',['$event']]]]]}}" class="func-card bg-orange data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">船只管理</text><text class="func-num data-v-57280228">6</text></view><view class="func-bg-icon ship data-v-57280228"></view></view><view data-event-opts="{{[['tap',[['goInvoiceManage',['$event']]]]]}}" class="func-card bg-purple data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">发票管理</text><text class="func-num data-v-57280228">20</text></view><view class="func-bg-icon invoice data-v-57280228"></view></view></view><view class="info-list data-v-57280228"><view class="info-item-row data-v-57280228"><view class="info-tag realtime data-v-57280228"><text class="info-tag-text data-v-57280228">实时</text></view><text class="info-text data-v-57280228">北向南2025040102准备过闸</text></view><view class="info-item-row data-v-57280228"><view class="info-tag notice data-v-57280228"><text class="info-tag-text data-v-57280228">公告</text></view><text class="info-text data-v-57280228">北向南2025040102准备过闸</text></view></view></view>
<view class="home-container data-v-57280228"><view class="header-gradient data-v-57280228"><view class="header-title data-v-57280228">胥口枢纽闸站状态</view><view class="header-info data-v-57280228"><view class="info-item data-v-57280228"><text class="info-label data-v-57280228">今日水位:</text><text class="info-value data-v-57280228">4.2m</text></view><view class="info-item data-v-57280228"><text class="info-label data-v-57280228">水深:</text><text class="info-value data-v-57280228">3.8m</text></view><view class="info-item data-v-57280228"><text class="info-label data-v-57280228">限高:</text><text class="info-value data-v-57280228">7.5m</text></view></view><view class="batch-row-strict data-v-57280228"><view class="batch-col data-v-57280228"><text class="batch-num-strict data-v-57280228">2025040101</text><view class="batch-tag-strict orange data-v-57280228"><text class="tag-orange data-v-57280228">南向北</text>当前批次</view></view><view class="batch-divider-strict data-v-57280228"></view><view class="batch-col data-v-57280228"><text class="batch-num-strict data-v-57280228">2025040101</text><view class="batch-tag-strict orange data-v-57280228"><text class="tag-green data-v-57280228">南向北</text>当前批次</view></view></view></view><view class="process-card data-v-57280228"><view class="process-title-bar data-v-57280228"><text class="data-v-57280228">闸站流程</text></view><view class="process-flow data-v-57280228"><view class="process-step data-v-57280228"><image class="icon data-v-57280228" src="/static/icon_step_index1.png" mode="aspectFit"></image><text class="process-label data-v-57280228">先预约</text></view><view class="arrow data-v-57280228">></view><view class="process-step data-v-57280228"><image class="icon data-v-57280228" src="/static/icon_step_index2.png" mode="aspectFit"></image><text class="process-label data-v-57280228">购票</text></view><view class="arrow data-v-57280228">></view><view class="process-step data-v-57280228"><image class="icon data-v-57280228" src="/static/icon_step_index3.png" mode="aspectFit"></image><text class="process-label data-v-57280228">排队过闸</text></view></view></view><view class="card-grid data-v-57280228"><view data-event-opts="{{[['tap',[['goReservation',['$event']]]]]}}" class="func-card bg-green data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">过闸预约</text><text class="func-num data-v-57280228">2</text></view><view class="func-bg-icon clock data-v-57280228"></view></view><view data-event-opts="{{[['tap',[['goOrder',['$event']]]]]}}" class="func-card bg-blue data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">在线付款</text><text class="func-num data-v-57280228">30</text></view><view class="func-bg-icon ticket data-v-57280228"></view></view><view data-event-opts="{{[['tap',[['goWaitPass',['$event']]]]]}}" class="func-card bg-orange data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">排队过闸</text><text class="func-num data-v-57280228">6</text></view><view class="func-bg-icon ship data-v-57280228"></view></view><view data-event-opts="{{[['tap',[['goInvoiceManage',['$event']]]]]}}" class="func-card bg-purple data-v-57280228" bindtap="__e"><view class="func-card-content data-v-57280228"><text class="func-title data-v-57280228">申请开票</text><text class="func-num data-v-57280228">20</text></view><view class="func-bg-icon invoice data-v-57280228"></view></view></view><view class="info-list data-v-57280228"><view class="info-item-row data-v-57280228"><view class="info-tag realtime data-v-57280228"><text class="info-tag-text data-v-57280228">实时</text></view><text class="info-text data-v-57280228">北向南2025040102准备过闸</text></view><view class="info-item-row data-v-57280228"><view class="info-tag notice data-v-57280228"><text class="info-tag-text data-v-57280228">公告</text></view><text class="info-text data-v-57280228">北向南2025040102准备过闸</text></view></view></view>

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/invoice_detail"],{290:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var c=r(t(291));n.__webpack_require_UNI_MP_PLUGIN__=t,e(c.default)}).call(this,t(1)["default"],t(2)["createPage"])},291:function(n,e,t){"use strict";t.r(e);var r=t(292),c=t(294);for(var i in c)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return c[n]}))}(i);t(296);var u,o=t(33),a=Object(o["default"])(c["default"],r["render"],r["staticRenderFns"],!1,null,"c6ced70e",null,!1,r["components"],u);a.options.__file="pages/index/invoice_detail.vue",e["default"]=a.exports},292:function(n,e,t){"use strict";t.r(e);var r=t(293);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},293:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return c})),t.d(e,"staticRenderFns",(function(){return u})),t.d(e,"recyclableRender",(function(){return i})),t.d(e,"components",(function(){return r}));var c=function(){var n=this,e=n.$createElement;n._self._c},i=!1,u=[];c._withStripped=!0},294:function(n,e,t){"use strict";t.r(e);var r=t(295),c=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=c.a},295:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=function(){t.e("components/NavBar").then(function(){return resolve(t(314))}.bind(null,t)).catch(t.oe)},c={name:"InvoiceManagePage",components:{NavBar:r},data:function(){return{form:{titleTypeIndex:0,title:"",taxNo:""},titleTypeOptions:["企业单位","个人/非企业单位"]}},methods:{}};e.default=c},296:function(n,e,t){"use strict";t.r(e);var r=t(297),c=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=c.a},297:function(n,e,t){}},[[290,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/invoice_detail"],{306:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var c=r(t(307));n.__webpack_require_UNI_MP_PLUGIN__=t,e(c.default)}).call(this,t(1)["default"],t(2)["createPage"])},307:function(n,e,t){"use strict";t.r(e);var r=t(308),c=t(310);for(var i in c)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return c[n]}))}(i);t(312);var u,o=t(33),a=Object(o["default"])(c["default"],r["render"],r["staticRenderFns"],!1,null,"c6ced70e",null,!1,r["components"],u);a.options.__file="pages/index/invoice_detail.vue",e["default"]=a.exports},308:function(n,e,t){"use strict";t.r(e);var r=t(309);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},309:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return c})),t.d(e,"staticRenderFns",(function(){return u})),t.d(e,"recyclableRender",(function(){return i})),t.d(e,"components",(function(){return r}));var c=function(){var n=this,e=n.$createElement;n._self._c},i=!1,u=[];c._withStripped=!0},310:function(n,e,t){"use strict";t.r(e);var r=t(311),c=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=c.a},311:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=function(){t.e("components/NavBar").then(function(){return resolve(t(330))}.bind(null,t)).catch(t.oe)},c={name:"InvoiceManagePage",components:{NavBar:r},data:function(){return{form:{titleTypeIndex:0,title:"",taxNo:""},titleTypeOptions:["企业单位","个人/非企业单位"]}},methods:{}};e.default=c},312:function(n,e,t){"use strict";t.r(e);var r=t(313),c=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=c.a},313:function(n,e,t){}},[[306,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/invoice_detail.js.map

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/invoice_issue"],{298:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var u=r(t(299));n.__webpack_require_UNI_MP_PLUGIN__=t,e(u.default)}).call(this,t(1)["default"],t(2)["createPage"])},299:function(n,e,t){"use strict";t.r(e);var r=t(300),u=t(302);for(var i in u)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return u[n]}))}(i);t(304);var c,o=t(33),a=Object(o["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"3b486ae1",null,!1,r["components"],c);a.options.__file="pages/index/invoice_issue.vue",e["default"]=a.exports},300:function(n,e,t){"use strict";t.r(e);var r=t(301);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},301:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return u})),t.d(e,"staticRenderFns",(function(){return c})),t.d(e,"recyclableRender",(function(){return i})),t.d(e,"components",(function(){return r}));var u=function(){var n=this,e=n.$createElement;n._self._c},i=!1,c=[];u._withStripped=!0},302:function(n,e,t){"use strict";t.r(e);var r=t(303),u=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=u.a},303:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=function(){t.e("components/NavBar").then(function(){return resolve(t(314))}.bind(null,t)).catch(t.oe)},u={name:"InvoiceManagePage",components:{NavBar:r},data:function(){return{form:{titleTypeIndex:0,title:"",taxNo:""},titleTypeOptions:["企业单位","个人/非企业单位"]}},methods:{}};e.default=u},304:function(n,e,t){"use strict";t.r(e);var r=t(305),u=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=u.a},305:function(n,e,t){}},[[298,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/invoice_issue"],{314:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var u=r(t(315));n.__webpack_require_UNI_MP_PLUGIN__=t,e(u.default)}).call(this,t(1)["default"],t(2)["createPage"])},315:function(n,e,t){"use strict";t.r(e);var r=t(316),u=t(318);for(var i in u)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return u[n]}))}(i);t(320);var c,o=t(33),a=Object(o["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"3b486ae1",null,!1,r["components"],c);a.options.__file="pages/index/invoice_issue.vue",e["default"]=a.exports},316:function(n,e,t){"use strict";t.r(e);var r=t(317);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},317:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return u})),t.d(e,"staticRenderFns",(function(){return c})),t.d(e,"recyclableRender",(function(){return i})),t.d(e,"components",(function(){return r}));var u=function(){var n=this,e=n.$createElement;n._self._c},i=!1,c=[];u._withStripped=!0},318:function(n,e,t){"use strict";t.r(e);var r=t(319),u=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=u.a},319:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=function(){t.e("components/NavBar").then(function(){return resolve(t(330))}.bind(null,t)).catch(t.oe)},u={name:"InvoiceManagePage",components:{NavBar:r},data:function(){return{form:{titleTypeIndex:0,title:"",taxNo:""},titleTypeOptions:["企业单位","个人/非企业单位"]}},methods:{}};e.default=u},320:function(n,e,t){"use strict";t.r(e);var r=t(321),u=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=u.a},321:function(n,e,t){}},[[314,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/invoice_issue.js.map

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/invoice_manage"],{282:function(n,e,t){"use strict";(function(n,e){var i=t(4);t(26);i(t(25));var r=i(t(283));n.__webpack_require_UNI_MP_PLUGIN__=t,e(r.default)}).call(this,t(1)["default"],t(2)["createPage"])},283:function(n,e,t){"use strict";t.r(e);var i=t(284),r=t(286);for(var a in r)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(a);t(288);var o,u=t(33),c=Object(u["default"])(r["default"],i["render"],i["staticRenderFns"],!1,null,"6f086f8d",null,!1,i["components"],o);c.options.__file="pages/index/invoice_manage.vue",e["default"]=c.exports},284:function(n,e,t){"use strict";t.r(e);var i=t(285);t.d(e,"render",(function(){return i["render"]})),t.d(e,"staticRenderFns",(function(){return i["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return i["recyclableRender"]})),t.d(e,"components",(function(){return i["components"]}))},285:function(n,e,t){"use strict";var i;t.r(e),t.d(e,"render",(function(){return r})),t.d(e,"staticRenderFns",(function(){return o})),t.d(e,"recyclableRender",(function(){return a})),t.d(e,"components",(function(){return i}));var r=function(){var n=this,e=n.$createElement,t=(n._self._c,n.__map(n.invoiceList,(function(e,t){var i=n.__get_orig(e),r=e.amount.toFixed(2);return{$orig:i,g0:r}})));n._isMounted||(n.e0=function(e,t){var i=arguments[arguments.length-1].currentTarget.dataset,r=i.eventParams||i["event-params"];t=r.item;"issued"===t.status?n.viewInvoice(t):n.issueInvoice(t)}),n.$mp.data=Object.assign({},{$root:{l0:t}})},a=!1,o=[];r._withStripped=!0},286:function(n,e,t){"use strict";t.r(e);var i=t(287),r=t.n(i);for(var a in i)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return i[n]}))}(a);e["default"]=r.a},287:function(n,e,t){"use strict";(function(n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var i=function(){t.e("components/NavBar").then(function(){return resolve(t(314))}.bind(null,t)).catch(t.oe)},r={name:"InvoiceManagePage",components:{NavBar:i},data:function(){return{invoiceList:[{id:1,status:"issued",date:"2024-01-15",name:"北向南过闸",amount:120,batchNo:"2025040101"},{id:2,status:"pending",date:"2024-01-15",name:"北向南过闸",amount:120,batchNo:"2025040101"}]}},methods:{viewInvoice:function(e){n.navigateTo({url:"/pages/index/invoice_detail?id=".concat(e.id)})},issueInvoice:function(e){n.navigateTo({url:"/pages/index/invoice_issue?id=".concat(e.id)})}}};e.default=r}).call(this,t(2)["default"])},288:function(n,e,t){"use strict";t.r(e);var i=t(289),r=t.n(i);for(var a in i)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return i[n]}))}(a);e["default"]=r.a},289:function(n,e,t){}},[[282,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/invoice_manage"],{298:function(n,e,t){"use strict";(function(n,e){var i=t(4);t(26);i(t(25));var r=i(t(299));n.__webpack_require_UNI_MP_PLUGIN__=t,e(r.default)}).call(this,t(1)["default"],t(2)["createPage"])},299:function(n,e,t){"use strict";t.r(e);var i=t(300),r=t(302);for(var a in r)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(a);t(304);var o,u=t(33),c=Object(u["default"])(r["default"],i["render"],i["staticRenderFns"],!1,null,"6f086f8d",null,!1,i["components"],o);c.options.__file="pages/index/invoice_manage.vue",e["default"]=c.exports},300:function(n,e,t){"use strict";t.r(e);var i=t(301);t.d(e,"render",(function(){return i["render"]})),t.d(e,"staticRenderFns",(function(){return i["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return i["recyclableRender"]})),t.d(e,"components",(function(){return i["components"]}))},301:function(n,e,t){"use strict";var i;t.r(e),t.d(e,"render",(function(){return r})),t.d(e,"staticRenderFns",(function(){return o})),t.d(e,"recyclableRender",(function(){return a})),t.d(e,"components",(function(){return i}));var r=function(){var n=this,e=n.$createElement,t=(n._self._c,n.__map(n.invoiceList,(function(e,t){var i=n.__get_orig(e),r=e.amount.toFixed(2);return{$orig:i,g0:r}})));n._isMounted||(n.e0=function(e,t){var i=arguments[arguments.length-1].currentTarget.dataset,r=i.eventParams||i["event-params"];t=r.item;"issued"===t.status?n.viewInvoice(t):n.issueInvoice(t)}),n.$mp.data=Object.assign({},{$root:{l0:t}})},a=!1,o=[];r._withStripped=!0},302:function(n,e,t){"use strict";t.r(e);var i=t(303),r=t.n(i);for(var a in i)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return i[n]}))}(a);e["default"]=r.a},303:function(n,e,t){"use strict";(function(n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var i=function(){t.e("components/NavBar").then(function(){return resolve(t(330))}.bind(null,t)).catch(t.oe)},r={name:"InvoiceManagePage",components:{NavBar:i},data:function(){return{invoiceList:[{id:1,status:"issued",date:"2024-01-15",name:"北向南过闸",amount:120,batchNo:"2025040101"},{id:2,status:"pending",date:"2024-01-15",name:"北向南过闸",amount:120,batchNo:"2025040101"}]}},methods:{viewInvoice:function(e){n.navigateTo({url:"/pages/index/invoice_detail?id=".concat(e.id)})},issueInvoice:function(e){n.navigateTo({url:"/pages/index/invoice_issue?id=".concat(e.id)})}}};e.default=r}).call(this,t(2)["default"])},304:function(n,e,t){"use strict";t.r(e);var i=t(305),r=t.n(i);for(var a in i)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return i[n]}))}(a);e["default"]=r.a},305:function(n,e,t){}},[[298,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/invoice_manage.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -208,6 +208,34 @@
display: flex;
align-items: center;
}
/* 船舶类型特殊样式 */
.fee-type-group.data-v-06a59818 {
display: flex;
flex-direction: column;
gap: 24rpx;
margin-left: 24rpx;
width: 100%;
}
.fee-type-item.data-v-06a59818 {
display: flex;
align-items: flex-start;
width: 100%;
}
.fee-type-info.data-v-06a59818 {
display: flex;
flex-direction: column;
margin-left: 8rpx;
flex: 1;
}
.fee-type-label.data-v-06a59818 {
font-size: 28rpx;
color: #222;
}
.fee-type-desc.data-v-06a59818 {
font-size: 24rpx;
color: #888;
margin-top: 4rpx;
}
.info-title-row.data-v-06a59818 {
display: flex;
justify-content: space-between;

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/ship_detail"],{274:function(t,e,n){"use strict";(function(t,e){var i=n(4);n(26);i(n(25));var o=i(n(275));t.__webpack_require_UNI_MP_PLUGIN__=n,e(o.default)}).call(this,n(1)["default"],n(2)["createPage"])},275:function(t,e,n){"use strict";n.r(e);var i=n(276),o=n(278);for(var a in o)["default"].indexOf(a)<0&&function(t){n.d(e,t,(function(){return o[t]}))}(a);n(280);var r,c=n(33),s=Object(c["default"])(o["default"],i["render"],i["staticRenderFns"],!1,null,"bbc5a964",null,!1,i["components"],r);s.options.__file="pages/index/ship_detail.vue",e["default"]=s.exports},276:function(t,e,n){"use strict";n.r(e);var i=n(277);n.d(e,"render",(function(){return i["render"]})),n.d(e,"staticRenderFns",(function(){return i["staticRenderFns"]})),n.d(e,"recyclableRender",(function(){return i["recyclableRender"]})),n.d(e,"components",(function(){return i["components"]}))},277:function(t,e,n){"use strict";var i;n.r(e),n.d(e,"render",(function(){return o})),n.d(e,"staticRenderFns",(function(){return r})),n.d(e,"recyclableRender",(function(){return a})),n.d(e,"components",(function(){return i}));var o=function(){var t=this,e=t.$createElement,n=(t._self._c,t.ship?t.getFileUrl(t.ship.picture1):null),i=t.ship?t.getFileUrl(t.ship.picture2):null,o=t.ship?t.getFileUrl(t.ship.picture3):null;t.$mp.data=Object.assign({},{$root:{m0:n,m1:i,m2:o}})},a=!1,r=[];o._withStripped=!0},278:function(t,e,n){"use strict";n.r(e);var i=n(279),o=n.n(i);for(var a in i)["default"].indexOf(a)<0&&function(t){n.d(e,t,(function(){return i[t]}))}(a);e["default"]=o.a},279:function(t,e,n){"use strict";(function(t){var i=n(4);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=i(n(44)),a=i(n(46)),r=n(30),c=function(){n.e("components/NavBar").then(function(){return resolve(n(314))}.bind(null,n)).catch(n.oe)},s={name:"ShipDetailPage",components:{NavBar:c},data:function(){return{ship:null,id:null}},onLoad:function(t){if(this.id=t.id,t.item)try{this.ship=JSON.parse(decodeURIComponent(t.item))}catch(e){this.ship=null}this.fetchShipDetail()},methods:{fetchShipDetail:function(){var e=this;return(0,a.default)(o.default.mark((function n(){var i,a;return o.default.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(i=t.getStorageSync("token"),i){n.next=4;break}return t.showToast({title:"请先登录",icon:"none"}),n.abrupt("return");case 4:return t.showLoading({title:"加载中..."}),n.prev=5,n.next=8,new Promise((function(n,o){t.request({url:"".concat(r.API.SHIP_DETAIL,"/").concat(e.id),method:"GET",data:{token:i},success:n,fail:o})}));case 8:a=n.sent,t.hideLoading(),a.data&&0===a.data.errcode?e.ship=a.data.data:t.showToast({title:a.data.errmsg||"获取失败",icon:"none"}),n.next=17;break;case 13:n.prev=13,n.t0=n["catch"](5),t.hideLoading(),t.showToast({title:n.t0.message||"网络错误",icon:"none"});case 17:case"end":return n.stop()}}),n,null,[[5,13]])})))()},getFileUrl:function(t){return t?"".concat(r.API.BASE_URL,"/api/customer/upload-file/preview?id=").concat(t):""},onEdit:function(){if(this.ship){var e=encodeURIComponent(JSON.stringify(this.ship));t.navigateTo({url:"/pages/index/ship_add?edit=1&ship=".concat(e)})}},onDelete:function(){var e=this,n=t.getStorageSync("token");n?this.ship&&this.ship.id?t.showModal({title:"提示",content:"确定要删除该船舶吗?",success:function(i){i.confirm&&(t.showLoading({title:"删除中..."}),t.request({url:"".concat(r.API.SHIP_DELETE,"/").concat(e.ship.id,"?token=").concat(n),method:"POST",data:{},header:{"content-type":"application/json"},success:function(e){t.hideLoading(),e.data&&0===e.data.errcode?(t.showToast({title:"删除成功",icon:"success"}),setTimeout((function(){t.navigateBack()}),1e3)):t.showToast({title:e.data.errmsg||"删除失败",icon:"none"})},fail:function(e){t.hideLoading(),t.showToast({title:"网络错误",icon:"none"})}}))}}):t.showToast({title:"无效的船舶信息",icon:"none"}):t.showToast({title:"请先登录",icon:"none"})}}};e.default=s}).call(this,n(2)["default"])},280:function(t,e,n){"use strict";n.r(e);var i=n(281),o=n.n(i);for(var a in i)["default"].indexOf(a)<0&&function(t){n.d(e,t,(function(){return i[t]}))}(a);e["default"]=o.a},281:function(t,e,n){}},[[274,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/ship_detail"],{290:function(t,e,n){"use strict";(function(t,e){var i=n(4);n(26);i(n(25));var o=i(n(291));t.__webpack_require_UNI_MP_PLUGIN__=n,e(o.default)}).call(this,n(1)["default"],n(2)["createPage"])},291:function(t,e,n){"use strict";n.r(e);var i=n(292),o=n(294);for(var a in o)["default"].indexOf(a)<0&&function(t){n.d(e,t,(function(){return o[t]}))}(a);n(296);var r,c=n(33),s=Object(c["default"])(o["default"],i["render"],i["staticRenderFns"],!1,null,"bbc5a964",null,!1,i["components"],r);s.options.__file="pages/index/ship_detail.vue",e["default"]=s.exports},292:function(t,e,n){"use strict";n.r(e);var i=n(293);n.d(e,"render",(function(){return i["render"]})),n.d(e,"staticRenderFns",(function(){return i["staticRenderFns"]})),n.d(e,"recyclableRender",(function(){return i["recyclableRender"]})),n.d(e,"components",(function(){return i["components"]}))},293:function(t,e,n){"use strict";var i;n.r(e),n.d(e,"render",(function(){return o})),n.d(e,"staticRenderFns",(function(){return r})),n.d(e,"recyclableRender",(function(){return a})),n.d(e,"components",(function(){return i}));var o=function(){var t=this,e=t.$createElement,n=(t._self._c,t.ship?t.getFileUrl(t.ship.picture1):null),i=t.ship?t.getFileUrl(t.ship.picture2):null,o=t.ship?t.getFileUrl(t.ship.picture3):null;t.$mp.data=Object.assign({},{$root:{m0:n,m1:i,m2:o}})},a=!1,r=[];o._withStripped=!0},294:function(t,e,n){"use strict";n.r(e);var i=n(295),o=n.n(i);for(var a in i)["default"].indexOf(a)<0&&function(t){n.d(e,t,(function(){return i[t]}))}(a);e["default"]=o.a},295:function(t,e,n){"use strict";(function(t){var i=n(4);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var o=i(n(44)),a=i(n(46)),r=n(30),c=function(){n.e("components/NavBar").then(function(){return resolve(n(330))}.bind(null,n)).catch(n.oe)},s={name:"ShipDetailPage",components:{NavBar:c},data:function(){return{ship:null,id:null}},onLoad:function(t){if(this.id=t.id,t.item)try{this.ship=JSON.parse(decodeURIComponent(t.item))}catch(e){this.ship=null}this.fetchShipDetail()},methods:{fetchShipDetail:function(){var e=this;return(0,a.default)(o.default.mark((function n(){var i,a;return o.default.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(i=t.getStorageSync("token"),i){n.next=4;break}return t.showToast({title:"请先登录",icon:"none"}),n.abrupt("return");case 4:return t.showLoading({title:"加载中..."}),n.prev=5,n.next=8,new Promise((function(n,o){t.request({url:"".concat(r.API.SHIP_DETAIL,"/").concat(e.id),method:"GET",data:{token:i},success:n,fail:o})}));case 8:a=n.sent,t.hideLoading(),a.data&&0===a.data.errcode?e.ship=a.data.data:t.showToast({title:a.data.errmsg||"获取失败",icon:"none"}),n.next=17;break;case 13:n.prev=13,n.t0=n["catch"](5),t.hideLoading(),t.showToast({title:n.t0.message||"网络错误",icon:"none"});case 17:case"end":return n.stop()}}),n,null,[[5,13]])})))()},getFileUrl:function(t){return t?"".concat(r.API.BASE_URL,"/api/customer/upload-file/preview?id=").concat(t):""},onEdit:function(){if(this.ship){var e=encodeURIComponent(JSON.stringify(this.ship));t.navigateTo({url:"/pages/index/ship_add?edit=1&ship=".concat(e)})}},onDelete:function(){var e=this,n=t.getStorageSync("token");n?this.ship&&this.ship.id?t.showModal({title:"提示",content:"确定要删除该船舶吗?",success:function(i){i.confirm&&(t.showLoading({title:"删除中..."}),t.request({url:"".concat(r.API.SHIP_DELETE,"/").concat(e.ship.id,"?token=").concat(n),method:"POST",data:{},header:{"content-type":"application/json"},success:function(e){t.hideLoading(),e.data&&0===e.data.errcode?(t.showToast({title:"删除成功",icon:"success"}),setTimeout((function(){t.navigateBack()}),1e3)):t.showToast({title:e.data.errmsg||"删除失败",icon:"none"})},fail:function(e){t.hideLoading(),t.showToast({title:"网络错误",icon:"none"})}}))}}):t.showToast({title:"无效的船舶信息",icon:"none"}):t.showToast({title:"请先登录",icon:"none"})}}};e.default=s}).call(this,n(2)["default"])},296:function(t,e,n){"use strict";n.r(e);var i=n(297),o=n.n(i);for(var a in i)["default"].indexOf(a)<0&&function(t){n.d(e,t,(function(){return i[t]}))}(a);e["default"]=o.a},297:function(t,e,n){}},[[290,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/ship_detail.js.map

@ -1 +1 @@
<view class="ship-detail-bg data-v-bbc5a964"><view class="fixed-nav data-v-bbc5a964"><nav-bar vue-id="bcee8110-1" title="船舶详情" class="data-v-bbc5a964" bind:__l="__l"></nav-bar></view><view class="content-area data-v-bbc5a964"><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">基本信息</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船舶所有人</text><text class="data-v-bbc5a964">{{ship.owner_name}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">身份证号</text><text class="data-v-bbc5a964">{{ship.id_card}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">联系电话</text><text class="data-v-bbc5a964">{{ship.phone}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船舶编号</text><text class="data-v-bbc5a964">{{ship.ship_number}}</text></view></view></block><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">船舶参数</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">总吨位</text><text class="data-v-bbc5a964">{{ship.total_tonnage}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">总长度</text><text class="data-v-bbc5a964">{{ship.total_length}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">总宽</text><text class="data-v-bbc5a964">{{ship.total_width}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">型深</text><text class="data-v-bbc5a964">{{ship.molded_depth}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">吨位等级</text><text class="data-v-bbc5a964">{{ship.tonnage_class}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船型</text><text class="data-v-bbc5a964">{{ship.ship_type}}</text></view></view></block><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">船检簿</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第一页</text><image style="width:80px;height:80px;" src="{{$root.m0}}" mode="aspectFill" class="data-v-bbc5a964"></image></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第二页</text><image style="width:80px;height:80px;" src="{{$root.m1}}" mode="aspectFill" class="data-v-bbc5a964"></image></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第三页</text><image style="width:80px;height:80px;" src="{{$root.m2}}" mode="aspectFill" class="data-v-bbc5a964"></image></view></view></block><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">签名确认</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">签名声明</text><text class="data-v-bbc5a964">本人承诺所提供材料皆真实有效;如有虚假,本人承担因此造成的全部责任。</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">签名图片</text><image style="width:120px;height:60px;" src="{{'data:image/png;base64,'+ship.signature}}" mode="aspectFit" class="data-v-bbc5a964"></image></view></view></block></view><view class="fixed-bottom-btn-bar data-v-bbc5a964"><button data-event-opts="{{[['tap',[['onDelete',['$event']]]]]}}" class="delete-btn data-v-bbc5a964" bindtap="__e">删除</button><button data-event-opts="{{[['tap',[['onEdit',['$event']]]]]}}" class="edit-btn data-v-bbc5a964" bindtap="__e">编辑</button></view></view>
<view class="ship-detail-bg data-v-bbc5a964"><view class="fixed-nav data-v-bbc5a964"><nav-bar vue-id="bcee8110-1" title="船舶详情" class="data-v-bbc5a964" bind:__l="__l"></nav-bar></view><view class="content-area data-v-bbc5a964"><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">基本信息</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船舶所有人</text><text class="data-v-bbc5a964">{{ship.owner_name}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">身份证号</text><text class="data-v-bbc5a964">{{ship.id_card}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">联系电话</text><text class="data-v-bbc5a964">{{ship.phone}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船舶编号</text><text class="data-v-bbc5a964">{{ship.ship_number}}</text></view></view></block><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">船舶参数</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">总吨位</text><text class="data-v-bbc5a964">{{ship.total_tonnage}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">总长度</text><text class="data-v-bbc5a964">{{ship.total_length}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">总宽</text><text class="data-v-bbc5a964">{{ship.total_width}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">型深</text><text class="data-v-bbc5a964">{{ship.molded_depth}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">吨位等级</text><text class="data-v-bbc5a964">{{ship.tonnage_class}}</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船型</text><text class="data-v-bbc5a964">{{ship.ship_type}}</text></view></view></block><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">船检簿</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第一页</text><image style="width:80px;height:80px;" src="{{$root.m0}}" mode="aspectFill" class="data-v-bbc5a964"></image></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第二页</text><image style="width:80px;height:80px;" src="{{$root.m1}}" mode="aspectFill" class="data-v-bbc5a964"></image></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第三页</text><image style="width:80px;height:80px;" src="{{$root.m2}}" mode="aspectFill" class="data-v-bbc5a964"></image></view></view></block><block wx:if="{{ship}}"><view class="ship-section data-v-bbc5a964"><view class="section-title data-v-bbc5a964">签名确认</view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">签名声明</text><text class="data-v-bbc5a964">本人承诺所提供材料皆真实有效;如有虚假,本人承担因此造成的全部责任。</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">签名图片</text><image style="width:120px;height:60px;" src="{{'data:image/png;base64,'+ship.signature}}" mode="aspectFit" class="data-v-bbc5a964"></image></view></view></block></view></view>

@ -87,7 +87,7 @@
}
.content-area.data-v-bbc5a964 {
padding-top: 90px;
padding-bottom: 70px;
padding-bottom: 20px;
}
.fixed-bottom-btn-bar.data-v-bbc5a964 {
position: fixed;

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/ship_manage"],{218:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var a=r(t(219));n.__webpack_require_UNI_MP_PLUGIN__=t,e(a.default)}).call(this,t(1)["default"],t(2)["createPage"])},219:function(n,e,t){"use strict";t.r(e);var r=t(220),a=t(222);for(var i in a)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return a[n]}))}(i);t(224);var o,c=t(33),u=Object(c["default"])(a["default"],r["render"],r["staticRenderFns"],!1,null,"748d0662",null,!1,r["components"],o);u.options.__file="pages/index/ship_manage.vue",e["default"]=u.exports},220:function(n,e,t){"use strict";t.r(e);var r=t(221);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},221:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return a})),t.d(e,"staticRenderFns",(function(){return o})),t.d(e,"recyclableRender",(function(){return i})),t.d(e,"components",(function(){return r}));var a=function(){var n=this,e=n.$createElement,t=(n._self._c,n.shipList.length);n.$mp.data=Object.assign({},{$root:{g0:t}})},i=!1,o=[];a._withStripped=!0},222:function(n,e,t){"use strict";t.r(e);var r=t(223),a=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=a.a},223:function(n,e,t){"use strict";(function(n){var r=t(4);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var a=r(t(44)),i=r(t(46)),o=t(30),c=function(){t.e("components/NavBar").then(function(){return resolve(t(314))}.bind(null,t)).catch(t.oe)},u={name:"ShipManagePage",components:{NavBar:c},data:function(){return{shipList:[]}},onLoad:function(){},onShow:function(){this.fetchShipList()},methods:{fetchShipList:function(){var e=this;return(0,i.default)(a.default.mark((function t(){var r,i;return a.default.wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(r=n.getStorageSync("token"),r){t.next=4;break}return n.showToast({title:"请先登录",icon:"none"}),t.abrupt("return");case 4:return n.showLoading({title:"加载中..."}),t.prev=5,console.log(o.API.SHIP_INDEX),t.next=9,new Promise((function(e,t){n.request({url:o.API.SHIP_INDEX,method:"GET",data:{token:r},success:e,fail:t})}));case 9:i=t.sent,n.hideLoading(),i.data&&0===i.data.errcode?e.shipList=i.data.data||[]:n.showToast({title:i.data.errmsg||"获取失败",icon:"none"}),t.next=18;break;case 14:t.prev=14,t.t0=t["catch"](5),n.hideLoading(),n.showToast({title:t.t0.message||"网络错误",icon:"none"});case 18:case"end":return t.stop()}}),t,null,[[5,14]])})))()},goAdd:function(){n.navigateTo({url:"/pages/index/ship_add"})},goDetail:function(e){var t=encodeURIComponent(JSON.stringify(e));n.navigateTo({url:"/pages/index/ship_detail?id=".concat(e.id,"&item=").concat(t)})}}};e.default=u}).call(this,t(2)["default"])},224:function(n,e,t){"use strict";t.r(e);var r=t(225),a=t.n(r);for(var i in r)["default"].indexOf(i)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(i);e["default"]=a.a},225:function(n,e,t){}},[[218,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/ship_manage"],{218:function(e,n,t){"use strict";(function(e,n){var o=t(4);t(26);o(t(25));var i=o(t(219));e.__webpack_require_UNI_MP_PLUGIN__=t,n(i.default)}).call(this,t(1)["default"],t(2)["createPage"])},219:function(e,n,t){"use strict";t.r(n);var o=t(220),i=t(222);for(var a in i)["default"].indexOf(a)<0&&function(e){t.d(n,e,(function(){return i[e]}))}(a);t(224);var r,c=t(33),s=Object(c["default"])(i["default"],o["render"],o["staticRenderFns"],!1,null,"748d0662",null,!1,o["components"],r);s.options.__file="pages/index/ship_manage.vue",n["default"]=s.exports},220:function(e,n,t){"use strict";t.r(n);var o=t(221);t.d(n,"render",(function(){return o["render"]})),t.d(n,"staticRenderFns",(function(){return o["staticRenderFns"]})),t.d(n,"recyclableRender",(function(){return o["recyclableRender"]})),t.d(n,"components",(function(){return o["components"]}))},221:function(e,n,t){"use strict";var o;t.r(n),t.d(n,"render",(function(){return i})),t.d(n,"staticRenderFns",(function(){return r})),t.d(n,"recyclableRender",(function(){return a})),t.d(n,"components",(function(){return o}));var i=function(){var e=this,n=e.$createElement,t=(e._self._c,e.shipList.length),o=e.shipList.length,i=e.shipList.length;e.$mp.data=Object.assign({},{$root:{g0:t,g1:o,g2:i}})},a=!1,r=[];i._withStripped=!0},222:function(e,n,t){"use strict";t.r(n);var o=t(223),i=t.n(o);for(var a in o)["default"].indexOf(a)<0&&function(e){t.d(n,e,(function(){return o[e]}))}(a);n["default"]=i.a},223:function(e,n,t){"use strict";(function(e){var o=t(4);Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var i=o(t(44)),a=o(t(46)),r=t(30),c=function(){t.e("components/NavBar").then(function(){return resolve(t(330))}.bind(null,t)).catch(t.oe)},s={name:"ShipManagePage",components:{NavBar:c},data:function(){return{shipList:[]}},onLoad:function(){},onShow:function(){this.fetchShipList()},methods:{fetchShipList:function(){var n=this;return(0,a.default)(i.default.mark((function t(){var o,a;return i.default.wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(o=e.getStorageSync("token"),o){t.next=4;break}return e.showToast({title:"请先登录",icon:"none"}),t.abrupt("return");case 4:return e.showLoading({title:"加载中..."}),t.prev=5,console.log(r.API.SHIP_INDEX),t.next=9,new Promise((function(n,t){e.request({url:r.API.SHIP_INDEX,method:"GET",data:{token:o},success:n,fail:t})}));case 9:a=t.sent,e.hideLoading(),a.data&&0===a.data.errcode?n.shipList=a.data.data||[]:e.showToast({title:a.data.errmsg||"获取失败",icon:"none"}),t.next=18;break;case 14:t.prev=14,t.t0=t["catch"](5),e.hideLoading(),e.showToast({title:t.t0.message||"网络错误",icon:"none"});case 18:case"end":return t.stop()}}),t,null,[[5,14]])})))()},goAdd:function(){e.navigateTo({url:"/pages/index/ship_add"})},goDetail:function(n){var t=encodeURIComponent(JSON.stringify(n));e.navigateTo({url:"/pages/index/ship_detail?id=".concat(n.id,"&item=").concat(t)})},getShipStatusText:function(e){return"pending"===e?"待审核":"rejected"===e?"已拒绝":"approved"===e?"已通过":""},getShipStatusClass:function(e){return"pending"===e?"pending":"rejected"===e?"rejected":"approved"===e?"approved":""},goEdit:function(n){var t=encodeURIComponent(JSON.stringify(n));e.navigateTo({url:"/pages/index/ship_add?edit=1&ship=".concat(t)})},onDelete:function(n){var t=this,o=e.getStorageSync("token");o?n&&n.id?e.showModal({title:"提示",content:"确定要删除该船舶吗?",success:function(i){i.confirm&&(e.showLoading({title:"删除中..."}),e.request({url:"".concat(r.API.SHIP_DELETE,"/").concat(n.id,"?token=").concat(o),method:"POST",data:{},header:{"content-type":"application/json"},success:function(n){e.hideLoading(),n.data&&0===n.data.errcode?(e.showToast({title:"删除成功",icon:"success"}),setTimeout((function(){t.fetchShipList()}),1e3)):e.showToast({title:n.data.errmsg||"删除失败",icon:"none"})},fail:function(n){e.hideLoading(),e.showToast({title:"网络错误",icon:"none"})}}))}}):e.showToast({title:"无效的船舶信息",icon:"none"}):e.showToast({title:"请先登录",icon:"none"})}}};n.default=s}).call(this,t(2)["default"])},224:function(e,n,t){"use strict";t.r(n);var o=t(225),i=t.n(o);for(var a in o)["default"].indexOf(a)<0&&function(e){t.d(n,e,(function(){return o[e]}))}(a);n["default"]=i.a},225:function(e,n,t){}},[[218,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/ship_manage.js.map

@ -1 +1 @@
<view class="reservation-page data-v-748d0662"><view class="fixed-nav data-v-748d0662"><nav-bar vue-id="1d1446e4-1" title="船只管理" class="data-v-748d0662" bind:__l="__l"></nav-bar></view><view class="content-area data-v-748d0662"><block wx:if="{{$root.g0>0}}"><view class="data-v-748d0662"><block wx:for="{{shipList}}" wx:for-item="item" wx:for-index="__i0__" wx:key="id"><view data-event-opts="{{[['tap',[['goDetail',['$0'],[[['shipList','id',item.id]]]]]]]}}" class="ship-cell data-v-748d0662" bindtap="__e"><view class="ship-title data-v-748d0662">船号:<text class="ship-no data-v-748d0662">{{item.ship_number}}</text></view><view class="ship-row data-v-748d0662">{{"所有人: "+item.owner_name}}</view><view class="ship-row data-v-748d0662">{{"联系电话: "+item.phone}}</view><view class="ship-row data-v-748d0662">{{"总吨位: "+item.total_tonnage+" 吨"}}</view></view></block></view></block><block wx:else><view class="empty-tip data-v-748d0662"><image class="empty-img data-v-748d0662" src="/static/images/empty.png" mode="aspectFit"></image><text class="empty-text data-v-748d0662">暂无船只信息</text></view></block></view><view class="fixed-bottom data-v-748d0662"><button data-event-opts="{{[['tap',[['goAdd',['$event']]]]]}}" class="add-cell-btn data-v-748d0662" bindtap="__e">添加</button></view></view>
<view class="reservation-page data-v-748d0662"><view class="fixed-nav data-v-748d0662"><nav-bar vue-id="1d1446e4-1" title="船只管理" class="data-v-748d0662" bind:__l="__l"></nav-bar></view><view class="content-area data-v-748d0662"><block wx:if="{{$root.g0===0}}"><view class="empty-tip data-v-748d0662"><image class="empty-img data-v-748d0662" src="/static/images/empty.png" mode="aspectFit"></image><text class="empty-text data-v-748d0662">暂无船只信息</text></view></block><block wx:else><view class="data-v-748d0662"><block wx:for="{{shipList}}" wx:for-item="item" wx:for-index="__i0__" wx:key="id"><view data-event-opts="{{[['tap',[['goDetail',['$0'],[[['shipList','id',item.id]]]]]]]}}" class="ship-cell data-v-748d0662" bindtap="__e"><view class="ship-card-header data-v-748d0662"><block wx:if="{{item.status==='pending'}}"><view class="status pending data-v-748d0662"><label class="status-text _span data-v-748d0662">待审核</label></view></block><block wx:else><block wx:if="{{item.status==='rejected'}}"><view class="status rejected data-v-748d0662"><label class="status-text _span data-v-748d0662">已拒绝</label></view></block><block wx:else><block wx:if="{{item.status==='approved'}}"><view class="status approved data-v-748d0662"><label class="status-text _span data-v-748d0662">已通过</label></view></block></block></block></view><view class="ship-title data-v-748d0662">船号:<text class="ship-no data-v-748d0662">{{item.ship_number}}</text></view><view class="ship-row data-v-748d0662">{{"所有人: "+item.owner_name}}</view><view class="ship-row data-v-748d0662">{{"联系电话: "+item.phone}}</view><view class="ship-row data-v-748d0662">{{"总吨位: "+item.total_tonnage+" 吨"}}</view></view></block></view></block></view><block wx:if="{{$root.g1===0}}"><view class="fixed-bottom data-v-748d0662"><button data-event-opts="{{[['tap',[['goAdd',['$event']]]]]}}" class="add-cell-btn data-v-748d0662" bindtap="__e">添加</button></view></block><block wx:if="{{$root.g2===1}}"><view class="fixed-bottom data-v-748d0662"><block wx:if="{{shipList[0].status==='pending'}}"><button data-event-opts="{{[['tap',[['goEdit',['$0'],['shipList.__$n0']]]]]}}" class="add-cell-btn data-v-748d0662" catchtap="__e">修改</button></block><block wx:else><block wx:if="{{shipList[0].status==='rejected'}}"><button data-event-opts="{{[['tap',[['goEdit',['$0'],['shipList.__$n0']]]]]}}" class="add-cell-btn data-v-748d0662" catchtap="__e">修改</button><button data-event-opts="{{[['tap',[['onDelete',['$0'],['shipList.__$n0']]]]]}}" class="delete-cell-btn data-v-748d0662" catchtap="__e">删除</button></block><block wx:else><block wx:if="{{shipList[0].status==='approved'}}"><button data-event-opts="{{[['tap',[['onDelete',['$0'],['shipList.__$n0']]]]]}}" class="delete-cell-btn data-v-748d0662" catchtap="__e">删除</button></block></block></block></view></block></view>

@ -47,6 +47,37 @@
margin-bottom: 32rpx;
border: 1rpx solid #e5e5e5;
}
.ship-card-header.data-v-748d0662 {
display: flex;
align-items: center;
margin-bottom: 12rpx;
}
.status.data-v-748d0662 {
font-size: 24rpx;
border-radius: 8rpx;
padding: 2px 18rpx;
color: #fff;
font-weight: 500;
display: inline-block;
-webkit-transform: skewX(-20deg);
transform: skewX(-20deg);
border: none;
margin-right: 16rpx;
}
.status-text.data-v-748d0662 {
display: inline-block;
-webkit-transform: skewX(20deg);
transform: skewX(20deg);
}
.status.pending.data-v-748d0662 {
background: #ff9800;
}
.status.rejected.data-v-748d0662 {
background: #ff3b3b;
}
.status.approved.data-v-748d0662 {
background: #22c58b;
}
.ship-title.data-v-748d0662 {
font-size: 32rpx;
font-weight: bold;
@ -104,4 +135,20 @@
font-size: 28rpx;
color: #666;
}
.delete-cell-btn.data-v-748d0662 {
min-width: 320rpx;
height: 80rpx;
border-radius: 40rpx;
background: #ff3b3b;
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
outline: none;
box-shadow: 0 4rpx 16rpx rgba(255, 59, 59, 0.12);
transition: background 0.2s;
}
.with-margin.data-v-748d0662 {
margin-left: 24rpx;
}

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/message/index"],{258:function(e,n,t){"use strict";(function(e,n){var r=t(4);t(26);r(t(25));var u=r(t(259));e.__webpack_require_UNI_MP_PLUGIN__=t,n(u.default)}).call(this,t(1)["default"],t(2)["createPage"])},259:function(e,n,t){"use strict";t.r(n);var r=t(260),u=t(262);for(var c in u)["default"].indexOf(c)<0&&function(e){t.d(n,e,(function(){return u[e]}))}(c);t(264);var i,a=t(33),o=Object(a["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"191297be",null,!1,r["components"],i);o.options.__file="pages/message/index.vue",n["default"]=o.exports},260:function(e,n,t){"use strict";t.r(n);var r=t(261);t.d(n,"render",(function(){return r["render"]})),t.d(n,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(n,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(n,"components",(function(){return r["components"]}))},261:function(e,n,t){"use strict";var r;t.r(n),t.d(n,"render",(function(){return u})),t.d(n,"staticRenderFns",(function(){return i})),t.d(n,"recyclableRender",(function(){return c})),t.d(n,"components",(function(){return r}));var u=function(){var e=this,n=e.$createElement;e._self._c},c=!1,i=[];u._withStripped=!0},262:function(e,n,t){"use strict";t.r(n);var r=t(263),u=t.n(r);for(var c in r)["default"].indexOf(c)<0&&function(e){t.d(n,e,(function(){return r[e]}))}(c);n["default"]=u.a},263:function(e,n,t){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r={name:"MessagePage"};n.default=r},264:function(e,n,t){"use strict";t.r(n);var r=t(265),u=t.n(r);for(var c in r)["default"].indexOf(c)<0&&function(e){t.d(n,e,(function(){return r[e]}))}(c);n["default"]=u.a},265:function(e,n,t){}},[[258,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/message/index"],{274:function(e,t,n){"use strict";(function(e,t){var r=n(4);n(26);r(n(25));var a=r(n(275));e.__webpack_require_UNI_MP_PLUGIN__=n,t(a.default)}).call(this,n(1)["default"],n(2)["createPage"])},275:function(e,t,n){"use strict";n.r(t);var r=n(276),a=n(278);for(var c in a)["default"].indexOf(c)<0&&function(e){n.d(t,e,(function(){return a[e]}))}(c);n(280);var u,o=n(33),i=Object(o["default"])(a["default"],r["render"],r["staticRenderFns"],!1,null,"191297be",null,!1,r["components"],u);i.options.__file="pages/message/index.vue",t["default"]=i.exports},276:function(e,t,n){"use strict";n.r(t);var r=n(277);n.d(t,"render",(function(){return r["render"]})),n.d(t,"staticRenderFns",(function(){return r["staticRenderFns"]})),n.d(t,"recyclableRender",(function(){return r["recyclableRender"]})),n.d(t,"components",(function(){return r["components"]}))},277:function(e,t,n){"use strict";var r;n.r(t),n.d(t,"render",(function(){return a})),n.d(t,"staticRenderFns",(function(){return u})),n.d(t,"recyclableRender",(function(){return c})),n.d(t,"components",(function(){return r}));var a=function(){var e=this,t=e.$createElement;e._self._c},c=!1,u=[];a._withStripped=!0},278:function(e,t,n){"use strict";n.r(t);var r=n(279),a=n.n(r);for(var c in r)["default"].indexOf(c)<0&&function(e){n.d(t,e,(function(){return r[e]}))}(c);t["default"]=a.a},279:function(e,t,n){"use strict";(function(e){var r=n(4);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=r(n(44)),c=r(n(46)),u=n(30),o={name:"MessagePage",data:function(){return{notifications:[],page:1,per_page:5,status:""}},onShow:function(){this.fetchNotifications()},methods:{fetchNotifications:function(){var t=this;return(0,c.default)(a.default.mark((function n(){var r,c;return a.default.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(r=e.getStorageSync("token"),r){n.next=3;break}return n.abrupt("return");case 3:return n.prev=3,n.next=6,new Promise((function(n,a){e.request({url:"".concat(u.API.NOTIFICATION_LIST,"?token=").concat(r,"&page=").concat(t.page,"&per_page=").concat(t.per_page).concat(t.status?"&status=".concat(t.status):""),method:"GET",success:n,fail:a})}));case 6:c=n.sent,c.data&&0===c.data.errcode&&(t.notifications=c.data.data.list||[]),n.next=13;break;case 10:n.prev=10,n.t0=n["catch"](3),console.error("Failed to fetch notifications:",n.t0);case 13:case"end":return n.stop()}}),n,null,[[3,10]])})))()}}};t.default=o}).call(this,n(2)["default"])},280:function(e,t,n){"use strict";n.r(t);var r=n(281),a=n.n(r);for(var c in r)["default"].indexOf(c)<0&&function(e){n.d(t,e,(function(){return r[e]}))}(c);t["default"]=a.a},281:function(e,t,n){}},[[274,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/message/index.js.map

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/my/about"],{306:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var u=r(t(307));n.__webpack_require_UNI_MP_PLUGIN__=t,e(u.default)}).call(this,t(1)["default"],t(2)["createPage"])},307:function(n,e,t){"use strict";t.r(e);var r=t(308),u=t(310);for(var c in u)["default"].indexOf(c)<0&&function(n){t.d(e,n,(function(){return u[n]}))}(c);t(312);var o,a=t(33),i=Object(a["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"8d3ca43a",null,!1,r["components"],o);i.options.__file="pages/my/about.vue",e["default"]=i.exports},308:function(n,e,t){"use strict";t.r(e);var r=t(309);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},309:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return u})),t.d(e,"staticRenderFns",(function(){return o})),t.d(e,"recyclableRender",(function(){return c})),t.d(e,"components",(function(){return r}));var u=function(){var n=this,e=n.$createElement;n._self._c},c=!1,o=[];u._withStripped=!0},310:function(n,e,t){"use strict";t.r(e);var r=t(311),u=t.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(c);e["default"]=u.a},311:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=function(){t.e("components/NavBar").then(function(){return resolve(t(314))}.bind(null,t)).catch(t.oe)},u={name:"AboutPage",components:{NavBar:r}};e.default=u},312:function(n,e,t){"use strict";t.r(e);var r=t(313),u=t.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(c);e["default"]=u.a},313:function(n,e,t){}},[[306,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/my/about"],{322:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var u=r(t(323));n.__webpack_require_UNI_MP_PLUGIN__=t,e(u.default)}).call(this,t(1)["default"],t(2)["createPage"])},323:function(n,e,t){"use strict";t.r(e);var r=t(324),u=t(326);for(var c in u)["default"].indexOf(c)<0&&function(n){t.d(e,n,(function(){return u[n]}))}(c);t(328);var o,a=t(33),i=Object(a["default"])(u["default"],r["render"],r["staticRenderFns"],!1,null,"8d3ca43a",null,!1,r["components"],o);i.options.__file="pages/my/about.vue",e["default"]=i.exports},324:function(n,e,t){"use strict";t.r(e);var r=t(325);t.d(e,"render",(function(){return r["render"]})),t.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),t.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),t.d(e,"components",(function(){return r["components"]}))},325:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return u})),t.d(e,"staticRenderFns",(function(){return o})),t.d(e,"recyclableRender",(function(){return c})),t.d(e,"components",(function(){return r}));var u=function(){var n=this,e=n.$createElement;n._self._c},c=!1,o=[];u._withStripped=!0},326:function(n,e,t){"use strict";t.r(e);var r=t(327),u=t.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(c);e["default"]=u.a},327:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=function(){t.e("components/NavBar").then(function(){return resolve(t(330))}.bind(null,t)).catch(t.oe)},u={name:"AboutPage",components:{NavBar:r}};e.default=u},328:function(n,e,t){"use strict";t.r(e);var r=t(329),u=t.n(r);for(var c in r)["default"].indexOf(c)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(c);e["default"]=u.a},329:function(n,e,t){}},[[322,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/my/about.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -66,10 +66,16 @@
}
.status.pending.data-v-0ca91b30 { background: #ff9800;
}
.status.rejected.data-v-0ca91b30 { background: #ff4d4f;
}
.status.confirmed.data-v-0ca91b30 { background: #217aff;
}
.status.cancelled.data-v-0ca91b30 { background: #bdbdbd;
}
.status.canceled.data-v-0ca91b30 {
background: #b0b8c6;
color: #fff;
}
.date.data-v-0ca91b30 { color: #173766; font-size: 15px;
}
.order-info.data-v-0ca91b30 {
@ -226,19 +232,42 @@ button.data-v-0ca91b30 {
font-weight: bold;
}
.modal-confirm-btn.data-v-0ca91b30 {
width: 220px;
height: 44px;
line-height: 44px;
border-radius: 12px;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%);
color: #fff;
font-size: 18px;
font-weight: 500;
margin: 40px auto 0 auto;
border: none;
outline: none;
display: block;
width: 160px !important;
height: 44px !important;
line-height: 44px !important;
border-radius: 12px !important;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%) !important;
color: #fff !important;
font-size: 18px !important;
font-weight: 500 !important;
margin: 40px auto 0 auto !important;
border: none !important;
outline: none !important;
display: block !important;
padding: 0 !important;
box-sizing: border-box;
box-sizing: border-box !important;
text-align: center !important;
align-self: center !important;
flex-shrink: 0 !important;
flex-grow: 0 !important;
}
.order-card.canceled.data-v-0ca91b30 {
opacity: 0.7;
}
.empty-box.data-v-0ca91b30 {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-top: 120rpx;
}
.empty-img.data-v-0ca91b30 {
width: 320rpx;
height: 320rpx;
margin-bottom: 32rpx;
}
.empty-text.data-v-0ca91b30 {
color: #888;
font-size: 28rpx;
}

File diff suppressed because one or more lines are too long

@ -1 +1 @@
<view class="pay-bg data-v-b4a405e6"><view class="fixed-nav data-v-b4a405e6"><nav-bar vue-id="10122599-1" title="在线购票" class="data-v-b4a405e6" bind:__l="__l"></nav-bar></view><view class="pay-scroll data-v-b4a405e6"><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">预约信息</view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">预约日期</text><text class="data-v-b4a405e6">2024-01-14</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">预约批次</text><text class="data-v-b4a405e6">下午批次</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">航行方向</text><text class="data-v-b4a405e6">南向北</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">预约状态</text><text class="pay-status data-v-b4a405e6">已确认</text></view></view><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">船舶信息</view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">船舶</text><text class="data-v-b4a405e6">苏航666</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">编号</text><text class="data-v-b4a405e6">ZJ12345</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">载重</text><text class="data-v-b4a405e6">500吨</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">型</text><text class="data-v-b4a405e6">货船</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">总长度</text><text class="data-v-b4a405e6">45米</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">型宽</text><text class="data-v-b4a405e6">8米</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">型</text><text class="data-v-b4a405e6">3.5米</text></view></view><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">票价信息</view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">过闸费用</text><text class="data-v-b4a405e6">¥300.00</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">按吨位计费</text><text class="data-v-b4a405e6">500吨</text></view><view class="pay-row pay-total data-v-b4a405e6"><text class="data-v-b4a405e6">总计</text><text class="pay-total-num data-v-b4a405e6">¥300.00</text></view></view><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">支付方式</view><radio-group value="{{payType}}" data-event-opts="{{[['input',[['__set_model',['','payType','$event',[]]]]]]}}" bindinput="__e" class="pay-radio-group data-v-b4a405e6"><view data-event-opts="{{[['tap',[['e0',['$event']]]]]}}" class="pay-row pay-paytype data-v-b4a405e6" bindtap="__e"><view class="pay-label data-v-b4a405e6"><image class="pay-icon data-v-b4a405e6" src="/static/wechat.png"></image><text class="data-v-b4a405e6">微信支付</text></view><radio value="wechat" checked="{{payType==='wechat'}}" class="data-v-b4a405e6"></radio></view><view data-event-opts="{{[['tap',[['e1',['$event']]]]]}}" class="pay-row pay-paytype data-v-b4a405e6" bindtap="__e"><view class="pay-label data-v-b4a405e6"><image class="pay-icon data-v-b4a405e6" src="/static/alipay.png"></image><text class="data-v-b4a405e6">支付宝支付</text></view><radio value="alipay" checked="{{payType==='alipay'}}" class="data-v-b4a405e6"></radio></view></radio-group></view></view><view class="pay-bottom-bar data-v-b4a405e6"><view class="pay-bottom-tip data-v-b4a405e6"><text class="pay-bottom-clock data-v-b4a405e6">🕒</text><text class="pay-bottom-tip-text data-v-b4a405e6">请在<text class="pay-bottom-time data-v-b4a405e6">14:06</text>内完成支付</text></view><view class="pay-bottom-btns data-v-b4a405e6"><button class="pay-cancel-btn data-v-b4a405e6">取消订单</button><button class="pay-pay-btn data-v-b4a405e6">立即支付 ¥300.00</button></view></view></view>
<view class="pay-bg data-v-b4a405e6"><view class="fixed-nav data-v-b4a405e6"><nav-bar vue-id="10122599-1" title="在线购票" class="data-v-b4a405e6" bind:__l="__l"></nav-bar></view><view class="pay-scroll data-v-b4a405e6"><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">预约信息</view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">预约日期</text><text class="data-v-b4a405e6">{{item.batch&&item.batch.created_at?$root.m0:''}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">预约批次</text><text class="data-v-b4a405e6">{{item.batch.name}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">航行方向</text><text class="data-v-b4a405e6">{{item.direction_name}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">预约状态</text><text class="pay-status data-v-b4a405e6">已预约</text></view></view><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">船舶信息</view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">船舶编号</text><text class="data-v-b4a405e6">{{item.ship.ship_number}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">总长度</text><text class="data-v-b4a405e6">{{item.ship.total_length+"米"}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">型</text><text class="data-v-b4a405e6">{{item.ship.total_width+"米"}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">型深</text><text class="data-v-b4a405e6">{{item.ship.molded_depth+"米"}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">载重</text><text class="data-v-b4a405e6">{{item.ship.total_tonnage+"吨"}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">型</text><text class="data-v-b4a405e6">{{item.ship&&item.ship.ship_type?$root.m1:''}}</text></view></view><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">票价信息</view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">过闸费用</text><text class="data-v-b4a405e6">{{"¥"+item.price}}</text></view><view class="pay-row data-v-b4a405e6"><text class="data-v-b4a405e6">按吨位计费</text><text class="data-v-b4a405e6">{{item.ship.total_tonnage+"吨"}}</text></view><view class="pay-row pay-total data-v-b4a405e6"><text class="data-v-b4a405e6">总计</text><text class="pay-total-num data-v-b4a405e6">{{"¥"+item.price}}</text></view></view><view class="pay-section data-v-b4a405e6"><view class="pay-title data-v-b4a405e6">扫码支付</view><view class="pay-qrcode-box data-v-b4a405e6"><image class="pay-qrcode-img data-v-b4a405e6" src="{{qrcodeUrl}}" mode="aspectFit" data-event-opts="{{[['longpress',[['handleLongPress',['$event']]]]]}}" bindlongpress="__e"></image></view><view class="pay-qrcode-tip data-v-b4a405e6">请使用微信或支付宝扫码支付</view></view></view><view class="pay-bottom-bar data-v-b4a405e6"><view class="pay-bottom-tip data-v-b4a405e6"><text class="pay-bottom-clock data-v-b4a405e6">🕒</text><text class="pay-bottom-tip-text data-v-b4a405e6">请在<text class="pay-bottom-time data-v-b4a405e6">14:06</text>内完成支付</text></view><view class="pay-bottom-btns data-v-b4a405e6"><button class="pay-cancel-btn data-v-b4a405e6">取消订单</button><button data-event-opts="{{[['tap',[['handlePay',['$event']]]]]}}" class="pay-pay-btn data-v-b4a405e6" bindtap="__e">立即支付 ¥300.00</button></view></view></view>

@ -162,4 +162,23 @@
.pay-pay-btn.data-v-b4a405e6::after {
border: none;
}
.pay-qrcode-box.data-v-b4a405e6 {
display: flex;
justify-content: center;
align-items: center;
margin: 32rpx 0;
}
.pay-qrcode-img.data-v-b4a405e6 {
width: 260rpx;
height: 260rpx;
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.pay-qrcode-tip.data-v-b4a405e6 {
text-align: center;
color: #888;
font-size: 26rpx;
margin-top: 12rpx;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
{
"navigationBarTitleText": "订单详情",
"navigationStyle": "custom",
"usingComponents": {
"nav-bar": "/components/NavBar"
}
}

@ -0,0 +1 @@
<view class="pay-bg data-v-7318f01a"><view class="fixed-nav data-v-7318f01a"><nav-bar vue-id="07fdf773-1" title="订单详情" class="data-v-7318f01a" bind:__l="__l"></nav-bar></view><view class="pay-scroll data-v-7318f01a"><view class="pay-section data-v-7318f01a"><view class="pay-title data-v-7318f01a">预约信息</view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">预约日期</text><text class="data-v-7318f01a">{{$root.m0}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">预约批次</text><text class="data-v-7318f01a">{{item.batch&&item.batch.name?item.batch.name:'-'}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">航行方向</text><text class="data-v-7318f01a">{{item.direction_name}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">预约状态</text><text class="{{['pay-status','data-v-7318f01a',item.status]}}">{{$root.m1}}</text></view></view><view class="pay-section data-v-7318f01a"><view class="pay-title data-v-7318f01a">船舶信息</view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">船舶编号</text><text class="data-v-7318f01a">{{item.ship.ship_number}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">总长度</text><text class="data-v-7318f01a">{{item.ship.total_length+"米"}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">型宽</text><text class="data-v-7318f01a">{{item.ship.total_width+"米"}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">型深</text><text class="data-v-7318f01a">{{item.ship.molded_depth+"米"}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">载重</text><text class="data-v-7318f01a">{{item.ship.total_tonnage+"吨"}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">类型</text><text class="data-v-7318f01a">{{item.ship&&item.ship.ship_type?$root.m2:''}}</text></view></view><block wx:if="{{item.status==='paid'||item.status==='completed'}}"><view class="pay-section data-v-7318f01a"><view class="pay-title data-v-7318f01a">票价信息</view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">过闸费用</text><text class="data-v-7318f01a">{{"¥"+item.price}}</text></view><view class="pay-row data-v-7318f01a"><text class="data-v-7318f01a">按吨位计费</text><text class="data-v-7318f01a">{{item.ship.total_tonnage+"吨"}}</text></view><view class="pay-row pay-total data-v-7318f01a"><text class="data-v-7318f01a">总计</text><text class="pay-total-num data-v-7318f01a">{{"¥"+item.price}}</text></view></view></block><block wx:if="{{item.status==='unpaid'||item.status==='approved'}}"><view class="pay-section data-v-7318f01a"><view class="pay-title data-v-7318f01a">扫码支付</view><view class="pay-qrcode-box data-v-7318f01a"><image class="pay-qrcode-img data-v-7318f01a" src="{{qrcodeUrl}}" mode="aspectFit" data-event-opts="{{[['longpress',[['handleLongPress',['$event']]]]]}}" bindlongpress="__e"></image></view><view class="pay-qrcode-tip data-v-7318f01a">请使用微信或支付宝扫码支付</view></view></block></view><view class="pay-bottom-bar data-v-7318f01a"><block wx:if="{{item.status==='unpaid'||item.status==='approved'}}"><view class="pay-bottom-tip data-v-7318f01a"><text class="pay-bottom-clock data-v-7318f01a">🕒</text><text class="pay-bottom-tip-text data-v-7318f01a">请在<text class="pay-bottom-time data-v-7318f01a">14:06</text>内完成支付</text></view><view class="pay-bottom-btns data-v-7318f01a"><button data-event-opts="{{[['tap',[['handlePay',['$event']]]]]}}" class="pay-pay-btn data-v-7318f01a" bindtap="__e">{{"立即支付 ¥"+item.price}}</button></view></block><block wx:else><block wx:if="{{item.status==='pending'}}"><view class="pay-bottom-btns data-v-7318f01a"><button data-event-opts="{{[['tap',[['handleCancel',['$event']]]]]}}" class="pay-cancel-btn data-v-7318f01a" bindtap="__e">取消预约</button></view></block><block wx:else><block wx:if="{{item.status==='rejected'}}"><view class="pay-bottom-btns data-v-7318f01a"><button data-event-opts="{{[['tap',[['handleReReserve',['$event']]]]]}}" class="pay-cancel-btn data-v-7318f01a" bindtap="__e">重新预约</button></view></block></block></block></view></view>

@ -0,0 +1,227 @@
@charset "UTF-8";
/* 颜色变量 */
/* 行为相关颜色 */
/* 文字基本颜色 */
/* 背景颜色 */
/* 边框颜色 */
/* 尺寸变量 */
/* 文字尺寸 */
/* 图片尺寸 */
/* Border Radius */
/* 水平间距 */
/* 垂直间距 */
/* 透明度 */
/* 文章场景相关 */
/* uni.scss */
.data-v-7318f01a input::-webkit-input-placeholder {
font-size: 24rpx !important;
color: #b0b8c6;
}
.data-v-7318f01a input::placeholder {
font-size: 24rpx !important;
color: #b0b8c6;
}
.pay-bg.data-v-7318f01a {
min-height: 100vh;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
padding-bottom: 32rpx;
}
.fixed-nav.data-v-7318f01a {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
height: 90px;
}
.pay-scroll.data-v-7318f01a {
padding-top: 110px;
padding-bottom: 160rpx;
}
.pay-section.data-v-7318f01a {
background: #fff;
border-radius: 24rpx;
margin: 0 24rpx 32rpx 24rpx;
box-shadow: 0 4rpx 16rpx rgba(59, 124, 255, 0.08);
padding: 32rpx 24rpx 8rpx 24rpx;
}
.pay-title.data-v-7318f01a {
font-size: 32rpx;
font-weight: bold;
color: #222;
margin-bottom: 24rpx;
}
.pay-row.data-v-7318f01a {
display: flex;
justify-content: space-between;
align-items: center;
padding: 18rpx 0;
border-bottom: 1rpx solid #f2f4f8;
}
.pay-row text.data-v-7318f01a:first-child {
font-size: 28rpx;
color: #222;
}
.pay-row text.data-v-7318f01a:last-child {
font-size: 28rpx;
color: #666;
}
.pay-row.data-v-7318f01a:last-child {
border-bottom: none;
}
.pay-status.data-v-7318f01a {
background: #217aff;
color: #fff !important;
border-radius: 24rpx;
padding: 4rpx 24rpx;
font-size: 24rpx;
}
.pay-status.pending.data-v-7318f01a {
background: #ff9800;
}
.pay-status.rejected.data-v-7318f01a {
background: #ff4d4f;
}
.pay-status.unpaid.data-v-7318f01a, .pay-status.approved.data-v-7318f01a {
background: #217aff;
}
.pay-status.paid.data-v-7318f01a {
background: #22c58b;
}
.pay-total.data-v-7318f01a {
font-weight: bold;
}
.pay-total-num.data-v-7318f01a {
color: #217aff;
font-size: 32rpx;
}
.pay-paytype.data-v-7318f01a {
gap: 16rpx;
}
.pay-label.data-v-7318f01a {
display: flex;
align-items: center;
}
.pay-icon.data-v-7318f01a {
width: 36rpx;
height: 36rpx;
margin-right: 20rpx;
}
.pay-paytype text.data-v-7318f01a {
margin-left: 0;
/* 确保文字紧跟图标 */
}
.pay-radio-group.data-v-7318f01a {
display: flex;
flex-direction: column;
gap: 12rpx;
}
.pay-bottom-bar.data-v-7318f01a {
position: fixed;
left: 0;
right: 0;
bottom: 0;
background: #fff;
box-shadow: 0 -2rpx 16rpx rgba(59, 124, 255, 0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
display: flex;
flex-direction: column;
align-items: center;
}
.pay-bottom-tip.data-v-7318f01a {
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
margin-bottom: 18rpx;
}
.pay-bottom-clock-box.data-v-7318f01a {
width: 40rpx;
height: 40rpx;
border: 2rpx solid #217aff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-right: 12rpx;
}
.pay-bottom-clock.data-v-7318f01a {
color: #217aff;
font-size: 28rpx;
}
.pay-bottom-tip-text.data-v-7318f01a {
color: #222;
}
.pay-bottom-time.data-v-7318f01a {
color: #217aff;
font-weight: bold;
}
.pay-bottom-btns.data-v-7318f01a {
display: flex;
gap: 24rpx;
justify-content: center;
width: 100%;
}
.pay-cancel-btn.data-v-7318f01a {
min-width: 240rpx;
height: 72rpx;
border-radius: 36rpx;
background: #f5f7fa;
color: #222;
font-size: 28rpx;
border: none;
outline: none;
}
.pay-cancel-btn.data-v-7318f01a::after {
border: none;
}
.pay-pay-btn.data-v-7318f01a {
min-width: 320rpx;
height: 72rpx;
border-radius: 36rpx;
background: #217aff;
color: #fff;
font-size: 28rpx;
font-weight: 500;
border: none;
outline: none;
}
.pay-pay-btn.data-v-7318f01a::after {
border: none;
}
.pay-qrcode-box.data-v-7318f01a {
display: flex;
justify-content: center;
align-items: center;
margin: 32rpx 0;
}
.pay-qrcode-img.data-v-7318f01a {
width: 260rpx;
height: 260rpx;
background: #fff;
border-radius: 16rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.pay-qrcode-tip.data-v-7318f01a {
text-align: center;
color: #888;
font-size: 26rpx;
margin-top: 12rpx;
}
.pay-detail-btn.data-v-7318f01a {
min-width: 240rpx;
height: 72rpx;
border-radius: 36rpx;
background: #e4f3fe;
color: #217aff;
font-size: 28rpx;
border: none;
outline: none;
}
.pay-detail-btn.data-v-7318f01a::after {
border: none;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,7 @@
{
"navigationBarTitleText": "在线付款",
"navigationStyle": "custom",
"usingComponents": {
"nav-bar": "/components/NavBar"
}
}

@ -0,0 +1 @@
<view class="order-page data-v-b6d1e780"><view class="fixed-nav data-v-b6d1e780"><nav-bar vue-id="236a0674-1" title="{{title}}" class="data-v-b6d1e780" bind:__l="__l"></nav-bar></view><view class="order-list data-v-b6d1e780"><block wx:if="{{$root.g0>0}}"><block wx:for="{{$root.l0}}" wx:for-item="item" wx:for-index="__i0__" wx:key="id"><view class="data-v-b6d1e780"><block wx:if="{{item.$orig.status==='paid'}}"><view class="order-card purchased data-v-b6d1e780"><view class="order-card-header data-v-b6d1e780"><view class="status purchased data-v-b6d1e780"><label class="status-text _span data-v-b6d1e780">已付款</label></view><view class="date data-v-b6d1e780">{{item.m0}}</view></view><view class="order-info data-v-b6d1e780"><view class="flight data-v-b6d1e780">{{item.$orig.ship?item.$orig.ship.ship_number:''}}</view><view class="desc data-v-b6d1e780">{{''+item.$orig.direction_name+" | "+(item.$orig.batch&&item.$orig.batch.name?item.$orig.batch.name:'-')}}</view></view><view class="order-actions single-btn data-v-b6d1e780"><button data-event-opts="{{[['tap',[['onShowDetail',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" class="detail-btn data-v-b6d1e780" bindtap="__e">查看详情</button></view></view></block><block wx:else><block wx:if="{{item.$orig.status==='pending'}}"><view class="order-card pending data-v-b6d1e780"><view class="order-card-header data-v-b6d1e780"><view class="status pending data-v-b6d1e780"><label class="status-text _span data-v-b6d1e780">待确认</label></view><view class="date data-v-b6d1e780">{{item.m1}}</view></view><view class="order-info data-v-b6d1e780"><view class="flight data-v-b6d1e780">{{item.$orig.ship?item.$orig.ship.ship_number:''}}</view><view class="desc data-v-b6d1e780">{{''+item.$orig.direction_name+" | "+(item.$orig.batch&&item.$orig.batch.name?item.$orig.batch.name:'-')}}</view></view><view class="order-actions data-v-b6d1e780"><button class="cancel-btn data-v-b6d1e780" disabled="{{false}}" data-event-opts="{{[['tap',[['onCancelOrder',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" bindtap="__e">取消预约</button><button data-event-opts="{{[['tap',[['onShowDetail',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" class="detail-btn data-v-b6d1e780" bindtap="__e">查看详情</button></view></view></block><block wx:else><block wx:if="{{item.$orig.status==='rejected'}}"><view class="order-card pending data-v-b6d1e780"><view class="order-card-header data-v-b6d1e780"><view class="status pending data-v-b6d1e780"><label class="status-text _span data-v-b6d1e780">已拒绝</label></view><view class="date data-v-b6d1e780">{{item.m2}}</view></view><view class="order-info data-v-b6d1e780"><view class="flight data-v-b6d1e780">{{item.$orig.ship?item.$orig.ship.ship_number:''}}</view><view class="desc data-v-b6d1e780">{{''+item.$orig.direction_name+" | "+(item.$orig.batch&&item.$orig.batch.name?item.$orig.batch.name:'-')}}</view></view><view class="order-actions data-v-b6d1e780"><button class="cancel-btn data-v-b6d1e780" disabled="{{false}}" data-event-opts="{{[['tap',[['goReservation',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" bindtap="__e">重新预约</button><button data-event-opts="{{[['tap',[['onShowDetail',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" class="detail-btn data-v-b6d1e780" bindtap="__e">查看详情</button></view></view></block><block wx:else><block wx:if="{{item.$orig.status==='unpaid'||item.$orig.status==='approved'}}"><view class="order-card confirmed data-v-b6d1e780"><view class="order-card-header data-v-b6d1e780"><view class="status confirmed data-v-b6d1e780"><label class="status-text _span data-v-b6d1e780">待支付</label></view><view class="date data-v-b6d1e780">{{item.m3}}</view></view><view class="order-info data-v-b6d1e780"><view class="flight data-v-b6d1e780">{{item.$orig.ship?item.$orig.ship.ship_number:''}}</view><view class="desc data-v-b6d1e780">{{''+item.$orig.direction_name+" | "+(item.$orig.batch&&item.$orig.batch.name?item.$orig.batch.name:'-')}}</view></view><view class="order-actions data-v-b6d1e780"><button data-event-opts="{{[['tap',[['onShowDetail',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" class="detail-btn data-v-b6d1e780" bindtap="__e">查看详情</button><button data-event-opts="{{[['tap',[['goPayOrder',['$0'],[[['reservationList','id',item.$orig.id]]]]]]]}}" class="buy-btn data-v-b6d1e780" bindtap="__e">去支付</button></view></view></block></block></block></block></view></block></block><block wx:else><view class="empty-box data-v-b6d1e780"><image class="empty-img data-v-b6d1e780" src="/static/empty.png" mode="aspectFit"></image><view class="empty-text data-v-b6d1e780">暂无订单</view></view></block></view></view>

@ -0,0 +1,275 @@
.order-page.data-v-b6d1e780 {
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
min-height: 100vh;
padding-bottom: 20px;
font-family: 'SourceHanSansCN', 'PingFang SC', 'Microsoft YaHei', sans-serif;
}
.header-title.data-v-b6d1e780 {
text-align: center;
font-size: 36rpx;
font-weight: bold;
padding-top: 7vh;
letter-spacing: 2rpx;
}
.fixed-nav.data-v-b6d1e780 {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
height: 90px;
}
.header.data-v-b6d1e780 {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 16px 10px 16px;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
}
.back-btn.data-v-b6d1e780, .more-btn.data-v-b6d1e780 {
font-size: 24px;
color: #333;
}
.title.data-v-b6d1e780 {
font-size: 22px;
font-weight: bold;
color: #222;
}
.order-list.data-v-b6d1e780 {
padding: 10px 0 0 0;
margin-top: 110px;
padding-bottom: 160rpx;
}
.order-card.data-v-b6d1e780 {
background: #fff;
border-radius: 10px;
margin: 0 16px 16px 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
padding: 18px 18px 12px 18px;
height: 340rpx;
}
.order-card-header.data-v-b6d1e780 {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.status.data-v-b6d1e780 {
font-size: 12px;
border-radius: 8rpx;
padding: 2px 8px;
color: #fff;
font-weight: 500;
display: inline-block;
-webkit-transform: skewX(-20deg);
transform: skewX(-20deg);
border: none;
}
.status-text.data-v-b6d1e780 {
display: inline-block;
-webkit-transform: skewX(20deg);
transform: skewX(20deg);
}
.status.purchased.data-v-b6d1e780 { background: #22c58b;
}
.status.pending.data-v-b6d1e780 { background: #ff9800;
}
.status.confirmed.data-v-b6d1e780 { background: #217aff;
}
.status.cancelled.data-v-b6d1e780 { background: #bdbdbd;
}
.date.data-v-b6d1e780 { color: #173766; font-size: 15px;
}
.order-info.data-v-b6d1e780 {
margin-bottom: 24px;
}
.flight.data-v-b6d1e780 {
font-size: 16px;
font-weight: 500;
margin-top: 12px;
}
.desc.data-v-b6d1e780 {
color: #888;
font-size: 14px;
margin-top: 10px;
}
.order-actions.data-v-b6d1e780 {
display: flex;
gap: 12px;
}
button.data-v-b6d1e780 {
flex: 1;
border-radius: 4px;
padding: 8px 0;
font-size: 16px;
margin: 0;
}
.detail-btn.data-v-b6d1e780 {
background: #e4f3fe;
color: #217aff;
height: 69rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
margin-left: auto;
}
.order-actions.single-btn.data-v-b6d1e780 {
justify-content: flex-end;
}
.order-actions.single-btn .detail-btn.data-v-b6d1e780 {
flex: 0 0 auto;
width: 153px;
}
.buy-btn.data-v-b6d1e780, .rebook-btn.data-v-b6d1e780 {
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%);
color: #fff;
height: 69rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.cancel-btn.data-v-b6d1e780 {
background: #ededed;
color: #bdbdbd;
height: 69rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.cancel-btn[disabled].data-v-b6d1e780 {
opacity: 1;
}
.tabbar.data-v-b6d1e780 {
position: fixed;
left: 0;
right: 0;
bottom: 0;
height: 60px;
background: #fff;
display: flex;
border-top: 1px solid #eaeaea;
z-index: 10;
}
.tab-item.data-v-b6d1e780 {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #888;
font-size: 14px;
}
.tab-item.active.data-v-b6d1e780 {
color: #217aff;
}
.icon.data-v-b6d1e780 {
font-size: 22px;
margin-bottom: 2px;
}
.detail-modal-mask.data-v-b6d1e780 {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
}
.detail-modal.data-v-b6d1e780 {
background: #fff;
border-radius: 20px;
padding: 64rpx 56rpx 48rpx 56rpx;
width: 90vw;
max-width: 500px;
min-height: 420px;
margin: 0 auto;
position: relative;
display: flex;
flex-direction: column;
}
.detail-modal-content.data-v-b6d1e780 {
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
}
.modal-close.data-v-b6d1e780 {
position: absolute;
right: 24rpx;
top: 24rpx;
font-size: 44rpx;
color: #222;
z-index: 2;
cursor: pointer;
}
.modal-title.data-v-b6d1e780 {
font-size: 38rpx;
font-weight: bold;
margin-bottom: 40rpx;
text-align: left;
}
.modal-row.data-v-b6d1e780 {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 34rpx;
color: #222;
margin-bottom: 36rpx;
}
.modal-label.data-v-b6d1e780 {
color: #3b4a6b;
min-width: 180rpx;
font-size: 34rpx;
}
.modal-amount.data-v-b6d1e780 {
color: #217aff;
font-size: 32rpx;
font-weight: bold;
}
.modal-confirm-btn.data-v-b6d1e780 {
width: 160px !important;
height: 44px !important;
line-height: 44px !important;
border-radius: 12px !important;
background: linear-gradient(90deg, #3b7cff 0%, #5bb6ff 100%) !important;
color: #fff !important;
font-size: 18px !important;
font-weight: 500 !important;
margin: 40px auto 0 auto !important;
border: none !important;
outline: none !important;
display: block !important;
padding: 0 !important;
box-sizing: border-box !important;
text-align: center !important;
align-self: center !important;
flex-shrink: 0 !important;
flex-grow: 0 !important;
}
.empty-box.data-v-b6d1e780 {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin-top: 120rpx;
}
.empty-img.data-v-b6d1e780 {
width: 320rpx;
height: 320rpx;
margin-bottom: 32rpx;
}
.empty-text.data-v-b6d1e780 {
color: #888;
font-size: 28rpx;
}

File diff suppressed because one or more lines are too long

@ -1 +1 @@
<view class="reservation-page data-v-f5e463b4"><view class="fixed-nav data-v-f5e463b4"><nav-bar vue-id="1cac77a0-1" title="过闸预约" class="data-v-f5e463b4" bind:__l="__l"></nav-bar></view><view class="reservation-scroll data-v-f5e463b4"><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">船舶信息</view><view class="water-info-row data-v-f5e463b4"><view class="water-info-col data-v-f5e463b4"><text class="label data-v-f5e463b4">今日水位:</text><text class="value blue data-v-f5e463b4">4.2m</text></view><view class="water-info-col data-v-f5e463b4"><text class="label data-v-f5e463b4">水深:</text><text class="value blue data-v-f5e463b4">3.8m</text></view><view class="water-info-col data-v-f5e463b4"><text class="label data-v-f5e463b4">限高:</text><text class="value blue data-v-f5e463b4">7.5m</text></view></view></view><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">船舶信息</view><view class="info-list data-v-f5e463b4"><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">总长度</text><view class="info-value data-v-f5e463b4">{{currentShip.total_length+'米'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">型宽</text><view class="info-value data-v-f5e463b4">{{currentShip.total_width+'米'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">型深</text><view class="info-value data-v-f5e463b4">{{currentShip.molded_depth+'米'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">编号</text><view class="info-value data-v-f5e463b4">{{currentShip.ship_number+''}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">载重</text><view class="info-value data-v-f5e463b4">{{currentShip.total_tonnage+'吨'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">类型</text><view class="info-value data-v-f5e463b4">{{$root.m0+''}}<text class="arrow data-v-f5e463b4"></text></view></view></view></view><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">航行方向</view><view class="direction-row data-v-f5e463b4"><button data-event-opts="{{[['tap',[['setDirection',['north']]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(direction==='north')?'active':'']}}" bindtap="__e">↓ 去胥江</button><button data-event-opts="{{[['tap',[['setDirection',['south']]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(direction==='south')?'active':'']}}" bindtap="__e">↑ 去太湖</button></view></view><view class="notice-row data-v-f5e463b4"><text class="notice-title data-v-f5e463b4">预约须知</text><view class="notice-check data-v-f5e463b4" style="position:relative;"><checkbox checked="{{agreeNotice}}" class="data-v-f5e463b4"></checkbox><text class="data-v-f5e463b4">我已阅读并同意《过闸预约服务协议》</text><view data-event-opts="{{[['tap',[['toggleAgreeNotice',['$event']]]]]}}" style="position:absolute;left:0;top:0;right:0;bottom:0;z-index:2;" bindtap="__e" class="data-v-f5e463b4"></view></view></view></view><view class="reservation-bottom-bar data-v-f5e463b4"><button data-event-opts="{{[['tap',[['onReserve',['$event']]]]]}}" class="reservation-btn data-v-f5e463b4" bindtap="__e">预约</button></view></view>
<view class="reservation-page data-v-f5e463b4"><view class="fixed-nav data-v-f5e463b4"><nav-bar vue-id="1cac77a0-1" title="过闸预约" class="data-v-f5e463b4" bind:__l="__l"></nav-bar></view><view class="reservation-scroll data-v-f5e463b4"><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">船舶信息</view><view class="water-info-row data-v-f5e463b4"><view class="water-info-col data-v-f5e463b4"><text class="label data-v-f5e463b4">今日水位:</text><text class="value blue data-v-f5e463b4">4.2m</text></view><view class="water-info-col data-v-f5e463b4"><text class="label data-v-f5e463b4">水深:</text><text class="value blue data-v-f5e463b4">3.8m</text></view><view class="water-info-col data-v-f5e463b4"><text class="label data-v-f5e463b4">限高:</text><text class="value blue data-v-f5e463b4">7.5m</text></view></view></view><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">船舶信息</view><view class="info-list data-v-f5e463b4"><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">编号</text><view class="info-value data-v-f5e463b4">{{currentShip.ship_number+''}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">总长度</text><view class="info-value data-v-f5e463b4">{{currentShip.total_length+'米'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">型宽</text><view class="info-value data-v-f5e463b4">{{currentShip.total_width+'米'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">型深</text><view class="info-value data-v-f5e463b4">{{currentShip.molded_depth+'米'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">载重</text><view class="info-value data-v-f5e463b4">{{currentShip.total_tonnage+'吨'}}<text class="arrow data-v-f5e463b4"></text></view></view><view class="info-row data-v-f5e463b4"><text class="info-label data-v-f5e463b4">类型</text><view class="info-value data-v-f5e463b4">{{$root.m0+''}}<text class="arrow data-v-f5e463b4"></text></view></view></view></view><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">航行方向</view><view class="direction-row data-v-f5e463b4"><button data-event-opts="{{[['tap',[['setDirection',['north']]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(direction==='north')?'active':'']}}" bindtap="__e">↓ 去胥江</button><button data-event-opts="{{[['tap',[['setDirection',['south']]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(direction==='south')?'active':'']}}" bindtap="__e">↑ 去太湖</button></view></view><view class="card data-v-f5e463b4"><view class="card-title data-v-f5e463b4">过闸日期</view><view class="direction-row data-v-f5e463b4"><button data-event-opts="{{[['tap',[['setGateDate',['today']]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(gateDate==='today')?'active':'']}}" bindtap="__e">今天</button><button data-event-opts="{{[['tap',[['setGateDate',['tomorrow']]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(gateDate==='tomorrow')?'active':'']}}" bindtap="__e">明天</button></view></view><view class="notice-row data-v-f5e463b4"><text class="notice-title data-v-f5e463b4">预约须知</text><view class="notice-check data-v-f5e463b4" style="position:relative;"><checkbox checked="{{agreeNotice}}" class="data-v-f5e463b4"></checkbox><text class="data-v-f5e463b4">我已阅读并同意《过闸预约服务协议》</text><view data-event-opts="{{[['tap',[['toggleAgreeNotice',['$event']]]]]}}" style="position:absolute;left:0;top:0;right:0;bottom:0;z-index:2;" bindtap="__e" class="data-v-f5e463b4"></view></view></view></view><view class="reservation-bottom-bar data-v-f5e463b4"><button data-event-opts="{{[['tap',[['onReserve',['$event']]]]]}}" class="reservation-btn data-v-f5e463b4" bindtap="__e">预约</button></view></view>

@ -194,4 +194,8 @@
.reservation-scroll.data-v-f5e463b4 {
padding-bottom: 80rpx;
}
.date-btn.active.data-v-f5e463b4 {
background: #217aff;
color: #fff;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Loading…
Cancel
Save