前端代码库 #3

Merged
pfqxe4nai merged 1 commits from xiaofan_branch into master 2 years ago

@ -0,0 +1,9 @@
{
"version" : "1.0",
"configurations" : [
{
"playground" : "custom",
"type" : "uni-app:app-android"
}
]
}

@ -0,0 +1,17 @@
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style>
/*每个页面公共css */
</style>

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

@ -0,0 +1,22 @@
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif

@ -0,0 +1,118 @@
{
"name" : "Mini-12306",
"appid" : "__UNI__C11EF9B",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"schemes" : "",
"minSdkVersion" : 21
},
/* ios */
"ios" : {
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {
"ad" : {}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
},
"splashscreen" : {
"androidStyle" : "common",
"useOriginalMsgbox" : true,
"android" : {
"hdpi" : ""
}
}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3",
"locale" : "zh-Hans"
}

@ -0,0 +1,75 @@
{
"pages": [ //pageshttps://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Orders",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/Home",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/user-center",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/search-header",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Payment",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Buy-ticket",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Login",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/Station",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Change",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Register",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/refund",
"style": {
"navigationBarTitleText": "Mini-12306"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "Mini-12306",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
}

@ -0,0 +1,124 @@
<template>
<view class="ticket-booking">
<!-- <view class="step">
<text class="step-item">1. 选择车次</text>
<text class="step-item">2. 选择座位</text>
<text class="step-item">3. 确认订单</text>
</view> -->
<view class="train-selection">
<text class="title">选择车次</text>
<view v-for="(train, index) in trainList" :key="index" class="train-item" @click="selectTrain(train)">
<text class="train-info">{{ train.trainNumber }}</text>
<text class="train-info">{{ train.departureTime }} - {{ train.destinationTime }}</text>
<text class="train-info">{{ train.duration }}</text>
<text class="train-info">{{ train.price }}</text>
</view>
</view>
<view v-if="selectedTrain" class="seat-selection">
<text class="title">选择座位</text>
<view v-for="(seat, index) in selectedTrain.seats" :key="index" class="seat-item" @click="selectSeat(seat)">
<text class="seat-info">{{ seat.name }}</text>
<text class="seat-info">{{ seat.price }}</text>
</view>
</view>
<view v-if="selectedSeat" class="confirm-order">
<text class="title">确认订单</text>
<text class="selected-train-info">已选车次{{ selectedTrain.trainNumber }}</text>
<text class="selected-seat-info">已选座位{{ selectedSeat.name }}</text>
<button class="confirm-btn" @click="confirmOrder"></button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
trainList: [
{ trainNumber: 'G123', departureTime: '08:00', destinationTime: '11:00', duration: '3小时', price: '¥300', seats: [
{ name: '硬座', price: '¥100' },
{ name: '软座', price: '¥150' },
{ name: '硬卧', price: '¥200' },
{ name: '软卧', price: '¥250' }
]},
{ trainNumber: 'D456', departureTime: '10:00', destinationTime: '13:00', duration: '3小时', price: '¥250', seats: [
{ name: '硬座', price: '¥80' },
{ name: '软座', price: '¥120' },
{ name: '硬卧', price: '¥180' },
{ name: '软卧', price: '¥220' }
]}
],
selectedTrain: null,
selectedSeat: null
};
},
methods: {
selectTrain(train) {
this.selectedTrain = train;
this.selectedSeat = null; //
},
selectSeat(seat) {
this.selectedSeat = seat;
},
confirmOrder() {
//
console.log('已确认订单');
uni.navigateTo({
url: '/pages/index/Payment'
});
},
}
};
</script>
<style>
.ticket-booking {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.step {
display: flex;
margin-bottom: 20px;
}
.step-item {
font-size: 16px;
margin-right: 20px;
}
.title {
font-size: 20px;
font-weight: bold;
margin-bottom: 10px;
}
.train-selection, .seat-selection, .confirm-order {
width: 80%;
}
.train-item, .seat-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
margin-bottom: 10px;
background-color: #f0f0f0;
border-radius: 5px;
cursor: pointer;
}
.confirm-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -0,0 +1,105 @@
<template>
<view class="change-ticket-page">
<view class="header">改签申请</view>
<view class="change-form">
<view class="form-item">
<text class="label">原订单号</text>
<input v-model="originalOrderNumber" type="text" placeholder="请输入原订单号" />
</view>
<view class="form-item">
<text class="label">新乘车日期</text>
<input v-model="newTravelDate" type="date" placeholder="请选择新乘车日期" />
</view>
<view class="form-item">
<text class="label">改签原因</text>
<textarea v-model="changeReason" placeholder="请输入改签原因"></textarea>
</view>
<view class="form-item">
<button class="submit-btn" @click="submitChange"></button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
originalOrderNumber: '',
newTravelDate: '',
changeReason: ''
};
},
methods: {
submitChange() {
//
console.log('原订单号:', this.originalOrderNumber);
console.log('新乘车日期:', this.newTravelDate);
console.log('改签原因:', this.changeReason);
//
this.originalOrderNumber = '';
this.newTravelDate = '';
this.changeReason = '';
//
uni.showToast({
title: '改签申请已提交',
icon: 'success',
duration: 2000
});
}
}
};
</script>
<style>
.change-ticket-page {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.header {
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
.change-form {
width: 80%;
}
.form-item {
margin-bottom: 20px;
}
.label {
font-size: 16px;
margin-right: 10px;
}
input, textarea {
width: 100%;
height: 40px;
padding: 0 10px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 5px;
}
textarea {
height: 100px;
}
.submit-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -0,0 +1,159 @@
<template>
<view class="home-page">
<view class="header">
<text class="title">欢迎使用Mini-12306</text>
</view>
<view class="search-box">
<input v-model="departure" type="text" placeholder="出发地" @click="handleDepartureClick" />
<input v-model="destination" type="text" placeholder="目的地" @click="handleDestinationClick" />
</view>
<view>
<input v-model="date" type="date" placeholder="出发日期" :value="today" />
</view>
<view>
<button class="search-btn" @click="searchTickets"></button>
</view>
<view class="bottom-nav">
<view class="nav-item" @click="goToPage('/pages/index')">
<text class="icon">首页</text>
</view>
<view class="nav-item" @click="goToPage('/pages/orders')">
<text class="icon">订单</text>
</view>
<view class="nav-item" @click="goToPage('/pages/profile')">
<text class="icon">个人中心</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
departure: '',
destination: '',
date: '',
today: ''
};
},
mounted() {
//
this.today = new Date().toISOString().slice(0,10);
this.date = this.today; //
},
methods: {
handleDepartureClick() {
uni.navigateTo({
url: '/pages/index/Station?type=departure'
});
},
handleDestinationClick() {
uni.navigateTo({
url: '/pages/index/Station?type=destination'
});
},
onShow() {
const type = this.$route.query.type;
if (type === 'departure') {
//
this.departure = this.$route.query.station || '';
} else if (type === 'destination') {
//
this.destination = this.$route.query.station || '';
}
},
goToHome() {
//
uni.navigateTo({
url: '/pages/index/Home'
});
},
goToOrders() {
//
uni.navigateTo({
url: '/pages/index/Orders'
});
},
goToMy() {
//
uni.navigateTo({
url: '/pages/index/user-center'
});
},
searchTickets() {
//
console.log('出发地:', this.departure);
console.log('目的地:', this.destination);
//
// ticketList
},
}
};
</script>
<style>
.header {
display: flex;
justify-content: center;
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
.title {
color: #333;
}
.search-box {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 10px;
}
.input {
width: 100px;
height: 40px;
padding: 0 10px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 5px;
margin-right: 10px;
}
.search-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
.bottom-nav {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background-color: #ffffff;
display: flex;
justify-content: space-around;
align-items: center;
box-shadow: 0px -2px 4px rgba(0, 0, 0, 0.1);
}
.nav-item {
flex: 1;
text-align: center;
padding: 10px 0;
font-size: 14px;
color: #666666;
cursor: pointer;
}
</style>

@ -0,0 +1,158 @@
<template>
<div class="page-background">
<view class="login">
<view class="login-header">
<text class="title">Mini-12306用户登录</text>
</view>
<view class="login-form">
<view class="form-item">
<text class="label">账号</text>
<input class="input" v-model="account" type="text" placeholder="请输入账号" />
</view>
<view class="form-item">
<text class="label">密码</text>
<input class="input" v-model="password" type="password" placeholder="请输入密码" />
</view>
<view class="form-item">
<button class="login-btn" @click="login"></button>
</view>
</view>
</view>
</div>
</template>
<script>
export default {
data() {
return {
account: '',
password: ''
};
},
methods: {
login() {
// accountpassword
if (!this.account || !this.password) {
uni.showToast({
title: '请输入用户名和密码',
icon: 'none'
});
return;
}
const formData = {
account: this.account,
password: this.password
};
// POSTformDataJSON
uni.request({
url: 'http://192.168.255.1:8000/login/', //
method: 'POST',
data: JSON.stringify(formData), // formDataJSON
header: {
'content-type': 'application/json' // JSON
},
success: (res) => {
//
if (res.statusCode === 200) { // 200
const data = res.data;
if (data.message === '登录成功') {
console.log('请求成功', data);
uni.showToast({
title: '登录成功',
icon: 'success'
});
uni.navigateTo({
url: '/pages/index/Home'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
// else {
// // 200
// uni.showToast({
// title: '',
// icon: 'none'
// });
// }
},
fail: (err) => {
//
console.err('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style>
.page-background {
background-image: url('D:\Login.jpg'); /* 背景图路径 */
background-size: cover; /* 背景图填充方式cover表示尽可能填充整个容器 */
background-position: center; /* 背景图位置居中 */
width: 100%; /* 宽度100%填充整个容器 */
height: 100vh; /* 高度100vh填充整个视口 */
}
.login {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.login-header {
margin-bottom: 20px;
}
.title {
font-size: 24px;
font-weight: bold;
}
.login-form {
width: 80%;
}
.form-item {
margin-bottom: 20px;
}
.label {
font-size: 16px;
}
.input {
width: 100%;
height: 40px;
border: 1px solid #ccc;
border-radius: 5px;
padding: 0 10px;
}
.login-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -0,0 +1,108 @@
<template>
<view class="order-page">
<view class="order-details">
<!-- 订单详情 -->
<view class="order-info">
<text class="order-label">订单编号</text>
<text class="order-value">{{ orderNumber }}</text>
</view>
<view class="order-info">
<text class="order-label">乘车人</text>
<text class="order-value">{{ passengerName }}</text>
</view>
<view class="order-info">
<text class="order-label">车次</text>
<text class="order-value">{{ trainNumber }}</text>
</view>
<view class="order-info">
<text class="order-label">座位</text>
<text class="order-value">{{ seat }}</text>
</view>
<!-- 其他订单信息如车票信息金额等 -->
</view>
<view class="payment-info">
<!-- 支付信息 -->
<view class="payment-item">
<text class="payment-label">订单总额</text>
<text class="payment-value">{{ totalAmount }} </text>
</view>
<!-- 其他支付信息如优惠券支付方式等 -->
</view>
<button class="pay-btn" @click="payOrder"></button>
</view>
</template>
<script>
export default {
data() {
return {
orderNumber: '20240418001',
passengerName: '张三',
trainNumber: 'G1234',
seat: '商务座',
totalAmount: 500
};
},
methods: {
payOrder() {
//
console.log('支付订单:', this.orderNumber);
//
}
}
};
</script>
<style>
.order-page {
padding: 20px;
}
.order-details {
margin-bottom: 20px;
}
.order-info {
margin-bottom: 10px;
}
.order-label {
font-size: 16px;
color: #333;
}
.order-value {
font-size: 16px;
color: #666;
}
.payment-info {
border-top: 1px solid #ccc;
padding-top: 20px;
}
.payment-item {
margin-bottom: 10px;
}
.payment-label {
font-size: 16px;
color: #333;
}
.payment-value {
font-size: 16px;
color: #666;
}
.pay-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -0,0 +1,89 @@
<template>
<view class="payment-page">
<view class="order-info">
<text>订单号{{ orderNumber }}</text>
<text>票价{{ price }}</text>
</view>
<view class="payment-method">
<text>请选择支付方式</text>
<view class="method-item" v-for="(method, index) in paymentMethods" :key="index">
<radio :value="method.value" v-model="selectedMethod">{{ method.label }}</radio>
</view>
</view>
<button @click="confirmPayment"></button>
</view>
</template>
<script>
export default {
data() {
return {
orderNumber: '123456789',
price: 100,
selectedMethod: '', //
paymentMethods: [
{ label: '微信支付', value: 'wechat' },
{ label: '支付宝支付', value: 'alipay' },
{ label: '银联支付', value: 'unionpay' }
]
};
},
methods: {
confirmPayment() {
if (!this.selectedMethod) {
uni.showToast({
title: '请选择支付方式',
icon: 'none'
});
return;
}
switch (this.selectedMethod) {
case 'wechat':
uni.showToast({
title: '调用微信支付SDK',
//
});
break;
case 'alipay':
uni.showToast({
title: '调用支付宝支付SDK',
//
});
break;
case 'unionpay':
uni.showToast({
title: '调用银联支付SDK',
//
});
break;
default:
break;
}
}
}
};
</script>
<style scoped>
.payment-page {
padding: 20px;
}
.order-info {
margin-bottom: 20px;
}
.payment-method {
margin-bottom: 20px;
}
.method-item {
margin-bottom: 10px;
}
button {
width: 90%;
padding: 10px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 5px;
cursor: pointer;
}
</style>

@ -0,0 +1,191 @@
<template>
<div class="page-background">
<view class="container">
<view class="register-header">
<text class="title">Mini-12306用户注册</text>
</view>
<view class="input-group">
<input v-model="name" type="text" placeholder="请输入姓名" />
</view>
<view class="input-group">
<input v-model="idCard" type="text" placeholder="请输入身份证号码" />
</view>
<view class="input-group">
<input v-model="PhoneNo" type="text" placeholder="请输入电话号码" />
</view>
<view class="input-group">
<input v-model="Bankcard" type="text" placeholder="请输入银行卡号" />
</view>
<view class="input-group">
<input v-model="password" type="text" placeholder="请输入密码" />
</view>
<view class="input-group">
<input v-model="confirmpassword" type="text" placeholder="请确定密码" />
</view>
<view class="register-btn">
<button @click="register"></button>
</view>
</view>
</div>
</template>
<script>
export default {
data() {
return {
name: '',
idCard: '',
PhoneNo:'',
Bankcard:'',
password:'',
confirmpassword:''
};
},
methods: {
register() {
// nameidCard
if (!this.name ) {
uni.showToast({
title: '请输入姓名',
icon: 'none'
});
return;
}
if ( !this.idCard) {
uni.showToast({
title: '请输入身份证号',
icon: 'none'
});
return;
}
if ( !this.PhoneNo) {
uni.showToast({
title: '请输入电话号码',
icon: 'none'
});
return;
}
if ( !this.Bankcard) {
uni.showToast({
title: '请输入银行卡号',
icon: 'none'
});
return;
}
if ( !this.password) {
uni.showToast({
title: '请输入密码',
icon: 'none'
});
return;
}
if ( this.password != this.confirmpassword) {
uni.showToast({
title: '两次密码不一致',
icon: 'none'
});
return;
}
const formData = {
name: this.name,
idCard: this.idCard,
PhoneNO:this.PhoneNo,
Bankcard:this.Bankcard,
password:this.password,
};
// POSTformDataJSON
uni.request({
url: 'http://192.168.255.1:8000/validate_idcard/', //
method: 'POST',
data: JSON.stringify(formData), // formDataJSON
header: {
'content-type': 'application/json' // JSON
},
success: (res) => {
//
if (res.statusCode === 200) { // 200
const data = res.data;
if (data.message === '注册成功') {
console.log('请求成功', data);
uni.showToast({
title: '注册成功',
icon: 'success'
});
uni.navigateTo({
url: '/pages/index/Login'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
// else {
// // 200
// uni.showToast({
// title: '',
// icon: 'none'
// });
// }
},
fail: (err) => {
//
console.err('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style scoped>
.container {
padding: 20px;
}
.input-group {
margin-bottom: 20px;
}
.input-group input {
background-color: #ffffff;
width: 95%;
height: 40px;
padding: 0 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.page-background {
background-image: url('D:\Login.jpg'); /* 背景图路径 */
background-size: cover; /* 背景图填充方式cover表示尽可能填充整个容器 */
background-position: center; /* 背景图位置居中 */
width: 100%; /* 宽度100%填充整个容器 */
height: 100vh; /* 高度100vh填充整个视口 */
}
.register-header {
margin-bottom: 20px;
}
.register-btn button {
width: 100%;
height: 40px;
line-height: 40px;
border: none;
border-radius: 5px;
background-color: transparent;
color: #000000;
outline: none;
}
</style>

@ -0,0 +1,105 @@
<template>
<view class="station-selector">
<view class="header">
<text class="title">选择车站</text>
</view>
<view class="search-box">
<input v-model="keyword" type="text" placeholder="请输入车站名称" />
<button @click="searchStations"></button>
</view>
<view class="station-list">
<view v-for="(station, index) in filteredStations" :key="index" class="station" @click="selectStation(station)">
<text>{{ station.name }}</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
keyword: '',
stations: [ //
{ name: '北京' },
{ name: '上海' },
{ name: '广州' },
{ name: '深圳' },
{ name: '杭州' },
// ...
]
};
},
computed: {
filteredStations() {
if (!this.keyword) {
return this.stations;
}
return this.stations.filter(station =>
station.name.includes(this.keyword)
);
}
},
methods: {
searchStations() {
//
},
selectStation(station) {
//
console.log('选择了车站:', station.name);
uni.navigateTo({
url: '/pages/index/Home?station=' + station.name
});
}
}
};
</script>
<style scoped>
.station-selector {
flex: 1;
}
.header {
padding: 20px;
text-align: center;
font-size: 20px;
font-weight: bold;
}
.search-box {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
}
.search-box input {
flex: 1;
height: 36px;
margin-right: 10px;
padding: 0 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.search-box button {
height: 36px;
padding: 0 10px;
border: none;
border-radius: 5px;
background-color: #007aff;
color: #fff;
cursor: pointer;
}
.station-list {
padding: 0 20px;
}
.station {
padding: 10px 0;
border-bottom: 1px solid #eee;
cursor: pointer;
}
</style>

@ -0,0 +1,75 @@
<template>
<div class="page-background">
<view class="content">
<!-- <image class="logo" src="/static/logo.png"></image> -->
<!-- <view class="text-area"> -->
<!-- <view :style="{ textAlign: 'center' }">
<text class="title">{{title}}</text>
</view> -->
<div style="display: flex; justify-content: space-between; position: fixed; bottom: 10%; width: 100%;">
<button style="margin-right: 20px; color: #000000; background-color: transparent;" @click="button1"></button>
<button style="margin-left: 20px; color: #000000; background-color: transparent;" @click="button2"></button>
</div>
</view>
</div>
</template>
<script>
export default {
// data() {
// return {
// title: 'Mini-12306'
// };
// },
// onLoad() {
// },
methods: {
button1(){
uni.navigateTo({
url: '/pages/index/Login'
});
},
button2(){
uni.navigateTo({
url: '/pages/index/Register'
});
},
}
};
</script>
<style>
.page-background {
background-image: url('D:\index.jpg'); /* 背景图路径 */
background-size: cover; /* 背景图填充方式cover表示尽可能填充整个容器 */
background-position: center; /* 背景图位置居中 */
width: 100%; /* 宽度100%填充整个容器 */
height: 100vh; /* 高度100vh填充整个视口 */
}
/* .content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
} */
/* .logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-bottom: 50rpx;
} */
/*
.text-area {
display: flex;
justify-content: center;
} */
/* .title {
font-size: 36rpx;
color: #8f8f94;
} */
</style>

@ -0,0 +1,105 @@
<template>
<view class="refund-page">
<view class="header">退票申请</view>
<view class="refund-form">
<view class="form-item">
<text class="label">订单号</text>
<input v-model="orderNumber" type="text" placeholder="请输入订单号" />
</view>
<view class="form-item">
<text class="label">乘车日期</text>
<input v-model="travelDate" type="date" placeholder="请选择乘车日期" />
</view>
<view class="form-item">
<text class="label">退票原因</text>
<textarea v-model="refundReason" placeholder="请输入退票原因"></textarea>
</view>
<view class="form-item">
<button class="submit-btn" @click="submitRefund">退</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
orderNumber: '',
travelDate: '',
refundReason: ''
};
},
methods: {
submitRefund() {
// 退退
console.log('订单号:', this.orderNumber);
console.log('乘车日期:', this.travelDate);
console.log('退票原因:', this.refundReason);
//
this.orderNumber = '';
this.travelDate = '';
this.refundReason = '';
// 退
uni.showToast({
title: '退票申请已提交',
icon: 'success',
duration: 2000
});
}
}
};
</script>
<style>
.refund-page {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.header {
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
.refund-form {
width: 80%;
}
.form-item {
margin-bottom: 20px;
}
.label {
font-size: 16px;
margin-right: 10px;
}
input, textarea {
width: 100%;
height: 40px;
padding: 0 10px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 5px;
}
textarea {
height: 100px;
}
.submit-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -0,0 +1,142 @@
<template>
<view class="search">
<view class="search-header">
<text class="title">Mini-12306 查询车次</text>
</view>
<view class="search-form">
<view class="form-item">
<text class="label">出发地</text>
<input class="input" v-model="departure" type="text" placeholder="请输入出发地" />
</view>
<view class="form-item">
<text class="label">目的地</text>
<input class="input" v-model="destination" type="text" placeholder="请输入目的地" />
</view>
<view class="form-item">
<text class="label">出发日期</text>
<input class="input" v-model="date" type="date" />
</view>
<view class="form-item">
<button class="search-btn" @click="search"></button>
</view>
</view>
<view class="search-result">
<text v-if="searched" class="result-text"></text>
<view v-if="searched && trainList.length === 0" class="empty-result">
<text class="empty-text">暂无车次信息</text>
</view>
<view v-for="(train, index) in trainList" :key="index" class="train-item">
<text class="train-info">{{ train.trainNumber }}</text>
<text class="train-info">{{ train.departureTime }}</text>
<text class="train-info">{{ train.destinationTime }}</text>
<text class="train-info">{{ train.duration }}</text>
<text class="train-info">{{ train.price }}</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
departure: '',
destination: '',
date: '',
searched: false,
trainList: []
};
},
methods: {
search() {
//
if (!this.departure || !this.destination || !this.date) {
uni.showToast({
title: '请输入完整信息',
icon: 'none'
});
return;
}
//
this.trainList = [
{ trainNumber: 'G123', departureTime: '08:00', destinationTime: '11:00', duration: '3小时', price: '¥300' },
{ trainNumber: 'D456', departureTime: '10:00', destinationTime: '13:00', duration: '3小时', price: '¥250' },
{ trainNumber: 'K789', departureTime: '12:00', destinationTime: '15:00', duration: '3小时', price: '¥200' }
];
this.searched = true;
}
}
};
</script>
<style>
.search {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.search-header {
margin-bottom: 20px;
}
.title {
font-size: 24px;
font-weight: bold;
}
.search-form {
width: 80%;
}
.form-item {
margin-bottom: 20px;
}
.label {
font-size: 16px;
}
.input {
width: 100%;
height: 40px;
border: 1px solid #ccc;
border-radius: 5px;
padding: 0 10px;
}
.search-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
.search-result {
width: 80%;
margin-top: 20px;
}
.result-text {
font-size: 18px;
font-weight: bold;
margin-bottom: 10px;
}
.train-item {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.train-info {
font-size: 16px;
}
</style>

@ -0,0 +1,88 @@
<template>
<div class="user-center-page">
<div class="header">
<h1 class="title">用户中心</h1>
</div>
<div class="user-info">
<p class="info">用户名: {{ userInfo.username }}</p>
<p class="info">手机号: {{ userInfo.phone }}</p>
<p class="info">邮箱: {{ userInfo.email }}</p>
</div>
<div class="order-list">
<div v-for="(order, index) in orderList" :key="index" class="order-item" @click="viewOrderDetail(order)">
<p class="order-info">订单号: {{ order.orderId }}</p>
<p class="order-info">出发地: {{ order.departure }}</p>
<p class="order-info">目的地: {{ order.destination }}</p>
<p class="order-info">出发时间: {{ order.departureTime }}</p>
<p class="order-info">到达时间: {{ order.arrivalTime }}</p>
<p class="order-info">价格: {{ order.price }} </p>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
userInfo: {
username: '肖帆',
phone: '18879439530',
email: '2023210156@qq.com'
},
orderList: [
{ orderId: '202401010001', departure: '北京', destination: '上海', departureTime: '08:00', arrivalTime: '10:30', price: '500' },
{ orderId: '202401010002', departure: '上海', destination: '北京', departureTime: '09:00', arrivalTime: '11:30', price: '500' },
{ orderId: '202401010003', departure: '北京', destination: '广州', departureTime: '10:00', arrivalTime: '12:30', price: '600' },
{ orderId: '202401010004', departure: '广州', destination: '北京', departureTime: '11:00', arrivalTime: '13:30', price: '600' },
{ orderId: '202401010005', departure: '北京', destination: '深圳', departureTime: '12:00', arrivalTime: '14:30', price: '700' },
{ orderId: '202401010006', departure: '深圳', destination: '北京', departureTime: '13:00', arrivalTime: '15:30', price: '700' },
]
};
},
methods: {
viewOrderDetail(order) {
//
//
}
}
};
</script>
<style scoped>
.user-center-page {
padding: 20px;
}
.header {
text-align: center;
margin-bottom: 20px;
}
.title {
font-size: 24px;
font-weight: bold;
}
.user-info {
margin-bottom: 20px;
}
.info {
font-size: 16px;
margin-bottom: 10px;
}
.order-item {
border: 1px solid #ddd;
border-radius: 5px;
padding: 10px;
margin-bottom: 10px;
cursor: pointer;
}
.order-info {
font-size: 14px;
margin-bottom: 5px;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@ -0,0 +1,10 @@
uni.addInterceptor({
returnValue (res) {
if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
return res;
}
return new Promise((resolve, reject) => {
res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
});
},
});

@ -0,0 +1,76 @@
/**
* uni-app
*
* uni-app https://ext.dcloud.net.cn使
* 使scss使 import 便App
*
*/
/**
* App使
*
* 使scss scss 使 import
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//
$uni-text-color-inverse:#fff;//
$uni-text-color-grey:#999;//
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//
/* 边框颜色 */
$uni-border-color:#c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm:12px;
$uni-font-size-base:14px;
$uni-font-size-lg:16px;
/* 图片尺寸 */
$uni-img-size-sm:20px;
$uni-img-size-base:26px;
$uni-img-size-lg:40px;
/* Border Radius */
$uni-border-radius-sm: 2px;
$uni-border-radius-base: 3px;
$uni-border-radius-lg: 6px;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 5px;
$uni-spacing-row-base: 10px;
$uni-spacing-row-lg: 15px;
/* 垂直间距 */
$uni-spacing-col-sm: 4px;
$uni-spacing-col-base: 8px;
$uni-spacing-col-lg: 12px;
/* 透明度 */
$uni-opacity-disabled: 0.3; //
/* 文章场景相关 */
$uni-color-title: #2C405A; //
$uni-font-size-title:20px;
$uni-color-subtitle: #555555; //
$uni-font-size-subtitle:26px;
$uni-color-paragraph: #3F536E; //
$uni-font-size-paragraph:15px;

@ -0,0 +1 @@
https://app.liuyingyong.cn/build/download/4d3e0aa0-050e-11ef-9d00-3b5ca95a78a9

File diff suppressed because one or more lines are too long

@ -0,0 +1,3 @@
andrCertfile=D:/HBuilderX.4.07.2024032720/HBuilderX/plugins/app-safe-pack/Test.keystore
andrCertAlias=android
andrCertPass=ep/Tdjka4Y7WYqDB6/S7dw==

@ -0,0 +1,4 @@
[General]
andrCertfile=package.keystore
andrCertAlias=__UNI__C11EF9B
andrCertPass="sl2zjptmoYkiHj60DYUleQ=="

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>View</title>
<link rel="stylesheet" href="app.css" />
<script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
</head>
<body>
<div id="app"></div>
<script src="uni-app-view.umd.js"></script>
</body>
</html>

@ -0,0 +1,11 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"uni-app","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"Mini-12306","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.07","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Orders","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/user-center","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/search-header","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Payment","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Buy-ticket","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Login","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Home","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Change","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Register","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/refund","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:16})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:u,window:u,document:u,frames:u,self:u,location:u,navigator:u,localStorage:u,history:u,Caches:u,screen:u,alert:u,confirm:u,prompt:u,fetch:u,XMLHttpRequest:u,WebSocket:u,webkit:u,print:u}}}});
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1 @@
{"@platforms":["android","iPhone","iPad"],"id":"__UNI__C11EF9B","name":"Mini-12306","version":{"name":"1.0.0","code":"100"},"description":"","developer":{"name":"","email":"","url":""},"permissions":{"UniNView":{"description":"UniNView原生渲染"}},"plus":{"useragent":{"value":"uni-app","concatenate":true},"splashscreen":{"autoclose":true,"delay":0,"target":"id:1","waiting":true},"popGesture":"close","launchwebview":{"render":"always","id":"1","kernel":"WKWebview"},"usingComponents":true,"nvueStyleCompiler":"uni-app","compilerVersion":3,"distribute":{"icons":{"android":{"hdpi":"icon-android-hdpi.png","xhdpi":"icon-android-xhdpi.png","xxhdpi":"icon-android-xxhdpi.png","xxxhdpi":"icon-android-xxxhdpi.png"},"ios":{"appstore":"unpackage/res/icons/1024x1024.png","ipad":{"app":"unpackage/res/icons/76x76.png","app@2x":"unpackage/res/icons/152x152.png","notification":"unpackage/res/icons/20x20.png","notification@2x":"unpackage/res/icons/40x40.png","proapp@2x":"unpackage/res/icons/167x167.png","settings":"unpackage/res/icons/29x29.png","settings@2x":"unpackage/res/icons/58x58.png","spotlight":"unpackage/res/icons/40x40.png","spotlight@2x":"unpackage/res/icons/80x80.png"},"iphone":{"app@2x":"unpackage/res/icons/120x120.png","app@3x":"unpackage/res/icons/180x180.png","notification@2x":"unpackage/res/icons/40x40.png","notification@3x":"unpackage/res/icons/60x60.png","settings@2x":"unpackage/res/icons/58x58.png","settings@3x":"unpackage/res/icons/87x87.png","spotlight@2x":"unpackage/res/icons/80x80.png","spotlight@3x":"unpackage/res/icons/120x120.png"},"prerendered":"false"}},"splashscreen":{"androidStyle":"common","useOriginalMsgbox":true,"android":{"hdpi":""}},"google":{"minSdkVersion":21,"permissions":["<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>","<uses-permission android:name=\"android.permission.VIBRATE\"/>","<uses-permission android:name=\"android.permission.READ_LOGS\"/>","<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>","<uses-feature android:name=\"android.hardware.camera.autofocus\"/>","<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>","<uses-permission android:name=\"android.permission.CAMERA\"/>","<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>","<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>","<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>","<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>","<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>","<uses-feature android:name=\"android.hardware.camera\"/>","<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"],"schemes":"","packagename":"io.dcloud","custompermissions":true},"apple":{"dSYMs":false,"devices":"universal"},"plugins":{"ad":{},"audio":{"mp3":{"description":"Android平台录音支持MP3格式文件"}}},"orientation":"portrait-primary"},"statusbar":{"immersed":"supportedDevice","style":"dark","background":"#F8F8F8"},"uniStatistics":{"enable":false},"allowsInlineMediaPlayback":true,"uni-app":{"control":"uni-v3","vueVersion":"3","compilerVersion":"4.07","nvueCompiler":"uni-app","renderer":"auto","nvue":{"flex-direction":"column"},"nvueLaunchMode":"normal","webView":{"minUserAgentVersion":"49.0"}},"adid":"126804260404"},"locale":"zh-Hans","launch_path":"__uniappview.html"}

@ -0,0 +1 @@
.ticket-booking{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.step{display:flex;margin-bottom:20px}.step-item{font-size:16px;margin-right:20px}.title{font-size:20px;font-weight:700;margin-bottom:10px}.train-selection,.seat-selection,.confirm-order{width:80%}.train-item,.seat-item{display:flex;justify-content:space-between;align-items:center;padding:10px;margin-bottom:10px;background-color:#f0f0f0;border-radius:5px;cursor:pointer}.confirm-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.change-ticket-page{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.header{font-size:24px;font-weight:700;margin-bottom:20px}.change-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px;margin-right:10px}uni-input,uni-textarea{width:100%;height:40px;padding:0 10px;font-size:16px;border:1px solid #ccc;border-radius:5px}uni-textarea{height:100px}.submit-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.home-page{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.header{font-size:24px;font-weight:700;margin-bottom:20px}.title{color:#333}.search-box{display:flex;justify-content:center;align-items:center;margin-bottom:10px}uni-input{width:100px;height:40px;padding:0 10px;font-size:16px;border:1px solid #ccc;border-radius:5px;margin-right:10px}.search-btn{width:100px;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}.ticket-list{width:80%}.ticket-item{display:flex;justify-content:space-between;align-items:center;padding:10px;background-color:#f9f9f9;margin-bottom:10px}.ticket-info{font-size:16px}.buy-btn{width:80px;height:30px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:14px;cursor:pointer}.footer{display:flex;justify-content:space-around;align-items:center;position:fixed;bottom:0;left:0;width:100%;height:50px;background-color:#fff;border-top:1px solid #ccc}.footer uni-button{flex:1;height:100%;border:none;background-color:transparent;font-size:16px;color:#007aff}

@ -0,0 +1 @@
.login{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.login-header{margin-bottom:20px}.title{font-size:24px;font-weight:700}.login-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px}.input{width:100%;height:40px;border:1px solid #ccc;border-radius:5px;padding:0 10px}.login-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.order-page{padding:20px}.order-details{margin-bottom:20px}.order-info{margin-bottom:10px}.order-label{font-size:16px;color:#333}.order-value{font-size:16px;color:#666}.payment-info{border-top:1px solid #ccc;padding-top:20px}.payment-item{margin-bottom:10px}.payment-label{font-size:16px;color:#333}.payment-value{font-size:16px;color:#666}.pay-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.payment-page[data-v-f9e7e662]{padding:20px}.order-info[data-v-f9e7e662],.payment-method[data-v-f9e7e662]{margin-bottom:20px}.method-item[data-v-f9e7e662]{margin-bottom:10px}uni-button[data-v-f9e7e662]{width:100%;padding:10px;background-color:#007bff;color:#fff;border:none;border-radius:5px;cursor:pointer}

@ -0,0 +1 @@
.register{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.register-header{margin-bottom:20px}.title{font-size:24px;font-weight:700}.register-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px}.input{width:100%;height:40px;border:1px solid #ccc;border-radius:5px;padding:0 10px}.code-btn{width:120px;height:40px;line-height:40px;text-align:center;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:14px;cursor:pointer}.register-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.content{display:flex;flex-direction:column;align-items:center;justify-content:center}.logo{height:6.25rem;width:6.25rem;margin-top:6.25rem;margin-bottom:1.5625rem}.text-area{display:flex;justify-content:center}.title{font-size:1.125rem;color:#8f8f94}

@ -0,0 +1 @@
.refund-page{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.header{font-size:24px;font-weight:700;margin-bottom:20px}.refund-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px;margin-right:10px}uni-input,uni-textarea{width:100%;height:40px;padding:0 10px;font-size:16px;border:1px solid #ccc;border-radius:5px}uni-textarea{height:100px}.submit-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.search{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.search-header{margin-bottom:20px}.title{font-size:24px;font-weight:700}.search-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px}.input{width:100%;height:40px;border:1px solid #ccc;border-radius:5px;padding:0 10px}.search-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}.search-result{width:80%;margin-top:20px}.result-text{font-size:18px;font-weight:700;margin-bottom:10px}.train-item{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.train-info{font-size:16px}

@ -0,0 +1 @@
.user-center-page[data-v-774b5b69]{padding:20px}.header[data-v-774b5b69]{text-align:center;margin-bottom:20px}.title[data-v-774b5b69]{font-size:24px;font-weight:700}.user-info[data-v-774b5b69]{margin-bottom:20px}.info[data-v-774b5b69]{font-size:16px;margin-bottom:10px}.order-item[data-v-774b5b69]{border:1px solid #ddd;border-radius:5px;padding:10px;margin-bottom:10px;cursor:pointer}.order-info[data-v-774b5b69]{font-size:14px;margin-bottom:5px}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@ -0,0 +1,11 @@
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var require_app_css = __commonJS({
"app.css.js"(exports) {
const _style_0 = {};
exports.styles = [_style_0];
}
});
export default require_app_css();

@ -0,0 +1,2 @@
Promise.resolve("./app.css.js").then(() => {
});

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>View</title>
<link rel="stylesheet" href="app.css" />
<script>var __uniConfig = {"globalStyle":{},"darkmode":false}</script>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
</head>
<body>
<div id="app"></div>
<script src="uni-app-view.umd.js"></script>
</body>
</html>

@ -0,0 +1,11 @@
;(function(){
let u=void 0,isReady=false,onReadyCallbacks=[],isServiceReady=false,onServiceReadyCallbacks=[];
const __uniConfig = {"pages":[],"globalStyle":{"backgroundColor":"#F8F8F8","navigationBar":{"backgroundColor":"#F8F8F8","titleText":"uni-app","type":"default","titleColor":"#000000"},"isNVue":false},"nvue":{"compiler":"uni-app","styleCompiler":"uni-app","flex-direction":"column"},"renderer":"auto","appname":"Mini-12306","splashscreen":{"alwaysShowBeforeRender":true,"autoclose":true},"compilerVersion":"4.07","entryPagePath":"pages/index/index","entryPageQuery":"","realEntryPagePath":"","networkTimeout":{"request":60000,"connectSocket":60000,"uploadFile":60000,"downloadFile":60000},"locales":{},"darkmode":false,"themeConfig":{}};
const __uniRoutes = [{"path":"pages/index/index","meta":{"isQuit":true,"isEntry":true,"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Orders","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/user-center","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/search-header","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Payment","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Buy-ticket","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Login","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Home","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Change","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/Register","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}},{"path":"pages/index/refund","meta":{"navigationBar":{"titleText":"uni-app","type":"default"},"isNVue":false}}].map(uniRoute=>(uniRoute.meta.route=uniRoute.path,__uniConfig.pages.push(uniRoute.path),uniRoute.path='/'+uniRoute.path,uniRoute));
__uniConfig.styles=[];//styles
__uniConfig.onReady=function(callback){if(__uniConfig.ready){callback()}else{onReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"ready",{get:function(){return isReady},set:function(val){isReady=val;if(!isReady){return}const callbacks=onReadyCallbacks.slice(0);onReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
__uniConfig.onServiceReady=function(callback){if(__uniConfig.serviceReady){callback()}else{onServiceReadyCallbacks.push(callback)}};Object.defineProperty(__uniConfig,"serviceReady",{get:function(){return isServiceReady},set:function(val){isServiceReady=val;if(!isServiceReady){return}const callbacks=onServiceReadyCallbacks.slice(0);onServiceReadyCallbacks.length=0;callbacks.forEach(function(callback){callback()})}});
service.register("uni-app-config",{create(a,b,c){if(!__uniConfig.viewport){var d=b.weex.config.env.scale,e=b.weex.config.env.deviceWidth,f=Math.ceil(e/d);Object.assign(__uniConfig,{viewport:f,defaultFontSize:16})}return{instance:{__uniConfig:__uniConfig,__uniRoutes:__uniRoutes,global:u,window:u,document:u,frames:u,self:u,location:u,navigator:u,localStorage:u,history:u,Caches:u,screen:u,alert:u,confirm:u,prompt:u,fetch:u,XMLHttpRequest:u,WebSocket:u,webkit:u,print:u}}}});
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,143 @@
{
"@platforms": [
"android",
"iPhone",
"iPad"
],
"id": "__UNI__C11EF9B",
"name": "Mini-12306",
"version": {
"name": "1.0.0",
"code": "100"
},
"description": "",
"developer": {
"name": "",
"email": "",
"url": ""
},
"permissions": {
"UniNView": {
"description": "UniNView原生渲染"
}
},
"plus": {
"useragent": {
"value": "uni-app",
"concatenate": true
},
"splashscreen": {
"target": "id:1",
"autoclose": true,
"waiting": true,
"delay": 0
},
"popGesture": "close",
"launchwebview": {
"render": "always",
"id": "1",
"kernel": "WKWebview"
},
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"distribute": {
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
},
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
},
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
}
}
},
"splashscreen": {
"androidStyle": "common",
"useOriginalMsgbox": true,
"android": {
"hdpi": ""
}
},
"google": {
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"schemes": "",
"minSdkVersion": 21
},
"apple": {
"dSYMs": false
},
"plugins": {
"ad": {},
"audio": {
"mp3": {
"description": "Android平台录音支持MP3格式文件"
}
}
}
},
"statusbar": {
"immersed": "supportedDevice",
"style": "dark",
"background": "#F8F8F8"
},
"uniStatistics": {
"enable": false
},
"allowsInlineMediaPlayback": true,
"uni-app": {
"control": "uni-v3",
"vueVersion": "3",
"compilerVersion": "4.07",
"nvueCompiler": "uni-app",
"renderer": "auto",
"nvue": {
"flex-direction": "column"
},
"nvueLaunchMode": "normal",
"webView": {
"minUserAgentVersion": "49.0"
}
}
},
"locale": "zh-Hans",
"launch_path": "__uniappview.html"
}

@ -0,0 +1 @@
.ticket-booking{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.step{display:flex;margin-bottom:20px}.step-item{font-size:16px;margin-right:20px}.title{font-size:20px;font-weight:700;margin-bottom:10px}.train-selection,.seat-selection,.confirm-order{width:80%}.train-item,.seat-item{display:flex;justify-content:space-between;align-items:center;padding:10px;margin-bottom:10px;background-color:#f0f0f0;border-radius:5px;cursor:pointer}.confirm-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.change-ticket-page{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.header{font-size:24px;font-weight:700;margin-bottom:20px}.change-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px;margin-right:10px}uni-input,uni-textarea{width:100%;height:40px;padding:0 10px;font-size:16px;border:1px solid #ccc;border-radius:5px}uni-textarea{height:100px}.submit-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.home-page{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.header{font-size:24px;font-weight:700;margin-bottom:20px}.title{color:#333}.search-box{display:flex;justify-content:center;align-items:center;margin-bottom:10px}uni-input{width:100px;height:40px;padding:0 10px;font-size:16px;border:1px solid #ccc;border-radius:5px;margin-right:10px}.search-btn{width:100px;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}.ticket-list{width:80%}.ticket-item{display:flex;justify-content:space-between;align-items:center;padding:10px;background-color:#f9f9f9;margin-bottom:10px}.ticket-info{font-size:16px}.buy-btn{width:80px;height:30px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:14px;cursor:pointer}.footer{display:flex;justify-content:space-around;align-items:center;position:fixed;bottom:0;left:0;width:100%;height:50px;background-color:#fff;border-top:1px solid #ccc}.footer uni-button{flex:1;height:100%;border:none;background-color:transparent;font-size:16px;color:#007aff}

@ -0,0 +1 @@
.login{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.login-header{margin-bottom:20px}.title{font-size:24px;font-weight:700}.login-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px}.input{width:100%;height:40px;border:1px solid #ccc;border-radius:5px;padding:0 10px}.login-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.order-page{padding:20px}.order-details{margin-bottom:20px}.order-info{margin-bottom:10px}.order-label{font-size:16px;color:#333}.order-value{font-size:16px;color:#666}.payment-info{border-top:1px solid #ccc;padding-top:20px}.payment-item{margin-bottom:10px}.payment-label{font-size:16px;color:#333}.payment-value{font-size:16px;color:#666}.pay-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.payment-page[data-v-f9e7e662]{padding:20px}.order-info[data-v-f9e7e662],.payment-method[data-v-f9e7e662]{margin-bottom:20px}.method-item[data-v-f9e7e662]{margin-bottom:10px}uni-button[data-v-f9e7e662]{width:100%;padding:10px;background-color:#007bff;color:#fff;border:none;border-radius:5px;cursor:pointer}

@ -0,0 +1 @@
.register{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.register-header{margin-bottom:20px}.title{font-size:24px;font-weight:700}.register-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px}.input{width:100%;height:40px;border:1px solid #ccc;border-radius:5px;padding:0 10px}.code-btn{width:120px;height:40px;line-height:40px;text-align:center;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:14px;cursor:pointer}.register-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.content{display:flex;flex-direction:column;align-items:center;justify-content:center}.logo{height:6.25rem;width:6.25rem;margin-top:6.25rem;margin-bottom:1.5625rem}.text-area{display:flex;justify-content:center}.title{font-size:1.125rem;color:#8f8f94}

@ -0,0 +1 @@
.refund-page{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.header{font-size:24px;font-weight:700;margin-bottom:20px}.refund-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px;margin-right:10px}uni-input,uni-textarea{width:100%;height:40px;padding:0 10px;font-size:16px;border:1px solid #ccc;border-radius:5px}uni-textarea{height:100px}.submit-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}

@ -0,0 +1 @@
.search{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh}.search-header{margin-bottom:20px}.title{font-size:24px;font-weight:700}.search-form{width:80%}.form-item{margin-bottom:20px}.label{font-size:16px}.input{width:100%;height:40px;border:1px solid #ccc;border-radius:5px;padding:0 10px}.search-btn{width:100%;height:40px;background-color:#007aff;color:#fff;border:none;border-radius:5px;font-size:16px;cursor:pointer}.search-result{width:80%;margin-top:20px}.result-text{font-size:18px;font-weight:700;margin-bottom:10px}.train-item{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.train-info{font-size:16px}

@ -0,0 +1 @@
.user-center-page[data-v-774b5b69]{padding:20px}.header[data-v-774b5b69]{text-align:center;margin-bottom:20px}.title[data-v-774b5b69]{font-size:24px;font-weight:700}.user-info[data-v-774b5b69]{margin-bottom:20px}.info[data-v-774b5b69]{font-size:16px;margin-bottom:10px}.order-item[data-v-774b5b69]{border:1px solid #ddd;border-radius:5px;padding:10px;margin-bottom:10px;cursor:pointer}.order-info[data-v-774b5b69]{font-size:14px;margin-bottom:5px}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save