添加接口

main
lynn 11 months ago
parent 8c138f9493
commit 90f0f352b3

@ -44,6 +44,23 @@
success: (res) => {
console.log('获取用户信息成功:', res.data)
//
//
uni.request({
url: API.SHIP_PROPERTY_ENUM,
method: 'POST',
data: { token },
success: (res) => {
console.log('获取船舶属性枚举成功:', res.data)
//
if (res.data.errcode === 0) {
uni.setStorageSync('shipPropertyEnum', res.data.data)
}
},
fail: (err) => {
console.error('获取船舶属性枚举失败:', err)
}
})
},
fail: (err) => {
console.error('获取用户信息失败:', err)

@ -5,5 +5,9 @@ export const BASE_URL = 'https://xukoushuniu.115.langye.net'
export const API = {
LOGIN: `${BASE_URL}/api/customer/login-by-code`,
GET_USER_INFO: `${BASE_URL}/api/customer/me`,
// 其他API接口可以在这里添加
UPLOAD_FILE:`${BASE_URL}/api/customer/upload-file`,
SHIP_CREATE: `${BASE_URL}/api/customer/ship/create`,
SHIP_INDEX: `${BASE_URL}/api/customer/ship/index`,
SHIP_DETAIL: `${BASE_URL}/api/customer/ship/get-one`,
SHIP_PROPERTY_ENUM: `${BASE_URL}/api/customer/ship/property-enum`,
}

@ -1,7 +1,7 @@
<template>
<view class="reservation-page">
<view class="fixed-nav">
<NavBar title="添加船只" />
<NavBar :title="isEdit ? '编辑船只' : '添加船只'" />
</view>
<view class="content-area">
<!-- 步骤条 -->
@ -18,19 +18,19 @@
<view class="info-form">
<view class="form-row">
<text class="form-label required">船舶所有人</text>
<input class="form-input" placeholder="姓名与身份证一致" />
<input class="form-input" v-model="form.owner" placeholder="姓名与身份证一致" />
</view>
<view class="form-row">
<text class="form-label required">身份证号</text>
<input class="form-input" placeholder="输入正确的18位身份证号码" />
<input class="form-input" v-model="form.idCard" placeholder="输入正确的18位身份证号码" />
</view>
<view class="form-row">
<text class="form-label required">联系电话</text>
<input class="form-input" placeholder="11位常用的手机号" />
<input class="form-input" v-model="form.phone" placeholder="11位常用的手机号" />
</view>
<view class="form-row">
<text class="form-label required">船舶编号</text>
<text class="form-static">ZJ12345</text>
<input class="form-input" v-model="form.shipNo" placeholder="请输入船舶编号" />
</view>
</view>
</view>
@ -40,47 +40,47 @@
<!-- 总吨位 -->
<view class="form-row">
<text class="form-label required">总吨位</text>
<input class="form-input" placeholder="请输入总吨位" />
<input class="form-input" v-model="form.ton" placeholder="请输入总吨位" />
<text class="form-unit"></text>
</view>
<view class="form-tip">填写船舶的总吨位数值</view>
<!-- 总长度 -->
<view class="form-row">
<text class="form-label required">总长度</text>
<input class="form-input" placeholder="请输入总长度" />
<input class="form-input" v-model="form.length" placeholder="请输入总长度" />
<text class="form-unit"></text>
</view>
<view class="form-tip">填写船舶的总长度数值</view>
<!-- 总宽 -->
<view class="form-row">
<text class="form-label required">总宽</text>
<input class="form-input" placeholder="请输入总宽" />
<input class="form-input" v-model="form.width" placeholder="请输入总宽" />
<text class="form-unit"></text>
</view>
<view class="form-tip">填写船舶的总宽数值</view>
<!-- 型深 -->
<view class="form-row">
<text class="form-label required">型深</text>
<input class="form-input" placeholder="请输入型深" />
<input class="form-input" v-model="form.depth" placeholder="请输入型深" />
<text class="form-unit"></text>
</view>
<view class="form-tip">填写船舶的型深数值</view>
<!-- 参考载重吨位 -->
<view class="form-row">
<text class="form-label required">参考载重吨位</text>
<radio-group class="form-radio-group">
<label class="form-radio"><radio value="B" />B级</label>
<label class="form-radio"><radio value="C" />C级</label>
<radio-group class="form-radio-group" v-model="form.tonLevel" @change="onTonLevelChange">
<radio class="form-radio" value="B" :checked="form.tonLevel === 'B'">B级</radio>
<radio class="form-radio" value="C" :checked="form.tonLevel === 'C'">C级</radio>
</radio-group>
</view>
<view class="form-tip">请选择船舶的参考载重吨位等级</view>
<!-- 船型 -->
<view class="form-row">
<text class="form-label required">船型</text>
<radio-group class="form-radio-group">
<label class="form-radio"><radio value="平" /></label>
<label class="form-radio"><radio value="尖" /></label>
<label class="form-radio"><radio value="槽罐船" />槽罐船</label>
<radio-group class="form-radio-group" v-model="form.shipType" @change="onShipTypeChange">
<radio class="form-radio" value="1" :checked="form.shipType === '1'"></radio>
<radio class="form-radio" value="2" :checked="form.shipType === '2'"></radio>
<radio class="form-radio" value="3" :checked="form.shipType === '3'">槽罐船</radio>
</radio-group>
</view>
<view class="form-tip">请选择船舶的类型</view>
@ -103,7 +103,7 @@
</view>
<view v-if="page1Img" class="upload-del" @click="deleteImage('page1')">×</view>
</view>
<view class="upload-desc">第一页的名称说明</view>
<input class="upload-desc" v-model="page1Desc" placeholder="请输入第一页说明" />
</view>
</view>
<view class="divider"></view>
@ -119,7 +119,23 @@
</view>
<view v-if="page2Img" class="upload-del" @click="deleteImage('page2')">×</view>
</view>
<view class="upload-desc">第二页的名称说明</view>
<input class="upload-desc" v-model="page2Desc" placeholder="请输入第二页说明" />
</view>
</view>
<view class="divider"></view>
<!-- 第三页 -->
<view class="upload-section">
<text class="form-label required">第三页</text>
<view class="upload-row">
<view class="upload-img-box">
<image v-if="page3Img" :src="page3Img" class="upload-img" />
<view v-else class="upload-add" @click="chooseImage('page3')">
<text>+</text>
<text>添加图片</text>
</view>
<view v-if="page3Img" class="upload-del" @click="deleteImage('page3')">×</view>
</view>
<input class="upload-desc" v-model="page3Desc" placeholder="请输入第三页说明" />
</view>
</view>
</view>
@ -127,7 +143,10 @@
<view v-if="currentStep === 4" class="info-card">
<view class="info-title">签名确认</view>
<view class="sign-declare-row">
<checkbox v-model="signChecked" />
<view style="position: relative; display: flex; align-items: center;">
<checkbox :checked="signChecked" />
<view style="position: absolute; left: 0; top: 0; right: 0; bottom: 0; background: rgba(0,0,0,0);" @tap="toggleSignChecked"></view>
</view>
<text class="sign-declare-text">
本人承诺所提供材料皆真实有效如有虚假本人承担因此造成的全部责任
</text>
@ -179,6 +198,8 @@
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
export default {
name: 'ShipManagerPage',
components: { NavBar },
@ -188,6 +209,10 @@ export default {
currentStep: 1,
page1Img: '',
page2Img: '',
page3Img: '',
originalPage1Img: '',
originalPage2Img: '',
originalPage3Img: '',
signChecked: false,
signImg: '',
isSigning: false,
@ -195,76 +220,359 @@ export default {
canvasWidth: 0,
canvasHeight: 0,
hasDrawn: false,
hasSigned: false
hasSigned: false,
isEdit: false,
form: {
owner: 'sdf',
idCard: '510521198904074359',
phone: '12312312311',
shipNo: '111',
ton: '',
length: '',
width: '',
depth: '',
tonLevel: 'B',
shipType: '1',
page1FileId: '',
page2FileId: '',
page3FileId: ''
},
page1Desc: '',
page2Desc: '',
page3Desc: ''
}
},
onLoad(options) {
if (options.edit === '1' && options.ship) {
try {
const ship = JSON.parse(decodeURIComponent(options.ship));
this.isEdit = true;
//
this.form.owner = ship.owner_name || '';
this.form.idCard = ship.id_card || '';
this.form.phone = ship.phone || '';
this.form.shipNo = ship.ship_number || '';
this.form.ton = ship.total_tonnage || '';
this.form.length = ship.total_length || '';
this.form.width = ship.total_width || '';
this.form.depth = ship.molded_depth || '';
this.form.tonLevel = ship.tonnage_class || '';
this.form.shipType = ship.ship_type || '';
this.form.page1FileId = ship.picture1 || '';
this.form.page2FileId = ship.picture2 || '';
this.form.page3FileId = ship.picture3 || '';
//
this.page1Img = this.getFileUrl(ship.picture1);
this.page2Img = this.getFileUrl(ship.picture2);
this.page3Img = this.getFileUrl(ship.picture3);
this.originalPage1Img = this.page1Img;
this.originalPage2Img = this.page2Img;
this.originalPage3Img = this.page3Img;
//
} catch (e) {}
}
},
methods: {
nextStep() {
getFileUrl(fileId) {
if (!fileId) return '';
return `${API.BASE_URL}/api/customer/upload-file/preview?id=${fileId}`;
},
async uploadFile(filePath) {
return new Promise((resolve, reject) => {
const token = uni.getStorageSync('token')
if (!token) {
reject(new Error('未登录或登录已过期'))
return
}
uni.uploadFile({
url: API.UPLOAD_FILE,
filePath: filePath,
name: 'file',
header: {
'Authorization': `Bearer ${token}`
},
success: (res) => {
if (res.statusCode === 200) {
const data = JSON.parse(res.data)
if (data.errcode && data.errcode !== 0) {
reject(new Error(data.errmsg || 'Upload failed'))
} else {
resolve(data)
}
} else {
reject(new Error('Upload failed'))
}
},
fail: (err) => {
reject(err)
}
})
})
},
async nextStep() {
if (this.currentStep === 1) {
//
if (!this.form.owner) {
uni.showToast({ title: '请填写船舶所有人', icon: 'none' });
return;
}
if (!this.form.idCard) {
uni.showToast({ title: '请填写身份证号', icon: 'none' });
return;
}
if (!/^[1-9]\d{5}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[0-9Xx]$/.test(this.form.idCard)) {
uni.showToast({ title: '身份证号格式不正确', icon: 'none' });
return;
}
if (!this.form.phone) {
uni.showToast({ title: '请填写联系电话', icon: 'none' });
return;
}
if (!/^\d{11}$/.test(this.form.phone)) {
uni.showToast({ title: '联系电话格式不正确', icon: 'none' });
return;
}
if (!this.form.shipNo) {
uni.showToast({ title: '请填写船舶编号', icon: 'none' });
return;
}
}
if (this.currentStep === 2) {
if (!this.form.ton) {
uni.showToast({ title: '请填写总吨位', icon: 'none' });
return;
}
if (!this.form.length) {
uni.showToast({ title: '请填写总长度', icon: 'none' });
return;
}
if (!this.form.width) {
uni.showToast({ title: '请填写总宽', icon: 'none' });
return;
}
if (!this.form.depth) {
uni.showToast({ title: '请填写型深', icon: 'none' });
return;
}
if (!this.form.tonLevel) {
uni.showToast({ title: '请选择参考载重吨位', icon: 'none' });
return;
}
if (!this.form.shipType) {
uni.showToast({ title: '请选择船型', icon: 'none' });
return;
}
}
if (this.currentStep === 3) {
// 簿
if (!this.page1Img) {
uni.showToast({ title: '请上传第一页图片', icon: 'none' });
return;
}
if (!this.page2Img) {
uni.showToast({ title: '请上传第二页图片', icon: 'none' });
return;
}
if (!this.page3Img) {
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();
uni.showToast({ title: error.message || '上传失败,请重试', icon: 'none' });
return;
}
}
if (this.currentStep < 4) this.currentStep++
},
async submit() {
//
if (!this.signChecked) {
uni.showToast({ title: '请勾选承诺声明', icon: 'none' });
return;
}
if (!this.hasSigned) {
uni.showToast({ title: '请完成签名', icon: 'none' });
return;
}
try {
uni.showLoading({ title: '处理中...' });
const signBase64 = await this.getSignBase64();
const token = uni.getStorageSync('token');
if (!token) {
uni.hideLoading();
uni.showToast({ title: '登录已失效', icon: 'none' });
return;
}
//
const params = {
token,
owner_name: this.form.owner,
id_card: this.form.idCard,
phone: this.form.phone,
ship_number: this.form.shipNo,
total_tonnage: this.form.ton,
total_length: this.form.length,
total_width: this.form.width,
molded_depth: this.form.depth,
tonnage_class: this.form.tonLevel,
ship_type: this.form.shipType,
picture1: this.form.page1FileId,
picture2: this.form.page2FileId,
picture3: this.form.page3FileId,
signature: signBase64
};
//
const res = await new Promise((resolve, reject) => {
uni.request({
url: API.SHIP_CREATE,
method: 'POST',
data: params,
header: {
'Content-Type': 'application/json'
},
success: resolve,
fail: reject
});
});
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
uni.showToast({ title: '提交成功', icon: 'success' });
setTimeout(() => {
uni.navigateBack();
}, 800);
} else {
uni.showToast({ title: res.data.errmsg || '提交失败', icon: 'none' });
}
} catch (error) {
uni.hideLoading();
uni.showToast({ title: error.message || '提交失败,请重试', icon: 'none' });
}
},
prevStep() {
if (this.currentStep > 1) this.currentStep--
},
submit() {
uni.showToast({ title: '提交成功', icon: 'success' })
},
chooseImage(page) {
uni.chooseImage({
count: 1,
success: (res) => {
if (page === 'page1') this.page1Img = res.tempFilePaths[0]
if (page === 'page2') this.page2Img = res.tempFilePaths[0]
if (page === 'page1') {
this.page1Img = res.tempFilePaths[0]
this.originalPage1Img = res.tempFilePaths[0]
}
if (page === 'page2') {
this.page2Img = res.tempFilePaths[0]
this.originalPage2Img = res.tempFilePaths[0]
}
if (page === 'page3') {
this.page3Img = res.tempFilePaths[0]
this.originalPage3Img = res.tempFilePaths[0]
}
}
})
},
deleteImage(page) {
if (page === 'page1') this.page1Img = ''
if (page === 'page2') this.page2Img = ''
if (page === 'page1') {
this.page1Img = ''
this.originalPage1Img = ''
this.form.page1FileId = ''
}
if (page === 'page2') {
this.page2Img = ''
this.originalPage2Img = ''
this.form.page2FileId = ''
}
if (page === 'page3') {
this.page3Img = ''
this.originalPage3Img = ''
this.form.page3FileId = ''
}
},
viewExample() {
uni.showToast({ title: '查看示例', icon: 'none' })
},
startSign(e) {
this.isSigning = true
this.hasSigned = true
const ctx = uni.createCanvasContext('signCanvas', this)
const { x, y } = e.touches[0]
this.isSigning = true;
this.hasSigned = true;
const ctx = uni.createCanvasContext('signCanvas', this);
const { x, y } = e.touches[0];
//
if (!this.hasDrawn) {
ctx.setFillStyle('#fff')
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight)
this.hasDrawn = true
ctx.setFillStyle('#fff');
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
this.hasDrawn = true;
}
ctx.moveTo(x, y)
ctx.setStrokeStyle('#222')
ctx.setLineWidth(4)
ctx.beginPath()
this.lastPoint = { x, y }
ctx.draw(true)
ctx.moveTo(x, y);
ctx.setStrokeStyle('#222');
ctx.setLineWidth(4);
ctx.beginPath();
this.lastPoint = { x, y };
ctx.draw(true);
},
moveSign(e) {
if (!this.isSigning) return
const ctx = uni.createCanvasContext('signCanvas', this)
const { x, y } = e.touches[0]
ctx.moveTo(this.lastPoint.x, this.lastPoint.y)
ctx.lineTo(x, y)
ctx.setStrokeStyle('#222')
ctx.setLineWidth(4)
ctx.stroke()
ctx.draw(true)
this.lastPoint = { x, y }
if (!this.isSigning) return;
const ctx = uni.createCanvasContext('signCanvas', this);
const { x, y } = e.touches[0];
ctx.moveTo(this.lastPoint.x, this.lastPoint.y);
ctx.lineTo(x, y);
ctx.setStrokeStyle('#222');
ctx.setLineWidth(4);
ctx.stroke();
ctx.draw(true);
this.lastPoint = { x, y };
},
endSign() {
this.isSigning = false
this.isSigning = false;
},
resetSign() {
this.signImg = ''
this.hasDrawn = false
this.hasSigned = false
const ctx = uni.createCanvasContext('signCanvas', this)
ctx.setFillStyle('#fff')
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight)
ctx.draw()
this.signImg = '';
this.hasDrawn = false;
this.hasSigned = false;
const ctx = uni.createCanvasContext('signCanvas', this);
ctx.setFillStyle('#fff');
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
ctx.draw();
},
previewSign() {
uni.createSelectorQuery().select('#signCanvas').boundingClientRect(rect => {
@ -283,6 +591,48 @@ export default {
}
}, this)
}).exec()
},
onTonLevelChange(e) {
this.form.tonLevel = e.detail.value
console.log(e.detail.value)
},
onShipTypeChange(e) {
this.form.shipType = e.detail.value
},
toggleSignChecked() {
this.signChecked = !this.signChecked;
},
// base64
getSignBase64() {
return new Promise((resolve, reject) => {
uni.canvasToTempFilePath({
canvasId: 'signCanvas',
success: (res) => {
// #ifdef H5
// H5 base64
resolve(res.tempFilePath);
// #endif
// #ifndef H5
// FileSystemManager base64
if (typeof wx !== 'undefined' && wx.getFileSystemManager) {
wx.getFileSystemManager().readFile({
filePath: res.tempFilePath,
encoding: 'base64',
success: (fileRes) => {
resolve(fileRes.data);
},
fail: reject
});
} else {
// fallback
resolve(res.tempFilePath);
}
// #endif
},
fail: reject
}, this);
});
}
}
}

@ -1,43 +1,121 @@
<template>
<view class="ship-detail-bg">
<NavBar title="船舶详情" />
<view class="ship-section">
<view class="section-title">基本信息</view>
<view class="section-row"><text>船舶编号</text><text>ZJ12345</text></view>
<view class="section-row"><text>船舶名称</text><text>苏航666</text></view>
<view class="section-row"><text>船舶类型</text><text>货船</text></view>
<view class="section-row"><text>船籍港</text><text>苏州港</text></view>
<view class="fixed-nav">
<NavBar title="船舶详情" />
</view>
<view class="ship-section">
<view class="section-title">船舶参数</view>
<view class="section-row"><text>总长度</text><text>45</text></view>
<view class="section-row"><text>型宽</text><text>8</text></view>
<view class="section-row"><text>型深</text><text>3.5</text></view>
<view class="section-row"><text>载重吨</text><text>500</text></view>
<view class="content-area">
<view v-if="ship" class="ship-section">
<view class="section-title">基本信息</view>
<view class="section-row"><text>船舶所有人</text><text>{{ ship.owner_name }}</text></view>
<view class="section-row"><text>身份证号</text><text>{{ ship.id_card }}</text></view>
<view class="section-row"><text>联系电话</text><text>{{ ship.phone }}</text></view>
<view class="section-row"><text>船舶编号</text><text>{{ ship.ship_number }}</text></view>
</view>
<view v-if="ship" class="ship-section">
<view class="section-title">船舶参数</view>
<view class="section-row"><text>总吨位</text><text>{{ ship.total_tonnage }}</text></view>
<view class="section-row"><text>总长度</text><text>{{ ship.total_length }}</text></view>
<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>
<view v-if="ship" class="ship-section">
<view class="section-title">船检簿</view>
<view class="section-row">
<text>第一页</text>
<image :src="getFileUrl(ship.picture1)" style="width:80px;height:80px;" mode="aspectFill" />
</view>
<view class="section-row">
<text>第二页</text>
<image :src="getFileUrl(ship.picture2)" style="width:80px;height:80px;" mode="aspectFill" />
</view>
<view class="section-row">
<text>第三页</text>
<image :src="getFileUrl(ship.picture3)" style="width:80px;height:80px;" mode="aspectFill" />
</view>
</view>
<view v-if="ship" class="ship-section">
<view class="section-title">签名确认</view>
<view class="section-row">
<text>签名声明</text>
<text>本人承诺所提供材料皆真实有效如有虚假本人承担因此造成的全部责任</text>
</view>
<view class="section-row">
<text>签名图片</text>
<image :src="'data:image/png;base64,' + ship.signature" style="width:120px;height:60px;" mode="aspectFit" />
</view>
</view>
</view>
<view class="ship-section">
<view class="section-title">证书信息</view>
<view class="section-row"><text>船检证书</text><text>有效期至2025-12-31</text></view>
<view class="section-row"><text>营运证书</text><text>有效期至2025-12-31</text></view>
</view>
<view class="bottom-add-btn" @click="onAdd">
<text class="iconfont" style="font-size: 18px;">添加</text>
<view class="fixed-bottom-btn-bar">
<button class="edit-btn" @click="onEdit"></button>
</view>
</view>
</template>
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
export default {
components: {
NavBar
name: 'ShipDetailPage',
components: { NavBar },
data() {
return {
ship: null,
id: null
}
},
onLoad(options) {
this.id = options.id;
if (options.item) {
try {
this.ship = JSON.parse(decodeURIComponent(options.item));
} catch (e) {
this.ship = null;
}
}
this.fetchShipDetail();
},
methods: {
goBack() {
uni.navigateBack();
async fetchShipDetail() {
const token = uni.getStorageSync('token');
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' });
return;
}
uni.showLoading({ title: '加载中...' });
try {
const res = await new Promise((resolve, reject) => {
uni.request({
url: `${API.SHIP_DETAIL}/${this.id}`,
method: 'GET',
data: { token },
success: resolve,
fail: reject
});
});
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
this.ship = res.data.data;
} else {
uni.showToast({ title: res.data.errmsg || '获取失败', icon: 'none' });
}
} catch (error) {
uni.hideLoading();
uni.showToast({ title: error.message || '网络错误', icon: 'none' });
}
},
onAdd() {
uni.showToast({ title: '点击了添加', icon: 'none' });
getFileUrl(fileId) {
if (!fileId) return '';
// /api/customer/upload-file/preview?id=xxx
return `${API.BASE_URL}/api/customer/upload-file/preview?id=${fileId}`;
},
onEdit() {
if (!this.ship) return;
const shipStr = encodeURIComponent(JSON.stringify(this.ship));
uni.navigateTo({
url: `/pages/index/ship_add?edit=1&ship=${shipStr}`
});
}
}
}
@ -49,6 +127,15 @@ export default {
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);
}
.nav-bar {
display: flex;
align-items: center;
@ -120,4 +207,33 @@ export default {
box-shadow: 0 4px 16px rgba(59,124,255,0.12);
z-index: 99;
}
.content-area {
padding-top: 90px;
padding-bottom: 70px;
}
.fixed-bottom-btn-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 200;
background: rgba(255,255,255,0.95);
display: flex;
justify-content: center;
padding: 16px 0 24px 0;
box-shadow: 0 -2px 8px rgba(0,0,0,0.04);
}
.edit-btn {
min-width: 320rpx;
height: 80rpx;
border-radius: 40rpx;
background: #217aff;
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
outline: none;
box-shadow: 0 4rpx 16rpx rgba(33,122,255,0.08);
transition: background 0.2s;
}
</style>

@ -7,11 +7,11 @@
<view class="content-area">
<view v-for="item in shipList" :key="item.id" class="ship-cell" @click="goDetail(item)">
<view class="ship-title">
船号: <text class="ship-no">{{ item.no }}</text>
船号: <text class="ship-no">{{ item.ship_number }}</text>
</view>
<view class="ship-row">所有人: {{ item.owner }}</view>
<view class="ship-row">所有人: {{ item.owner_name }}</view>
<view class="ship-row">联系电话: {{ item.phone }}</view>
<view class="ship-row">总吨位: {{ item.ton }} </view>
<view class="ship-row">总吨位: {{ item.total_tonnage }} </view>
</view>
<view class="add-cell-btn-bar">
<button class="add-cell-btn" @click="goAdd"></button>
@ -22,26 +22,57 @@
<script>
import NavBar from '@/components/NavBar.vue'
import { API } from '@/config/index.js'
export default {
name: 'ShipManagePage',
components: { NavBar },
data() {
return {
shipList: [
{ id: 1, no: '苏槽123456', owner: '宋卫宗', phone: '18962113007', ton: '40.00' }
//
]
shipList: []
}
},
onLoad() {
this.fetchShipList();
},
methods: {
async fetchShipList() {
const token = uni.getStorageSync('token');
if (!token) {
uni.showToast({ title: '请先登录', icon: 'none' });
return;
}
uni.showLoading({ title: '加载中...' });
try {
console.log(API.SHIP_INDEX)
const res = await new Promise((resolve, reject) => {
uni.request({
url: API.SHIP_INDEX,
method: 'GET',
data: { token },
success: resolve,
fail: reject
});
});
uni.hideLoading();
if (res.data && res.data.errcode === 0) {
this.shipList = res.data.data || [];
} else {
uni.showToast({ title: res.data.errmsg || '获取失败', icon: 'none' });
}
} catch (error) {
uni.hideLoading();
uni.showToast({ title: error.message || '网络错误', icon: 'none' });
}
},
goAdd() {
uni.navigateTo({ url: '/pages/index/ship_add' })
},
goDetail(item) {
uni.navigateTo({
url: `/pages/index/ship_detail?id=${item.id}`
})
}
const itemStr = encodeURIComponent(JSON.stringify(item));
uni.navigateTo({
url: `/pages/index/ship_detail?id=${item.id}&item=${itemStr}`
})
}
}
}
</script>

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

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["common/main"],{0:function(e,t,o){"use strict";(function(e,t){var n=o(4),r=n(o(11));o(26);var u=n(o(27)),c=n(o(25)),a=n(o(34)),f=n(o(36)),i=o(65),l=n(o(207)),s=n(o(208)),d=n(o(66));function p(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function O(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?p(Object(o),!0).forEach((function(t){(0,r.default)(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):p(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}e.__webpack_require_UNI_MP_PLUGIN__=o,c.default.use(f.default);var v=o(209);c.default.mixin(v),c.default.config.productionTip=!1,u.default.mpType="app";var b=new c.default(O({store:a.default},u.default));c.default.prototype.base=i.base,c.default.use(l.default,b),c.default.use(s.default,b),c.default.prototype.$moment=d.default,t(b).$mount()}).call(this,o(1)["default"],o(2)["createApp"])},27:function(e,t,o){"use strict";o.r(t);var n=o(28);for(var r in n)["default"].indexOf(r)<0&&function(e){o.d(t,e,(function(){return n[e]}))}(r);o(31);var u,c,a,f,i=o(33),l=Object(i["default"])(n["default"],u,c,!1,null,null,null,!1,a,f);l.options.__file="App.vue",t["default"]=l.exports},28:function(e,t,o){"use strict";o.r(t);var n=o(29),r=o.n(n);for(var u in n)["default"].indexOf(u)<0&&function(e){o.d(t,e,(function(){return n[e]}))}(u);t["default"]=r.a},29:function(e,t,o){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=o(30),r={onLaunch:function(){console.log("App Launch"),this.wxLogin()},onShow:function(){console.log("App Show")},onHide:function(){console.log("App Hide")},methods:{wxLogin:function(){e.login({provider:"weixin",success:function(t){var o=t.code;console.log("微信登录成功code:",o),e.request({url:n.API.LOGIN,method:"POST",data:{code:o},success:function(t){var o=t.data;if(0===o.errcode){var r=o.data.access_token;console.log("获取 token 成功:",r),e.setStorageSync("token",r),e.request({url:n.API.GET_USER_INFO,method:"POST",data:{token:r},success:function(e){console.log("获取用户信息成功:",e.data)},fail:function(e){console.error("获取用户信息失败:",e)}})}else console.error("登录失败:",o.errmsg)},fail:function(e){console.error("获取 token 失败:",e)}})},fail:function(e){console.error("微信登录失败:",e)}})}}};t.default=r}).call(this,o(2)["default"])},31:function(e,t,o){"use strict";o.r(t);var n=o(32),r=o.n(n);for(var u in n)["default"].indexOf(u)<0&&function(e){o.d(t,e,(function(){return n[e]}))}(u);t["default"]=r.a},32:function(e,t,o){}},[[0,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["common/main"],{0:function(e,t,o){"use strict";(function(e,t){var n=o(4),r=n(o(11));o(26);var u=n(o(27)),c=n(o(25)),a=n(o(34)),l=n(o(36)),f=o(65),i=n(o(207)),s=n(o(208)),d=n(o(66));function p(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function O(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?p(Object(o),!0).forEach((function(t){(0,r.default)(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):p(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}e.__webpack_require_UNI_MP_PLUGIN__=o,c.default.use(l.default);var v=o(209);c.default.mixin(v),c.default.config.productionTip=!1,u.default.mpType="app";var b=new c.default(O({store:a.default},u.default));c.default.prototype.base=f.base,c.default.use(i.default,b),c.default.use(s.default,b),c.default.prototype.$moment=d.default,t(b).$mount()}).call(this,o(1)["default"],o(2)["createApp"])},27:function(e,t,o){"use strict";o.r(t);var n=o(28);for(var r in n)["default"].indexOf(r)<0&&function(e){o.d(t,e,(function(){return n[e]}))}(r);o(31);var u,c,a,l,f=o(33),i=Object(f["default"])(n["default"],u,c,!1,null,null,null,!1,a,l);i.options.__file="App.vue",t["default"]=i.exports},28:function(e,t,o){"use strict";o.r(t);var n=o(29),r=o.n(n);for(var u in n)["default"].indexOf(u)<0&&function(e){o.d(t,e,(function(){return n[e]}))}(u);t["default"]=r.a},29:function(e,t,o){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=o(30),r={onLaunch:function(){console.log("App Launch"),this.wxLogin()},onShow:function(){console.log("App Show")},onHide:function(){console.log("App Hide")},methods:{wxLogin:function(){e.login({provider:"weixin",success:function(t){var o=t.code;console.log("微信登录成功code:",o),e.request({url:n.API.LOGIN,method:"POST",data:{code:o},success:function(t){var o=t.data;if(0===o.errcode){var r=o.data.access_token;console.log("获取 token 成功:",r),e.setStorageSync("token",r),e.request({url:n.API.GET_USER_INFO,method:"POST",data:{token:r},success:function(t){console.log("获取用户信息成功:",t.data),e.request({url:n.API.SHIP_PROPERTY_ENUM,method:"POST",data:{token:r},success:function(t){console.log("获取船舶属性枚举成功:",t.data),0===t.data.errcode&&e.setStorageSync("shipPropertyEnum",t.data.data)},fail:function(e){console.error("获取船舶属性枚举失败:",e)}})},fail:function(e){console.error("获取用户信息失败:",e)}})}else console.error("登录失败:",o.errmsg)},fail:function(e){console.error("获取 token 失败:",e)}})},fail:function(e){console.error("微信登录失败:",e)}})}}};t.default=r}).call(this,o(2)["default"])},31:function(e,t,o){"use strict";o.r(t);var n=o(32),r=o.n(n);for(var u in n)["default"].indexOf(u)<0&&function(e){o.d(t,e,(function(){return n[e]}))}(u);t["default"]=r.a},32:function(e,t,o){}},[[0,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../.sourcemap/mp-weixin/common/main.js.map

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

@ -1,2 +1,2 @@
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/ship_detail"],{274:function(n,e,t){"use strict";(function(n,e){var r=t(4);t(26);r(t(25));var c=r(t(275));n.__webpack_require_UNI_MP_PLUGIN__=t,e(c.default)}).call(this,t(1)["default"],t(2)["createPage"])},275:function(n,e,t){"use strict";t.r(e);var r=t(276),c=t(278);for(var u in c)["default"].indexOf(u)<0&&function(n){t.d(e,n,(function(){return c[n]}))}(u);t(280);var o,i=t(33),a=Object(i["default"])(c["default"],r["render"],r["staticRenderFns"],!1,null,"bbc5a964",null,!1,r["components"],o);a.options.__file="pages/index/ship_detail.vue",e["default"]=a.exports},276:function(n,e,t){"use strict";t.r(e);var r=t(277);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"]}))},277:function(n,e,t){"use strict";var r;t.r(e),t.d(e,"render",(function(){return c})),t.d(e,"staticRenderFns",(function(){return o})),t.d(e,"recyclableRender",(function(){return u})),t.d(e,"components",(function(){return r}));var c=function(){var n=this,e=n.$createElement;n._self._c},u=!1,o=[];c._withStripped=!0},278:function(n,e,t){"use strict";t.r(e);var r=t(279),c=t.n(r);for(var u in r)["default"].indexOf(u)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(u);e["default"]=c.a},279:function(n,e,t){"use strict";(function(n){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={components:{NavBar:r},methods:{goBack:function(){n.navigateBack()},onAdd:function(){n.showToast({title:"点击了添加",icon:"none"})}}};e.default=c}).call(this,t(2)["default"])},280:function(n,e,t){"use strict";t.r(e);var r=t(281),c=t.n(r);for(var u in r)["default"].indexOf(u)<0&&function(n){t.d(e,n,(function(){return r[n]}))}(u);e["default"]=c.a},281:function(n,e,t){}},[[274,"common/runtime","common/vendor"]]]);
(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["pages/index/ship_detail"],{274:function(e,t,n){"use strict";(function(e,t){var i=n(4);n(26);i(n(25));var r=i(n(275));e.__webpack_require_UNI_MP_PLUGIN__=n,t(r.default)}).call(this,n(1)["default"],n(2)["createPage"])},275:function(e,t,n){"use strict";n.r(t);var i=n(276),r=n(278);for(var a in r)["default"].indexOf(a)<0&&function(e){n.d(t,e,(function(){return r[e]}))}(a);n(280);var c,o=n(33),u=Object(o["default"])(r["default"],i["render"],i["staticRenderFns"],!1,null,"bbc5a964",null,!1,i["components"],c);u.options.__file="pages/index/ship_detail.vue",t["default"]=u.exports},276:function(e,t,n){"use strict";n.r(t);var i=n(277);n.d(t,"render",(function(){return i["render"]})),n.d(t,"staticRenderFns",(function(){return i["staticRenderFns"]})),n.d(t,"recyclableRender",(function(){return i["recyclableRender"]})),n.d(t,"components",(function(){return i["components"]}))},277:function(e,t,n){"use strict";var i;n.r(t),n.d(t,"render",(function(){return r})),n.d(t,"staticRenderFns",(function(){return c})),n.d(t,"recyclableRender",(function(){return a})),n.d(t,"components",(function(){return i}));var r=function(){var e=this,t=e.$createElement,n=(e._self._c,e.ship?e.getFileUrl(e.ship.picture1):null),i=e.ship?e.getFileUrl(e.ship.picture2):null,r=e.ship?e.getFileUrl(e.ship.picture3):null;e.$mp.data=Object.assign({},{$root:{m0:n,m1:i,m2:r}})},a=!1,c=[];r._withStripped=!0},278:function(e,t,n){"use strict";n.r(t);var i=n(279),r=n.n(i);for(var a in i)["default"].indexOf(a)<0&&function(e){n.d(t,e,(function(){return i[e]}))}(a);t["default"]=r.a},279:function(e,t,n){"use strict";(function(e){var i=n(4);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=i(n(44)),a=i(n(46)),c=n(30),o=function(){n.e("components/NavBar").then(function(){return resolve(n(314))}.bind(null,n)).catch(n.oe)},u={name:"ShipDetailPage",components:{NavBar:o},data:function(){return{ship:null,id:null}},onLoad:function(e){if(this.id=e.id,e.item)try{this.ship=JSON.parse(decodeURIComponent(e.item))}catch(t){this.ship=null}this.fetchShipDetail()},methods:{fetchShipDetail:function(){var t=this;return(0,a.default)(r.default.mark((function n(){var i,a;return r.default.wrap((function(n){while(1)switch(n.prev=n.next){case 0:if(i=e.getStorageSync("token"),i){n.next=4;break}return e.showToast({title:"请先登录",icon:"none"}),n.abrupt("return");case 4:return e.showLoading({title:"加载中..."}),n.prev=5,n.next=8,new Promise((function(n,r){e.request({url:"".concat(c.API.SHIP_DETAIL,"/").concat(t.id),method:"GET",data:{token:i},success:n,fail:r})}));case 8:a=n.sent,e.hideLoading(),a.data&&0===a.data.errcode?t.ship=a.data.data:e.showToast({title:a.data.errmsg||"获取失败",icon:"none"}),n.next=17;break;case 13:n.prev=13,n.t0=n["catch"](5),e.hideLoading(),e.showToast({title:n.t0.message||"网络错误",icon:"none"});case 17:case"end":return n.stop()}}),n,null,[[5,13]])})))()},getFileUrl:function(e){return e?"".concat(c.API.BASE_URL,"/api/customer/upload-file/preview?id=").concat(e):""},onEdit:function(){if(this.ship){var t=encodeURIComponent(JSON.stringify(this.ship));e.navigateTo({url:"/pages/index/ship_add?edit=1&ship=".concat(t)})}}}};t.default=u}).call(this,n(2)["default"])},280:function(e,t,n){"use strict";n.r(t);var i=n(281),r=n.n(i);for(var a in i)["default"].indexOf(a)<0&&function(e){n.d(t,e,(function(){return i[e]}))}(a);t["default"]=r.a},281:function(e,t,n){}},[[274,"common/runtime","common/vendor"]]]);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/ship_detail.js.map

@ -1 +1 @@
<view class="ship-detail-bg data-v-bbc5a964"><nav-bar vue-id="bcee8110-1" title="船舶详情" class="data-v-bbc5a964" bind:__l="__l"></nav-bar><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">ZJ12345</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">船舶名称</text><text class="data-v-bbc5a964">苏航666</text></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><text class="data-v-bbc5a964">苏州港</text></view></view><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">45米</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">型宽</text><text class="data-v-bbc5a964">8米</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">型深</text><text class="data-v-bbc5a964">3.5米</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">载重吨</text><text class="data-v-bbc5a964">500吨</text></view></view><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">有效期至2025-12-31</text></view><view class="section-row data-v-bbc5a964"><text class="data-v-bbc5a964">营运证书</text><text class="data-v-bbc5a964">有效期至2025-12-31</text></view></view><view data-event-opts="{{[['tap',[['onAdd',['$event']]]]]}}" class="bottom-add-btn data-v-bbc5a964" bindtap="__e"><text class="iconfont data-v-bbc5a964" style="font-size:18px;">添加</text></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 class="fixed-bottom-btn-bar data-v-bbc5a964"><button data-event-opts="{{[['tap',[['onEdit',['$event']]]]]}}" class="edit-btn data-v-bbc5a964" bindtap="__e">编辑</button></view></view>

@ -4,6 +4,15 @@
background: linear-gradient(180deg, #cbe6ff 0%, #f6faff 100%);
padding-bottom: 32rpx;
}
.fixed-nav.data-v-bbc5a964 {
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);
}
.nav-bar.data-v-bbc5a964 {
display: flex;
align-items: center;
@ -76,4 +85,33 @@
box-shadow: 0 4px 16px rgba(59,124,255,0.12);
z-index: 99;
}
.content-area.data-v-bbc5a964 {
padding-top: 90px;
padding-bottom: 70px;
}
.fixed-bottom-btn-bar.data-v-bbc5a964 {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 200;
background: rgba(255,255,255,0.95);
display: flex;
justify-content: center;
padding: 16px 0 24px 0;
box-shadow: 0 -2px 8px rgba(0,0,0,0.04);
}
.edit-btn.data-v-bbc5a964 {
min-width: 320rpx;
height: 80rpx;
border-radius: 40rpx;
background: #217aff;
color: #fff;
font-size: 32rpx;
font-weight: 500;
border: none;
outline: none;
box-shadow: 0 4rpx 16rpx rgba(33,122,255,0.08);
transition: background 0.2s;
}

@ -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 i=r(t(219));n.__webpack_require_UNI_MP_PLUGIN__=t,e(i.default)}).call(this,t(1)["default"],t(2)["createPage"])},219:function(n,e,t){"use strict";t.r(e);var r=t(220),i=t(222);for(var a in i)["default"].indexOf(a)<0&&function(n){t.d(e,n,(function(){return i[n]}))}(a);t(224);var u,o=t(33),c=Object(o["default"])(i["default"],r["render"],r["staticRenderFns"],!1,null,"748d0662",null,!1,r["components"],u);c.options.__file="pages/index/ship_manage.vue",e["default"]=c.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 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},222:function(n,e,t){"use strict";t.r(e);var r=t(223),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},223:function(n,e,t){"use strict";(function(n){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)},i={name:"ShipManagePage",components:{NavBar:r},data:function(){return{shipList:[{id:1,no:"苏槽123456",owner:"宋卫宗",phone:"18962113007",ton:"40.00"}]}},methods:{goAdd:function(){n.navigateTo({url:"/pages/index/ship_add"})},goDetail:function(e){n.navigateTo({url:"/pages/index/ship_detail?id=".concat(e.id)})}}};e.default=i}).call(this,t(2)["default"])},224:function(n,e,t){"use strict";t.r(e);var r=t(225),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},225:function(n,e,t){}},[[218,"common/runtime","common/vendor"]]]);
(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;n._self._c},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(){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"]]]);
//# 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: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.no}}</text></view><view class="ship-row data-v-748d0662">{{"所有人: "+item.owner}}</view><view class="ship-row data-v-748d0662">{{"联系电话: "+item.phone}}</view><view class="ship-row data-v-748d0662">{{"总吨位: "+item.ton+" 吨"}}</view></view></block><view class="add-cell-btn-bar data-v-748d0662"><button data-event-opts="{{[['tap',[['goAdd',['$event']]]]]}}" class="add-cell-btn data-v-748d0662" bindtap="__e">添加</button></view></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: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 class="add-cell-btn-bar data-v-748d0662"><button data-event-opts="{{[['tap',[['goAdd',['$event']]]]]}}" class="add-cell-btn data-v-748d0662" bindtap="__e">添加</button></view></view></view>
Loading…
Cancel
Save