浏览代码

自定义导航栏+渐变背景

Xiao_123 1 月之前
父节点
当前提交
da09bf27a2

+ 1 - 0
components/FilterList/index.vue

@@ -119,6 +119,7 @@ watch(() => props.list,
     flex: 1;
     width: 0;
     font-size: 14px;
+	  z-index: 1;
     .name {
       width: 100%;
       display: flex;

+ 148 - 23
components/Navbar/index.vue

@@ -1,7 +1,32 @@
 <template>
-  <view class="navbar-box" :style="{'height': (navbarHeight < defaultLogoHeight ? (defaultLogoHeight + 10) : navbarHeight) + 'px', 'paddingTop': statusBarHeight + 'px'}">
-    <image src="https://minio.citupro.com/dev/menduner/poster.png" class="navbar-box-logo" :style="{'height': defaultLogoHeight + 'px'}"></image>
-    <!-- <view class="navbar-box-title">{{ title }}</view> -->
+  <view
+    class="navbar"
+    :class="{'gradientBgc': !noBgColor}"
+    :style="{
+      'height': height + 'px',
+      'line-height': height + 'px',
+    }"
+  >
+    <view class="navbar-box" :style="{'paddingTop': statusBarHeight + 'px', 'height': height ? (height - statusBarHeight) + 'px' : '100%'}">
+      <image 
+        v-if="showLogo" 
+        src="https://minio.menduner.com/dev/8ddece1d3a3203164f57a5126b31464565be6858eb5d3af776ce3ac2512ad30c.png" 
+        class="navbar-box-logo" 
+        :style="{'height': defaultLogoHeight + 'px'}"
+      ></image>
+      <view v-else class="nav-box-title" :style="{'height': height ? (height - statusBarHeight) + 'px' : '100%'}">
+        <uni-icons 
+          v-if="!textLeft" 
+          :type="pages && pages.length > 1 ? 'icon-left' : 'icon-shouye'" 
+          size="23" 
+          class="ss-m-l-20" 
+          color="#0E100F" 
+          @tap="goBack"
+          custom-prefix="iconfont"
+        ></uni-icons>
+        <view class="title-text" :class="[{'text-left': textLeft}, {'text-center': !textLeft}]">{{ title }}</view>
+      </view>
+    </view>
   </view>
 </template>
 
@@ -13,37 +38,137 @@ defineProps({
   title: {
     type: String,
     default: '门墩儿'
+  },
+  showLogo: {
+    type: Boolean,
+    default: false
+  },
+  // 是否需要渐变背景
+  noBgColor: {
+    type: Boolean,
+    default: false
+  },
+  // 标题所在位置
+  textLeft: {
+	  type: Boolean,
+	  default: true
   }
 })
 
-const defaultLogoHeight = 45
+const defaultLogoHeight = 33
 const navbarHeight = ref(0)
 const statusBarHeight = ref(0)
-onLoad(() => {
-  const systemInfo = uni.getSystemInfoSync()
-  statusBarHeight.value = systemInfo.statusBarHeight
-  const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
-  navbarHeight.value = menuButtonInfo.height + ((menuButtonInfo.top - statusBarHeight.value) * 2) + 15
+const height = ref(0)
+
+const pages = ref([])
+onLoad(async () => {
+  pages.value = getCurrentPages() // 获取当前页面栈的实例数组
+  try {
+    const systemInfo = uni.getSystemInfoSync()
+    statusBarHeight.value = systemInfo.statusBarHeight
+    const menuButtonInfo = uni.getMenuButtonBoundingClientRect()
+
+    // 计算导航栏高度
+    navbarHeight.value = menuButtonInfo.height + 2 * (menuButtonInfo.top - statusBarHeight.value) + statusBarHeight.value
+
+    // 确保导航栏高度不小于 logo 高度 + 10
+    if (navbarHeight.value < defaultLogoHeight + 10) {
+      navbarHeight.value = defaultLogoHeight + 10
+    }
+
+    height.value = navbarHeight.value < defaultLogoHeight ? (defaultLogoHeight + 10) : navbarHeight.value + 10
+	  await new Promise((resolve, reject) => {
+	    uni.setStorage({
+	      key: 'navbarHeight',
+	      data: height.value,
+	      success: resolve,
+	      fail: reject
+	    })
+	  })
+  } catch (error) {
+    console.error('获取系统信息或菜单按钮信息时出错:', error)
+  }
 })
+
+// 返回上一页或首页
+const goBack = () => {
+  if (pages.value.length > 1) {
+    uni.navigateBack({
+      delta: 1,
+      fail: () => {
+        console.error('返回上一页失败,尝试跳转到首页')
+        uni.reLaunch({
+          url: '/pages/index/position',
+          fail: (err) => {
+            console.error('跳转到首页也失败:', err)
+            uni.showToast({
+              title: '导航失败,请稍后重试',
+              icon: 'none'
+            })
+          }
+        })
+      }
+    })
+  } else {
+    uni.reLaunch({
+      url: '/pages/index/position',
+      fail: (err) => {
+        console.error('重新加载首页失败:', err)
+        uni.showToast({
+          title: '重新加载首页失败',
+          icon: 'none'
+        })
+      }
+    })
+  }
+}
 </script>
 
 <style scoped lang="scss">
-.navbar-box {
+.gradientBgc {
+  background: linear-gradient(180deg, #9bfece, #BCFEDE);
+}
+.navbar {
+  position: fixed;
+  top: 0;
+  left: 0;
   width: 100%;
+  z-index: 999;
+  &-box {
+    position: relative;
+    width: 100%;
+    &-logo {
+      position: absolute;
+      left: 10px;
+      width: 156.85rpx;
+    }
+  }
+}
+.nav-box-title {
   position: relative;
-  background: linear-gradient(90deg, #66BB6A 0, #64FFDA 100%);
-  &-logo {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  .title-text {
     position: absolute;
-    left: 50%;
-    transform: translateX(-50%);
-    width: 100px;
+    width: 158px;
+    height: 51px;
+    line-height: 51px;
+    color: #0E100F;
+    font-style: normal;
+    text-transform: none;
   }
-  // &-title {
-  //   position: absolute;
-  //   top: 50%;
-  //   left: 50%;
-  //   transform: translate(-30%, 0);
-  //   color: #fff;
-  // }
 }
-</style>
+.text-left {
+	left: 15px;
+	font-family: MiSans-Semibold;
+	font-weight: 600;
+	font-size: 38rpx;
+}
+.text-center {
+	left: 50%;
+	transform: translateX(-50%);
+	font-family: MiSans-Medium;
+	font-size: 33rpx;
+}
+</style>

+ 12 - 6
pages.json

@@ -9,13 +9,15 @@
 		{
 			"path": "pages/index/search",
 			"style": {
-				"navigationBarTitleText": "人才推荐"
+				"navigationBarTitleText": "人才推荐",
+				"navigationStyle": "custom"
 			}
 		},
 		{
 			"path": "pages/index/position",
 			"style": {
-				"navigationBarTitleText": "职位"
+				"navigationBarTitleText": "职位",
+				"navigationStyle": "custom"
 			}
 		},
 		{
@@ -45,19 +47,22 @@
 		{
 			"path": "pages/index/communicate",
 			"style": {
-				"navigationBarTitleText": "最近联系人"
+				"navigationBarTitleText": "最近联系人",
+				"navigationStyle": "custom"
 			}
 		},
 		{
 			"path": "pages/index/jobFair",
 			"style": {
-				"navigationBarTitleText": "招聘会"
+				"navigationBarTitleText": "招聘会",
+				"navigationStyle": "custom"
 			}
 		},
 		{
 			"path": "pages/index/my",
 			"style": {
-				"navigationBarTitleText": "我的"
+				"navigationBarTitleText": "我的",
+				"navigationStyle": "custom"
 			}
 		},
 		{
@@ -98,7 +103,8 @@
 				{
 					"path": "chart/index",
 					"style": {
-						"navigationBarTitleText": "我的聊天"
+						"navigationBarTitleText": "我的聊天",
+						"navigationStyle": "custom"
 					}
 				},
 				{

+ 47 - 40
pages/index/communicate.vue

@@ -1,51 +1,58 @@
 <template>
-  <layout-page>
-		<view class="height defaultBgc">
-			<scroll-view class="scrollBox" scroll-y="true" >
-				<view class="box" v-for="item in items" :key="item.id" @tap="handleTo(item)">
-					<view class="box-header">
-						<template v-if="item.unread === '0'">
-							<image
-								class="enterAvatar"
-								:src="getUserAvatar(item?.userInfoVo?.userInfoResp?.avatar, item?.userInfoVo?.userInfoResp?.sex, !item?.userInfoVo && item.channel_id === 'system' ? true : false)"
-							></image>
-						</template>
-						<template v-else>
-							<uni-badge class="uni-badge-left-margin" :text="item.unread" absolute="rightTop" size="small">
-								<image
-									class="enterAvatar"
-									:src="getUserAvatar(item?.userInfoVo?.userInfoResp?.avatar, item?.userInfoVo?.userInfoResp?.sex, !item?.userInfoVo && item.channel_id === 'system' ? true : false)"
-								></image>
-							</uni-badge>
-						</template>
-					</view>
-					<view class="box-content">
-						<view class="box-content-names">
-							<view class="name">
-								{{ item.thatName }}
-								<text class="nameSub">{{ formatName(item.enterpriseAnotherName) }}</text>
-								<span class="line" v-if="item.postNameCn && item.enterpriseAnotherName"></span>
-								<text class="nameSub">{{ item.postNameCn }}</text>
+  <view>
+		<Navbar title="最近联系人" />
+		<layout-page>
+			<view :style="{'padding-top': navbarHeight + 'px'}">
+				<view class="commonBackground"></view>
+				<view class="height defaultBgc">
+					<scroll-view class="scrollBox" scroll-y="true" >
+						<view class="box" v-for="item in items" :key="item.id" @tap="handleTo(item)">
+							<view class="box-header">
+								<template v-if="item.unread === '0'">
+									<image
+										class="enterAvatar"
+										:src="getUserAvatar(item?.userInfoVo?.userInfoResp?.avatar, item?.userInfoVo?.userInfoResp?.sex, !item?.userInfoVo && item.channel_id === 'system' ? true : false)"
+									></image>
+								</template>
+								<template v-else>
+									<uni-badge class="uni-badge-left-margin" :text="item.unread" absolute="rightTop" size="small">
+										<image
+											class="enterAvatar"
+											:src="getUserAvatar(item?.userInfoVo?.userInfoResp?.avatar, item?.userInfoVo?.userInfoResp?.sex, !item?.userInfoVo && item.channel_id === 'system' ? true : false)"
+										></image>
+									</uni-badge>
+								</template>
+							</view>
+							<view class="box-content">
+								<view class="box-content-names">
+									<view class="name">
+										{{ item.thatName }}
+										<text class="nameSub">{{ formatName(item.enterpriseAnotherName) }}</text>
+										<span class="line" v-if="item.postNameCn && item.enterpriseAnotherName"></span>
+										<text class="nameSub">{{ item.postNameCn }}</text>
+									</view>
+								</view>
+								<view class="box-content-text">{{ timesTampChange(+item.timestamp.padEnd(13, '0')) }}</view>
 							</view>
 						</view>
-						<view class="box-content-text">{{ timesTampChange(+item.timestamp.padEnd(13, '0')) }}</view>
-					</view>
+						<image
+							v-if=" items.length===0 "
+							src="https://minio.citupro.com/dev/static/nodata.png"
+							mode="widthFix"
+							style="width: 100%;">
+						</image>
+						<uni-load-more status="noMore" />
+					</scroll-view>
 				</view>
-				<image
-					v-if=" items.length===0 "
-					src="https://minio.citupro.com/dev/static/nodata.png"
-					mode="widthFix"
-					style="width: 100%;">
-				</image>
-				<uni-load-more status="noMore" />
-			</scroll-view>
-		</view>
-  </layout-page>
+			</view>
+		</layout-page>
+	</view>
 </template>
 
 <script setup>
 import { ref, watch, computed } from 'vue'
 import layoutPage from '@/layout'
+import Navbar from '@/components/Navbar'
 import { getConversationSync } from '@/api/common'
 import { onShow, onLoad, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'
 import { getUserAvatar } from '@/utils/avatar'
@@ -56,6 +63,7 @@ import { formatName } from '@/utils/getText'
 
 const useUserStore = userStore()
 const userInfo = computed(() => useUserStore?.userInfo)
+const navbarHeight = ref(uni.getStorageSync('navbarHeight'))
 
 const IM = useIMStore()
 
@@ -163,7 +171,6 @@ async function init () {
   box-sizing: border-box;
 }
 .box {
-	background: #FFF;
 	height: 130rpx;
 	padding: 20rpx;
 	box-sizing: border-box;

+ 3 - 2
pages/index/components/condition.vue

@@ -1,12 +1,13 @@
 <template>
 	<view class="box defaultBgc">
-		<view style="background-color: #fff;">
+		<view>
 			<uni-search-bar
         v-model="params.content"
         radius="5"
         placeholder="输入关键字"
         cancelButton="none"
         :focus="false"
+				bgColor="#fff"
 				@clear="handleSearch('content', null)"
         @confirm="handleSearch('content', params.content)"
       ></uni-search-bar>
@@ -22,7 +23,7 @@
 </template>
 
 <script setup>
-import { ref, nextTick } from 'vue'
+import { ref } from 'vue'
 import TalentItem from './talentItem.vue'
 import FilterList from '@/components/FilterList'
 import { getPersonConditionSearchPage } from '@/api/search'

+ 1 - 1
pages/index/components/recommend.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="box defaultBgc">
-		<view style="padding: 10px 15px 15px 15px; background-color: #fff;">
+		<view style="padding: 10px 15px 10px 15px;">
 			<uni-data-select 
 				v-model="query.jobId" 
 				:clear="false" 

+ 35 - 16
pages/index/jobFair.vue

@@ -1,25 +1,33 @@
 <template>
-	<layout-page>
-    <view style="padding-bottom: 30px; ">
-      <view v-if="items.length">
-        <uni-card v-for="val in items" :key="val.id" @tap="handleToJobFairEnterprises(val)">
-          <image v-if="val?.previewImg" class="ss-m-t-10" :src="val.previewImg" mode="widthFix" style="width: 100%; height: auto; border-radius: 6px;"></image>
-          <view class="ss-m-t-20">活动时间:{{ timesTampChange(val.startTime, 'Y-M-D') }}至{{ timesTampChange(val.endTime, 'Y-M-D') }}</view>
-          <button class="ss-m-t-20 ss-m-b-10" style="background-color: #00B760; color: #fff;" type="primary">立即加入</button>
-        </uni-card>
+	<view>
+    <Navbar title="招聘会" />
+    <layout-page>
+      <view class="defaultBgc" style="padding-bottom: 100px;" :style="{'height': `calc(100vh - ${(navbarHeight + 100)}px)`, 'padding-top': navbarHeight + 'px'}">
+        <view v-if="items.length">
+          <view class="commonBackground"></view>
+          <view v-for="val in items" :key="val.id" @tap="handleToJobFairEnterprises(val)" class="list-item defaultBgc default-border">
+            <image v-if="val?.previewImg" class="ss-m-t-10" :src="val.previewImg" mode="widthFix" style="width: 100%; height: auto; border-radius: 6px;"></image>
+            <view class="ss-m-t-20">活动时间:{{ timesTampChange(val.startTime, 'Y-M-D') }}至{{ timesTampChange(val.endTime, 'Y-M-D') }}</view>
+            <button class="ss-m-t-20 ss-m-b-10" style="background-color: #00B760; color: #fff;" type="primary">立即加入</button>
+          </view>
+        </view>
+        <view v-else>
+          <view class="commonBackground"></view>
+          <view class="nodata-img-parent" :style="{'height': `calc(100vh - ${(navbarHeight + 100)}px)`}">
+            <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
+          </view>
+        </view>
       </view>
-      <view v-else class="nodata-img-parent">
-        <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
-      </view>
-    </view>
 
-    <payPopup ref="payRef" @paySuccess="paySuccess"></payPopup>
-  </layout-page>
+      <payPopup ref="payRef" @paySuccess="paySuccess"></payPopup>
+    </layout-page>
+  </view>
 </template>
 
 <script setup>
-import layoutPage from '@/layout'
 import { ref, watch } from 'vue'
+import layoutPage from '@/layout'
+import Navbar from '@/components/Navbar'
 import { onShow } from '@dcloudio/uni-app'
 import { getAccessToken } from '@/utils/request'
 import { showAuthModal } from '@/hooks/useModal'
@@ -30,6 +38,7 @@ import payPopup from '@/components/payPopup'
 
 const useUserStore = userStore()
 const items = ref([])
+const navbarHeight = ref(uni.getStorageSync('navbarHeight'))
 
 // 获得招聘会列表
 const getList = async () => {
@@ -103,5 +112,15 @@ const paySuccess = () => {
 </script>
 
 <style scoped lang="scss">
-
+.list-item {
+  margin: 0 30rpx 30rpx 30rpx;
+  border-radius: 20rpx;
+  padding: 30rpx;
+  position: relative;
+  box-shadow: 1px 2px 12px rgba(0, 0, 0, 0.17);
+  view {
+    font-size: 28rpx;
+    color: #666;
+  }
+}
 </style>

+ 54 - 45
pages/index/my.vue

@@ -1,54 +1,60 @@
 <template>
-  <layout-page>
-		<view class="pb-150">
-			<view class="text-center ss-p-b-30" :class="vip ? 'vipBox' : 'avatarBox'" @tap="handleLogin">
-				<img :src="getUserAvatar(userInfo?.avatar, userInfo?.sex)" alt="" class="img-box">
-				<image v-if="vip" src="/static/svg/vip.svg" class="vipIcon"></image>
-				<view v-if="!useUserStore.isLogin" class="font-weight-bold font-size-20">点击登录</view>
-				<view v-else>
-					<view>
-						<span class="font-weight-bold font-size-20">{{ userInfo?.name || userInfo?.phone }}</span>
-						<uni-icons @tap="handleEdit('/pagesB/staffInfoEdit/index')" class="ss-m-l-10" type="compose" :size="22"></uni-icons>
+  <view>
+		<Navbar title="我的" />
+		<layout-page>
+			<view :style="{'padding-top': navbarHeight + 'px'}">
+				<view class="commonBackground"></view>
+				<view class="pb-150 defaultBgc">
+					<view class="text-center ss-p-b-30" :class="vip ? 'vipBox' : 'avatarBox'" @tap="handleLogin">
+						<img :src="getUserAvatar(userInfo?.avatar, userInfo?.sex)" alt="" class="img-box">
+						<image v-if="vip" src="/static/svg/vip.svg" class="vipIcon"></image>
+						<view v-if="!useUserStore.isLogin" class="font-weight-bold font-size-20">点击登录</view>
+						<view v-else class="ss-m-t-30">
+							<view>
+								<span class="font-weight-bold font-size-20">{{ userInfo?.name || userInfo?.phone }}</span>
+								<uni-icons @tap="handleEdit('/pagesB/staffInfoEdit/index')" class="ss-m-l-10" type="compose" :size="22"></uni-icons>
+							</view>
+							<view style="color: #0E100F" class="ss-m-t-20">
+								<span>{{ formatName(userInfo?.enterpriseAnotherName || userInfo?.enterpriseName) }}</span>
+								<uni-icons @tap="handleEdit('/pagesB/companyInfoEdit/index')" class="ss-m-l-10" type="compose" :size="22"></uni-icons>
+							</view>
+						</view>
 					</view>
-					<view style="color: #0E100F" class="ss-m-t-20">
-						<span>{{ formatName(userInfo?.enterpriseAnotherName || userInfo?.enterpriseName) }}</span>
-						<uni-icons @tap="handleEdit('/pagesB/companyInfoEdit/index')" class="ss-m-l-10" type="compose" :size="22"></uni-icons>
+
+					<view class="defaultBgc ss-p-t-30">
+						<view class="list-card">
+							<uni-list>
+								<uni-list-item
+									v-for="item in list"
+									:clickable="true"
+									:key="item.title"
+									:title="item.title"
+									showArrow
+									:rightText="item.rightTex || ''"
+									@click="handleToLink(item)"
+								>
+								</uni-list-item>
+							</uni-list>
+						</view>
+				
+						<button v-if="useUserStore.isLogin" class="send-button" style="margin-bottom: 50px;" @tap="handleLogout">退出登录</button>
 					</view>
-				</view>
-			</view>
+			
+					<uni-popup ref="popup" type="dialog">
+						<uni-popup-dialog type="warn" cancelText="取消" confirmText="确定" title="系统提示" content="确认退出账号?" @confirm="handleLogoutConfirm"
+							@close="handleLogoutClose"></uni-popup-dialog>
+					</uni-popup>
 
-			<view class="defaultBgc ss-p-t-30">
-				<view class="list-card">
-					<uni-list>
-						<uni-list-item
-							v-for="item in list"
-							:clickable="true"
-							:key="item.title"
-							:title="item.title"
-							showArrow
-							:rightText="item.rightTex || ''"
-							@click="handleToLink(item)"
-						>
-						</uni-list-item>
-					</uni-list>
+					<uni-popup ref="inputDialog" type="dialog">
+						<view class="shareQrCodePopupContent">
+							<view>请前往网页版{{ dialogType ? '门墩儿招聘' : '门墩儿商城' }}</view>
+							<uni-link class="ss-m-t-10" :href="dialogType ? 'https://www.menduner.com' : 'https://www.menduner.com/mall'" text="点击复制网页地址" color="#00B760" fontSize="16" copyTips="已复制,请在电脑端打开"></uni-link>
+						</view>
+					</uni-popup>
 				</view>
-		
-				<button v-if="useUserStore.isLogin" class="send-button" style="margin-bottom: 50px;" @tap="handleLogout">退出登录</button>
 			</view>
-	
-			<uni-popup ref="popup" type="dialog">
-				<uni-popup-dialog type="warn" cancelText="取消" confirmText="确定" title="系统提示" content="确认退出账号?" @confirm="handleLogoutConfirm"
-					@close="handleLogoutClose"></uni-popup-dialog>
-			</uni-popup>
-
-			<uni-popup ref="inputDialog" type="dialog">
-				<view class="shareQrCodePopupContent">
-					<view>请前往网页版{{ dialogType ? '门墩儿招聘' : '门墩儿商城' }}</view>
-					<uni-link class="ss-m-t-10" :href="dialogType ? 'https://www.menduner.com' : 'https://www.menduner.com/mall'" text="点击复制网页地址" color="#00B760" fontSize="16" copyTips="已复制,请在电脑端打开"></uni-link>
-				</view>
-			</uni-popup>
-		</view>
-	</layout-page>
+		</layout-page>
+	</view>
 </template>
 
 <script setup>
@@ -60,6 +66,9 @@ import layoutPage from '@/layout'
 import { formatName } from '@/utils/getText'
 import { showAuthModal } from '@/hooks/useModal'
 import { onShow, onLoad, onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'
+import Navbar from '@/components/Navbar'
+
+const navbarHeight = ref(uni.getStorageSync('navbarHeight'))
 
 // 设置自定义tabbar选中值
 onShow(() => {

+ 36 - 28
pages/index/position.vue

@@ -1,11 +1,12 @@
 <template>
-  <layout-page @loginSucceeded="init">
-    <view class="box defaultBgc">
-      <uni-segmented-control :current="tab" :values="controlList" @clickItem="tabChange" styleType="text" activeColor="#00B760" style="background-color: #fff"></uni-segmented-control>
-      <scroll-view class="scrollBox" :scroll-y="true" @scrolltolower="loadingMore" style="position:relative;">
-        <view>
-          <!-- -->
-          <view class="white-bgc stick ss-p-t-20" style="border-radius: 5px;">
+  <view>
+    <Navbar title="职位" />
+    <layout-page @loginSucceeded="init">
+      <view :style="{'padding-top': navbarHeight + 'px'}">
+        <view class="commonBackground"></view>
+        <view class="box defaultBgc">
+          <uni-segmented-control :current="tab" :values="controlList" @clickItem="tabChange" styleType="text" activeColor="#00B760"></uni-segmented-control>
+          <view class="stick" style="border-radius: 5px;">
             <!-- <view class="defaultBgc d-flex ss-m-x-20">
               <view class="stickBtn" :style="`color: ${query.status==='99' ? '#00B760' :''}`" @tap=""><uni-icons v-if="query.status==='99'" class="ss-m-t-6 ss-m-r-4" color="#00B760" type="checkmarkempty" size="14"/>待发布(<text class="ss-m-x-2">{{ unpublishedCount }}</text>)</view>
               <view class="stickBtn newPositionBtn" @tap="">发布新职位</view>
@@ -16,6 +17,7 @@
               radius="5"
               placeholder="输入关键字"
               cancelButton="none"
+              bgColor="#fff"
               :focus="false"
               @confirm="onSearch"
             ></uni-search-bar>
@@ -24,35 +26,40 @@
               <span>可发布职位数 <span class="color-primary">{{ publishJobCount }}</span> 个</span>
             </view>
           </view>
-          <view v-if="!positionListData?.length && more !== 'loading'" class="d-flex flex-column align-center justify-center ss-m-t-30">
-            <view class="nodata-img-parent">
-              <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
-            </view>
-            <view class="color-999">暂无职位</view>
-            <view class="f-horizon-center">
-              <button type="primary" size="default" class="ss-m-t-50" style="width: 60vw;" @click="handleClickAdd">发布新职位</button>
-            </view>
-          </view>
-          <view v-else>
-            <PositionList v-if="positionListData?.length" :tab="tab" :payable="true" :list="positionListData" :noMore="false" @refresh="refresh"></PositionList>
-            <uni-load-more :status="more" />
-            <view style="padding-bottom: 20vh;"></view>
-            <view class="addBtn" @tap="handleClickAdd">
-              <view class="addBox">
-                <view class="icon">+</view>
-                <view class="text">发布新职位</view>
+          <scroll-view class="scrollBox" :scroll-y="true" @scrolltolower="loadingMore" style="position:relative;">
+            <view>
+              <view v-if="!positionListData?.length && more !== 'loading'" class="d-flex flex-column align-center justify-center ss-m-t-30">
+                <view class="nodata-img-parent">
+                  <image src="https://minio.citupro.com/dev/static/nodata.png" mode="widthFix" style="width: 100vw;height: 100vh;"></image>
+                </view>
+                <view class="color-999">暂无职位</view>
+                <view class="f-horizon-center">
+                  <button type="primary" size="default" class="ss-m-t-50" style="width: 60vw;" @click="handleClickAdd">发布新职位</button>
+                </view>
+              </view>
+              <view v-else>
+                <PositionList v-if="positionListData?.length" :tab="tab" :payable="true" :list="positionListData" :noMore="false" @refresh="refresh"></PositionList>
+                <uni-load-more :status="more" />
+                <view style="padding-bottom: 20vh;"></view>
+                <view class="addBtn" @tap="handleClickAdd">
+                  <view class="addBox">
+                    <view class="icon">+</view>
+                    <view class="text">发布新职位</view>
+                  </view>
+                </view>
               </view>
             </view>
-          </view>
+          </scroll-view>
         </view>
-      </scroll-view>
-    </view>
-  </layout-page>
+      </view>
+    </layout-page>
+  </view>
 </template>
 
 <script setup>
 import { ref } from 'vue'
 import layoutPage from '@/layout'
+import Navbar from '@/components/Navbar'
 import PositionList from '@/components/PositionList'
 import { dealDictArrayData } from '@/utils/position'
 import { getJobAdvertisedList } from '@/api/new/position'
@@ -62,6 +69,7 @@ import { showAuthModal } from '@/hooks/useModal'
 import { userStore } from '@/store/user'; const useUserStore = userStore()
 
 const tab = ref(1)
+const navbarHeight = ref(uni.getStorageSync('navbarHeight'))
 
 onLoad((options) => {
   console.log('onLoad:', options)

+ 44 - 20
pages/index/search.vue

@@ -1,30 +1,36 @@
 <template>
-	<layout-page>
-		<view >
-      <view style="padding: 0 15px 0 15px;">
-				<uni-segmented-control 
-					:current="current"
-					:values="tabList"
-					@clickItem="changeControl"
-					styleType="text"
-					activeColor="#00B760"
-				></uni-segmented-control>
-			</view>
-
-			<!-- 职位推荐 -->
-			<RecommendPage v-if="current === 0" :jobList="jobList" />
+	<view>
+		<Navbar :showLogo="true" />
+		<layout-page>
+			<view :style="{'padding-top': navbarHeight + 'px'}">
+				<view class="commonBackground"></view>
+				<view class="box defaultBgc">
+					<view style="padding: 0 15px 0 15px;">
+						<uni-segmented-control 
+							:current="current"
+							:values="tabList"
+							@clickItem="changeControl"
+							styleType="text"
+							activeColor="#00B760"
+						></uni-segmented-control>
+					</view>
 
-			<!-- 条件筛选 -->
-			<ConditionPage v-else />
+					<!-- 职位推荐 -->
+					<RecommendPage v-if="current === 0" :jobList="jobList" />
 
-    </view>
-	</layout-page>
+					<!-- 条件筛选 -->
+					<ConditionPage v-else />
+				</view>
+			</view>
+		</layout-page>
+	</view>
 </template>
 
 <script setup>
-import layoutPage from '@/layout'
-import { ref, watch } from 'vue'
+import { ref, watch, onMounted } from 'vue'
 import { onShow } from '@dcloudio/uni-app'
+import layoutPage from '@/layout'
+import Navbar from '@/components/Navbar'
 import { getAccessToken } from '@/utils/request'
 import { showAuthModal } from '@/hooks/useModal'
 import { getJobAdvertised } from '@/api/search'
@@ -33,6 +39,24 @@ import { formatName } from '@/utils/getText'
 import RecommendPage from './components/recommend.vue'
 import ConditionPage from './components/condition.vue'
 
+const navbarHeight = ref(0)
+
+onMounted(async () => {
+  try {
+    const res = await new Promise((resolve, reject) => {
+      uni.getStorage({
+        key: 'navbarHeight',
+        success: (result) => resolve(result),
+        fail: (err) => reject(err)
+      })
+    })
+    navbarHeight.value = res.data
+	  console.log(navbarHeight.value, '职位列表-导航栏高度')
+  } catch (error) {
+    console.error('读取本地缓存出错:', error)
+  }
+})
+
 const current = ref(0)
 const tabList = ['职位推荐', '条件筛选']
 const useUserStore = userStore()

+ 217 - 193
pagesA/chart/index.vue

@@ -1,174 +1,189 @@
 <template>
-  <view class="box">
-    <view class="box-top">
-      <view class="box-top-title">
-        {{ info.name }}
-      </view>
-    </view>
-      <!-- newsId 需要和聊天列表里面的id对应 永远取最后列表中的最后一个就可以做到发送消息即时滚动到底部 -->
-      <scroll-view ref="chatRef" :scroll-with-animation="scrollAnimation" :scroll-into-view="newsId" class="box-main" scroll-y="true">
-        <view class="box-main-more" v-if="hasMore">
-          <text @click="handleMore">查看更多</text>
+  <view>
+    <Navbar :textLeft="false" title="我的聊天" />
+    <view class="box defaultBgc MiSans-Normal" :style="{'padding-top': navbarHeight + 'px', height: 'calc(100vh - ' + navbarHeight + 'px)'}">
+      <view class="commonBackground"></view>
+      <view class="box-top">
+        <image class="box-top-image" :src="getUserAvatar(info.avatar, info.sex, info.channelID === 'system' ? true : false)" ></image>
+        <view class="box-top-right MiSans-Normal">
+          <view class="box-top-right-title">{{ info.name }}</view>
         </view>
-        <view v-for="(val, index) in items" :key="val.id" :id="'s'+val.id+index">
-          <view class="box-main-time">{{ timesTampChange(+(val.timestamp.padEnd(13, '0'))) }}</view>
-          <template v-if="val.payload?.type === 102">
-            <view class="jobCard">
-              <view class="jobCard-title"> {{ formatName(val.payload?.content?.positionInfo?.name) }}</view>
-              <view
-                v-if="!val.payload?.content?.positionInfo?.payFrom && !val.payload?.content?.positionInfo?.payTo"
-                class="jobCard-subtitle">
-                薪酬待遇: 面议
+      </view>
+
+
+        <!-- newsId 需要和聊天列表里面的id对应 永远取最后列表中的最后一个就可以做到发送消息即时滚动到底部 -->
+        <scroll-view ref="chatRef" :scroll-with-animation="scrollAnimation" :scroll-into-view="newsId" class="box-main" scroll-y="true">
+          <view class="box-main-more" v-if="hasMore">
+            <text @click="handleMore">查看更多</text>
+          </view>
+          <view v-for="(val, index) in items" :key="val.id" :id="'s'+val.id+index">
+            <view class="box-main-time">{{ timesTampChange(+(val.timestamp.padEnd(13, '0'))) }}</view>
+            <template v-if="val.payload?.type === 102">
+              <view class="jobCard">
+                <view class="jobCard-title"> {{ formatName(val.payload?.content?.positionInfo?.name) }}</view>
+                <view
+                  v-if="!val.payload?.content?.positionInfo?.payFrom && !val.payload?.content?.positionInfo?.payTo"
+                  class="jobCard-subtitle">
+                  薪酬待遇: 面议
+                </view>
+                <view
+                  v-else
+                  class="jobCard-subtitle"
+                >
+                  薪酬待遇: 
+                  {{ val.payload?.content?.positionInfo?.payFrom ? val.payload?.content?.positionInfo?.payFrom + ' - ' : '' }}
+                  {{ val.payload?.content?.positionInfo?.payTo }}
+                </view>
+                <view class="jobCard-tag">
+                  <view
+                    v-for="(v, i) in (val.payload?.content?.positionInfo?.enterprise?.welfareList || [])"
+                    :key="val.message_id + v + i"
+                    style="margin: 10rpx"
+                  >
+                    <uni-tag
+                      :text="v"
+                      type="success"
+                    />
+                  </view>
+                </view>
+                <view class="jobCard-divider"></view>
+                <view class="jobCard-subtitle text-right">
+                  <v-avatar size="24">
+                    <v-img :src="val.payload?.content?.positionInfo?.contact?.avatar"></v-img>
+                  </v-avatar>
+                  {{ val.payload?.content?.positionInfo?.contact?.name }}
+                  {{ val.payload?.content?.positionInfo?.contact?.postNameCn }}
+                  <!-- {{ formatName(val.payload?.content?.positionInfo?.enterprise?.anotherName || val.payload?.content?.positionInfo?.enterprise?.name) }} -->
+                </view>
+                <div class="jobCard-subtitle text-right">
+                  地址:{{ val.payload?.content?.positionInfo?.address }}
+                </div>
+              </view>
+            </template>
+            <!-- 面试邀请 -->
+            <template v-if="val.payload?.type === 101">
+              <view class="jobCard">
+                <view class="font-size-15 ss-m-b-20">面试邀请</view>
+                <view class="jobCard-title"> {{ formatName(val.payload?.content?.positionInfo?.data?.name) }}</view>
+                <view
+                  v-if="!val.payload?.content?.positionInfo?.data?.payFrom && !val.payload?.content?.positionInfo?.data?.payTo"
+                  class="jobCard-subtitle">
+                  薪酬待遇: 面议
+                </view>
+                <view v-else class="jobCard-subtitle">
+                  薪酬待遇: 
+                  {{ val.payload?.content?.positionInfo?.data?.payFrom ? val.payload?.content?.positionInfo?.data?.payFrom + ' - ' : '' }}
+                  {{ val.payload?.content?.positionInfo?.data?.payTo }}
+                </view>
+                <view class="font-size-15">面试时间: {{ timesTampChange(val.payload?.content?.time) }}</view>
+                <view class="font-size-15">面试地点: {{ val.payload?.content?.address }}</view>
+                <view class="font-size-15">联系电话: {{ val.payload?.content?.invitePhone }}</view>
               </view>
-              <view
-                v-else
-                class="jobCard-subtitle"
-              >
-                薪酬待遇: 
-                {{ val.payload?.content?.positionInfo?.payFrom ? val.payload?.content?.positionInfo?.payFrom + ' - ' : '' }}
-                {{ val.payload?.content?.positionInfo?.payTo }}
+            </template>
+            <view :class="['message-view_item', val.from_uid === IM.uid ? 'is-self' : 'is-other']">
+              <view class="image">
+                <image
+                  :data-target="getUserAvatar(info.avatar, info.sex, info.channelID === 'system' ? true : false)"
+                  class="header"
+                  :src="(
+                    val.from_uid === IM.uid ?
+                    getUserAvatar(useUserStore.userInfo?.avatar, useUserStore.userInfo?.sex) :
+                    getUserAvatar(info.avatar, info.sex, info.channelID === 'system' ? true : false)
+                  )"
+                ></image>
               </view>
-              <view class="jobCard-tag">
+              <!-- 显示沟通职位 -->
+              <template v-if="val.payload?.type === 102">              
                 <view
-                  v-for="(v, i) in (val.payload?.content?.positionInfo?.enterprise?.welfareList || [])"
-                  :key="val.message_id + v + i"
-                  style="margin: 10rpx"
+                  class="message-text" 
+                  :class="val.from_uid === IM.uid ? 'active' : ''" 
+                  :style="{'border-radius': val.from_uid === IM.uid ? '20rpx 20rpx 9rpx 20rpx' : '20rpx 20rpx 20rpx 9rpx'}"
                 >
-                  <uni-tag
-                    :text="v"
-                    type="success"
-                  />
+                  {{ val.payload?.content.text }}
                 </view>
+              </template>
+              <!-- 发起面试邀请 -->
+              <view class="message-text none" v-else-if="val.payload?.type === 101">
+                <uni-tag text="发起了面试邀请" custom-style="background-color: #00B760; border-color: #00B760; color: #fff;" />
               </view>
-              <view class="jobCard-divider"></view>
-              <view class="jobCard-subtitle text-right">
-                <v-avatar size="24">
-                  <v-img :src="val.payload?.content?.positionInfo?.contact?.avatar"></v-img>
-                </v-avatar>
-                {{ val.payload?.content?.positionInfo?.contact?.name }}
-                {{ val.payload?.content?.positionInfo?.contact?.postNameCn }}
-                {{ formatName(val.payload?.content?.positionInfo?.enterprise?.anotherName || val.payload?.content?.positionInfo?.enterprise?.name) }}
+              <view class="message-text none" v-else-if="val.payload?.type === 103">
+                <uni-tag text="拒绝了面试邀请" type="error" />
               </view>
-              <div class="jobCard-subtitle text-right">
-                地址:{{ val.payload?.content?.positionInfo?.address }}
-              </div>
-            </view>
-          </template>
-          <!-- 面试邀请 -->
-          <template v-if="val.payload?.type === 101">
-            <view class="jobCard color-primary">
-              <view class="font-size-15 ss-m-b-20">面试邀请</view>
-              <view class="jobCard-title"> {{ formatName(val.payload?.content?.positionInfo?.data?.name) }}</view>
-              <view
-                v-if="!val.payload?.content?.positionInfo?.data?.payFrom && !val.payload?.content?.positionInfo?.data?.payTo"
-                class="jobCard-subtitle">
-                薪酬待遇: 面议
+              <view class="message-text none" v-else-if="val.payload?.type === 104">
+                <uni-tag text="接受了面试邀请" custom-style="background-color: #00B760; border-color: #00B760; color: #fff;" />
               </view>
-              <view v-else class="jobCard-subtitle">
-                薪酬待遇: 
-                {{ val.payload?.content?.positionInfo?.data?.payFrom ? val.payload?.content?.positionInfo?.data?.payFrom + ' - ' : '' }}
-                {{ val.payload?.content?.positionInfo?.data?.payTo }}
+              <view v-else-if="val.payload.type === 105" class="text-end">
+                <uni-tag
+                  v-if="val.from_uid === IM.uid"
+                  :text="val.payload.content?.type === 1 ? '附件简历已发送' : '简历请求已发送'"
+                  custom-style="background-color: #00B760; border-color: #00B760; color: #fff;"
+                />
+                <view
+                  v-if="val.payload.content?.type !== 2 || val.from_uid !== IM.uid"
+                  class="message-text card"
+                >
+                  <view class="text-left">
+                    <text v-if="val.payload.content?.type === 1">{{
+                      val.payload.content?.query?.title || '附件简历' }}
+                    </text>
+                    <text v-if="val.payload.content?.type === 2">
+                      我想要一份您的简历,您是否同意
+                    </text>
+                  </view>
+                  <view class="btn-actions">
+                    <text class="btn" v-if="val.payload.content?.type === 1" @tap="handlePreview(val.payload)">点击预览附件简历</text>
+                  </view>
+                </view>
               </view>
-              <view class="font-size-15">面试时间: {{ timesTampChange(val.payload?.content?.time) }}</view>
-              <view class="font-size-15">面试地点: {{ val.payload?.content?.address }}</view>
-              <view class="font-size-15">联系电话: {{ val.payload?.content?.invitePhone }}</view>
-            </view>
-          </template>
-          <view :class="['message-view_item', val.from_uid === IM.uid ? 'is-self' : 'is-other']">
-            <view class="image">
-              <image
-                :data-target="getUserAvatar(info.avatar, info.sex, info.channelID === 'system' ? true : false)"
-                class="header"
-                :src="(
-                  val.from_uid === IM.uid ?
-                  getUserAvatar(useUserStore.userInfo?.avatar, useUserStore.userInfo?.sex) :
-                  getUserAvatar(info.avatar, info.sex, info.channelID === 'system' ? true : false)
-                )"
-              ></image>
-            </view>
-            <!-- 显示沟通职位 -->
-            <template v-if="val.payload?.type === 102">              
-              <view class="message-text" :class="val.from_uid === IM.uid ? 'active' : ''">
-                {{ val.payload?.content.text }}
+              <view v-else-if="val.payload.type === -1" class="message-text" :class="{ active: val.from_uid === IM.uid}">
+                {{ val.payload?.content?.text }}
               </view>
-            </template>
-            <!-- 发起面试邀请 -->
-            <view class="message-text none" v-else-if="val.payload?.type === 101">
-              <uni-tag text="发起了面试邀请" custom-style="background-color: #00B760; border-color: #00B760; color: #fff;" />
-            </view>
-            <view class="message-text none" v-else-if="val.payload?.type === 103">
-              <uni-tag text="拒绝了面试邀请" type="error" />
-            </view>
-            <view class="message-text none" v-else-if="val.payload?.type === 104">
-              <uni-tag text="接受了面试邀请" custom-style="background-color: #00B760; border-color: #00B760; color: #fff;" />
-            </view>
-            <view v-else-if="val.payload.type === 105" class="text-end">
-              <uni-tag
-                v-if="val.from_uid === IM.uid"
-                :text="val.payload.content?.type === 1 ? '附件简历已发送' : '简历请求已发送'"
-                custom-style="background-color: #00B760; border-color: #00B760; color: #fff;"
-              />
-              <view
-                v-if="val.payload.content?.type !== 2 || val.from_uid !== IM.uid"
-                class="message-text card"
-              >
-                <view class="text-left">
-                  <text v-if="val.payload.content?.type === 1">{{
-                    val.payload.content?.query?.title || '附件简历' }}
-                  </text>
-                  <text v-if="val.payload.content?.type === 2">
-                    我想要一份您的简历,您是否同意
-                  </text>
-                </view>
-                <view class="btn-actions">
-                  <text class="btn" v-if="val.payload.content?.type === 1" @tap="handlePreview(val.payload)">点击预览附件简历</text>
-                </view>
+              <view 
+                v-else 
+                class="message-text" 
+                :class="{ active: val.from_uid === IM.uid}" 
+                :style="{'border-radius': val.from_uid === IM.uid ? '20rpx 20rpx 9rpx 20rpx' : '20rpx 20rpx 20rpx 9rpx'}">
+                {{ val.payload?.content }}
               </view>
             </view>
-            <view v-else-if="val.payload.type === -1" class="message-text" :class="{ active: val.from_uid === IM.uid}">
-              {{ val.payload?.content?.text }}
-            </view>
-            <view v-else class="message-text" :class="{ active: val.from_uid === IM.uid}">
-              {{ val.payload?.content }}
-            </view>
           </view>
+        </scroll-view>
+        
+      <view class="box-bottom" v-if="channelItem?.channelID !== 'system'">
+        <view class="box-bottom-tool" style="display: flex; justify-content: start;">
+          <text class="toolBtn" @tap="handleFindResume">求简历</text>
+          <text class="toolBtn ss-m-l-30" @tap="handleInviteInterview">面试邀约</text>
+        </view>
+        
+        <view class="d-flex align-end textBox" v-if="channelItem?.channelID !== 'system'">
+          <textarea
+            v-model="inputValue"
+            :cursor-spacing="25"
+            :show-confirm-bar="false"
+            :disable-default-padding="true"
+            confirm-type="send"
+            auto-height
+            @confirm="handleSend"
+          />
+          <text class="submitBtn" @tap="handleSend">发 送</text>
         </view>
-      </scroll-view>
-      
-    <view class="box-bottom" v-if="channelItem?.channelID !== 'system'">
-      <view class="box-bottom-tool" style="display: flex; justify-content: start;">
-        <text class="toolBtn" @tap="handleFindResume">求简历</text>
-        <text class="toolBtn ss-m-l-30" @tap="handleInviteInterview">面试邀约</text>
-      </view>
-      
-      <view class="d-flex align-end textBox" v-if="channelItem?.channelID !== 'system'">
-        <textarea
-          v-model="inputValue"
-          :cursor-spacing="25"
-          :show-confirm-bar="false"
-          :disable-default-padding="true"
-          confirm-type="send"
-          auto-height
-          @confirm="handleSend"
-        />
-        <text class="submitBtn" @tap="handleSend">发 送</text>
       </view>
-    </view>
 
-    <!-- 求简历 -->
-    <uni-popup ref="requestPopup" background-color="#fff" type="bottom">
-			<view style="background-color: #fff; height: 50vh; padding: 30px 20px;">
-        <uni-forms ref="requestFormRef" :modelValue="formData" :rules="formRules" validateTrigger="bind" label-width="80px" label-align="right" label-position="left">
-          <uni-forms-item name="jobId" label="招聘职位" required>
-            <view style="max-width: calc(100vw - 120px);">
-              <uni-data-select v-model="formData.jobId" :localdata="jobList"	@change="handleChangeJob"	placeholder="请选择要求简历的职位"></uni-data-select>
-            </view>
-          </uni-forms-item>
-        </uni-forms>
-		    <view style="margin-top: 50px;"></view>
-        <button class="send-button" @tap="handleRequestSubmit">提 交</button>
-      </view>
-		</uni-popup>
+      <!-- 求简历 -->
+      <uni-popup ref="requestPopup" background-color="#fff" type="bottom">
+        <view style="background-color: #fff; height: 50vh; padding: 30px 20px;">
+          <uni-forms ref="requestFormRef" :modelValue="formData" :rules="formRules" validateTrigger="bind" label-width="80px" label-align="right" label-position="left">
+            <uni-forms-item name="jobId" label="招聘职位" required>
+              <view style="max-width: calc(100vw - 120px);">
+                <uni-data-select v-model="formData.jobId" :localdata="jobList"	@change="handleChangeJob"	placeholder="请选择要求简历的职位"></uni-data-select>
+              </view>
+            </uni-forms-item>
+          </uni-forms>
+          <view style="margin-top: 50px;"></view>
+          <button class="send-button" @tap="handleRequestSubmit">提 交</button>
+        </view>
+      </uni-popup>
+    </view>
   </view>
 </template>
 
@@ -185,7 +200,9 @@ import { preview } from '@/utils/preview'
 import { getAccessToken } from '@/utils/request'
 import { showAuthModal } from '@/hooks/useModal'
 import { getJobAdvertisedList } from '@/api/new/position'
+import Navbar from '@/components/Navbar'
 
+const navbarHeight = ref(uni.getStorageSync('navbarHeight'))
 const useUserStore = userStore()
 const userInfo = computed(() => useUserStore?.userInfo)
 
@@ -417,9 +434,6 @@ onLoad(async (options) => {
 </script>
 
 <style lang="scss" scoped>
-.white {
-  color: #FFF !important;
-}
 .text-left {
   text-align: left !important;
 }
@@ -428,22 +442,32 @@ onLoad(async (options) => {
 }
 .box {
   width: 100%;
-  height: 100vh;
   display: flex;
   flex-direction: column;
   &-top {
-    &-title {
-      padding: 0 60rpx;
-      box-sizing: border-box;
-      width: 100%;
+    z-index: 1;
+    padding: 30rpx 30rpx 0 30rpx;
+    display: flex;
+    justify-content: center;
+    &-image {
+      width: 80rpx;
       height: 80rpx;
-      line-height: 80rpx;
-      // text-align: center;
-      border-bottom: 2rpx solid #EEE;
-      overflow: hidden;
-      white-space: nowrap;
-      text-overflow: ellipsis;
-      .subText {
+      border-radius: 50%;
+      margin-right: 30rpx;
+    }
+    &-right {
+      flex: 1;
+      display: flex;
+      align-items: center;
+      &-title {
+        box-sizing: border-box;
+        width: 100%;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        margin-bottom: 10rpx;
+      }
+      &-subText {
         font-size: .85em;
         color: #999;
         .gun {
@@ -462,7 +486,7 @@ onLoad(async (options) => {
         font-weight: bold;
       }
       .color-primary {
-        color: #009688;
+        color: #00B760;
       }
       .ml-3 {
         margin-left: 40rpx;
@@ -520,23 +544,18 @@ onLoad(async (options) => {
     }
     .jobCard {
       padding: 30rpx;
-      background: #E2F2F0;
-      color: #009688 ;
-      margin-top: 20rpx;
+      background: #fbfbfb;
+      margin: 20rpx 5px;
       max-width: unset;
-      margin-right: 0;
+      border-radius: 20rpx;
+      box-shadow: 1px 2px 12px rgba(0, 0, 0, 0.1);
       &-title {
-        font-size: 1.2em;
+        font-weight: 600;
+        font-size: 36rpx;
+        margin-bottom: 30rpx;
       }
       &-subtitle {
         padding: 10rpx 0;
-        // font-size: .5em;
-      }
-      &-divider {
-        width: 100%;
-        height: 2rpx;
-        margin: 20rpx 0;
-        background: #ddd;
       }
       &-tag {
         display: flex;
@@ -553,8 +572,6 @@ onLoad(async (options) => {
         width: 60rpx;
         height: 60rpx;
         border-radius: 180rpx;
-        // flex-grow: 1;
-        // flex-shrink: 0;
         overflow: hidden;
         .header {
           width: 60rpx;
@@ -568,19 +585,24 @@ onLoad(async (options) => {
       }
       .message-text {
         overflow-wrap: break-word;
-        background-color: #f0f2f5;
+        background-color: #00B760;
+        color: #fff;
         border-radius: 12rpx;
         max-width: 75%;
         padding: 20rpx;
+        font-family: MiSans-Normal;
         &.active {
-          background: #d5e6e8;
+          color: #fff;
+          background: #00B760;
         }
         &.card {
-          background: #E2F2F0;
-          color: #009688 ;
+          // background: #E2F2F0;
+          background: #fff;
+          color: #00B760 ;
           margin-top: 20rpx;
           max-width: unset;
           margin-right: 0;
+          box-shadow: 1px 2px 12px rgba(0, 0, 0, 0.1);
           .btn-actions {
             margin: 40rpx auto 20rpx auto ;
             text-align: center;
@@ -598,7 +620,8 @@ onLoad(async (options) => {
           background-color: unset;
         }
         &.active {
-          background: #d5e6e8;
+          background: #00B760;
+          color: #fff;
         }
       }
     }
@@ -618,15 +641,16 @@ onLoad(async (options) => {
   &-bottom {
     max-height: 300rpx;
     border-top: 2rpx solid #EEE;
-    background: rgba(230, 230, 230, 0.5);
-    padding: 20rpx 40rpx;
+    background: #fff;
+    padding: 20rpx 40rpx 40rpx;
+
     box-sizing: border-box;
     &-tool {
       margin-bottom: 30rpx;
       .toolBtn {
         padding: 12rpx 20rpx;
         font-size: 24rpx;
-        background: #18bc37;
+        background: #00B760;
         color: #FFF;
         border-radius: 10rpx;
       }
@@ -641,14 +665,14 @@ onLoad(async (options) => {
       max-height: 180rpx;
       padding: 20rpx;
       box-sizing: border-box;
-      background: #FFF;
+      background: #f5f5f5;
     }
     .submitBtn {
       width: 140rpx;
       line-height: 80rpx;
       height: 80rpx;
       font-size: 28rpx;
-      background: #18bc37;
+      background: #00B760;
       color: #FFF;
       margin-left: 20rpx;
       text-align: center;

二进制
static/iconfont.ttf


+ 15 - 35
static/iconfont.wxss

@@ -1,5 +1,5 @@
 @font-face {
-  font-family: "iconfont"; /* Project id 4679810 */
+  font-family: "iconfont";
   src: url('/static/iconfont.ttf') format('truetype');
 }
 
@@ -11,36 +11,32 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
-.icon-qianbao1:before {
-  content: "\e607";
+.icon-left:before {
+  content: "\e673";
 }
 
-.icon-weixinzhifu:before {
-  content: "\e6e8";
+.icon-shouye:before {
+  content: "\e60c";
 }
 
-.icon-alipay:before {
-  content: "\e601";
+.icon-icon-test:before {
+  content: "\eae3";
 }
 
-.icon-zixun:before {
-  content: "\e606";
+.icon-xueshengjibenxinxi:before {
+  content: "\e8b1";
 }
 
-.icon-wo-suoshuqiye:before {
-  content: "\e638";
-}
-
-.icon-qiyezhuanqu:before {
-  content: "\e62c";
+.icon-qianbao1:before {
+  content: "\e607";
 }
 
-.icon-zhaopinqiuzhi:before {
-  content: "\ffb6";
+.icon-weixinzhifu:before {
+  content: "\e6e8";
 }
 
-.icon-lianxikefu:before {
-  content: "\e609";
+.icon-alipay:before {
+  content: "\e601";
 }
 
 .icon-vip:before {
@@ -87,22 +83,6 @@
   content: "\e611";
 }
 
-.icon-dunpai1:before {
-  content: "\e610";
-}
-
-.icon-dunpai:before {
-  content: "\e604";
-}
-
-.icon-mn_dunpai_fill:before {
-  content: "\e600";
-}
-
-.icon-hongsedunpai:before {
-  content: "\e622";
-}
-
 .icon-arrow-sortdown-smal:before {
   content: "\e877";
 }

+ 28 - 0
static/style/index.scss

@@ -83,6 +83,34 @@
   // height: 100vh;
   background-color: #f7f8fa;
 }
+// 公共渐变样式
+.commonBackground {
+	position: relative;
+  &::before {
+	  content: '';
+	  position: absolute;
+	  top: 0;
+	  left: 0;
+	  width: 100%;
+	  height: 160px;
+	  background: linear-gradient(180deg, #BCFEDE, #F7F8FA);
+  }
+}
+
+// 表单文字样式设置
+.uni-forms-item__label {
+  font-family: MiSans-Normal;
+}
+.uni-forms-item__content {
+  font-family: MiSans-Normal;
+}
+
+.nodata-img-parent{
+	height: 90vh;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
 
 // 火苗
 // 水平左右分

+ 1 - 1
uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue

@@ -240,7 +240,7 @@
 		flex-direction: row;
 		position: relative;
 		padding: 10px;
-		background-color: #fff;
+		background-color: none;
 	}
 
 	.uni-searchbar__box {