first commit

This commit is contained in:
lingxiao865
2026-02-10 08:05:03 +08:00
commit c5af079d8c
1094 changed files with 97530 additions and 0 deletions

View File

@@ -0,0 +1,174 @@
"use strict";
const common_vendor = require("../../common/vendor.js");
const utils_api = require("../../utils/api.js");
if (!Array) {
const _easycom_t_tab_panel2 = common_vendor.resolveComponent("t-tab-panel");
const _easycom_t_tabs2 = common_vendor.resolveComponent("t-tabs");
const _easycom_t_loading2 = common_vendor.resolveComponent("t-loading");
const _easycom_t_empty2 = common_vendor.resolveComponent("t-empty");
const _easycom_t_tag2 = common_vendor.resolveComponent("t-tag");
const _easycom_t_button2 = common_vendor.resolveComponent("t-button");
(_easycom_t_tab_panel2 + _easycom_t_tabs2 + _easycom_t_loading2 + _easycom_t_empty2 + _easycom_t_tag2 + _easycom_t_button2)();
}
const _easycom_t_tab_panel = () => "../../uni_modules/tdesign-uniapp/components/tab-panel/tab-panel.js";
const _easycom_t_tabs = () => "../../uni_modules/tdesign-uniapp/components/tabs/tabs.js";
const _easycom_t_loading = () => "../../uni_modules/tdesign-uniapp/components/loading/loading.js";
const _easycom_t_empty = () => "../../uni_modules/tdesign-uniapp/components/empty/empty.js";
const _easycom_t_tag = () => "../../uni_modules/tdesign-uniapp/components/tag/tag.js";
const _easycom_t_button = () => "../../uni_modules/tdesign-uniapp/components/button/button.js";
if (!Math) {
(_easycom_t_tab_panel + _easycom_t_tabs + _easycom_t_loading + _easycom_t_empty + _easycom_t_tag + _easycom_t_button)();
}
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "appointments",
setup(__props) {
const activeTab = common_vendor.ref("all");
const appointments = common_vendor.ref([]);
const loading = common_vendor.ref(false);
common_vendor.onMounted(() => {
loadAppointments();
});
const loadAppointments = async () => {
loading.value = true;
try {
const params = {};
if (activeTab.value !== "all") {
params.status = activeTab.value;
}
appointments.value = await utils_api.api.appointments.getList(params);
} catch (error) {
common_vendor.index.__f__("error", "at pages/appointments/appointments.vue:84", "加载预约失败", error);
} finally {
loading.value = false;
}
};
const onTabChange = (value) => {
const tabValue = typeof value === "string" ? value : (value == null ? void 0 : value.value) || "all";
activeTab.value = tabValue;
loadAppointments();
};
const getStatusTheme = (status) => {
const themes = {
pending: "warning",
confirmed: "success",
completed: "primary",
cancelled: "default"
};
return themes[status] || "default";
};
const getStatusText = (status) => {
const texts = {
pending: "待确认",
confirmed: "已确认",
completed: "已完成",
cancelled: "已取消"
};
return texts[status] || status;
};
const formatDate = (dateStr) => {
if (!dateStr)
return "";
try {
return dateStr.replace("T", " ").split("+")[0];
} catch (error) {
common_vendor.index.__f__("error", "at pages/appointments/appointments.vue:127", "Date format error:", error, dateStr);
return dateStr;
}
};
const formatTime = (timeStr) => {
const timePart = timeStr.split("T")[1] || timeStr;
const timeWithoutZone = timePart.split("+")[0].split("Z")[0];
const [hours, minutes] = timeWithoutZone.split(":");
return `${hours}:${minutes}`;
};
const cancelAppointment = (appointment) => {
common_vendor.index.showModal({
title: "确认取消",
content: "确定要取消这个预约吗?",
success: async (res) => {
if (res.confirm) {
try {
await utils_api.api.appointments.cancel(appointment.id);
common_vendor.index.showToast({
title: "取消成功",
icon: "success"
});
loadAppointments();
} catch (error) {
common_vendor.index.__f__("error", "at pages/appointments/appointments.vue:157", "取消预约失败", error);
}
}
}
});
};
return (_ctx, _cache) => {
return common_vendor.e({
a: common_vendor.p({
value: "all",
label: "全部"
}),
b: common_vendor.p({
value: "pending",
label: "待确认"
}),
c: common_vendor.p({
value: "confirmed",
label: "已确认"
}),
d: common_vendor.p({
value: "completed",
label: "已完成"
}),
e: common_vendor.p({
value: "cancelled",
label: "已取消"
}),
f: common_vendor.o(onTabChange),
g: common_vendor.p({
value: activeTab.value
}),
h: loading.value
}, loading.value ? {
i: common_vendor.p({
loading: true
})
} : appointments.value.length === 0 ? {
k: common_vendor.p({
description: "暂无预约记录"
})
} : {
l: common_vendor.f(appointments.value, (appointment, k0, i0) => {
return common_vendor.e({
a: common_vendor.t(getStatusText(appointment.status)),
b: "7c6f8f1a-8-" + i0,
c: common_vendor.p({
theme: getStatusTheme(appointment.status),
size: "small"
}),
d: common_vendor.t(formatDate(appointment.created_at)),
e: common_vendor.t(appointment.time_slot ? appointment.time_slot.date.split("T")[0] : ""),
f: common_vendor.t(appointment.time_slot ? formatTime(appointment.time_slot.start_time) : ""),
g: common_vendor.t(appointment.time_slot ? formatTime(appointment.time_slot.end_time) : ""),
h: common_vendor.t(appointment.people_count),
i: appointment.status === "pending"
}, appointment.status === "pending" ? {
j: common_vendor.o(($event) => cancelAppointment(appointment), appointment.id),
k: "7c6f8f1a-9-" + i0,
l: common_vendor.p({
size: "small",
theme: "danger",
variant: "outline"
})
} : {}, {
m: appointment.id
});
})
}, {
j: appointments.value.length === 0
});
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-7c6f8f1a"]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/appointments/appointments.js.map

View File

@@ -0,0 +1,11 @@
{
"navigationBarTitleText": "我的预约",
"usingComponents": {
"t-tab-panel": "../../uni_modules/tdesign-uniapp/components/tab-panel/tab-panel",
"t-tabs": "../../uni_modules/tdesign-uniapp/components/tabs/tabs",
"t-loading": "../../uni_modules/tdesign-uniapp/components/loading/loading",
"t-empty": "../../uni_modules/tdesign-uniapp/components/empty/empty",
"t-tag": "../../uni_modules/tdesign-uniapp/components/tag/tag",
"t-button": "../../uni_modules/tdesign-uniapp/components/button/button"
}
}

View File

@@ -0,0 +1 @@
<view class="container data-v-7c6f8f1a"><view class="tabs data-v-7c6f8f1a"><t-tabs wx:if="{{g}}" class="data-v-7c6f8f1a" u-s="{{['d']}}" bindchange="{{f}}" u-i="7c6f8f1a-0" bind:__l="__l" u-p="{{g}}"><t-tab-panel wx:if="{{a}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-1,7c6f8f1a-0" bind:__l="__l" u-p="{{a}}"/><t-tab-panel wx:if="{{b}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-2,7c6f8f1a-0" bind:__l="__l" u-p="{{b}}"/><t-tab-panel wx:if="{{c}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-3,7c6f8f1a-0" bind:__l="__l" u-p="{{c}}"/><t-tab-panel wx:if="{{d}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-4,7c6f8f1a-0" bind:__l="__l" u-p="{{d}}"/><t-tab-panel wx:if="{{e}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-5,7c6f8f1a-0" bind:__l="__l" u-p="{{e}}"/></t-tabs></view><view class="appointments-list data-v-7c6f8f1a"><t-loading wx:if="{{h}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-6" bind:__l="__l" u-p="{{i}}"/><view wx:elif="{{j}}" class="empty-state data-v-7c6f8f1a"><t-empty wx:if="{{k}}" class="data-v-7c6f8f1a" u-i="7c6f8f1a-7" bind:__l="__l" u-p="{{k}}"/></view><view wx:else class="data-v-7c6f8f1a"><view wx:for="{{l}}" wx:for-item="appointment" wx:key="m" class="appointment-card data-v-7c6f8f1a"><view class="appointment-header data-v-7c6f8f1a"><view class="appointment-status data-v-7c6f8f1a"><t-tag wx:if="{{appointment.c}}" class="data-v-7c6f8f1a" u-s="{{['d']}}" u-i="{{appointment.b}}" bind:__l="__l" u-p="{{appointment.c}}">{{appointment.a}}</t-tag></view><view class="appointment-date data-v-7c6f8f1a">{{appointment.d}}</view></view><view class="appointment-body data-v-7c6f8f1a"><view class="appointment-row data-v-7c6f8f1a"><text class="row-label data-v-7c6f8f1a">时间段:</text><text class="row-value data-v-7c6f8f1a">{{appointment.e}} {{appointment.f}} - {{appointment.g}}</text></view><view class="appointment-row data-v-7c6f8f1a"><text class="row-label data-v-7c6f8f1a">人数:</text><text class="row-value data-v-7c6f8f1a">{{appointment.h}}人</text></view></view><view wx:if="{{appointment.i}}" class="appointment-footer data-v-7c6f8f1a"><t-button wx:if="{{appointment.l}}" u-s="{{['d']}}" class="btn-outline data-v-7c6f8f1a" bindclick="{{appointment.j}}" u-i="{{appointment.k}}" bind:__l="__l" u-p="{{appointment.l}}"> 取消预约 </t-button></view></view></view></view></view>

View File

@@ -0,0 +1,61 @@
.container.data-v-7c6f8f1a {
height: calc(100vh - var(--window-top));
display: flex;
flex-direction: column;
background: #F8F9FA;
overflow: hidden;
}
.tabs.data-v-7c6f8f1a {
flex-shrink: 0;
background: #ffffff;
}
.appointments-list.data-v-7c6f8f1a {
flex: 1;
overflow-y: auto;
padding: 20rpx 32rpx;
}
.empty-state.data-v-7c6f8f1a {
padding: 120rpx 0;
}
.appointment-card.data-v-7c6f8f1a {
background: #ffffff;
border-radius: 16rpx;
padding: 32rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
}
.appointment-header.data-v-7c6f8f1a {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
}
.appointment-date.data-v-7c6f8f1a {
font-size: 24rpx;
color: #999;
}
.appointment-body.data-v-7c6f8f1a {
padding: 24rpx 0;
border-top: 1rpx solid #f0f0f0;
border-bottom: 1rpx solid #f0f0f0;
}
.appointment-row.data-v-7c6f8f1a {
display: flex;
margin-bottom: 16rpx;
}
.row-label.data-v-7c6f8f1a {
font-size: 28rpx;
color: #666;
min-width: 120rpx;
}
.row-value.data-v-7c6f8f1a {
font-size: 28rpx;
color: #333;
flex: 1;
}
.appointment-footer.data-v-7c6f8f1a {
padding-top: 24rpx;
display: flex;
justify-content: flex-end;
}

View File

@@ -0,0 +1,280 @@
"use strict";
const common_vendor = require("../../common/vendor.js");
const utils_api = require("../../utils/api.js");
if (!Array) {
const _easycom_t_loading2 = common_vendor.resolveComponent("t-loading");
const _easycom_t_empty2 = common_vendor.resolveComponent("t-empty");
const _easycom_t_tag2 = common_vendor.resolveComponent("t-tag");
const _easycom_t_button2 = common_vendor.resolveComponent("t-button");
const _easycom_t_stepper2 = common_vendor.resolveComponent("t-stepper");
const _easycom_t_dialog2 = common_vendor.resolveComponent("t-dialog");
(_easycom_t_loading2 + _easycom_t_empty2 + _easycom_t_tag2 + _easycom_t_button2 + _easycom_t_stepper2 + _easycom_t_dialog2)();
}
const _easycom_t_loading = () => "../../uni_modules/tdesign-uniapp/components/loading/loading.js";
const _easycom_t_empty = () => "../../uni_modules/tdesign-uniapp/components/empty/empty.js";
const _easycom_t_tag = () => "../../uni_modules/tdesign-uniapp/components/tag/tag.js";
const _easycom_t_button = () => "../../uni_modules/tdesign-uniapp/components/button/button.js";
const _easycom_t_stepper = () => "../../uni_modules/tdesign-uniapp/components/stepper/stepper.js";
const _easycom_t_dialog = () => "../../uni_modules/tdesign-uniapp/components/dialog/dialog.js";
if (!Math) {
(_easycom_t_loading + _easycom_t_empty + _easycom_t_tag + _easycom_t_button + _easycom_t_stepper + _easycom_t_dialog)();
}
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "booking",
setup(__props) {
const getLocalDateStr = () => {
const now = /* @__PURE__ */ new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, "0");
const day = String(now.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
};
const selectedDate = common_vendor.ref(getLocalDateStr());
const timeslots = common_vendor.ref([]);
const loading = common_vendor.ref(false);
const showDialog = common_vendor.ref(false);
const selectedSlot = common_vendor.ref(null);
const peopleCount = common_vendor.ref(1);
const notes = common_vendor.ref("");
const isBooking = common_vendor.ref(false);
const currentDate = common_vendor.ref(/* @__PURE__ */ new Date());
const weekdays = ["日", "一", "二", "三", "四", "五", "六"];
const dateBookings = common_vendor.ref({});
const dateHasSlots = common_vendor.ref({});
const currentDateStr = common_vendor.computed(() => {
const year = currentDate.value.getFullYear();
const month = currentDate.value.getMonth() + 1;
return `${year}${month}`;
});
const totalBookingCount = common_vendor.computed(() => {
return timeslots.value.reduce((sum, slot) => sum + slot.current_people, 0);
});
const calendarDays = common_vendor.computed(() => {
const year = currentDate.value.getFullYear();
const month = currentDate.value.getMonth();
const firstDay = new Date(year, month, 1);
const lastDay = new Date(year, month + 1, 0);
const today = /* @__PURE__ */ new Date();
const startWeekday = firstDay.getDay();
const days = [];
for (let i = startWeekday - 1; i >= 0; i--) {
days.push({
day: "",
dateStr: "",
isPlaceholder: true,
isOtherMonth: false,
isToday: false,
bookingCount: 0,
hasBookings: false
});
}
for (let i = 1; i <= lastDay.getDate(); i++) {
const date = new Date(year, month, i);
const yearNum = date.getFullYear();
const monthNum = date.getMonth() + 1;
const dayNum = date.getDate();
const dateStr = `${yearNum}-${String(monthNum).padStart(2, "0")}-${String(dayNum).padStart(2, "0")}`;
const todayYear = today.getFullYear();
const todayMonth = today.getMonth();
const todayDay = today.getDate();
const isToday = yearNum === todayYear && monthNum - 1 === todayMonth && dayNum === todayDay;
days.push({
day: i,
dateStr,
isPlaceholder: false,
isOtherMonth: false,
isToday,
bookingCount: dateBookings.value[dateStr] || 0,
hasBookings: dateHasSlots.value[dateStr] || false
});
}
return days;
});
common_vendor.onMounted(() => {
const token = common_vendor.index.getStorageSync("token");
if (!token) {
common_vendor.index.redirectTo({ url: "/pages/login/login" });
} else {
loadTimeSlots();
loadDateBookings();
}
});
const loadDateBookings = async () => {
try {
const slots = await utils_api.api.timeslots.getList({ is_active: true });
const bookings = {};
const slotsMap = {};
slots.forEach((slot) => {
const dateStr = slot.date.split("T")[0];
bookings[dateStr] = (bookings[dateStr] || 0) + slot.current_people;
slotsMap[dateStr] = true;
});
dateBookings.value = bookings;
dateHasSlots.value = slotsMap;
} catch (error) {
common_vendor.index.__f__("error", "at pages/booking/booking.vue:230", "加载日期预约统计失败", error);
}
};
const loadTimeSlots = async () => {
loading.value = true;
try {
const slots = await utils_api.api.timeslots.getList({
date: selectedDate.value,
is_active: true
});
timeslots.value = slots;
} catch (error) {
common_vendor.index.__f__("error", "at pages/booking/booking.vue:244", "加载时间槽失败", error);
} finally {
loading.value = false;
}
};
const selectDate = (day) => {
selectedDate.value = day.dateStr;
loadTimeSlots();
};
const formatTime = (timeStr) => {
const timePart = timeStr.split("T")[1] || timeStr;
const timeWithoutZone = timePart.split("+")[0].split("Z")[0];
const [hours, minutes] = timeWithoutZone.split(":");
return `${hours}:${minutes}`;
};
const showBookingModal = (slot) => {
if (isBooking.value) {
common_vendor.index.showToast({
title: "正在处理,请稍候",
icon: "none"
});
return;
}
if (!slot.is_active || slot.current_people >= slot.max_people) {
common_vendor.index.__f__("log", "at pages/booking/booking.vue:278", "时间槽不可用", slot);
common_vendor.index.showToast({
title: "该时间段已不可用",
icon: "none"
});
return;
}
selectedSlot.value = slot;
peopleCount.value = 1;
notes.value = "";
showDialog.value = true;
common_vendor.index.__f__("log", "at pages/booking/booking.vue:289", "打开弹窗", showDialog.value);
};
const confirmBooking = async () => {
if (!selectedSlot.value)
return;
isBooking.value = true;
try {
await utils_api.api.appointments.create(selectedSlot.value.id, peopleCount.value, notes.value);
common_vendor.index.showToast({
title: "预约成功",
icon: "success"
});
showDialog.value = false;
loadTimeSlots();
loadDateBookings();
} catch (error) {
showDialog.value = false;
} finally {
isBooking.value = false;
}
};
return (_ctx, _cache) => {
var _a, _b, _c, _d;
return common_vendor.e({
a: common_vendor.t(currentDateStr.value),
b: common_vendor.f(weekdays, (day, k0, i0) => {
return {
a: common_vendor.t(day),
b: day
};
}),
c: common_vendor.f(calendarDays.value, (day, index, i0) => {
return common_vendor.e({
a: !day.isPlaceholder
}, !day.isPlaceholder ? {
b: common_vendor.t(day.day)
} : {}, {
c: !day.isPlaceholder && day.bookingCount > 0
}, !day.isPlaceholder && day.bookingCount > 0 ? {
d: common_vendor.t(day.bookingCount)
} : {}, {
e: day.dateStr || `placeholder-${index}`,
f: day.isPlaceholder ? 1 : "",
g: day.dateStr === selectedDate.value ? 1 : "",
h: day.isToday ? 1 : "",
i: !day.hasBookings && !day.isPlaceholder ? 1 : "",
j: day.hasBookings ? 1 : "",
k: common_vendor.o(($event) => !day.isPlaceholder && selectDate(day), day.dateStr || `placeholder-${index}`)
});
}),
d: common_vendor.t(selectedDate.value),
e: totalBookingCount.value > 0
}, totalBookingCount.value > 0 ? {
f: common_vendor.t(totalBookingCount.value)
} : {}, {
g: loading.value
}, loading.value ? {
h: common_vendor.p({
loading: true
})
} : timeslots.value.length === 0 ? {
j: common_vendor.p({
description: "暂无可预约时间段"
})
} : {
k: common_vendor.f(timeslots.value, (slot, k0, i0) => {
return {
a: common_vendor.t(formatTime(slot.start_time)),
b: common_vendor.t(formatTime(slot.end_time)),
c: common_vendor.t(slot.current_people),
d: common_vendor.t(slot.max_people),
e: "d331dabb-2-" + i0,
f: common_vendor.p({
theme: slot.current_people >= slot.max_people ? "danger" : "success",
size: "small"
}),
g: common_vendor.t(slot.current_people >= slot.max_people ? "已满" : "预约"),
h: common_vendor.o(($event) => showBookingModal(slot), slot.id),
i: "d331dabb-3-" + i0,
j: common_vendor.p({
["t-class"]: "btn-primary",
size: "small",
theme: "primary",
disabled: !slot.is_active || slot.current_people >= slot.max_people
}),
k: slot.id,
l: !slot.is_active || slot.current_people >= slot.max_people ? 1 : ""
};
})
}, {
i: timeslots.value.length === 0,
l: common_vendor.t(selectedDate.value),
m: common_vendor.t(((_a = selectedSlot.value) == null ? void 0 : _a.start_time) ? formatTime(selectedSlot.value.start_time) : ""),
n: common_vendor.t(((_b = selectedSlot.value) == null ? void 0 : _b.end_time) ? formatTime(selectedSlot.value.end_time) : ""),
o: common_vendor.o(($event) => peopleCount.value = $event),
p: common_vendor.p({
min: 1,
max: ((_c = selectedSlot.value) == null ? void 0 : _c.max_people) - ((_d = selectedSlot.value) == null ? void 0 : _d.current_people) || 1,
disabled: true,
size: "small",
modelValue: peopleCount.value
}),
q: common_vendor.o(confirmBooking),
r: common_vendor.o(($event) => showDialog.value = false),
s: common_vendor.o(($event) => showDialog.value = $event),
t: common_vendor.p({
title: "预约确认",
cancelBtn: "取消",
confirmBtn: "确认预约",
["t-class-confirm"]: "btn-primary",
visible: showDialog.value
})
});
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-d331dabb"]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/booking/booking.js.map

View File

@@ -0,0 +1,11 @@
{
"navigationBarTitleText": "我要预约",
"usingComponents": {
"t-loading": "../../uni_modules/tdesign-uniapp/components/loading/loading",
"t-empty": "../../uni_modules/tdesign-uniapp/components/empty/empty",
"t-tag": "../../uni_modules/tdesign-uniapp/components/tag/tag",
"t-button": "../../uni_modules/tdesign-uniapp/components/button/button",
"t-stepper": "../../uni_modules/tdesign-uniapp/components/stepper/stepper",
"t-dialog": "../../uni_modules/tdesign-uniapp/components/dialog/dialog"
}
}

View File

@@ -0,0 +1 @@
<view class="container data-v-d331dabb"><view class="date-selector data-v-d331dabb"><view class="calendar-header data-v-d331dabb"><text class="month-title data-v-d331dabb">{{a}}</text></view><view class="calendar-weekdays data-v-d331dabb"><text wx:for="{{b}}" wx:for-item="day" wx:key="b" class="weekday data-v-d331dabb">{{day.a}}</text></view><view class="calendar-days data-v-d331dabb"><view wx:for="{{c}}" wx:for-item="day" wx:key="e" class="{{['calendar-day', 'data-v-d331dabb', day.f && 'placeholder', day.g && 'selected', day.h && 'today', day.i && 'disabled', day.j && 'has-bookings']}}" bindtap="{{day.k}}"><text wx:if="{{day.a}}" class="day-number data-v-d331dabb">{{day.b}}</text><text wx:if="{{day.c}}" class="booking-count data-v-d331dabb">{{day.d}}人 </text></view></view></view><scroll-view class="timeslots-scroll data-v-d331dabb" scroll-y="true"><view class="timeslots-section data-v-d331dabb"><view class="section-title data-v-d331dabb">{{d}} 可选时间段 <text wx:if="{{e}}" class="total-booking data-v-d331dabb"> (总预约: {{f}}人) </text></view><t-loading wx:if="{{g}}" class="data-v-d331dabb" u-i="d331dabb-0" bind:__l="__l" u-p="{{h}}"/><view wx:elif="{{i}}" class="empty-state data-v-d331dabb"><t-empty wx:if="{{j}}" class="data-v-d331dabb" u-i="d331dabb-1" bind:__l="__l" u-p="{{j}}"/></view><view wx:else class="timeslots-list data-v-d331dabb"><view wx:for="{{k}}" wx:for-item="slot" wx:key="k" class="{{['timeslot-card', 'data-v-d331dabb', slot.l && 'disabled']}}"><view class="timeslot-info data-v-d331dabb"><view class="time-range data-v-d331dabb">{{slot.a}} - {{slot.b}}</view><view class="slot-status data-v-d331dabb"><t-tag wx:if="{{slot.f}}" class="data-v-d331dabb" u-s="{{['d']}}" u-i="{{slot.e}}" bind:__l="__l" u-p="{{slot.f}}">{{slot.c}}/{{slot.d}}</t-tag></view></view><t-button wx:if="{{slot.j}}" class="data-v-d331dabb" u-s="{{['d']}}" catchclick="{{slot.h}}" u-i="{{slot.i}}" bind:__l="__l" u-p="{{slot.j}}">{{slot.g}}</t-button></view></view></view></scroll-view><t-dialog wx:if="{{t}}" class="data-v-d331dabb" u-s="{{['content']}}" bindconfirm="{{q}}" bindcancel="{{r}}" u-i="d331dabb-4" bind:__l="__l" bindupdateVisible="{{s}}" u-p="{{t}}"><scroll-view type="list" scroll-y class="long-content data-v-d331dabb" slot="content"><view class="booking-dialog data-v-d331dabb"><view class="dialog-item data-v-d331dabb"><text class="dialog-label data-v-d331dabb">日期:</text><text class="dialog-value data-v-d331dabb">{{l}}</text></view><view class="dialog-item data-v-d331dabb"><text class="dialog-label data-v-d331dabb">时间段:</text><text class="dialog-value data-v-d331dabb">{{m}} - {{n}}</text></view><view class="dialog-item data-v-d331dabb"><text class="dialog-label data-v-d331dabb">人数:</text><t-stepper wx:if="{{p}}" class="data-v-d331dabb" u-i="d331dabb-5,d331dabb-4" bind:__l="__l" bindupdateModelValue="{{o}}" u-p="{{p}}"/></view></view></scroll-view></t-dialog></view>

View File

@@ -0,0 +1,179 @@
.container.data-v-d331dabb {
height: calc(100vh - var(--window-top));
display: flex;
flex-direction: column;
background: #f5f5f5;
overflow: hidden;
}
.date-selector.data-v-d331dabb {
flex-shrink: 0;
background: #ffffff;
margin: 24rpx 32rpx;
border-radius: 16rpx;
padding: 32rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.06);
}
.calendar-header.data-v-d331dabb {
text-align: center;
margin-bottom: 24rpx;
}
.month-title.data-v-d331dabb {
font-size: 32rpx;
font-weight: bold;
color: #333;
}
.calendar-weekdays.data-v-d331dabb {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 8rpx;
margin-bottom: 16rpx;
padding: 0 10rpx;
}
.weekday.data-v-d331dabb {
font-size: 24rpx;
color: #999;
text-align: center;
}
.calendar-days.data-v-d331dabb {
display: grid;
grid-template-columns: repeat(7, 1fr);
gap: 8rpx;
padding: 0 10rpx;
}
.calendar-day.data-v-d331dabb {
height: 100rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 8rpx;
cursor: pointer;
transition: all 0.3s ease;
}
.calendar-day.placeholder.data-v-d331dabb {
visibility: hidden;
}
.calendar-day.disabled.data-v-d331dabb {
opacity: 0.4;
pointer-events: none;
}
.calendar-day.has-bookings.data-v-d331dabb {
background: rgba(255, 122, 0, 0.08);
border: 2rpx solid #FF7A00;
}
.calendar-day.today.data-v-d331dabb {
background: rgba(255, 122, 0, 0.12);
}
.calendar-day.selected.data-v-d331dabb {
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%);
}
.calendar-day.selected .day-number.data-v-d331dabb {
color: #ffffff;
}
.calendar-day.selected .booking-count.data-v-d331dabb {
color: #ffffff;
}
.day-number.data-v-d331dabb {
font-size: 28rpx;
color: #333;
margin-bottom: 4rpx;
}
.booking-count.data-v-d331dabb {
font-size: 20rpx;
color: #FF7A00;
}
.timeslots-scroll.data-v-d331dabb {
flex: 1;
overflow: hidden;
}
.timeslots-section.data-v-d331dabb {
padding: 32rpx;
}
.section-title.data-v-d331dabb {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 24rpx;
display: flex;
align-items: center;
}
.total-booking.data-v-d331dabb {
font-size: 24rpx;
color: #FF7A00;
margin-left: 16rpx;
font-weight: normal;
}
.empty-state.data-v-d331dabb {
padding: 80rpx 0;
}
.timeslots-list.data-v-d331dabb {
display: flex;
flex-direction: column;
gap: 20rpx;
}
.timeslot-card.data-v-d331dabb {
background: #ffffff;
border-radius: 16rpx;
padding: 32rpx;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
}
.timeslot-card.disabled.data-v-d331dabb {
opacity: 0.6;
}
.timeslot-info.data-v-d331dabb {
flex: 1;
}
.time-range.data-v-d331dabb {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 16rpx;
}
.slot-status.data-v-d331dabb {
margin-top: 8rpx;
}
.booking-dialog.data-v-d331dabb {
padding: 32rpx 0;
}
.dialog-item.data-v-d331dabb {
display: flex;
align-items: center;
padding: 20rpx 0;
border-bottom: 1rpx solid #f0f0f0;
}
.dialog-item.data-v-d331dabb:last-child {
border-bottom: none;
}
.dialog-label.data-v-d331dabb {
width: 120rpx;
font-size: 28rpx;
color: #666;
}
.dialog-value.data-v-d331dabb {
flex: 1;
font-size: 28rpx;
color: #333;
font-weight: 500;
}
/* 按钮自定义样式 - 使用全局样式 */
.btn-primary {
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%) !important;
border: none !important;
border-radius: 8rpx !important;
color: #FFFFFF !important;
box-shadow: 0 4rpx 12rpx rgba(255, 122, 0, 0.3) !important;
outline: none !important;
}
.btn-primary::after {
border: none !important;
box-shadow: none !important;
}
.btn-primary:active {
background: linear-gradient(135deg, #FF6900 0%, #FF8500 100%) !important;
}

View File

@@ -0,0 +1,75 @@
"use strict";
const common_vendor = require("../../common/vendor.js");
if (!Array) {
const _easycom_t_fab2 = common_vendor.resolveComponent("t-fab");
_easycom_t_fab2();
}
const _easycom_t_fab = () => "../../uni_modules/tdesign-uniapp/components/fab/fab.js";
if (!Math) {
_easycom_t_fab();
}
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "index",
setup(__props) {
const user = common_vendor.ref(null);
const banners = common_vendor.ref([
{ image: "https://picsum.photos/800/400?random=1", title: "专业美容服务" },
{ image: "https://picsum.photos/800/400?random=2", title: "预约更便捷" },
{ image: "https://picsum.photos/800/400?random=3", title: "优惠活动" }
]);
const menuItems = common_vendor.ref([
{ icon: "📅", text: "我要预约", path: "/pages/booking/booking" },
{ icon: "📋", text: "我的预约", path: "/pages/appointments/appointments" }
]);
common_vendor.onMounted(() => {
const token = common_vendor.index.getStorageSync("token");
if (!token) {
common_vendor.index.redirectTo({ url: "/pages/login/login" });
} else {
user.value = common_vendor.index.getStorageSync("user");
}
});
const navigateTo = (path) => {
common_vendor.index.navigateTo({ url: path });
};
const logout = () => {
common_vendor.index.showModal({
title: "提示",
content: "确定要退出登录吗?",
success: (res) => {
if (res.confirm) {
common_vendor.index.removeStorageSync("token");
common_vendor.index.removeStorageSync("user");
common_vendor.index.redirectTo({ url: "/pages/login/login" });
}
}
});
};
return (_ctx, _cache) => {
return {
a: common_vendor.f(banners.value, (item, index, i0) => {
return {
a: item.image,
b: index
};
}),
b: common_vendor.f(menuItems.value, (item, index, i0) => {
return {
a: common_vendor.t(item.icon),
b: common_vendor.t(item.text),
c: item.path,
d: common_vendor.o(($event) => navigateTo(item.path), item.path)
};
}),
c: common_vendor.o(logout),
d: common_vendor.p({
icon: "caret-right",
["aria-label"]: "退出"
})
};
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-1cf27b2a"]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/index/index.js.map

View File

@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "预约系统",
"usingComponents": {
"t-fab": "../../uni_modules/tdesign-uniapp/components/fab/fab"
}
}

View File

@@ -0,0 +1 @@
<view class="container data-v-1cf27b2a"><view class="swiper-container data-v-1cf27b2a"><swiper class="swiper data-v-1cf27b2a" indicator-dots="{{true}}" autoplay="{{true}}" interval="{{3000}}" duration="{{500}}" indicator-color="rgba(255, 255, 255, 0.5)" indicator-active-color="#FF7A00"><swiper-item wx:for="{{a}}" wx:for-item="item" wx:key="b" class="swiper-item data-v-1cf27b2a"><image src="{{item.a}}" class="banner-image data-v-1cf27b2a" mode="aspectFill" lazy-load/></swiper-item></swiper></view><view class="grid-scroll data-v-1cf27b2a"><view class="grid-container data-v-1cf27b2a"><view wx:for="{{b}}" wx:for-item="item" wx:key="c" class="grid-item data-v-1cf27b2a" bindtap="{{item.d}}"><view class="grid-icon data-v-1cf27b2a">{{item.a}}</view><text class="grid-text data-v-1cf27b2a">{{item.b}}</text></view></view></view><t-fab wx:if="{{d}}" class="data-v-1cf27b2a" bindclick="{{c}}" u-i="1cf27b2a-0" bind:__l="__l" u-p="{{d}}"/></view>

View File

@@ -0,0 +1,78 @@
.container.data-v-1cf27b2a {
height: calc(100vh - var(--window-top));
display: flex;
flex-direction: column;
background: #f5f5f5;
overflow: hidden;
}
.welcome-section.data-v-1cf27b2a {
flex-shrink: 0;
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%);
padding: 32rpx;
}
.welcome-text.data-v-1cf27b2a {
font-size: 36rpx;
font-weight: bold;
color: #ffffff;
}
/* 轮播图样式 */
.swiper-container.data-v-1cf27b2a {
flex-shrink: 0;
margin: 24rpx 32rpx;
border-radius: 16rpx;
overflow: hidden;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
.swiper.data-v-1cf27b2a {
width: 100%;
height: 360rpx;
}
.swiper-item.data-v-1cf27b2a {
width: 100%;
height: 100%;
}
.banner-image.data-v-1cf27b2a {
width: 100%;
height: 100%;
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%);
}
/* 九宫格样式 */
.grid-scroll.data-v-1cf27b2a {
flex: 1;
overflow: hidden;
}
.grid-container.data-v-1cf27b2a {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24rpx;
padding: 0 32rpx;
width: 100%;
align-content: center;
}
.grid-item.data-v-1cf27b2a {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #ffffff;
border-radius: 16rpx;
padding: 40rpx 20rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
transition: all 0.3s ease;
}
.grid-item.data-v-1cf27b2a:active {
transform: scale(0.95);
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
}
.grid-icon.data-v-1cf27b2a {
font-size: 64rpx;
margin-bottom: 16rpx;
}
.grid-text.data-v-1cf27b2a {
font-size: 28rpx;
color: #333;
font-weight: 500;
}

View File

@@ -0,0 +1,172 @@
"use strict";
const common_vendor = require("../../common/vendor.js");
const utils_api = require("../../utils/api.js");
if (!Array) {
const _easycom_t_input2 = common_vendor.resolveComponent("t-input");
const _easycom_t_button2 = common_vendor.resolveComponent("t-button");
(_easycom_t_input2 + _easycom_t_button2)();
}
const _easycom_t_input = () => "../../uni_modules/tdesign-uniapp/components/input/input.js";
const _easycom_t_button = () => "../../uni_modules/tdesign-uniapp/components/button/button.js";
if (!Math) {
(_easycom_t_input + _easycom_t_button)();
}
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "login",
setup(__props) {
const phone = common_vendor.ref("13777777777");
const code = common_vendor.ref("");
const loginType = common_vendor.ref("one-click");
const loading = common_vendor.ref(false);
const codeDisabled = common_vendor.ref(false);
const countdown = common_vendor.ref(0);
const codeButtonText = common_vendor.ref("发送验证码");
const toggleLoginType = () => {
loginType.value = loginType.value === "code" ? "one-click" : "code";
};
const sendCode = async () => {
common_vendor.index.__f__("log", "at pages/login/login.vue:74", phone.value);
if (!phone.value || phone.value.length !== 11) {
common_vendor.index.showToast({
title: "请输入正确的手机号",
icon: "none"
});
return;
}
try {
await utils_api.api.auth.sendCode("+86" + phone.value);
common_vendor.index.showToast({
title: "验证码已发送",
icon: "success"
});
codeDisabled.value = true;
countdown.value = 60;
const timer = setInterval(() => {
countdown.value--;
codeButtonText.value = `${countdown.value}秒后重发`;
if (countdown.value <= 0) {
clearInterval(timer);
codeDisabled.value = false;
codeButtonText.value = "发送验证码";
}
}, 1e3);
} catch (error) {
common_vendor.index.__f__("error", "at pages/login/login.vue:103", "发送验证码失败", error);
}
};
const codeLogin = async () => {
if (!phone.value || phone.value.length !== 11) {
common_vendor.index.showToast({
title: "请输入正确的手机号",
icon: "none"
});
return;
}
if (!code.value || code.value.length !== 6) {
common_vendor.index.showToast({
title: "请输入验证码",
icon: "none"
});
return;
}
loading.value = true;
try {
const res = await utils_api.api.auth.verificationLogin("+86" + phone.value, code.value);
common_vendor.index.setStorageSync("token", res.token);
common_vendor.index.setStorageSync("user", res.user);
common_vendor.index.showToast({
title: "登录成功",
icon: "success"
});
common_vendor.index.reLaunch({ url: "/pages/index/index" });
} catch (error) {
common_vendor.index.__f__("error", "at pages/login/login.vue:139", "登录失败", error);
} finally {
loading.value = false;
}
};
const oneClickLogin = async () => {
if (!phone.value || phone.value.length !== 11) {
common_vendor.index.showToast({
title: "请输入正确的手机号",
icon: "none"
});
return;
}
loading.value = true;
try {
const res = await utils_api.api.auth.oneClickLogin("+86" + phone.value);
common_vendor.index.setStorageSync("token", res.token);
common_vendor.index.setStorageSync("user", res.user);
common_vendor.index.showToast({
title: "登录成功",
icon: "success"
});
common_vendor.index.reLaunch({ url: "/pages/index/index" });
} catch (error) {
common_vendor.index.__f__("error", "at pages/login/login.vue:169", "登录失败", error);
} finally {
loading.value = false;
}
};
const goToRegister = () => {
common_vendor.index.navigateTo({ url: "/pages/register/register" });
};
return (_ctx, _cache) => {
return common_vendor.e({
a: common_vendor.o(($event) => phone.value = $event),
b: common_vendor.p({
placeholder: "请输入手机号",
type: "number",
maxlength: 11,
clearable: true,
value: phone.value
}),
c: loginType.value === "code"
}, loginType.value === "code" ? {
d: common_vendor.t(codeButtonText.value),
e: common_vendor.o(sendCode),
f: common_vendor.p({
size: "small",
variant: "text",
disabled: codeDisabled.value
}),
g: common_vendor.o(($event) => code.value = $event),
h: common_vendor.p({
placeholder: "请输入验证码",
type: "number",
maxlength: 6,
clearable: true,
value: code.value
})
} : {}, {
i: loginType.value === "code"
}, loginType.value === "code" ? {
j: common_vendor.o(codeLogin),
k: common_vendor.p({
["t-class"]: "btn-primary",
theme: "primary",
size: "large",
block: true,
loading: loading.value
})
} : {
l: common_vendor.o(oneClickLogin),
m: common_vendor.p({
["t-class"]: "btn-primary",
theme: "primary",
size: "large",
block: true,
loading: loading.value
})
}, {
n: common_vendor.t(loginType.value === "code" ? "使用一键登录" : "使用验证码登录"),
o: common_vendor.o(toggleLoginType),
p: common_vendor.o(goToRegister)
});
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-e4e4508d"]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/login/login.js.map

View File

@@ -0,0 +1,7 @@
{
"navigationBarTitleText": "登录",
"usingComponents": {
"t-input": "../../uni_modules/tdesign-uniapp/components/input/input",
"t-button": "../../uni_modules/tdesign-uniapp/components/button/button"
}
}

View File

@@ -0,0 +1 @@
<view class="login-container data-v-e4e4508d"><view class="login-header data-v-e4e4508d"><text class="title data-v-e4e4508d">欢迎使用预约系统</text><text class="subtitle data-v-e4e4508d">请登录或注册</text></view><view class="login-form data-v-e4e4508d"><view class="form-item data-v-e4e4508d"><t-input wx:if="{{b}}" class="data-v-e4e4508d" u-s="{{['prefixIcon']}}" u-i="e4e4508d-0" bind:__l="__l" bindupdateValue="{{a}}" u-p="{{b}}"><text class="prefix-icon data-v-e4e4508d" slot="prefixIcon">📱</text></t-input></view><view wx:if="{{c}}" class="form-item data-v-e4e4508d"><t-input wx:if="{{h}}" class="data-v-e4e4508d" u-s="{{['prefixIcon','suffix']}}" u-i="e4e4508d-1" bind:__l="__l" bindupdateValue="{{g}}" u-p="{{h}}"><text class="prefix-icon data-v-e4e4508d" slot="prefixIcon">🔐</text><t-button class="data-v-e4e4508d" u-s="{{['d']}}" bindclick="{{e}}" u-i="e4e4508d-2,e4e4508d-1" bind:__l="__l" u-p="{{f}}" slot="suffix">{{d}}</t-button></t-input></view><view class="form-actions data-v-e4e4508d"><t-button wx:if="{{i}}" class="data-v-e4e4508d" u-s="{{['d']}}" bindclick="{{j}}" u-i="e4e4508d-3" bind:__l="__l" u-p="{{k}}"> 验证码登录 </t-button><t-button wx:else class="data-v-e4e4508d" u-s="{{['d']}}" bindclick="{{l}}" u-i="e4e4508d-4" bind:__l="__l" u-p="{{m||''}}"> 一键登录 </t-button></view><view class="form-switch data-v-e4e4508d"><text class="data-v-e4e4508d" bindtap="{{o}}">{{n}}</text><text class="register-link data-v-e4e4508d" bindtap="{{p}}">注册新账号</text></view></view></view>

View File

@@ -0,0 +1,70 @@
.login-container.data-v-e4e4508d {
min-height: 100vh;
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%);
padding: 80rpx 40rpx;
}
.login-header.data-v-e4e4508d {
text-align: center;
margin-bottom: 100rpx;
}
.title.data-v-e4e4508d {
display: block;
font-size: 48rpx;
font-weight: bold;
color: #ffffff;
margin-bottom: 20rpx;
}
.subtitle.data-v-e4e4508d {
display: block;
font-size: 28rpx;
color: rgba(255, 255, 255, 0.8);
}
.login-form.data-v-e4e4508d {
background: #ffffff;
border-radius: 32rpx;
padding: 60rpx 40rpx;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.1);
}
.form-item.data-v-e4e4508d {
margin-bottom: 32rpx;
}
.prefix-icon.data-v-e4e4508d {
font-size: 32rpx;
color: #FF7A00;
}
.form-actions.data-v-e4e4508d {
margin-top: 60rpx;
}
.form-switch.data-v-e4e4508d {
display: flex;
justify-content: space-between;
margin-top: 32rpx;
font-size: 28rpx;
color: #666;
}
.form-switch text.data-v-e4e4508d {
padding: 16rpx 0;
}
.register-link.data-v-e4e4508d {
color: #FF7A00 !important;
font-weight: bold;
}
/* 按钮自定义样式 - 使用全局样式 */
.btn-primary {
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%) !important;
border: none !important;
border-radius: 8rpx !important;
color: #FFFFFF !important;
box-shadow: 0 4rpx 12rpx rgba(255, 122, 0, 0.3) !important;
outline: none !important;
}
.btn-primary::after {
border: none !important;
box-shadow: none !important;
}
.btn-primary:active {
background: linear-gradient(135deg, #FF6900 0%, #FF8500 100%) !important;
}

View File

@@ -0,0 +1,85 @@
"use strict";
const common_vendor = require("../../common/vendor.js");
const utils_api = require("../../utils/api.js");
if (!Array) {
const _easycom_t_input2 = common_vendor.resolveComponent("t-input");
const _easycom_t_button2 = common_vendor.resolveComponent("t-button");
(_easycom_t_input2 + _easycom_t_button2)();
}
const _easycom_t_input = () => "../../uni_modules/tdesign-uniapp/components/input/input.js";
const _easycom_t_button = () => "../../uni_modules/tdesign-uniapp/components/button/button.js";
if (!Math) {
(_easycom_t_input + _easycom_t_button)();
}
const _sfc_main = /* @__PURE__ */ common_vendor.defineComponent({
__name: "register",
setup(__props) {
const phone = common_vendor.ref("");
const nickname = common_vendor.ref("");
const loading = common_vendor.ref(false);
const register = async () => {
if (!phone.value || String(phone.value).length !== 11) {
common_vendor.index.showToast({
title: "请输入正确的手机号",
icon: "none"
});
return;
}
if (!nickname.value || nickname.value.trim().length === 0) {
common_vendor.index.showToast({
title: "请输入昵称",
icon: "none"
});
return;
}
loading.value = true;
try {
const res = await utils_api.api.auth.register("+86" + phone.value, nickname.value.trim());
common_vendor.index.setStorageSync("token", res.token);
common_vendor.index.setStorageSync("user", res.user);
common_vendor.index.showToast({
title: "注册成功",
icon: "success"
});
common_vendor.index.reLaunch({ url: "/pages/index/index" });
} catch (error) {
common_vendor.index.__f__("error", "at pages/register/register.vue:95", "注册失败", error);
} finally {
loading.value = false;
}
};
const goToLogin = () => {
common_vendor.index.navigateBack();
};
return (_ctx, _cache) => {
return {
a: common_vendor.o(($event) => phone.value = $event),
b: common_vendor.p({
placeholder: "请输入手机号",
type: "number",
maxlength: 11,
clearable: true,
value: phone.value
}),
c: common_vendor.o(($event) => nickname.value = $event),
d: common_vendor.p({
placeholder: "请输入昵称",
maxlength: 20,
clearable: true,
value: nickname.value
}),
e: common_vendor.o(register),
f: common_vendor.p({
theme: "primary",
size: "large",
block: true,
loading: loading.value
}),
g: common_vendor.o(goToLogin)
};
};
}
});
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["__scopeId", "data-v-bac4a35d"]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/register/register.js.map

View File

@@ -0,0 +1,7 @@
{
"navigationBarTitleText": "注册",
"usingComponents": {
"t-input": "../../uni_modules/tdesign-uniapp/components/input/input",
"t-button": "../../uni_modules/tdesign-uniapp/components/button/button"
}
}

View File

@@ -0,0 +1 @@
<view class="register-container data-v-bac4a35d"><view class="register-header data-v-bac4a35d"><text class="title data-v-bac4a35d">注册账号</text><text class="subtitle data-v-bac4a35d">创建您的预约系统账号</text></view><view class="register-form data-v-bac4a35d"><view class="form-item data-v-bac4a35d"><t-input wx:if="{{b}}" class="data-v-bac4a35d" u-s="{{['prefixIcon']}}" u-i="bac4a35d-0" bind:__l="__l" bindupdateValue="{{a}}" u-p="{{b}}"><text class="prefix-icon data-v-bac4a35d" slot="prefixIcon">📱</text></t-input></view><view class="form-item data-v-bac4a35d"><t-input wx:if="{{d}}" class="data-v-bac4a35d" u-s="{{['prefixIcon']}}" u-i="bac4a35d-1" bind:__l="__l" bindupdateValue="{{c}}" u-p="{{d}}"><text class="prefix-icon data-v-bac4a35d" slot="prefixIcon">👤</text></t-input></view><view class="form-actions data-v-bac4a35d"><t-button wx:if="{{f}}" u-s="{{['d']}}" class="btn-primary data-v-bac4a35d" bindclick="{{e}}" u-i="bac4a35d-2" bind:__l="__l" u-p="{{f}}"> 注册 </t-button></view><view class="form-switch data-v-bac4a35d"><text class="data-v-bac4a35d" bindtap="{{g}}">已有账号?去登录</text></view></view></view>

View File

@@ -0,0 +1,55 @@
.register-container.data-v-bac4a35d {
min-height: 100vh;
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%);
padding: 80rpx 40rpx;
}
.register-header.data-v-bac4a35d {
text-align: center;
margin-bottom: 100rpx;
}
.title.data-v-bac4a35d {
display: block;
font-size: 48rpx;
font-weight: bold;
color: #ffffff;
margin-bottom: 20rpx;
}
.subtitle.data-v-bac4a35d {
display: block;
font-size: 28rpx;
color: rgba(255, 255, 255, 0.8);
}
.register-form.data-v-bac4a35d {
background: #ffffff;
border-radius: 32rpx;
padding: 60rpx 40rpx;
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.1);
}
.form-item.data-v-bac4a35d {
margin-bottom: 32rpx;
}
.prefix-icon.data-v-bac4a35d {
font-size: 32rpx;
color: #FF7A00;
}
.form-actions.data-v-bac4a35d {
margin-top: 60rpx;
}
.form-switch.data-v-bac4a35d {
display: flex;
justify-content: center;
margin-top: 32rpx;
font-size: 28rpx;
color: #FF7A00;
}
.form-switch text.data-v-bac4a35d {
padding: 16rpx 0;
}
/* 按钮自定义样式 */
.btn-primary.data-v-bac4a35d .t-button {
background: linear-gradient(135deg, #FF7A00 0%, #FF9500 100%) !important;
border: none !important;
box-shadow: 0 4rpx 12rpx rgba(255, 122, 0, 0.3);
}