main
lynn 11 months ago
parent 39aa6178cb
commit 737a8d342d

@ -24,4 +24,6 @@ export const API = {
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`,
GET_DIRECTION_ENUM: `${BASE_URL}/api/customer/reservation/get-direction-enum`,
SHIP_UPDATE: `${BASE_URL}/api/customer/ship/update`,
}

@ -242,7 +242,7 @@ export default {
background: #fff;
border-radius: 22rpx;
margin: 24rpx;
padding: 48rpx 32rpx 32rpx 32rpx;
padding: 32rpx;
box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.08);
position: relative;
margin-top: -140rpx;
@ -252,7 +252,8 @@ export default {
.process-title-bar {
width: 60%;
margin: 0 auto;
margin-top: -47rpx;
position: relative;
top: -32rpx;
background: linear-gradient(180deg, #2f4dff 0%, #4b65ff 100%);
color: #fff;
font-size: 28rpx;
@ -262,7 +263,6 @@ export default {
text-align: center;
box-shadow: 0 4rpx 16rpx rgba(59,124,255,0.12);
z-index: 2;
position: relative;
}
.process-flow {
@ -270,7 +270,7 @@ export default {
align-items: center;
justify-content: space-between;
padding: 0 12rpx;
margin-top: 38rpx;
margin-top: 10rpx;
}
.process-step {

@ -42,9 +42,9 @@
>
<radio
class="form-radio"
:value="value.value.toString()"
:checked="form.feeType === value.value.toString()"
@tap="onFeeTypeChange({detail: {value: value.value.toString()}})"
:value="value.value"
:checked="form.feeType === value.value"
@tap="onFeeTypeChange({detail: {value: value.value}})"
/>
<view class="fee-type-info">
<text class="fee-type-label">{{ label }}</text>
@ -127,7 +127,7 @@
</view>
<view v-if="page1Img" class="upload-del" @click="deleteImage('page1')">×</view>
</view>
<input class="upload-desc" v-model="page1Desc" placeholder="请输入第一页说明" />
<view class="upload-desc">第一页相关说明</view>
</view>
</view>
<view class="divider"></view>
@ -143,7 +143,7 @@
</view>
<view v-if="page2Img" class="upload-del" @click="deleteImage('page2')">×</view>
</view>
<input class="upload-desc" v-model="page2Desc" placeholder="请输入第二页说明" />
<view class="upload-desc">第二页相关说明</view>
</view>
</view>
<view class="divider"></view>
@ -159,7 +159,7 @@
</view>
<view v-if="page3Img" class="upload-del" @click="deleteImage('page3')">×</view>
</view>
<input class="upload-desc" v-model="page3Desc" placeholder="请输入第三页说明" />
<view class="upload-desc">第三页相关说明</view>
</view>
</view>
</view>
@ -250,11 +250,11 @@ export default {
tonnageClassEnum: {}, //
feeTypeEnum: {}, //
form: {
owner: 'sdf',
idCard: '23423423423423423',
phone: '12312312311',
shipNo: '2222',
feeType: '1', //
owner: '',
idCard: '',
phone: '',
shipNo: '',
feeType: 1, //
ton: '',
length: '',
width: '',
@ -265,12 +265,9 @@ export default {
page2FileId: '',
page3FileId: ''
},
page1Desc: '',
page2Desc: '',
page3Desc: ''
}
},
onShow(options) {
onLoad(options) {
//
this.fetchShipPropertyEnum().then(success => {
if (!success) {
@ -280,12 +277,14 @@ export default {
}, 1500);
return;
}
if (options.edit === '1' && options.ship) {
if (options && options.edit === '1' && options.ship) {
try {
const ship = JSON.parse(decodeURIComponent(options.ship));
console.log("填充数据:",ship.fee_type)
this.isEdit = true;
//
this.form.id = ship.id || '';
this.form.owner = ship.owner_name || '';
this.form.idCard = ship.id_card || '';
this.form.phone = ship.phone || '';
@ -296,7 +295,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.feeType = ship.fee_type || 1; //
this.form.page1FileId = ship.picture1 || '';
this.form.page2FileId = ship.picture2 || '';
this.form.page3FileId = ship.picture3 || '';
@ -340,7 +339,7 @@ export default {
if (!this.isEdit) {
this.form.shipType = Object.values(this.shipTypeEnum)[0].toString();
this.form.tonLevel = Object.values(this.tonnageClassEnum)[0];
this.form.feeType = '1'; //
this.form.feeType = 1; //
}
return true;
} else {
@ -476,40 +475,23 @@ export default {
uni.showToast({ title: '请上传第三页图片', icon: 'none' });
return;
}
if (!this.page1Desc) {
uni.showToast({ title: '请填写第一页说明', icon: 'none' });
return;
}
if (!this.page2Desc) {
uni.showToast({ title: '请填写第二页说明', icon: 'none' });
return;
}
if (!this.page3Desc) {
uni.showToast({ title: '请填写第三页说明', icon: 'none' });
return;
}
try {
uni.showLoading({ title: '上传中...' });
//
if (this.page1Img !== this.originalPage1Img || !this.form.page1FileId) {
const page1Result = await this.uploadFile(this.page1Img);
this.form.page1FileId = page1Result.data.id;
}
//
if (this.page2Img !== this.originalPage2Img || !this.form.page2FileId) {
const page2Result = await this.uploadFile(this.page2Img);
this.form.page2FileId = page2Result.data.id;
}
//
if (this.page3Img !== this.originalPage3Img || !this.form.page3FileId) {
const page3Result = await this.uploadFile(this.page3Img);
this.form.page3FileId = page3Result.data.id;
}
uni.hideLoading();
} catch (error) {
uni.hideLoading();
@ -544,7 +526,7 @@ export default {
//
const params = {
token:token,
token: token,
owner_name: this.form.owner,
id_card: this.form.idCard,
phone: this.form.phone,
@ -562,13 +544,21 @@ export default {
signature: signBase64
};
console.log(params)
//
let url = API.SHIP_CREATE;
let method = 'POST';
if (this.isEdit && this.form.id) {
url = `${API.SHIP_UPDATE}/${encodeURIComponent(this.form.id)}`;
method = 'POST';
}
console.log('提交参数:', params, url);
//
const res = await new Promise((resolve, reject) => {
uni.request({
url: API.SHIP_CREATE,
method: 'POST',
url: url,
method: method,
data: params,
header: {
'Content-Type': 'application/json'
@ -858,7 +848,7 @@ export default {
}
.form-input {
flex: 1;
@include font-tertiary;
@include font-secondary;
color: #333;
border: none;
outline: none;
@ -889,6 +879,9 @@ export default {
color: #fff;
box-shadow: 0 4rpx 16rpx rgba(33,122,255,0.08);
transition: background 0.2s;
display: flex;
align-items: center;
justify-content: center;
}
.step-btn.single-btn {
min-width: 420rpx;

@ -18,7 +18,7 @@
<view class="section-row"><text>总宽</text><text>{{ ship.total_width }}</text></view>
<view class="section-row"><text>型深</text><text>{{ ship.molded_depth }}</text></view>
<view class="section-row"><text>吨位等级</text><text>{{ ship.tonnage_class }}</text></view>
<view class="section-row"><text>船型</text><text>{{ ship.ship_type }}</text></view>
<view class="section-row"><text>船型</text><text>{{ getShipTypeName(ship.ship_type) }}</text></view>
</view>
<view v-if="ship" class="ship-section">
<view class="section-title">船检簿</view>
@ -63,7 +63,8 @@ export default {
data() {
return {
ship: null,
id: null
id: null,
shipTypeEnum: []
}
},
onLoad(options) {
@ -75,9 +76,53 @@ export default {
this.ship = null;
}
}
this.fetchShipDetail();
},
onShow(){
this.fetchShipPropertyEnum().then(() => {
this.fetchShipDetail();
});
},
methods: {
getShipTypeName(type) {
if (!Array.isArray(this.shipTypeEnum)) return type;
const found = this.shipTypeEnum.find(item => item.value === type?.toString());
return found ? found.label : type;
},
async fetchShipPropertyEnum() {
const token = uni.getStorageSync('token');
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' });
return false;
}
uni.showLoading({ title: '加载中...' });
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: API.SHIP_PROPERTY_ENUM,
method: 'GET',
data: { token },
success: resolve,
fail: reject
});
});
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
const shipTypeRaw = res.data.data.ship_type || {};
this.shipTypeEnum = Object.entries(shipTypeRaw).map(([label, value]) => ({
label,
value: value.toString()
}));
return true;
} else {
uni.showToast({ title: res.data.errmsg || '获取枚举失败', icon: 'none' });
return false;
}
} catch (error) {
uni.hideLoading();
uni.showToast({ title: error.message || '网络错误', icon: 'none' });
return false;
}
},
async fetchShipDetail() {
const token = uni.getStorageSync('token');
if (!token) {

@ -6,7 +6,7 @@
</view>
<view class="content-area">
<view v-if="shipList.length === 0" class="empty-tip">
<image src="/static/images/empty.png" mode="aspectFit" class="empty-img" />
<image src="/static/empty.png" mode="aspectFit" class="empty-img" />
<text class="empty-text">暂无船只信息</text>
</view>
<view v-else>

@ -1,43 +1,20 @@
<template>
<view class="message-page">
<view class="header-title">消息</view>
<!-- 消息卡片列表 -->
<view class="message-list">
<!-- 实时 -->
<view class="message-card realtime">
<view
v-for="(item, idx) in noticeList"
:key="item.id"
class="message-card"
>
<view class="message-card-header">
<view class="tag realtime"><text class="tag-text">实时</text></view>
<view class="date">2024-01-15 10:30</view>
<view class="tag" :style="{ background: tagColors[idx % tagColors.length] }">
<text class="tag-text">{{ item.type_name }}</text>
</view>
<view class="date">{{ formatChinaDate(item.created_at) }}</view>
</view>
<view class="message-title">过闸通知</view>
<view class="message-content">北向南2025040102批次准备过闸请相关船只做好准备</view>
</view>
<!-- 公告 -->
<view class="message-card notice">
<view class="message-card-header">
<view class="tag notice"><text class="tag-text">公告</text></view>
<view class="date">2024-01-15 10:30</view>
</view>
<view class="message-title">系统维护通知</view>
<view class="message-content">系统将于2024年1月20凌晨2:00-4:00进行例行维护期间在线服务暂停使用</view>
</view>
<!-- 预警 -->
<view class="message-card warning">
<view class="message-card-header">
<view class="tag warning"><text class="tag-text">预警</text></view>
<view class="date">2024-01-15 10:30</view>
</view>
<view class="message-title">天气预警</view>
<view class="message-content">受寒潮影响未来24小时内可能出现大雾天气请过往船只注意安全</view>
</view>
<!-- 提醒 -->
<view class="message-card remind">
<view class="message-card-header">
<view class="tag remind"><text class="tag-text">提醒</text></view>
<view class="date">2024-01-15 10:30</view>
</view>
<view class="message-title">购票成功</view>
<view class="message-content">您已成功购买北向南2025040101批次过闸船票请按时到达指定位置</view>
<view class="message-title">{{ item.title }}</view>
<view class="message-content">{{ item.content }}</view>
</view>
</view>
</view>
@ -49,10 +26,14 @@ export default {
name: 'MessagePage',
data() {
return {
notifications: [],
page: 1,
per_page: 5,
status: '', // : '', 'unread', 'read'
noticeList: [],
tagColors: [
'linear-gradient(90deg, #ffb980 0%, #ffc99a 100%)',
'linear-gradient(90deg, #217aff 0%, #3b7cff 100%)',
'linear-gradient(90deg, #ff5c5c 0%, #ff7a7a 100%)',
'linear-gradient(90deg, #22c58b 0%, #2ed9a3 100%)',
'#f39c12', '#8e44ad', '#16a085'
]
}
},
onShow() {
@ -65,20 +46,28 @@ export default {
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}` : ''}`,
url: `${API.NOTIFICATION_LIST}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
this.notifications = res.data.data.list || [];
this.noticeList = Array.isArray(res.data.data.data) ? res.data.data.data : [];
}
} catch (e) {
console.error('Failed to fetch notifications:', e);
}
},
},
formatChinaDate(dateStr) {
if (!dateStr) return '';
const date = new Date(dateStr);
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}`;
}
}
}
</script>
@ -138,20 +127,18 @@ export default {
white-space: nowrap;
color: #fff;
display: inline-block;
background: linear-gradient(90deg, #2b70ee 0%, #3b7cff 100%);
transform: skewX(-20deg);
font-weight: 500;
border: none;
transform: skewX(-20deg);
}
.tag-text {
display: inline-block;
transform: skewX(20deg);
}
.tag.realtime { background: linear-gradient(90deg, #ffb980 0%, #ffc99a 100%); }
.tag.notice { background: linear-gradient(90deg, #217aff 0%, #3b7cff 100%); }
.tag.warning { background: linear-gradient(90deg, #ff5c5c 0%, #ff7a7a 100%); }
.tag.remind { background: linear-gradient(90deg, #22c58b 0%, #2ed9a3 100%); }
.date { color: #173766; font-size: 15px; }
.date {
color: #173766;
font-size: 15px;
}
.message-title {
font-size: 16px;
font-weight: 550;

@ -110,10 +110,7 @@ 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');

@ -59,8 +59,15 @@
<view class="card">
<view class="card-title">航行方向</view>
<view class="direction-row">
<button class="direction-btn" :class="{ active: direction === 'north' }" @click="setDirection('north')"> </button>
<button class="direction-btn" :class="{ active: direction === 'south' }" @click="setDirection('south')"> </button>
<button
v-for="item in directionEnum"
:key="item.value"
class="direction-btn"
:class="{ active: direction === item.value }"
@click="setDirection(item.value)"
>
{{ item.label }}
</button>
</view>
</view>
@ -105,7 +112,7 @@ export default {
components: { NavBar },
data() {
return {
direction: 'north',
direction: '',
shipList: [],
currentShip: {
total_length: '',
@ -115,14 +122,17 @@ export default {
total_tonnage: '',
ship_type: ''
},
directionEnum: [],
shipTypeEnum: [],
agreeNotice: false,
gateDate: 'today', // ""
}
},
onShow() {
this.fetchShipTypeEnum().then(() => {
this.fetchShipList();
this.fetchDirectionEnum().then(() => {
this.fetchShipTypeEnum().then(() => {
this.fetchShipList();
});
});
},
methods: {
@ -141,8 +151,17 @@ export default {
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
// this.ship = res.data.data;
if (!res.data.data) {
uni.showToast({ title: '暂无船舶信息', icon: 'none' });
setTimeout(() => {
uni.navigateBack();
uni.navigateTo({ url: '/pages/index/ship_manage' });
}, 1000);
return;
}
this.currentShip = {
id: res.data.data.id,
@ -153,12 +172,36 @@ export default {
total_tonnage: res.data.data.total_tonnage,
ship_type: res.data.data.ship_type
};
}
} catch (e) {
//
}
},
async fetchDirectionEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.GET_DIRECTION_ENUM}?token=${token}`,
method: 'GET',
success: resolve,
fail: reject
});
});
if (res.data && res.data.errcode === 0) {
// [{label, value}]
this.directionEnum = Object.keys(res.data.data).map(label => ({
label,
value: res.data.data[label]
}));
//
if (this.directionEnum.length && !this.direction) {
this.direction = this.directionEnum[0].value;
}
}
} catch (e) {}
},
async fetchShipTypeEnum() {
const token = uni.getStorageSync('token');
if (!token) return;
@ -205,8 +248,7 @@ export default {
return;
}
// direction: north->in, south->out
const directionMap = { north: 'in', south: 'out' };
const directionValue = directionMap[this.direction] || 'in';
const directionValue = this.direction || 'in';
//
let gateDateStr = '';
@ -257,7 +299,7 @@ export default {
}
</script>
<style scoped>
<style lang="scss" scoped>
.reservation-page {
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
min-height: 100vh;
@ -376,6 +418,11 @@ export default {
align-items: center;
justify-content: center;
margin: 0 20rpx;
border: none;
outline: none;
&::after {
border: none;
}
}
.direction-btn.active, .batch-btn.active {
background: #217aff;

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

@ -99,7 +99,7 @@
background: #fff;
border-radius: 22rpx;
margin: 24rpx;
padding: 48rpx 32rpx 32rpx 32rpx;
padding: 32rpx;
box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.08);
position: relative;
margin-top: -140rpx;
@ -108,7 +108,8 @@
.process-title-bar.data-v-57280228 {
width: 60%;
margin: 0 auto;
margin-top: -47rpx;
position: relative;
top: -32rpx;
background: linear-gradient(180deg, #2f4dff 0%, #4b65ff 100%);
color: #fff;
font-size: 28rpx;
@ -118,14 +119,13 @@
text-align: center;
box-shadow: 0 4rpx 16rpx rgba(59,124,255,0.12);
z-index: 2;
position: relative;
}
.process-flow.data-v-57280228 {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 12rpx;
margin-top: 38rpx;
margin-top: 10rpx;
}
.process-step.data-v-57280228 {
display: flex;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -132,7 +132,7 @@
}
.form-input.data-v-06a59818 {
flex: 1;
font-size: 24rpx;
font-size: 28rpx;
color: #333;
border: none;
outline: none;
@ -163,6 +163,9 @@
color: #fff;
box-shadow: 0 4rpx 16rpx rgba(33, 122, 255, 0.08);
transition: background 0.2s;
display: flex;
align-items: center;
justify-content: center;
}
.step-btn.single-btn.data-v-06a59818 {
min-width: 420rpx;

File diff suppressed because one or more lines are too long

@ -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>
<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">{{$root.m0}}</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.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 class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">第三页</text><image style="width:80px;height:80px;" src="{{$root.m3}}" 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>

@ -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="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>
<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/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>

@ -1,2 +1,2 @@
(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"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/message/index"],{274:function(t,e,n){"use strict";(function(t,e){var r=n(4);n(26);r(n(25));var a=r(n(275));t.__webpack_require_UNI_MP_PLUGIN__=n,e(a.default)}).call(this,n(1)["default"],n(2)["createPage"])},275:function(t,e,n){"use strict";n.r(e);var r=n(276),a=n(278);for(var c in a)["default"].indexOf(c)<0&&function(t){n.d(e,t,(function(){return a[t]}))}(c);n(280);var i,o=n(33),u=Object(o["default"])(a["default"],r["render"],r["staticRenderFns"],!1,null,"191297be",null,!1,r["components"],i);u.options.__file="pages/message/index.vue",e["default"]=u.exports},276:function(t,e,n){"use strict";n.r(e);var r=n(277);n.d(e,"render",(function(){return r["render"]})),n.d(e,"staticRenderFns",(function(){return r["staticRenderFns"]})),n.d(e,"recyclableRender",(function(){return r["recyclableRender"]})),n.d(e,"components",(function(){return r["components"]}))},277:function(t,e,n){"use strict";var r;n.r(e),n.d(e,"render",(function(){return a})),n.d(e,"staticRenderFns",(function(){return i})),n.d(e,"recyclableRender",(function(){return c})),n.d(e,"components",(function(){return r}));var a=function(){var t=this,e=t.$createElement,n=(t._self._c,t.tagColors.length),r=t.__map(t.noticeList,(function(e,n){var r=t.__get_orig(e),a=t.formatChinaDate(e.created_at);return{$orig:r,m0:a}}));t.$mp.data=Object.assign({},{$root:{g0:n,l0:r}})},c=!1,i=[];a._withStripped=!0},278:function(t,e,n){"use strict";n.r(e);var r=n(279),a=n.n(r);for(var c in r)["default"].indexOf(c)<0&&function(t){n.d(e,t,(function(){return r[t]}))}(c);e["default"]=a.a},279:function(t,e,n){"use strict";(function(t){var r=n(4);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var a=r(n(44)),c=r(n(46)),i=n(30),o={name:"MessagePage",data:function(){return{noticeList:[],tagColors:["linear-gradient(90deg, #ffb980 0%, #ffc99a 100%)","linear-gradient(90deg, #217aff 0%, #3b7cff 100%)","linear-gradient(90deg, #ff5c5c 0%, #ff7a7a 100%)","linear-gradient(90deg, #22c58b 0%, #2ed9a3 100%)","#f39c12","#8e44ad","#16a085"]}},onShow:function(){this.fetchNotifications()},methods:{fetchNotifications:function(){var e=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=t.getStorageSync("token"),r){n.next=3;break}return n.abrupt("return");case 3:return n.prev=3,n.next=6,new Promise((function(e,n){t.request({url:"".concat(i.API.NOTIFICATION_LIST,"?token=").concat(r),method:"GET",success:e,fail:n})}));case 6:c=n.sent,c.data&&0===c.data.errcode&&(e.noticeList=Array.isArray(c.data.data.data)?c.data.data.data:[]),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]])})))()},formatChinaDate:function(t){if(!t)return"";var e=new Date(t),n=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return"".concat(n,"-").concat(r,"-").concat(a)}}};e.default=o}).call(this,n(2)["default"])},280:function(t,e,n){"use strict";n.r(e);var r=n(281),a=n.n(r);for(var c in r)["default"].indexOf(c)<0&&function(t){n.d(e,t,(function(){return r[t]}))}(c);e["default"]=a.a},281:function(t,e,n){}},[[274,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/message/index.js.map

@ -1 +1 @@
<view class="message-page data-v-191297be"><view class="header-title data-v-191297be">消息</view><view class="message-list data-v-191297be"><view class="message-card realtime data-v-191297be"><view class="message-card-header data-v-191297be"><view class="tag realtime data-v-191297be"><text class="tag-text data-v-191297be">实时</text></view><view class="date data-v-191297be">2024-01-15 10:30</view></view><view class="message-title data-v-191297be">过闸通知</view><view class="message-content data-v-191297be">北向南2025040102批次准备过闸请相关船只做好准备。</view></view><view class="message-card notice data-v-191297be"><view class="message-card-header data-v-191297be"><view class="tag notice data-v-191297be"><text class="tag-text data-v-191297be">公告</text></view><view class="date data-v-191297be">2024-01-15 10:30</view></view><view class="message-title data-v-191297be">系统维护通知</view><view class="message-content data-v-191297be">系统将于2024年1月20凌晨2:00-4:00进行例行维护期间在线服务暂停使用。</view></view><view class="message-card warning data-v-191297be"><view class="message-card-header data-v-191297be"><view class="tag warning data-v-191297be"><text class="tag-text data-v-191297be">预警</text></view><view class="date data-v-191297be">2024-01-15 10:30</view></view><view class="message-title data-v-191297be">天气预警</view><view class="message-content data-v-191297be">受寒潮影响未来24小时内可能出现大雾天气请过往船只注意安全。</view></view><view class="message-card remind data-v-191297be"><view class="message-card-header data-v-191297be"><view class="tag remind data-v-191297be"><text class="tag-text data-v-191297be">提醒</text></view><view class="date data-v-191297be">2024-01-15 10:30</view></view><view class="message-title data-v-191297be">购票成功</view><view class="message-content data-v-191297be">您已成功购买北向南2025040101批次过闸船票请按时到达指定位置。</view></view></view></view>
<view class="message-page data-v-191297be"><view class="header-title data-v-191297be">消息</view><view class="message-list data-v-191297be"><block wx:for="{{$root.l0}}" wx:for-item="item" wx:for-index="idx" wx:key="id"><view class="message-card data-v-191297be"><view class="message-card-header data-v-191297be"><view class="tag data-v-191297be" style="{{'background:'+(tagColors[idx%$root.g0])+';'}}"><text class="tag-text data-v-191297be">{{item.$orig.type_name}}</text></view><view class="date data-v-191297be">{{item.m0}}</view></view><view class="message-title data-v-191297be">{{item.$orig.title}}</view><view class="message-content data-v-191297be">{{item.$orig.content}}</view></view></block></view></view>

@ -54,26 +54,19 @@
white-space: nowrap;
color: #fff;
display: inline-block;
background: linear-gradient(90deg, #2b70ee 0%, #3b7cff 100%);
-webkit-transform: skewX(-20deg);
transform: skewX(-20deg);
font-weight: 500;
border: none;
-webkit-transform: skewX(-20deg);
transform: skewX(-20deg);
}
.tag-text.data-v-191297be {
display: inline-block;
-webkit-transform: skewX(20deg);
transform: skewX(20deg);
}
.tag.realtime.data-v-191297be { background: linear-gradient(90deg, #ffb980 0%, #ffc99a 100%);
}
.tag.notice.data-v-191297be { background: linear-gradient(90deg, #217aff 0%, #3b7cff 100%);
}
.tag.warning.data-v-191297be { background: linear-gradient(90deg, #ff5c5c 0%, #ff7a7a 100%);
}
.tag.remind.data-v-191297be { background: linear-gradient(90deg, #22c58b 0%, #2ed9a3 100%);
}
.date.data-v-191297be { color: #173766; font-size: 15px;
.date.data-v-191297be {
color: #173766;
font-size: 15px;
}
.message-title.data-v-191297be {
font-size: 16px;

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.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>
<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"><block wx:for="{{directionEnum}}" wx:for-item="item" wx:for-index="__i0__" wx:key="value"><button data-event-opts="{{[['tap',[['setDirection',['$0'],[[['directionEnum','value',item.value,'value']]]]]]]}}" class="{{['direction-btn','data-v-f5e463b4',(direction===item.value)?'active':'']}}" bindtap="__e">{{''+item.label+''}}</button></block></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>

@ -1,4 +1,18 @@
@charset "UTF-8";
/* 颜色变量 */
/* 行为相关颜色 */
/* 文字基本颜色 */
/* 背景颜色 */
/* 边框颜色 */
/* 尺寸变量 */
/* 文字尺寸 */
/* 图片尺寸 */
/* Border Radius */
/* 水平间距 */
/* 垂直间距 */
/* 透明度 */
/* 文章场景相关 */
/* uni.scss */
.reservation-page.data-v-f5e463b4 {
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
min-height: 100vh;
@ -13,7 +27,7 @@
right: 0;
z-index: 100;
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.header.data-v-f5e463b4 {
display: flex;
@ -36,7 +50,7 @@
background: #fff;
border-radius: 18px;
margin: 0 16px 16px 16px;
box-shadow: 0 2px 8px rgba(0,0,0,0.04);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
padding: 18px 18px 12px 18px;
margin-top: 20px;
}
@ -118,6 +132,11 @@
align-items: center;
justify-content: center;
margin: 0 20rpx;
border: none;
outline: none;
}
.direction-btn.data-v-f5e463b4::after, .batch-btn.data-v-f5e463b4::after {
border: none;
}
.direction-btn.active.data-v-f5e463b4, .batch-btn.active.data-v-f5e463b4 {
background: #217aff;
@ -172,7 +191,7 @@
right: 0;
bottom: 0;
background: #fcfcfc;
box-shadow: 0 -2rpx 16rpx rgba(59,124,255,0.08);
box-shadow: 0 -2rpx 16rpx rgba(59, 124, 255, 0.08);
padding: 24rpx 24rpx 32rpx 24rpx;
z-index: 999;
display: flex;
@ -188,7 +207,7 @@
font-weight: 500;
border: none;
outline: none;
box-shadow: 0 4rpx 16rpx rgba(33,122,255,0.08);
box-shadow: 0 4rpx 16rpx rgba(33, 122, 255, 0.08);
transition: background 0.2s;
}
.reservation-scroll.data-v-f5e463b4 {

Loading…
Cancel
Save