diff --git a/Api.text b/Api.text
new file mode 100644
index 0000000..2288a9a
--- /dev/null
+++ b/Api.text
@@ -0,0 +1,278 @@
+# 前端数据需求分析
+
+## 组件数据需求
+
+### 1. Address.vue (地址选择组件)
+- 数据需求:省市区级联选择数据
+- 数据结构:
+ ```
+ address {
+ province: string, // 省份名称
+ city: string, // 城市名称
+ district: string // 区县名称
+ }
+ ```
+
+### 2. Search.vue (搜索组件)
+- 数据需求:搜索关键词、搜索类型、搜索历史
+- 数据结构:
+ ```
+ search {
+ keyword: string, // 搜索关键词
+ type: string, // 搜索类型(如"宝贝"、"店铺")
+ history: string[] // 搜索历史记录
+ }
+ ```
+
+### 3. page.vue (分页组件)
+- 数据需求:总页数
+- 数据结构:
+ ```
+ pagination {
+ totalPages: number // 总页数
+ }
+ ```
+
+## 页面数据需求
+
+### 1. Login.vue (登录页面)
+- 数据需求:用户登录信息
+- 数据结构:
+ ```
+ login {
+ username: string, // 用户名
+ password: string, // 密码
+ rememberMe: boolean // 是否记住密码
+ }
+ ```
+
+### 2. Userinfo.vue (用户信息页面)
+- 数据需求:用户信息、订单状态数量
+- 数据结构:
+ ```
+ user {
+ id: number, // 用户ID
+ username: string, // 用户名
+ avatar: string, // 头像URL
+ level: number, // 用户等级
+ followCount: number, // 关注数
+ fansCount: number, // 粉丝数
+ collectionCount: number, // 收藏数
+ couponCount: number, // 红包数
+ discountCount: number, // 优惠券数
+ taoCoin: number, // 淘币数
+ points: number // 积分
+ }
+ orderCounts {
+ pending_payment: number, // 待付款
+ pending_shipment: number, // 待发货
+ pending_receipt: number, // 待收货
+ pending_review: number, // 待评价
+ completed: number // 已完成
+ }
+ ```
+
+### 3. productdetil.vue (商品详情页面)
+- 数据需求:商品信息、商品图片、商品型号、评论、推荐商品
+- 数据结构:
+ ```
+ product {
+ id: number, // 商品ID
+ title: string, // 商品标题
+ images: string[], // 商品图片URL
+ price: number, // 价格
+ originalPrice: number, // 原价
+ models: [ // 商品型号
+ {
+ id: string,
+ name: string,
+ price: string,
+ originalPrice: string,
+ img: string
+ }
+ ],
+ description: string, // 商品描述
+ features: string[], // 商品特点
+ specs: [ // 商品参数
+ {
+ category: string, // 参数类别
+ value: string // 参数值
+ }
+ ],
+ reviews: [ // 用户评论
+ {
+ id: number,
+ reviewerName: string, // 评论者姓名
+ rating: number, // 评分
+ time: string, // 评论时间
+ content: string, // 评论内容
+ images: string[] // 评论图片
+ }
+ ],
+ recommendations: [ // 推荐商品
+ {
+ id: number,
+ name: string, // 商品名称
+ price: number, // 价格
+ rating: number, // 评分
+ image: string // 商品图片
+ }
+ ]
+ }
+ ```
+
+### 4. SettlementLite.vue (结算页面)
+- 数据需求:地址列表、默认地址、商品信息、价格计算
+- 数据结构:
+ ```
+ address {
+ id: number, // 地址ID
+ name: string, // 收货人姓名
+ phone: string, // 联系电话
+ province: string, // 省份
+ city: string, // 城市
+ district: string, // 区县
+ detail: string, // 详细地址
+ isDefault: boolean // 是否默认地址
+ }[]
+ order {
+ products: [ // 订单商品
+ {
+ id: number, // 商品ID
+ name: string, // 商品名称
+ price: number, // 商品价格
+ quantity: number, // 购买数量
+ image: string // 商品图片
+ }
+ ],
+ totalPrice: number, // 总价格
+ shippingFee: number, // 运费
+ finalPrice: number // 最终价格
+ }
+ ```
+
+### 5. User/UpdataAddress.vue (地址修改页面)
+- 数据需求:地址信息
+- 数据结构:
+ ```
+ address {
+ id: number, // 地址ID
+ name: string, // 收货人姓名
+ phone: string, // 联系电话
+ province: string, // 省份
+ city: string, // 城市
+ district: string, // 区县
+ detail: string, // 详细地址
+ isDefault: boolean // 是否默认地址
+ }
+ ```
+
+### 6. User/User.vue (用户中心页面)
+- 数据需求:用户信息、订单列表、地址列表、收藏列表
+- 数据结构:
+ ```
+ user {
+ id: number, // 用户ID
+ username: string, // 用户名
+ avatar: string // 头像URL
+ }
+ orders {
+ id: number, // 订单ID
+ status: string, // 订单状态
+ totalPrice: number, // 订单总价
+ createTime: string, // 创建时间
+ products: [ // 订单商品
+ {
+ id: number,
+ name: string,
+ price: number,
+ quantity: number,
+ image: string
+ }
+ ]
+ }[]
+ addresses: address[] // 地址列表,结构同SettlementLite.vue
+ collections: [ // 收藏列表
+ {
+ id: number, // 收藏ID
+ productId: number, // 商品ID
+ productName: string, // 商品名称
+ productPrice: number, // 商品价格
+ productImage: string // 商品图片
+ }
+ ]
+ ```
+
+### 7. Cart.vue (购物车页面)
+- 数据需求:购物车商品列表
+- 数据结构:
+ ```
+ cart {
+ items: [ // 购物车商品
+ {
+ id: number, // 商品ID
+ name: string, // 商品名称
+ price: number, // 商品价格
+ quantity: number, // 购买数量
+ image: string, // 商品图片
+ selected: boolean // 是否选中
+ }
+ ],
+ totalPrice: number, // 总价格
+ selectedCount: number // 选中数量
+ }
+ ```
+
+### 8. product/productList.vue (商品列表页面)
+- 数据需求:商品列表、分页信息
+- 数据结构:
+ ```
+ products {
+ items: [ // 商品列表
+ {
+ id: number, // 商品ID
+ name: string, // 商品名称
+ price: number, // 商品价格
+ originalPrice: number, // 原价
+ image: string, // 商品图片
+ rating: number, // 评分
+ sales: number // 销量
+ }
+ ],
+ total: number, // 总商品数
+ page: number, // 当前页码
+ pageSize: number, // 每页数量
+ totalPages: number // 总页数
+ }
+ ```
+
+### 9. Home.vue (首页)
+- 数据需求:轮播图、推荐商品、分类信息
+- 数据结构:
+ ```
+ home {
+ banners: [ // 轮播图
+ {
+ id: number,
+ image: string, // 轮播图图片
+ link: string // 跳转链接
+ }
+ ],
+ recommendedProducts: [ // 推荐商品
+ {
+ id: number,
+ name: string,
+ price: number,
+ image: string,
+ rating: number
+ }
+ ],
+ categories: [ // 商品分类
+ {
+ id: number,
+ name: string, // 分类名称
+ icon: string // 分类图标
+ }
+ ]
+ }
+ ```
\ No newline at end of file
diff --git a/src/App.vue b/src/App.vue
index 543fa48..191f89a 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -8,5 +8,6 @@
import { RouterView } from "vue-router";
import Herde from "@/Views/Herde.vue";
import './Style/App.css'
+
diff --git a/src/Component/business/SettlementLite.vue b/src/Component/business/SettlementLite.vue
new file mode 100644
index 0000000..8b42584
--- /dev/null
+++ b/src/Component/business/SettlementLite.vue
@@ -0,0 +1,927 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ selectedAddress.province }}{{ selectedAddress.city }}{{ selectedAddress.district }}{{
+ selectedAddress.detail }}
+
+
+
+
+
+
+ 地址列表
+
+
+ 添加地址
+
+
+
+
+
+
+
+
+ {{ address.province }}{{ address.city }}{{ address.district }}{{ address.detail
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
商品信息
+
+
+
+
![]()
+
+
+
{{ product.name }}
+
{{ product.description }}
+
+ ¥{{ product.price.toFixed(2) }}
+ x{{ product.quantity }}
+
+
+
+
+
+
+
+
+
价格明细
+
+
+ 商品总价
+ ¥{{ totalPrice.toFixed(2) }}
+
+
+ 运费
+ ¥{{ shippingFee.toFixed(2) }}
+
+
+ 优惠
+ -¥{{ discountAmount.toFixed(2) }}
+
+
+ 实付金额
+ ¥{{ actualPrice.toFixed(2) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Component/common/Address.vue b/src/Component/common/Address.vue
new file mode 100644
index 0000000..347e34d
--- /dev/null
+++ b/src/Component/common/Address.vue
@@ -0,0 +1,379 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ province.label }}
+
+
+
+
+
+
+
+ {{ district.label }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Component/common/Search.vue b/src/Component/common/Search.vue
new file mode 100644
index 0000000..61699eb
--- /dev/null
+++ b/src/Component/common/Search.vue
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+ 暂无搜索历史
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Component/common/page.vue b/src/Component/common/page.vue
new file mode 100644
index 0000000..1c61db7
--- /dev/null
+++ b/src/Component/common/page.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
diff --git a/src/Route/route.ts b/src/Route/route.ts
index 513b5a2..5bc6d46 100644
--- a/src/Route/route.ts
+++ b/src/Route/route.ts
@@ -6,7 +6,6 @@ import Login from '../Views/Login.vue'
import Search from '../Views/Search.vue'
import ProductDetail from '../Views/product/productdetil.vue'
import Cart from '../Views/Cart.vue'
-import Order from '../Views/Order.vue'
import User from '../Views/User/User.vue'
import Chat from '../Views/Chat.vue'
@@ -38,11 +37,6 @@ const routes = [
name: 'cart',
component: Cart
},
- {
- path: '/order',
- name: 'order',
- component: Order
- },
{
path: '/user',
name: 'user',
diff --git a/src/Util/Type.ts b/src/Util/Type.ts
index 0377ffe..6b5fa30 100644
--- a/src/Util/Type.ts
+++ b/src/Util/Type.ts
@@ -25,19 +25,31 @@ export type Cart = {
// 商品类型
export type Product = {
id: string
- name: string
- price: string
- img: string
- model: string
+ name: string; // 商品名称
+ description: string; // 商品描述
+ price: number; // 商品价格
+ quantity: number; // 商品数量
+ image: string; // 商品图片
+ model: string; // 商品型号
}
-
-// 订单详情类型
+// 订单商品类型
+export type OrderProduct = {
+ productId: string | number // 商品 ID
+ quantity: number // 商品数量
+ // 其他待补充字段,如型号、颜色等
+}
+// 订单类型
export type OrderDetail = {
- id: string
- name: string
- price: string
- img: string
- count: number
+ id: string // 订单 ID
+ shopName: string // 店铺名称
+ receiverName: string // 收货人
+ orderId: string // 订单 ID
+ createTime: string // 创建时间
+ status: string // 订单状态
+ statusText: string // 订单状态文本
+ totalAmount: number // 订单总金额
+ paymentMethod: string // 支付方式
+ goods: Product[] // 商品列表
}
// 注册类型
export type Register = {
@@ -49,4 +61,16 @@ export type Register = {
export type Login = {
username: string
password: string
+ rememberMe: boolean
+}
+// 地址类型
+export type Address = {
+ id: number; // 修改时有 ID,新增时无
+ name: string; // 收货人
+ phone: string; // 手机号
+ province: string; // 省
+ city: string; // 市
+ district: string; // 区
+ detail: string; // 详细地址(街道、门牌号等)
+ isDefault: boolean; // 是否默认地址
}
\ No newline at end of file
diff --git a/src/Views/Cart.vue b/src/Views/Cart.vue
index f663363..0a69433 100644
--- a/src/Views/Cart.vue
+++ b/src/Views/Cart.vue
@@ -580,17 +580,17 @@ const removeItem = (id: number) => {
}
.cart-item-model {
- font-size: 16px;
- padding: 18px 32px;
- color: #666;
- border-radius: 18px;
+ font-size: var(--font-size-base);
+ padding: var(--spacing-lg) var(--spacing-xl);
+ color: var(--text-secondary);
+ border-radius: var(--border-radius-lg);
cursor: pointer;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ transition: all var(--transition-transform);
position: relative;
overflow: hidden;
- background: linear-gradient(135deg, #fafafa 0%, #ffffff 100%);
- border: 2px solid #f0f0f0;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
+ background: linear-gradient(135deg, var(--bg-light) 0%, var(--card-bg) 100%);
+ border: 2px solid var(--border-color);
+ box-shadow: var(--shadow-md);
font-weight: 500;
}
@@ -601,8 +601,8 @@ const removeItem = (id: number) => {
left: -100%;
width: 100%;
height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 80, 0, 0.15), transparent);
- transition: left 0.6s ease;
+ background: linear-gradient(90deg, transparent, rgba(var(--primary-light-rgb), 0.15), transparent);
+ transition: left var(--transition-slow);
z-index: 0;
}
@@ -613,18 +613,18 @@ const removeItem = (id: number) => {
left: 0;
right: 0;
bottom: 0;
- background: linear-gradient(135deg, rgba(255, 80, 0, 0.08) 0%, rgba(255, 80, 0, 0.04) 100%);
+ background: linear-gradient(135deg, rgba(var(--primary-light-rgb), 0.08) 0%, rgba(var(--primary-light-rgb), 0.04) 100%);
opacity: 0;
- transition: opacity 0.4s ease;
+ transition: opacity var(--transition-transform);
z-index: -1;
- border-radius: 18px;
+ border-radius: var(--border-radius-lg);
}
.cart-item-model:hover {
- border: 2px dashed #ff5000;
- color: #ff5000;
+ border: 2px dashed var(--primary-color);
+ color: var(--primary-color);
transform: translateY(-5px) scale(1.05);
- box-shadow: 0 10px 24px rgba(255, 80, 0, 0.2);
+ box-shadow: 0 10px 24px rgba(var(--primary-light-rgb), 0.2);
}
.cart-item-model:hover::before {
@@ -659,13 +659,13 @@ const removeItem = (id: number) => {
width: 200px;
display: flex;
flex-direction: column;
- gap: 16px;
- padding: 15px;
- background: linear-gradient(135deg, #fafafa 0%, #ffffff 100%);
- border-radius: 20px;
- border: 2px solid #f0f0f0;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
+ gap: var(--spacing-md);
+ padding: var(--spacing-md);
+ background: linear-gradient(135deg, var(--bg-light) 0%, var(--card-bg) 100%);
+ border-radius: var(--border-radius-xl);
+ border: 2px solid var(--border-color);
+ transition: all var(--transition-transform);
+ box-shadow: var(--shadow-md);
position: relative;
}
@@ -676,16 +676,16 @@ const removeItem = (id: number) => {
left: -2px;
right: -2px;
bottom: -2px;
- border-radius: 20px;
- background: linear-gradient(135deg, #ff5000, #ff8500, #ff5000);
+ border-radius: var(--border-radius-xl);
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-hover), var(--primary-color));
z-index: -1;
opacity: 0;
- transition: opacity 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ transition: opacity var(--transition-transform);
}
.cart-item:hover .cart-item-price {
- border-color: #ff5000;
- box-shadow: 0 10px 30px rgba(255, 80, 0, 0.2);
+ border-color: var(--primary-color);
+ box-shadow: 0 10px 30px rgba(var(--primary-light-rgb), 0.2);
transform: translateY(-4px);
}
@@ -718,25 +718,25 @@ const removeItem = (id: number) => {
}
.price-label {
- font-size: 14px;
- color: #666;
+ font-size: var(--font-size-sm);
+ color: var(--text-secondary);
font-weight: 600;
- background: linear-gradient(135deg, #fff5f5 0%, #fff0f0 100%);
- padding: 8px 20px;
- border-radius: 20px;
+ background: linear-gradient(135deg, var(--bg-primary-light) 0%, var(--bg-primary-lighter) 100%);
+ padding: var(--spacing-xs) var(--spacing-lg);
+ border-radius: var(--border-radius-xl);
align-self: flex-start;
- border: 1px solid #ffece5;
- transition: all 0.3s ease;
- box-shadow: 0 3px 12px rgba(255, 80, 0, 0.1);
+ border: 1px solid var(--border-color);
+ transition: all var(--transition-normal);
+ box-shadow: 0 3px 12px rgba(var(--primary-light-rgb), 0.1);
position: relative;
z-index: 1;
}
.cart-item:hover .price-label {
- background: linear-gradient(135deg, #ff5000 0%, #ff6b00 100%);
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
color: #ffffff;
- border-color: #ff5000;
- box-shadow: 0 6px 20px rgba(255, 80, 0, 0.35);
+ border-color: var(--primary-color);
+ box-shadow: 0 6px 20px rgba(var(--primary-light-rgb), 0.35);
transform: scale(1.08);
animation: label-pulse 0.6s ease;
}
@@ -751,10 +751,10 @@ const removeItem = (id: number) => {
}
.price-symbol {
- font-size: 16px;
- color: #ff5000;
+ font-size: var(--font-size-base);
+ color: var(--primary-color);
font-weight: 600;
- transition: all 0.3s ease;
+ transition: all var(--transition-normal);
}
.cart-item:hover .price-symbol {
@@ -762,42 +762,42 @@ const removeItem = (id: number) => {
}
.price-value {
- font-size: 26px;
- color: #ff5000;
+ font-size: var(--font-size-2xl);
+ color: var(--primary-color);
font-weight: 700;
line-height: 1;
- transition: all 0.3s ease;
+ transition: all var(--transition-normal);
position: relative;
- text-shadow: 0 2px 4px rgba(255, 80, 0, 0.2);
+ text-shadow: 0 2px 4px rgba(var(--primary-light-rgb), 0.2);
}
.cart-item:hover .price-value {
transform: scale(1.05);
- text-shadow: 0 4px 8px rgba(255, 80, 0, 0.35);
+ text-shadow: 0 4px 8px rgba(var(--primary-light-rgb), 0.35);
}
.original-price .price-symbol {
- font-size: 13px;
- color: #999;
+ font-size: var(--font-size-xs);
+ color: var(--text-tertiary);
}
.original-price .price-value {
- font-size: 16px;
- color: #999;
+ font-size: var(--font-size-base);
+ color: var(--text-tertiary);
text-decoration: line-through;
text-shadow: none;
}
.discount-badge {
- background: linear-gradient(135deg, #ff5000 0%, #ff6b00 100%);
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
color: #ffffff;
- font-size: 11px;
+ font-size: var(--font-size-xs);
font-weight: 600;
- padding: 4px 12px;
- border-radius: 12px;
- margin-left: 6px;
- box-shadow: 0 3px 6px rgba(255, 80, 0, 0.25);
- transition: all 0.3s ease;
+ padding: var(--spacing-xs) var(--spacing-sm);
+ border-radius: var(--border-radius-sm);
+ margin-left: var(--spacing-xs);
+ box-shadow: 0 3px 6px rgba(var(--primary-light-rgb), 0.25);
+ transition: all var(--transition-normal);
position: relative;
overflow: hidden;
}
@@ -1006,12 +1006,12 @@ const removeItem = (id: number) => {
.cart-item-quantity {
display: flex;
align-items: center;
- gap: 12px;
- background: linear-gradient(135deg, #fafafa 0%, #ffffff 100%);
- padding: 10px 20px;
- border-radius: 32px;
- border: 2px solid #f0f0f0;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ gap: var(--spacing-sm);
+ background: linear-gradient(135deg, var(--bg-light) 0%, var(--card-bg) 100%);
+ padding: var(--spacing-sm) var(--spacing-lg);
+ border-radius: var(--border-radius-2xl);
+ border: 2px solid var(--border-color);
+ transition: all var(--transition-transform);
position: relative;
overflow: hidden;
}
@@ -1023,13 +1023,13 @@ const removeItem = (id: number) => {
left: -100%;
width: 100%;
height: 100%;
- background: linear-gradient(90deg, transparent, rgba(255, 80, 0, 0.08), transparent);
- transition: left 0.6s ease;
+ background: linear-gradient(90deg, transparent, rgba(var(--primary-light-rgb), 0.08), transparent);
+ transition: left var(--transition-slow);
}
.cart-item:hover .cart-item-quantity {
- border-color: #ff5000;
- box-shadow: 0 6px 16px rgba(255, 80, 0, 0.15);
+ border-color: var(--primary-color);
+ box-shadow: 0 6px 16px rgba(var(--primary-light-rgb), 0.15);
transform: translateY(-2px);
}
@@ -1040,14 +1040,14 @@ const removeItem = (id: number) => {
.quantity-btn {
width: 40px;
height: 40px;
- border: 2px solid #f0f0f0;
- background: linear-gradient(135deg, #ffffff 0%, #f8f8f8 100%);
- border-radius: 50%;
+ border: 2px solid var(--border-color);
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--bg-light) 100%);
+ border-radius: var(--border-radius-full);
cursor: pointer;
font-size: 22px;
font-weight: 700;
- color: #666;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ color: var(--text-secondary);
+ transition: all var(--transition-transform);
display: flex;
align-items: center;
justify-content: center;
@@ -1063,9 +1063,9 @@ const removeItem = (id: number) => {
left: 50%;
width: 0;
height: 0;
- background: linear-gradient(135deg, #ff5000 0%, #ff7300 100%);
- border-radius: 50%;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
+ border-radius: var(--border-radius-full);
+ transition: all var(--transition-transform);
transform: translate(-50%, -50%);
z-index: 0;
}
@@ -1076,10 +1076,10 @@ const removeItem = (id: number) => {
}
.quantity-btn:hover {
- border-color: #ff5000;
+ border-color: var(--primary-color);
color: #ffffff;
transform: scale(1.15);
- box-shadow: 0 6px 16px rgba(255, 80, 0, 0.35);
+ box-shadow: 0 6px 16px rgba(var(--primary-light-rgb), 0.35);
}
.quantity-btn:active {
@@ -1124,22 +1124,22 @@ const removeItem = (id: number) => {
width: 80px;
height: 40px;
text-align: center;
- border: 2px solid #f0f0f0;
- border-radius: 12px;
- font-size: 18px;
- color: #333;
+ border: 2px solid var(--border-color);
+ border-radius: var(--border-radius-md);
+ font-size: var(--font-size-lg);
+ color: var(--text-primary);
font-weight: 600;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
- background: linear-gradient(135deg, #ffffff 0%, #fafafa 100%);
+ transition: all var(--transition-transform);
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--bg-light) 100%);
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.05);
}
.quantity-input:focus {
outline: none;
- border-color: #ff5000;
- box-shadow: 0 0 0 4px rgba(255, 80, 0, 0.2), inset 0 2px 4px rgba(0, 0, 0, 0.08);
+ border-color: var(--primary-color);
+ box-shadow: 0 0 0 4px rgba(var(--primary-light-rgb), 0.2), inset 0 2px 4px rgba(0, 0, 0, 0.08);
transform: scale(1.1);
- background: linear-gradient(135deg, #ffffff 0%, #fff5f5 100%);
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--bg-primary-light) 100%);
}
.quantity-input::-webkit-inner-spin-button,
@@ -1174,28 +1174,28 @@ const removeItem = (id: number) => {
width: 160px;
display: flex;
flex-direction: column;
- gap: 16px;
+ gap: var(--spacing-md);
align-items: center;
- padding: 10px 0;
+ padding: var(--spacing-sm) 0;
}
.cart-action-btn {
display: flex;
align-items: center;
- gap: 10px;
- padding: 12px 30px;
- border-radius: 32px;
- font-size: 15px;
+ gap: var(--spacing-sm);
+ padding: var(--spacing-sm) var(--spacing-xl);
+ border-radius: var(--border-radius-2xl);
+ font-size: var(--font-size-base);
font-weight: 600;
cursor: pointer;
- transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ transition: all var(--transition-transform);
border: 2px solid transparent;
position: relative;
overflow: hidden;
text-decoration: none;
min-width: 120px;
justify-content: center;
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+ box-shadow: var(--shadow-sm);
}
.cart-action-btn::before {
@@ -1205,8 +1205,8 @@ const removeItem = (id: number) => {
left: 50%;
width: 0;
height: 0;
- border-radius: 50%;
- transition: all 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
+ border-radius: var(--border-radius-full);
+ transition: all var(--transition-slow);
transform: translate(-50%, -50%);
z-index: 0;
}
@@ -1218,7 +1218,7 @@ const removeItem = (id: number) => {
.cart-action-btn:hover {
transform: translateY(-3px) scale(1.05);
- box-shadow: 0 8px 24px rgba(255, 80, 0, 0.25);
+ box-shadow: 0 8px 24px rgba(var(--primary-light-rgb), 0.25);
}
.cart-action-btn:active {
@@ -1242,43 +1242,43 @@ const removeItem = (id: number) => {
}
.delete-btn {
- background: linear-gradient(135deg, #ffffff 0%, #fafafa 100%);
- border-color: #ff4d4f;
- color: #ff4d4f;
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--bg-light) 100%);
+ border-color: var(--error-color);
+ color: var(--error-color);
}
.delete-btn::before {
- background: linear-gradient(135deg, #ff4d4f 0%, #ff7875 100%);
+ background: linear-gradient(135deg, var(--error-color) 0%, #ff7875 100%);
}
.delete-btn:hover {
color: #ffffff;
- border-color: #ff4d4f;
+ border-color: var(--error-color);
}
.favorite-btn {
- background: linear-gradient(135deg, #ffffff 0%, #fafafa 100%);
- border-color: #ff5000;
- color: #ff5000;
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--bg-light) 100%);
+ border-color: var(--primary-color);
+ color: var(--primary-color);
}
.favorite-btn::before {
- background: linear-gradient(135deg, #ff5000 0%, #ff7300 100%);
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
}
.favorite-btn:hover {
color: #ffffff;
- border-color: #ff5000;
+ border-color: var(--primary-color);
}
.favorite-btn.favorited {
- background: linear-gradient(135deg, #ff5000 0%, #ff7300 100%);
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
color: #ffffff;
- border-color: #ff5000;
+ border-color: var(--primary-color);
}
.favorite-btn.favorited:hover {
- background: linear-gradient(135deg, #ff7300 0%, #ff5000 100%);
+ background: linear-gradient(135deg, var(--primary-hover) 0%, var(--primary-color) 100%);
}
.favorite-btn.favorited i::before {
@@ -1290,9 +1290,9 @@ const removeItem = (id: number) => {
display: flex;
justify-content: space-between;
align-items: center;
- padding: 25px 40px;
- border-top: 2px solid #f0f0f0;
- background: linear-gradient(135deg, #ffffff 0%, #fafafa 100%);
+ padding: var(--spacing-lg) var(--spacing-xxl);
+ border-top: 2px solid var(--border-color);
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--bg-light) 100%);
position: sticky;
bottom: 0;
z-index: 100;
@@ -1301,77 +1301,77 @@ const removeItem = (id: number) => {
.footer-left {
display: flex;
align-items: center;
- gap: 30px;
+ gap: var(--spacing-xl);
}
.select-all {
display: flex;
align-items: center;
- gap: 8px;
+ gap: var(--spacing-xs);
cursor: pointer;
- font-size: 14px;
- color: #666;
- transition: all 0.3s ease;
+ font-size: var(--font-size-sm);
+ color: var(--text-secondary);
+ transition: all var(--transition-normal);
}
.select-all:hover {
- color: #ff5000;
+ color: var(--primary-color);
}
.selected-count {
- font-size: 14px;
- color: #666;
+ font-size: var(--font-size-sm);
+ color: var(--text-secondary);
}
.count {
- font-size: 18px;
+ font-size: var(--font-size-lg);
font-weight: 700;
- color: #ff5000;
+ color: var(--primary-color);
}
.footer-right {
display: flex;
align-items: center;
- gap: 30px;
+ gap: var(--spacing-xl);
}
.total-price {
display: flex;
align-items: baseline;
- gap: 5px;
+ gap: var(--spacing-xs);
}
.total-label {
- font-size: 16px;
- color: #666;
+ font-size: var(--font-size-base);
+ color: var(--text-secondary);
font-weight: 500;
}
.total-symbol {
- font-size: 20px;
- color: #ff5000;
+ font-size: var(--font-size-lg);
+ color: var(--primary-color);
font-weight: 600;
}
.total-value {
- font-size: 32px;
- color: #ff5000;
+ font-size: var(--font-size-3xl);
+ color: var(--primary-color);
font-weight: 700;
}
.checkout-btn {
- padding: 12px 40px;
- font-size: 16px;
+ padding: var(--spacing-sm) var(--spacing-xxl);
+ font-size: var(--font-size-base);
font-weight: 600;
- border-radius: 24px;
- background: linear-gradient(135deg, #ff5000 0%, #ff6b00 100%);
+ border-radius: var(--border-radius-xl);
+ background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-hover) 100%);
border: none;
- box-shadow: 0 4px 12px rgba(255, 80, 0, 0.3);
- transition: all 0.3s ease;
+ box-shadow: 0 4px 12px rgba(var(--primary-light-rgb), 0.3);
+ transition: all var(--transition-normal);
}
.checkout-btn:hover {
transform: translateY(-2px);
- box-shadow: 0 6px 20px rgba(255, 80, 0, 0.4);
+ box-shadow: 0 6px 20px rgba(var(--primary-light-rgb), 0.4);
}
\ No newline at end of file
diff --git a/src/Views/Chat.vue b/src/Views/Chat.vue
index 614d09c..90536d4 100644
--- a/src/Views/Chat.vue
+++ b/src/Views/Chat.vue
@@ -467,52 +467,52 @@ const sendMessage = () => {
display: flex;
align-items: center;
width: 100%;
- padding: 10px;
- border-bottom: 1px solid #e0e0e0;
+ padding: var(--spacing-sm);
+ border-bottom: 1px solid var(--border-color);
}
.chat-user-info h3 {
margin: 0 0 2px;
- font-size: 16px;
+ font-size: var(--font-size-base);
font-weight: 600;
- color: #333333;
+ color: var(--text-primary);
}
.user-status {
- font-size: 12px;
- color: #4caf50;
+ font-size: var(--font-size-xs);
+ color: var(--success-color);
margin: 0;
}
.chat-actions {
display: flex;
- gap: 10px;
+ gap: var(--spacing-sm);
}
.action-btn {
width: 36px;
height: 36px;
- border-radius: 50%;
- background-color: #f0f0f0;
+ border-radius: var(--border-radius-full);
+ background-color: var(--bg-light);
border: none;
cursor: pointer;
- font-size: 16px;
+ font-size: var(--font-size-base);
display: flex;
align-items: center;
justify-content: center;
- transition: all 0.3s ease;
+ transition: all var(--transition-normal);
}
.action-btn:hover {
- background-color: #e0e0e0;
+ background-color: var(--border-color);
}
/* 聊天历史 */
.chat-history {
flex: 1;
- padding: 20px;
+ padding: var(--spacing-xl);
overflow-y: auto;
- background-color: #f5f5f5;
+ background-color: var(--bg-color);
background-image: url('?prompt=chat%20background%20pattern%20subtle%20light&image_size=landscape_16_9');
background-size: cover;
background-position: center;
@@ -520,7 +520,7 @@ const sendMessage = () => {
.chat-message {
display: flex;
- margin-bottom: 15px;
+ margin-bottom: var(--spacing-md);
align-items: flex-end;
}
@@ -530,7 +530,7 @@ const sendMessage = () => {
.chat-message.sent .user-avatar {
margin-right: 0;
- margin-left: 10px;
+ margin-left: var(--spacing-sm);
}
.message-content {
@@ -544,55 +544,55 @@ const sendMessage = () => {
}
.message-text {
- padding: 10px 15px;
- border-radius: 18px;
+ padding: var(--spacing-sm) var(--spacing-md);
+ border-radius: var(--message-radius);
margin-bottom: 4px;
line-height: 1.4;
}
.chat-message.received .message-text {
- background-color: #ffffff;
+ background-color: var(--card-bg);
border-bottom-left-radius: 4px;
}
.chat-message.sent .message-text {
- background-color: #ff5000;
+ background-color: var(--primary-color);
color: #ffffff;
border-bottom-right-radius: 4px;
}
.message-time {
- font-size: 11px;
- color: #999999;
+ font-size: var(--font-size-xs);
+ color: var(--text-tertiary);
}
/* 消息输入区 */
.chat-input-area {
- background-color: #f5f5f5;
- padding: 15px 20px;
- border-top: 1px solid #e0e0e0;
- border-radius: 0 0 10px 0;
+ background-color: var(--bg-color);
+ padding: var(--spacing-md) var(--spacing-xl);
+ border-top: 1px solid var(--border-color);
+ border-radius: 0 0 var(--border-radius-lg) 0;
display: flex;
align-items: center;
- gap: 10px;
+ gap: var(--spacing-sm);
}
.input-container {
flex: 1;
display: flex;
align-items: center;
- background-color: #f0f0f0;
- border-radius: 24px;
- padding: 8px 15px;
- gap: 10px;
+ background-color: var(--bg-light);
+ border-radius: var(--border-radius-xl);
+ padding: var(--spacing-xs) var(--spacing-md);
+ gap: var(--spacing-sm);
}
.input-btn {
background: none;
border: none;
- font-size: 16px;
+ font-size: var(--font-size-base);
cursor: pointer;
- padding: 4px;
+ padding: var(--spacing-xs);
}
.message-input {
@@ -600,29 +600,29 @@ const sendMessage = () => {
border: none;
background: none;
outline: none;
- font-size: 14px;
- color: #333333;
+ font-size: var(--font-size-sm);
+ color: var(--text-primary);
min-width: 0;
}
.message-input::placeholder {
- color: #999999;
+ color: var(--text-tertiary);
}
.send-btn {
- padding: 8px 20px;
- background-color: #ff5000;
+ padding: var(--spacing-xs) var(--spacing-xl);
+ background-color: var(--primary-color);
color: #ffffff;
border: none;
- border-radius: 20px;
+ border-radius: var(--border-radius-xl);
cursor: pointer;
- font-size: 14px;
+ font-size: var(--font-size-sm);
font-weight: 600;
- transition: all 0.3s ease;
+ transition: all var(--transition-normal);
}
.send-btn:hover {
- background-color: #ff6a00;
+ background-color: var(--primary-hover);
}
/* 空状态 */
@@ -632,29 +632,29 @@ const sendMessage = () => {
flex-direction: column;
align-items: center;
justify-content: center;
- background-color: #f5f5f5;
- padding: 40px;
+ background-color: var(--bg-color);
+ padding: var(--spacing-xxl);
text-align: center;
}
.empty-state img {
width: 120px;
height: 120px;
- margin-bottom: 20px;
+ margin-bottom: var(--spacing-xl);
opacity: 0.6;
}
.empty-state h3 {
- margin: 0 0 10px;
- font-size: 18px;
+ margin: 0 0 var(--spacing-md);
+ font-size: var(--font-size-lg);
font-weight: 600;
- color: #333333;
+ color: var(--text-primary);
}
.empty-state p {
margin: 0;
- font-size: 14px;
- color: #999999;
+ font-size: var(--font-size-sm);
+ color: var(--text-tertiary);
}
/* 响应式设计 */
diff --git a/src/Views/Login.vue b/src/Views/Login.vue
index 206a114..540af85 100644
--- a/src/Views/Login.vue
+++ b/src/Views/Login.vue
@@ -24,12 +24,20 @@
{{ errorMessage }}
+
+
+
+
+
-
+
-
+
@@ -115,83 +125,275 @@
-
+
+
+
+
+
+
+
+
+
+
待付款
+
{{ orderCounts.pending_payment }}
+
+
+
+
+
+
待发货
+
{{ orderCounts.pending_shipment }}
+
+
+
+
+
+
待收货
+
{{ orderCounts.pending_receipt }}
+
+
+
+
+
+
待评价
+
{{ orderCounts.pending_review }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
红包
+
{{ user.couponCount }}
+
+
+
+
+
+
优惠券
+
{{ user.discountCount }}
+
+
+
+
+
+
淘币
+
{{ user.taoCoin }}
+
+
+
+
+
+
积分
+
{{ user.points }}
+
+
+
+
+
+
+
-
+
-
+
- 北京市朝阳区建国路88号SOHO现代城A座2801室
+ {{ addressItem.province }}{{ addressItem.city }}{{ addressItem.district }}{{ addressItem.detail }}
-
-
+
+
-
-
-
- 上海市浦东新区陆家嘴环路1000号汇丰银行大厦35楼
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-

+
+
![]()
+
-
商品名称
-
商品描述
-
¥99.99
+
{{ order.goods.name }}
+
{{ order.goods.description }}
+
+
x{{ order.goods.quantity }}
+
{{ order.receiverName }}
+
+
+ ¥{{ order.totalAmount.toFixed(2) }}
+
+
{{ order.paymentMethod === 'online' ? '线上支付' : '到付' }}
+
+
{{ order.statusText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
+
-

+
商品名称
商品描述
@@ -212,7 +416,9 @@
-

+
商品名称
商品描述
@@ -222,7 +428,40 @@
-
+
+
+
+
+
+
+
![]()
+
+
+
{{ shop.name }}
+
{{ shop.description }}
+
+ {{ shop.fansCount }}粉丝
+ {{ shop.goodsCount }}商品
+
+
+
+
+
+
+
+
+
+
-
+