diff --git a/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.less b/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.less
index 3c193f1..25d190e 100644
--- a/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.less
+++ b/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.less
@@ -8,7 +8,7 @@
.filter-item {
height: 84rpx;
- padding: 0 18rpx;
+ padding: 0 22rpx;
border-radius: 14rpx;
border: 1rpx solid var(--border-color);
/* Use variable */
@@ -24,13 +24,6 @@ picker {
min-width: 0;
}
-.label {
- font-size: 22rpx;
- color: var(--text-tertiary);
- /* Use variable */
- flex-shrink: 0;
-}
-
.value {
flex: 1;
min-width: 0;
@@ -47,4 +40,4 @@ picker {
/* Use variable */
font-size: 20rpx;
flex-shrink: 0;
-}
\ No newline at end of file
+}
diff --git a/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.wxml b/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.wxml
index 0499e1e..ee1e7af 100644
--- a/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.wxml
+++ b/frontend_miniprogram/miniprogram/components/filter-bar/filter-bar.wxml
@@ -1,14 +1,12 @@
- 机构
{{selectedOffice}}
▾
- 领域
{{selectedArea}}
▾
diff --git a/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.less b/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.less
index 72699dc..549e136 100644
--- a/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.less
+++ b/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.less
@@ -1,27 +1,47 @@
.lawyer-card {
display: flex;
- align-items: center;
+ align-items: flex-start;
background: var(--bg-card);
- border-radius: var(--border-radius-base);
+ border-radius: 18rpx;
padding: var(--spacing-md);
- box-shadow: var(--shadow-sm);
+ box-shadow: var(--shadow-base);
position: relative;
overflow: hidden;
transition: transform 0.1s;
+ border: 1rpx solid rgba(142, 34, 48, 0.06);
}
.lawyer-card:active {
transform: scale(0.98);
}
+.lawyer-card--featured {
+ padding: 28rpx;
+ border-radius: 20rpx;
+ background: linear-gradient(180deg, #fff 0%, #fffaf9 100%);
+ box-shadow: 0 10rpx 28rpx rgba(26, 26, 26, 0.08);
+}
+
+.lawyer-card--compact {
+ align-items: center;
+}
+
.avatar {
- width: 100rpx;
- height: 100rpx;
- border-radius: 50%;
- border: 4rpx solid var(--bg-page);
+ width: 104rpx;
+ height: 104rpx;
+ border-radius: 28rpx;
+ border: 4rpx solid #fff;
flex-shrink: 0;
- margin-right: var(--spacing-sm);
+ margin-right: 20rpx;
background: var(--bg-surface);
+ box-shadow: 0 6rpx 18rpx rgba(0, 0, 0, 0.08);
+}
+
+.lawyer-card--featured .avatar {
+ width: 132rpx;
+ height: 132rpx;
+ border-radius: 32rpx;
+ margin-right: 24rpx;
}
.content {
@@ -29,69 +49,148 @@
min-width: 0;
display: flex;
flex-direction: column;
- justify-content: center;
+ gap: 14rpx;
+}
+
+.top-row {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 16rpx;
+}
+
+.identity-block {
+ flex: 1;
+ min-width: 0;
}
.header-row {
display: flex;
align-items: center;
- margin-bottom: 6rpx;
+ flex-wrap: wrap;
+ gap: 10rpx;
}
.name {
font-size: 32rpx;
font-weight: 600;
color: var(--text-main);
- margin-right: 12rpx;
+ line-height: 1.2;
+}
+
+.lawyer-card--featured .name {
+ font-size: 40rpx;
}
.title {
font-size: 22rpx;
color: var(--primary-color);
background: rgba(142, 34, 48, 0.08);
- /* Primary opacity */
- padding: 2rpx 10rpx;
- border-radius: 8rpx;
+ padding: 6rpx 14rpx;
+ border-radius: 10rpx;
font-weight: 500;
+ line-height: 1;
}
-.office {
+.lawyer-card--featured .title {
font-size: 24rpx;
+ padding: 8rpx 16rpx;
+ background: rgba(142, 34, 48, 0.1);
+}
+
+.contact-row {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10rpx;
+ margin-top: 12rpx;
+}
+
+.contact-chip {
+ max-width: 100%;
+ font-size: 22rpx;
+ line-height: 1.2;
+ color: var(--text-secondary);
+ background: var(--bg-page);
+ border-radius: 999rpx;
+ padding: 8rpx 16rpx;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.lawyer-card--featured .contact-chip {
+ font-size: 24rpx;
+ padding: 10rpx 18rpx;
+ background: rgba(255, 255, 255, 0.86);
+ border: 1rpx solid rgba(142, 34, 48, 0.08);
+}
+
+.specialty-block {
+ display: flex;
+ flex-direction: column;
+ gap: 10rpx;
+}
+
+.specialty-label {
+ font-size: 22rpx;
color: var(--text-tertiary);
- margin-bottom: 12rpx;
+ line-height: 1;
}
.tags-row {
display: flex;
flex-wrap: wrap;
- gap: 8rpx;
+ gap: 10rpx;
}
.tag {
- font-size: 20rpx;
+ font-size: 22rpx;
color: var(--text-secondary);
background: var(--bg-page);
- padding: 4rpx 12rpx;
- border-radius: 6rpx;
+ padding: 8rpx 14rpx;
+ border-radius: 999rpx;
+ line-height: 1.2;
+}
+
+.lawyer-card--featured .tag {
+ font-size: 22rpx;
+ color: var(--primary-dark);
+ background: rgba(142, 34, 48, 0.06);
+ padding: 8rpx 14rpx;
}
.tag-more {
- font-size: 20rpx;
- color: var(--text-tertiary);
- padding: 4rpx 0;
+ font-size: 22rpx;
+ color: var(--primary-color);
+ background: rgba(142, 34, 48, 0.08);
+ padding: 8rpx 14rpx;
+ border-radius: 999rpx;
+ line-height: 1.2;
}
.action-col {
- margin-left: var(--spacing-md);
display: flex;
align-items: center;
+ flex-shrink: 0;
+ padding-top: 2rpx;
}
.consult-btn {
font-size: 24rpx;
color: var(--primary-color);
+ background: #fff;
border: 1rpx solid var(--primary-color);
- padding: 6rpx 20rpx;
- border-radius: 24rpx;
+ padding: 10rpx 22rpx;
+ border-radius: 999rpx;
font-weight: 500;
-}
\ No newline at end of file
+ line-height: 1;
+}
+
+.lawyer-card--featured .consult-btn {
+ font-size: 26rpx;
+ padding: 14rpx 28rpx;
+ color: #fff;
+ background: var(--primary-color);
+ border: none;
+ box-shadow: 0 8rpx 18rpx rgba(142, 34, 48, 0.18);
+}
diff --git a/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.ts b/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.ts
index 60206c0..459465c 100644
--- a/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.ts
+++ b/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.ts
@@ -1,24 +1,44 @@
Component({
data: {
- specialtiesText: '',
+ isFeatured: false,
+ layoutClass: '',
+ visibleSpecialties: [] as string[],
+ moreSpecialtiesCount: 0,
+ contactItems: [] as string[],
},
properties: {
lawyer: {
type: Object,
value: null,
},
- showOffice: {
- type: Boolean,
- value: true,
+ layout: {
+ type: String,
+ value: 'compact',
},
},
observers: {
- lawyer(lawyer: { specialties?: string[] } | null) {
+ 'lawyer, layout'(lawyer: {
+ specialties?: string[];
+ phone?: string;
+ email?: string;
+ } | null, layout: string) {
const specialties =
lawyer && Array.isArray(lawyer.specialties) ? lawyer.specialties : [];
+ const isFeatured = layout === 'featured';
+ const visibleLimit = isFeatured ? 4 : 3;
+ const phone = lawyer && typeof lawyer.phone === 'string' ? lawyer.phone.trim() : '';
+ const email = lawyer && typeof lawyer.email === 'string' ? lawyer.email.trim() : '';
+ const phoneText = phone ? `电话:${phone}` : '';
+ const emailText = email ? `邮箱:${email}` : '';
+ const contactItems = isFeatured
+ ? [phoneText, emailText].filter((item) => Boolean(item)).slice(0, 2)
+ : [];
this.setData({
- specialties, // Expose array for wx:for
- specialtiesText: specialties.join(' | '),
+ isFeatured,
+ layoutClass: isFeatured ? 'lawyer-card--featured' : 'lawyer-card--compact',
+ visibleSpecialties: specialties.slice(0, visibleLimit),
+ moreSpecialtiesCount: Math.max(0, specialties.length - visibleLimit),
+ contactItems,
});
},
},
diff --git a/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.wxml b/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.wxml
index 679925f..94cce0f 100644
--- a/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.wxml
+++ b/frontend_miniprogram/miniprogram/components/lawyer-card/lawyer-card.wxml
@@ -1,21 +1,30 @@
-
+
-
-
-
-
- {{lawyer.office}}
-
-
- {{item}}
- ...
-
-
-
- 咨询
+
+
+
+
+
+
+ {{item}}
+
+
+
+
+ 咨询
+
+
+
+
+ 业务方向
+
+ {{item}}
+ ...
+
+
diff --git a/frontend_miniprogram/miniprogram/pages/lawyer-list/index.less b/frontend_miniprogram/miniprogram/pages/lawyer-list/index.less
index 8e63214..d9760d5 100644
--- a/frontend_miniprogram/miniprogram/pages/lawyer-list/index.less
+++ b/frontend_miniprogram/miniprogram/pages/lawyer-list/index.less
@@ -44,73 +44,14 @@
color: var(--text-placeholder);
}
-.quick-actions {
- display: flex;
- gap: var(--spacing-md);
- padding: 0 var(--spacing-md) var(--spacing-md);
-}
-
-.action-btn {
- flex: 1;
- height: 80rpx;
- border-radius: var(--border-radius-base);
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 28rpx;
- font-weight: 500;
- transition: opacity 0.2s;
-}
-
-.action-btn:active {
- opacity: 0.8;
-}
-
-.hotline-btn {
- background: rgba(142, 34, 48, 0.06);
- /* Burgundy tint */
- color: var(--primary-color);
-}
-
-.map-btn {
- background: #fff;
- color: var(--text-secondary);
- border: 1rpx solid var(--border-color);
-}
-
.list-wrap {
padding: 0 var(--spacing-md);
}
.card-item {
- margin-bottom: var(--spacing-md);
- background: #fff;
- /* Ensure card background is white */
- border-radius: var(--border-radius-base);
+ margin-bottom: 20rpx;
}
.list-bottom-space {
height: 120rpx;
}
-
-/* History Floating Action Button styling */
-.history-fab {
- position: fixed;
- right: var(--spacing-md);
- bottom: calc(var(--spacing-lg) + env(safe-area-inset-bottom));
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(10px);
- padding: 16rpx 32rpx;
- border-radius: 40rpx;
- box-shadow: var(--shadow-lg);
- display: flex;
- align-items: center;
- z-index: 20;
- border: 1rpx solid var(--border-color);
-}
-
-.history-text {
- font-size: 26rpx;
- color: var(--text-main);
- font-weight: 500;
-}
\ No newline at end of file
diff --git a/frontend_miniprogram/miniprogram/pages/lawyer-list/index.ts b/frontend_miniprogram/miniprogram/pages/lawyer-list/index.ts
index d1082da..d2b9c65 100644
--- a/frontend_miniprogram/miniprogram/pages/lawyer-list/index.ts
+++ b/frontend_miniprogram/miniprogram/pages/lawyer-list/index.ts
@@ -8,17 +8,12 @@ let searchDebounceTimer: number | null = null;
Page({
data: {
- firmName: '',
- firmAddress: '',
- firmLatitude: 0,
- firmLongitude: 0,
keyword: '',
selectedOffice: ALL_OFFICES,
selectedArea: ALL_AREAS,
officeOptions: [ALL_OFFICES],
areaOptions: [ALL_AREAS],
filteredLawyers: [] as Lawyer[],
- hotlinePhone: '',
loading: false,
},
@@ -31,11 +26,6 @@ Page({
try {
const firm = await getFirmProfile();
this.setData({
- firmName: firm.name,
- firmAddress: firm.hqAddress,
- firmLatitude: firm.hqLatitude,
- firmLongitude: firm.hqLongitude,
- hotlinePhone: firm.hotlinePhone,
officeOptions: [ALL_OFFICES, ...firm.officeList],
areaOptions: [ALL_AREAS, ...firm.practiceAreas],
});
@@ -68,6 +58,14 @@ Page({
}, 250) as unknown as number;
},
+ onSearchConfirm() {
+ if (searchDebounceTimer !== null) {
+ clearTimeout(searchDebounceTimer);
+ searchDebounceTimer = null;
+ }
+ this.loadLawyers();
+ },
+
handleOfficeChange(event: WechatMiniprogram.CustomEvent<{ value: string }>) {
this.setData({ selectedOffice: event.detail.value });
this.loadLawyers();
@@ -104,44 +102,4 @@ Page({
url: `/pages/lawyer-detail/index?id=${lawyerId}`,
});
},
-
- callHotline() {
- if (!this.data.hotlinePhone) {
- wx.showToast({
- title: '暂无联系电话',
- icon: 'none',
- });
- return;
- }
-
- wx.makePhoneCall({
- phoneNumber: this.data.hotlinePhone,
- fail: () => {
- wx.showToast({ title: '拨号失败', icon: 'none' });
- },
- });
- },
-
- openOffice() {
- if (!this.data.firmLatitude || !this.data.firmLongitude) {
- wx.showToast({ title: '暂未配置地图位置', icon: 'none' });
- return;
- }
- wx.openLocation({
- latitude: this.data.firmLatitude,
- longitude: this.data.firmLongitude,
- name: this.data.firmName,
- address: this.data.firmAddress,
- scale: 18,
- fail: () => {
- wx.showToast({ title: '打开地图失败', icon: 'none' });
- },
- });
- },
-
- goHistory() {
- wx.navigateTo({
- url: '/pages/history/index',
- });
- },
});
diff --git a/frontend_miniprogram/miniprogram/pages/lawyer-list/index.wxml b/frontend_miniprogram/miniprogram/pages/lawyer-list/index.wxml
index dd6ec9b..c796df4 100644
--- a/frontend_miniprogram/miniprogram/pages/lawyer-list/index.wxml
+++ b/frontend_miniprogram/miniprogram/pages/lawyer-list/index.wxml
@@ -12,6 +12,8 @@
placeholder="搜索律师姓名、专业领域..."
value="{{keyword}}"
bindinput="onSearchInput"
+ bindconfirm="onSearchConfirm"
+ confirm-type="search"
/>
@@ -26,21 +28,11 @@
>
-
-
-
- 联系电话
-
-
- 总部导航
-
-
-
-
+
@@ -49,8 +41,4 @@
-
-
- 浏览记录
-