sunshibo преди 1 месец
родител
ревизия
453c4ff1b0
променени са 6 файла, в които са добавени 933 реда и са изтрити 78 реда
  1. 22 20
      components/barNavigasiHandap.vue
  2. 40 53
      pages.json
  3. 579 5
      pages/index.vue
  4. 292 0
      pages/login_new.vue
  5. BIN
      static/login/login-bg.png
  6. BIN
      static/login/login-illustration.png

+ 22 - 20
components/barNavigasiHandap.vue

@@ -2,31 +2,18 @@
 	<!-- 底部导航栏 -->
 	<view class="bottom-tabbar">
 		<view class="tabbar-container">
-			
 			<view 
+			    v-for="(item,index) in list" :key="index"
 				class="tab-item" 
-				:class="{ 'active': currentTab === 'index' }"
-				@click="switchTab('index')"
+				:class="{ 'active':currentTab === item.pathText }"
+				@click="switchTab(item.pathText)"
 			>
 				<image 
 					class="tab-icon" 
-					:src="currentTab === 'index' ? '/static/images/tabbar/home_.png' : '/static/images/tabbar/home.png'"
+					:src="item.pathText === currentTab ?item.oneIcon : item.twoIcon"
 					mode="aspectFit"
 				></image>
-				<text class="tab-text" :class="{ 'active-text': currentTab === 'index' }">首页</text>
-			</view>
-			
-			<view 
-				class="tab-item" 
-				:class="{ 'active': currentTab === 'mine' }"
-				@click="switchTab('mine')"
-			>
-				<image 
-					class="tab-icon" 
-					:src="currentTab === 'mine' ? '/static/images/tabbar/mine_.png' : '/static/images/tabbar/mine.png'"
-					mode="aspectFit"
-				></image>
-				<text class="tab-text" :class="{ 'active-text': currentTab === 'mine' }">我的</text>
+				<text class="tab-text" :class="{ 'active-text': currentTab === item.pathText }">{{item.name}}</text>
 			</view>
 		</view>
 	</view>
@@ -37,7 +24,23 @@ export default {
 	name: 'BarNavigasiHandap',
 	data() {
 		return {
-			currentTab: 'index' // 当前选中的tab
+			currentTab: 'index' ,// 当前选中的tab
+			list:[
+				{
+					name:'首页',
+					pathText:'index',
+					oneIcon:'/static/images/tabbar/home_.png',
+					twoIcon:'/static/images/tabbar/home.png',
+					
+				},
+				{
+					name:'我的',
+					pathText:'mine',
+					oneIcon:'/static/images/tabbar/mine_.png',
+					twoIcon:'/static/images/tabbar/mine.png',
+					
+				}
+			]
 		}
 	},
 	mounted() {
@@ -170,7 +173,6 @@ export default {
 .tab-text {
 	font-size: 26rpx;
 	color: #999999;
-	transition: color 0.3s ease;
 	line-height: 1;
 }
 

+ 40 - 53
pages.json

@@ -2,113 +2,100 @@
   "pages": [{
     "path": "pages/login",
     "style": {
-      "navigationBarTitleText": "登录"
+      "navigationBarTitleText": "",
+      "navigationStyle": "custom",
+      "navigationBarBackgroundColor": "transparent"
     }
   }, {
     "path": "pages/register",
     "style": {
-      "navigationBarTitleText": "注册"
+      "navigationBarTitleText": "注册",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/index",
     "style": {
-      "navigationBarTitleText": "若依移动端框架",
+      "navigationBarTitleText": "首页",
       "navigationStyle": "custom"
     }
-  }, 
-  {
-	  "path": "pages/index",
-	  "style": {
-		"navigationBarTitleText": "首页"
-	  }  
-  },
-  {
-	"path": "pages/mine/index",
-	"style": {
-	  "navigationBarTitleText": "我的",
-	  "navigationStyle": "custom",
-	  "navigationBarBackgroundColor": "transparent"
-	}  
-  },
-  {
+  }, {
+    "path": "pages/mine/index",
+    "style": {
+      "navigationBarTitleText": "我的",
+      "navigationStyle": "custom"
+    }
+  }, {
     "path": "pages/work/index",
     "style": {
-      "navigationBarTitleText": "工作台"
+      "navigationBarTitleText": "工作台",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/avatar/index",
     "style": {
-      "navigationBarTitleText": "修改头像"
+      "navigationBarTitleText": "修改头像",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/info/index",
     "style": {
+<<<<<<< .mine
       "navigationBarTitleText": "账号信息",
       "navigationStyle": "custom",
       "navigationBarBackgroundColor": "transparent"
+=======
+      "navigationBarTitleText": "个人信息",
+      "navigationStyle": "custom"
+
+>>>>>>> .theirs
     }
   }, {
     "path": "pages/mine/info/edit",
     "style": {
-      "navigationBarTitleText": "编辑资料"
+      "navigationBarTitleText": "编辑资料",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/pwd/index",
     "style": {
-      "navigationBarTitleText": "修改密码"
+      "navigationBarTitleText": "修改密码",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/setting/index",
     "style": {
-      "navigationBarTitleText": "应用设置"
+      "navigationBarTitleText": "应用设置",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/help/index",
     "style": {
-      "navigationBarTitleText": "常见问题"
+      "navigationBarTitleText": "常见问题",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/about/index",
     "style": {
-      "navigationBarTitleText": "关于我们"
+      "navigationBarTitleText": "关于我们",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/common/webview/index",
     "style": {
-      "navigationBarTitleText": "浏览网页"
+      "navigationBarTitleText": "浏览网页",
+      "navigationStyle": "custom"
     }
   }, {
     "path": "pages/common/textview/index",
     "style": {
-      "navigationBarTitleText": "浏览文本"
+      "navigationBarTitleText": "浏览文本",
+      "navigationStyle": "custom"
     }
   }],
-  // "tabBar": {
-  //   "color": "#000000",
-  //   "selectedColor": "#000000",
-  //   "borderStyle": "white",
-  //   "backgroundColor": "#ffffff",
-  //   "list": [{
-  //       "pagePath": "pages/index",
-  //       "iconPath": "static/images/tabbar/home.png",
-  //       "selectedIconPath": "static/images/tabbar/home_.png",
-  //       "text": "首页"
-  //     }, {
-  //       "pagePath": "pages/work/index",
-  //       "iconPath": "static/images/tabbar/work.png",
-  //       "selectedIconPath": "static/images/tabbar/work_.png",
-  //       "text": "工作台"
-  //     }, {
-  //       "pagePath": "pages/mine/index",
-  //       "iconPath": "static/images/tabbar/mine.png",
-  //       "selectedIconPath": "static/images/tabbar/mine_.png",
-  //       "text": "我的"
-  //     }
-  //   ]
-  // },
   "globalStyle": {
     "navigationBarTextStyle": "black",
-    "navigationBarTitleText": "RuoYi",
-    "navigationBarBackgroundColor": "#FFFFFF"
+    "navigationBarTitleText": "",
+    "navigationBarBackgroundColor": "#ffffff",
+    "navigationStyle": "custom"
   }
 }

+ 579 - 5
pages/index.vue

@@ -1,21 +1,595 @@
 <template>
   <view class="page">
-     <!-- 底部导航栏 - 放在 content 外面,确保固定在底部 -->
-	 <bar-navigasi-handap></bar-navigasi-handap>
-  </view>
+    <!-- 搜索和筛选区域 -->
+    <view class="search-section">
+      <view class="search-box">
+        <uni-icons type="search" size="18" color="#999999"></uni-icons>
+        <input 
+          class="search-input" 
+          placeholder="搜客户姓名" 
+          placeholder-style="color: #999999"
+          v-model="searchKeyword"
+          @input="handleSearch"
+        />
+        <text class="search-box-text">搜索</text>
+      </view>
+      <view class="filter-btn" @click="handleFilter">
+        <uni-icons type="settings" size="18" color="#323232"></uni-icons>
+        <text class="filter-text">筛选</text>
+      </view>
+    </view>
+
+    <!-- 订单标签页 -->
+    <view class="order-tabs">
+      <view 
+        v-for="tab in tabList" 
+        :key="tab.key"
+        class="tab-item" 
+        :class="{ 'active': activeTab === tab.key }"
+        @click="switchTab(tab.key)"
+      >
+        <text class="tab-text">{{ tab.label }}({{ tab.count }})</text>
+      </view>
+    </view>
+
+    <!-- 订单列表 -->
+    <scroll-view class="order-list" scroll-y>
+      <view 
+        v-for="(order, index) in filteredOrders" 
+        :key="order.id || index"
+        class="order-card"
+      >
+        <view class="order-header">
+          <view class="user-info">
+            <image 
+              class="avatar" 
+              :src="order.avatar || '/static/images/profile.jpg'" 
+              mode="aspectFill"
+            ></image>
+            <view class="user-details">
+              <text class="user-name">{{ order.customerName }}</text>
+              <text class="valid-date">有效期至: {{ order.validDate }}</text>
+            </view>
+          </view>
+          <view 
+            class="status-tag" 
+            :class="`status-tag--${order.status}`"
+          >
+            {{ getStatusText(order.status) }}
+          </view>
+        </view>
+        
+        <view class="order-content">
+          <view 
+            v-for="(item, idx) in orderInfoFields" 
+            :key="idx"
+            class="order-row"
+          >
+            <text class="order-label">{{ item.label }}</text>
+            <text class="order-value">{{ order[item.key] || '-' }}</text>
+          </view>
+        </view>
 
- 
+        <view class="order-footer">
+          <text class="revenue">
+			  <text class="revenue-syText">收益:</text>
+			  <text>¥{{ order.revenue }}</text>
+		  </text>
+          <view class="action-buttons">
+            <view 
+              v-for="(action, idx) in getOrderActions(order.status)" 
+              :key="idx"
+              class="action-btn" 
+              :class="`action-btn--${action.type}`"
+              @click="handleAction(action.type, order)"
+            >
+              <uni-icons :type="action.icon" size="16" :color="action.color"></uni-icons>
+              <text class="btn-text">{{ action.text }}</text>
+            </view>
+          </view>
+        </view>
+      </view>
+      
+      <!-- 空状态 -->
+      <view v-if="filteredOrders.length === 0" class="empty-state">
+        <text class="empty-text">暂无订单数据</text>
+      </view>
+    </scroll-view>
+
+    <!-- 底部导航栏 -->
+    <bar-navigasi-handap></bar-navigasi-handap>
+  </view>
 </template>
 
 <script>
 import BarNavigasiHandap from "@/components/barNavigasiHandap.vue"
 
 export default {
+  name: 'Index',
   components: {
     BarNavigasiHandap
+  },
+  data() {
+    return {
+      activeTab: 'all', // 当前选中的标签页
+      searchKeyword: '', // 搜索关键词
+      // 标签页配置
+      tabList: [
+        { key: 'all', label: '全部订单', count: 2 },
+        { key: 'progress', label: '进行中', count: 0 },
+        { key: 'completed', label: '已完成', count: 0 }
+      ],
+      // 订单信息字段配置
+      orderInfoFields: [
+        { key: 'orderNo', label: '订单编号' },
+        { key: 'phone', label: '联系电话' },
+        { key: 'serviceFee', label: '服务费用' },
+        { key: 'orderTime', label: '下单时间' },
+        { key: 'payTime', label: '支付时间' },
+        { key: 'commissionRate', label: '佣金比例' }
+      ],
+      // 订单列表数据
+      orders: [
+        {
+          id: 1,
+          customerName: '张明明',
+          avatar: '/static/images/profile.jpg',
+          validDate: '2025-11-07',
+          status: 'progress',
+          orderNo: 'LAW2023071500123',
+          phone: '13877092066',
+          serviceFee: '¥200/次',
+          orderTime: '2025-11-11 11:11:11',
+          payTime: '2025-11-11 11:11:11',
+          commissionRate: '3%',
+          revenue: 280
+        },
+        {
+          id: 2,
+          customerName: '张明明',
+          avatar: '/static/images/profile.jpg',
+          validDate: '2025-11-07',
+          status: 'completed',
+          orderNo: 'LAW2023071500123',
+          phone: '13877092066',
+          serviceFee: '¥200/次',
+          orderTime: '2025-11-11 11:11:11',
+          payTime: '2025-11-11 11:11:11',
+          commissionRate: '3%',
+          revenue: 280
+        },
+		{
+		  id: 3,
+		  customerName: '张明明',
+		  avatar: '/static/images/profile.jpg',
+		  validDate: '2025-11-07',
+		  status: 'completed',
+		  orderNo: 'LAW2023071500123',
+		  phone: '13877092066',
+		  serviceFee: '¥200/次',
+		  orderTime: '2025-11-11 11:11:11',
+		  payTime: '2025-11-11 11:11:11',
+		  commissionRate: '3%',
+		  revenue: 280
+		}
+      ]
+    }
+  },
+  computed: {
+    /**
+     * 过滤后的订单列表
+     */
+    filteredOrders() {
+      let result = this.orders
+      
+      // 根据标签页筛选
+      if (this.activeTab !== 'all') {
+        result = result.filter(order => order.status === this.activeTab)
+      }
+      
+      // 根据搜索关键词筛选
+      if (this.searchKeyword.trim()) {
+        const keyword = this.searchKeyword.trim().toLowerCase()
+        result = result.filter(order => 
+          order.customerName.toLowerCase().includes(keyword) ||
+          order.orderNo.toLowerCase().includes(keyword) ||
+          order.phone.includes(keyword)
+        )
+      }
+      
+      return result
+    }
+  },
+  methods: {
+    /**
+     * 切换标签页
+     */
+    switchTab(tab) {
+      if (this.activeTab === tab) return
+      this.activeTab = tab
+      this.updateTabCount()
+    },
+    
+    /**
+     * 更新标签页数量
+     */
+    updateTabCount() {
+      this.tabList.forEach(tab => {
+        if (tab.key === 'all') {
+          tab.count = this.orders.length
+        } else {
+          tab.count = this.orders.filter(order => order.status === tab.key).length
+        }
+      })
+    },
+    
+    /**
+     * 处理搜索
+     */
+    handleSearch() {
+      // 搜索逻辑已在 computed 中处理
+    },
+    
+    /**
+     * 处理筛选
+     */
+    handleFilter() {
+      uni.showToast({
+        title: '筛选功能开发中',
+        icon: 'none'
+      })
+    },
+    
+    /**
+     * 获取状态文本
+     */
+    getStatusText(status) {
+      const statusMap = {
+        progress: '进行中',
+        completed: '已完成'
+      }
+      return statusMap[status] || '未知'
+    },
+    
+    /**
+     * 获取订单操作按钮
+     */
+    getOrderActions(status) {
+      if (status === 'progress') {
+        return [
+          { type: 'message', icon: 'chat', color: '#1976D2', text: '发消息' },
+          { type: 'call', icon: 'phone', color: '#4CAF50', text: '联系客户' }
+        ]
+      } else if (status === 'completed') {
+        return [
+          { type: 'delete', icon: 'trash', color: '#F44336', text: '删除' },
+          { type: 'message', icon: 'chat', color: '#1976D2', text: '查看消息' }
+        ]
+      }
+      return []
+    },
+    
+    /**
+     * 处理操作按钮点击
+     */
+    handleAction(actionType, order) {
+      switch (actionType) {
+        case 'message':
+          this.handleMessage(order)
+          break
+        case 'call':
+          this.handleCall(order)
+          break
+        case 'delete':
+          this.handleDelete(order)
+          break
+        default:
+          console.warn('未知操作类型:', actionType)
+      }
+    },
+    
+    /**
+     * 处理发消息
+     */
+    handleMessage(order) {
+      uni.showToast({
+        title: '跳转到消息页面',
+        icon: 'none'
+      })
+      // TODO: 实现跳转到消息页面
+    },
+    
+    /**
+     * 处理打电话
+     */
+    handleCall(order) {
+      uni.makePhoneCall({
+        phoneNumber: order.phone,
+        fail: (err) => {
+          console.error('拨打电话失败:', err)
+          uni.showToast({
+            title: '拨打电话失败',
+            icon: 'none'
+          })
+        }
+      })
+    },
+    
+    /**
+     * 处理删除
+     */
+    handleDelete(order) {
+      uni.showModal({
+        title: '提示',
+        content: '确定要删除该订单吗?',
+        success: (res) => {
+          if (res.confirm) {
+            const index = this.orders.findIndex(item => item.id === order.id)
+            if (index > -1) {
+              this.orders.splice(index, 1)
+              this.updateTabCount()
+              uni.showToast({
+                title: '删除成功',
+                icon: 'success'
+              })
+            }
+          }
+        }
+      })
+    }
+  },
+  onLoad() {
+    // 页面加载时更新标签页数量
+    this.updateTabCount()
   }
 }
 </script>
+
 <style scoped>
-  
+.page {
+  padding-top: calc(var(--status-bar-height) + 20rpx);
+  padding-bottom: calc(16rpx + env(safe-area-inset-bottom));
+  background: linear-gradient(180deg, rgba(40, 86, 199, 0.3) 0%, rgba(255, 255, 255, 0) 100%);
+  min-height: 100vh;
+  box-sizing: border-box;
+}
+
+/* 搜索区域 */
+.search-section {
+  display: flex;
+  align-items: center;
+  padding: 0 30rpx 24rpx;
+  gap: 20rpx;
+}
+
+.search-box {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  background-color: #F5F5F5;
+  border-radius: 38rpx;
+  padding: 20rpx 24rpx;
+  gap: 12rpx;
+}
+
+.search-input {
+  flex: 1;
+  font-size: 28rpx;
+  color: #323232;
+}
+
+.search-box-text {
+  font-weight: 400;
+  font-size: 27rpx;
+  color: #151515;
+}
+
+.filter-btn {
+  display: flex;
+  align-items: center;
+  gap: 8rpx;
+  padding: 20rpx 24rpx;
+}
+
+.filter-text {
+  font-size: 28rpx;
+  color: #323232;
+}
+
+/* 订单标签页 */
+.order-tabs {
+  display: flex;
+  justify-content: space-around;
+  width: 100%;
+}
+
+.tab-item {
+  padding: 24rpx 0;
+  position: relative;
+  cursor: pointer;
+}
+
+.tab-item.active {
+  font-weight: 600;
+}
+
+.tab-text {
+  font-size: 28rpx;
+  color: #8D8D8D;
+  transition: color 0.3s;
+}
+
+.tab-item.active .tab-text {
+  color: #323232;
+}
+
+/* 订单列表 */
+.order-list {
+  /* flex: 1; */
+  height:77vh;
+  padding: 24rpx 30rpx;
+  box-sizing: border-box;
+}
+
+/* 订单卡片 */
+.order-card {
+  background-color: #FFFFFF;
+  border-radius: 16rpx;
+  padding: 32rpx;
+  margin-bottom: 24rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04);
+}
+
+.order-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  margin-bottom: 32rpx;
+  padding-bottom: 24rpx;
+  border-bottom: 1px solid #EEEEEE;
+}
+
+.user-info {
+  display: flex;
+  align-items: center;
+  gap: 24rpx;
+  flex: 1;
+}
+
+.avatar {
+  width: 96rpx;
+  height: 96rpx;
+  border-radius: 50%;
+  background-color: #F5F5F5;
+  flex-shrink: 0;
+}
+
+.user-details {
+  display: flex;
+  flex-direction: column;
+  gap: 12rpx;
+}
+
+.user-name {
+  font-size: 32rpx;
+  font-weight: 500;
+  color: #323232;
+}
+
+.valid-date {
+  font-size: 24rpx;
+  color: #999999;
+}
+
+.status-tag {
+  padding: 8rpx 20rpx;
+  border-radius: 20rpx;
+  font-size: 24rpx;
+  white-space: nowrap;
+}
+
+.status-tag--progress {
+  background-color: #E8F5E9;
+  color: #4CAF50;
+}
+
+.status-tag--completed {
+  background-color: #FFF3E0;
+  color: #FF9800;
+}
+
+/* 订单内容 */
+.order-content {
+  margin-bottom: 32rpx;
+}
+
+.order-row {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 20rpx;
+}
+
+.order-row:last-child {
+  margin-bottom: 0;
+}
+
+.order-label {
+  font-weight: 500;
+  font-size: 27rpx;
+  color: #666666;
+}
+
+.order-value {
+  font-weight: 500;
+  font-size: 27rpx;
+  color: #323232;
+}
+
+/* 订单底部 */
+.order-footer {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding-top: 24rpx;
+  border-top: 1px solid #EEEEEE;
+}
+
+.revenue {
+  font-size: 34rpx;
+  color: #FF9800;
+  font-weight: 600;
+}
+.revenue-syText{
+	font-weight: 500;
+	font-size: 27rpx;
+	color: #666666;
+}
+
+.action-buttons {
+  display: flex;
+  gap: 16rpx;
+}
+
+.action-btn {
+  display: flex;
+  align-items: center;
+  gap: 8rpx;
+  padding: 12rpx 24rpx;
+  border-radius: 8rpx;
+  font-size: 24rpx;
+  cursor: pointer;
+}
+
+.action-btn--message {
+  background-color: #E3F2FD;
+  color: #1976D2;
+}
+
+.action-btn--call {
+  background-color: #E8F5E9;
+  color: #4CAF50;
+}
+
+.action-btn--delete {
+  background-color: #FFEBEE;
+  color: #F44336;
+}
+
+.btn-text {
+  font-size: 24rpx;
+  margin-left: 4rpx;
+}
+
+/* 空状态 */
+.empty-state {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding: 100rpx 0;
+}
+
+.empty-text {
+  font-size: 28rpx;
+  color: #999999;
+}
 </style>

+ 292 - 0
pages/login_new.vue

@@ -0,0 +1,292 @@
+<template>
+  <view class="login-page">
+    <view class="login-hero"></view>
+
+    <view class="login-content">
+      <view class="status-bar"></view>
+
+      <view class="header">
+        <text class="header-title">登录律师账号</text>
+        <text class="header-subtitle">请使用手机号接收验证码进行登录</text>
+      </view>
+
+      <view class="form-card">
+        <view class="field">
+          <text class="field-label">手机号码</text>
+          <input class="field-input" type="number" :value="phoneDisplay" placeholder="请输入手机号" maxlength="13"
+            @input="handlePhoneInput" />
+        </view>
+
+        <button @click="handleLogin" class="primary-btn">获取验证码</button>
+
+        <view class="agreement-row" @click="toggleAgreement">
+          <view :class="['agreement-checkbox', { checked: agreementChecked }]">
+            <view class="checkbox-inner"></view>
+          </view>
+          <text class="agreement-text">
+            我已阅读并同意
+            <text class="link" @click.stop="handleUserAgrement">《用户协议》</text>
+            和
+            <text class="link" @click.stop="handlePrivacy">《隐私政策》</text>
+          </text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+import { getToken } from '@/utils/auth'
+
+export default {
+  data() {
+    return {
+      codeUrl: "",
+      captchaEnabled: true,
+      register: false,
+      agreementChecked: true,
+      phoneDisplay: "",
+      globalConfig: getApp().globalData.config,
+      loginForm: {
+        username: "",
+        password: "admin123",
+        code: "",
+        uuid: ""
+      }
+    }
+  },
+
+  onLoad() {
+    //#ifdef H5
+    if (getToken()) {
+      this.$tab.reLaunch('/pages/index')
+    }
+    //#endif
+  },
+  methods: {
+    handlePhoneInput(e) {
+      const raw = (e.detail.value || '').replace(/\D/g, '').slice(0, 11)
+      this.loginForm.username = raw
+      if (raw.length > 7) {
+        this.phoneDisplay = raw.replace(/(\d{3})(\d{4})(\d{0,4})/, '$1 $2 $3').trim()
+      } else if (raw.length > 3) {
+        this.phoneDisplay = raw.replace(/(\d{3})(\d{0,4})/, '$1 $2').trim()
+      } else {
+        this.phoneDisplay = raw
+      }
+    },
+    toggleAgreement() {
+      this.agreementChecked = !this.agreementChecked
+    },
+    handleUserRegister() {
+      this.$tab.redirectTo(`/pages/register`)
+    },
+    handlePrivacy() {
+      let site = this.globalConfig.appInfo.agreements[0]
+      this.$tab.navigateTo(`/pages/common/webview/index?title=${site.title}&url=${site.url}`)
+    },
+    handleUserAgrement() {
+      let site = this.globalConfig.appInfo.agreements[1]
+      this.$tab.navigateTo(`/pages/common/webview/index?title=${site.title}&url=${site.url}`)
+    },
+    getCode() {
+      getCodeImg().then(res => {
+        this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled
+        if (this.captchaEnabled) {
+          this.codeUrl = 'data:image/gif;base64,' + res.img
+          this.loginForm.uuid = res.uuid
+        }
+      })
+    },
+    handleLogin() {
+      uni.reLaunch({
+        url: '/pages/index',
+        success: () => {
+          console.log('跳转成功')
+        },
+        fail: (err) => {
+          console.error('跳转失败:', err)
+          // 如果 reLaunch 失败,尝试使用 navigateTo
+          uni.navigateTo({
+            url: '/pages/index',
+            fail: (err2) => {
+              console.error('navigateTo 也失败:', err2)
+            }
+          })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+page {
+  background-color: #eaf3ff;
+}
+
+.login-page {
+  position: relative;
+  min-height: 100vh;
+  width: 100%;
+  overflow: hidden;
+  background: url('../static/login/login-bg.png') no-repeat center center;
+}
+
+.login-bg {
+  position: absolute;
+  right: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 0;
+}
+
+.login-hero {
+  position: absolute;
+  width: 360px;
+  height: 580px;
+  background: url('../static/login/login-illustration.png') no-repeat;
+  background-size: 100% 100%;
+  right: 0rpx;
+  top: 40rpx;
+}
+
+.login-content {
+  padding: 470rpx 40rpx 0;
+  display: flex;
+  flex-direction: column;
+  box-sizing: border-box;
+}
+
+.status-bar {
+  height: var(--status-bar-height, 0px);
+}
+
+.header {
+  display: flex;
+  flex-direction: column;
+}
+
+.header-title {
+  font-size: 50rpx;
+  font-weight: 600;
+  color: #19274b;
+  line-height: 1.2;
+}
+
+.header-subtitle {
+  margin-top: 24rpx;
+  font-size: 26rpx;
+  color: rgba(25, 39, 75, 0.68);
+  line-height: 1.6;
+}
+
+.form-card {
+  z-index: 9;
+  margin-top: 160rpx;
+  width: 100%;
+  box-sizing: border-box;
+}
+
+.field {
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.field-label {
+  font-size: 26rpx;
+  color: #151515;
+  font-size: 28rpx;
+  margin-bottom: 18rpx;
+}
+
+.field-input {
+  text-align: center;
+  width: 100%;
+  height: 102rpx;
+  border-radius: 28rpx;
+  background: rgba(255, 255, 255, 0.7);
+  border: 1px solid rgba(47, 94, 187, 0.08);
+  box-shadow: inset 0 4rpx 12rpx rgba(41, 94, 187, 0.06);
+  padding: 0 36rpx;
+  box-sizing: border-box;
+  font-size: 28rpx;
+  color: #AAA;
+  letter-spacing: 6rpx;
+}
+
+.field-input::placeholder {
+  color: #AAA;
+  letter-spacing: 6rpx;
+  opacity: 0.7;
+}
+
+.primary-btn {
+  margin-top: 44rpx;
+  width: 100%;
+  height: 100rpx;
+  border-radius: 28rpx;
+  background: linear-gradient(90deg, #3677E9 0%, #2856C7 100%);
+  color: #ffffff;
+  font-size: 28rpx;
+  font-weight: 500;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: none;
+  box-shadow: 0 20rpx 40rpx rgba(38, 104, 255, 0.35);
+}
+
+.agreement-row {
+  position: fixed;
+  bottom: 100rpx;
+  left: 0;
+  width: 100%;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.agreement-checkbox {
+  width: 30rpx;
+  height: 30rpx;
+  margin-right: 8rpx;
+  border-radius: 50%;
+  border: 1px solid rgba(35, 96, 255, 0.5);
+  background: rgba(250, 252, 255, 0.8);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.agreement-checkbox.checked {
+  background: linear-gradient(140deg, #3c7dff 0%, #235aff 100%);
+  border: none;
+}
+
+.checkbox-inner {
+  width: 16rpx;
+  height: 16rpx;
+  border-radius: 50%;
+  background: #ffffff;
+  opacity: 0;
+}
+
+.agreement-checkbox.checked .checkbox-inner {
+  opacity: 1;
+}
+
+.agreement-text {
+  font-size: 24rpx;
+  color: rgba(34, 52, 91, 0.75);
+  line-height: 1.5;
+}
+
+.agreement-text .link {
+  color: #2360ff;
+  margin: 0 6rpx;
+}
+</style>

BIN
static/login/login-bg.png


BIN
static/login/login-illustration.png