Compare commits

..

No commits in common. 'master' and 'lizhengqian_branch' have entirely different histories.

@ -0,0 +1,3 @@
# 默认忽略的文件
/shelf/
/workspace.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (Mini-12306前端开发)" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Mini-12306前端开发.iml" filepath="$PROJECT_DIR$/.idea/Mini-12306前端开发.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,3 @@
# 默认忽略的文件
/shelf/
/workspace.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/env" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.11 (2)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11 (2)" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Mini-12306后端开发.iml" filepath="$PROJECT_DIR$/.idea/Mini-12306后端开发.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

Binary file not shown.

Binary file not shown.

@ -0,0 +1,118 @@
/*
Navicat Premium Data Transfer
Source Server : mini12306
Source Server Type : MySQL
Source Server Version : 80036
Source Host : localhost:3306
Source Schema : mini12306
Target Server Type : MySQL
Target Server Version : 80036
File Encoding : 65001
Date: 10/05/2024 10:26:03
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for log
-- ----------------------------
DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` int(0) NOT NULL,
`eventname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`operator` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`eventtime` datetime(0) DEFAULT CURRENT_TIMESTAMP,
`eventcontent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for passenger
-- ----------------------------
DROP TABLE IF EXISTS `passenger`;
CREATE TABLE `passenger` (
`id` int(0) NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`account` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`mobileno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`bankcardno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`idcardno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`state` enum('已乘坐','未乘坐') CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`membertype` enum('普通用户','高级会员') CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of passenger
-- ----------------------------
INSERT INTO `passenger` VALUES (1, '肖帆', '2023210156', 'xiaofan123.', '18879439530', '122312324334546575676', '362502200202213611', '未乘坐', '普通用户');
-- ----------------------------
-- Table structure for ticket
-- ----------------------------
DROP TABLE IF EXISTS `ticket`;
CREATE TABLE `ticket` (
`id` int(0) NOT NULL,
`seatno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`seatclass` int(0) DEFAULT NULL,
`price` decimal(10, 2) DEFAULT NULL,
`state` enum('未售','已售') CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`trainno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`date` datetime(0) DEFAULT NULL,
`passengerAccont` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`fromstation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`tostation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for ticketseller
-- ----------------------------
DROP TABLE IF EXISTS `ticketseller`;
CREATE TABLE `ticketseller` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL,
`accont` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci NOT NULL,
`password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`idcardno` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`mobileno` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`state` enum('未购票','已购票','已乘坐') CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`authority level` enum('普通用户','高级会员') CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for train
-- ----------------------------
DROP TABLE IF EXISTS `train`;
CREATE TABLE `train` (
`id` int(0) NOT NULL,
`trainno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`date` date DEFAULT NULL,
`departurestation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`arrivalstation` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`departuretime` datetime(0) DEFAULT NULL,
`arrivaltime` datetime(0) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for train station
-- ----------------------------
DROP TABLE IF EXISTS `train station`;
CREATE TABLE `train station` (
`id` int(0) NOT NULL,
`trainno` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`date` datetime(0) DEFAULT NULL,
`stationname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`arrivaltime` datetime(0) DEFAULT NULL,
`departuretime` datetime(0) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_german2_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 MiB

Binary file not shown.

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

@ -1,17 +0,0 @@
<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>

@ -1,20 +0,0 @@
<!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>

@ -1,22 +0,0 @@
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

@ -1,118 +0,0 @@
{
"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"
}

@ -1,117 +0,0 @@
{
"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/passenge-list",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/returnsearch-results",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/ticket",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/user-center",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/search-results",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/Payment",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},{
"path": "pages/index/confirm-order",
"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"
}
},
{
"path": "pages/index/buyReturn",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/return-Payment",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/newpassenger",
"style": {
"navigationBarTitleText": "Mini-12306"
}
},
{
"path": "pages/index/change-password",
"style": {
"navigationBarTitleText": "Mini-12306"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "Mini-12306",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
}

@ -1,124 +0,0 @@
<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>

@ -1,289 +0,0 @@
<template>
<view class="Change-page">
<view class="header">改签申请</view>
<view class="Change-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="乘车日期" :value="today"/>
</view>
<view class="form-item">
<text class="label">改签原因</text>
<textarea v-model="ChangeReason" placeholder="请输入改签原因"></textarea>
</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 class="form-item">
<button class="submit-btn" @click="submitChange"></button>
</view>
</view>
</view>
<view class="home-page">
<div v-if="ticketInfo && ticketInfo.length">
<div v-for="(ticket, index) in ticketInfo" :key="index" class="ticket-box">
<div class="departure-info">
<p class="time">{{ ticket.departure_time }}</p>
<p class="station">{{ ticket.departure_station }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticket.trainno }}</h2>
<p class="date">{{ ticket.date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ ticket.arrival_time }}</p>
<p class="station">{{ ticket.arrival_station }}</p>
</div>
<button class="change-button" @click="changeticketClick(ticket)"></button>
</div>
</div>
</view>
</template>
<script>
export default {
data() {
return {
orderNumber: '',
ChangeReason: '',
travelDate:'',
departure: '',
destination: '',
date: '',
today: '',
ticketInfo: []
};
},
mounted() {
//
this.today = new Date().toISOString().slice(0,10);
this.date = this.today; //
},
methods: {
submitChange() {
if (!this.ChangeReason) {
uni.showToast({
title: '请说明理由',
icon: 'none',
duration: 2000
});
return;
}
// 退退
const formData = {
ticket_id:this.orderNumber,
travelDate:this.travelDate,
departure: this.departure,
destination: this.destination,
date:this.date,
};
uni.request({
url: 'http://localhost:8000/reschedule_ticket/',
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);
this.ticketInfo = data.trains;
uni.showToast({
title: '查询成功',
icon: 'success'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
changeticketClick(ticket) {
const formData = {
ticket_id:this.orderNumber,
travelDate:this.travelDate,
trainno:ticket.trainno,
date:this.date,
};
uni.request({
url: 'http://localhost:8000/change_ticket/',
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/Orders'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
}
};
</script>
<style>
.Change-button {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
.search-box {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 10px;
}
.header {
font-size: 24px;
font-weight: bold;
margin-bottom: 20px;
}
.Change-form {
width: 95%;
}
.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;
}
.ticket-box {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no {
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.change-button {
background-color: #007aff; /* 绿色背景 */
color: white; /* 白色文本 */
border: none; /* 无边框 */
padding: 5px 18px; /* 内边距 */
text-align: center; /* 文本居中 */
text-decoration: none; /* 无下划线 */
display: inline-block; /* 内联块级元素 */
font-size: 12px; /* 字体大小 */
margin: 4px 2px; /* 外边距 */
cursor: pointer; /* 鼠标指针 */
border-radius: 4px; /* 圆角边框 */
}
.book-button:hover {
background-color: #007aff; /* 悬停效果 */
}
.submit-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -1,181 +0,0 @@
<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="goToHome">
<text class="icon">首页</text>
</view>
<view class="nav-item" @click="goToOrders">
<text class="icon">订单</text>
</view>
<view class="nav-item" @click="goToMy">
<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: {
goToHome() {
//
uni.navigateTo({
url: '/pages/index/Home'
});
},
goToOrders() {
//
uni.navigateTo({
url: '/pages/index/Orders'
});
},
goToMy() {
//
uni.navigateTo({
url: '/pages/index/user-center'
});
},
searchTickets() {
const formData = {
departure: this.departure,
destination: this.destination,
date:this.date,
};
// POSTformDataJSON
uni.request({
// url: 'http://192.168.251.7:8000/search_train/', //
url: 'http://localhost:8000/search_train/',
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);
localStorage.setItem('ticketInfo', JSON.stringify(data.trains));
uni.showToast({
title: '查询成功',
icon: 'success'
});
uni.navigateTo({
url: '/pages/index/search-results'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
}
};
</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>

@ -1,155 +0,0 @@
<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.251.7:8000/login_view/', //
url: 'http://localhost:8000/login_view/',
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);
localStorage.setItem('passenger', JSON.stringify(data.passengers));
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'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', 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 {
background-color: #ffffff;
opacity: 0.65;
width: 95%;
height: 40px;
padding: 0 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.login-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -1,132 +0,0 @@
<template>
<view class="container">
<!-- 选项卡 -->
<view class="tab-bar">
<view class="tab-item" :class="{ 'active': activeTab === 'unpaid' }" @click="switchTab('unpaid')"></view>
<view class="tab-item" :class="{ 'active': activeTab === 'paid' }" @click="switchTab('paid')"></view>
<view class="tab-item" :class="{ 'active': activeTab === 'myTicket' }" @click="switchTab('myTicket')"></view>
</view>
<!-- 订单列表 -->
<view class="order-list">
<view v-if="activeTab === 'unpaid'" class="order-item unpaid" v-for="(order, index) in unpaidOrders" :key="index" @click="handleOrderClick(order)">
<text>订单号{{ order.id }}</text>
<text>车次{{ order.trainno }}</text>
<text>出发日期{{ order.date }}</text>
<text>金额{{ order.price }}</text>
<text>姓名{{ order.passenger_name }}</text>
<text>状态{{ order.state }}</text>
</view>
<view v-if="activeTab === 'paid'" class="order-item paid" v-for="(order, index) in paidOrders" :key="index" @click="paidOrderClick(order)">
<text>订单号{{ order.id }}</text>
<text>车次{{ order.trainno }}</text>
<text>出发日期{{ order.date }}</text>
<text>金额{{ order.price }}</text>
<text>姓名{{ order.passenger_name }}</text>
<text>状态{{ order.state }}</text>
</view>
<view v-if="activeTab === 'myTicket'" class="order-item my-ticket" v-for="(order, index) in myTickets" :key="index">
<text>订单号{{ order.id }}</text>
<text>车次{{ order.trainno }}</text>
<text>出发日期{{ order.date }}</text>
<text>金额{{ order.price }}</text>
<text>姓名{{ order.passenger_name }}</text>
<text>状态{{ order.state }}</text>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
activeTab: 'unpaid', //
myTickets: [], //
unpaidOrders: [], //
paidOrders: [], //
};
},
mounted() {
this.fetchorders();
},
methods: {
fetchorders() {
fetch('http://localhost:8000/get_orders/')
.then(response => response.json())
.then(data => {
this.unpaidOrders = data.unpaidOrders;
this.paidOrders = data.paidOrders;
this.myTickets = data.myTicket;
})
.catch(error => {
console.error('Error fetching passengers:', error);
//
});
},
handleOrderClick(order) {
uni.navigateBack({
url:'pages/index/confirm-order'
});
},
paidOrderClick(order){
uni.navigateTo({
url: `/pages/index/ticket?id=${order.id}&ticketno=${order.trainno}&date=${order.date}`
});
},
switchTab(tab) {
this.activeTab = tab;
}
}
};
</script>
<style scoped>
.container {
padding: 20px;
}
.tab-bar {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
.tab-item {
flex: 1;
text-align: center;
padding: 10px;
background-color: #f5f5f5;
}
.tab-item.active {
background-color: #007aff;
color: #ffffff;
}
.order-list {
display: flex;
flex-direction: column;
}
.order-item {
padding: 10px;
margin-bottom: 10px;
border-radius: 5px;
}
.unpaid {
background-color: #ff3b30;
color: #ffffff;
}
.paid {
background-color: #34c759;
color: #ffffff;
}
.my-ticket {
background-color: #007aff;
color: #ffffff;
}
</style>

@ -1,348 +0,0 @@
<template>
<div class="payment-page">
<div class="content">
<h1>支付页面</h1>
</div>
<div class="ticket-info">
<div class="departure-info">
<p class="time">{{ departure_time }}</p>
<p class="station">{{ departure }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticketno }}</h2>
<p class="date">{{ date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ arrival_time }}</p>
<p class="station"> {{ arrival }}</p>
</div>
</div>
<div class="content">
<view class="ticket-info">
<view class="info-item">
<text class="info-value">订单号{{ ticket_id }}</text>
</view>
<view class="info-item">
<text class="info-value">乘客{{ passenger_name }}</text>
</view>
<view class="info-item">
<text class="info-value">座位等级{{ tickettype }}</text>
</view>
<view class="info-item">
<text class="info-value">价格{{ price }}</text>
</view>
<view class="info-item">
<text class="info-value">座位号{{ seatno }}</text>
</view>
</view>
</div>
<div class="footer">
<button class="btn cancel-order" @click="cancelOrder"></button>
<button class="btn buy-return" @click="buyReturn"></button>
<button class="btn pay-now" @click="payNow"></button>
</div>
</div>
</template>
<script>
import ticketVue from './ticket.vue';
export default {
data() {
return {
ticket_id :'',
passenger_name:'肖帆',
date :'',
ticketno :'',
tickettype :'二等座',
price :'100',
seatno :'A',
departure: '',
arrival: '',
departure_time:'',
arrival_time:''
};
},
onLoad(query) {
//
this.ticket_id = query.id || '';
this.ticketno = query.ticketno || '';
this.date = query.date || '';
this.departure = query.departure || '';
this.arrival = query.arrival || '';
this.departure_time = query.departure_time || '';
this.arrival_time = query.arrival_time || '';
},
methods: {
cancelOrder() {
const formData = {
ticket_id :this.ticket_id,
passenger_name:'肖帆',
date :this.date,
trainno :this.ticketno,
tickettype :'二等座',
price :'100',
seatno :'A',
};
// POSTformDataJSON
uni.request({
url: 'http://localhost:8000/cancelOrder/',
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/Orders'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
buyReturn() {
//
const formData = {
departure: this.departure,
arrival: this.arrival,
};
uni.request({
url: 'http://localhost:8000/buyReturn/',
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);
localStorage.setItem('ticketInfo', JSON.stringify(data.trains));
uni.showToast({
title: '购买成功',
icon: 'success'
});
uni.navigateTo({
url: '/pages/index/returnsearch-results'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
payNow() {
const formData = {
ticket_id :this.ticket_id,
passenger_name:'肖帆',
date :this.date,
trainno :this.ticketno,
tickettype :'二等座',
price :'100',
seatno :'A',
};
// POSTformDataJSON
uni.request({
url: 'http://localhost:8000/buy_ticket/',
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/Orders`
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style scoped>
.payment-page {
padding: 20px;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.content {
text-align: center;
margin-bottom: 20px;
}
.footer {
display: flex;
justify-content: space-between;
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: white;
padding: 10px 20px;
box-shadow: 0 -2px 5px rgba(0,0,0,0.1);
}
.btn {
padding: 10px 20px;
border: none;
cursor: pointer;
border-radius: 5px;
font-size: 12px;
flex: 1;
margin: 0 5px;
}
.cancel-order {
background-color: transparent; /* 无色 */
color: black;
border: 1px solid gray;
}
.buy-return {
background-color: #add8e6; /* 浅蓝色 */
color: white;
border: 1px solid #add8e6;
}
.ticket-info {
display: flex;
flex-wrap: wrap;
padding: 20rpx;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time .num,.price {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no,{
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.info-item {
flex: 0 0 auto;
margin-right: 20rpx;
margin-bottom: 10rpx;
}
.info-value {
color: #333;
}
.pay-now {
background-color: #ffa500; /* 橙色 */
color: white;
border: 1px solid #ffa500;
}
</style>

@ -1,214 +0,0 @@
<template>
<div class="page-background">
<view class="container">
<view class="register-header">
<text class="title">Mini-12306用户注册</text>
</view>
<form method="post" action="{% url 'save_passenger' %}">
<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>
</form>
</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;
}
//
if (this.idCard.length != 18) {
uni.showToast({
title: '身份证号码应为18位',
icon: 'none'
});
return;
}
//
if (this.PhoneNo.length != 11) {
uni.showToast({
title: '手机号码应为11位',
icon: 'none'
});
return;
}
//
if (this.Bankcard.length < 16 || this.Bankcard.length > 19) {
uni.showToast({
title: '银行卡号应为16-19位',
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.251.7:8000/save_passenger/',
url: 'http://localhost:8000/save_passenger/',
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'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style scoped>
.container {
padding: 20px;
}
.input-group {
margin-bottom: 20px;
}
.input-group input {
background-color: #ffffff;
opacity: 0.65;
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: #007aff;
color: #000000;
outline: none;
}
</style>

@ -1,107 +0,0 @@
<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: '杭州' },
{ 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>

@ -1,283 +0,0 @@
<template>
<div>
<h1>确认订单(返程)</h1>
<div class="ticket-info">
<div class="departure-info">
<p class="time">{{ departure_time }}</p>
<p class="station">{{ departure }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticketno }}</h2>
<p class="date">{{ date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ arrival_time }}</p>
<p class="station"> {{ arrival }}</p>
</div>
</div>
<view v-if="ticketData">
<div class="container">
<!-- 二等座 -->
<div
class="seat-box Second"
@click="selectSeat('Second')"
:class="{ selected: selectedSeat === 'Second' }"
>
<p>二等座</p>
<p class="price">¥{{ ticketData.secondseatprice }}</p>
<p class="num">{{ ticketData.secondseatnum }}</p>
</div>
<!-- 一等座 -->
<div
class="seat-box First"
@click="selectSeat('First')"
:class="{ selected: selectedSeat === 'First' }"
>
<p>一等座</p>
<p class="price">¥{{ ticketData.firstseatprice }}</p>
<p class="num">{{ ticketData.firstseatnum }}</p>
</div>
<!-- 商务座 -->
<div
class="seat-box Business"
@click="selectSeat('Business')"
:class="{ selected: selectedSeat === 'Business' }"
>
<p>商务座</p>
<p class="price">¥{{ ticketData.businessseatprice }}</p>
<p class="num">{{ ticketData.businessseatnum }}</p>
</div>
<!-- 无座 -->
<div
class="seat-box NO"
@click="selectSeat('NO')"
:class="{ selected: selectedSeat === 'NO' }"
>
<p>无座</p>
<p class="price">¥{{ ticketData.noseatprice }}</p>
<p class="num">{{ ticketData.noseatnum }}</p>
</div>
<div v-if="selectedSeatType" class="seat-selection">
<div
class="seat-option"
v-for="seat in ['A', 'B', 'C', 'D', 'E']"
:key="seat"
@click="selectSeat(seat)"
:class="{ selected: selectedSeat === seat }"
>
{{ seat }}
</div>
</div>
</div>
</view>
<button class="submit-btn" @click="submitOrder"></button>
</div>
</template>
<script>
export default {
data() {
return {
selectedSeat: null,
id:'',
ticketno: '',
date: '',
departure: '',
arrival: '',
departure_time:'',
arrival_time:'',
ticketData: null
};
},
onLoad(query) {
this.id = query.id || '';
//
this.ticketno = query.ticketno || '';
this.date = query.date || '';
this.departure = query.departure || '';
this.arrival = query.arrival || '';
this.departure_time = query.departure_time || '';
this.arrival_time = query.arrival_time || '';
},
mounted() {
this.fetchTicketInfo();
this.loadSelectedPassengers();
},
methods: {
onshow(){
this.fetchTicketInfo();
this.loadSelectedPassengers();
},
selectSeat(seatType) {
this.selectedSeat = seatType; //
},
submitOrder() {
if (!this.selectedSeat) {
uni.showToast({
title: '请选择座次',
icon: 'none',
duration: 2000
});
return;
}
uni.navigateTo({
url: `/pages/index/return-Payment?id=${this.id}&ticketno=${this.ticketno}&date=${this.date}&departure=${this.departure}&arrival=${this.arrival}&departure_time=${this.departure_time}&arrival_time=${this.arrival_time}`
});
},
addPassenge(){
uni.navigateTo({
url: '/pages/index/passenge-list'
});
},
fetchTicketInfo() {
const formData = {
date:this.date,
trainno:this.ticketno,
};
// POSTformDataJSON
uni.request({
url: 'http://localhost:8000/book_ticket/',
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);
this.ticketData = data.tickets;
uni.showToast({
title: '查询成功',
icon: 'success'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
}
};
</script>
<style scoped>
h1 {
text-align: center;
font-size: 24px;
margin-bottom: 20px;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time .num,.price {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no,{
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.container {
display: flex;
justify-content: space-between; /* 均匀分布每个子元素 */
}
.container > div { /* 选择 container 中的每一个直接子元素 */
flex: 1; /* 每个子元素平分父容器的宽度 */
border: 1px solid #ccc;
padding: 10px;
margin-right: 10px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.container > div:last-child {
margin-right: 0; /* 移除最后一个子元素的右边距 */
}
.container {
display: flex;
flex-wrap: wrap;
}
.seat-box {
width: 100px;
padding: 10px;
margin: 10px;
border: 1px solid #ccc;
text-align: center;
cursor: pointer;
}
.seat-box.selected {
background-color: #4cd964;; /* 选中的座位框变绿 */
color: white;
}
.selected {
background-color: yellow; /* 选中时的背景色 */
color: white; /* 文字颜色 */
}
.submit-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -1,117 +0,0 @@
<template>
<view class="container">
<view class="user-info">
<text class="user-name">{{ userName.name }}</text>
</view>
<input v-model="oldPassword" type="password" placeholder="请输入旧密码" />
<input v-model="newPassword" type="password" placeholder="请输入新密码" />
<input v-model="confirmPassword" type="password" placeholder="请确认新密码" />
<button @click="changePassword"></button>
</view>
</template>
<script>
export default {
data() {
return {
userName:[],
oldPassword: '',
newPassword: '',
confirmPassword: ''
};
},
mounted() {
//
const storedname = JSON.parse(localStorage.getItem('passenger'));
if (storedname) {
this.userName = storedname;
}
},
methods: {
changePassword() {
//
if (this.newPassword !== this.confirmPassword) {
uni.showToast({
title: '新密码与确认密码不一致',
icon: 'none'
});
return;
}
//
const formData = {
name:this.userName.name,
oldpassword:this.oldPassword,
newpassword:this.newPassword,
};
uni.request({
url: 'http://localhost:8000/change_password/',
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'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style>
.container {
padding: 20rpx;
}
input {
margin-bottom: 20rpx;
height: 60rpx;
border: 1px solid #ccc;
border-radius: 8rpx;
padding: 0 20rpx;
}
button {
width: 100%;
height: 100rpx;
line-height: 100rpx;
text-align: center;
background-color: #007AFF;
color: #fff;
border: none;
border-radius: 8rpx;
}
.user-name {
font-size: 30px;
font-weight: bold;
position: center;
}
</style>

@ -1,310 +0,0 @@
<template>
<div>
<h1>确认订单</h1>
<div class="ticket-info">
<div class="departure-info">
<p class="time">{{ departure_time }}</p>
<p class="station">{{ departure }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticketno }}</h2>
<p class="date">{{ date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ arrival_time }}</p>
<p class="station"> {{ arrival }}</p>
</div>
</div>
<view v-if="ticketData">
<div class="container">
<!-- 二等座 -->
<div
class="seat-box Second"
@click="selectSeat('Second')"
:class="{ selected: selectedSeat === 'Second' }"
>
<p>二等座</p>
<p class="price">¥{{ ticketData.secondseatprice }}</p>
<p class="num">{{ ticketData.secondseatnum }}</p>
</div>
<!-- 一等座 -->
<div
class="seat-box First"
@click="selectSeat('First')"
:class="{ selected: selectedSeat === 'First' }"
>
<p>一等座</p>
<p class="price">¥{{ ticketData.firstseatprice }}</p>
<p class="num">{{ ticketData.firstseatnum }}</p>
</div>
<!-- 商务座 -->
<div
class="seat-box Business"
@click="selectSeat('Business')"
:class="{ selected: selectedSeat === 'Business' }"
>
<p>商务座</p>
<p class="price">¥{{ ticketData.businessseatprice }}</p>
<p class="num">{{ ticketData.businessseatnum }}</p>
</div>
<!-- 无座 -->
<div
class="seat-box NO"
@click="selectSeat('NO')"
:class="{ selected: selectedSeat === 'NO' }"
>
<p>无座</p>
<p class="price">¥{{ ticketData.noseatprice }}</p>
<p class="num">{{ ticketData.noseatnum }}</p>
</div>
<div v-if="selectedSeatType" class="seat-selection">
<div
class="seat-option"
v-for="seat in ['A', 'B', 'C', 'D', 'E']"
:key="seat"
@click="selectSeat(seat)"
:class="{ selected: selectedSeat === seat }"
>
{{ seat }}
</div>
</div>
</div>
</view>
<div>
<button class="add-btn" @click="addPassenge"></button>
<view>
<block v-for="(passenger, index) in selectedPassengers" :key="index">
<view>
<text>{{ passenger.name }} - {{ passenger.passengerstate }} - {{ passenger.idcardno }} - {{ passenger.mobileno }}</text>
</view>
</block>
</view>
</div>
<button class="submit-btn" @click="submitOrder"></button>
</div>
</template>
<script>
export default {
data() {
return {
selectedSeat: null,
id:'',
ticketno: '',
date: '',
departure: '',
arrival: '',
departure_time:'',
arrival_time:'',
ticketData: null,
selectedPassengers: []
};
},
onLoad(query) {
//
this.id = query.id || '';
this.ticketno = query.ticketno || '';
this.date = query.date || '';
this.departure = query.departure || '';
this.arrival = query.arrival || '';
this.departure_time = query.departure_time || '';
this.arrival_time = query.arrival_time || '';
},
mounted() {
this.fetchTicketInfo();
this.loadSelectedPassengers();
},
methods: {
onshow(){
this.fetchTicketInfo();
this.loadSelectedPassengers();
},
selectSeat(seatType) {
this.selectedSeat = seatType; //
},
loadSelectedPassengers(){
const passengers = localStorage.getItem('selectedPassenger');
if (passengers) {
this.selectedPassengers = JSON.parse(passengers);
} else {
console.error('No passengers found in local storage.');
}
},
submitOrder() {
if (!this.selectedSeat) {
uni.showToast({
title: '请选择座次',
icon: 'none',
duration: 2000
});
return;
}
//
if (this.selectedPassengers.length === 0) {
uni.showToast({
title: '请选择乘车人',
icon: 'none',
duration: 2000
});
return;
}
uni.navigateTo({
url: `/pages/index/Payment?id=${this.id}&ticketno=${this.ticketno}&date=${this.date}&departure=${this.departure}&arrival=${this.arrival}&departure_time=${this.departure_time}&arrival_time=${this.arrival_time}`
});
},
addPassenge(){
uni.navigateTo({
url: '/pages/index/passenge-list'
});
},
fetchTicketInfo() {
const formData = {
date:this.date,
trainno:this.ticketno,
};
// POSTformDataJSON
uni.request({
url: 'http://localhost:8000/book_ticket/',
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);
this.ticketData = data.tickets;
uni.showToast({
title: '查询成功',
icon: 'success'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
}
};
</script>
<style scoped>
h1 {
text-align: center;
font-size: 24px;
margin-bottom: 20px;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time .num,.price {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no,{
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.container {
display: flex;
justify-content: space-between; /* 均匀分布每个子元素 */
}
.container > div { /* 选择 container 中的每一个直接子元素 */
flex: 1; /* 每个子元素平分父容器的宽度 */
border: 1px solid #ccc;
padding: 10px;
margin-right: 10px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.container > div:last-child {
margin-right: 0; /* 移除最后一个子元素的右边距 */
}
.container {
display: flex;
flex-wrap: wrap;
}
.seat-box {
width: 100px;
padding: 10px;
margin: 10px;
border: 1px solid #ccc;
text-align: center;
cursor: pointer;
}
.seat-box.selected {
background-color: #4cd964;; /* 选中的座位框变绿 */
color: white;
}
.selected {
background-color: yellow; /* 选中时的背景色 */
color: white; /* 文字颜色 */
}
.submit-btn {
width: 100%;
height: 40px;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
}
</style>

@ -1,38 +0,0 @@
<template>
<div class="page-background">
<view class="content">
<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 {
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填充整个视口 */
}
</style>

@ -1,169 +0,0 @@
<template>
<view class="container">
<view class="add-header">
<text class="title">添加用户</text>
</view>
<form>
<view class="input-group">
<input v-model="name" type="text" placeholder="请输入姓名" />
</view>
<view class="input-group">
<input v-model="passengerstate" 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="add-btn">
<button @click="addpassenger"></button>
</view>
</form>
</view>
</template>
<script>
export default {
data() {
return {
name: '',
passengerstate:'',
idCard: '',
PhoneNo:''
};
},
methods: {
addpassenger() {
// 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.idCard.length != 18) {
uni.showToast({
title: '身份证号码应为18位',
icon: 'none'
});
return;
}
//
if (this.PhoneNo.length != 11) {
uni.showToast({
title: '手机号码应为11位',
icon: 'none'
});
return;
}
const formData = {
name: this.name,
idCard: this.idCard,
PhoneNO:this.PhoneNo,
passengerstate:this.passengerstate,
};
// POSTformDataJSON
uni.request({
// url: 'http://192.168.251.7:8000/save_passenger/',
url: 'http://localhost:8000/addpassenger/',
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.navigateBack({
url: '/pages/index/passenge-list'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style scoped>
.container {
padding: 20px;
}
.input-group {
margin-bottom: 20px;
}
.input-group input {
background-color: #ffffff;
opacity: 0.65;
width: 95%;
height: 40px;
padding: 0 10px;
border: 1px solid #ccc;
border-radius: 5px;
}
.add-header {
margin-bottom: 20px;
}
.add-btn button {
width: 100%;
height: 40px;
line-height: 40px;
border: none;
border-radius: 5px;
background-color: #007aff;
color: #000000;
outline: none;
}
</style>

@ -1,92 +0,0 @@
<template>
<view class="container">
<view class="title">选择乘客</view>
<view v-for="(passenger, index) in passengers" :key="index" class="passenger-card">
<checkbox-group @change="onSelectPassenger(index)">
<checkbox :value="index.toString()" :checked="passenger.selected"></checkbox>
</checkbox-group>
<view class="passenger-info">
<text>姓名{{ passenger.name }}</text>
<text>乘客类型{{ passenger.passengerstate }}</text>
<text>身份证号{{ passenger.idcardno }}</text>
<text>电话号码{{ passenger.mobileno }}</text>
</view>
</view>
<button @click="confirmSelection"></button>
<button @click="addPassenger"></button>
</view>
</template>
<script>
export default {
data() {
return {
passengers: []
};
},
mounted() {
this.fetchPassengerInfo();
},
methods: {
onShow() { // Uni-app
this.fetchPassengerInfo();
},
onSelectPassenger(index) {
this.$set(this.passengers, index, {
...this.passengers[index],
selected: !this.passengers[index].selected
});
},
confirmSelection() {
const selectedPassengers = this.passengers.filter(passenger => passenger.selected);
localStorage.setItem('selectedPassenger', JSON.stringify(selectedPassengers));
uni.navigateBack({
url: '/pages/index/confirm-order'
});
},
fetchPassengerInfo() {
fetch('http://localhost:8000/get_passengers/')
.then(response => response.json())
.then(data => {
this.passengers = data.passenger.map(p => ({
...p,
selected: false //
}));
})
.catch(error => {
console.error('Error fetching passengers:', error);
//
});
},
addPassenger() {
uni.navigateTo({
url: '/pages/index/newpassenger'
});
}
}
};
</script>
<style scoped>
.container {
padding: 16px;
}
.title {
font-size: 24px;
font-weight: bold;
margin-bottom: 16px;
}
.passenger-card {
margin-bottom: 12px;
padding: 12px;
border: 1px solid #ddd;
border-radius: 8px;
}
.passenger-info text {
display: block;
margin-top: 4px;
}
</style>

@ -1,148 +0,0 @@
<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() {
if (!this.refundReason) {
uni.showToast({
title: '请说明理由',
icon: 'none',
duration: 2000
});
return;
}
// 退退
const formData = {
ticket_id:this.orderNumber,
date:this.travelDate,
};
uni.request({
// url: 'http://192.168.251.7:8000/search_train/', //
url: 'http://localhost:8000/refund_ticket/',
method: 'POST',
data: JSON.stringify(formData), // formDataJSON
header: {
'content-type': 'application/json' // JSON
},
success: (res) => {
//
if (res.statusCode === 200) { // 200
const data = res.data;
localStorage.setItem('state', JSON.stringify({data}))
if (data.message === '退票成功') {
console.log('请求成功',data);
uni.showToast({
title: '退票成功',
icon: 'success'
});
//
this.orderNumber = '';
this.travelDate = '';
this.refundReason = '';
uni.navigateTo({
url: '/pages/index/Orders'
});
} else {
//
uni.showToast({
title: '订单不存在',
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</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>

@ -1,248 +0,0 @@
<template>
<div class="payment-page">
<div class="content">
<h1>支付页面(返程)</h1>
</div>
<div class="ticket-info">
<div class="departure-info">
<p class="time">{{ departure_time }}</p>
<p class="station">{{ departure }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticketno }}</h2>
<p class="date">{{ date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ arrival_time }}</p>
<p class="station"> {{ arrival }}</p>
</div>
</div>
<div class="content">
<view class="ticket-info">
<view class="info-item">
<text class="info-value">订单号{{ ticket_id }}</text>
</view>
<view class="info-item">
<text class="info-value">乘客{{ passenger_name }}</text>
</view>
<view class="info-item">
<text class="info-value">座位等级{{ tickettype }}</text>
</view>
<view class="info-item">
<text class="info-value">价格{{ price }}</text>
</view>
<view class="info-item">
<text class="info-value">座位号{{ seatno }}</text>
</view>
</view>
</div>
<div class="footer">
<button class="btn cancel-order" @click="cancelOrder"></button>
<button class="btn pay-now" @click="payNow"></button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
ticket_id :'',
passenger_name:'肖帆',
date :'',
ticketno :'',
tickettype :'二等座',
price :'100',
seatno :'A',
departure: '',
arrival: '',
departure_time:'',
arrival_time:''
};
},
onLoad(query) {
//
this.ticket_id = query.id || '';
this.ticketno = query.ticketno || '';
this.date = query.date || '';
this.departure = query.departure || '';
this.arrival = query.arrival || '';
this.departure_time = query.departure_time || '';
this.arrival_time = query.arrival_time || '';
},
methods: {
cancelOrder() {
uni.navigateBack({
url: '/pages/index/confirm-order'
});
},
payNow() {
const formData = {
ticket_id :this.ticket_id,
passenger_name:'肖帆',
date :this.date,
trainno :this.ticketno,
tickettype :'二等座',
price :'100',
seatno :'A',
};
// POSTformDataJSON
uni.request({
url: 'http://localhost:8000/buy_ticket/',
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/ticket?id=${this.ticket_id}&ticketno=${this.ticketno}&date=${this.date}&departure=${this.departure}&arrival=${this.arrival}&departure_time=${this.departure_time}&arrival_time=${this.arrival_time}`
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
}
}
};
</script>
<style scoped>
.payment-page {
padding: 20px;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.content {
text-align: center;
margin-bottom: 20px;
}
.footer {
display: flex;
justify-content: space-between;
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: white;
padding: 10px 20px;
box-shadow: 0 -2px 5px rgba(0,0,0,0.1);
}
.btn {
padding: 10px 20px;
border: none;
cursor: pointer;
border-radius: 5px;
font-size: 12px;
flex: 1;
margin: 0 5px;
}
.cancel-order {
background-color: transparent; /* 无色 */
color: black;
border: 1px solid gray;
}
.ticket-info {
display: flex;
flex-wrap: wrap;
padding: 20rpx;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time .num,.price {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no,{
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.info-item {
flex: 0 0 auto;
margin-right: 20rpx;
margin-bottom: 10rpx;
}
.info-label {
font-weight: bold;
}
.info-value {
color: #333;
}
.pay-now {
background-color: #ffa500; /* 橙色 */
color: white;
border: 1px solid #ffa500;
}
</style>

@ -1,154 +0,0 @@
<template>
<h1>查询结果(返程)</h1>
<div>
<!-- 日期选项卡 -->
<div class="date-tabs">
<div class="date-tab"
v-for="date in uniqueDates"
:key="date"
@click="selectDate(date)"
:class="{ 'active': selectedDate === date }">
{{ date }}
</div>
</div>
<!-- 按选择的日期显示的车票信息 -->
<div>
<div v-for="(ticket, index) in filteredTickets" :key="index" class="ticket-box">
<div class="departure-info">
<p class="time">{{ ticket.departure_time }}</p>
<p class="station">{{ ticket.departure_station }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticket.trainno }}</h2>
<p class="date">{{ ticket.date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ ticket.arrival_time }}</p>
<p class="station">{{ ticket.arrival_station }}</p>
</div>
<button class="book-button" @click="handleBookClick(ticket)"></button>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
tickets: [], //
uniqueDates: [], //
selectedDate: null //
};
},
mounted() {
//
const storedTicketInfo = JSON.parse(localStorage.getItem('ticketInfo'));
if (storedTicketInfo) {
this.tickets = storedTicketInfo;
this.uniqueDates = Array.from(new Set(this.tickets.map(ticket => ticket.date)));
//
if (this.uniqueDates.length > 0) {
this.selectedDate = this.uniqueDates[0];
}
}
},
computed: {
filteredTickets() {
// 使 this.tickets
return this.tickets.filter(ticket => {
//
// date
return ticket.date === this.selectedDate;
});
}
},
methods: {
handleBookClick(ticket) {
uni.navigateTo({
url: `/pages/index/buyReturn?id=${ticket.id}&ticketno=${ticket.trainno}&date=${ticket.date}&departure=${ticket.departure_station}&arrival=${ticket.arrival_station}&departure_time=${ticket.departure_time}&arrival_time=${ticket.arrival_time}`
});
},
selectDate(date) {
this.selectedDate = date;
},
//
}
};
</script>
<style scoped>
h1 {
text-align: center;
font-size: 24px;
margin-bottom: 20px;
}
.ticket-box {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no {
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.book-button {
background-color: #007aff; /* 绿色背景 */
color: white; /* 白色文本 */
border: none; /* 无边框 */
padding: 5px 18px; /* 内边距 */
text-align: center; /* 文本居中 */
text-decoration: none; /* 无下划线 */
display: inline-block; /* 内联块级元素 */
font-size: 12px; /* 字体大小 */
margin: 4px 2px; /* 外边距 */
cursor: pointer; /* 鼠标指针 */
border-radius: 4px; /* 圆角边框 */
}
.date-tabs {
display: flex;
justify-content: space-around;
margin-bottom: 10px;
}
.date-tab {
padding: 5px 10px;
cursor: pointer;
border: 1px solid #ccc;
border-radius: 4px;
}
.date-tab.active {
background-color: #007bff;
color: white;
}
.book-button:hover {
background-color: #007aff; /* 悬停效果 */
}
</style>

@ -1,154 +0,0 @@
<template>
<h1>查询结果</h1>
<div>
<!-- 日期选项卡 -->
<div class="date-tabs">
<div class="date-tab"
v-for="date in uniqueDates"
:key="date"
@click="selectDate(date)"
:class="{ 'active': selectedDate === date }">
{{ date }}
</div>
</div>
<!-- 按选择的日期显示的车票信息 -->
<div>
<div v-for="(ticket, index) in filteredTickets" :key="index" class="ticket-box">
<div class="departure-info">
<p class="time">{{ ticket.departure_time }}</p>
<p class="station">{{ ticket.departure_station }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticket.trainno }}</h2>
<p class="date">{{ ticket.date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ ticket.arrival_time }}</p>
<p class="station">{{ ticket.arrival_station }}</p>
</div>
<button class="book-button" @click="handleBookClick(ticket)"></button>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
tickets: [], //
uniqueDates: [], //
selectedDate: null //
};
},
mounted() {
//
const storedTicketInfo = JSON.parse(localStorage.getItem('ticketInfo'));
if (storedTicketInfo) {
this.tickets = storedTicketInfo;
this.uniqueDates = Array.from(new Set(this.tickets.map(ticket => ticket.date)));
//
if (this.uniqueDates.length > 0) {
this.selectedDate = this.uniqueDates[0];
}
}
},
computed: {
filteredTickets() {
// 使 this.tickets
return this.tickets.filter(ticket => {
//
// date
return ticket.date === this.selectedDate;
});
}
},
methods: {
handleBookClick(ticket) {
uni.navigateTo({
url: `/pages/index/confirm-order?id=${ticket.id}&ticketno=${ticket.trainno}&date=${ticket.date}&departure=${ticket.departure_station}&arrival=${ticket.arrival_station}&departure_time=${ticket.departure_time}&arrival_time=${ticket.arrival_time}`
});
},
selectDate(date) {
this.selectedDate = date;
},
//
}
};
</script>
<style scoped>
h1 {
text-align: center;
font-size: 24px;
margin-bottom: 20px;
}
.ticket-box {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no {
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.book-button {
background-color: #007aff; /* 绿色背景 */
color: white; /* 白色文本 */
border: none; /* 无边框 */
padding: 5px 18px; /* 内边距 */
text-align: center; /* 文本居中 */
text-decoration: none; /* 无下划线 */
display: inline-block; /* 内联块级元素 */
font-size: 12px; /* 字体大小 */
margin: 4px 2px; /* 外边距 */
cursor: pointer; /* 鼠标指针 */
border-radius: 4px; /* 圆角边框 */
}
.date-tabs {
display: flex;
justify-content: space-around;
margin-bottom: 10px;
}
.date-tab {
padding: 5px 10px;
cursor: pointer;
border: 1px solid #ccc;
border-radius: 4px;
}
.date-tab.active {
background-color: #007bff;
color: white;
}
.book-button:hover {
background-color: #007aff; /* 悬停效果 */
}
</style>

@ -1,259 +0,0 @@
<template>
<div class="ticket-page">
<div class="content">
<h1>车票详情</h1>
</div>
<div v-for="(ticket, index) in ticketInfo" :key="index" class="ticket-box">
<div class="departure-info">
<p class="time">{{ ticket.departure_time }}</p>
<p class="station">{{ ticket.departure_station }}</p>
</div>
<div class="train-info">
<h2 class="train-no">{{ ticket.trainno }}</h2>
<p class="date">{{ ticket.date }}</p>
</div>
<div class="arrival-info">
<p class="time">{{ ticket.arrival_time }}</p>
<p class="station">{{ ticket.arrival_station }}</p>
</div>
</div>
<div class="content">
<view class="ticket-info">
<view class="info-item">
<text class="info-value">订单号{{ ticket_id }}</text>
</view>
<view class="info-item">
<text class="info-value">乘客{{ passenger_name }}</text>
</view>
<view class="info-item">
<text class="info-value">座位等级{{ tickettype }}</text>
</view>
<view class="info-item">
<text class="info-value">价格{{ price }}</text>
</view>
<view class="info-item">
<text class="info-value">座位号{{ seatno }}</text>
</view>
</view>
</div>
<div class="footer">
<button class="btn" @click="refundTicket">退</button>
<button class="btn" @click="rescheduleTicket"></button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
ticketInfo:[],
ticket_id :'',
passenger_name:'肖帆',
date :'',
ticketno :'',
tickettype :'二等座',
price :'100',
seatno :'A',
departure: '',
arrival: '',
departure_time:'',
arrival_time:''
};
},
mounted() {
this.fetchTicketInfo();
},
onLoad(query) {
//
this.ticket_id = query.id || '';
this.ticketno = query.ticketno || '';
this.date = query.date || '';
this.departure = query.departure || '';
this.arrival = query.arrival || '';
this.departure_time = query.departure_time || '';
this.arrival_time = query.arrival_time || '';
},
methods: {
fetchTicketInfo(){
const formData = {
trainno : this.ticketno,
date : this.date,
};
// POSTformDataJSON
uni.request({
url: 'http://localhost:8000/search_ticket/',
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);
this.ticketInfo = data.trains;
uni.showToast({
title: '查询成功',
icon: 'success'
});
} else {
//
const data = res.data;
console.log('请求成功', data);
uni.showToast({
title: data.message + (data.reason ? ': ' + data.reason : ''),
icon: 'none'
});
}
}
},
fail: (err) => {
//
console.error('请求失败', err);
uni.showToast({
title: '请求失败,请重试',
icon: 'none'
});
}
});
},
refundTicket() {
// 退
uni.navigateTo({
url: '/pages/index/refund'
});
},
rescheduleTicket() {
//
uni.navigateTo({
url: '/pages/index/Change'
});
}
},
};
</script>
<style scoped>
.ticket-page {
padding: 20px;
}
.ticket-info {
display: flex;
flex-wrap: wrap;
padding: 20rpx;
}
.ticket-info {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time .num,.price {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no,{
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
.info-item {
flex: 0 0 auto;
margin-right: 20rpx;
margin-bottom: 10rpx;
}
.info-label {
font-weight: bold;
}
.info-value {
color: #333;
}
.footer {
display: flex;
justify-content: space-between;
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: white;
padding: 10px 20px;
box-shadow: 0 -2px 5px rgba(0,0,0,0.1);
}
.content {
text-align: center;
margin-bottom: 20px;
}
.btn {
padding: 3px 20px;
border: none;
cursor: pointer;
border-radius: 5px;
font-size: 16px;
flex: 1;
margin: 0 5px;
background-color: #32CD32; /* 绿色 */
color: white;
}
.ticket-box {
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid #ccc;
padding: 10px;
margin-bottom: 10px;
}
.departure-info, .arrival-info {
text-align: center;
}
.train-info {
text-align: center;
}
.time {
font-size: 12px; /* 设置时间的字体大小 */
}
.station {
font-size: 16px; /* 设置车站名称的字体大小 */
}
.train-no {
font-size: 20px; /* 设置车次的字体大小 */
}
.date {
font-size: 10px; /* 设置日期的字体大小 */
}
</style>

@ -1,96 +0,0 @@
<template>
<view class="container">
<!-- 顶部用户信息部分 -->
<view class="user-info">
<text class="user-name">{{userName.name}}</text>
</view>
<!-- 功能按钮部分 -->
<view class="button-list">
<button class="list-button" @click="navigateToPassenger"></button>
<button class="list-button" @click="navigateToOrders"></button>
<button class="list-button" @click="navigateToChangePassword"></button>
<button class="list-button logout-button" @click="logout">退</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {
userName: [] //
};
},
mounted() {
//
const storedname = JSON.parse(localStorage.getItem('passenger'));
if (storedname) {
this.userName = storedname;
}
},
methods: {
navigateToPassenger() {
uni.navigateTo({
url: '/pages/index/passenge-list'
});
},
navigateToOrders() {
uni.navigateTo({
url: '/pages/index/Orders'
});
},
navigateToChangePassword() {
uni.navigateTo({
url: 'change-password'
});
},
logout() {
// token
uni.clearStorageSync();
//
uni.reLaunch({
url: '/pages/index/Login'
});
}
}
};
</script>
<style scoped>
.container {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
}
.user-info {
margin-bottom: 20px;
text-align: center;
}
.user-name {
font-size: 24px;
font-weight: bold;
}
.button-list {
width: 100%;
}
.list-button {
width: 100%;
padding: 15px;
margin-top: 10px;
background-color: #007aff;
color: #ffffff;
text-align: center;
border-radius: 5px;
font-size: 18px;
}
.logout-button {
background-color: #ff3b30;
}
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,10 +0,0 @@
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]));
});
},
});

@ -1,76 +0,0 @@
/**
* 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;

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

File diff suppressed because one or more lines are too long

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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

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.

Before

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

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.

Before

Width:  |  Height:  |  Size: 2.0 KiB

@ -1,23 +0,0 @@
<!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>

@ -1,11 +0,0 @@
;(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

@ -1 +0,0 @@
{"@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"}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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}

@ -1 +0,0 @@
.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.

Before

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

@ -1,11 +0,0 @@
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();

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

File diff suppressed because one or more lines are too long

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

Loading…
Cancel
Save